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