1mod active_thread;
2mod assistant_configuration;
3mod assistant_model_selector;
4mod assistant_panel;
5mod buffer_codegen;
6mod context;
7mod context_picker;
8mod context_store;
9mod context_strip;
10mod history_store;
11mod inline_assistant;
12mod inline_prompt_editor;
13mod message_editor;
14mod terminal_codegen;
15mod terminal_inline_assistant;
16mod thread;
17mod thread_history;
18mod thread_store;
19mod tool_use;
20mod ui;
21
22use std::sync::Arc;
23
24use assistant_settings::AssistantSettings;
25use client::Client;
26use command_palette_hooks::CommandPaletteFilter;
27use feature_flags::{Assistant2FeatureFlag, FeatureFlagAppExt};
28use fs::Fs;
29use gpui::{actions, App};
30use prompt_store::PromptBuilder;
31use settings::Settings as _;
32
33pub use crate::assistant_panel::{AssistantPanel, ConcreteAssistantPanelDelegate};
34pub use crate::inline_assistant::InlineAssistant;
35
36actions!(
37 assistant2,
38 [
39 NewThread,
40 NewPromptEditor,
41 ToggleContextPicker,
42 RemoveAllContext,
43 OpenHistory,
44 OpenConfiguration,
45 RemoveSelectedThread,
46 Chat,
47 ChatMode,
48 CycleNextInlineAssist,
49 CyclePreviousInlineAssist,
50 FocusUp,
51 FocusDown,
52 FocusLeft,
53 FocusRight,
54 RemoveFocusedContext,
55 AcceptSuggestedContext
56 ]
57);
58
59const NAMESPACE: &str = "assistant2";
60
61/// Initializes the `assistant2` crate.
62pub fn init(
63 fs: Arc<dyn Fs>,
64 client: Arc<Client>,
65 prompt_builder: Arc<PromptBuilder>,
66 cx: &mut App,
67) {
68 AssistantSettings::register(cx);
69 thread_store::init(cx);
70 assistant_panel::init(cx);
71
72 inline_assistant::init(
73 fs.clone(),
74 prompt_builder.clone(),
75 client.telemetry().clone(),
76 cx,
77 );
78 terminal_inline_assistant::init(
79 fs.clone(),
80 prompt_builder.clone(),
81 client.telemetry().clone(),
82 cx,
83 );
84
85 feature_gate_assistant2_actions(cx);
86}
87
88fn feature_gate_assistant2_actions(cx: &mut App) {
89 CommandPaletteFilter::update_global(cx, |filter, _cx| {
90 filter.hide_namespace(NAMESPACE);
91 });
92
93 cx.observe_flag::<Assistant2FeatureFlag, _>(move |is_enabled, cx| {
94 if is_enabled {
95 CommandPaletteFilter::update_global(cx, |filter, _cx| {
96 filter.show_namespace(NAMESPACE);
97 });
98 } else {
99 CommandPaletteFilter::update_global(cx, |filter, _cx| {
100 filter.hide_namespace(NAMESPACE);
101 });
102 }
103 })
104 .detach();
105}