From 9c6026de40daa92c9f87b979ce4dd952b446c585 Mon Sep 17 00:00:00 2001 From: Eddy Date: Tue, 21 Apr 2026 10:02:40 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Quick-Actions=20(Ctrl+K)=20+=20GStreame?= =?UTF-8?q?r-Fix=20f=C3=BCr=20Produktion=20[appimage]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Quick-Actions Palette mit VS-Code-artigem UI: Suche, Kategorien (Build/Git/Session/Navigation/Voice/Tools), Keyboard-Navigation. Nix-Wrapper enthält jetzt GStreamer + PipeWire für Mikrofon-Support. Co-Authored-By: Claude Opus 4.6 --- CHANGELOG.md | 10 +- ROADMAP.md | 33 +- nix/default.nix | 7 + src/lib/components/ChatPanel.svelte | 38 +- src/lib/components/QuickActions.svelte | 551 +++++++++++++++++++++++++ src/lib/stores/app.ts | 13 + src/routes/+page.svelte | 10 +- 7 files changed, 640 insertions(+), 22 deletions(-) create mode 100644 src/lib/components/QuickActions.svelte diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b657dc..7b4ec57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,15 @@ Format angelehnt an [Keep a Changelog](https://keepachangelog.com/de/1.0.0/). --- -## [Unreleased] - 2025-04-20 +## [Unreleased] - 2026-04-21 ### Hinzugefügt +- **Quick-Actions Palette (Ctrl+K)**: VS-Code-artige Kommandopalette mit Suche, Kategorien (Build, Git, Session, Navigation, Voice, Tools), Keyboard-Navigation (`QuickActions.svelte`) +- **Lokales Voice (Phase 2.2)**: whisper-cli STT + piper-tts TTS, komplett lokal ohne OpenAI-API (`voice.rs`, `VoicePanel.svelte`) +- **Chat-Detach**: Chat in separates Fenster herauslösen, Platz für andere Panels, Zurückholen per Button (`chat_window.rs`, `+page.svelte`) +- **Aktivitäts-Phasen**: 4 Zustände (Denkt nach/Streamt/Tool-Nutzung/Subagent) statt nur "Denkt nach..." (`events.ts`, `ChatPanel.svelte`) +- **Settings-Panel (VS Code Stil)**: Suchfeld, Kategorien-Sidebar, Commands/Hooks/Permissions-Verwaltung (`SettingsPanel.svelte`) +- **GStreamer im Nix-Wrapper**: Mikrofon funktioniert jetzt auch in Produktion (PipeWire + gst-plugins) (`nix/default.nix`) - **Slash-Command Autocomplete**: `/`-Eingabe im Chat öffnet Dropdown mit allen Commands, Skills und Built-ins (`commands.rs`, `CommandPalette.svelte`) - **KB-Hints Injection**: Jede Nachricht an Claude bekommt automatisch relevante Wissensbasis-Einträge (`claude.rs`, `knowledge.rs`) - **Voice-zu-Claude-Pipeline**: Spracheingabe wird transkribiert, an Claude gesendet, Antwort per TTS vorgelesen (`VoicePanel.svelte`) @@ -27,6 +33,8 @@ Format angelehnt an [Keep a Changelog](https://keepachangelog.com/de/1.0.0/). - `lib.rs`: App-Lifecycle erweitert um Lock-Datei create/remove bei Start/Exit ### Behoben +- **Update-Fortschrittsbalken**: Erreicht jetzt visuell 100% vor der Bestätigungsmeldung (`update.rs`, `UpdateDialog.svelte`) +- **Mikrofon in Produktion**: GStreamer + PipeWire-Plugins fehlten im Nix-Wrapper, WebKitGTK konnte getUserMedia nicht nutzen (`nix/default.nix`) - Updater konnte Binary ersetzen während App noch lief (kein Lock, kein Prozess-Check) --- diff --git a/ROADMAP.md b/ROADMAP.md index 71ebc62..115efa2 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,6 +1,6 @@ # Claude Desktop — Roadmap -Stand: 20.04.2026 +Stand: 21.04.2026 --- @@ -58,14 +58,17 @@ Alles aus Phase 1-16 ist implementiert und funktionsfaehig: **Ziel:** Dinge die Codium + Extension prinzipbedingt NICHT koennen. -| Feature | Datei(en) | Beschreibung | -|---------|-----------|--------------| -| Projekt-Wechsel | `context.rs`, UI | Ein Klick wechselt Projekt (CWD, CLAUDE.md, Context, KB-Filter) | -| MCP-Hub nativ | `claude-bridge.js` | Alle MCP-Server direkt nutzbar (Docker, Forgejo, DB) ohne CLI-Umweg | -| Guard-Rails UI | `guard.rs`, `GuardPanel.svelte` | Live-Anzeige was Claude darf/nicht darf, Ein-Klick-Freigabe | -| Persistent Memory | `memory.rs`, `db.rs` | Cross-Session Gedaechtnis — Claude erinnert sich an ALLES | -| Quick-Actions | `CommandPalette.svelte` | Ctrl+K oeffnet Palette: Deploy, Build, Test, Commit — ein Tastendruck | -| Voice-Conversation | `voice.rs`, `ChatPanel.svelte` | Hands-free Loop: Sprechen → Claude antwortet → TTS → warten auf naechste Eingabe | +| Feature | Datei(en) | Status | +|---------|-----------|--------| +| Projekt-Wechsel | `context.rs`, UI | ⬜ Ein Klick wechselt Projekt (CWD, CLAUDE.md, Context, KB-Filter) | +| MCP-Hub nativ | `claude-bridge.js` | ⬜ Alle MCP-Server direkt nutzbar (Docker, Forgejo, DB) ohne CLI-Umweg | +| Guard-Rails UI | `guard.rs`, `GuardPanel.svelte` | ⬜ Live-Anzeige was Claude darf/nicht darf, Ein-Klick-Freigabe | +| Persistent Memory | `memory.rs`, `db.rs` | ⬜ Cross-Session Gedaechtnis — Claude erinnert sich an ALLES | +| ✅ Quick-Actions | `QuickActions.svelte`, `ChatPanel.svelte` | Ctrl+K Palette: Deploy, Build, Test, Commit, Git, Navigation | +| ✅ Voice-Conversation | `voice.rs`, `VoicePanel.svelte` | Lokales Whisper STT + Piper TTS, VAD, Gespraechsmodus | +| ✅ Settings-Panel | `SettingsPanel.svelte` | VS-Code-artiges Layout mit Suche, Kategorien, Commands, Hooks | +| ✅ Chat-Detach | `chat_window.rs`, `+page.svelte` | Chat in separates Fenster herausloesen/zurueckholen | +| ✅ Aktivitaets-Phasen | `events.ts`, `ChatPanel.svelte` | 4 Phasen: Denkt/Streamt/Tool/Subagent statt nur "Denkt nach" | --- @@ -73,12 +76,12 @@ Alles aus Phase 1-16 ist implementiert und funktionsfaehig: **Ziel:** Unabhaengig von Cloud fuer Routine-Tasks. -| Feature | Datei(en) | Beschreibung | -|---------|-----------|--------------| -| Whisper.cpp lokal | `voice.rs` | STT ohne OpenAI-API, laeuft auf GPU | -| Piper-TTS lokal | `voice.rs` | Deutsche Stimme offline | -| Lokales Haiku-Equivalent | `claude-bridge.js` | Ollama/llama.cpp fuer simple Tasks (Commit-Messages, Uebersetzungen) | -| Offline-Queue | `session.rs` | Nachrichten queuen wenn kein Netz, spaeter absenden | +| Feature | Datei(en) | Status | +|---------|-----------|--------| +| ✅ Whisper.cpp lokal | `voice.rs` | whisper-cli STT, Thorsten-DE Modell, kein OpenAI noetig | +| ✅ Piper-TTS lokal | `voice.rs` | piper-tts mit thorsten_emotional (high), offline | +| ⬜ Lokales Haiku-Equivalent | `claude-bridge.js` | Ollama/llama.cpp fuer simple Tasks (Commit-Messages, Uebersetzungen) | +| ⬜ Offline-Queue | `session.rs` | Nachrichten queuen wenn kein Netz, spaeter absenden | --- diff --git a/nix/default.nix b/nix/default.nix index 71b1103..49478be 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -35,6 +35,13 @@ let libsoup_3 at-spi2-atk openssl + # GStreamer + PipeWire fuer WebKitGTK Audio (Mikrofon, getUserMedia) + gst_all_1.gstreamer + gst_all_1.gst-plugins-base + gst_all_1.gst-plugins-good + gst_all_1.gst-plugins-bad + pipewire + alsa-lib ]; # GStreamer-Plugins fuer WebKitGTK (Audio/Video, WebRTC, Mikrofon via PipeWire) diff --git a/src/lib/components/ChatPanel.svelte b/src/lib/components/ChatPanel.svelte index 387703e..49291db 100644 --- a/src/lib/components/ChatPanel.svelte +++ b/src/lib/components/ChatPanel.svelte @@ -1,12 +1,13 @@ + +{#if visible} + +
+ +
+{/if} + + diff --git a/src/lib/stores/app.ts b/src/lib/stores/app.ts index 66e8e18..8af544f 100644 --- a/src/lib/stores/app.ts +++ b/src/lib/stores/app.ts @@ -46,6 +46,19 @@ export interface Permission { createdAt: Date; } +// Quick-Actions Typ (fuer QuickActions.svelte + ChatPanel.svelte) +export interface QuickAction { + id: string; + label: string; + description: string; + icon: string; + category: 'build' | 'git' | 'session' | 'navigation' | 'voice' | 'tools'; + shortcut?: string; + command?: string; // Wird als Message an Claude gesendet + invoke?: string; // Tauri-Command direkt aufrufen + invokeArgs?: Record; +} + // Stores export const agents = writable([]); export const toolCalls = writable([]); diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 9261997..c20adc8 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -8,7 +8,7 @@ import SessionList from '$lib/components/SessionList.svelte'; import ChatPanel from '$lib/components/ChatPanel.svelte'; - // Chat-Detach: Listener für Fenster-Events + // Chat-Detach + Quick-Actions Navigation: Listener für Fenster-Events onMount(async () => { // Wenn das Chat-Fenster geschlossen wird → Chat wieder einblenden await listen('chat-reattached', () => { @@ -18,6 +18,14 @@ await listen('chat-detached', () => { $chatDetached = true; }); + // Quick-Actions Navigation: Tab in Panel aktivieren + await listen<{ panel: string; tab: string }>('navigate-tab', (event) => { + if (event.payload.panel === 'middle') { + activeMiddleTab = event.payload.tab; + } else if (event.payload.panel === 'right') { + activeRightTab = event.payload.tab; + } + }); }); // Sekundäre Panels: Lazy-Load bei erstem Tab-Wechsel