Commit Graph
98 Commits
Author SHA1 Message Date
Meleki 4f027360fd feat: Anweisungen-Feld für Agents mit EasyMDE-Editor
- AgentRecord: TaskInstruction (string, nullable)
- DB-Migration: task_instruction TEXT Spalte
- AgentEndpoint: Create/Update lesen taskInstruction
- SystemPromptBuilder: '## Anweisungen' Block nach Soul, nur wenn nicht leer
- HTML: Textarea #agentTaskInstruction nach Rückfragen-Checkbox
- agent-page.js: EasyMDE-Editor mit Init, Laden, Speichern, Destroy
2026-03-07 17:20:38 +01:00
Meleki 494f431963 feat: Vorbereiter-Agent (Preparer) für Sessions
- Neues optionales Session-Feld 'preparerAgentId' (DB + Model + API)
- PreparerContext im ChatContext für Agent-Konfiguration
- RunPreparer() in AnthropicService: führt Preparer vor dem Worker aus
  - [FORWARD] → aufbereiteter Prompt wird an Session-Agent weitergegeben
  - Ohne [FORWARD] → Rückfrage an User, Flow stoppt (preparer_query)
- Preparer-System-Prompt: erklärt Rolle, [FORWARD]-Mechanismus, Vorarbeit
- Preparer kann eigene Tools + Fähigkeiten aktiv nutzen
- ChatEndpoint: Preparer-Phase vor StreamChat integriert
- Frontend: SSE-Events (preparer_start/text/tool_use/done)
- Preparer-Bubble (Info-Farbe) mit Status Weitergeleitet/Rückfrage
- [Preparer: Name] → hübscher Header, [FORWARD] ausgeblendet
- [Vorbereitet von Name] → dezenter Header in User-Bubble
- Agent-Picker im Session-Form (vor Review-Agent)
2026-03-07 15:23:22 +01:00
Meleki 6d95f9aec2 feat: Plan-Modus – Toggle im Chat zum Umschalten zwischen Plan/Ausführung
- Toggle-Button (🗺️) im Chat-Input-Bereich neben Explorer
- Plan-Modus wird per ChatRequest.planMode an Backend gesendet
- Backend: Write-Tools gefiltert (nur read_file, list_files, glob, grep,
  todo_write, memory_*, ask_user_choice bleiben), System-Prompt-Block
  ergänzt der Änderungen verbietet, tool_choice nie 'any' erzwungen
- ChainRecord.PlanMode: pro Chain gespeichert (informativ für History)
- Chain-Meta-Badge '📋 Plan-Modus' bei Plan-Chains
- Choice-Response erbt planMode vom vorherigen Chain
- CSS: .plan-mode-active Styling (Primary-Color Highlight)
- Placeholder wechselt zu 'Plannen...' wenn aktiv
- Plan-Modus wird bei Session-Wechsel zurückgesetzt
2026-03-07 12:07:39 +01:00
Meleki 89ceb61948 feat: Agent-Einstellung 'Rückfragen erlauben' (allowUserChoice)
- Neues Feld AllowUserChoice (bool, default true) im AgentRecord
- DB-Migration: allow_user_choice Spalte mit DEFAULT 1
- Agent-Form: Checkbox 'Rückfragen erlauben' nach 'Tool-Nutzung erzwingen'
- ToolService.GetToolDefinitions: neuer Parameter includeUserChoice
- ask_user_choice Tool wird nur eingebunden wenn Agent es erlaubt
- Review-Agents und Non-Streaming (Cronjobs) erhalten nie ask_user_choice
- ChatEndpoint reicht Agent.AllowUserChoice an StreamChat durch
2026-03-07 11:36:02 +01:00
Meleki 4bec740765 feat: Finalizer-Agent – dritter Agent der nach Worker + Review einschreitet
Backend:
- SessionRecord + DB-Migration: finalizer_agent_id auf sessions
- ChatContext.FinalizerContext (Model, SystemPrompt, Tools, Workspace)
- ChatService: FinalizerContext aufbauen (analog zu ReviewContext)
- AnthropicService: RunFinalizer() nach Review-Phase (oder direkt nach Worker)
- RunReviewAgentChat() refactored zu generischem RunAgentChat()
  mit agentType-Parameter ('review' | 'finalizer') für SSE-Events und DB-Tags
- SSE-Events: finalizer_start, finalizer_text, finalizer_tool_use, finalizer_done

Frontend:
- Session-Page: Finalizer-Agent-Picker (im 'Weitere Einstellungen' Bereich)
- Chat: SSE-Events für Finalizer-Phase verarbeiten
- UI: addReviewBubble/finalizeReviewBubble unterstützen agentType 'finalizer'
  mit eigener Farbe (success-green) und Flag-Checkered-Icon
