From f7182942180e841e22373973caafe1bf1102ee19 Mon Sep 17 00:00:00 2001 From: Artemiy <80065244+nkoorty@users.noreply.github.com> Date: Mon, 18 May 2026 22:24:23 +0100 Subject: [PATCH] Restore orchestration user opt-out gate --- app/src/settings/ai.rs | 20 +++++++++++++++++++- app/src/settings/ai_tests.rs | 20 +++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/app/src/settings/ai.rs b/app/src/settings/ai.rs index 5bcb471980..2be963e7d5 100644 --- a/app/src/settings/ai.rs +++ b/app/src/settings/ai.rs @@ -1389,6 +1389,22 @@ define_settings_group!(AISettings, settings: [ } + // Whether multi-agent orchestration is enabled. When enabled, the agent can + // spawn and coordinate parallel sub-agents via StartAgent / SendMessageToAgent + // tools. This setting is only effective when FeatureFlag::OrchestrationV2 is also + // enabled. + orchestration_enabled: OrchestrationEnabled { + type: bool, + default: true, + supported_platforms: SupportedPlatforms::DESKTOP, + sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + private: false, + toml_path: "agents.warp_agent.other.orchestration_enabled", + description: "Whether multi-agent orchestration is enabled.", + feature_flag: FeatureFlag::OrchestrationV2, + } + + // Whether file-based MCP servers from third-party AI tools (e.g. Claude, Codex) should // be automatically detected and spawned. Warp-native config files (.warp/.mcp.json) are // always detected and spawned, regardless of this setting. @@ -1674,7 +1690,9 @@ impl AISettings { } pub fn is_orchestration_enabled(&self, app: &warpui::AppContext) -> bool { - FeatureFlag::OrchestrationV2.is_enabled() && self.is_any_ai_enabled(app) + FeatureFlag::OrchestrationV2.is_enabled() + && self.is_any_ai_enabled(app) + && *self.orchestration_enabled } /// Returns true when local-to-cloud handoff is effectively enabled. diff --git a/app/src/settings/ai_tests.rs b/app/src/settings/ai_tests.rs index dfe1af74fc..232c77c3a2 100644 --- a/app/src/settings/ai_tests.rs +++ b/app/src/settings/ai_tests.rs @@ -391,7 +391,7 @@ fn test_toolbar_command_map_matched_agent() { } #[test] -fn orchestration_v2_enables_orchestration_when_ai_is_enabled() { +fn orchestration_v2_and_user_setting_enable_orchestration_when_ai_is_enabled() { let _orchestration_v2_flag = FeatureFlag::OrchestrationV2.override_enabled(true); App::test((), |mut app| async move { @@ -404,6 +404,24 @@ fn orchestration_v2_enables_orchestration_when_ai_is_enabled() { }); } +#[test] +fn orchestration_user_opt_out_disables_orchestration_even_when_v2_is_enabled() { + let _orchestration_v2_flag = FeatureFlag::OrchestrationV2.override_enabled(true); + + App::test((), |mut app| async move { + initialize_settings_for_tests(&mut app); + add_ai_enablement_dependencies_for_test(&mut app); + + AISettings::handle(&app).update(&mut app, |settings, ctx| { + report_if_error!(settings.orchestration_enabled.set_value(false, ctx)); + }); + + AISettings::handle(&app).read(&app, |settings, ctx| { + assert!(!settings.is_orchestration_enabled(ctx)); + }); + }); +} + #[test] fn orchestration_v2_disabled_disables_orchestration() { let _orchestration_v2_flag = FeatureFlag::OrchestrationV2.override_enabled(false);