1use crate::AgentServerCommand;
2use anyhow::Result;
3use collections::HashMap;
4use gpui::{App, SharedString};
5use schemars::JsonSchema;
6use serde::{Deserialize, Serialize};
7use settings::{Settings, SettingsSources};
8
9pub fn init(cx: &mut App) {
10 AllAgentServersSettings::register(cx);
11}
12
13#[derive(Default, Deserialize, Serialize, Clone, JsonSchema, Debug)]
14pub struct AllAgentServersSettings {
15 pub gemini: Option<AgentServerSettings>,
16 pub claude: Option<AgentServerSettings>,
17
18 /// Custom agent servers configured by the user
19 #[serde(flatten)]
20 pub custom: HashMap<SharedString, AgentServerSettings>,
21}
22
23#[derive(Deserialize, Serialize, Clone, JsonSchema, Debug, PartialEq)]
24pub struct AgentServerSettings {
25 #[serde(flatten)]
26 pub command: AgentServerCommand,
27}
28
29impl settings::Settings for AllAgentServersSettings {
30 const KEY: Option<&'static str> = Some("agent_servers");
31
32 type FileContent = Self;
33
34 fn load(sources: SettingsSources<Self::FileContent>, _: &mut App) -> Result<Self> {
35 let mut settings = AllAgentServersSettings::default();
36
37 for AllAgentServersSettings {
38 gemini,
39 claude,
40 custom,
41 } in sources.defaults_and_customizations()
42 {
43 if gemini.is_some() {
44 settings.gemini = gemini.clone();
45 }
46 if claude.is_some() {
47 settings.claude = claude.clone();
48 }
49
50 // Merge custom agents
51 for (name, config) in custom {
52 // Skip built-in agent names to avoid conflicts
53 if name != "gemini" && name != "claude" {
54 settings.custom.insert(name.clone(), config.clone());
55 }
56 }
57 }
58
59 Ok(settings)
60 }
61
62 fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {}
63}