- renderMarkdown: [Finalizer: AgentName] Tags parsen
- History: Finalizer-Messages als .finalizer-bubble rendern
- Shared-Page: Finalizer-Messages korrekt erkennen und stylen
- Dashboard: Finalizer-Badge (flag-checkered) auf Session-Cards
2026-03-06 23:35:30 +01:00
Meleki bfd78278ab feat: Servereinstellungen-Seite für Admins
- Neuer Endpoint GET/PUT /api/admin/server-settings
  - Liest appsettings.Production.json (Fallback: appsettings.json → Standardwert)
  - Schreibt immer in appsettings.Production.json
  - Definierte Settings: AnthropicToken, MaxIterations, PayloadLogging, PayloadLoggingGzip, KreaToken, KreaApiKey
- Neue Frontend-Seite 'server-settings' (Admin-only)
  - Dynamisches Formular basierend auf Setting-Definitionen vom Backend
  - Password-Felder mit Eye-Toggle, Checkboxen für Booleans, Number-Inputs
  - Hinweis dass Neustart erforderlich ist
- Dashboard: Neuer Link 'Servereinstellungen' für Admins
- appsettings.Production.json vom Publish ausgeschlossen (CopyToPublishDirectory=Never)
2026-03-06 22:32:33 +01:00
Meleki af2f821c72 Session-Form: Review-Agent in erweiterte Einstellungen verschoben 2026-03-06 21:22:21 +01:00
Meleki 5fe3f8ac87 feat: Review-Agent (Multi-Agent-Kommunikation)
- Session hat optionalen ReviewAgentId + MaxReviewIterations
- Nach end_turn des Worker-Agents wird der Review-Agent aufgerufen
- Review-Agent bekommt Worker-Konversation als Kontext + kann Tools nutzen
- [APPROVED] in Review-Antwort → fertig, sonst Feedback an Worker
- Worker korrigiert und wird erneut reviewed (max N Runden)
- SSE-Events: review_start, review_text, review_tool_use, review_feedback, review_approved
- Chat-UI: Review-Phase als eigene Bubble mit Header, Text, Status
- Session-Page: Review-Agent-Picker (gleicher Agent-Card-Helper)
- Dashboard: Review-Agent-Badge auf Session-Cards
- DB-Migration: review_agent_id, max_review_iterations auf sessions
2026-03-06 16:04:00 +01:00
Meleki e45498ac50 Session-Cards: buildSessionCard() Helper + Picker-Modal für Cronjob-Formular
- buildSessionCard(session, agent) Helper in ui.js (analog zu buildAgentCard)
  Erzeugt .card mit Avatar, Name, Badges (Agent, Kontext, Telegram) und Meta (Nachrichten, Archiv, Workspace)
- Dashboard refactored: Session-Cards nutzen buildSessionCard() statt inline HTML
- Cronjob-Formular: <select> für Session und Benachrichtigungs-Session durch
  klickbare Session-Cards + Picker-Modal ersetzt
- openSessionPickerModal() mit filterWithAgent-Option (Session-Dropdown nur
  Sessions mit Agent, Notify-Dropdown alle Sessions)
- CSS: .session-select-card und .session-select-change Klassen analog zu agent-*
2026-03-06 14:05:32 +01:00
Meleki 92c20402eb refactor: Agent-Auswahl in Session-Form als Card + Picker-Modal
- buildAgentCard() Helper in ui.js erstellt (wiederverwendbar für Dashboard + Picker)
- Session-Form: select-Dropdown durch klickbare Agent-Card ersetzt
- Agent-Picker-Modal zeigt alle Agents mit identischen Cards wie am Dashboard
- Dashboard refactored: nutzt buildAgentCard() statt dupliziertem Inline-HTML
- Kein duplizierter Code mehr für Agent-Card-Rendering (Badges, Skills, Avatar)
2026-03-06 14:01:27 +01:00
Meleki 011b26c37f feat(telegram): Zugriffskontrolle mit Chat-ID-Whitelist
- TelegramService: IsChatIdAllowed() prüft Owner + Whitelist
- /start von unbekannter ChatId: Zugriff verweigert + ChatId angezeigt
- Owner wird bei Zugriffsanfrage benachrichtigt (Username + ChatId)
- Alle Commands/Messages prüfen Whitelist vor Verarbeitung
- Neues Feld telegram_allowed_chat_ids in sessions-Tabelle
- Frontend: Input für erlaubte Chat-IDs in Session-Telegram-Settings
- API: allowedChatIds in Save/Get durchgereicht
2026-03-06 13:04:02 +01:00
Meleki 34cecd03a1 refactor: Avatar-Editor als wiederverwendbares Modal-Modul
- Neues avatar-editor.js: Upload, Paste, AI-Generate, Scale, Clear in einem Modal
- Session + Agent Pages: ~280 Zeilen doppelter Avatar-Code → je 5 Zeilen AvatarEditor.init/destroy
- Avatar-Preview klickbar → öffnet Modal mit allen Einstellungen
- chat.css: Shared-Content Message-Styling (max-width, border)
2026-03-06 11:55:00 +01:00
Meleki 057d37d76f feat: Avatar Scale (0.5×–3×) + Krea AI Bildgenerierung für Avatare
Backend:
- SessionRecord + AgentRecord: neues Feld AvatarScale (double, Default 1.0)
- DatabaseService: avatar_scale Migration, in Create/Update/GetWithStats
- SessionEndpoint + AgentEndpoint: avatarScale in Create/Update
- api.js: apiKreaStatus(), apiKreaGenerate()

