1mod active_thread;
2mod assistant_configuration;
3mod assistant_diff;
4mod assistant_model_selector;
5mod assistant_panel;
6mod buffer_codegen;
7mod context;
8mod context_picker;
9mod context_store;
10mod context_strip;
11mod history_store;
12mod inline_assistant;
13mod inline_prompt_editor;
14mod message_editor;
15mod profile_selector;
16mod terminal_codegen;
17mod terminal_inline_assistant;
18mod thread;
19mod thread_history;
20mod thread_store;
21mod tool_use;
22mod ui;
23
24use std::sync::Arc;
25
26use assistant_settings::AssistantSettings;
27use client::Client;
28use command_palette_hooks::CommandPaletteFilter;
29use feature_flags::{Assistant2FeatureFlag, FeatureFlagAppExt};
30use fs::Fs;
31use gpui::{actions, impl_actions, App};
32use prompt_store::PromptBuilder;
33use schemars::JsonSchema;
34use serde::Deserialize;
35use settings::Settings as _;
36
37pub use crate::active_thread::ActiveThread;
38use crate::assistant_configuration::{AddContextServerModal, ManageProfilesModal};
39pub use crate::assistant_panel::{AssistantPanel, ConcreteAssistantPanelDelegate};
40pub use crate::inline_assistant::InlineAssistant;
41pub use crate::thread::{Message, RequestKind, Thread, ThreadEvent};
42pub use crate::thread_store::ThreadStore;
43pub use assistant_diff::AssistantDiff;
44
45actions!(
46 assistant2,
47 [
48 NewThread,
49 NewPromptEditor,
50 ToggleContextPicker,
51 ToggleProfileSelector,
52 RemoveAllContext,
53 OpenHistory,
54 OpenConfiguration,
55 AddContextServer,
56 RemoveSelectedThread,
57 Chat,
58 ChatMode,
59 CycleNextInlineAssist,
60 CyclePreviousInlineAssist,
61 FocusUp,
62 FocusDown,
63 FocusLeft,
64 FocusRight,
65 RemoveFocusedContext,
66 AcceptSuggestedContext,
67 OpenActiveThreadAsMarkdown,
68 ToggleKeep,
69 Reject
70 ]
71);
72
73#[derive(PartialEq, Clone, Default, Debug, Deserialize, JsonSchema)]
74pub struct ManageProfiles {
75 #[serde(default)]
76 pub customize_tools: Option<Arc<str>>,
77}
78
79impl ManageProfiles {
80 pub fn customize_tools(profile_id: Arc<str>) -> Self {
81 Self {
82 customize_tools: Some(profile_id),
83 }
84 }
85}
86
87impl_actions!(assistant, [ManageProfiles]);
88
89const NAMESPACE: &str = "assistant2";
90
91/// Initializes the `assistant2` crate.
92pub fn init(
93 fs: Arc<dyn Fs>,
94 client: Arc<Client>,
95 prompt_builder: Arc<PromptBuilder>,
96 cx: &mut App,
97) {
98 AssistantSettings::register(cx);
99 thread_store::init(cx);
100 assistant_panel::init(cx);
101
102 inline_assistant::init(
103 fs.clone(),
104 prompt_builder.clone(),
105 client.telemetry().clone(),
106 cx,
107 );
108 terminal_inline_assistant::init(
109 fs.clone(),
110 prompt_builder.clone(),
111 client.telemetry().clone(),
112 cx,
113 );
114 cx.observe_new(AddContextServerModal::register).detach();
115 cx.observe_new(ManageProfilesModal::register).detach();
116
117 feature_gate_assistant2_actions(cx);
118}
119
120fn feature_gate_assistant2_actions(cx: &mut App) {
121 CommandPaletteFilter::update_global(cx, |filter, _cx| {
122 filter.hide_namespace(NAMESPACE);
123 });
124
125 cx.observe_flag::<Assistant2FeatureFlag, _>(move |is_enabled, cx| {
126 if is_enabled {
127 CommandPaletteFilter::update_global(cx, |filter, _cx| {
128 filter.show_namespace(NAMESPACE);
129 });
130 } else {
131 CommandPaletteFilter::update_global(cx, |filter, _cx| {
132 filter.hide_namespace(NAMESPACE);
133 });
134 }
135 })
136 .detach();
137}