From d7143009fc72be0bb676f0dc139022f5a3c339e6 Mon Sep 17 00:00:00 2001 From: Ben Brandt Date: Thu, 9 Oct 2025 18:17:49 +0200 Subject: [PATCH] Remove codex feature flag (#39878) Release Notes: - N/A --- Cargo.lock | 1 - crates/agent_ui/src/agent_configuration.rs | 14 +-- crates/agent_ui/src/agent_panel.rs | 53 +++++----- crates/feature_flags/src/flags.rs | 6 -- crates/project/Cargo.toml | 1 - crates/project/src/agent_server_store.rs | 97 +++++++------------ crates/project/src/project.rs | 2 +- .../remote_server/src/remote_editing_tests.rs | 2 +- 8 files changed, 68 insertions(+), 108 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 884c9554e366ff4e7d732a795b24586900b3c852..315c3db1e466ffe682067643c3a58ddd058f03db 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12032,7 +12032,6 @@ dependencies = [ "dap_adapters", "extension", "fancy-regex 0.14.0", - "feature_flags", "fs", "futures 0.3.31", "fuzzy", diff --git a/crates/agent_ui/src/agent_configuration.rs b/crates/agent_ui/src/agent_configuration.rs index bd68271c3cc042f98c205148095124cbf9fab89a..b447617c340dedb6795c0c950f08eee8f0c6d59e 100644 --- a/crates/agent_ui/src/agent_configuration.rs +++ b/crates/agent_ui/src/agent_configuration.rs @@ -15,7 +15,6 @@ use context_server::ContextServerId; use editor::{Editor, SelectionEffects, scroll::Autoscroll}; use extension::ExtensionManifest; use extension_host::ExtensionStore; -use feature_flags::{CodexAcpFeatureFlag, FeatureFlagAppExt as _}; use fs::Fs; use gpui::{ Action, AnyView, App, AsyncWindowContext, Corner, Entity, EventEmitter, FocusHandle, Focusable, @@ -1085,14 +1084,11 @@ impl AgentConfiguration { "Claude Code", )) .child(Divider::horizontal().color(DividerColor::BorderFaded)) - .when(cx.has_flag::(), |this| { - this - .child(self.render_agent_server( - IconName::AiOpenAi, - "Codex", - )) - .child(Divider::horizontal().color(DividerColor::BorderFaded)) - }) + .child(self.render_agent_server( + IconName::AiOpenAi, + "Codex", + )) + .child(Divider::horizontal().color(DividerColor::BorderFaded)) .child(self.render_agent_server( IconName::AiGemini, "Gemini CLI", diff --git a/crates/agent_ui/src/agent_panel.rs b/crates/agent_ui/src/agent_panel.rs index 2bd0fe4c8051fd5fd4c96b81899e8b7d8dbe21b5..480f3a2cd8b37b862ee67c96142ef4d5f370faad 100644 --- a/crates/agent_ui/src/agent_panel.rs +++ b/crates/agent_ui/src/agent_panel.rs @@ -75,7 +75,6 @@ use zed_actions::{ assistant::{OpenRulesLibrary, ToggleFocus}, }; -use feature_flags::{CodexAcpFeatureFlag, FeatureFlagAppExt as _}; const AGENT_PANEL_KEY: &str = "agent_panel"; #[derive(Serialize, Deserialize, Debug)] @@ -1939,34 +1938,32 @@ impl AgentPanel { } }), ) - .when(cx.has_flag::(), |this| { - this.item( - ContextMenuEntry::new("New Codex Thread") - .icon(IconName::AiOpenAi) - .disabled(is_via_collab) - .icon_color(Color::Muted) - .handler({ - let workspace = workspace.clone(); - move |window, cx| { - if let Some(workspace) = workspace.upgrade() { - workspace.update(cx, |workspace, cx| { - if let Some(panel) = - workspace.panel::(cx) - { - panel.update(cx, |panel, cx| { - panel.new_agent_thread( - AgentType::Codex, - window, - cx, - ); - }); - } - }); - } + .item( + ContextMenuEntry::new("New Codex Thread") + .icon(IconName::AiOpenAi) + .disabled(is_via_collab) + .icon_color(Color::Muted) + .handler({ + let workspace = workspace.clone(); + move |window, cx| { + if let Some(workspace) = workspace.upgrade() { + workspace.update(cx, |workspace, cx| { + if let Some(panel) = + workspace.panel::(cx) + { + panel.update(cx, |panel, cx| { + panel.new_agent_thread( + AgentType::Codex, + window, + cx, + ); + }); + } + }); } - }), - ) - }) + } + }), + ) .item( ContextMenuEntry::new("New Gemini CLI Thread") .icon(IconName::AiGemini) diff --git a/crates/feature_flags/src/flags.rs b/crates/feature_flags/src/flags.rs index 981abc0fa6aa096d53aa4ee5f74d37567f0eb5e1..47b6f1230ac747c2633327d1be923d33388cf179 100644 --- a/crates/feature_flags/src/flags.rs +++ b/crates/feature_flags/src/flags.rs @@ -17,9 +17,3 @@ pub struct PanicFeatureFlag; impl FeatureFlag for PanicFeatureFlag { const NAME: &'static str = "panic"; } - -pub struct CodexAcpFeatureFlag; - -impl FeatureFlag for CodexAcpFeatureFlag { - const NAME: &'static str = "codex-acp"; -} diff --git a/crates/project/Cargo.toml b/crates/project/Cargo.toml index 6a5223f33d0864263b36e2eadb4765780ad2128d..39dc0621732bfd42b3a24735ad803915fbf2885c 100644 --- a/crates/project/Cargo.toml +++ b/crates/project/Cargo.toml @@ -90,7 +90,6 @@ which.workspace = true worktree.workspace = true zeroize.workspace = true zlog.workspace = true -feature_flags.workspace = true workspace-hack.workspace = true [dev-dependencies] diff --git a/crates/project/src/agent_server_store.rs b/crates/project/src/agent_server_store.rs index 0e81be84cbc1d9809b17394a3748d74a9a945027..73a65f98d5a1bae0fb24c1710ecece0175bfa34f 100644 --- a/crates/project/src/agent_server_store.rs +++ b/crates/project/src/agent_server_store.rs @@ -9,7 +9,6 @@ use std::{ use anyhow::{Context as _, Result, bail}; use collections::HashMap; -use feature_flags::FeatureFlagAppExt as _; use fs::{Fs, RemoveOptions, RenameOptions}; use futures::StreamExt as _; use gpui::{ @@ -126,7 +125,6 @@ enum AgentServerStoreState { pub struct AgentServerStore { state: AgentServerStoreState, external_agents: HashMap>, - _feature_flag_subscription: Option, } pub struct AgentServersUpdated; @@ -206,34 +204,19 @@ impl AgentServerStore { .unwrap_or(true), }), ); - self.external_agents - .extend(new_settings.custom.iter().map(|(name, settings)| { - ( - ExternalAgentServerName(name.clone()), - Box::new(LocalCustomAgent { - command: settings.command.clone(), - project_environment: project_environment.clone(), - }) as Box, - ) - })); - - use feature_flags::FeatureFlagAppExt as _; - if cx.has_flag::() || new_settings.codex.is_some() { - self.external_agents.insert( - CODEX_NAME.into(), - Box::new(LocalCodex { - fs: fs.clone(), - project_environment: project_environment.clone(), - custom_command: new_settings - .codex - .clone() - .and_then(|settings| settings.custom_command()), - http_client: http_client.clone(), - is_remote: downstream_client.is_some(), - }), - ); - } - + self.external_agents.insert( + CODEX_NAME.into(), + Box::new(LocalCodex { + fs: fs.clone(), + project_environment: project_environment.clone(), + custom_command: new_settings + .codex + .clone() + .and_then(|settings| settings.custom_command()), + http_client: http_client.clone(), + is_remote: downstream_client.is_some(), + }), + ); self.external_agents.insert( CLAUDE_CODE_NAME.into(), Box::new(LocalClaudeCode { @@ -246,6 +229,16 @@ impl AgentServerStore { .and_then(|settings| settings.custom_command()), }), ); + self.external_agents + .extend(new_settings.custom.iter().map(|(name, settings)| { + ( + ExternalAgentServerName(name.clone()), + Box::new(LocalCustomAgent { + command: settings.command.clone(), + project_environment: project_environment.clone(), + }) as Box, + ) + })); *old_settings = Some(new_settings.clone()); @@ -274,13 +267,6 @@ impl AgentServerStore { let subscription = cx.observe_global::(|this, cx| { this.agent_servers_settings_changed(cx); }); - let this_handle = cx.weak_entity(); - let feature_flags_subscription = - cx.observe_flag::(move |_enabled, cx| { - let _ = this_handle.update(cx, |this, cx| { - this.reregister_agents(cx); - }); - }); let mut this = Self { state: AgentServerStoreState::Local { node_runtime, @@ -292,58 +278,49 @@ impl AgentServerStore { _subscriptions: [subscription], }, external_agents: Default::default(), - _feature_flag_subscription: Some(feature_flags_subscription), }; this.agent_servers_settings_changed(cx); this } - pub(crate) fn remote( - project_id: u64, - upstream_client: Entity, - cx: &mut Context, - ) -> Self { + pub(crate) fn remote(project_id: u64, upstream_client: Entity) -> Self { // Set up the builtin agents here so they're immediately available in // remote projects--we know that the HeadlessProject on the other end // will have them. - let mut external_agents = [ + let external_agents = [ ( - GEMINI_NAME.into(), + CLAUDE_CODE_NAME.into(), Box::new(RemoteExternalAgentServer { project_id, upstream_client: upstream_client.clone(), - name: GEMINI_NAME.into(), + name: CLAUDE_CODE_NAME.into(), status_tx: None, new_version_available_tx: None, }) as Box, ), ( - CLAUDE_CODE_NAME.into(), + CODEX_NAME.into(), Box::new(RemoteExternalAgentServer { project_id, upstream_client: upstream_client.clone(), - name: CLAUDE_CODE_NAME.into(), + name: CODEX_NAME.into(), status_tx: None, new_version_available_tx: None, }) as Box, ), - ] - .into_iter() - .collect::>>(); - - use feature_flags::FeatureFlagAppExt as _; - if cx.has_flag::() { - external_agents.insert( - CODEX_NAME.into(), + ( + GEMINI_NAME.into(), Box::new(RemoteExternalAgentServer { project_id, upstream_client: upstream_client.clone(), - name: CODEX_NAME.into(), + name: GEMINI_NAME.into(), status_tx: None, new_version_available_tx: None, }) as Box, - ); - } + ), + ] + .into_iter() + .collect(); Self { state: AgentServerStoreState::Remote { @@ -351,7 +328,6 @@ impl AgentServerStore { upstream_client, }, external_agents, - _feature_flag_subscription: None, } } @@ -359,7 +335,6 @@ impl AgentServerStore { Self { state: AgentServerStoreState::Collab, external_agents: Default::default(), - _feature_flag_subscription: None, } } diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index b303cae1ea0aa5e6215f871963af3154640b13a3..f6108ec05680522e51469e8e79a5417a4dd7daf1 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -1331,7 +1331,7 @@ impl Project { }); let agent_server_store = - cx.new(|cx| AgentServerStore::remote(REMOTE_SERVER_PROJECT_ID, remote.clone(), cx)); + cx.new(|_| AgentServerStore::remote(REMOTE_SERVER_PROJECT_ID, remote.clone())); cx.subscribe(&remote, Self::on_remote_client_event).detach(); diff --git a/crates/remote_server/src/remote_editing_tests.rs b/crates/remote_server/src/remote_editing_tests.rs index bd13598e3efda2f8addf3ff1685125b839c60f88..5ec297f85e3a569a9937ececdf75cb3116d23464 100644 --- a/crates/remote_server/src/remote_editing_tests.rs +++ b/crates/remote_server/src/remote_editing_tests.rs @@ -1792,7 +1792,7 @@ async fn test_remote_external_agent_server( .map(|name| name.to_string()) .collect::>() }); - pretty_assertions::assert_eq!(names, ["gemini", "codex", "claude"]); + pretty_assertions::assert_eq!(names, ["codex", "gemini", "claude"]); server_cx.update_global::(|settings_store, cx| { settings_store .set_server_settings(