use crate::models::agent::AgentType; #[derive(Debug, Clone)] pub enum AgentDistribution { Npx { version: &'static str, package: &'static str, /// The command name provided by this npx package (e.g. "gemini", "openclaw"). cmd: &'static str, args: &'static [&'static str], env: &'static [(&'static str, &'static str)], /// Minimum Node.js version required, e.g. "22.12.0". None means no specific requirement. node_required: Option<&'static str>, }, Binary { version: &'static str, cmd: &'static str, args: &'static [&'static str], env: &'static [(&'static str, &'static str)], platforms: &'static [PlatformBinary], }, } #[derive(Debug, Clone)] pub struct PlatformBinary { pub platform: &'static str, pub url: &'static str, } #[derive(Debug, Clone)] pub struct AcpAgentMeta { pub agent_type: AgentType, pub name: &'static str, pub description: &'static str, pub distribution: AgentDistribution, } impl AcpAgentMeta { pub fn registry_version(&self) -> Option<&'static str> { match &self.distribution { AgentDistribution::Npx { version, .. } | AgentDistribution::Binary { version, .. } => Some(*version), } } } pub fn current_platform() -> &'static str { #[cfg(all(target_os = "macos", target_arch = "aarch64"))] { "darwin-aarch64" } #[cfg(all(target_os = "macos", target_arch = "x86_64"))] { "darwin-x86_64" } #[cfg(all(target_os = "linux", target_arch = "aarch64"))] { "linux-aarch64" } #[cfg(all(target_os = "linux", target_arch = "x86_64"))] { "linux-x86_64" } #[cfg(all(target_os = "windows", target_arch = "aarch64"))] { "windows-aarch64" } #[cfg(all(target_os = "windows", target_arch = "x86_64"))] { "windows-x86_64" } } pub fn all_acp_agents() -> Vec { vec![ AgentType::ClaudeCode, AgentType::Codex, AgentType::Gemini, AgentType::OpenClaw, AgentType::OpenCode, AgentType::Cline, ] } pub fn registry_id_for(agent_type: AgentType) -> &'static str { match agent_type { AgentType::ClaudeCode => "claude-acp", AgentType::Codex => "codex-acp", AgentType::Gemini => "gemini", AgentType::OpenClaw => "openclaw-acp", AgentType::OpenCode => "opencode", AgentType::Cline => "cline", } } pub fn from_registry_id(id: &str) -> Option { match id { "claude-acp" => Some(AgentType::ClaudeCode), "codex-acp" => Some(AgentType::Codex), "gemini" => Some(AgentType::Gemini), "openclaw-acp" => Some(AgentType::OpenClaw), "opencode" => Some(AgentType::OpenCode), "cline" => Some(AgentType::Cline), _ => None, } } pub fn get_agent_meta(agent_type: AgentType) -> AcpAgentMeta { debug_assert_eq!( from_registry_id(registry_id_for(agent_type)), Some(agent_type) ); match agent_type { AgentType::ClaudeCode => AcpAgentMeta { agent_type, name: "Claude Code", description: "ACP wrapper for Anthropic's Claude", distribution: AgentDistribution::Npx { version: "0.24.2", package: "@agentclientprotocol/claude-agent-acp@0.24.2", cmd: "claude-agent-acp", args: &[], env: &[], node_required: None, }, }, AgentType::Codex => AcpAgentMeta { agent_type, name: "Codex CLI", description: "ACP adapter for OpenAI's coding assistant", distribution: AgentDistribution::Binary { version: "0.10.0", cmd: "codex-acp", args: &[], env: &[], platforms: &[ PlatformBinary { platform: "darwin-aarch64", url: "https://github.com/zed-industries/codex-acp/releases/download/v0.10.0/codex-acp-0.10.0-aarch64-apple-darwin.tar.gz", }, PlatformBinary { platform: "darwin-x86_64", url: "https://github.com/zed-industries/codex-acp/releases/download/v0.10.0/codex-acp-0.10.0-x86_64-apple-darwin.tar.gz", }, PlatformBinary { platform: "linux-aarch64", url: "https://github.com/zed-industries/codex-acp/releases/download/v0.10.0/codex-acp-0.10.0-aarch64-unknown-linux-gnu.tar.gz", }, PlatformBinary { platform: "linux-x86_64", url: "https://github.com/zed-industries/codex-acp/releases/download/v0.10.0/codex-acp-0.10.0-x86_64-unknown-linux-gnu.tar.gz", }, PlatformBinary { platform: "windows-aarch64", url: "https://github.com/zed-industries/codex-acp/releases/download/v0.10.0/codex-acp-0.10.0-aarch64-pc-windows-msvc.zip", }, PlatformBinary { platform: "windows-x86_64", url: "https://github.com/zed-industries/codex-acp/releases/download/v0.10.0/codex-acp-0.10.0-x86_64-pc-windows-msvc.zip", }, ], }, }, AgentType::Gemini => AcpAgentMeta { agent_type, name: "Gemini CLI", description: "Google's official CLI for Gemini", distribution: AgentDistribution::Npx { version: "0.35.3", package: "@google/gemini-cli@0.35.3", cmd: "gemini", args: &["--acp"], env: &[], node_required: None, }, }, AgentType::OpenClaw => AcpAgentMeta { agent_type, name: "OpenClaw", description: "OpenClaw is a personal AI assistant you run on your own devices.", distribution: AgentDistribution::Npx { version: "2026.3.24", package: "openclaw@2026.3.24", cmd: "openclaw", args: &["acp"], env: &[], node_required: Some("22.12.0"), }, }, AgentType::Cline => AcpAgentMeta { agent_type, name: "Cline", description: "Autonomous coding agent CLI", distribution: AgentDistribution::Npx { version: "2.11.0", package: "cline@2.11.0", cmd: "cline", args: &["--acp"], env: &[], node_required: None, }, }, AgentType::OpenCode => AcpAgentMeta { agent_type, name: "OpenCode", description: "The open source coding agent", distribution: AgentDistribution::Binary { version: "1.3.3", cmd: "opencode", args: &["acp"], env: &[], platforms: &[ PlatformBinary { platform: "darwin-aarch64", url: "https://github.com/anomalyco/opencode/releases/download/v1.3.3/opencode-darwin-arm64.zip", }, PlatformBinary { platform: "darwin-x86_64", url: "https://github.com/anomalyco/opencode/releases/download/v1.3.3/opencode-darwin-x64.zip", }, PlatformBinary { platform: "linux-aarch64", url: "https://github.com/anomalyco/opencode/releases/download/v1.3.3/opencode-linux-arm64.tar.gz", }, PlatformBinary { platform: "linux-x86_64", url: "https://github.com/anomalyco/opencode/releases/download/v1.3.3/opencode-linux-x64.tar.gz", }, PlatformBinary { platform: "windows-aarch64", url: "https://github.com/anomalyco/opencode/releases/download/v1.3.3/opencode-windows-arm64.zip", }, PlatformBinary { platform: "windows-x86_64", url: "https://github.com/anomalyco/opencode/releases/download/v1.3.3/opencode-windows-x64.zip", }, ], }, }, } }