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::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 ]
85);
86
87#[derive(Default, Clone, PartialEq, Deserialize, JsonSchema)]
88pub struct NewThread {
89 #[serde(default)]
90 from_thread_id: Option<ThreadId>,
91}
92
93#[derive(PartialEq, Clone, Default, Debug, Deserialize, JsonSchema)]
94pub struct ManageProfiles {
95 #[serde(default)]
96 pub customize_tools: Option<AgentProfileId>,
97}
98
99impl ManageProfiles {
100 pub fn customize_tools(profile_id: AgentProfileId) -> Self {
101 Self {
102 customize_tools: Some(profile_id),
103 }
104 }
105}
106
107impl_actions!(agent, [NewThread, ManageProfiles]);
108
109const NAMESPACE: &str = "agent";
110
111/// Initializes the `agent` crate.
112pub fn init(
113 fs: Arc<dyn Fs>,
114 client: Arc<Client>,
115 prompt_builder: Arc<PromptBuilder>,
116 language_registry: Arc<LanguageRegistry>,
117 cx: &mut App,
118) {
119 AssistantSettings::register(cx);
120 thread_store::init(cx);
121 assistant_panel::init(cx);
122 context_server_configuration::init(language_registry, cx);
123
124 inline_assistant::init(
125 fs.clone(),
126 prompt_builder.clone(),
127 client.telemetry().clone(),
128 cx,
129 );
130 terminal_inline_assistant::init(
131 fs.clone(),
132 prompt_builder.clone(),
133 client.telemetry().clone(),
134 cx,
135 );
136 cx.observe_new(AddContextServerModal::register).detach();
137 cx.observe_new(ManageProfilesModal::register).detach();
138
139 feature_gate_agent_actions(cx);
140}
141
142fn feature_gate_agent_actions(cx: &mut App) {
143 CommandPaletteFilter::update_global(cx, |filter, _cx| {
144 filter.hide_namespace(NAMESPACE);
145 });
146
147 cx.observe_flag::<Assistant2FeatureFlag, _>(move |is_enabled, cx| {
148 if is_enabled {
149 CommandPaletteFilter::update_global(cx, |filter, _cx| {
150 filter.show_namespace(NAMESPACE);
151 });
152 } else {
153 CommandPaletteFilter::update_global(cx, |filter, _cx| {
154 filter.hide_namespace(NAMESPACE);
155 });
156 }
157 })
158 .detach();
159}