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::{actions, impl_actions, App};
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 ToggleKeep,
69 Reject,
70 RejectAll,
71 KeepAll
72 ]
73);
74
75#[derive(PartialEq, Clone, Default, Debug, Deserialize, JsonSchema)]
76pub struct ManageProfiles {
77 #[serde(default)]
78 pub customize_tools: Option<Arc<str>>,
79}
80
81impl ManageProfiles {
82 pub fn customize_tools(profile_id: Arc<str>) -> Self {
83 Self {
84 customize_tools: Some(profile_id),
85 }
86 }
87}
88
89impl_actions!(assistant, [ManageProfiles]);
90
91const NAMESPACE: &str = "assistant2";
92
93/// Initializes the `assistant2` crate.
94pub fn init(
95 fs: Arc<dyn Fs>,
96 client: Arc<Client>,
97 prompt_builder: Arc<PromptBuilder>,
98 cx: &mut App,
99) {
100 AssistantSettings::register(cx);
101 thread_store::init(cx);
102 assistant_panel::init(cx);
103
104 inline_assistant::init(
105 fs.clone(),
106 prompt_builder.clone(),
107 client.telemetry().clone(),
108 cx,
109 );
110 terminal_inline_assistant::init(
111 fs.clone(),
112 prompt_builder.clone(),
113 client.telemetry().clone(),
114 cx,
115 );
116 cx.observe_new(AddContextServerModal::register).detach();
117 cx.observe_new(ManageProfilesModal::register).detach();
118
119 feature_gate_assistant2_actions(cx);
120}
121
122fn feature_gate_assistant2_actions(cx: &mut App) {
123 CommandPaletteFilter::update_global(cx, |filter, _cx| {
124 filter.hide_namespace(NAMESPACE);
125 });
126
127 cx.observe_flag::<Assistant2FeatureFlag, _>(move |is_enabled, cx| {
128 if is_enabled {
129 CommandPaletteFilter::update_global(cx, |filter, _cx| {
130 filter.show_namespace(NAMESPACE);
131 });
132 } else {
133 CommandPaletteFilter::update_global(cx, |filter, _cx| {
134 filter.hide_namespace(NAMESPACE);
135 });
136 }
137 })
138 .detach();
139}