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