diff --git a/crates/goose-server/src/routes/agent.rs b/crates/goose-server/src/routes/agent.rs index e4c150c3ff3b..cbb4656fd64f 100644 --- a/crates/goose-server/src/routes/agent.rs +++ b/crates/goose-server/src/routes/agent.rs @@ -221,8 +221,16 @@ async fn start_agent( })?; // Initialize session with extensions (either overrides from hub or global defaults) - let extensions_to_use = + let mut extensions_to_use = extension_overrides.unwrap_or_else(goose::config::get_enabled_extensions); + + // If recipe has extensions, merge them with the global/override extensions + if let Some(ref recipe) = original_recipe { + if let Some(ref recipe_extensions) = recipe.extensions { + extensions_to_use.extend(recipe_extensions.clone()); + } + } + let mut extension_data = session.extension_data.clone(); let extensions_state = EnabledExtensionsState::new(extensions_to_use); if let Err(e) = extensions_state.to_extension_data(&mut extension_data) { diff --git a/crates/goose/src/scheduler.rs b/crates/goose/src/scheduler.rs index 2a21a9484da2..46f38645bc18 100644 --- a/crates/goose/src/scheduler.rs +++ b/crates/goose/src/scheduler.rs @@ -22,6 +22,7 @@ use crate::posthog; use crate::providers::create; use crate::recipe::Recipe; use crate::scheduler_trait::SchedulerTrait; +use crate::session::extension_data::{EnabledExtensionsState, ExtensionState}; use crate::session::session_manager::SessionType; use crate::session::{Session, SessionManager}; @@ -740,13 +741,34 @@ async fn execute_job( } } - let session = SessionManager::create_session( + let mut session = SessionManager::create_session( std::env::current_dir()?, format!("Scheduled job: {}", job.id), SessionType::Scheduled, ) .await?; + // Save recipe extensions to session extension_data so they're properly loaded + if let Some(ref extensions) = recipe.extensions { + let mut extension_data = session.extension_data.clone(); + let extensions_state = EnabledExtensionsState::new(extensions.clone()); + if let Err(e) = extensions_state.to_extension_data(&mut extension_data) { + tracing::warn!("Failed to save recipe extensions to session: {}", e); + } else { + SessionManager::update_session(&session.id) + .extension_data(extension_data.clone()) + .apply() + .await?; + session.extension_data = extension_data; + } + } + + // Save recipe to session + SessionManager::update_session(&session.id) + .recipe(Some(recipe.clone())) + .apply() + .await?; + agent.update_provider(agent_provider, &session.id).await?; let mut jobs_guard = jobs.lock().await;