Commit Graph
100 Commits
Author SHA1 Message Date
Meleki 489b5e0eb0 feat: Timestamps + LaTeX/KaTeX-Rendering im Chat
Timestamps (dd.MM.yyyy HH:mm:ss):
- Neuer _formatTimestamp() + _addTimestamp() Helper in ui.js
- Timestamp bei allen User- und Assistant-Nachrichten (live, history, archiv)
- Erscheint on hover, halbtransparent, rechts oben an der Bubble

LaTeX/Math-Rendering mit KaTeX 0.16.21:
- KaTeX lokal eingebunden (JS + CSS + 21 woff2-Fonts)
- renderMarkdown() schützt LaTeX vor Markdown-Parsing
- $$...$$ → Block-Math (zentriert), $...$ → Inline-Math
- Fehlerhafte Ausdrücke als <code> Fallback
- KaTeX-Display Styling in markdown.css

Weitere Änderungen:
- theme.css: Neue --info Farbe
- Blockquote-Styling: info-Farbe statt halbtransparent
2026-03-05 18:25:03 +01:00
Meleki dbeba6535a fix: Nachrichtenanzahl zählt nur text-Messages, keine tool_use/tool_result
- 5 SQL COUNT-Queries mit 'type = text' Filter versehen:
  - GetSessionsWithStats (activeCount + totalCount)
  - GetActiveMessageCount
  - GetActiveMessageCountBeforeId
  - CreateArchive (messageCount)
- Dashboard: Aktive und archivierte Nachrichten separat angezeigt
- ArchiveMessageCount als eigenes Feld im Session-DTO
- TODO.md: Nachrichtenzählung-Bug als erledigt markiert
2026-03-05 16:33:03 +01:00
Meleki 4ae894304f fix: CancellationToken durchgängig in AnthropicService propagieren
- ThrowIfCancellationRequested() am Anfang jeder while-Loop-Iteration
- WriteSseEvent() erhält CancellationToken-Parameter, prüft vor Schreiben
- WriteAsync/FlushAsync mit CancellationToken aufgerufen
- Cancellation-Check vor und nach Tool-Execution
- OperationCanceledException in ExecuteTool wird re-thrown statt geschluckt
- Behebt: Stop-Button brach nur Frontend-Stream ab, Backend lief weiter
2026-03-05 15:28:48 +01:00
Meleki 8a9293218b refactor: Shared Links als Card-Grid mit Card-Menü (wie Cronjobs)
- index.html: shared-links-list → card-grid
- dashboard.js: Cards mit card-compact, card-menu-dropdown, fa-cog statt fa-robot
- dashboard.css: 60 Zeilen shared-link-*/danger-icon CSS entfernt (nutzt card-Styles)
2026-03-05 15:11:05 +01:00
Meleki 38a8223228 feat: Geteilte Links auf Dashboard anzeigen + URL-Fix
Dashboard:
- Neue Section 'Geteilte Links' zeigt alle aktiven Shares
- Pro Eintrag: Role-Icon, Text-Vorschau, Session-Name, Modus, Datum
- Buttons: Link kopieren, öffnen, löschen (mit sofortigem UI-Update)
- Section nur sichtbar wenn Shares vorhanden

Backend:
- SharedEndpoint HandleListShares erweitert: Nachricht-Preview,
  Role, Session-Name pro Share mitgeliefert

Frontend:
- apiListShares() Funktion hinzugefügt
- Bugfix: Share-URL '/#/shared/' → '/#shared/' (Extra-Slash
  verursachte 404 weil parseHash leeren Page-Namen ergab)
2026-03-05 12:01:28 +01:00
Meleki 4bdcebc1e1 fix(css): shared-page layout – center children with page-width 2026-03-05 11:33:52 +01:00
Meleki 43b09ae794 docs: Doku-Korrekturen – Model-Mapping, History-Optimierung, appsettings
ARCHITECTURE.md:
- Model-Mapping-Tabelle vervollständigt (alle 8 Aliase + Default)

ARCHITECTURE_QUICK.md:
- max_iterations: 50 → 100
- History-Optimierung korrekt beschrieben (ältere Chains nur Text, Tool-Results 20k Zeichen)
- appsettings-Beispiel korrigiert (AnthropicToken, KreaToken, richtige Keys/Werte)
2026-03-05 10:26:00 +01:00
Meleki 5a0b355acd refactor: Beispiel-Daten in Memory-Pfaden durch YYYY-MM-DD Platzhalter ersetzen
- ToolService.cs: memory_read/memory_write Description nutzt YYYY-MM-DD
- SystemPromptBuilder.cs: Memory-Regel ohne festes Beispiel-Datum
- ARCHITECTURE.md: Dateibaum-Beispiel angepasst
2026-03-05 09:44:52 +01:00
Meleki 64c3f165e9 style: CSS-Verbesserungen (dvh, shared-page, button-layout) 2026-03-05 09:39:09 +01:00
Meleki 1693ace243 docs: Shared Messages Feature in ARCHITECTURE.md, ARCHITECTURE_QUICK.md und TODO.md ergänzt
- ARCHITECTURE.md: Neues Kapitel 17 (Nachrichten teilen), ER-Diagramm,
  Tabelle shared_messages, SharedEndpoint, Auth-Ausnahme, Frontend-Route,
  Dateibaum aktualisiert, Endpoint-Anzahl 14→15
- ARCHITECTURE_QUICK.md: Tabelle, Endpoint, Route, Auth-Ausnahme ergänzt
- TODO.md: Share-Feature als erledigt markiert, neuen Punkt für
  Share-Verwaltung hinzugefügt
2026-03-04 23:38:13 +01:00
Meleki be29984b25 feat: Einzelne Nachrichten als Link teilen
Backend:
- SharedMessageRecord Model + shared_messages DB-Tabelle
- SharedEndpoint: POST /api/messages/{id}/share, GET /api/shared/{token},
  GET /api/shared (Liste), DELETE /api/shared/{token}
