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