From 677b22720016000886cd982b79176f6c9fc33723 Mon Sep 17 00:00:00 2001 From: Meleki Date: Sun, 8 Mar 2026 23:06:40 +0100 Subject: [PATCH] docs: Dokumentation aktualisieren (Telegram Bots, OpenClaw Import, Public-Flags) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ARCHITECTURE.md: - Telegram-Integration komplett umgeschrieben (Bots als eigenständige Entität) - Neuer Abschnitt: OpenClaw Import (Funktionsweise, sort_key, Frontend) - Entity-Relationship: TelegramBot hinzugefügt - Tabellen: telegram_links → telegram_bots, Sessions/Agents/Messages aktualisiert - Frontend-Routing: telegram-bot-page hinzugefügt - Projektstruktur: neue Dateien (TelegramBotRecord, OpenClawEndpoint, telegram-bot-page) - Agent-System: IsPublic Property dokumentiert - Card-Builder: buildTelegramBotCard dokumentiert - API-Endpunkte: Telegram + OpenClaw aktualisiert ARCHITECTURE_QUICK.md: - Datenmodell: TelegramBot-Relation, telegram_bots statt telegram_links - Sessions/Agents/Messages Felder aktualisiert - API-Tabelle: Telegram + OpenClaw Endpoints - Frontend-Routing: telegram-bot Page - Auth: Webhook-Pfad auf botId aktualisiert README.md: - Telegram-Feature-Beschreibung aktualisiert - OpenClaw Import als Feature hinzugefügt --- ARCHITECTURE.md | 126 ++++++++++++++++++++++++++++++------------ ARCHITECTURE_QUICK.md | 21 ++++--- README.md | 3 +- 3 files changed, 106 insertions(+), 44 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 2927962..3daf422 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -111,6 +111,7 @@ gott/ │ ├── CronjobRecord.cs │ ├── KreaImageRecord.cs │ ├── SharedMessageRecord.cs # Geteilte Nachrichten (Share-Token) +│ ├── TelegramBotRecord.cs # Telegram Bot Entität │ ├── ChatModels.cs # ChatMessage, ChatRequest, AttachmentInfo/Block │ └── ChatContext.cs # Runtime-Kontext für einen Chat + ReviewContext │ @@ -137,7 +138,8 @@ gott/ │ ├── SessionEndpoint.cs # CRUD + SystemPrompt, Exec, Git-Status │ ├── AgentEndpoint.cs # CRUD │ ├── WorkspaceEndpoint.cs # File-Tree, File-Read/Write, Browse, Agent-Files -│ ├── TelegramEndpoint.cs # Webhook, Config, Registration +│ ├── TelegramEndpoint.cs # Bot-CRUD, Webhook, Session-Config, Registration +│ ├── OpenClawEndpoint.cs # OpenClaw Session Import │ ├── CronjobEndpoint.cs # CRUD + Toggle, Manual Run │ ├── KreaEndpoint.cs # Generate, List, File-Serve │ ├── SkillEndpoint.cs # List, Agent-Skill-Mapping, Output-Files @@ -210,6 +212,7 @@ gott/ │ │ │ ├── dashboard.js # Dashboard / Home │ │ │ ├── session-page.js # Session-Einstellungen │ │ │ ├── agent-page.js # Agent-Editor +│ │ │ ├── telegram-bot-page.js # Telegram-Bot-Editor │ │ │ ├── cronjob-page.js # Cronjob-Verwaltung │ │ │ ├── profile-page.js # Profil-Bearbeitung │ │ │ ├── admin-page.js # Admin: Benutzerverwaltung @@ -272,6 +275,8 @@ Session (1) ─── (*) Cronjob User (1) ─── (*) Cronjob User (1) ─── (*) SharedMessage Message (1) ─── (*) SharedMessage +User (1) ─── (*) TelegramBot +TelegramBot (1) ─── (*) Session (via telegram_bot_id) ``` ### Tabellen @@ -280,16 +285,16 @@ Message (1) ─── (*) SharedMessage |-------------------|-----------------------------------------------------| | `users` | Benutzer (username, password_hash, display_name, is_admin, persona, settings, default_path) | | `tokens` | Auth-Tokens (token → user_id) | -| `agents` | AI-Agenten (model, tool_choice, custom_commands, auto_commit, use_soul/identity/user_info/memory, use_web_search, web_search_version, allow_user_choice, task_instruction, avatar_scale/offset, avatar_small) | -| `sessions` | Chat-Sessions (description, image, image_small, workspace, context, custom_commands, telegram-config, telegram_allowed_chat_ids, avatar_scale/offset, preparer_agent_id, review_agent_id, max_review_iterations, finalizer_agent_id) | +| `agents` | AI-Agenten (model, tool_choice, custom_commands, auto_commit, use_soul/identity/user_info/memory, use_web_search, web_search_version, allow_user_choice, task_instruction, avatar_scale/offset, avatar_small, is_public) | +| `sessions` | Chat-Sessions (description, image, image_small, workspace, context, custom_commands, telegram_bot_id, telegram_chat_id, avatar_scale/offset, preparer_agent_id, review_agent_id, max_review_iterations, finalizer_agent_id) | | `chains` | Request-Chains (model, tokens, iterations, timing, tool_choice, tool_names, stream_error_info, plan_mode, archive_id) | -| `messages` | Einzelne Nachrichten (text, tool_use, tool_result, error, web_search_result), Tag für Sub-Agent-Markierung | +| `messages` | Einzelne Nachrichten (text, tool_use, tool_result, error, web_search_result), Tag für Sub-Agent-Markierung oder Import-Herkunft (`openclaw-import`), SortKey für korrekte Reihenfolge | | `attachments` | Datei-Anhänge (base64, image/document) | | `archives` | Archivierte Chain-Gruppen | | `agent_skills` | Agent ↔ Skill Zuordnung | | `cronjobs` | Geplante Tasks (cron expression, prompt, notify_session_id, is_enabled, last_run, next_run) | | `shared_messages` | Geteilte Nachrichten (Share-Token, Ablaufdatum) | -| `telegram_links` | Telegram Chat ↔ Session Verknüpfung | +| `telegram_bots` | Telegram Bots (bot_token, webhook_secret, name, is_public) – eigenständige Entität | ### Zentrale Records @@ -318,13 +323,13 @@ Message (1) ─── (*) SharedMessage - `Iteration` – Welche Tool-Loop-Iteration - `AttachmentCount` – Anzahl angehängter Dateien - `AttachmentNames` – JSON-Array mit Dateinamen -- `Tag` – Sub-Agent-Markierung (`null` = normal, `"preparer"/"review"/"finalizer"` = Sub-Agent-Message, wird aus API-History gefiltert) +- `Tag` – Markierung (`null` = normal, `"preparer"/"review"/"finalizer"` = Sub-Agent-Message (wird aus API-History gefiltert), `"openclaw-import"` = importierte Nachricht (wird immer in History einbezogen)) - `IsMarked` – Als wichtig markierte Nachricht (wird in System-Prompt aufgenommen) - `DeletedOn` – Soft-Delete Zeitstempel **SessionWithStats** – Erweitertes Session-Objekt für Listen-Endpunkt: - Enthält alle `SessionRecord`-Felder + `MessageCount`, `ArchiveMessageCount`, `TotalMessageCount` -- `TelegramConfigured`, `TelegramLinked` – Telegram-Status +- `TelegramConfigured`, `TelegramLinked` – Telegram-Status (Bot zugewiesen / Chat-ID verknüpft) - `GitStatus` – Inline Git-Status-Summary (`Add`, `Edit`, `Delete`, `Outgoing`) oder `null` wenn kein Workspace (wird im Endpoint hinzugefügt, nicht Teil des Records) - `Image` wird durch `ImageSmall` ersetzt (Thumbnail für Dashboard-Performance) @@ -388,7 +393,8 @@ Alle Endpoints folgen dem **Minimal API**-Pattern mit Extension Methods (`MapXxx | **Agents** | `/api/agents/` | CRUD (Liste inkl. inline Skills + Thumbnail) | | **Admin** | `/api/admin/` | `GET users`, `POST users`, `PUT users/{id}`, `PUT users/{id}/password`, `DELETE users/{id}`, `POST users/{id}/impersonate`, `POST users/{id}/login-link` (Admin-only) | | **Workspace** | `/api/workspace/` | `GET tree`, `GET/PUT file`, `GET browse`, `POST mkdir`, `DELETE dir`, `POST browse/mkdir`, `GET agent/tree`, `GET/PUT agent/file`, `POST agent/mkdir`, `GET raw` | -| **Telegram** | `/api/telegram/` | `POST webhook/{sessionId}` (unauthenticated), Session-Config CRUD, Webhook-Management | +| **Telegram** | `/api/telegram/` | Bot-CRUD (`/bots`, `/bots/available`), `POST webhook/{botId}` (unauthenticated), Session-Config, Webhook-Management | +| **OpenClaw** | `/api/openclaw/` | `GET sessions` (Liste importierbarer Sessions), `POST import` (Import in bestehende Session) | | **Cronjobs** | `/api/cronjobs/` | CRUD + `POST toggle`, `POST run` | | **Krea** | `/api/images/` | `POST generate`, `GET list`, `GET file/{name}`, `GET file/{name}/thumb`, `GET status` | | **Skills** | `/api/skills` | `GET list`, `GET/PUT agent skills`, Output-Files + Thumbnails | @@ -407,7 +413,7 @@ Ausnahmen (kein Auth nötig): - Statische Dateien (nicht `/api/`) - `POST /api/auth/login` - `GET /api/auth/autologin` (Token-basierter Autologin via Link) -- `POST /api/telegram/webhook/{sessionId}` (authentifiziert via Secret-Header) +- `POST /api/telegram/webhook/{botId}` (authentifiziert via Secret-Header) - `GET /api/shared/{token}` (öffentlicher Zugriff auf geteilte Nachrichten) - `GET /api/images/file/*` (Krea-Bilder und Thumbnails, öffentlich) @@ -450,6 +456,7 @@ Das Frontend ist eine **Single-Page Application** ohne Build-Step, komplett in V | `#/chat/{sessionId}` | `chat-page.js` | Chat-Ansicht | | `#/session/{sessionId}` | `session-page.js` | Session-Einstellungen | | `#/agent/{agentId}` | `agent-page.js` | Agent-Editor | +| `#/telegram-bot/{botId}` | `telegram-bot-page.js` | Telegram-Bot-Editor | | `#/cronjobs` | `cronjob-page.js` | Cronjob-Verwaltung | | `#/profile` | `profile-page.js` | Profil | | `#/settings` | `settings-page.js` | App-Einstellungen | @@ -464,7 +471,7 @@ Das Frontend ist eine **Single-Page Application** ohne Build-Step, komplett in V - **api.js** – Zentraler API-Client mit `fetch()`-Wrapper, Auth-Redirect bei 401 - **ui-helpers.js** – DOM-Helpers (`$`, `esc`, `truncate`), Toast-System, ScrollDown, Meta-Bar, Button-Builder - **markdown.js** – Markdown-Rendering (`renderMarkdown`), LaTeX/Code-Schutz, Krea-Gallery-Wrapping -- **cards.js** – Card-Builder (`buildAgentCard()`, `buildSessionCard()`) +- **cards.js** – Card-Builder (`buildAgentCard()`, `buildSessionCard()`, `buildTelegramBotCard()`) - **msg-actions.js** – Nachrichten-Aktionen (Delete, Mark, Share, Reply-Button, Timestamp) - **tool-ui.js** – Tool-Boxes (Diffs, Todos, File-Content), Visibility-Logik - **modals.js** – Modale Dialoge (System-Prompt, Command-Output, Krea-Image) @@ -482,8 +489,9 @@ Das Frontend ist eine **Single-Page Application** ohne Build-Step, komplett in V ### Wiederverwendbare Card-Builder (cards.js) -- **`buildAgentCard(agent)`** – Erzeugt ein `.card` DOM-Element für einen Agent (Avatar, Name, Model-Badge, Feature-Badges: toolChoice, autoCommit, useSoul, useIdentity, useUserInfo, useMemory, webSearch, Skills). Skills werden inline vom API-Endpunkt mitgeliefert. Wird im Dashboard und im Agent-Picker-Modal (Session-Formular) verwendet. +- **`buildAgentCard(agent)`** – Erzeugt ein `.card` DOM-Element für einen Agent (Avatar, Name, Model-Badge, Feature-Badges: toolChoice, autoCommit, useSoul, useIdentity, useUserInfo, useMemory, webSearch, Skills, Public/Fremd). Skills werden inline vom API-Endpunkt mitgeliefert. Wird im Dashboard und im Agent-Picker-Modal (Session-Formular) verwendet. - **`buildSessionCard(session, agent)`** – Erzeugt ein `.card` DOM-Element für eine Session (Avatar, Name, Badges: Agent, Kontext, Telegram, Meta: Nachrichten/Archiv/Workspace, Git-Status). Git-Status wird inline vom API-Endpunkt mitgeliefert. Wird im Dashboard und im Session-Picker-Modal (Cronjob-Formular) verwendet. +- **`buildTelegramBotCard(bot)`** – Erzeugt ein `.card` DOM-Element für einen Telegram Bot (Name, maskierter Token, Session-Count, Public/Fremd-Badges). Wird im Dashboard und im Bot-Picker-Modal (Session-Formular) verwendet. - **Picker-Modals** – Agent- und Session-Auswahl in Formularen (Session-/Cronjob-Seiten) erfolgt über modale Dialoge mit den Card-Buildern statt über Dropdowns. - **emoji.js** – Emoji-Picker mit Kategorien und Suche - **tooltip.js** – Tooltip-System für Hover-Infos @@ -666,6 +674,7 @@ Ein **Agent** definiert die Persönlichkeit und Fähigkeiten der AI: | `WebSearchVersion`| Web-Suche aktivieren (z.B. `web_search_20260209`) | | `AllowUserChoice` | `ask_user_choice`-Tool verfügbar (Default: true) | | `TaskInstruction` | Aufgabe/Anweisung – optionaler Text, wird als `## Anweisungen`-Block in System-Prompt eingefügt | +| `IsPublic` | Andere User können den Agent in ihren Sessions verwenden (aber nicht bearbeiten) | ### Model-Auflösung @@ -780,47 +789,61 @@ Wenn ein Agent Skills hat aber kein Workspace konfiguriert ist, wird automatisch ## Telegram-Integration -Sessions können mit einem **Telegram Bot** verbunden werden: +Telegram Bots sind **eigenständige Entitäten** mit einer eigenen Tabelle (`telegram_bots`), die am Dashboard verwaltet werden (wie Agents, Sessions, Cronjobs). Ein Bot kann **mehreren Sessions** zugewiesen werden – jede Session hat ihren eigenen Chat-Kontext. -### Konfiguration +### Datenmodell -Pro Session werden gespeichert: -- `TelegramBotToken` – Bot-Token von @BotFather -- `TelegramWebhookSecret` – Geheimer Token für Webhook-Verifizierung -- `TelegramChatId` – Verknüpfte Chat-ID (Owner) -- `TelegramAllowedChatIds` – Kommagetrennte Chat-ID-Whitelist für Zugriffskontrolle +**Telegram Bot** (`telegram_bots`): +- `BotId` – UUID +- `UserId` – Owner +- `Name` – Anzeigename +- `BotToken` – Bot-Token von @BotFather +- `WebhookSecret` – Einmalig generierter Token für Webhook-Verifizierung +- `IsPublic` – Andere User können den Bot in ihren Sessions verwenden (aber nicht bearbeiten) + +**Session-Felder:** +- `TelegramBotId` – Verweis auf den zugewiesenen Bot (wie `AgentId`) +- `TelegramChatId` – Verknüpfte Chat-ID (1 Session = max. 1 Telegram-Chat) ### Webhook-Flow ``` -1. User konfiguriert Bot-Token in Session-Settings -2. User registriert Webhook (POST .../telegram/register-webhook) - → Setzt Webhook-URL: {baseUrl}/api/telegram/webhook/{sessionId} -3. Telegram sendet Updates an Webhook -4. AuthMiddleware lässt Webhook-Requests durch (kein Cookie nötig) -5. TelegramEndpoint prüft X-Telegram-Bot-Api-Secret-Token Header -6. TelegramService verarbeitet Update: - - /start → Session verknüpfen (nur wenn noch kein Owner ODER Whitelist-Match) +1. User erstellt Telegram Bot im Dashboard (Name + Token) +2. User registriert Webhook auf der Bot-Page + → Setzt Webhook-URL: {baseUrl}/api/telegram/webhook/{botId} +3. User weist Bot einer Session zu (Session-Settings, Bot-Picker) +4. Telegram sendet Updates an Webhook +5. AuthMiddleware lässt Webhook-Requests durch (kein Cookie nötig) +6. TelegramEndpoint prüft X-Telegram-Bot-Api-Secret-Token Header +7. TelegramService verarbeitet Update: + - Bot laden via botId + - Chat-ID extrahieren + - Session suchen: telegram_bot_id = botId AND telegram_chat_id = chatId + - /start → Auto-Link (wenn genau 1 unverknüpfte Session) oder Chat-ID anzeigen - /clear → History archivieren - /status → Session-Info anzeigen - - /unlink → Verknüpfung aufheben - Text → An Claude weiterleiten (Non-Streaming) ``` -### Zugriffskontrolle (Chat-ID-Whitelist) +### Auto-Link-Logik -Nicht jeder Telegram-User darf den Bot nutzen: +Bei `/start` oder einer normalen Nachricht, wenn keine Session für den Chat verknüpft ist: +1. Suche Sessions mit diesem Bot, die **noch keine Chat-ID** haben +2. **Genau 1 gefunden** → Automatisch verknüpfen + Bestätigungsnachricht +3. **0 oder mehrere gefunden** → "Deine Chat-ID ist X, bitte im Web-UI zuweisen" -1. **Erster `/start`**: Kein Owner → User wird automatisch Owner (`TelegramChatId` gesetzt) -2. **Fremder `/start`**: User bekommt `🔒 Zugriff verweigert` + seine Chat-ID angezeigt -3. **Owner-Benachrichtigung**: Owner erhält `🔔 Zugriffsanfrage` mit Username + Chat-ID -4. **Freigabe**: Owner/Admin trägt Chat-ID in Session-Settings ein (`TelegramAllowedChatIds`) -5. **Prüfung**: Alle Commands + Nachrichten prüfen via `IsChatIdAllowed()` (Owner + Whitelist) +Unlink ist **nur über das Web-UI** möglich (kein Telegram-Befehl). ### Non-Streaming Chat Telegram-Nachrichten werden über `AnthropicService.ChatNonStreaming()` verarbeitet. Die History wird genauso aus der DB aufgebaut wie beim Web-Chat. Antworten über 4096 Zeichen werden automatisch in Chunks aufgeteilt. +### Dashboard & Frontend + +- **Dashboard**: Telegram-Bots-Section mit Cards (Name, maskierter Token, Session-Count) +- **Bot-Page** (`#/telegram-bot/{botId}`): Name, Token, Webhook-Secret (readonly), Webhook-Verwaltung (registrieren/status/entfernen), Public-Checkbox, Löschen +- **Session-Page**: Bot-Picker (wie Agent-Picker), readonly Chat-ID mit Unlink-Button + --- ## Cronjob-System @@ -1500,6 +1523,41 @@ Im `WindowsApp/`-Ordner liegt ein minimaler **WPF WebView2 Client**: --- +## OpenClaw Import + +Sessions können mit Chatverlauf aus einer **OpenClaw-Instanz** befüllt werden. Die Import-Quelle ist eine SQLite-Datenbank (`publish/data/openclaw-sessions.db`). + +### Funktionsweise + +- **`GET /api/openclaw/sessions`** – Listet alle Sessions aus der OpenClaw-DB mit Metadaten (Message-Count, Model, Summary, Preview-Messages) +- **`POST /api/openclaw/import`** – Importiert eine OpenClaw-Session in eine bestehende Gott-Session + +### Import-Logik + +1. Liest alle `message`-Entries aus der OpenClaw-DB, gruppiert nach `chainId` +2. **Nur Text-Nachrichten** werden importiert – Tool-Use/Tool-Result werden übersprungen +3. **User-Message-Bereinigung**: Webchat-Prefixe (`[Direct 1:1 webchat ...]`, `[Current message ...]`, `[cron:...]`), `Conversation info`-Blöcke werden entfernt +4. Pro Chain wird ein `ChainRecord` + `MessageRecords` erstellt, alle mit `tag = 'openclaw-import'` +5. Timestamps werden aus OpenClaw übernommen (`created_at`) +6. **Re-Import = Update**: Vorherige Import-Chains (erkennbar am Tag) werden gelöscht und neu importiert. Bestehende Compactions werden ebenfalls gelöscht. + +### Sortierung (sort_key) + +Importierte Messages werden **immer vor** normalen Messages einsortiert, da sie historisch älter sind: + +```sql +sort_key = CASE WHEN tag = 'openclaw-import' THEN id - 10000000000 ELSE id END +``` + +Alle History-Queries (initial load, before/after-Paging, Polling) sortieren nach `sort_key`. OpenClaw-Messages bekommen negative sort_keys → erscheinen immer ganz oben. Innerhalb jeder Gruppe (OpenClaw / normal) wird nach `id` sortiert. + +### Frontend + +- **Dashboard**: Session-Menü → „OpenClaw Import" → Modal mit Session-Auswahl + Preview +- **Chat**: Importierte Nachrichten zeigen ein blaues „OC"-Badge + +--- + ## Deployment ### deploy.sh diff --git a/ARCHITECTURE_QUICK.md b/ARCHITECTURE_QUICK.md index d1c076f..c1acdeb 100644 --- a/ARCHITECTURE_QUICK.md +++ b/ARCHITECTURE_QUICK.md @@ -27,7 +27,7 @@ gott/ │ ├── js/api.js # fetch()-Wrapper │ ├── js/ui-helpers.js # DOM-Helpers ($, esc, truncate), Toast, ScrollDown │ ├── js/markdown.js # Markdown-Rendering (renderMarkdown, LaTeX-Schutz) -│ ├── js/cards.js # Card-Builder (buildSessionCard, buildAgentCard) +│ ├── js/cards.js # Card-Builder (buildSessionCard, buildAgentCard, buildTelegramBotCard) │ ├── js/msg-actions.js # Nachrichten-Aktionen (Delete, Mark, Share, Reply) │ ├── js/tool-ui.js # Tool-Boxes, Diffs, Visibility-Logik │ ├── js/modals.js # Modale Dialoge (System-Prompt, Command-Output) @@ -38,7 +38,7 @@ gott/ │ ├── js/archive.js # Archiv-Loading │ ├── js/reply.js # Reply/Quote-Handling │ ├── js/files.js # File-Upload, Workspace-Refs -│ ├── js/pages/ # Seiten-Komponenten +│ ├── js/pages/ # Seiten-Komponenten (inkl. telegram-bot-page.js) │ └── css/ # Styles (theme.css = CSS Variables) ├── WindowsApp/ # WPF + WebView2 Desktop Client └── publish/ # ⛔ NICHT editieren! @@ -59,22 +59,23 @@ User 1──* Agent 1──* Session 1──* Chain 1──* Message 1──* At Session 1──* Cronjob Session 1──* Archive User 1──* SharedMessage ──1 Message +User 1──* TelegramBot 1──* Session (via telegram_bot_id) ``` | Tabelle | Zweck | |---------|-------| | `users` | Login, DisplayName, IsAdmin, Persona, Settings (JSON), DefaultPath | | `tokens` | Auth-Tokens → User | -| `agents` | AI-Agenten (Model, ToolChoice, CustomCommands, AutoCommit, UseSoul/Identity/UserInfo/Memory, WebSearch, AllowUserChoice, TaskInstruction, AvatarScale/Offset, AvatarSmall) | -| `sessions` | Chat-Sessions (Description, Image, ImageSmall, Workspace, Context, CustomCommands, Telegram, AvatarScale/Offset, AllowedChatIds, PreparerAgentId, ReviewAgentId, MaxReviewIterations, FinalizerAgentId) | +| `agents` | AI-Agenten (Model, ToolChoice, CustomCommands, AutoCommit, UseSoul/Identity/UserInfo/Memory, WebSearch, AllowUserChoice, TaskInstruction, AvatarScale/Offset, AvatarSmall, IsPublic) | +| `sessions` | Chat-Sessions (Description, Image, ImageSmall, Workspace, Context, CustomCommands, TelegramBotId, TelegramChatId, AvatarScale/Offset, PreparerAgentId, ReviewAgentId, MaxReviewIterations, FinalizerAgentId) | | `chains` | Ein Request-Response-Zyklus (Tokens, Timing, Iterations, PlanMode, ToolChoice, ToolNames, StreamErrorInfo, ArchiveId) | -| `messages` | Einzelne Nachrichten (text / tool_use / tool_result / error / web_search_result), Tag für Sub-Agent-Markierung | +| `messages` | Einzelne Nachrichten (text / tool_use / tool_result / error / web_search_result), Tag für Sub-Agent-Markierung oder Import-Herkunft (`openclaw-import`) | | `attachments` | Base64-Anhänge (Bilder, Dokumente) | | `archives` | Archivierte Chain-Gruppen | | `cronjobs` | Geplante Tasks (Cron-Expression + Prompt) | | `agent_skills` | N:M Agent ↔ Skill | | `shared_messages` | Geteilte Nachrichten (öffentliche Links via Share-Token) | -| `telegram_links` | Telegram Chat-ID ↔ Session | +| `telegram_bots` | Telegram Bots (BotToken, WebhookSecret, Name, IsPublic) – eigenständige Entität, 1 Bot → N Sessions | --- @@ -89,7 +90,8 @@ User 1──* Agent 1──* Session 1──* Chain 1──* Message 1──* At | Agents | `/api/agents/` | CRUD (Liste inkl. inline Skills) | | Admin | `/api/admin/` | User CRUD, impersonate, login-link (Admin-only) | | Workspace | `/api/workspace/` | tree, file read/write, mkdir, rmdir, browse, agent-files | -| Telegram | `/api/telegram/` | webhook (unauth), config, registration | +| Telegram | `/api/telegram/` | Bot-CRUD, webhook/{botId} (unauth), session-config, registration | +| OpenClaw | `/api/openclaw/` | Import von OpenClaw-Sessions (sessions, import) | | Cronjobs | `/api/cronjobs/` | CRUD + toggle, manual run | | Krea | `/api/images/` | generate, list, file-serve, thumb, status (file/* ohne Auth) | | Skills | `/api/skills` | list, agent-mapping, output-files | @@ -115,7 +117,7 @@ User 1──* Agent 1──* Session 1──* Chain 1──* Message 1──* At | **SystemPromptBuilder** | System-Prompt aus modularen Blöcken zusammenbauen (static) | | **MemoryService** | Agent-Gedächtnis auf Dateisystem | | **SkillService** | Skill-Discovery aus Dateisystem | -| **TelegramService** | Telegram Bot API | +| **TelegramService** | Telegram Bot API (Bot-basiert, Multi-Session-Routing) | | **CronjobService** | BackgroundService, minütlicher Cron-Check | | **KreaService** | Krea API Bildgenerierung + Job-Polling | | **ImageService** | Bild-Resize + WebP-Konvertierung (512px + 256px Thumbnail) | @@ -212,6 +214,7 @@ User-Input → POST /api/chat (SSE) | `#/chat/{id}` | `chat-page.js` | Chat | | `#/session/{id}` | `session-page.js` | Session-Settings | | `#/agent/{id}` | `agent-page.js` | Agent-Editor | +| `#/telegram-bot/{id}` | `telegram-bot-page.js` | Telegram-Bot-Editor | | `#/cronjobs` | `cronjob-page.js` | Cronjobs | | `#/profile` | `profile-page.js` | Profil | | `#/settings` | `settings-page.js` | Einstellungen | @@ -226,7 +229,7 @@ User-Input → POST /api/chat (SSE) 1. `POST /api/auth/login` → Token generiert, als `gott_token` HttpOnly Cookie gesetzt 2. Jeder `/api/`-Request → `AuthMiddleware` prüft Cookie → setzt `UserId` + `IsAdmin` -3. Ausnahmen: Login, Autologin, Telegram-Webhook, `GET /api/shared/{token}`, `GET /api/images/file/*` brauchen kein Auth +3. Ausnahmen: Login, Autologin, Telegram-Webhook (`/api/telegram/webhook/{botId}`), `GET /api/shared/{token}`, `GET /api/images/file/*` brauchen kein Auth 4. **Krea API-Key**: `/api/images/`-Routen akzeptieren `X-Api-Key`-Header (Config: `KreaApiKey`) für Automation ohne User-Kontext 5. **Impersonate**: Admin kann via `POST /api/admin/users/{id}/impersonate` als anderer User einloggen 6. **Login-Link**: Admin generiert via `POST /api/admin/users/{id}/login-link` einen Autologin-Link (Token-basiert, `GET /api/auth/autologin?token=xxx`) diff --git a/README.md b/README.md index 1cf1bc7..a176934 100644 --- a/README.md +++ b/README.md @@ -21,11 +21,12 @@ Self-hosted AI-Coding-Agent auf Basis der Anthropic Claude API. Stellt eine Web- - **Skill-System** – Wiederverwendbare Prompt-Bausteine, zuordenbar pro Agent - **Memory** – Persistentes Gedächtnis pro Agent (Dateisystem-basiert) - **Workspace-Browser** – Integrierter Datei-Explorer mit Editor -- **Telegram-Integration** – Agents über Telegram ansprechen +- **Telegram-Integration** – Bots als eigenständige Entität, mehrere Sessions pro Bot, Public-Bots - **Cronjobs** – Zeitgesteuerte Prompts mit Cron-Expressions - **Bildgenerierung** – Krea AI Integration für Bildgenerierung - **Nachrichten teilen** – Einzelne Nachrichten per öffentlichem Link teilen - **Archivierung** – Chat-Verläufe archivieren und durchsuchen +- **OpenClaw Import** – Chatverlauf aus OpenClaw-Instanzen importieren - **Benutzerverwaltung** – Multi-User mit Admin-Rollen, Impersonate, Login-Links - **Servereinstellungen** – Admin-UI für `appsettings.Production.json` - **Desktop-Client** – WPF + WebView2 Windows-App