- Auth-Ausnahme für GET /api/shared/{token} (öffentlich ohne Login)
- DB-Methoden: CreateSharedMessage, GetSharedMessage, GetChainMessagesUpTo

Frontend:
- Share-Button (fa-share-alt) an jeder Nachricht
- Kontextmenü: Einzelnachricht oder mit Thread-Kontext teilen
- Link wird automatisch in Zwischenablage kopiert
- Öffentliche Shared-Page (#shared/{token}) ohne Login
- Markdown-Rendering in der geteilten Ansicht
- CSS für Share-Button, Share-Menü und Shared-Page
2026-03-04 23:34:00 +01:00
Meleki 4e915f76af docs: add ARCHITECTURE.md & ARCHITECTURE_QUICK.md, fix user pre bg
- ARCHITECTURE.md: comprehensive project documentation (868 lines)
  covering all 21 chapters (data model, services, endpoints,
  chat pipeline, tool system, agents, memory, skills, telegram,
  cronjobs, krea, auth, workspace, deployment, config)
- ARCHITECTURE_QUICK.md: compact quick-reference (223 lines)
  for fast lookups during development
- chat.css: add .msg.user.markdown pre selector so code blocks
  in user messages get correct background color (was only on code)
2026-03-04 20:43:14 +01:00
Meleki 26da25967d feat: Krea Image Generation Endpoint
- KreaService: GenerateAsync() mit Job-Polling, Image-Download, Metadaten-Speicherung
- KreaEndpoint: POST /api/images/generate, GET /api/images, GET /api/images/file/{filename}, GET /api/images/status
- KreaImageRecord: Output-Model
- Output: data/images/<timestamp>-<index>.<ext> + data/images/<timestamp>.json
- 16 Modelle: flux, flux-kontext, flux-1.1-pro, imagen-3/4, chatgpt-image, runway-gen-4, etc.
- appsettings.json: KreaToken (Format: KEY_ID:SECRET), obsolete TelegramBotToken/WebhookSecret entfernt
2026-03-04 18:24:51 +01:00
Meleki f552b44b05 feat: payload logging (on/off + gzip) via appsettings + fix destroy messages ref 2026-03-04 16:10:09 +01:00
Meleki d482f5dca3 feat: API-Payload-Logging in data/logs/ für Debugging
- LogPayload() schreibt den kompletten Claude-API-Request als indented JSON
- Dateiname: <unixtime>-<sessionId>-<chainId>-iter<N>-payload.json
- Beide Pfade abgedeckt: StreamChat (Web) + ChatNonStreaming (Telegram/Cronjobs)
- try/catch: Logging-Fehler crashen nie die App
2026-03-04 14:35:15 +01:00
Meleki 8fc29c82d9 refactor: Chat-Payload vereinfacht + Inline-Bilder statt Platzhalter
Backend:
- ChatEndpoint empfängt nur noch content + sessionId (nicht mehr die gesamte History)
- History wird komplett aus DB aufgebaut via BuildHistoryFromDb
- Gelöschte Nachrichten (deleted_on) werden aus History gefiltert
- Leere Nachrichten werden übersprungen (kein API 400 mehr)
- BuildHistoryFromDb optimiert: nur Text für ältere Chains, Tool-Calls nur für aktuelle Chain
- GetChainMessages: includeDeleted-Parameter (Default: false)
- Archiv-Export nutzt includeDeleted: true

Frontend:
- messages[]-Array komplett entfernt (kein Client-seitiger History-State mehr)
- apiChat() sendet nur content + sessionId
- Inline-Bilder: [Bild: name] wird durch <img> ersetzt (live mit DataURL, History per API-Nachladen)
- _autoLoadImageAttachments() für History/Archiv/ältere Nachrichten
- Klick auf Inline-Bild öffnet Vollbild-Modal
2026-03-04 14:29:33 +01:00
Meleki 51db01752f style(chat): code-Hintergrund in User-Nachrichten anpassen 2026-03-04 12:01:37 +01:00
Meleki 07ea0fcafb Zeilenreferenz-Hinweis (cat -n) aus System-Prompt entfernt und automatisch an User-Nachricht angehängt
- System-Prompt: 3x cat-n Hinweise entfernt (Workspace-Block, toolAny-Erinnerung, Workspace-Erinnerung)
- chat.js: <hint> Tag mit cat-n Hinweis wird automatisch angehängt wenn Datei-Refs Zeilennummern haben
- chat.js: Einzelne Zeilen (path:11) werden jetzt korrekt geparst und angezeigt
- chat.css: hint Tag Styling, file-ref-chip Spacing angepasst
2026-03-04 11:59:19 +01:00
Meleki d88b046575 UI: Cronjob-Formular Layout-Verbesserungen
- form-container Wrapper entfernt, flache Struktur
- Aktiv-Checkbox nach oben verschoben
- .secondary-btn durch .positive-btn ersetzt (currentcolor)
- .danger-btn nutzt currentcolor für Border
- .form-group mit Padding, leere Status-Box wird versteckt
- .skill-name entfernt (ungenutzt)
- Status-Box: <br> durch inline-spans ersetzt
- Button-Icons bei Speichern/Löschen entfernt
2026-03-04 10:33:32 +01:00
Meleki 17e269ccb5 Reihenfolge: Cronjobs vor Agents (Dashboard, Templates, Scripts) + PLAN-Cronjob.md entfernt 2026-03-03 22:49:56 +01:00
Meleki b645625b56 Cronjobs + AnthropicService Singleton Refactoring
Cronjobs:
- CronjobService (BackgroundService) prüft jede Minute auf fällige Jobs
- Cron-Expression in Server-Lokalzeit via Cronos (CronFormat.Standard)
- Cronjob-Ausführung: Prompt → Session → Agent-Antwort in Chat-History
- Optionale Benachrichtigungs-Session (notify_session_id): Zusammenfassung
  wird in separate Session geschrieben (z.B. mit Telegram)
- Telegram-Benachrichtigung mit Cronjob-Name + Ursprungs-Session
- REST API: CRUD + toggle + manuelles Ausführen (/run)
- Frontend: Dashboard-Cards, Cronjob-Formular mit Cron-Vorschau,
  Session-Dropdown, Notify-Session-Dropdown, Status-Box

Refactoring:
- AnthropicService als Singleton in DI registriert
- ChatEndpoint + TelegramService nutzen injizierte Instanz
- Redundante Dependencies (Token, ToolService, MemoryService) entfernt

Neue Dateien:
- Models/CronjobRecord.cs
- Services/CronjobService.cs
- Endpoints/CronjobEndpoint.cs
- wwwroot/js/pages/cronjob-page.js
- PLAN-Cronjob.md
2026-03-03 22:44:46 +01:00
Meleki 0120bb8f73 Telegram: Bot=Session statt User-Level, Chat-Code-Refactoring
- Telegram-Config (Bot-Token, Webhook-Secret, ChatId) von User-Settings
  in sessions-Tabelle verschoben → jede Session hat ihren eigenen Bot
- Link-Code-System komplett entfernt (TelegramLinkRecord gelöscht)
- /start verknüpft automatisch, kein /link mehr nötig
- Alle Endpoints session-basiert: /api/sessions/{id}/telegram/*
- Webhook-URL pro Session: /api/telegram/webhook/{sessionId}

Refactoring: Doppelten Chat-Code eliminiert
- Neuer ChatService: PrepareContext, BuildHistoryFromDb, ResolveModelId
- Neues ChatContext-Model als gemeinsame Datenstruktur
- AnthropicService.ChatNonStreaming() für Telegram (statt eigenem Loop)
- TelegramService um ~180 Zeilen reduziert, kein eigener Claude-Loop mehr
- ChatEndpoint nutzt ChatService.PrepareContext() statt eigener Setup-Logik
- Model-Mapping nur noch an einer Stelle (3x → 1x)

Frontend
- Telegram-Section von Settings-Page in Session-Bearbeitungsseite verschoben
- Webhook-Secret readonly, wird einmalig generiert und persistent gespeichert
- Status wird automatisch geladen, Register/Delete je nach Webhook-Status
- Toast-Notification-System (showToast) in ui.js
- Link-Code-Modal und Telegram-Menüpunkt im Dashboard entfernt
- Telegram-Badge auf Session-Cards (konfiguriert/verbunden)

Bugfix: Bearer statt x-api-key für OAuth-Tokens im TelegramService
2026-03-03 21:46:59 +01:00
Meleki a0752ea492 feat: Settings in Datenbank speichern statt localStorage
- Neue Spalte 'settings' in users-Tabelle (Migration via TryAddColumn)
- SettingsEndpoint: GET/PUT /api/settings
- DatabaseService: GetUserSettings() + UpdateUserSettings()
- Frontend: currentSettings als globaler State in app.js
- settings-page.js: localStorage komplett entfernt, nutzt API
- Settings werden beim App-Start aus DB geladen und angewendet
2026-03-03 16:47:56 +01:00
Meleki aac10901fa build: WindowsApp/ aus csproj exkludieren, TODO aktualisiert 2026-03-03 16:28:11 +01:00
Meleki c9c15279d5 Claude-Statusbar global auf allen Seiten anzeigen + Schließen-Button
- #claudeStatusBar aus Dashboard-Template nach body verschoben (vor #app)
- loadClaudeStatus() von dashboard.js nach app.js (einmalig beim Start)
- Schließen-Button (×) zum Ausblenden der Statusbar
- Status-Bar CSS von dashboard.css nach main.css verschoben
2026-03-03 16:25:23 +01:00
Meleki 2673aecc5b feat: Emoji-Picker Button im Chat-Input (rechts neben Senden)
- #emojiBtn links neben #send platziert
- Fluent Emoji 3D Rendering via parseFluentEmojis()
- Kein Tooltip auf den Emoji-Buttons
- Picker öffnet sich rechts-ausgerichtet über dem Button
- emoji.userdata.js geladen (Kategorien + Mappings)
- Schließt beim Klick außerhalb oder beim destroy()
2026-03-03 16:18:00 +01:00
Meleki cdd3414771 Fix button spacing, opacity simplification, gitignore cleanup 2026-03-03 15:53:59 +01:00
Meleki 36fd5a6b6e refactor(css): selektoren in main.css zusammenfassen 2026-03-03 15:20:30 +01:00
Meleki bf0d65e75a ui: scrollbar am body-rand, todo_write custom renderer 2026-03-03 15:10:44 +01:00
Meleki c720a06c16 feat: todo_write tool-box mit custom parser, kein input, standardmäßig sichtbar 2026-03-03 14:50:22 +01:00
Meleki 5f2b2e2f18 feat: add glob, grep and todo_write builtin tools 2026-03-03 14:10:07 +01:00
Meleki c3865d239f chore: CSS-Cleanup opacity → var(--semi-transparent), TODO-Updates 2026-03-03 11:52:22 +01:00
Meleki a14a991a0f feat: Nachrichten als gelöscht markieren
- DB: deleted_on TEXT Spalte in messages (Migration)
- Backend: ToggleMessageDelete(), includeDeleted-Parameter in allen History-Queries
- Neuer Endpoint: PUT /api/messages/{id}/delete
- Frontend: Trash-Button zwischen Reply- und Mark-Button
- Gelöschte Nachrichten: durchgestrichen + roter Rand (oder versteckt je nach Einstellung)
- Einstellungen: Toggle-Switch 'Gelöschte Nachrichten anzeigen'
- KI-Payload: gelöschte Nachrichten werden nicht mitgeschickt
2026-03-03 11:45:52 +01:00
Meleki 493dfcda1c fix: various small fixes (TODO, CSS z-index, telegram status styling, settings prompt) 2026-03-03 10:30:36 +01:00
Meleki f203ed7f47 feat: Auth-Tokens in SQLite persistieren statt in-memory
Tokens überleben jetzt App-Restarts. AuthService schreibt/liest
Tokens aus einer 'tokens'-Tabelle in der SQLite-DB.
Logout (RevokeToken) funktioniert weiterhin korrekt.
2026-03-03 10:07:06 +01:00
Meleki 0c4d32de0f fix: Backup-Download (0 Bytes + fehlender Dateiname)
- api.js: credentials: 'include' hinzugefügt (Auth-Cookie)
- BackupEndpoint.cs: Task<IResult> → Task mit direktem Response-Handling
  (ASP.NET hat IResult nicht korrekt verarbeitet → leerer Body)
2026-03-03 10:01:30 +01:00
Meleki a32de29d25 style: Card-Dropdown öffnet nach links unten statt rechts
- Position: unterhalb des Trigger-Buttons
- Rechte Kante des Dropdowns an rechter Kante des Buttons ausgerichtet
- Fallback: nach oben wenn unten kein Platz
2026-03-03 09:29:58 +01:00
Meleki e2927893f7 style: Card-Dropdown öffnet nach rechts statt unten
- Position: rechts neben dem Trigger-Button (gleiche Höhe)
- Fallback: links öffnen wenn rechts kein Platz
- Viewport-Overflow-Check für unten und links
2026-03-03 09:27:09 +01:00
Meleki 90afd79e76 fix: Dashboard Card-Dropdown nicht mehr abgeschnitten
- CSS: position: fixed statt absolute, z-index: 1000, box-shadow
- JS: Position dynamisch berechnet (getBoundingClientRect) beim Öffnen
- Viewport-Overflow-Korrektur falls Dropdown zu weit rechts/links
2026-03-03 09:24:26 +01:00
Meleki 4fa0111c33 feat: Erweiterte Model-Auswahl für Agents
- Model-Optionen: sonnet-4-5, sonnet-4-6, opus-4-5, opus-4-6, haiku-4-5
- ChatEndpoint + TelegramService: Model-Mapping für alle Varianten
- Agent-Formular: Dropdown mit allen Model-Versionen
- ui.js: prettyModelName() vereinfacht für neue Model-Werte
2026-03-03 09:22:47 +01:00
Meleki 99914bd343 feat: Stream-Error-Info für Debugging bei unexpected_end / max_tokens
- chains Tabelle: neue Spalte stream_error_info (TEXT)
- ChainRecord: neues Property StreamErrorInfo
- AnthropicService/ProcessStream: sammelt Debug-Infos bei problematischen
  stop_reasons (unexpected_end, max_tokens) und API error-Events
- FinalizeChain: speichert stream_error_info in DB
- SSE done-Event: enthält streamErrorInfo für Client-seitiges Debugging
2026-03-03 09:14:04 +01:00
Meleki dc87bf802a fix: Telegram DELETE /webhook von Auth nicht mehr ausschließen
AuthMiddleware hat /api/telegram/webhook komplett von der Auth
ausgeschlossen – unabhängig von der HTTP-Methode. Dadurch hatte
DELETE /api/telegram/webhook kein IsAdmin gesetzt → 403.

Fix: Nur POST auf diesen Pfad (= eingehender Telegram-Webhook)
wird von der Auth ausgenommen.
2026-03-03 09:12:13 +01:00
Meleki e5d76bb0a9 fix: credentials: include bei allen Telegram API-Requests 2026-03-03 09:09:15 +01:00
Meleki 4ac042e512 Telegram: Webhook-Verwaltung in Einstellungen-Seite
- Backend: DELETE /api/telegram/webhook Endpoint + TelegramService.DeleteWebhook()
- api.js: apiTelegramWebhookInfo(), apiTelegramRegisterWebhook(), apiTelegramDeleteWebhook()
- Settings-Page: Neue 'Telegram Bot' Section (nur für Admins, nur wenn konfiguriert)
  - Status abrufen: Webhook-URL, ausstehende Updates, letzter Fehler, Aktiv-Badge
  - Webhook registrieren: prompt() für Base-URL, POST an Telegram API
  - Webhook entfernen: Bestätigungsdialog + DELETE
- CSS: .telegram-status-box, .tg-status-row, .tg-label, .tg-value, .tg-badge
2026-03-03 09:06:22 +01:00
Meleki 7d237c866a Dashboard: Telegram-Verknüpfung Button + Modal
- Session-Card-Menü: 'Telegram verknüpfen' zwischen Chat öffnen und Bearbeiten
- Button nur sichtbar wenn Telegram Bot konfiguriert (GET /api/telegram/status)
- Klick generiert 6-stelligen Link-Code (POST /api/telegram/link)
- Modal zeigt '/link CODE' mit Copy-Button, 5 Min gültig
- Neuer Backend-Endpoint GET /api/telegram/status (IsConfigured)
- API-Funktionen: apiTelegramStatus(), apiTelegramLink()
- Modal-CSS nach bestehendem .fe-overlay Pattern
2026-03-03 07:40:17 +01:00
Meleki 24d818f5d2 docs: TODO Dashboard Menu-Dropdown Overflow-Bug notiert 2026-03-03 06:30:08 +01:00
Meleki 0dd7c38751 feat: Telegram Bot Integration
- TelegramService: Non-Streaming Claude Chat mit Tool-Loop,
  Commands (/start, /link, /session, /new, /clear, /status, /unlink),
  Nachrichten-Splitting bei >4096 Zeichen, Typing-Indicator,
  History-Aufbau aus DB, Token-Usage-Tracking
- TelegramEndpoint: Webhook (POST, no-auth), Link-Code-Generierung
  (POST, auth), Webhook-Registrierung + Info (Admin)
- DatabaseService: telegram_links Tabelle mit Link-Code-Flow
  (6-stelliger Code, 5 Min Ablauf), GetUserSessions
- AuthMiddleware: /api/telegram/webhook von Auth ausgenommen
- Session-Verknüpfung via Link-Code (Web-UI generiert Code,
  Telegram /link CODE löst ein)
- TelegramLinkRecord Model
2026-03-03 06:30:05 +01:00
Meleki 81714b1f4c Dashboard: Claude API Status-Bar
- Zeigt Anthropic API Status aus status.claude.com an
- Nur sichtbar bei aktiven Incidents (minor/major/critical)
- Farbcodierte Indikatoren (gelb=warning, rot=danger)
- Stille Fehlerbehandlung bei nicht erreichbarem Status-Endpoint
2026-03-03 05:53:39 +01:00
Meleki 5d132585d5 Fluent Emoji 3D: Unicode-Emojis durch Microsoft Fluent Emoji ersetzen
- emoji.js: Emoji-Replacement-Engine mit umfassendem Unicode 15.0 Regex
  - String-basiert (replaceEmojisWithFluent) in renderMarkdown()
  - DOM-basiert (parseFluentEmojis) als Post-Processing via TreeWalker
  - CDN: @lobehub/fluent-emoji-3d@1.1.0 via jsdelivr (WebP/3D)
  - Intelligenter Fallback: fe0f-Varianten, dann Original-Unicode
  - Fail-Cache verhindert wiederholte Requests für fehlende Emojis
- User-Nachrichten werden jetzt als Markdown gerendert (renderMarkdown)
  - [Datei: ...] Refs: Platzhalter-Mechanismus vor Markdown-Parsing
  - Reply-Quotes bleiben durch Wrapper-Div erhalten
- parseFluentEmojis an allen Render-Stellen integriert:
  addAssistantBubble, endStreamBubble, _renderUserTextContent,
  _renderSystemPromptBlocks, history._renderMessagesIntoFragment,
  history.loadLatestArchive
- CSS: .fluent-emoji Klasse (1.2em, inline, scale 1.25)
- CSS: white-space:pre-wrap nur noch für .msg:not(.markdown)
2026-03-03 05:53:31 +01:00
Meleki e2c887aee6 Update web search version title 2026-03-02 16:12:01 +01:00
Meleki c2ae2e0ab4 Update TODO.md, Tooltip aktualisiert 2026-03-02 16:07:55 +01:00
Meleki 1ce607ccdd fix: USER.md-Referenzen in UI durch Persona ersetzt 2026-03-02 15:06:54 +01:00
Meleki c128341f95 fix: Passwort-Änderung bei falschem Passwort gibt 403 statt 401 zurück
401 triggerte den globalen Auth-Handler und redirectete zum Login-Screen.
403 (Forbidden) ist semantisch korrekt und zeigt die Fehlermeldung inline an.
2026-03-02 15:04:16 +01:00
Meleki 7149904ae4 Profil-Seite: Anzeigename, Passwort ändern, Persona (ersetzt USER.md)
- Neuer Menüpunkt 'Mein Profil' statt 'Logout'
- Profil-Page: Anzeigename, Persona (Freitext), Passwort ändern, Logout
- ProfileEndpoint: GET/PUT /api/profile, PUT /api/profile/password
- User-Persona im System-Prompt statt USER.md (Fallback: Anzeigename/Username)
- SystemPromptBuilder: dataDir-Parameter entfernt, userPersona-Parameter hinzugefügt
- DB-Migration: persona-Spalte in users-Tabelle
2026-03-02 15:02:39 +01:00
Meleki f49c526384 Frontend: Aufeinanderfolgende Assistant-Text-Messages gleicher Iteration mergen
- Neue Hilfsfunktion _mergeConsecutiveAssistantTexts() in history.js
- Nahtloses Zusammenfügen (Whitespace-Trenner) bei gleicher Iteration
- Angewandt in renderMessages(), _renderMessagesIntoFragment() und loadLatestArchive()
- Behebt fragmentierte Darstellung bei Web-Search-Antworten
2026-03-02 14:29:24 +01:00
Meleki 8039b47dec Web-Suche (Agent-Toggle mit Versionswahl), Admin-only Backup, Haiku 4.5
- Agent: Web-Suche als Dropdown (Deaktiviert / 2025 / 2026) statt bool
- AnthropicService: web_search Tool dynamisch nach Version einfügen
- Stream: server_tool_use + web_search_tool_result Events verarbeiten
- Chat-Frontend: web_search_start/end Events mit Suchindikator
- Dashboard: Badge zeigt Web-Suche mit Jahresversion
- UserRecord: IsAdmin Feld, DB-Migration is_admin Spalte
- AuthMiddleware: IsAdmin aus DB laden und in Context setzen
- BackupEndpoint: Admin-Check (403 für Nicht-Admins)
- AuthEndpoint: isAdmin in Login/Me Response
- Frontend: Backup-Section nur für Admins sichtbar
- Haiku 4.5 als Model-Option (Agent-Dropdown + ChatEndpoint)
- TODO: Cronjobs, Haiku ergänzt
2026-03-02 14:05:59 +01:00
Meleki 485f47b29a Browser Zurück/Vor-Navigation: pushState statt replaceState, popstate-Event 2026-03-02 13:02:52 +01:00
Meleki 4e7058e481 Dashboard: Placeholder-Cards durch Header-Buttons ersetzen + UI-Feinschliff
- Placeholder-Cards (Neue Session/Neuer Agent) entfernt
- Stattdessen Buttons in den Section-Headern neben den Titeln
- Section-Header h2 Font-Size angepasst
- Agent-Formular: Ego- und Skills-Labels hinzugefügt, Text-Korrektur
- Form-CSS: Gap und Checkbox-Spacing verfeinert, Selektoren präzisiert
2026-03-02 12:59:32 +01:00
Meleki 90c24b0b1a Chat-Button im Dashboard deaktivieren wenn kein Agent zugewiesen 2026-03-02 12:33:23 +01:00
Meleki d05023b1da Fallback-Workspace /tmp wenn Skills aktiv aber kein Workspace gesetzt 2026-03-02 12:31:28 +01:00
Meleki 9af1465ee5 Hourglass-Icon Spin-Animation hinzugefügt 2026-03-02 11:46:58 +01:00
Meleki 7614141760 feat: User-Zuordnung für Sessions und Agents
- UserId-Feld zu SessionRecord und AgentRecord hinzugefügt
- DB-Migration: user_id Spalte + bestehende Daten dem Admin zuweisen
- Alle Endpoints filtern/prüfen nach UserId des eingeloggten Users
- HttpContextExtensions.GetUserId() Helper für konsistenten Zugriff
- Betrifft: Agent, Session, Chat, History, Workspace, Skill Endpoints
- Sessions/Agents anderer User sind nicht sichtbar/zugreifbar
2026-03-02 11:39:55 +01:00
Meleki 9a59ae686d feat: User-Management mit Token-basierter Authentifizierung
Backend:
- UserRecord Model + Users-Tabelle in DB
- AuthService: SHA256-Passwort-Hashing, Token-Verwaltung (ConcurrentDictionary)
- AuthMiddleware: Schützt alle /api/-Routes (außer /api/auth/login)
- AuthEndpoint: Login, Logout, Me
- Default-User admin/admin wird automatisch erstellt

Frontend:
- Login-Page mit Formular (Enter-Key-Support)
- Globaler Fetch-Interceptor: 401 → automatisch Login-Redirect
- Auth-Check beim App-Start und bei Hash-Änderungen
- Logout-Link im Dashboard-Header
- Login-CSS: Zentrierte Login-Box
2026-03-02 11:29:09 +01:00
Meleki a1c54bf376 feat: ToolChoice + ToolNames pro Chain in DB speichern
- ChainRecord: neue Felder ToolChoice (auto/any) und ToolNames (JSON-Array)
- DatabaseService: Migration tool_choice + tool_names Spalten, INSERT erweitert
- ChatEndpoint: berechnet Tools vor Chain-Erstellung, speichert Werte mit
- ToolService: execute-Timeout Beschreibung korrigiert (30s → 180s)
2026-03-02 10:42:54 +01:00
Meleki b24a000784 Zeilenreferenz-Hinweis im System-Prompt auch ohne ToolChoice:any
- toolAny+workspace: Kombinierter Erinnerungsblock (Tool-Pflicht + Zeilenreferenz)
- !toolAny+workspace: Eigener Erinnerungsblock nur mit Zeilenreferenz-Hinweis
- Kein doppelter ERINNERUNG-Header mehr
2026-03-02 10:30:22 +01:00
Meleki 41b0d6e350 TODO: CodeMirror horizontal scroll als erledigt markiert 2026-03-02 10:20:23 +01:00
Meleki ea0b95ef52 Agent-Dateien: Button aus Form entfernt, ins Card-Menu verschoben
- agentFilesSection aus index.html entfernt
- filesSection/filesBtn Referenzen aus agent-page.js entfernt
- Neuer Menüeintrag 'Dateien verwalten' im Agent-Card-Menu (dashboard.js)
- Icons für alle Card-Menu-Einträge (Session + Agent)
- card-menu-item: flex layout mit gap für Icon-Ausrichtung
2026-03-02 10:19:31 +01:00
Meleki 32cb98a8c7 Dashboard: Commit-Badge-Labels kürzen (Prefix 'Commit:' entfernt) 2026-03-02 09:44:40 +01:00
Meleki 40bab457d9 AutoCommit: Bool → Dropdown (mention/enforce/forbid), leerer System-Prompt fix 2026-03-02 09:41:26 +01:00
Meleki 7410a18755 Fix: CodeMirror horizontaler Scroll im File Explorer
- min-width: 0 auf allen Flex-Ebenen (.fe-main, .fe-cm-wrap, #feCmHost, .CodeMirror)
- overflow: auto Override entfernt, CodeMirror-Default (overflow: scroll) reicht
- Klassisches Flexbox min-width: auto Problem behoben
2026-03-02 08:55:33 +01:00
Meleki 56d4d1be0a Dashboard: Badges für Sessions (Kontext) und Agents (Features, Skills, Model-Name)
- prettyModelName() von chat.js nach ui.js als globale Funktion verschoben
- Session-Cards: Kontext-Badge mit Tooltip wenn context vorhanden
- Agent-Cards: Badges für ToolChoice:any, AutoCommit, Soul, Identity, UserInfo, Memory
- Agent-Cards: Skill-Badges pro aktiviertem Skill (parallel geladen)
- Agent-Cards: Model-Name via prettyModelName() statt roher Model-ID
- Neue CSS-Klassen: badge-feature, badge-forced-feature, badge-skill
- Theme: primary/dangerous Farben angepasst
- Chat: Input overflow hidden→auto
2026-03-02 08:22:18 +01:00
Meleki 754b2aa3e3 fix: Krea-Tags in Code-Blöcken nicht parsen, Git-Verhalten unabhängig von ToolChoice
- renderMarkdown: Code-Blöcke (<pre>, <code>) vor Krea-Regex schützen
  via Platzhalter-Swap, danach wiederherstellen
- SystemPromptBuilder: Git-Commit-Regeln nur an Workspace gebunden,
  nicht mehr an ToolChoice:any – eigener PromptBlock mit Label
- CSS: modal-width Variable, Krea-Modal width:max-content, minor tweaks
- TODO.md aktualisiert
2026-03-02 07:59:29 +01:00
Meleki 4bf500ad47 feat: Stream-Abbruch per Stop-Button
- Neuer Stop-Button (#stop) neben Send-Button, erscheint nur während Stream
- AbortController in chat.js: abort() schließt SSE-Verbindung → Backend CancellationToken triggered
- apiChat() akzeptiert optionales AbortSignal
- AbortError-Handling: zeigt 'Abgebrochen' statt Fehlermeldung
- Button-Toggle in sendMessage(), stopStreaming(), startStreamingPoll(), Page-Load-Recovery
- CSS: .stop-btn mit --dangerous Farbe
- Diverse kleine UI-Fixes (TODO.md, theme.css box-spacing, settings-section Layout)
2026-03-02 06:52:26 +01:00
Meleki 190a0d0a8b Backup: tar.gz ohne ./Root-Ordner – Einträge direkt auf oberster Ebene 2026-03-01 21:45:37 +01:00
Meleki 71bb97be13 Fix: Krea-Thumbnails mit fester Höhe statt scrollDown-Listener
- _scrollOnImages() komplett entfernt (verursachte ungewolltes Runterscrollen)
- .krea-ref: feste Höhe 240px + min-width 240px + Placeholder-Hintergrund
- .krea-thumb: width/height 100% mit object-fit contain
- Browser reserviert Platz vor dem Laden → kein Layout-Shift
2026-03-01 21:40:15 +01:00
Meleki d42e5077c4 System-Prompt-Modal: strukturierte Blöcke via API statt Frontend-Parsing
- SystemPromptBuilder.BuildBlocks() liefert List<PromptBlock> mit Icon/Label/Content
- Neuer Endpoint GET /api/sessions/{id}/system-prompt-blocks (JSON-Array)
- Labels beschreiben präzise die Herkunft jedes Blocks (Agent, Session, System, Skills)
- Verhalten + Erinnerung nur noch mit Workspace + ToolChoice:any (Bugfix)
- Frontend: simples Block-Rendering statt komplexer Heuristik-Logik
- SP-Block Styling mit Label-Header und Content-Box
2026-03-01 21:31:38 +01:00
Meleki 40e56acc30 PROMPT.md-based skill injection, scroll-on-image-load fix, skill availability UI
- SkillService: read PROMPT.md instead of SKILL.md for system prompt injection
- SkillInfo: add HasPromptMd field, skills without PROMPT.md are not injectable
- Agent form: disable checkbox + warning for skills missing PROMPT.md
- Thumbnail size: 320px (was 300px)
- Chat: _scrollOnImages() re-scrolls after lazy-loaded images finish loading
- CSS: skill-unavailable/warning styling, adjusted thumb dimensions
2026-03-01 20:38:18 +01:00
Meleki 8d86406037 Krea inline thumbnails with cached WebP generation and gallery layout
- Add /api/skills/{slug}/output/{filename}/thumb endpoint with ImageSharp
- Generate 300px WebP thumbnails, cached in data/cache/skills/{slug}/
- Replace text badge with inline thumbnail preview in chat
- Click opens full-size image modal with backdrop blur
- wrapKreaGalleries() groups consecutive krea-refs into flex container
- Thumbnails lazy-loaded, cache invalidated when original is newer
2026-03-01 20:12:14 +01:00
Meleki 9e4ed6dada Add image preview support: Krea-tag parsing with modal, file-explorer preview, skill output endpoint, increase execute timeout to 180s
- SkillEndpoint: GET /api/skills/{slug}/output/{filename} for skill output files
- WorkspaceEndpoint: GET /api/workspace/raw for raw file serving (images)
- File-Explorer: Image preview for png/jpg/gif/webp/svg/bmp/ico
- Chat UI: Parse [Krea: filename] tags into clickable chips with image modal
- ToolService: Increase execute timeout from 30s to 180s for long-running skills
2026-03-01 20:00:35 +01:00
Meleki cf6caea2dc Implement Skills feature: filesystem-based skills with agent assignment
- Add SkillService: scans data/skills/ directory, parses _meta.json and SKILL.md frontmatter
- Add SkillEndpoint: REST API for listing skills and managing agent-skill assignments
- Add agent_skills DB table for agent-to-skill mapping (only relation in DB, skills live on filesystem)
- Extend SystemPromptBuilder: inject assigned skills' SKILL.md content into system prompt
- Extend ChatEndpoint + SessionEndpoint: load agent skills and pass to prompt builder
- Frontend: skill checkboxes in agent form, API functions for skill management
- Add form.css styling for skill list items
2026-03-01 17:22:14 +01:00
Meleki b18dc78651 Add /Temp/ to .gitignore, mark session reference system-prompt feature as done 2026-03-01 16:43:01 +01:00
Meleki 575e5c1d44 feat: Ältere Nachrichten nachladen per Button (500er Batches)
- Backend: beforeId-Parameter + GetActiveMessagesBeforeId + GetActiveMessageCountBeforeId
- Frontend: Button 'X ältere Nachrichten laden' statt Info-Text
- Archiv-Button erscheint erst wenn alle älteren Nachrichten geladen
- Scroll-Position bleibt beim Nachladen erhalten
- Fix: wwwroot Quell-Dateien mit publish synchronisiert
2026-03-01 16:32:08 +01:00
Meleki 38bdb4408c feat: Chain-Meta Anzeige-Einstellung + Darstellung verbessern
- Settings: 'Chain-Info' Dropdown (Immer/Manchmal/Nie), Default 'Manchmal'
- Manchmal-Regeln: In+Out >= 10k Tokens, >= 25 Iterationen, >= 90s Dauer
- Model-Name: claude-opus-4-6 → Opus 4.6, Unbekanntes → 'Unbekannt'
- Tokens: In/Out zu einem Badge zusammengeführt
- Cache: Read/Write zu einem Badge zusammengeführt
- Iterations → Iterationen
2026-03-01 16:20:01 +01:00
Meleki 7490d483c2 feat: Tool-Call-Anzeige in Settings konfigurierbar (alle/modifikationen/verstecken)
- Neue Chat-Section in Settings mit Dropdown für Tool-Call-Sichtbarkeit
- Default: Nur Modifikationen (write_file, edit_file, delete_file, memory_write)
- isToolVisible() filtert beim Streaming, History und Archiv-Rendering
- Reset-Button setzt auch Tool-Call-Einstellung zurück
2026-03-01 16:04:00 +01:00
Meleki 0b842357a3 chore: File-Explorer Nachbesserungen (TODO abhaken, CSS/HTML Cleanup) 2026-03-01 15:57:14 +01:00
Meleki 137090435c fix: Chat-Nachrichten Reihenfolge korrigiert (doppeltes reverse entfernt) 2026-03-01 15:51:14 +01:00
Meleki e31daa2385 feat: Chat-History auf max. 500 Nachrichten limitieren 2026-03-01 15:48:19 +01:00
Meleki 58c5ccb79b feat: File-Explorer für Agent-Ordner im Agent-Formular 2026-03-01 15:48:13 +01:00
Meleki 8e585443e2 Backup: Data-Ordner statt nur DB sichern, von Chat in Einstellungen verschoben 2026-03-01 15:41:29 +01:00
Meleki 402fbc5a40 fix: mark-button direkt nach reply-button einfügen statt am Ende 2026-03-01 15:20:46 +01:00
Meleki 632424fb73 Memory-Tools unabhängig vom Workspace verfügbar machen
- Tools werden jetzt auch gesendet wenn kein Workspace aber useMemory=true
- GetToolDefinitions(includeFileTools, includeMemory) für granulare Steuerung
- File-Tools geben saubere Fehlermeldung wenn workspace null
2026-03-01 15:19:56 +01:00
Meleki 342284dd3e System-Prompt: Identity-Fallback nur bei UseIdentity, USER.md-Pfad anzeigen, Markdown h1/h2 Styling 2026-03-01 14:48:34 +01:00
Meleki 6df3591d8b Agent-Flags: useSoul, useIdentity, useUserInfo, useMemory
- 4 neue bool-Properties auf AgentRecord (Default: true)
- DB-Migration: use_soul, use_identity, use_user_info, use_memory
- SystemPromptBuilder: IDENTITY.md, SOUL.md, USER.md, Memory-Block bedingt
- AnthropicService: Memory-Tools nur wenn useMemory aktiv
- Agent-Formular: 4 Checkboxen (Seele, Identität, Gegenüber, Erinnerungen)
- API: Create + Update lesen/speichern die neuen Flags
2026-03-01 14:33:11 +01:00
Meleki da34739cba Edit SOUL.md Template 2026-03-01 14:25:43 +01:00
Meleki d067517252 Templates aus externen Dateien laden, globale USER.md generieren
- Templates/IDENTITY.md, SOUL.md, USER.md als externe Template-Dateien
- gott.csproj: Templates werden beim Publish mitkopiert
- MemoryService: ReadTemplate() liest aus Templates-Ordner
- InitializeAgentFiles: nutzt Templates statt Inline-Strings
- InitializeUserFile: erstellt globale USER.md in data/
- AgentEndpoint: HandleUpdate initialisiert fehlende Files beim Speichern
2026-03-01 14:24:23 +01:00
Meleki 96af4a3421 Agent-Files automatisch beim Erstellen anlegen (IDENTITY.md + SOUL.md), Migration-Vorlagen entfernt 2026-03-01 14:04:21 +01:00
Meleki 3fba628bd2 Agent-Persona auf File-Basis umgestellt (IDENTITY.md, SOUL.md, USER.md)
- Persona/Instructions DB-Felder aus AgentRecord, DB-Queries, API und Frontend entfernt
- SystemPromptBuilder liest jetzt IDENTITY.md + SOUL.md aus data/agents/{agentId}/
- Globale USER.md aus data/ wird in jeden System-Prompt injiziert
- MemoryService.DataDir als public Property exponiert
- Denker: IDENTITY.md + SOUL.md erstellt
- Meleki: Migrations-Vorlagen unter migration/meleki/ angelegt
- USER.md global unter publish/data/ erstellt
2026-03-01 13:53:49 +01:00
Meleki a73a67f810 Memory-Pfad im System-Prompt als absoluten Pfad angeben 2026-03-01 13:32:05 +01:00
Meleki d913557173 feat: Memory-System mit persistenten Markdown-Dateien pro Agent
- MemoryService: Verwaltet data/agents/{agentId}/ Verzeichnisse
  - MEMORY.md als Haupt-Memory-File
  - memory/ Unterordner für Tages-Logs und thematische Notizen
  - Sandbox-Prüfung verhindert Zugriff außerhalb des Agent-Dirs

- Memory-Tools für den Agent:
  - memory_read: Liest Memory-Dateien
  - memory_write: Schreibt/überschreibt oder hängt an (append)
  - memory_list: Listet alle Memory-Dateien auf

- SystemPromptBuilder: Memory-Abschnitt mit Regeln und aktuellem
  MEMORY.md-Inhalt wird in den System-Prompt injiziert

- ToolService/AnthropicService: Memory-Tools werden automatisch
  eingebunden wenn MemoryService und AgentId verfügbar sind

- TODO.md: Embedding-basierte Suche und Subagents als Features
2026-03-01 13:27:08 +01:00
Meleki 875229964c Dashboard-Header in <header>-Element umgebaut, Card-Grid und Mobile-Styles verfeinert 2026-03-01 12:23:02 +01:00