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