assistant.rs

  1mod active_thread;
  2mod agent_diff;
  3mod assistant_configuration;
  4mod assistant_model_selector;
  5mod assistant_panel;
  6mod buffer_codegen;
  7mod context;
  8mod context_picker;
  9mod context_store;
 10mod context_strip;
 11mod history_store;
 12mod inline_assistant;
 13mod inline_prompt_editor;
 14mod message_editor;
 15mod profile_selector;
 16mod terminal_codegen;
 17mod terminal_inline_assistant;
 18mod thread;
 19mod thread_history;
 20mod thread_store;
 21mod tool_use;
 22mod ui;
 23
 24use std::sync::Arc;
 25
 26use assistant_settings::{AgentProfileId, AssistantSettings};
 27use client::Client;
 28use command_palette_hooks::CommandPaletteFilter;
 29use feature_flags::{Assistant2FeatureFlag, FeatureFlagAppExt};
 30use fs::Fs;
 31use gpui::{App, actions, impl_actions};
 32use prompt_store::PromptBuilder;
 33use schemars::JsonSchema;
 34use serde::Deserialize;
 35use settings::Settings as _;
 36use thread::ThreadId;
 37
 38pub use crate::active_thread::ActiveThread;
 39use crate::assistant_configuration::{AddContextServerModal, ManageProfilesModal};
 40pub use crate::assistant_panel::{AssistantPanel, ConcreteAssistantPanelDelegate};
 41pub use crate::inline_assistant::InlineAssistant;
 42pub use crate::thread::{Message, RequestKind, Thread, ThreadEvent};
 43pub use crate::thread_store::ThreadStore;
 44pub use agent_diff::{AgentDiff, AgentDiffToolbar};
 45
 46actions!(
 47    agent,
 48    [
 49        NewTextThread,
 50        ToggleContextPicker,
 51        ToggleProfileSelector,
 52        RemoveAllContext,
 53        ExpandMessageEditor,
 54        OpenHistory,
 55        AddContextServer,
 56        RemoveSelectedThread,
 57        Chat,
 58        ChatMode,
 59        CycleNextInlineAssist,
 60        CyclePreviousInlineAssist,
 61        FocusUp,
 62        FocusDown,
 63        FocusLeft,
 64        FocusRight,
 65        RemoveFocusedContext,
 66        AcceptSuggestedContext,
 67        OpenActiveThreadAsMarkdown,
 68        OpenAgentDiff,
 69        Keep,
 70        Reject,
 71        RejectAll,
 72        KeepAll
 73    ]
 74);
 75
 76#[derive(Default, Clone, PartialEq, Deserialize, JsonSchema)]
 77pub struct NewThread {
 78    #[serde(default)]
 79    from_thread_id: Option<ThreadId>,
 80}
 81
 82#[derive(PartialEq, Clone, Default, Debug, Deserialize, JsonSchema)]
 83pub struct ManageProfiles {
 84    #[serde(default)]
 85    pub customize_tools: Option<AgentProfileId>,
 86}
 87
 88impl ManageProfiles {
 89    pub fn customize_tools(profile_id: AgentProfileId) -> Self {
 90        Self {
 91            customize_tools: Some(profile_id),
 92        }
 93    }
 94}
 95
 96impl_actions!(agent, [NewThread, ManageProfiles]);
 97
 98const NAMESPACE: &str = "agent";
 99
100/// Initializes the `agent` crate.
101pub fn init(
102    fs: Arc<dyn Fs>,
103    client: Arc<Client>,
104    prompt_builder: Arc<PromptBuilder>,
105    cx: &mut App,
106) {
107    AssistantSettings::register(cx);
108    thread_store::init(cx);
109    assistant_panel::init(cx);
110
111    inline_assistant::init(
112        fs.clone(),
113        prompt_builder.clone(),
114        client.telemetry().clone(),
115        cx,
116    );
117    terminal_inline_assistant::init(
118        fs.clone(),
119        prompt_builder.clone(),
120        client.telemetry().clone(),
121        cx,
122    );
123    cx.observe_new(AddContextServerModal::register).detach();
124    cx.observe_new(ManageProfilesModal::register).detach();
125
126    feature_gate_agent_actions(cx);
127}
128
129fn feature_gate_agent_actions(cx: &mut App) {
130    CommandPaletteFilter::update_global(cx, |filter, _cx| {
131        filter.hide_namespace(NAMESPACE);
132    });
133
134    cx.observe_flag::<Assistant2FeatureFlag, _>(move |is_enabled, cx| {
135        if is_enabled {
136            CommandPaletteFilter::update_global(cx, |filter, _cx| {
137                filter.show_namespace(NAMESPACE);
138            });
139        } else {
140            CommandPaletteFilter::update_global(cx, |filter, _cx| {
141                filter.hide_namespace(NAMESPACE);
142            });
143        }
144    })
145    .detach();
146}