diff --git a/Cargo.lock b/Cargo.lock index 01293ca7ff014d5210b064a32706c1f5ab10767f..cbc83f81168b43049a6bd7bf2fcfd5514f3f3a77 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15711,6 +15711,7 @@ dependencies = [ "edit_prediction", "edit_prediction_ui", "editor", + "feature_flags", "fs", "futures 0.3.31", "fuzzy", diff --git a/assets/settings/default.json b/assets/settings/default.json index 7af6ce7e44d9abde7b29c80bb170cd13f3c2e786..29bddd6b3df1af14e66ed3a0aff2e3d8c0cb59d4 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -1083,6 +1083,10 @@ "tools": {}, }, }, + // Whether to start a new thread in the current local project or in a new Git worktree. + // + // Default: local_project + "new_thread_location": "local_project", // Where to show notifications when the agent has either completed // its response, or else needs confirmation before it can run a // tool action. diff --git a/crates/settings_content/src/agent.rs b/crates/settings_content/src/agent.rs index 8061e591b0a3f81e8b8081a0b363c112fb388ce4..1b71f9b33c58b6980431d25f2af51007ae861a1c 100644 --- a/crates/settings_content/src/agent.rs +++ b/crates/settings_content/src/agent.rs @@ -11,7 +11,18 @@ use crate::DockPosition; /// Where new threads should start by default. #[derive( - Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema, MergeFrom, + Clone, + Copy, + Debug, + Default, + PartialEq, + Eq, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, )] #[serde(rename_all = "snake_case")] pub enum NewThreadLocation { diff --git a/crates/settings_ui/Cargo.toml b/crates/settings_ui/Cargo.toml index 66fefed910cc85e22e731fe9470d2ee511364336..7632c2857a41ba43fe7d2b2d517752f53b8f694d 100644 --- a/crates/settings_ui/Cargo.toml +++ b/crates/settings_ui/Cargo.toml @@ -28,6 +28,7 @@ cpal.workspace = true edit_prediction.workspace = true edit_prediction_ui.workspace = true editor.workspace = true +feature_flags.workspace = true fs.workspace = true futures.workspace = true fuzzy.workspace = true diff --git a/crates/settings_ui/src/page_data.rs b/crates/settings_ui/src/page_data.rs index 9243e14521010c5b3aa2a9092c6e0a687a989306..5a8e1c1440c7899269fe0382c03b0068937781b5 100644 --- a/crates/settings_ui/src/page_data.rs +++ b/crates/settings_ui/src/page_data.rs @@ -1,3 +1,4 @@ +use feature_flags::{AgentV2FeatureFlag, FeatureFlagAppExt as _}; use gpui::{Action as _, App}; use itertools::Itertools as _; use settings::{ @@ -74,7 +75,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec { terminal_page(), version_control_page(), collaboration_page(), - ai_page(), + ai_page(cx), network_page(), ] } @@ -6978,7 +6979,7 @@ fn collaboration_page() -> SettingsPage { } } -fn ai_page() -> SettingsPage { +fn ai_page(cx: &App) -> SettingsPage { fn general_section() -> [SettingsPageItem; 2] { [ SettingsPageItem::SectionHeader("General"), @@ -6998,8 +6999,8 @@ fn ai_page() -> SettingsPage { ] } - fn agent_configuration_section() -> [SettingsPageItem; 13] { - [ + fn agent_configuration_section(cx: &App) -> Box<[SettingsPageItem]> { + let mut items = vec![ SettingsPageItem::SectionHeader("Agent Configuration"), SettingsPageItem::SubPageLink(SubPageLink { title: "Tool Permissions".into(), @@ -7010,11 +7011,14 @@ fn ai_page() -> SettingsPage { files: USER, render: render_tool_permissions_setup_page, }), - SettingsPageItem::SettingItem(SettingItem { + ]; + + if cx.has_flag::() { + items.push(SettingsPageItem::SettingItem(SettingItem { title: "New Thread Location", description: "Whether to start a new thread in the current local project or in a new Git worktree.", field: Box::new(SettingField { - json_path: Some("agent.default_start_thread_in"), + json_path: Some("agent.new_thread_location"), pick: |settings_content| { settings_content .agent @@ -7031,7 +7035,10 @@ fn ai_page() -> SettingsPage { }), metadata: None, files: USER, - }), + })); + } + + items.extend([ SettingsPageItem::SettingItem(SettingItem { title: "Single File Review", description: "When enabled, agent edits will also be displayed in single-file buffers for review.", @@ -7236,7 +7243,9 @@ fn ai_page() -> SettingsPage { metadata: None, files: USER, }), - ] + ]); + + items.into_boxed_slice() } fn context_servers_section() -> [SettingsPageItem; 2] { @@ -7321,7 +7330,7 @@ fn ai_page() -> SettingsPage { title: "AI", items: concat_sections![ general_section(), - agent_configuration_section(), + agent_configuration_section(cx), context_servers_section(), edit_prediction_language_settings_section(), edit_prediction_display_sub_section() diff --git a/crates/settings_ui/src/settings_ui.rs b/crates/settings_ui/src/settings_ui.rs index 26417a5469955cd89a12564248e36be288004a15..6388dc5a283656e89d805455732a0044cf43e353 100644 --- a/crates/settings_ui/src/settings_ui.rs +++ b/crates/settings_ui/src/settings_ui.rs @@ -530,7 +530,7 @@ fn init_renderers(cx: &mut App) { .add_basic_renderer::(render_dropdown) .add_basic_renderer::(render_dropdown) .add_basic_renderer::(render_dropdown) - .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) .add_basic_renderer::(render_dropdown) .add_basic_renderer::(render_dropdown) .add_basic_renderer::(render_dropdown)