1mod active_thread;
2mod assistant_configuration;
3mod assistant_diff;
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::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 _;
36
37pub use crate::active_thread::ActiveThread;
38use crate::assistant_configuration::{AddContextServerModal, ManageProfilesModal};
39pub use crate::assistant_panel::{AssistantPanel, ConcreteAssistantPanelDelegate};
40pub use crate::inline_assistant::InlineAssistant;
41pub use crate::thread::{Message, RequestKind, Thread, ThreadEvent};
42pub use crate::thread_store::ThreadStore;
43pub use assistant_diff::{AssistantDiff, AssistantDiffToolbar};
44
45actions!(
46 assistant2,
47 [
48 NewThread,
49 NewPromptEditor,
50 ToggleContextPicker,
51 ToggleProfileSelector,
52 RemoveAllContext,
53 OpenHistory,
54 OpenConfiguration,
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 OpenAssistantDiff,
69 ToggleKeep,
70 Reject,
71 RejectAll,
72 KeepAll
73 ]
74);
75
76#[derive(PartialEq, Clone, Default, Debug, Deserialize, JsonSchema)]
77pub struct ManageProfiles {
78 #[serde(default)]
79 pub customize_tools: Option<Arc<str>>,
80}
81
82impl ManageProfiles {
83 pub fn customize_tools(profile_id: Arc<str>) -> Self {
84 Self {
85 customize_tools: Some(profile_id),
86 }
87 }
88}
89
90impl_actions!(assistant, [ManageProfiles]);
91
92const NAMESPACE: &str = "assistant2";
93
94/// Initializes the `assistant2` crate.
95pub fn init(
96 fs: Arc<dyn Fs>,
97 client: Arc<Client>,
98 prompt_builder: Arc<PromptBuilder>,
99 cx: &mut App,
100) {
101 AssistantSettings::register(cx);
102 thread_store::init(cx);
103 assistant_panel::init(cx);
104
105 inline_assistant::init(
106 fs.clone(),
107 prompt_builder.clone(),
108 client.telemetry().clone(),
109 cx,
110 );
111 terminal_inline_assistant::init(
112 fs.clone(),
113 prompt_builder.clone(),
114 client.telemetry().clone(),
115 cx,
116 );
117 cx.observe_new(AddContextServerModal::register).detach();
118 cx.observe_new(ManageProfilesModal::register).detach();
119
120 feature_gate_assistant2_actions(cx);
121}
122
123fn feature_gate_assistant2_actions(cx: &mut App) {
124 CommandPaletteFilter::update_global(cx, |filter, _cx| {
125 filter.hide_namespace(NAMESPACE);
126 });
127
128 cx.observe_flag::<Assistant2FeatureFlag, _>(move |is_enabled, cx| {
129 if is_enabled {
130 CommandPaletteFilter::update_global(cx, |filter, _cx| {
131 filter.show_namespace(NAMESPACE);
132 });
133 } else {
134 CommandPaletteFilter::update_global(cx, |filter, _cx| {
135 filter.hide_namespace(NAMESPACE);
136 });
137 }
138 })
139 .detach();
140}