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>
- Global Hotkey: Super+C öffnet Claude-Fenster und fokussiert Input von überall
- Clipboard-Watch: Erkennt Code/URLs/Fehler/Pfade in Zwischenablage, zeigt Vorschlag
- tauri-plugin-global-shortcut + tauri-plugin-dialog integriert
- focus-chat-input Event für Hotkey → Input-Fokus
- clipboard-changed Event für Watch → Chat-Vorschlag
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- File-Browser Dialog (tauri-plugin-dialog) für Projektverzeichnis-Auswahl
- Auto-Name aus Verzeichnisname beim Projekt-Hinzufügen
- Nix-Wrapper: GStreamer Core-Plugins (valve) + ffmpeg-headless im PATH
- Nix-Wrapper: Version 0.1.1 mit korrektem gstreamer.out Output
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>
Wenn PipeWire nicht läuft (z.B. PulseAudio/xRDP), wird pipewiresrc
auf Rank 0 gesetzt damit WebKitGTK auf pulsesrc zurückfällt.
getUserMedia bekommt 5s Timeout statt endlos zu hängen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Build schlug fehl wegen gemischter Event-Handler-Syntax (Svelte 5
erlaubt kein Mischen von on:click und onclick im selben Component).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- chatDetached Store: Hauptfenster blendet Chat-Pane aus wenn Fenster offen
- Placeholder mit "Zurückholen"-Button statt leerem Pane
- Backend sendet chat-detached/chat-reattached Events ans Hauptfenster
- on_window_event(Destroyed): Automatisches Reattach wenn Fenster geschlossen
- Chat-Window lädt aktive Session + Nachrichten aus DB beim Öffnen
- Mehr Platz für andere Panels wenn Chat herausgelöst
[appimage]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Suchfeld oben: durchsucht alle Einstellungen, Commands, Hooks
- Kategorie-Sidebar: Allgemein, Modell, Commands, Hooks, Berechtigungen, Über
- Commands & Skills: Alle /slash-commands mit Badge (Eingebaut/Custom/Skill)
- Hooks: Toggle-Buttons zum Aktivieren/Deaktivieren
- Permissions: Guard-Rail-Übersicht mit Pattern/Tool/Status
- Debug: Alle DB-Settings unter "Über" aufklappbar
- Bei Suche: Sidebar verschwindet, alle matchenden Sektionen angezeigt
[appimage]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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>
- GST_PLUGIN_SYSTEM_PATH_1_0 mit pipewire im wrapProgram gesetzt
- User-Nachrichten >10 Zeilen werden collapsed ("Eingefuegt: X Zeilen")
- Assistant-Nachrichten weiterhin ab 25 Zeilen
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Both bridge and frontend now properly escape &, <, > in thinking
content before injecting as innerHTML.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Thinking blocks now look like a proper AI chat app:
- Indigo accent border (left-side, animates on hover/open)
- Dark card background (#161b27) distinct from message
- Custom lightbulb SVG icon + chevron (rotates on open)
- Monospace font for thinking content (JetBrains Mono)
- Max-height 300px with custom scrollbar
- No default disclosure markers (hidden via CSS)
- Summary shows "Überlegung" + line count on the right
- Text-based pattern detection expanded (English + German)
- Bridge escapes HTML in thinking content to prevent XSS
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>
- Panels werden erst bei Tab-Aktivierung geladen (dynamic import mit Cache)
→ schnellerer App-Start, weniger initiales DOM
- Auto-Retry mit Backoff (3 Versuche, 2s/5s/10s) bei transienten Fehlern
(Rate-Limit, Netzwerk, 5xx) → keine manuellen Neustarts mehr
- Bridge-Heartbeat alle 30s → Rust erkennt tote Bridge sofort
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
WebKitGTK throws various error types (TypeError, OverconstrainedError,
etc.) when getUserMedia is called. Instead of only catching specific
error names, now ALL errors trigger device-enumeration fallback chain:
1. { audio: true }
2. Explicit deviceId from enumerateDevices()
3. { audio: {} } as last resort
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bei OverconstrainedError wird erst Device-Enumeration versucht, dann
Fallback auf einfache Constraints. VoicePanel nutzt ebenfalls Fallback
von strikten auf einfache Audio-Constraints.
Co-Authored-By: Claude Opus 4.6 <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>
- 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>
- Neues VoicePanel.svelte mit Mikrofon-Zugriff via Web Audio API
- Push-to-Talk und Continuous-Mode (VAD-Ready)
- Audio-Visualisierung mit Canvas-Waveform
- OpenAI Whisper STT + TTS Integration via voice.rs
- Stimmenauswahl (Alloy, Echo, Fable, Onyx, Nova, Shimmer)
- Tab "Sprache" im rechten Panel integriert
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Bridge (scripts/claude-bridge.js):
- chooseAutoMode(): Keyword-Heuristik wählt solo/handlanger/experten
basierend auf Aufgabenkomplexität und Nachrichtenlänge
- auto-mode-chosen Event fuer Frontend-Feedback
- effectiveMode statt agentMode durchs ganze sendMessage-Flow
Custom Sub-Agents via SDK agents-Option:
- HANDLANGER_AGENTS.worker: Haiku, exakte Ausfuehrung, max 500 Tokens
- EXPERTEN_AGENTS: research/implement/test/review mit eigenen Tools+Prompts
- Orchestrator-Prompts verweisen auf subagent_type Namen
- Kostenersparnis im Handlanger-Modus durch Haiku-Delegation
UI (AgentView.svelte):
- Delegations-Badge bei Sub-Agent-Knoten (farbcodiert nach Modus)
- Nur sichtbar bei depth > 0 und Modus != solo
Co-Authored-By: Claude Opus 4.6 (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>
- 📥 JSON Button: Exportiert alle Events als strukturiertes JSON
- 📄 TXT Button: Exportiert als lesbarer Text
- Enthält Zeitstempel, Stats und Filter-Status
- Download als Datei (monitor-log.json / .txt)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Zeigt geschätzte Token-Anzahl (~X.Xk)
- Farbcodiert: grün < 20k, gelb 20-40k, rot > 40k
- Aktualisiert sich live bei jeder Nachricht
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Warnung bei ~40k Token (statt plumpe Nachrichtenanzahl)
- Dialog zeigt aktuelle Token-Schätzung
- User entscheidet ob kompaktiert wird
- Zeigt was nach Compacting übrig bleibt (30 neueste)
- "Später" Button um Dialog zu schließen
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>