Frontend:
- Session + Agent Templates: Range-Slider (0.5×–3×) in Avatar-Section
- Krea AI Generate: Prompt-Input + Magic-Button (nur wenn KreaToken konfiguriert)
- Live-Preview: transform: scale() auf Avatar-Vorschau
- Dashboard: scale() auf Session- und Agent-Card-Images
- form.css: avatar-scale-row + avatar-ai-section Styling
2026-03-06 10:59:09 +01:00
Meleki 4ebbeaa818 feat: shared-page message merging + UI reorganization
Shared Page:
- Merge consecutive assistant text messages (same iteration)
- Add iteration field to thread API response
- Unified rendering for single/thread messages

UI Reorganization (manual changes):
- Session + Agent forms: collapsible 'Weitere Einstellungen' section
- Agent defaults: tool_choice unchecked, web_search 2025, model opus-4-6
- Profile: default-path field hidden, divider removed
- Form spacing adjustments, .more toggle style
2026-03-06 08:52:27 +01:00
Meleki 4e1ed81f37 feat: DefaultPath als Base-Path für User-Workspaces
- WorkspaceHelper.cs: Zentrale Workspace-Auflösung (relativ → absolut)
- Session-Workspace wird relativ zum User-DefaultPath gespeichert
- System-Prompt bekommt aufgelösten absoluten Pfad
- Path-Traversal-Schutz: '..' in Workspace-Pfaden blockiert
- Browse-API gibt '..' nicht mehr als Eintrag zurück
- Folder-Browser: basePath-Limit, Back-Button navigiert zum Parent
- DefaultPath nur durch Admin bearbeitbar (Profil: readonly)
- Legacy: Absolute Pfade in session.Workspace weiterhin kompatibel
2026-03-05 22:49:09 +01:00
Meleki d1355dcb0d feat: Login-as-User (Impersonate) + Default-Path pro User
Admin:
- POST /api/admin/users/{userId}/impersonate – erstellt Token für Zieluser
- Login-as-Button (fa-sign-in) in User-Liste (nicht für sich selbst)
- confirm-Dialog, danach location.reload() mit neuem User-Kontext
- Default-Path Feld + Browse-Button im Admin-Formular

Default-Path:
- Neues Feld default_path in users-Tabelle (TryAddColumn Migration)
- UserRecord.DefaultPath Property
- In allen Endpoints: Admin CRUD, Auth /me, Profile Get/Update
- Profil-Seite: Default-Path Feld + Browse-Button
- Session-Seite: Workspace-Browse nutzt defaultPath als Fallback
2026-03-05 20:42:21 +01:00
Meleki 9140c4fcc7 feat(dashboard): klickbare Session-Cards + UI-Verbesserungen
- Session-Cards mit Agent sind klickbar (navigiert zum Chat)
- Card-Menü bleibt nutzbar via pointer-events Logik
- Menü-Reihenfolge: Bearbeiten vor Chat öffnen
- Session-Beschreibung: textarea → input (einzeilig)
- Globale Link-Styles (a { color: var(--primary) })
2026-03-05 19:50:43 +01:00
Meleki 3ef78b5eb1 feat: Admin-Benutzerverwaltung + Dashboard-Layout-Fixes
Backend:
- AdminEndpoint.cs: 5 Endpunkte (List, Create, Update, Reset PW, Delete) - Admin-only
- DatabaseService: CreateUser(), UpdateUserAdmin(), DeleteUser() (kaskadiert Tokens + Shares)
- Route in Program.cs registriert

Frontend:
- admin-page.js: User-Liste mit Edit/Delete, Inline-Formular Create/Edit
- api.js: 5 Admin-API-Funktionen
- index.html: Template tpl-admin, Script-Tag, Dashboard-Link 'Benutzerverwaltung'
- dashboard.js: Admin-Link nur für Admins sichtbar
- form.css: Styles für admin-user-list, admin-user-row, admin-checkbox-row
- dashboard.css: Header-Overflow-Fix, Agents vor Cronjobs
- index.html: Template-Reihenfolge Agents vor Cronjobs

TODO: User-Management als erledigt markiert
2026-03-05 19:19:16 +01:00
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 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 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 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 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 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 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 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 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 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 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 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 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 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 40bab457d9 AutoCommit: Bool → Dropdown (mention/enforce/forbid), leerer System-Prompt fix 2026-03-02 09:41:26 +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 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 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 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 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