Session-Nachrichten im Briefing werden jetzt von HTML-Tags gestrippt
(Thinking-Blocks, div, span). Mehrfache Leerzeichen/Umbrueche werden
zusammengefasst. Ergebnis ist sauberer Plaintext.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Im acceptEdits/bypassPermissions-Modus werden file-change Events
jetzt sofort via accept_change akzeptiert statt in pendingChanges
zu landen. Keine ApprovalBar mehr wenn Yolo aktiv.
Fallback auf manuelles Pending wenn auto-accept fehlschlägt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- EXCLUDED_CATEGORIES reduziert: nur noch access + claude-md
(setup/skill/hook enthalten nuetzliche technische Infos)
- Relevanz-Schwelle von 1.5 auf 0.5 gesenkt
(1.5 filterte zu viele Einzelwort-Matches raus)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
MutexGuard in eigenem Block isolieren damit er garantiert vor dem
async .await gedroppt ist. Tauri-Commands muessen Send sein.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Die deutschen Guillemets „" (U+201E/U+201C) in einem format!()-Macro
brachten den Rust-Parser durcheinander und verursachten 33 Compile-Fehler.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Die Bridge hat bisher set-permission-mode komplett ignoriert.
Jetzt wird --permission-mode als CLI-Flag an claude übergeben.
Auch context und resumeSessionId werden jetzt korrekt durchgereicht
(--append-system-prompt und --resume).
Behebt: Yolo-Modus hatte keinen Effekt, Claude fragte trotzdem nach.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Neuer 📋-Button in der Chat-Toolbar. Sammelt automatisch:
- Sticky Context (User, Projekt, Zugänge)
- Archivierter Projekt-Kontext (Entscheidungen, TODOs)
- Letzte 20 Session-Nachrichten als Zusammenfassung
- Git-Log (letzte 10 Commits)
- CLAUDE.md des Projekts
- KB-Treffer zum Projekt
Wird als Kontext-Nachricht an Claude gesendet.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Kategorien wie setup, access, claude-md, skill, slash-command, hook
werden aus Hints ausgeschlossen. Bei erkanntem Projekt werden Einträge
mit passendem Tag bevorzugt (Fallback auf alle wenn Projekt-Filter leer).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ToolDrawer ist jetzt 3. Spalte im Flex-Layout (Sidebar | Chat | Panel).
Kein position:fixed, kein Backdrop, kein Overlay. Panel bleibt fest offen
bis X-Button, Esc oder erneuter Sidebar-Klick. Chat wird schmaler.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- KB-Hints: Keywords werden über die Session akkumuliert mit Häufigkeitszähler.
Top-8 gewichtete Keywords für die Suche — je mehr man zum Thema schreibt,
desto präziser werden die Hints. Generische Einmal-Keywords fallen weg.
- Mic-Button: micPressed-Guard verhindert dass pointerleave ohne vorherigen
pointerdown die Aufnahme startet (Hover-Aktivierung Bug).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Role-Change-Effect scrollt jetzt bei jedem Rollenwechsel (nicht nur user),
Content-Tracker trackt auch parts-Array fuer Tool-Calls und Streaming.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Konzept-Map: ~60 deutsche Phrasen → technische Suchbegriffe
("Nachrichten falsch rum" → "message sort chronological")
- Bigram-Extraktion: benachbarte Content-Woerter als Phrase
- Chat-Kontext: letzte 3 User-Nachrichten fliessen in die Suche ein
- Erweiterte Tech-Terms (~40) und Stoppwort-Liste
- Keywords max 12 statt 8, Konzepte haben Vorrang
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Messages werden nach Timestamp sortiert + Race-Condition-sicherer Merge beim DB-Load
- ChatPanel.scrollToBottom() auf falschem Container entfernt, Scroll nur noch in MessageList
- userScrolledUp wird bei Session-Wechsel resettet (blockierte Auto-Scroll)
- Instant-Scroll Guard schneller freigegeben (1 statt 2 rAFs bei Streaming)
- KB-Hints: Session-Reset bei Chat-Wechsel, Relevance statt Priority im Ranking
- KB-Keywords nicht mehr akkumuliert (verhindert generische Dauertreffer)
- Cache-TTL 60s→15s, Hints alle 2 statt 3 Nachrichten
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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.
Voice-Stop:
- TTS-Audio jetzt vollstaendig zerstoert (pause + src='' + load) statt nur pause
- Wartende speakAndWait()-Promise wird beim Stop aufgeloest (vorher Hang)
- isActive()-Check direkt nach text_to_speech Result, kein Audio-Start mehr nach Stop
Schriftgroesse:
- .content hatte feste 13.5px → ueberschrieb --chat-font-size
- Headings (h1-h3) hatten feste px-Werte → jetzt em (relativ zu User-Schrift)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Ursache: Bridge schrieb bei EPIPE-Fehler (Tauri-Pipe geschlossen) einen
monitor_event, der selbst wieder EPIPE warf -> uncaughtException-Loop.
Ergebnis: 1.082.260 identische Fehler-Eintraege, DB auf 293 MB angewachsen,
App hing beim Start am Index-Scan dieser Tabelle.
Bridge (scripts/claude-bridge.js):
- crashHandlerActive-Flag verhindert Re-Eintreten der Handler
- isPipeError() erkennt EPIPE/ERR_STREAM_DESTROYED/ERR_STREAM_WRITE_AFTER_END
- Bei Pipe-Fehler: process.exit(0) statt Schreibversuch
- stdout/stderr error-Listener als Erstausloeser-Sperre
- Alle sendEvent/sendMonitorEvent-Aufrufe in try/catch isoliert
Schema (src-tauri/src/db.rs):
- Trigger cleanup_old_monitor_events war AFTER INSERT (lief bei jedem Insert)
-> bei 1 Mio Zeilen O(n) DELETE pro Event = O(n^2)-Schneeball
- Neuer Trigger: WHEN COUNT > 50000, behaelt juengste 30000, loescht >7d alt
- DROP TRIGGER vor CREATE damit Migration auf bestehenden DBs greift
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Die ntfy-action ueber data/ntfy-action@main definiert ihre Inputs als
ntfy_auth (siehe action.yml). Mit auth: kam keine Notification durch.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bisher kamen Build-Statusmeldungen vom /deploy-Polling. Das ist redundant —
die Pipeline kann selbst auf Topic vk-builds pingen, dann brauchen wir kein
Claude-Polling mehr (spart Tokens, vermeidet doppelte Pings).
- Notify start: grauer Hammer am Anfang
- Notify success: gruener Haken (mit Versionsnummer)
- Notify failure: rote Lampe + Priority high
Voraussetzung: Repo-Secret NTFY_AUTH ist gesetzt (siehe globales CLAUDE.md).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Wenn User während laufender Verarbeitung tippt, erschien "Denkt nach"
zweimal: einmal in der leeren Assistant-Message und nochmal als
separater Block. Jetzt wird der separate Block nur gezeigt wenn
nirgends eine leere Assistant-Message existiert.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bridge hat jetzt eine interne Pending-Queue: Nachrichten die während einer
laufenden query() eingehen werden gepuffert und nach dem aktuellen Turn
automatisch FIFO abgearbeitet. Kein Frontend-Queue mehr nötig.
User kann jetzt wie in Claude Code/VS Code Extension weiter tippen während
Claude arbeitet. Nachrichten erscheinen sofort im Chat und werden nahtlos
nach dem aktuellen Turn verarbeitet.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Problem: Wenn auf NixOS der WebKit-Audio-Stack unvollständig ist
(fehlendes gst-plugin-pipewire, pipewire-pulse, Policy-Datei oder
whisper-cli/piper Binary), hängt die App fest ohne Fehlermeldung —
weder getUserMedia noch die Backend-Prozesse reagieren.
Frontend (VoicePanel.svelte):
- Preflight: prüft ob navigator.mediaDevices überhaupt existiert
- getUserMedia via Promise.race gegen 8s-Timeout (sonst hängt es ewig)
- Kategorisierte Fehler: NotAllowedError → Berechtigung,
NotFoundError → keine Hardware, NotReadableError → PipeWire-Problem
- Neuer 'connecting'-State mit 🔌-Icon — User sieht dass was passiert
- AudioContext-Konstruktor in try/catch
Backend (voice.rs):
- ffmpeg: 20s-Timeout + spezifische Fehlermeldung bei fehlendem Binary
- whisper-cli: 60s-Timeout, kein stilles Hängen mehr
- piper-tts: 30s-Timeout, Spawn-Fehler benennt NixOS-Wrapper
- Temp-Dateien werden bei Timeout auch aufgeräumt
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.
Tool-Start und Tool-End hatten unterschiedliche IDs: tool-start generierte
eine zufällige UUID, tool-end suchte nach der Backend-ID → kein Match →
alle Tool-Calls blieben ewig auf "running" mit pulsierendem grünen Punkt.
Fix: Backend-ID wird jetzt bei tool-start durchgereicht + Fallback auf
letzten laufenden Tool-Call wenn ID nicht matcht.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wenn eine Session angeklickt wird die zu einem anderen Projekt gehört,
wird jetzt automatisch switch_project aufgerufen (CWD, Context, KB-Filter).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
{#key $chatDetached} um PaneGroup erzwingt kompletten Re-Mount.
PaneForge verlor vorher die Resize-Handler wenn Pane per {#if} entfernt wurde.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
stmt.query_map()?.collect() direkt als Return-Expression hält den
Borrow über den Block-End hinaus. Fix: Ergebnis erst in let binden,
dann returnen — so wird der Temporary vor stmt gedroppt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Crash: "byte index 200 is not a char boundary; inside '─' (bytes 198..201)"
Fix: char_indices() statt byte-slice für sicheres Abschneiden bei
Multi-Byte-Zeichen (ä, ü, ─, etc.)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Standard-TTS von Thorsten (männlich) auf Kerstin (weiblich) gewechselt
- text_to_speech nutzt jetzt den voice-Parameter (vorher ignoriert)
- get_tts_voices zeigt alle verfügbaren Stimmen mit Verfügbarkeits-Check
- 5 deutsche Stimmen: Kerstin, Thorsten HQ, Thorsten, Eva, Ramona
- Modell-Suche mit dynamischem Dateinamen pro Stimme
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- db.rs: load_sessions_filtered() ohne shared row_mapper (Borrow-Probleme)
- voice.rs: Modell-Suche auch in ~/.local/share/claude-desktop/models/
und ~/.claude-desktop/models/ (AppImage + Nix-Wrapper Kompatibilität)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sessions werden jetzt nach aktivem Projekt gefiltert (working_dir).
Beim Projektwechsel sieht man nur noch die Sessions die zu diesem
Projekt gehören. Backend: load_sessions_filtered() mit optionalem
WHERE working_dir-Filter. Ohne Projekt: alle Sessions (abwärtskompatibel).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Mode-Badge über dem Textfeld zeigt aktiven Agent-Modus (Handlanger/Experten/Auto) mit Verarbeitungsphase
- Plan-Erkennung: erkennt strukturierte Pläne in Claude-Antworten (Mermaid, Sektionen, Schrittlisten)
- Automatisches Senden erkannter Pläne ans Präsentationsfenster als Slides
- PWA Docker Build Pipeline hinzugefügt
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
App crashte mit "No GSettings schemas are installed on the system"
weil WebKitGTK die GLib-Schemas nicht finden konnte.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>