Crash-Fix:
- src/db.rs:801 panickte mit "byte index 240 is not a char boundary"
mitten in einem ✅-Emoji → SIGABRT. Neues strutil-Modul mit
safe_truncate()/safe_truncate_ellipsis() (5 Tests grün), an allen
&s[..N]-Stellen in db/claude/knowledge/session/memory.rs eingebaut.
- update.rs: Stale Lock-Files vom letzten Crash werden jetzt
protokolliert ("🧹 Stale Lock-Datei aus vorherigem Crash gefunden").
Chat-Polish:
- Input-Textfeld wird nach Senden zuverlässig geleert (Store-Reset +
DOM-Reset + tick — Svelte 5 bind:value mit Auto-Subscription
aktualisiert sonst nicht synchron).
- ApprovalBar.svelte (NEU): Sticky-Bar überm Input mit klar
beschrifteten Buttons "Übernehmen"/"Verwerfen" statt mehrdeutigem
"Behalten/Zurueck". Bleibt sichtbar wenn der Chat scrollt. Klick
auf Datei-Name scrollt zur Inline-Karte und blinkt sie. Shortcuts
Ctrl+Enter/Ctrl+Backspace.
- MessageList: Auto-Scroll trackt jetzt auch toolCalls.length und
Status-Änderungen, plus ResizeObserver am Container. Smooth bei
kleinen Distanzen, instant bei großen.
- Streaming-Caret: pulsierender Block-Cursor mit Glow-Shadow.
- Tool-Cards: Slide-In-Transition + Shimmer-Animation auf running.
- WorkingIndicator: Verb passt sich an processingPhase an.
Der uncaughtException-Handler aus f69f566 las err.stack dreimal und
serialisierte ihn zweimal per JSON.stringify. err.stack ist ein lazy
Getter der bei jedem Zugriff neu formatiert wird — bei V8-nahe-OOM
hat genau das den Abort ausgelöst (Crash-Dump Frames 20-24:
ErrorStackGetter → FormatStackTrace → FatalProcessOutOfMemory).
- Handler: err.stack einmal lesen, auf 2000 Zeichen kürzen, try/catch
drumrum. Handler darf nicht selbst crashen.
- Bridge-Start: --max-old-space-size=4096 (Node-Default ~2GB reicht
bei langen Sessions mit großen Thinking-Blocks + Agent-SDK-History
nicht). Betrifft Daemon- UND stdio-Modus.
Lokales Haiku-Equivalent: Bridge erkennt Ollama automatisch beim Start,
local-query Command für einfache Tasks (Commit-Messages, Übersetzungen).
Konfigurierbar über set-ollama-config.
Offline-Queue: Nachrichten werden bei fehlender Verbindung in SQLite
gequeuet und bei Reconnect automatisch gesendet. Commands:
queue_message, list_queued_messages, flush_offline_queue, clear_offline_queue.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
MCP-Server-Configs werden beim Bridge-Start aus ~/.claude.json geladen
und per set-mcp-servers Command an die Bridge injiziert. Neue Tauri-Commands:
list_mcp_servers, add_mcp_server, remove_mcp_server für Runtime-Verwaltung.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bridge überlebt jetzt App-Neustarts als eigenständiger Daemon-Prozess.
Kommunikation über Unix Domain Socket statt stdio — async, Auto-Reconnect,
PID-Tracking. Fallback auf stdio-Modus wenn UDS nicht verfügbar.
Neue Commands: get_bridge_status, stop_bridge_daemon.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Projekt-Wechsel UI in SessionList: Dropdown, Hinzufügen/Entfernen, auto Sticky-Context
- File-Drop auf Chat: Text als Code-Block, Bilder als Base64, 500KB Limit
- Persistent Memory: auto_load Einträge in Claude-Context injiziert (Cross-Session)
- Memory CRUD Tauri-Commands: save/delete/list/autoload
- Svelte 5 Syntax-Fix: on:click → onclick in SessionList.svelte
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>
- 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>
- 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>