docs: Dokumentation aktualisieren (Telegram Bots, OpenClaw Import, Public-Flags)

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
This commit is contained in:
Meleki committed 2026-03-08 23:06:40 +01:00
1 parent 4f847bd33d
commit 677b227200
3 files changed
+106 -44

No files matched your search

+92 -34
View File
@@ -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
+12 -9
View File
@@ -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`)
+2 -1
View File
@@ -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