docs: ServerSettings-UI, Avatar-Offset, konfigurierbarer Port, appsettings.Production.json Verwaltung

This commit is contained in:
Meleki committed 2026-03-06 22:53:25 +01:00
1 parent dc2709b3cd
commit 23c2bde8d4
3 files changed
+32 -14

No files matched your search

+23 -10
View File
@@ -266,8 +266,8 @@ Message (1) ─── (*) SharedMessage
|-------------------|-----------------------------------------------------| |-------------------|-----------------------------------------------------|
| `users` | Benutzer (username, password_hash, persona, settings, default_path) | | `users` | Benutzer (username, password_hash, persona, settings, default_path) |
| `tokens` | Auth-Tokens (token → user_id) | | `tokens` | Auth-Tokens (token → user_id) |
| `agents` | AI-Agenten (model, soul, identity, memory, tools, avatar_scale) | | `agents` | AI-Agenten (model, soul, identity, memory, tools, avatar_scale, avatar_offset_x/y) |
| `sessions` | Chat-Sessions (workspace, context, telegram-config, avatar_scale, telegram_allowed_chat_ids, review_agent_id, max_review_iterations) | | `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) | | `chains` | Request-Chains (model, tokens, iterations, timing) |
| `messages` | Einzelne Nachrichten (text, tool_use, tool_result) | | `messages` | Einzelne Nachrichten (text, tool_use, tool_result) |
| `attachments` | Datei-Anhänge (base64, image/document) | | `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 2. **Datenbank-Initialisierung** – `DatabaseService` erstellt Schema + Migrationen
3. **Default-User** – Wird automatisch angelegt falls keine User existieren 3. **Default-User** – Wird automatisch angelegt falls keine User existieren
4. **Middleware** – Static Files → `AuthMiddleware` → Endpoints 4. **Middleware** – Static Files → `AuthMiddleware` → Endpoints
5. **Endpoint-Mapping** – Alle 16 Endpoint-Gruppen registriert 5. **Endpoint-Mapping** – Alle 17 Endpoint-Gruppen registriert
6. **Server** – Kestrel auf `http://0.0.0.0:19000` 6. **Server** – Kestrel auf `http://0.0.0.0:{Port}` (Port aus Config, Default 19000)
Initialisierungsreihenfolge: 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) | | **Backup** | `/api/backup` | `POST` (Admin only, tar.gz Download) |
| **Shared** | `/api/shared/`, `/api/messages/{id}/share` | Share erstellen, öffentlich abrufen, auflisten, löschen | | **Shared** | `/api/shared/`, `/api/messages/{id}/share` | Share erstellen, öffentlich abrufen, auflisten, löschen |
| **Info** | `/api/info` | `GET` (Build-Zeitstempel) | | **Info** | `/api/info` | `GET` (Build-Zeitstempel) |
| **ServerSettings** | `/api/admin/server-settings` | `GET`, `PUT` (Admin-only, liest/schreibt `appsettings.Production.json`) |
### Middleware ### Middleware
@@ -418,6 +419,7 @@ Das Frontend ist eine **Single-Page Application** ohne Build-Step, komplett in V
| `#/profile` | `profile-page.js` | Profil | | `#/profile` | `profile-page.js` | Profil |
| `#/settings` | `settings-page.js` | App-Einstellungen | | `#/settings` | `settings-page.js` | App-Einstellungen |
| `#/admin` | `admin-page.js` | Benutzerverwaltung (Admin-only) | | `#/admin` | `admin-page.js` | Benutzerverwaltung (Admin-only) |
| `#/server-settings` | `server-settings-page.js` | Servereinstellungen (Admin-only) |
| `#/login` | `login-page.js` | Login | | `#/login` | `login-page.js` | Login |
| `#/shared/{token}` | `shared-page.js` | Öffentliche geteilte Nachricht (kein Auth) | | `#/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 | | Feld | Tabellen | Beschreibung |
|------|----------|-------------| |------|----------|-------------|
| `image` / `avatar` | `sessions` / `agents` | Base64-kodiertes Bild (JPEG, max 512px via ImageService) | | `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`) ### Avatar-Editor (`avatar-editor.js`)
@@ -1117,10 +1123,11 @@ const editor = AvatarEditor.init({
previewEl: document.querySelector('.avatar-preview'), previewEl: document.querySelector('.avatar-preview'),
currentImage: existingBase64OrNull, currentImage: existingBase64OrNull,
currentScale: 1.0, currentScale: 1.0,
onImageChange: (base64) => { /* Preview aktualisieren */ }, initialOffsetX: 0,
onScaleChange: (scale) => { /* Live-Preview skalieren */ } 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() // Aufräumen: editor.destroy()
``` ```
@@ -1129,11 +1136,12 @@ const editor = AvatarEditor.init({
- **Paste**: Ctrl+V → Bild aus Zwischenablage einfügen - **Paste**: Ctrl+V → Bild aus Zwischenablage einfügen
- **AI-Generate**: Text-Prompt → Krea API → Bild generieren (nur wenn `KreaToken` konfiguriert) - **AI-Generate**: Text-Prompt → Krea API → Bild generieren (nur wenn `KreaToken` konfiguriert)
- **Scale**: Range-Slider 0.5× – 3× mit Live-Preview - **Scale**: Range-Slider 0.5× – 3× mit Live-Preview
- **Offset X/Y**: Range-Slider -50% – +50% für horizontale/vertikale Positionierung
- **Clear**: Bild entfernen - **Clear**: Bild entfernen
### Dashboard-Darstellung ### 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 ```json
{ {
"Port": 19000, // Server-Port (Default 19000, erfordert Neustart)
"AnthropicToken": "", // Anthropic API Key (REQUIRED) "AnthropicToken": "", // Anthropic API Key (REQUIRED)
"MaxIterations": 100, // Max Tool-Loop Iterationen pro Chat "MaxIterations": 100, // Max Tool-Loop Iterationen pro Chat
"PayloadLogging": false, // API-Payloads loggen (Debug) "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 ### Environment
- `ASPNETCORE_ENVIRONMENT=Production` → lädt `appsettings.Production.json` - `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
--- ---
+8 -3
View File
@@ -54,8 +54,8 @@ User 1──* Agent 1──* Session 1──* Chain 1──* Message 1──* At
|---------|-------| |---------|-------|
| `users` | Login, Persona, Settings (JSON), DefaultPath | | `users` | Login, Persona, Settings (JSON), DefaultPath |
| `tokens` | Auth-Tokens → User | | `tokens` | Auth-Tokens → User |
| `agents` | AI-Agenten (Model, Tools, Config, AvatarScale) | | `agents` | AI-Agenten (Model, Tools, Config, AvatarScale, AvatarOffsetX/Y) |
| `sessions` | Chat-Sessions (Workspace, Context, Telegram, AvatarScale, AllowedChatIds, ReviewAgentId, MaxReviewIterations) | | `sessions` | Chat-Sessions (Workspace, Context, Telegram, AvatarScale, AvatarOffsetX/Y, AllowedChatIds, ReviewAgentId, MaxReviewIterations) |
| `chains` | Ein Request-Response-Zyklus (Tokens, Timing, Iterations) | | `chains` | Ein Request-Response-Zyklus (Tokens, Timing, Iterations) |
| `messages` | Einzelne Nachrichten (text / tool_use / tool_result / error) | | `messages` | Einzelne Nachrichten (text / tool_use / tool_result / error) |
| `attachments` | Base64-Anhänge (Bilder, Dokumente) | | `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) | | Backup | `/api/backup` | POST → tar.gz download (Admin) |
| Shared | `/api/shared/`, `/api/messages/{id}/share` | Share erstellen, öffentlich abrufen, löschen | | Shared | `/api/shared/`, `/api/messages/{id}/share` | Share erstellen, öffentlich abrufen, löschen |
| Info | `/api/info` | GET → Build-Zeitstempel | | 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 | | `#/profile` | `profile-page.js` | Profil |
| `#/settings` | `settings-page.js` | Einstellungen | | `#/settings` | `settings-page.js` | Einstellungen |
| `#/admin` | `admin-page.js` | Benutzerverwaltung (Admin) | | `#/admin` | `admin-page.js` | Benutzerverwaltung (Admin) |
| `#/server-settings` | `server-settings-page.js` | Servereinstellungen (Admin) |
| `#/login` | `login-page.js` | Login | | `#/login` | `login-page.js` | Login |
| `#/shared/{token}` | `shared-page.js` | Geteilte Nachricht (öffentlich, kein Auth) | | `#/shared/{token}` | `shared-page.js` | Geteilte Nachricht (öffentlich, kein Auth) |
@@ -212,6 +214,7 @@ User-Input → POST /api/chat (SSE)
```json ```json
{ {
"Port": 19000, // Server-Port (erfordert Neustart)
"AnthropicToken": "", // Anthropic API Key (REQUIRED) "AnthropicToken": "", // Anthropic API Key (REQUIRED)
"MaxIterations": 100, // Max Tool-Loop Iterationen pro Chat "MaxIterations": 100, // Max Tool-Loop Iterationen pro Chat
"PayloadLogging": false, // API-Payloads loggen (Debug) "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 ## Deployment
@@ -229,7 +234,7 @@ User-Input → POST /api/chat (SSE)
./deploy.sh # dotnet publish → systemctl restart gott ./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.
--- ---
+1 -1
View File
@@ -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. 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 - **Stack:** .NET 10, SQLite, Vanilla-Frontend
- **Port:** 19000 - **Port:** 19000 (konfigurierbar via `appsettings.json`)