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