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