assistant.rs

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