- Backend: Finales 100%-Progress-Event nach Download-Loop senden
- Frontend: Explizit auf 100% setzen + 600ms Pause vor Bestätigungsdialog
- Behebt visuellen Bug dass Balken bei ~97% stehen blieb
[appimage]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
OpenAI komplett entfernt. Voice läuft jetzt offline mit lokalen Binaries:
- whisper-cli (whisper-cpp 1.8.3) für Speech-to-Text
- piper-tts mit Thorsten-Stimme (Deutsch) für Text-to-Speech
- GStreamer + PipeWire in shell.nix für WebKitGTK Mikrofon-Zugriff
- VoicePanel: Echtgespräch mit VAD-Stille-Erkennung, Interrupt, Loop
- Models in .gitignore (~250MB)
[appimage]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
WebKitGTK verweigert standardmäßig alle Permission-Requests (Mikrofon, Kamera).
Jetzt wird in setup() ein permission-request Handler registriert der alles erlaubt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Long messages (>25 lines) auto-collapse with expand/collapse button
- Cost display uses German format: "16,23$" instead of "$16.230"
- Session stats (tokens, cost, count) persist to DB after each response
via new update_session_stats command — survives app restart
- Small costs shown as cents (e.g. "3,2¢")
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- KB-Cache im RAM: Suchergebnisse 60s gecacht, kein MySQL-Roundtrip pro Nachricht
- Bridge wird beim App-Start sofort gestartet (kein Cold-Start bei erster Nachricht)
- Bridge-Start-Wait von 500ms auf 200ms reduziert
- maxTurns von 25 auf 200 erhoeht (verhindert "maximum turns reached" bei komplexen Tasks)
- invalidate_kb_cache Command fuer manuelles Cache-Leeren
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wenn die in SQLite gespeicherte claude_session_id keine passende
Konversation mehr hat (neue Maschine, Cache geleert, frische Installation),
warf das SDK "No conversation found with session ID: <uuid>" und der
Chat blieb kaputt — der Retry in claude-bridge.js hat NIE gegriffen, weil
er auf queryOptions.sessionId geprueft hat waehrend wir queryOptions.resume
setzen.
Fix:
- claude-bridge.js: Retry-Guard auf queryOptions.resume umgezogen + Match
auf die konkrete Fehlermeldung ("No conversation found with session ID").
Bei stale ID: session-reset-Event an Rust senden, dann retry ohne resume.
- claude.rs: Neuer Handler fuer session-reset — loescht die stale
claude_session_id aus der aktiven Session in der DB, damit die App beim
naechsten Start nicht wieder in denselben Fehler laeuft.
Reproduziert auf VM + NixOS-Desktop nach frischer Installation.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- MySQL Pool als Managed State (MysqlPoolState in lib.rs)
- Keyword-Extraktion aus User-Nachrichten (Stoppwort-Filter DE/EN)
- Proaktive KB-Abfrage bei SessionStart (proactive_session_hints)
- Auto-Fehler-Pattern: error_tracker Tabelle, bei 3+ Occurrences
automatisch KB-Eintrag in Kategorie 'fehler' erstellen
- 6 neue Tauri-Commands für KB-Hints und Error-Tracking
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Problem: Beim Nix-Wrapper lag nur das Binary unter ~/.local/share/claude-desktop/bin,
aber claude-bridge.js + node_modules waren nirgends deployt → "Bridge nicht gefunden"
beim ersten Chat-Versuch.
Loesung:
- claude.rs: Bridge-Such-Pfad um bin/../scripts erweitert (exe_dir.parent / scripts).
- update.rs: UpdateManifest + UpdateStatus um bundle_filename/bundle_sha256 erweitert.
Neues Tauri-Command apply_bundle_update: laedt tar.gz, pruefte SHA256, entpackt
nach ~/.local/share/claude-desktop, ruft npm ci --omit=dev auf. Im AppImage-Modus
no-op (Bundle ist im AppImage enthalten).
- lib.rs: apply_bundle_update registriert.
- CI: packt scripts/claude-bridge.js + package.json + package-lock.json als
claude-desktop-bundle_VERSION.tar.gz und laedt neben Binary in die Package Registry.
update.json v3 enthaelt bundle_filename + bundle_sha256.
- install.sh: Erst-Installer laedt das Bundle, verifiziert SHA, entpackt, fuehrt
npm ci --omit=dev aus. Holt nodejs bei Bedarf ueber nix-build (analog zu jq).
- UpdateDialog.svelte: ruft im Nix-Modus apply_bundle_update vor apply_update auf,
damit nach dem Neustart Scripts + node_modules aktuell sind.
- nix/default.nix: nodejs_22 + tar + gzip im Wrapper-PATH, damit die App aus dem
Binary heraus npm ci aufrufen kann.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Dev-Check entfernt der Updates bei lokalen Builds blockiert hat.
Jede gültige Remote-Version wird bei dev/dev-local als neuer erkannt.
HTTP/Netzwerk-Fehler werden graceful behandelt statt zu crashen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Neues Icon-Set (SVG-Quelle + gen-icon.sh): 32/64/128/256/512+@2x in depth=8
(Tauri-Tray erwartet 8-bit-RGBA, depth=16 crashte den Tray-Setup)
- StopButton: Icon-only (⏹), Position Titlebar rechts, nur sichtbar wenn
isProcessing aktiv. Kein full-width roter Balken im Footer mehr.
- .footer.active-Farbwechsel entfernt — Footer bleibt neutral
- Version-Badge in der Titlebar (v<APP_VERSION>)
- Chat-Input-Queue: Single-Slot-Puffer. Beim Senden waehrend Processing wird
die Nachricht gepuffert, Pill "Nachricht wartet..." erscheint, nach Ende
der aktuellen Antwort wird automatisch abgeschickt.
- Stop verwirft den gepufferten Slot (bewusster Abbruch).
- apply_update: ELF-Header-Smoke-Test vor Rename. Kaputter Download oder
falsche Architektur liefert Fehlerdialog statt zerschossene Installation.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Backend:
- Credentials aus Code entfernt → ENV-Variablen mit Fallback
- File-Traversal in Update-Download verhindert (Path-Sanitization)
- CLI-Injection bei D-Bus mit Whitelist-Validierung abgesichert
Frontend:
- Stop-Button dezenter (kleinere Schrift, gedämpftes Rot, kein Pulsieren)
- Stop löscht keine Session/Messages mehr — nur Agents stoppen
- Textfeld nicht mehr blockiert während Claude arbeitet (Einwände möglich)
- Agent-Filter "Nur aktive" wird in localStorage persistent gespeichert
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Zwei kombinierte Patches:
1. main.rs: WEBKIT_DISABLE_DMABUF_RENDERER + WEBKIT_DISABLE_COMPOSITING_MODE
als defensive Defaults wenn nicht vom User gesetzt. Behebt typische
WebKit2GTK-Renderer-Crashes auf modernen Wayland-Setups.
2. Workflow: nach 'tauri build' wird der AppRun gepatched.
- Detect NixOS via /run/opengl-driver/lib -> Host-Mesa via LD_LIBRARY_PATH
- WebKit-Workarounds als ENV-Defaults (override moeglich)
- Standard linuxdeploy-Pfade (PATH, XDG_DATA_DIRS etc.)
- Re-bundle mit appimagetool
Resultat: AppImage laeuft out-of-the-box auf Debian/Ubuntu/Fedora/NixOS,
ohne dass der User ENV-Vars setzen muss.
- mysql_async mit chrono-Feature für NaiveDateTime-Support
- 7 SELECTs in knowledge.rs von String auf NaiveDateTime umgestellt
- Timestamps werden jetzt korrekt formatiert statt Panic
Getestet:
- Wissens-Suche funktioniert ohne Crash
- Handlanger-Modus Chat-Antwort erscheint
- VSCodium-Extension Verbindung OK
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- init_sticky_context Tauri Command: Lädt Context aus DB, sendet an Bridge
- Frontend ruft Command beim Start auf (+layout.svelte)
- StickyContextInfo Store für Status-Tracking
- Context-Badge im Footer (📌 +XXctx Token)
- Zeigt Anzahl Einträge und Token-Schätzung
Bugfixes:
- context.rs: Typ-Annotationen in Closures (String statt str)
- db.rs: conn als pub(crate) für Module-Zugriff
- memory.rs: get_sticky_context → get_sticky_memory_entries (Namenskonflikt)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- events.ts: Session-ID aus claude-result speichern via set_claude_session_id
- claude.rs: load_claude_session_id() lädt ID der aktiven Session
- claude.rs: send_to_bridge_full() mit resumeSessionId Parameter
- claude-bridge.js: sendMessage() akzeptiert resumeSessionId
- Bridge nutzt sessionId in query() Optionen für SDK-Fortsetzung
Ermöglicht nahtlose Konversations-Fortsetzung auf SDK-Ebene.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- claude-bridge.js: Sticky Context bei API-Calls injizieren
- claude.rs: Context automatisch aus DB laden und mitsenden
- DiffView.svelte: Komponente für Edit-Tool Ergebnisse (Diff-Ansicht)
- FilePreview.svelte: Komponente für Read-Tool Ergebnisse
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- context.rs: Drei-Schichten-Gedächtnis (Sticky, Projekt, Wissens-Hints)
- StickyContext für kritische Infos (User, Credentials, Regeln)
- ProjectContext für Entscheidungen und TODOs nach Compacting
- DB-Schema: sticky_context, compacting_archive, context_failures
- ContextPanel.svelte: UI zur Verwaltung des Sticky Context
- Neuer Tab "Context" im rechten Panel
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- knowledge.rs: MySQL-Verbindung zu claude-db (192.168.155.1)
- Volltextsuche mit MATCH AGAINST
- "Das merken" Feature zum Speichern
- KnowledgePanel.svelte: Suche, Filter, Detail-View
- Neuer Tab "Wissen" im mittleren Panel
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Session Auto-Load bei App-Start (aktive Session + Nachrichten)
- agent_id Spalte in messages-Tabelle für Agent-Zuordnung
- DbMessage Interface erweitert (agent_id)
- Session-Compacting: compact_session() fasst alte Nachrichten zusammen
- Standard: 30 letzte Nachrichten behalten, Rest als Summary
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Tray-Icon zeigt App im System-Tray
- Kontextmenü: Fenster zeigen, Minimieren, Beenden
- Klick auf Tray-Icon zeigt Fenster
- Capabilities für Window-Operationen ergänzt
- Icon-Konfiguration in tauri.conf.json
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Neue messages-Tabelle in SQLite für Chat-Nachrichten
- save_message, load_messages, clear_messages Tauri-Commands
- User-Nachrichten werden beim Senden sofort gespeichert
- Assistant-Nachrichten werden nach Abschluss gespeichert
- Beim Session-Wechsel werden Nachrichten aus DB geladen
- currentSessionId Store für Session-Tracking
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Neues SettingsPanel mit Modell-Auswahl (Haiku/Sonnet/Opus)
- Modell wird in SQLite persistiert (claude_model Setting)
- Bridge unterstützt set-model und get-models Commands
- Modell kann zur Laufzeit gewechselt werden
- Preisanzeige pro Modell im Settings-Panel
- Aktuelles Modell wird beim App-Start geladen
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Child-Objekt wurde am Ende von start_bridge() gedroppt — das schloss
die Pipes und beendete den Node-Prozess. Jetzt wird child im
ClaudeState gespeichert und lebt solange die App läuft.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
current_dir() auf Projektroot setzen damit Node.js die
node_modules/@anthropic-ai/sdk findet.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>