From f0e3706179012efa0dadf06c18d64b7b719c0e77 Mon Sep 17 00:00:00 2001 From: sandikodev Date: Sat, 4 Apr 2026 22:43:37 +0700 Subject: [PATCH] fix(delegate): respect chat.defaultAgent setting when no agent is specified When the delegate tool is invoked without an explicit agent name, it was unconditionally falling back to the hardcoded DEFAULT_AGENT_NAME ("q_cli_default"), ignoring the user's chat.defaultAgent setting. Fix the fallback chain to: 1. Use the explicitly provided agent name (unchanged) 2. Fall back to chat.defaultAgent setting if set 3. Fall back to DEFAULT_AGENT_NAME as last resort Fixes #3174 --- .../chat-cli/src/cli/chat/tools/delegate.rs | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/crates/chat-cli/src/cli/chat/tools/delegate.rs b/crates/chat-cli/src/cli/chat/tools/delegate.rs index fd7a1e31ce..4f14eaf56c 100644 --- a/crates/chat-cli/src/cli/chat/tools/delegate.rs +++ b/crates/chat-cli/src/cli/chat/tools/delegate.rs @@ -36,6 +36,7 @@ use crate::cli::{ Agent, DEFAULT_AGENT_NAME, }; +use crate::database::settings::Setting; use crate::os::Os; use crate::theme::StyledText; use crate::util::env_var::get_all_env_vars; @@ -99,7 +100,14 @@ impl Delegate { .as_ref() .ok_or(eyre::eyre!("Task description is required for launch operation"))?; - let agent_name = self.agent.as_deref().unwrap_or(DEFAULT_AGENT_NAME); + // Respect chat.defaultAgent setting before falling back to the hardcoded default. + // See: #3174 + let configured_default = os.database.settings.get_string(Setting::ChatDefaultAgent); + let agent_name = self + .agent + .as_deref() + .or(configured_default.as_deref()) + .unwrap_or(DEFAULT_AGENT_NAME); launch_agent(os, agent_name, agents, task).await? }, @@ -599,4 +607,27 @@ mod tests { let schema = schemars::schema_for!(Delegate); println!("{}", serde_json::to_string_pretty(&schema).unwrap()); } + + /// Simulates the agent name resolution logic from Delegate::invoke. + fn resolve_agent_name<'a>( + explicit: Option<&'a str>, + configured_default: Option<&'a str>, + ) -> &'a str { + explicit.or(configured_default).unwrap_or(DEFAULT_AGENT_NAME) + } + + #[test] + fn explicit_agent_takes_priority() { + assert_eq!(resolve_agent_name(Some("my-agent"), Some("other")), "my-agent"); + } + + #[test] + fn configured_default_used_when_no_explicit_agent() { + assert_eq!(resolve_agent_name(None, Some("configured-agent")), "configured-agent"); + } + + #[test] + fn falls_back_to_default_agent_name_when_nothing_configured() { + assert_eq!(resolve_agent_name(None, None), DEFAULT_AGENT_NAME); + } }