From b29f8a9f0dde1f46bd9f68da985fc230fa0dcfc4 Mon Sep 17 00:00:00 2001 From: Solomon Date: Thu, 21 Aug 2025 12:11:30 +0100 Subject: [PATCH] Persist gemini sessions (#546) --- crates/executors/src/executors/gemini.rs | 53 ++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/crates/executors/src/executors/gemini.rs b/crates/executors/src/executors/gemini.rs index e477e398..54975a61 100644 --- a/crates/executors/src/executors/gemini.rs +++ b/crates/executors/src/executors/gemini.rs @@ -217,8 +217,7 @@ impl Gemini { prompt: String, resume_session: bool, ) { - let file_path = - Self::get_sessions_base_dir().join(current_dir.file_name().unwrap_or_default()); + let file_path = Self::get_session_file_path(¤t_dir).await; // Ensure the directory exists if let Some(parent) = file_path.parent() { @@ -280,8 +279,7 @@ impl Gemini { current_dir: &PathBuf, prompt: &str, ) -> Result { - let session_file_path = - Self::get_sessions_base_dir().join(current_dir.file_name().unwrap_or_default()); + let session_file_path = Self::get_session_file_path(current_dir).await; // Read existing session context let session_context = fs::read_to_string(&session_file_path).await.map_err(|e| { @@ -308,6 +306,53 @@ You are continuing work on the above task. The execution history shows the previ } fn get_sessions_base_dir() -> PathBuf { + // Determine base directory under user's home + let home = dirs::home_dir().unwrap_or_else(std::env::temp_dir); + if cfg!(debug_assertions) { + home.join(".vibe-kanban") + .join("dev") + .join("gemini_sessions") + } else { + home.join(".vibe-kanban").join("gemini_sessions") + } + } + + fn get_legacy_sessions_base_dir() -> PathBuf { + // Previous location was under the temp-based vibe-kanban dir utils::path::get_vibe_kanban_temp_dir().join("gemini_sessions") } + + async fn get_session_file_path(current_dir: &PathBuf) -> PathBuf { + let file_name = current_dir.file_name().unwrap_or_default(); + let new_base = Self::get_sessions_base_dir(); + let new_path = new_base.join(file_name); + + // Ensure base directory exists + if let Some(parent) = new_path.parent() { + let _ = fs::create_dir_all(parent).await; + } + + // If the new file doesn't exist yet, try to migrate from legacy location + let new_exists = fs::metadata(&new_path).await.is_ok(); + if !new_exists { + let legacy_path = Self::get_legacy_sessions_base_dir().join(file_name); + if fs::metadata(&legacy_path).await.is_ok() { + if let Err(e) = fs::rename(&legacy_path, &new_path).await { + tracing::warn!( + "Failed to migrate Gemini session from {:?} to {:?}: {}", + legacy_path, + new_path, + e + ); + } else { + tracing::info!( + "Migrated Gemini session file from legacy temp directory to persistent directory: {:?}", + new_path + ); + } + } + } + + new_path + } }