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