From a3d1dadc46dc33b4ae8a30ca3d46d6435263549b Mon Sep 17 00:00:00 2001 From: Eddy Date: Tue, 21 Apr 2026 13:40:51 +0200 Subject: [PATCH] fix: Session-Filter vereinfacht + Piper/Whisper Modell-Pfade erweitert [appimage] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- src-tauri/src/db.rs | 45 +++++++++++++++++++++--------------------- src-tauri/src/voice.rs | 16 +++++++++++++++ 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src-tauri/src/db.rs b/src-tauri/src/db.rs index 067cdc3..98bc5d2 100644 --- a/src-tauri/src/db.rs +++ b/src-tauri/src/db.rs @@ -524,40 +524,39 @@ impl Database { /// Sessions laden, optional gefiltert nach working_dir (Projekt-Bindung) pub fn load_sessions_filtered(&self, limit: usize, working_dir: Option<&str>) -> SqlResult> { - let row_mapper = |row: &rusqlite::Row| -> rusqlite::Result { - Ok(Session { - id: row.get(0)?, - claude_session_id: row.get(1)?, - title: row.get(2)?, - working_dir: row.get(3)?, - message_count: row.get(4)?, - token_input: row.get(5)?, - token_output: row.get(6)?, - cost_usd: row.get(7)?, - status: row.get(8)?, - created_at: row.get(9)?, - updated_at: row.get(10)?, - last_message: row.get(11)?, - }) - }; - - let sessions = if let Some(dir) = working_dir { + if let Some(dir) = working_dir { let mut stmt = self.conn.prepare( "SELECT id, claude_session_id, title, working_dir, message_count, token_input, token_output, cost_usd, status, created_at, updated_at, last_message FROM sessions WHERE working_dir = ?1 ORDER BY updated_at DESC LIMIT ?2" )?; - stmt.query_map(params![dir, limit as i64], row_mapper)?.collect::>>()? + stmt.query_map(params![dir, limit as i64], |row| { + Ok(Session { + id: row.get(0)?, claude_session_id: row.get(1)?, title: row.get(2)?, + working_dir: row.get(3)?, message_count: row.get(4)?, + token_input: row.get(5)?, token_output: row.get(6)?, + cost_usd: row.get(7)?, status: row.get(8)?, + created_at: row.get(9)?, updated_at: row.get(10)?, + last_message: row.get(11)?, + }) + })?.collect() } else { let mut stmt = self.conn.prepare( "SELECT id, claude_session_id, title, working_dir, message_count, token_input, token_output, cost_usd, status, created_at, updated_at, last_message FROM sessions ORDER BY updated_at DESC LIMIT ?1" )?; - stmt.query_map(params![limit as i64], row_mapper)?.collect::>>()? - }; - - Ok(sessions) + stmt.query_map(params![limit as i64], |row| { + Ok(Session { + id: row.get(0)?, claude_session_id: row.get(1)?, title: row.get(2)?, + working_dir: row.get(3)?, message_count: row.get(4)?, + token_input: row.get(5)?, token_output: row.get(6)?, + cost_usd: row.get(7)?, status: row.get(8)?, + created_at: row.get(9)?, updated_at: row.get(10)?, + last_message: row.get(11)?, + }) + })?.collect() + } } /// Holt eine Session nach ID diff --git a/src-tauri/src/voice.rs b/src-tauri/src/voice.rs index 2c072e4..c1a4ba7 100644 --- a/src-tauri/src/voice.rs +++ b/src-tauri/src/voice.rs @@ -27,9 +27,17 @@ fn whisper_model_path() -> String { .ok() .and_then(|p| p.parent().map(|p| p.to_path_buf())); + let home_dir = std::env::var("HOME").ok() + .map(std::path::PathBuf::from); + let candidates = vec![ + // Relativ zum Binary (Dev-Modus) exe_dir.as_ref().map(|d| d.join("../models/ggml-base.bin")), exe_dir.as_ref().map(|d| d.join("models/ggml-base.bin")), + // XDG Data Home / Home-Verzeichnis (AppImage + Nix-Wrapper) + home_dir.as_ref().map(|d| d.join(".local/share/claude-desktop/models/ggml-base.bin")), + home_dir.as_ref().map(|d| d.join(".claude-desktop/models/ggml-base.bin")), + // CWD Fallback Some(std::path::PathBuf::from("models/ggml-base.bin")), ]; @@ -48,9 +56,17 @@ fn piper_model_path() -> String { .ok() .and_then(|p| p.parent().map(|p| p.to_path_buf())); + let home_dir = std::env::var("HOME").ok() + .map(std::path::PathBuf::from); + let candidates = vec![ + // Relativ zum Binary (Dev-Modus) exe_dir.as_ref().map(|d| d.join("../models/de_DE-thorsten-high.onnx")), exe_dir.as_ref().map(|d| d.join("models/de_DE-thorsten-high.onnx")), + // XDG Data Home / Home-Verzeichnis (AppImage + Nix-Wrapper) + home_dir.as_ref().map(|d| d.join(".local/share/claude-desktop/models/de_DE-thorsten-high.onnx")), + home_dir.as_ref().map(|d| d.join(".claude-desktop/models/de_DE-thorsten-high.onnx")), + // CWD Fallback Some(std::path::PathBuf::from("models/de_DE-thorsten-high.onnx")), ];