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