settings.rs

 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}