mod acp; mod claude; mod custom; mod gemini; #[cfg(any(test, feature = "test-support"))] pub mod e2e_tests; pub use claude::*; use client::ProxySettings; use collections::HashMap; pub use custom::*; use fs::Fs; pub use gemini::*; use http_client::read_no_proxy_from_env; use project::agent_server_store::AgentServerStore; use acp_thread::AgentConnection; use anyhow::Result; use gpui::{App, AppContext, Entity, SharedString, Task}; use project::Project; use settings::SettingsStore; use std::{any::Any, path::Path, rc::Rc, sync::Arc}; pub use acp::AcpConnection; pub struct AgentServerDelegate { store: Entity, project: Entity, status_tx: Option>, new_version_available: Option>>, } impl AgentServerDelegate { pub fn new( store: Entity, project: Entity, status_tx: Option>, new_version_tx: Option>>, ) -> Self { Self { store, project, status_tx, new_version_available: new_version_tx, } } pub fn project(&self) -> &Entity { &self.project } } pub trait AgentServer: Send { fn logo(&self) -> ui::IconName; fn name(&self) -> SharedString; fn telemetry_id(&self) -> &'static str; fn default_mode(&self, _cx: &mut App) -> Option { None } fn set_default_mode( &self, _mode_id: Option, _fs: Arc, _cx: &mut App, ) { } fn connect( &self, root_dir: Option<&Path>, delegate: AgentServerDelegate, cx: &mut App, ) -> Task, Option)>>; fn into_any(self: Rc) -> Rc; } impl dyn AgentServer { pub fn downcast(self: Rc) -> Option> { self.into_any().downcast().ok() } } /// Load the default proxy environment variables to pass through to the agent pub fn load_proxy_env(cx: &mut App) -> HashMap { let proxy_url = cx .read_global(|settings: &SettingsStore, _| settings.get::(None).proxy_url()); let mut env = HashMap::default(); if let Some(proxy_url) = &proxy_url { let env_var = if proxy_url.scheme() == "https" { "HTTPS_PROXY" } else { "HTTP_PROXY" }; env.insert(env_var.to_owned(), proxy_url.to_string()); } if let Some(no_proxy) = read_no_proxy_from_env() { env.insert("NO_PROXY".to_owned(), no_proxy); } env }