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