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