agent: Remove feature flag checks (#30055)

Marshall Bowers created

This PR removes all of the feature flag checks related to the Agent.

Tried to do this in the least invasive way possible; we can follow up
with a full removal.

Release Notes:

- N/A

Change summary

Cargo.lock                                                    |  4 
crates/agent/Cargo.toml                                       |  1 
crates/agent/src/assistant.rs                                 | 25 ---
crates/agent/src/inline_assistant.rs                          | 14 -
crates/agent/src/message_editor.rs                            | 13 -
crates/assistant/src/inline_assistant.rs                      | 36 +---
crates/assistant_context_editor/Cargo.toml                    |  1 
crates/assistant_context_editor/src/context_editor.rs         | 19 -
crates/assistant_settings/Cargo.toml                          |  1 
crates/assistant_settings/src/assistant_settings.rs           | 14 -
crates/assistant_tools/src/assistant_tools.rs                 |  3 
crates/feature_flags/src/feature_flags.rs                     | 35 ----
crates/language_model_selector/src/language_model_selector.rs | 13 -
crates/title_bar/Cargo.toml                                   |  1 
crates/title_bar/src/title_bar.rs                             | 31 +--
crates/zed/src/zed.rs                                         | 12 -
16 files changed, 45 insertions(+), 178 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -62,7 +62,6 @@ dependencies = [
  "chrono",
  "client",
  "collections",
- "command_palette_hooks",
  "component",
  "context_server",
  "convert_case 0.8.0",
@@ -547,7 +546,6 @@ dependencies = [
  "collections",
  "context_server",
  "editor",
- "feature_flags",
  "fs",
  "futures 0.3.31",
  "fuzzy",
@@ -597,7 +595,6 @@ dependencies = [
  "anyhow",
  "collections",
  "deepseek",
- "feature_flags",
  "fs",
  "gpui",
  "indexmap",
@@ -15088,7 +15085,6 @@ dependencies = [
  "client",
  "collections",
  "db",
- "feature_flags",
  "gpui",
  "http_client",
  "notifications",

crates/agent/Cargo.toml 🔗

@@ -29,7 +29,6 @@ buffer_diff.workspace = true
 chrono.workspace = true
 client.workspace = true
 collections.workspace = true
-command_palette_hooks.workspace = true
 component.workspace = true
 context_server.workspace = true
 convert_case.workspace = true

crates/agent/src/assistant.rs 🔗

@@ -29,8 +29,6 @@ use std::sync::Arc;
 
 use assistant_settings::{AgentProfileId, AssistantSettings};
 use client::Client;
-use command_palette_hooks::CommandPaletteFilter;
-use feature_flags::{Assistant2FeatureFlag, FeatureFlagAppExt};
 use fs::Fs;
 use gpui::{App, actions, impl_actions};
 use language::LanguageRegistry;
@@ -107,8 +105,6 @@ impl ManageProfiles {
 
 impl_actions!(agent, [NewThread, ManageProfiles]);
 
-const NAMESPACE: &str = "agent";
-
 /// Initializes the `agent` crate.
 pub fn init(
     fs: Arc<dyn Fs>,
@@ -136,25 +132,4 @@ pub fn init(
     );
     cx.observe_new(AddContextServerModal::register).detach();
     cx.observe_new(ManageProfilesModal::register).detach();
-
-    feature_gate_agent_actions(cx);
-}
-
-fn feature_gate_agent_actions(cx: &mut App) {
-    CommandPaletteFilter::update_global(cx, |filter, _cx| {
-        filter.hide_namespace(NAMESPACE);
-    });
-
-    cx.observe_flag::<Assistant2FeatureFlag, _>(move |is_enabled, cx| {
-        if is_enabled {
-            CommandPaletteFilter::update_global(cx, |filter, _cx| {
-                filter.show_namespace(NAMESPACE);
-            });
-        } else {
-            CommandPaletteFilter::update_global(cx, |filter, _cx| {
-                filter.hide_namespace(NAMESPACE);
-            });
-        }
-    })
-    .detach();
 }

crates/agent/src/inline_assistant.rs 🔗

@@ -17,7 +17,6 @@ use editor::{
         ToDisplayPoint,
     },
 };
-use feature_flags::{Assistant2FeatureFlag, FeatureFlagViewExt as _};
 use fs::Fs;
 use gpui::{
     App, Context, Entity, Focusable, Global, HighlightStyle, Subscription, Task, UpdateGlobal,
@@ -66,15 +65,6 @@ pub fn init(
         InlineAssistant::update_global(cx, |inline_assistant, cx| {
             inline_assistant.register_workspace(&workspace, window, cx)
         });
-
-        cx.observe_flag::<Assistant2FeatureFlag, _>(window, {
-            |is_assistant2_enabled, _workspace, _window, cx| {
-                InlineAssistant::update_global(cx, |inline_assistant, _cx| {
-                    inline_assistant.is_assistant2_enabled = is_assistant2_enabled;
-                });
-            }
-        })
-        .detach();
     })
     .detach();
 }
@@ -97,7 +87,6 @@ pub struct InlineAssistant {
     prompt_builder: Arc<PromptBuilder>,
     telemetry: Arc<Telemetry>,
     fs: Arc<dyn Fs>,
-    is_assistant2_enabled: bool,
 }
 
 impl Global for InlineAssistant {}
@@ -119,7 +108,6 @@ impl InlineAssistant {
             prompt_builder,
             telemetry,
             fs,
-            is_assistant2_enabled: false,
         }
     }
 
@@ -188,7 +176,7 @@ impl InlineAssistant {
         window: &mut Window,
         cx: &mut App,
     ) {
-        let is_assistant2_enabled = self.is_assistant2_enabled;
+        let is_assistant2_enabled = true;
 
         if let Some(editor) = item.act_as::<Editor>(cx) {
             editor.update(cx, |editor, cx| {

crates/agent/src/message_editor.rs 🔗

@@ -17,7 +17,6 @@ use editor::{
     AnchorRangeExt, ContextMenuOptions, ContextMenuPlacement, Editor, EditorElement, EditorEvent,
     EditorMode, EditorStyle, MultiBuffer,
 };
-use feature_flags::{FeatureFlagAppExt, NewBillingFeatureFlag};
 use file_icons::FileIcons;
 use fs::Fs;
 use futures::future::Shared;
@@ -464,10 +463,6 @@ impl MessageEditor {
     }
 
     fn render_max_mode_toggle(&self, cx: &mut Context<Self>) -> Option<AnyElement> {
-        if !cx.has_flag::<NewBillingFeatureFlag>() {
-            return None;
-        }
-
         let thread = self.thread.read(cx);
         let model = thread.configured_model();
         if !model?.model.supports_max_mode() {
@@ -1074,10 +1069,6 @@ impl MessageEditor {
     }
 
     fn render_usage_callout(&self, line_height: Pixels, cx: &mut Context<Self>) -> Option<Div> {
-        if !cx.has_flag::<NewBillingFeatureFlag>() {
-            return None;
-        }
-
         let is_using_zed_provider = self
             .thread
             .read(cx)
@@ -1139,10 +1130,6 @@ impl MessageEditor {
         token_usage_ratio: TokenUsageRatio,
         cx: &mut Context<Self>,
     ) -> Option<Div> {
-        if !cx.has_flag::<NewBillingFeatureFlag>() {
-            return None;
-        }
-
         let title = if token_usage_ratio == TokenUsageRatio::Exceeded {
             "Thread reached the token limit"
         } else {

crates/assistant/src/inline_assistant.rs 🔗

@@ -17,9 +17,7 @@ use editor::{
         ToDisplayPoint,
     },
 };
-use feature_flags::{
-    Assistant2FeatureFlag, FeatureFlagAppExt as _, FeatureFlagViewExt as _, ZedProFeatureFlag,
-};
+use feature_flags::{FeatureFlagAppExt as _, ZedProFeatureFlag};
 use fs::Fs;
 use futures::{
     SinkExt, Stream, StreamExt, TryStreamExt as _,
@@ -74,25 +72,19 @@ pub fn init(
     cx: &mut App,
 ) {
     cx.set_global(InlineAssistant::new(fs, prompt_builder, telemetry));
-    cx.observe_new(|_, window, cx| {
-        let Some(window) = window else {
-            return;
-        };
-        let workspace = cx.entity().clone();
-        InlineAssistant::update_global(cx, |inline_assistant, cx| {
-            inline_assistant.register_workspace(&workspace, window, cx)
-        });
-
-        cx.observe_flag::<Assistant2FeatureFlag, _>(window, {
-            |is_assistant2_enabled, _workspace, _window, cx| {
-                InlineAssistant::update_global(cx, |inline_assistant, _cx| {
-                    inline_assistant.is_assistant2_enabled = is_assistant2_enabled;
-                });
-            }
+    // Don't register now that the Agent is released.
+    if false {
+        cx.observe_new(|_, window, cx| {
+            let Some(window) = window else {
+                return;
+            };
+            let workspace = cx.entity().clone();
+            InlineAssistant::update_global(cx, |inline_assistant, cx| {
+                inline_assistant.register_workspace(&workspace, window, cx)
+            });
         })
         .detach();
-    })
-    .detach();
+    }
 }
 
 const PROMPT_HISTORY_MAX_LEN: usize = 20;
@@ -108,7 +100,6 @@ pub struct InlineAssistant {
     prompt_builder: Arc<PromptBuilder>,
     telemetry: Arc<Telemetry>,
     fs: Arc<dyn Fs>,
-    is_assistant2_enabled: bool,
 }
 
 impl Global for InlineAssistant {}
@@ -130,7 +121,6 @@ impl InlineAssistant {
             prompt_builder,
             telemetry,
             fs,
-            is_assistant2_enabled: false,
         }
     }
 
@@ -199,7 +189,7 @@ impl InlineAssistant {
         window: &mut Window,
         cx: &mut App,
     ) {
-        let is_assistant2_enabled = self.is_assistant2_enabled;
+        let is_assistant2_enabled = true;
 
         if let Some(editor) = item.act_as::<Editor>(cx) {
             editor.update(cx, |editor, cx| {

crates/assistant_context_editor/Cargo.toml 🔗

@@ -22,7 +22,6 @@ clock.workspace = true
 collections.workspace = true
 context_server.workspace = true
 editor.workspace = true
-feature_flags.workspace = true
 fs.workspace = true
 futures.workspace = true
 fuzzy.workspace = true

crates/assistant_context_editor/src/context_editor.rs 🔗

@@ -18,7 +18,6 @@ use editor::{
     scroll::Autoscroll,
 };
 use editor::{FoldPlaceholder, display_map::CreaseId};
-use feature_flags::{Assistant2FeatureFlag, FeatureFlagAppExt as _};
 use fs::Fs;
 use futures::FutureExt;
 use gpui::{
@@ -2395,19 +2394,11 @@ impl ContextEditor {
                             .on_click({
                                 let focus_handle = self.focus_handle(cx).clone();
                                 move |_event, window, cx| {
-                                    if cx.has_flag::<Assistant2FeatureFlag>() {
-                                        focus_handle.dispatch_action(
-                                            &zed_actions::agent::OpenConfiguration,
-                                            window,
-                                            cx,
-                                        );
-                                    } else {
-                                        focus_handle.dispatch_action(
-                                            &zed_actions::assistant::ShowConfiguration,
-                                            window,
-                                            cx,
-                                        );
-                                    };
+                                    focus_handle.dispatch_action(
+                                        &zed_actions::agent::OpenConfiguration,
+                                        window,
+                                        cx,
+                                    );
                                 }
                             }),
                     )

crates/assistant_settings/Cargo.toml 🔗

@@ -15,7 +15,6 @@ path = "src/assistant_settings.rs"
 anthropic = { workspace = true, features = ["schemars"] }
 anyhow.workspace = true
 collections.workspace = true
-feature_flags.workspace = true
 gpui.workspace = true
 indexmap.workspace = true
 language_model.workspace = true

crates/assistant_settings/src/assistant_settings.rs 🔗

@@ -7,7 +7,6 @@ use anthropic::Model as AnthropicModel;
 use anyhow::{Result, bail};
 use collections::IndexMap;
 use deepseek::Model as DeepseekModel;
-use feature_flags::{AgentStreamEditsFeatureFlag, Assistant2FeatureFlag, FeatureFlagAppExt};
 use gpui::{App, Pixels, SharedString};
 use language_model::{CloudModel, LanguageModel};
 use lmstudio::Model as LmStudioModel;
@@ -107,16 +106,13 @@ impl AssistantSettings {
             .and_then(|m| m.temperature)
     }
 
-    pub fn stream_edits(&self, cx: &App) -> bool {
-        cx.has_flag::<AgentStreamEditsFeatureFlag>() || self.stream_edits
+    pub fn stream_edits(&self, _cx: &App) -> bool {
+        // TODO: Remove the `stream_edits` setting.
+        true
     }
 
-    pub fn are_live_diffs_enabled(&self, cx: &App) -> bool {
-        if cx.has_flag::<Assistant2FeatureFlag>() {
-            return false;
-        }
-
-        cx.is_staff() || self.enable_experimental_live_diffs
+    pub fn are_live_diffs_enabled(&self, _cx: &App) -> bool {
+        false
     }
 
     pub fn set_inline_assistant_model(&mut self, provider: String, model: String) {

crates/assistant_tools/src/assistant_tools.rs 🔗

@@ -27,7 +27,6 @@ use std::sync::Arc;
 use assistant_settings::AssistantSettings;
 use assistant_tool::ToolRegistry;
 use copy_path_tool::CopyPathTool;
-use feature_flags::{AgentStreamEditsFeatureFlag, FeatureFlagAppExt};
 use gpui::{App, Entity};
 use http_client::HttpClientWithUrl;
 use language_model::LanguageModelRegistry;
@@ -77,8 +76,6 @@ pub fn init(http_client: Arc<HttpClientWithUrl>, cx: &mut App) {
     registry.register_tool(FetchTool::new(http_client));
 
     register_edit_file_tool(cx);
-    cx.observe_flag::<AgentStreamEditsFeatureFlag, _>(|_, cx| register_edit_file_tool(cx))
-        .detach();
     cx.observe_global::<SettingsStore>(register_edit_file_tool)
         .detach();
 

crates/feature_flags/src/feature_flags.rs 🔗

@@ -56,41 +56,6 @@ pub trait FeatureFlag {
     }
 }
 
-/// Controls the values of various feature flags for the Agent launch.
-///
-/// Change this to `true` when we're ready to build the release candidate.
-const AGENT_LAUNCH: bool = true;
-
-pub struct Assistant2FeatureFlag;
-
-impl FeatureFlag for Assistant2FeatureFlag {
-    const NAME: &'static str = "assistant2";
-
-    fn enabled_for_all() -> bool {
-        AGENT_LAUNCH
-    }
-}
-
-pub struct AgentStreamEditsFeatureFlag;
-
-impl FeatureFlag for AgentStreamEditsFeatureFlag {
-    const NAME: &'static str = "agent-stream-edits";
-
-    fn enabled_for_all() -> bool {
-        AGENT_LAUNCH
-    }
-}
-
-pub struct NewBillingFeatureFlag;
-
-impl FeatureFlag for NewBillingFeatureFlag {
-    const NAME: &'static str = "new-billing";
-
-    fn enabled_for_all() -> bool {
-        AGENT_LAUNCH
-    }
-}
-
 pub struct PredictEditsRateCompletionsFeatureFlag;
 impl FeatureFlag for PredictEditsRateCompletionsFeatureFlag {
     const NAME: &'static str = "predict-edits-rate-completions";

crates/language_model_selector/src/language_model_selector.rs 🔗

@@ -1,7 +1,7 @@
 use std::sync::Arc;
 
 use collections::{HashSet, IndexMap};
-use feature_flags::{Assistant2FeatureFlag, ZedProFeatureFlag};
+use feature_flags::ZedProFeatureFlag;
 use gpui::{
     Action, AnyElement, AnyView, App, Corner, DismissEvent, Entity, EventEmitter, FocusHandle,
     Focusable, Subscription, Task, WeakEntity, action_with_deprecated_aliases,
@@ -597,13 +597,10 @@ impl PickerDelegate for LanguageModelPickerDelegate {
                         .icon_color(Color::Muted)
                         .icon_position(IconPosition::Start)
                         .on_click(|_, window, cx| {
-                            let configure_action = if cx.has_flag::<Assistant2FeatureFlag>() {
-                                zed_actions::agent::OpenConfiguration.boxed_clone()
-                            } else {
-                                zed_actions::assistant::ShowConfiguration.boxed_clone()
-                            };
-
-                            window.dispatch_action(configure_action, cx);
+                            window.dispatch_action(
+                                zed_actions::agent::OpenConfiguration.boxed_clone(),
+                                cx,
+                            );
                         }),
                 )
                 .into_any(),

crates/title_bar/Cargo.toml 🔗

@@ -32,7 +32,6 @@ call.workspace = true
 chrono.workspace = true
 client.workspace = true
 db.workspace = true
-feature_flags.workspace = true
 gpui.workspace = true
 notifications.workspace = true
 project.workspace = true

crates/title_bar/src/title_bar.rs 🔗

@@ -19,7 +19,6 @@ use crate::platforms::{platform_linux, platform_mac, platform_windows};
 use auto_update::AutoUpdateStatus;
 use call::ActiveCall;
 use client::{Client, UserStore};
-use feature_flags::{FeatureFlagAppExt, NewBillingFeatureFlag};
 use gpui::{
     Action, AnyElement, App, Context, Corner, Decorations, Element, Entity, InteractiveElement,
     Interactivity, IntoElement, MouseButton, ParentElement, Render, Stateful,
@@ -678,22 +677,20 @@ impl TitleBar {
             PopoverMenu::new("user-menu")
                 .anchor(Corner::TopRight)
                 .menu(move |window, cx| {
-                    ContextMenu::build(window, cx, |menu, _, cx| {
-                        menu.when(cx.has_flag::<NewBillingFeatureFlag>(), |menu| {
-                            menu.action(
-                                format!(
-                                    "Current Plan: {}",
-                                    match plan {
-                                        None => "",
-                                        Some(proto::Plan::Free) => "Free",
-                                        Some(proto::Plan::ZedPro) => "Pro",
-                                        Some(proto::Plan::ZedProTrial) => "Pro (Trial)",
-                                    }
-                                ),
-                                zed_actions::OpenAccountSettings.boxed_clone(),
-                            )
-                            .separator()
-                        })
+                    ContextMenu::build(window, cx, |menu, _, _cx| {
+                        menu.action(
+                            format!(
+                                "Current Plan: {}",
+                                match plan {
+                                    None => "",
+                                    Some(proto::Plan::Free) => "Free",
+                                    Some(proto::Plan::ZedPro) => "Pro",
+                                    Some(proto::Plan::ZedProTrial) => "Pro (Trial)",
+                                }
+                            ),
+                            zed_actions::OpenAccountSettings.boxed_clone(),
+                        )
+                        .separator()
                         .action("Settings", zed_actions::OpenSettings.boxed_clone())
                         .action("Key Bindings", Box::new(zed_actions::OpenKeymap))
                         .action(

crates/zed/src/zed.rs 🔗

@@ -19,7 +19,7 @@ use collections::VecDeque;
 use debugger_ui::debugger_panel::DebugPanel;
 use editor::ProposedChangesEditorToolbar;
 use editor::{Editor, MultiBuffer, scroll::Autoscroll};
-use feature_flags::{DebuggerFeatureFlag, FeatureFlagAppExt, FeatureFlagViewExt};
+use feature_flags::{DebuggerFeatureFlag, FeatureFlagViewExt};
 use futures::{StreamExt, channel::mpsc, select_biased};
 use git_ui::git_panel::GitPanel;
 use git_ui::project_diff::ProjectDiffToolbar;
@@ -53,7 +53,6 @@ use settings::{
 };
 use std::path::PathBuf;
 use std::sync::atomic::{self, AtomicBool};
-use std::time::Duration;
 use std::{borrow::Cow, path::Path, sync::Arc};
 use terminal_view::terminal_panel::{self, TerminalPanel};
 use theme::{ActiveTheme, ThemeSettings};
@@ -373,9 +372,6 @@ fn initialize_panels(
     window: &mut Window,
     cx: &mut Context<Workspace>,
 ) {
-    let assistant2_feature_flag =
-        cx.wait_for_flag_or_timeout::<feature_flags::Assistant2FeatureFlag>(Duration::from_secs(5));
-
     let prompt_builder = prompt_builder.clone();
 
     cx.spawn_in(window, async move |workspace_handle, cx| {
@@ -436,11 +432,7 @@ fn initialize_panels(
             workspace.add_panel(git_panel, window, cx);
         })?;
 
-        let is_assistant2_enabled = if cfg!(test) {
-            false
-        } else {
-            assistant2_feature_flag.await
-        };
+        let is_assistant2_enabled = !cfg!(test);
 
         let (assistant_panel, assistant2_panel) = if is_assistant2_enabled {
             let assistant2_panel =