diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index a32a335..1b32e8c 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -266,8 +266,8 @@ Message (1) ─── (*) SharedMessage |-------------------|-----------------------------------------------------| | `users` | Benutzer (username, password_hash, persona, settings, default_path) | | `tokens` | Auth-Tokens (token → user_id) | -| `agents` | AI-Agenten (model, soul, identity, memory, tools, avatar_scale) | -| `sessions` | Chat-Sessions (workspace, context, telegram-config, avatar_scale, telegram_allowed_chat_ids, review_agent_id, max_review_iterations) | +| `agents` | AI-Agenten (model, soul, identity, memory, tools, avatar_scale, avatar_offset_x/y) | +| `sessions` | Chat-Sessions (workspace, context, telegram-config, avatar_scale, avatar_offset_x/y, telegram_allowed_chat_ids, review_agent_id, max_review_iterations) | | `chains` | Request-Chains (model, tokens, iterations, timing) | | `messages` | Einzelne Nachrichten (text, tool_use, tool_result) | | `attachments` | Datei-Anhänge (base64, image/document) | @@ -309,8 +309,8 @@ Die `Program.cs` ist der zentrale Einstiegspunkt und konfiguriert: 2. **Datenbank-Initialisierung** – `DatabaseService` erstellt Schema + Migrationen 3. **Default-User** – Wird automatisch angelegt falls keine User existieren 4. **Middleware** – Static Files → `AuthMiddleware` → Endpoints -5. **Endpoint-Mapping** – Alle 16 Endpoint-Gruppen registriert -6. **Server** – Kestrel auf `http://0.0.0.0:19000` +5. **Endpoint-Mapping** – Alle 17 Endpoint-Gruppen registriert +6. **Server** – Kestrel auf `http://0.0.0.0:{Port}` (Port aus Config, Default 19000) Initialisierungsreihenfolge: ``` @@ -362,6 +362,7 @@ Alle Endpoints folgen dem **Minimal API**-Pattern mit Extension Methods (`MapXxx | **Backup** | `/api/backup` | `POST` (Admin only, tar.gz Download) | | **Shared** | `/api/shared/`, `/api/messages/{id}/share` | Share erstellen, öffentlich abrufen, auflisten, löschen | | **Info** | `/api/info` | `GET` (Build-Zeitstempel) | +| **ServerSettings** | `/api/admin/server-settings` | `GET`, `PUT` (Admin-only, liest/schreibt `appsettings.Production.json`) | ### Middleware @@ -418,6 +419,7 @@ Das Frontend ist eine **Single-Page Application** ohne Build-Step, komplett in V | `#/profile` | `profile-page.js` | Profil | | `#/settings` | `settings-page.js` | App-Einstellungen | | `#/admin` | `admin-page.js` | Benutzerverwaltung (Admin-only) | +| `#/server-settings` | `server-settings-page.js` | Servereinstellungen (Admin-only) | | `#/login` | `login-page.js` | Login | | `#/shared/{token}` | `shared-page.js` | Öffentliche geteilte Nachricht (kein Auth) | @@ -1106,7 +1108,11 @@ Sessions und Agents können ein **Bild/Avatar** haben mit konfigurierbarem Zoom. | Feld | Tabellen | Beschreibung | |------|----------|-------------| | `image` / `avatar` | `sessions` / `agents` | Base64-kodiertes Bild (JPEG, max 512px via ImageService) | -| `avatar_scale` | `sessions`, `agents` | Zoom-Faktor (0.5× – 3×, Default 1.0), angewandt via CSS `transform: scale()` | +| `avatar_scale` | `sessions`, `agents` | Zoom-Faktor (0.5× – 3×, Default 1.0) | +| `avatar_offset_x` | `sessions`, `agents` | Horizontale Position (-50% – +50%, Default 0), via CSS `translate()` | +| `avatar_offset_y` | `sessions`, `agents` | Vertikale Position (-50% – +50%, Default 0), via CSS `translate()` | + +Darstellung via CSS `transform: scale(S) translate(X%, Y%)` im `.card-image` Container (`overflow: hidden`). ### Avatar-Editor (`avatar-editor.js`) @@ -1117,10 +1123,11 @@ const editor = AvatarEditor.init({ previewEl: document.querySelector('.avatar-preview'), currentImage: existingBase64OrNull, currentScale: 1.0, - onImageChange: (base64) => { /* Preview aktualisieren */ }, - onScaleChange: (scale) => { /* Live-Preview skalieren */ } + initialOffsetX: 0, + initialOffsetY: 0, + onChange: (imageData, scale, offsetX, offsetY) => { /* Live-Preview */ } }); -// Werte auslesen: editor.getImage(), editor.getScale() +// Werte auslesen: editor.getImage(), editor.getScale(), editor.getOffsetX(), editor.getOffsetY() // Aufräumen: editor.destroy() ``` @@ -1129,11 +1136,12 @@ const editor = AvatarEditor.init({ - **Paste**: Ctrl+V → Bild aus Zwischenablage einfügen - **AI-Generate**: Text-Prompt → Krea API → Bild generieren (nur wenn `KreaToken` konfiguriert) - **Scale**: Range-Slider 0.5× – 3× mit Live-Preview +- **Offset X/Y**: Range-Slider -50% – +50% für horizontale/vertikale Positionierung - **Clear**: Bild entfernen ### Dashboard-Darstellung -Cards zeigen Avatare mit `transform: scale(avatarScale)` im `.card-image` Container (`overflow: hidden`). +Cards zeigen Avatare mit `transform: scale(S) translate(X%, Y%)` im `.card-image` Container (`overflow: hidden`). Die Helper `buildAgentCard()` und `buildSessionCard()` in `ui.js` nutzen `buildTransformStyle(scale, offsetX, offsetY)` dafür. --- @@ -1215,6 +1223,7 @@ Die Anwendung läuft als systemd Service (`gott.service`), Kestrel auf Port 1900 ```json { + "Port": 19000, // Server-Port (Default 19000, erfordert Neustart) "AnthropicToken": "", // Anthropic API Key (REQUIRED) "MaxIterations": 100, // Max Tool-Loop Iterationen pro Chat "PayloadLogging": false, // API-Payloads loggen (Debug) @@ -1224,10 +1233,14 @@ Die Anwendung läuft als systemd Service (`gott.service`), Kestrel auf Port 1900 } ``` +### appsettings.Production.json + +Überschreibt Werte aus `appsettings.json` im Production-Environment. Wird **nicht** beim Publish mitkopiert (liegt nur im `publish/`-Verzeichnis). Verwaltung über die **Admin-UI** (Servereinstellungen, `#/server-settings`). + ### Environment - `ASPNETCORE_ENVIRONMENT=Production` → lädt `appsettings.Production.json` -- Tokens und Secrets sollten in `appsettings.Production.json` stehen (nicht in Git) +- Tokens und Secrets werden über die Server-Settings-UI in `appsettings.Production.json` geschrieben --- diff --git a/ARCHITECTURE_QUICK.md b/ARCHITECTURE_QUICK.md index be80884..c3a51d2 100644 --- a/ARCHITECTURE_QUICK.md +++ b/ARCHITECTURE_QUICK.md @@ -54,8 +54,8 @@ User 1──* Agent 1──* Session 1──* Chain 1──* Message 1──* At |---------|-------| | `users` | Login, Persona, Settings (JSON), DefaultPath | | `tokens` | Auth-Tokens → User | -| `agents` | AI-Agenten (Model, Tools, Config, AvatarScale) | -| `sessions` | Chat-Sessions (Workspace, Context, Telegram, AvatarScale, AllowedChatIds, ReviewAgentId, MaxReviewIterations) | +| `agents` | AI-Agenten (Model, Tools, Config, AvatarScale, AvatarOffsetX/Y) | +| `sessions` | Chat-Sessions (Workspace, Context, Telegram, AvatarScale, AvatarOffsetX/Y, AllowedChatIds, ReviewAgentId, MaxReviewIterations) | | `chains` | Ein Request-Response-Zyklus (Tokens, Timing, Iterations) | | `messages` | Einzelne Nachrichten (text / tool_use / tool_result / error) | | `attachments` | Base64-Anhänge (Bilder, Dokumente) | @@ -87,6 +87,7 @@ User 1──* Agent 1──* Session 1──* Chain 1──* Message 1──* At | Backup | `/api/backup` | POST → tar.gz download (Admin) | | Shared | `/api/shared/`, `/api/messages/{id}/share` | Share erstellen, öffentlich abrufen, löschen | | Info | `/api/info` | GET → Build-Zeitstempel | +| ServerSettings | `/api/admin/server-settings` | `GET`, `PUT` (Admin-only, liest/schreibt `appsettings.Production.json`) | --- @@ -191,6 +192,7 @@ User-Input → POST /api/chat (SSE) | `#/profile` | `profile-page.js` | Profil | | `#/settings` | `settings-page.js` | Einstellungen | | `#/admin` | `admin-page.js` | Benutzerverwaltung (Admin) | +| `#/server-settings` | `server-settings-page.js` | Servereinstellungen (Admin) | | `#/login` | `login-page.js` | Login | | `#/shared/{token}` | `shared-page.js` | Geteilte Nachricht (öffentlich, kein Auth) | @@ -212,6 +214,7 @@ User-Input → POST /api/chat (SSE) ```json { + "Port": 19000, // Server-Port (erfordert Neustart) "AnthropicToken": "", // Anthropic API Key (REQUIRED) "MaxIterations": 100, // Max Tool-Loop Iterationen pro Chat "PayloadLogging": false, // API-Payloads loggen (Debug) @@ -221,6 +224,8 @@ User-Input → POST /api/chat (SSE) } ``` +Verwaltung über **Admin-UI** (`#/server-settings`): Liest `appsettings.Production.json` (Fallback: `appsettings.json` → Default). Schreibt immer in `appsettings.Production.json`. Die Datei wird **nicht** beim Publish mitkopiert. + --- ## Deployment @@ -229,7 +234,7 @@ User-Input → POST /api/chat (SSE) ./deploy.sh # dotnet publish → systemctl restart gott ``` -Läuft als `systemd`-Service, Kestrel auf Port 19000, typisch hinter Nginx/Caddy Reverse Proxy. +Läuft als `systemd`-Service, Kestrel auf konfigurierbarem Port (Default 19000), typisch hinter Nginx/Caddy Reverse Proxy. --- diff --git a/README.md b/README.md index 71d82c1..0cb0e69 100644 --- a/README.md +++ b/README.md @@ -3,4 +3,4 @@ Self-hosted AI-Coding-Agent auf Basis der Anthropic API. Stellt eine Web-UI bereit, über die man in Sessions mit konfigurierbaren Agenten chatten kann. Die Agenten haben Tool-Zugriff (Dateien lesen/schreiben/bearbeiten, Shell-Befehle ausführen) auf ein definiertes Workspace-Verzeichnis. - **Stack:** .NET 10, SQLite, Vanilla-Frontend -- **Port:** 19000 +- **Port:** 19000 (konfigurierbar via `appsettings.json`)