diff --git a/crates/goose/src/agents/agent.rs b/crates/goose/src/agents/agent.rs index a1edb82d27f2..248c4d21d59e 100644 --- a/crates/goose/src/agents/agent.rs +++ b/crates/goose/src/agents/agent.rs @@ -999,6 +999,7 @@ impl Agent { let conversation_with_moim = super::moim::inject_moim( conversation.clone(), &self.extension_manager, + &working_dir, ).await; let mut stream = Self::stream_response_from_provider( diff --git a/crates/goose/src/agents/extension_manager.rs b/crates/goose/src/agents/extension_manager.rs index d8d7341eee19..7dfc7b749ae9 100644 --- a/crates/goose/src/agents/extension_manager.rs +++ b/crates/goose/src/agents/extension_manager.rs @@ -1223,9 +1223,13 @@ impl ExtensionManager { .map(|ext| ext.get_client()) } - pub async fn collect_moim(&self) -> Option { + pub async fn collect_moim(&self, working_dir: &std::path::Path) -> Option { let timestamp = chrono::Local::now().format("%Y-%m-%d %H:%M:%S").to_string(); - let mut content = format!("\nDatetime: {}\n", timestamp); + let mut content = format!( + "\nDatetime: {}\nWorking directory: {}\n", + timestamp, + working_dir.display() + ); let extensions = self.extensions.lock().await; for (name, extension) in extensions.iter() { diff --git a/crates/goose/src/agents/moim.rs b/crates/goose/src/agents/moim.rs index d920f3b7dc74..886087cb25e8 100644 --- a/crates/goose/src/agents/moim.rs +++ b/crates/goose/src/agents/moim.rs @@ -2,6 +2,7 @@ use crate::agents::extension_manager::ExtensionManager; use crate::conversation::message::Message; use crate::conversation::{fix_conversation, Conversation}; use rmcp::model::Role; +use std::path::Path; // Test-only utility. Do not use in production code. No `test` directive due to call outside crate. thread_local! { @@ -11,12 +12,13 @@ thread_local! { pub async fn inject_moim( conversation: Conversation, extension_manager: &ExtensionManager, + working_dir: &Path, ) -> Conversation { if SKIP.with(|f| f.get()) { return conversation; } - if let Some(moim) = extension_manager.collect_moim().await { + if let Some(moim) = extension_manager.collect_moim(working_dir).await { let mut messages = conversation.messages().clone(); let idx = messages .iter() @@ -45,17 +47,19 @@ pub async fn inject_moim( mod tests { use super::*; use rmcp::model::CallToolRequestParam; + use std::path::PathBuf; #[tokio::test] async fn test_moim_injection_before_assistant() { let em = ExtensionManager::new_without_provider(); + let working_dir = PathBuf::from("/test/dir"); let conv = Conversation::new_unvalidated(vec![ Message::user().with_text("Hello"), Message::assistant().with_text("Hi"), Message::user().with_text("Bye"), ]); - let result = inject_moim(conv, &em).await; + let result = inject_moim(conv, &em, &working_dir).await; let msgs = result.messages(); assert_eq!(msgs.len(), 3); @@ -70,14 +74,16 @@ mod tests { .join(""); assert!(merged_content.contains("Hello")); assert!(merged_content.contains("")); + assert!(merged_content.contains("Working directory: /test/dir")); } #[tokio::test] async fn test_moim_injection_no_assistant() { let em = ExtensionManager::new_without_provider(); + let working_dir = PathBuf::from("/test/dir"); let conv = Conversation::new_unvalidated(vec![Message::user().with_text("Hello")]); - let result = inject_moim(conv, &em).await; + let result = inject_moim(conv, &em, &working_dir).await; assert_eq!(result.messages().len(), 1); @@ -89,11 +95,13 @@ mod tests { .join(""); assert!(merged_content.contains("Hello")); assert!(merged_content.contains("")); + assert!(merged_content.contains("Working directory: /test/dir")); } #[tokio::test] async fn test_moim_with_tool_calls() { let em = ExtensionManager::new_without_provider(); + let working_dir = PathBuf::from("/test/dir"); let conv = Conversation::new_unvalidated(vec![ Message::user().with_text("Search for something"), @@ -119,7 +127,7 @@ mod tests { Message::user().with_tool_response("search_2", Ok(vec![])), ]); - let result = inject_moim(conv, &em).await; + let result = inject_moim(conv, &em, &working_dir).await; let msgs = result.messages(); assert_eq!(msgs.len(), 6);