diff --git a/crates/goose/src/agents/agent.rs b/crates/goose/src/agents/agent.rs index a92e823f0f35..4cee936b6d31 100644 --- a/crates/goose/src/agents/agent.rs +++ b/crates/goose/src/agents/agent.rs @@ -1139,8 +1139,8 @@ impl Agent { let mode = session.and_then(|s| s.execution_mode.as_deref()); match mode { - Some("foreground") => "auto".to_string(), - Some("background") => "chat".to_string(), + Some("foreground") => "chat".to_string(), + Some("background") => "auto".to_string(), _ => config .get_param("GOOSE_MODE") .unwrap_or_else(|_| "auto".to_string()), diff --git a/crates/goose/src/scheduler.rs b/crates/goose/src/scheduler.rs index 5541b2a34f4c..d08eca69bbe7 100644 --- a/crates/goose/src/scheduler.rs +++ b/crates/goose/src/scheduler.rs @@ -1154,6 +1154,17 @@ async fn run_scheduled_job_internal( ), })?; } + if let Some(recipe_extensions) = recipe.extensions { + for extension in recipe_extensions { + agent + .add_extension(extension.clone()) + .await + .map_err(|e| JobExecutionError { + job_id: job.id.clone(), + error: format!("Failed to add extension '{}': {}", extension.name(), e), + })?; + } + } if let Err(e) = agent.update_provider(agent_provider).await { return Err(JobExecutionError { diff --git a/ui/desktop/src/components/BaseChat.tsx b/ui/desktop/src/components/BaseChat.tsx index dd85dafcca83..5e86d50dc519 100644 --- a/ui/desktop/src/components/BaseChat.tsx +++ b/ui/desktop/src/components/BaseChat.tsx @@ -143,7 +143,7 @@ function BaseChatContent({ chatState, error, setMessages, - input: _input, + input, setInput: _setInput, handleSubmit: engineHandleSubmit, onStopGoose, @@ -231,7 +231,9 @@ function BaseChatContent({ useEffect(() => { const isProcessingResponse = chatState !== ChatState.Idle && chatState !== ChatState.WaitingForUserInput; - handleAutoExecution(append, isProcessingResponse); + handleAutoExecution(append, isProcessingResponse, () => { + setHasStartedUsingRecipe(true); + }); }, [handleAutoExecution, append, chatState]); // Use shared session continuation @@ -528,7 +530,7 @@ function BaseChatContent({ chatState={chatState} onStop={onStopGoose} commandHistory={commandHistory} - initialValue={_input || ''} + initialValue={input || ''} setView={setView} numTokens={sessionTokenCount} inputTokens={sessionInputTokens || localInputTokens} diff --git a/ui/desktop/src/hooks/useRecipeManager.ts b/ui/desktop/src/hooks/useRecipeManager.ts index eb86d01d8968..17ed7c41bca2 100644 --- a/ui/desktop/src/hooks/useRecipeManager.ts +++ b/ui/desktop/src/hooks/useRecipeManager.ts @@ -129,7 +129,7 @@ export const useRecipeManager = (messages: Message[], locationState?: LocationSt // Get the recipe's initial prompt (always return the actual prompt, don't modify based on conversation state) const initialPrompt = useMemo(() => { - if (!recipeConfig?.prompt || !recipeAccepted) { + if (!recipeConfig?.prompt || !recipeAccepted || recipeConfig?.isScheduledExecution) { return ''; } @@ -184,7 +184,11 @@ export const useRecipeManager = (messages: Message[], locationState?: LocationSt }; // Auto-execution handler for scheduled recipes - const handleAutoExecution = (append: (message: Message) => void, isLoading: boolean) => { + const handleAutoExecution = ( + append: (message: Message) => void, + isLoading: boolean, + onAutoExecute?: () => void + ) => { const hasRequiredParams = recipeConfig?.parameters && recipeConfig.parameters.length > 0; if ( @@ -205,6 +209,7 @@ export const useRecipeManager = (messages: Message[], locationState?: LocationSt const userMessage = createUserMessage(finalPrompt); append(userMessage); + onAutoExecute?.(); } };