// This file is @generated by `just registry-sync`.
// Do not edit manually.
use std::env;
use thiserror::Error;
use crate::{
Connection, Result, RuntimeContext, Task, UnsupportedLaunch,
agent_server::{AgentServer, AgentServerMetadata, CommandAgentServer, CommandSpec},
};
/// Typed failures from agent-server lookup and host-platform helpers.
#[derive(Clone, Debug, PartialEq, Eq, Error)]
pub enum Error {
/// The generated agent-server catalog does not contain the requested id.
#[error("agent server `{id}` was not found")]
UnknownServer {
/// The unresolved official ACP registry id.
id: String,
},
/// The current or requested host target is outside the v0 platform map.
#[error("unsupported host platform `{os}/{arch}`")]
UnsupportedHostPlatform {
/// The operating system identifier.
os: String,
/// The CPU architecture identifier.
arch: String,
},
/// A binary-backed server does not provide a build for the requested host
/// target.
#[error("agent server `{id}` does not publish a binary for host platform `{target}`")]
MissingBinaryTarget {
/// The agent-server id.
id: String,
/// The official ACP registry target triple.
target: String,
},
}
/// Host platforms currently mapped to ACP registry binary targets.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum HostPlatform {
DarwinAarch64,
DarwinX86_64,
LinuxAarch64,
LinuxX86_64,
WindowsAarch64,
WindowsX86_64,
}
impl HostPlatform {
/// Resolves a Rust target OS and architecture into an ACP registry target.
///
/// # Errors
///
/// Returns [`Error::UnsupportedHostPlatform`] when the pair does not map
/// to a supported ACP registry target in v0.
pub fn from_target(os: &str, arch: &str) -> Result<Self, Error> {
match (os, arch) {
("macos", "aarch64") => Ok(Self::DarwinAarch64),
("macos", "x86_64") => Ok(Self::DarwinX86_64),
("linux", "aarch64") => Ok(Self::LinuxAarch64),
("linux", "x86_64") => Ok(Self::LinuxX86_64),
("windows", "aarch64") => Ok(Self::WindowsAarch64),
("windows", "x86_64") => Ok(Self::WindowsX86_64),
_ => Err(Error::UnsupportedHostPlatform {
os: os.to_owned(),
arch: arch.to_owned(),
}),
}
}
/// Returns the official ACP registry target identifier.
#[must_use]
pub fn registry_target(self) -> &'static str {
match self {
Self::DarwinAarch64 => "darwin-aarch64",
Self::DarwinX86_64 => "darwin-x86_64",
Self::LinuxAarch64 => "linux-aarch64",
Self::LinuxX86_64 => "linux-x86_64",
Self::WindowsAarch64 => "windows-aarch64",
Self::WindowsX86_64 => "windows-x86_64",
}
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Server {
metadata: AgentServerMetadata,
repository: Option<String>,
authors: Vec<String>,
license: String,
distribution: Distribution,
}
impl Server {
#[must_use]
pub fn repository(&self) -> Option<&str> {
self.repository.as_deref()
}
#[must_use]
pub fn authors(&self) -> &[String] {
&self.authors
}
#[must_use]
pub fn license(&self) -> &str {
&self.license
}
#[must_use]
pub fn distribution(&self) -> &Distribution {
&self.distribution
}
}
impl AgentServer for Server {
fn metadata(&self) -> &AgentServerMetadata {
&self.metadata
}
fn connect<'a>(&'a self, runtime: &'a RuntimeContext) -> Task<'a, Result<Connection>> {
Box::pin(async move {
let Some(package) = self.distribution.preferred_package() else {
return Err(UnsupportedLaunch::BinaryDistribution.into());
};
let manual = CommandAgentServer::new(self.metadata.clone(), package.command_spec());
manual.connect(runtime).await
})
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Distribution {
binary: Vec<BinaryTarget>,
npx: Option<PackageDistribution>,
uvx: Option<PackageDistribution>,
}
impl Distribution {
#[must_use]
pub fn binary_targets(&self) -> &[BinaryTarget] {
&self.binary
}
#[must_use]
pub fn npx(&self) -> Option<&PackageDistribution> {
self.npx.as_ref()
}
#[must_use]
pub fn uvx(&self) -> Option<&PackageDistribution> {
self.uvx.as_ref()
}
fn preferred_package(&self) -> Option<&PackageDistribution> {
self.npx.as_ref().or(self.uvx.as_ref())
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct BinaryTarget {
target: String,
archive: String,
cmd: String,
}
impl BinaryTarget {
#[must_use]
pub fn target(&self) -> &str {
&self.target
}
#[must_use]
pub fn archive(&self) -> &str {
&self.archive
}
#[must_use]
pub fn cmd(&self) -> &str {
&self.cmd
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PackageManager {
Npx,
Uvx,
}
impl PackageManager {
#[must_use]
pub fn launcher(self) -> &'static str {
match self {
Self::Npx => "npx",
Self::Uvx => "uvx",
}
}
#[must_use]
pub fn launcher_args(self) -> &'static [&'static str] {
match self {
Self::Npx => &["--yes"],
Self::Uvx => &[],
}
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct PackageDistribution {
manager: PackageManager,
package: String,
args: Vec<String>,
env: Vec<(String, String)>,
}
impl PackageDistribution {
#[must_use]
pub fn manager(&self) -> PackageManager {
self.manager
}
#[must_use]
pub fn package(&self) -> &str {
&self.package
}
#[must_use]
pub fn args(&self) -> &[String] {
&self.args
}
#[must_use]
pub fn env(&self) -> &[(String, String)] {
&self.env
}
#[must_use]
pub fn command_spec(&self) -> CommandSpec {
let mut spec = CommandSpec::new(self.manager.launcher());
for arg in self.manager.launcher_args() {
spec = spec.arg(*arg);
}
spec = spec.arg(self.package.clone());
for arg in &self.args {
spec = spec.arg(arg.clone());
}
for (key, value) in &self.env {
spec = spec.env(key.clone(), value.clone());
}
spec
}
}
pub const VERSION: &str = "1.0.0";
#[must_use]
pub fn agent_amp_acp() -> Server {
Server {
metadata: AgentServerMetadata::new("amp-acp", "Amp", "0.7.0").description("ACP wrapper for Amp - the frontier coding agent").icon("https://cdn.agentclientprotocol.com/registry/v1/latest/amp-acp.svg"),
repository: Some("https://github.com/tao12345666333/amp-acp".to_owned()),
authors: vec!["tao12345666333".to_owned()],
license: "Apache-2.0".to_owned(),
distribution: Distribution {
binary: vec![BinaryTarget { target: "darwin-aarch64".to_owned(), archive: "https://github.com/tao12345666333/amp-acp/releases/download/v0.7.0/amp-acp-darwin-aarch64.tar.gz".to_owned(), cmd: "./amp-acp".to_owned() }, BinaryTarget { target: "darwin-x86_64".to_owned(), archive: "https://github.com/tao12345666333/amp-acp/releases/download/v0.7.0/amp-acp-darwin-x86_64.tar.gz".to_owned(), cmd: "./amp-acp".to_owned() }, BinaryTarget { target: "linux-aarch64".to_owned(), archive: "https://github.com/tao12345666333/amp-acp/releases/download/v0.7.0/amp-acp-linux-aarch64.tar.gz".to_owned(), cmd: "./amp-acp".to_owned() }, BinaryTarget { target: "linux-x86_64".to_owned(), archive: "https://github.com/tao12345666333/amp-acp/releases/download/v0.7.0/amp-acp-linux-x86_64.tar.gz".to_owned(), cmd: "./amp-acp".to_owned() }, BinaryTarget { target: "windows-x86_64".to_owned(), archive: "https://github.com/tao12345666333/amp-acp/releases/download/v0.7.0/amp-acp-windows-x86_64.zip".to_owned(), cmd: "amp-acp.exe".to_owned() }],
npx: None,
uvx: None,
},
}
}
#[must_use]
pub fn agent_auggie() -> Server {
Server {
metadata: AgentServerMetadata::new("auggie", "Auggie CLI", "0.19.0")
.description(
"Augment Code's powerful software agent, backed by industry-leading context engine",
)
.icon("https://cdn.agentclientprotocol.com/registry/v1/latest/auggie.svg"),
repository: Some("https://github.com/augmentcode/auggie-zed-extension".to_owned()),
authors: vec!["Augment Code <support@augmentcode.com>".to_owned()],
license: "proprietary".to_owned(),
distribution: Distribution {
binary: vec![],
npx: Some(PackageDistribution {
manager: PackageManager::Npx,
package: "@augmentcode/auggie@0.19.0".to_owned(),
args: vec!["--acp".to_owned()],
env: vec![("AUGMENT_DISABLE_AUTO_UPDATE".to_owned(), "1".to_owned())],
}),
uvx: None,
},
}
}
#[must_use]
pub fn agent_autohand() -> Server {
Server {
metadata: AgentServerMetadata::new("autohand", "Autohand Code", "0.2.1")
.description("Autohand Code - AI coding agent powered by Autohand AI")
.icon("https://cdn.agentclientprotocol.com/registry/v1/latest/autohand.svg"),
repository: Some("https://github.com/autohandai/autohand-acp".to_owned()),
authors: vec!["Autohand AI".to_owned()],
license: "Apache-2.0".to_owned(),
distribution: Distribution {
binary: vec![],
npx: Some(PackageDistribution {
manager: PackageManager::Npx,
package: "@autohandai/autohand-acp@0.2.1".to_owned(),
args: vec![],
env: vec![],
}),
uvx: None,
},
}
}
#[must_use]
pub fn agent_claude_acp() -> Server {
Server {
metadata: AgentServerMetadata::new("claude-acp", "Claude Agent", "0.21.0")
.description("ACP wrapper for Anthropic's Claude")
.icon("https://cdn.agentclientprotocol.com/registry/v1/latest/claude-acp.svg"),
repository: Some("https://github.com/zed-industries/claude-agent-acp".to_owned()),
authors: vec!["Anthropic".to_owned()],
license: "proprietary".to_owned(),
distribution: Distribution {
binary: vec![],
npx: Some(PackageDistribution {
manager: PackageManager::Npx,
package: "@zed-industries/claude-agent-acp@0.21.0".to_owned(),
args: vec![],
env: vec![],
}),
uvx: None,
},
}
}
#[must_use]
pub fn agent_cline() -> Server {
Server {
metadata: AgentServerMetadata::new("cline", "Cline", "2.7.0").description("Autonomous coding agent CLI - capable of creating/editing files, running commands, using the browser, and more").icon("https://cdn.agentclientprotocol.com/registry/v1/latest/cline.svg"),
repository: Some("https://github.com/cline/cline".to_owned()),
authors: vec!["Cline Bot Inc.".to_owned()],
license: "Apache-2.0".to_owned(),
distribution: Distribution {
binary: vec![],
npx: Some(PackageDistribution { manager: PackageManager::Npx, package: "cline@2.7.0".to_owned(), args: vec!["--acp".to_owned()], env: vec![] }),
uvx: None,
},
}
}
#[must_use]
pub fn agent_codebuddy_code() -> Server {
Server {
metadata: AgentServerMetadata::new("codebuddy-code", "Codebuddy Code", "2.62.1")
.description("Tencent Cloud's official intelligent coding tool")
.icon("https://cdn.agentclientprotocol.com/registry/v1/latest/codebuddy-code.svg"),
repository: Some("https://www.codebuddy.cn/cli/".to_owned()),
authors: vec!["Tencent Cloud".to_owned()],
license: "Proprietary".to_owned(),
distribution: Distribution {
binary: vec![],
npx: Some(PackageDistribution {
manager: PackageManager::Npx,
package: "@tencent-ai/codebuddy-code@2.62.1".to_owned(),
args: vec!["--acp".to_owned()],
env: vec![],
}),
uvx: None,
},
}
}
#[must_use]
pub fn agent_codex_acp() -> Server {
Server {
metadata: AgentServerMetadata::new("codex-acp", "Codex CLI", "0.10.0").description("ACP adapter for OpenAI's coding assistant").icon("https://cdn.agentclientprotocol.com/registry/v1/latest/codex-acp.svg"),
repository: Some("https://github.com/zed-industries/codex-acp".to_owned()),
authors: vec!["OpenAI".to_owned(), "Zed Industries".to_owned()],
license: "Apache-2.0".to_owned(),
distribution: Distribution {
binary: vec![BinaryTarget { target: "darwin-aarch64".to_owned(), archive: "https://github.com/zed-industries/codex-acp/releases/download/v0.10.0/codex-acp-0.10.0-aarch64-apple-darwin.tar.gz".to_owned(), cmd: "./codex-acp".to_owned() }, BinaryTarget { target: "darwin-x86_64".to_owned(), archive: "https://github.com/zed-industries/codex-acp/releases/download/v0.10.0/codex-acp-0.10.0-x86_64-apple-darwin.tar.gz".to_owned(), cmd: "./codex-acp".to_owned() }, BinaryTarget { target: "linux-aarch64".to_owned(), archive: "https://github.com/zed-industries/codex-acp/releases/download/v0.10.0/codex-acp-0.10.0-aarch64-unknown-linux-gnu.tar.gz".to_owned(), cmd: "./codex-acp".to_owned() }, BinaryTarget { target: "linux-x86_64".to_owned(), archive: "https://github.com/zed-industries/codex-acp/releases/download/v0.10.0/codex-acp-0.10.0-x86_64-unknown-linux-gnu.tar.gz".to_owned(), cmd: "./codex-acp".to_owned() }, BinaryTarget { target: "windows-aarch64".to_owned(), archive: "https://github.com/zed-industries/codex-acp/releases/download/v0.10.0/codex-acp-0.10.0-aarch64-pc-windows-msvc.zip".to_owned(), cmd: "./codex-acp.exe".to_owned() }, BinaryTarget { target: "windows-x86_64".to_owned(), archive: "https://github.com/zed-industries/codex-acp/releases/download/v0.10.0/codex-acp-0.10.0-x86_64-pc-windows-msvc.zip".to_owned(), cmd: "./codex-acp.exe".to_owned() }],
npx: Some(PackageDistribution { manager: PackageManager::Npx, package: "@zed-industries/codex-acp@0.10.0".to_owned(), args: vec![], env: vec![] }),
uvx: None,
},
}
}
#[must_use]
pub fn agent_corust_agent() -> Server {
Server {
metadata: AgentServerMetadata::new("corust-agent", "Corust Agent", "0.3.8").description("Co-building with a seasoned Rust partner.").icon("https://cdn.agentclientprotocol.com/registry/v1/latest/corust-agent.svg"),
repository: Some("https://github.com/Corust-ai/corust-agent-release".to_owned()),
authors: vec!["Corust AI <support@corust.ai>".to_owned()],
license: "GPL-3.0-or-later".to_owned(),
distribution: Distribution {
binary: vec![BinaryTarget { target: "darwin-aarch64".to_owned(), archive: "https://github.com/Corust-ai/corust-agent-release/releases/download/v0.3.8/agent-darwin-arm64.tar.gz".to_owned(), cmd: "./corust-agent-acp".to_owned() }, BinaryTarget { target: "darwin-x86_64".to_owned(), archive: "https://github.com/Corust-ai/corust-agent-release/releases/download/v0.3.8/agent-darwin-x64.tar.gz".to_owned(), cmd: "./corust-agent-acp".to_owned() }, BinaryTarget { target: "linux-x86_64".to_owned(), archive: "https://github.com/Corust-ai/corust-agent-release/releases/download/v0.3.8/agent-linux-x64.tar.gz".to_owned(), cmd: "./corust-agent-acp".to_owned() }, BinaryTarget { target: "windows-x86_64".to_owned(), archive: "https://github.com/Corust-ai/corust-agent-release/releases/download/v0.3.8/agent-windows-x64.zip".to_owned(), cmd: "./corust-agent-acp.exe".to_owned() }],
npx: None,
uvx: None,
},
}
}
#[must_use]
pub fn agent_crow_cli() -> Server {
Server {
metadata: AgentServerMetadata::new("crow-cli", "crow-cli", "0.1.14")
.description("Minimal ACP Native Coding Agent")
.icon("https://cdn.agentclientprotocol.com/registry/v1/latest/crow-cli.svg"),
repository: Some("https://github.com/crow-cli/crow-cli".to_owned()),
authors: vec!["Thomas Wood".to_owned()],
license: "Apache-2.0".to_owned(),
distribution: Distribution {
binary: vec![],
npx: None,
uvx: Some(PackageDistribution {
manager: PackageManager::Uvx,
package: "crow-cli".to_owned(),
args: vec!["acp".to_owned()],
env: vec![],
}),
},
}
}
#[must_use]
pub fn agent_cursor() -> Server {
Server {
metadata: AgentServerMetadata::new("cursor", "Cursor", "0.1.0").description("Cursor's coding agent").icon("https://cdn.agentclientprotocol.com/registry/v1/latest/cursor.svg"),
repository: Some("https://cursor.com/docs/cli/acp".to_owned()),
authors: vec!["Cursor".to_owned()],
license: "proprietary".to_owned(),
distribution: Distribution {
binary: vec![BinaryTarget { target: "darwin-aarch64".to_owned(), archive: "https://downloads.cursor.com/lab/2026.03.05-2bf2031/darwin/arm64/agent-cli-package.tar.gz".to_owned(), cmd: "./dist-package/cursor-agent".to_owned() }, BinaryTarget { target: "darwin-x86_64".to_owned(), archive: "https://downloads.cursor.com/lab/2026.03.05-2bf2031/darwin/x64/agent-cli-package.tar.gz".to_owned(), cmd: "./dist-package/cursor-agent".to_owned() }, BinaryTarget { target: "linux-aarch64".to_owned(), archive: "https://downloads.cursor.com/lab/2026.03.05-2bf2031/linux/arm64/agent-cli-package.tar.gz".to_owned(), cmd: "./dist-package/cursor-agent".to_owned() }, BinaryTarget { target: "linux-x86_64".to_owned(), archive: "https://downloads.cursor.com/lab/2026.03.05-2bf2031/linux/x64/agent-cli-package.tar.gz".to_owned(), cmd: "./dist-package/cursor-agent".to_owned() }, BinaryTarget { target: "windows-aarch64".to_owned(), archive: "https://downloads.cursor.com/lab/2026.03.05-2bf2031/windows/arm64/agent-cli-package.zip".to_owned(), cmd: "./dist-package\\cursor-agent.cmd".to_owned() }, BinaryTarget { target: "windows-x86_64".to_owned(), archive: "https://downloads.cursor.com/lab/2026.03.05-2bf2031/windows/x64/agent-cli-package.zip".to_owned(), cmd: "./dist-package\\cursor-agent.cmd".to_owned() }],
npx: None,
uvx: None,
},
}
}
#[must_use]
pub fn agent_deepagents() -> Server {
Server {
metadata: AgentServerMetadata::new("deepagents", "DeepAgents", "0.1.2")
.description(
"Batteries-included AI coding and general purpose agent powered by LangChain.",
)
.icon("https://cdn.agentclientprotocol.com/registry/v1/latest/deepagents.svg"),
repository: Some("https://github.com/langchain-ai/deepagentsjs".to_owned()),
authors: vec!["LangChain".to_owned()],
license: "MIT".to_owned(),
distribution: Distribution {
binary: vec![],
npx: Some(PackageDistribution {
manager: PackageManager::Npx,
package: "deepagents-acp@0.1.2".to_owned(),
args: vec![],
env: vec![],
}),
uvx: None,
},
}
}
#[must_use]
pub fn agent_dimcode() -> Server {
Server {
metadata: AgentServerMetadata::new("dimcode", "DimCode", "0.0.18")
.description("A coding agent that puts leading models at your command.")
.icon("https://cdn.agentclientprotocol.com/registry/v1/latest/dimcode.svg"),
repository: None,
authors: vec!["ArcShips".to_owned()],
license: "proprietary".to_owned(),
distribution: Distribution {
binary: vec![],
npx: Some(PackageDistribution {
manager: PackageManager::Npx,
package: "dimcode@0.0.18".to_owned(),
args: vec!["acp".to_owned()],
env: vec![],
}),
uvx: None,
},
}
}
#[must_use]
pub fn agent_factory_droid() -> Server {
Server {
metadata: AgentServerMetadata::new("factory-droid", "Factory Droid", "0.75.0")
.description("Factory Droid - AI coding agent powered by Factory AI")
.icon("https://cdn.agentclientprotocol.com/registry/v1/latest/factory-droid.svg"),
repository: None,
authors: vec!["Factory AI".to_owned()],
license: "proprietary".to_owned(),
distribution: Distribution {
binary: vec![],
npx: Some(PackageDistribution {
manager: PackageManager::Npx,
package: "droid@0.75.0".to_owned(),
args: vec![
"exec".to_owned(),
"--output-format".to_owned(),
"acp".to_owned(),
],
env: vec![
("DROID_DISABLE_AUTO_UPDATE".to_owned(), "true".to_owned()),
(
"FACTORY_DROID_AUTO_UPDATE_ENABLED".to_owned(),
"false".to_owned(),
),
],
}),
uvx: None,
},
}
}
#[must_use]
pub fn agent_fast_agent() -> Server {
Server {
metadata: AgentServerMetadata::new("fast-agent", "fast-agent", "0.5.11")
.description("Code and build agents with comprehensive multi-provider support")
.icon("https://cdn.agentclientprotocol.com/registry/v1/latest/fast-agent.svg"),
repository: Some("https://github.com/evalstate/fast-agent".to_owned()),
authors: vec!["enquiries@fast-agent.ai".to_owned()],
license: "Apache 2.0".to_owned(),
distribution: Distribution {
binary: vec![],
npx: None,
uvx: Some(PackageDistribution {
manager: PackageManager::Uvx,
package: "fast-agent-acp==0.5.11".to_owned(),
args: vec!["-x".to_owned()],
env: vec![],
}),
},
}
}
#[must_use]
pub fn agent_gemini() -> Server {
Server {
metadata: AgentServerMetadata::new("gemini", "Gemini CLI", "0.33.1")
.description("Google's official CLI for Gemini")
.icon("https://cdn.agentclientprotocol.com/registry/v1/latest/gemini.svg"),
repository: Some("https://github.com/google-gemini/gemini-cli".to_owned()),
authors: vec!["Google".to_owned()],
license: "Apache-2.0".to_owned(),
distribution: Distribution {
binary: vec![],
npx: Some(PackageDistribution {
manager: PackageManager::Npx,
package: "@google/gemini-cli@0.33.1".to_owned(),
args: vec!["--experimental-acp".to_owned()],
env: vec![],
}),
uvx: None,
},
}
}
#[must_use]
pub fn agent_github_copilot_cli() -> Server {
Server {
metadata: AgentServerMetadata::new("github-copilot-cli", "GitHub Copilot", "1.0.5")
.description("GitHub's AI pair programmer")
.icon("https://cdn.agentclientprotocol.com/registry/v1/latest/github-copilot-cli.svg"),
repository: Some("https://github.com/github/copilot-cli".to_owned()),
authors: vec!["GitHub".to_owned()],
license: "proprietary".to_owned(),
distribution: Distribution {
binary: vec![],
npx: Some(PackageDistribution {
manager: PackageManager::Npx,
package: "@github/copilot@1.0.5".to_owned(),
args: vec!["--acp".to_owned()],
env: vec![],
}),
uvx: None,
},
}
}
#[must_use]
pub fn agent_goose() -> Server {
Server {
metadata: AgentServerMetadata::new("goose", "goose", "1.27.2").description("A local, extensible, open source AI agent that automates engineering tasks").icon("https://cdn.agentclientprotocol.com/registry/v1/latest/goose.svg"),
repository: Some("https://github.com/block/goose".to_owned()),
authors: vec!["Block".to_owned()],
license: "Apache-2.0".to_owned(),
distribution: Distribution {
binary: vec![BinaryTarget { target: "darwin-aarch64".to_owned(), archive: "https://github.com/block/goose/releases/download/v1.27.2/goose-aarch64-apple-darwin.tar.bz2".to_owned(), cmd: "./goose".to_owned() }, BinaryTarget { target: "darwin-x86_64".to_owned(), archive: "https://github.com/block/goose/releases/download/v1.27.2/goose-x86_64-apple-darwin.tar.bz2".to_owned(), cmd: "./goose".to_owned() }, BinaryTarget { target: "linux-aarch64".to_owned(), archive: "https://github.com/block/goose/releases/download/v1.27.2/goose-aarch64-unknown-linux-gnu.tar.bz2".to_owned(), cmd: "./goose".to_owned() }, BinaryTarget { target: "linux-x86_64".to_owned(), archive: "https://github.com/block/goose/releases/download/v1.27.2/goose-x86_64-unknown-linux-gnu.tar.bz2".to_owned(), cmd: "./goose".to_owned() }, BinaryTarget { target: "windows-x86_64".to_owned(), archive: "https://github.com/block/goose/releases/download/v1.27.2/goose-x86_64-pc-windows-msvc.zip".to_owned(), cmd: "./goose.exe".to_owned() }],
npx: None,
uvx: None,
},
}
}
#[must_use]
pub fn agent_junie() -> Server {
Server {
metadata: AgentServerMetadata::new("junie", "Junie", "888.195.0").description("AI Coding Agent by JetBrains").icon("https://cdn.agentclientprotocol.com/registry/v1/latest/junie.svg"),
repository: Some("https://github.com/JetBrains/junie".to_owned()),
authors: vec!["JetBrains".to_owned()],
license: "proprietary".to_owned(),
distribution: Distribution {
binary: vec![BinaryTarget { target: "darwin-aarch64".to_owned(), archive: "https://github.com/JetBrains/junie/releases/download/888.195/junie-release-888.195-macos-aarch64.zip".to_owned(), cmd: "./Applications/junie.app/Contents/MacOS/junie".to_owned() }, BinaryTarget { target: "darwin-x86_64".to_owned(), archive: "https://github.com/JetBrains/junie/releases/download/888.195/junie-release-888.195-macos-amd64.zip".to_owned(), cmd: "./Applications/junie.app/Contents/MacOS/junie".to_owned() }, BinaryTarget { target: "linux-aarch64".to_owned(), archive: "https://github.com/JetBrains/junie/releases/download/888.195/junie-release-888.195-linux-aarch64.zip".to_owned(), cmd: "./junie-app/bin/junie".to_owned() }, BinaryTarget { target: "linux-x86_64".to_owned(), archive: "https://github.com/JetBrains/junie/releases/download/888.195/junie-release-888.195-linux-amd64.zip".to_owned(), cmd: "./junie-app/bin/junie".to_owned() }, BinaryTarget { target: "windows-x86_64".to_owned(), archive: "https://github.com/JetBrains/junie/releases/download/888.195/junie-release-888.195-windows-amd64.zip".to_owned(), cmd: "./junie/junie.exe".to_owned() }],
npx: None,
uvx: None,
},
}
}
#[must_use]
pub fn agent_kilo() -> Server {
Server {
metadata: AgentServerMetadata::new("kilo", "Kilo", "7.0.47").description("The open source coding agent").icon("https://cdn.agentclientprotocol.com/registry/v1/latest/kilo.svg"),
repository: Some("https://github.com/Kilo-Org/kilocode".to_owned()),
authors: vec!["Kilo Code".to_owned()],
license: "MIT".to_owned(),
distribution: Distribution {
binary: vec![BinaryTarget { target: "darwin-aarch64".to_owned(), archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.47/kilo-darwin-arm64.zip".to_owned(), cmd: "./kilo".to_owned() }, BinaryTarget { target: "darwin-x86_64".to_owned(), archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.47/kilo-darwin-x64.zip".to_owned(), cmd: "./kilo".to_owned() }, BinaryTarget { target: "linux-aarch64".to_owned(), archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.47/kilo-linux-arm64.tar.gz".to_owned(), cmd: "./kilo".to_owned() }, BinaryTarget { target: "linux-x86_64".to_owned(), archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.47/kilo-linux-x64.tar.gz".to_owned(), cmd: "./kilo".to_owned() }, BinaryTarget { target: "windows-x86_64".to_owned(), archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.47/kilo-windows-x64.zip".to_owned(), cmd: "./kilo.exe".to_owned() }],
npx: Some(PackageDistribution { manager: PackageManager::Npx, package: "@kilocode/cli@7.0.47".to_owned(), args: vec!["acp".to_owned()], env: vec![] }),
uvx: None,
},
}
}
#[must_use]
pub fn agent_kimi() -> Server {
Server {
metadata: AgentServerMetadata::new("kimi", "Kimi CLI", "1.22.0").description("Moonshot AI's coding assistant").icon("https://cdn.agentclientprotocol.com/registry/v1/latest/kimi.svg"),
repository: Some("https://github.com/MoonshotAI/kimi-cli".to_owned()),
authors: vec!["Moonshot AI".to_owned()],
license: "MIT".to_owned(),
distribution: Distribution {
binary: vec![BinaryTarget { target: "darwin-aarch64".to_owned(), archive: "https://github.com/MoonshotAI/kimi-cli/releases/download/1.22.0/kimi-1.22.0-aarch64-apple-darwin.tar.gz".to_owned(), cmd: "./kimi".to_owned() }, BinaryTarget { target: "linux-aarch64".to_owned(), archive: "https://github.com/MoonshotAI/kimi-cli/releases/download/1.22.0/kimi-1.22.0-aarch64-unknown-linux-gnu.tar.gz".to_owned(), cmd: "./kimi".to_owned() }, BinaryTarget { target: "linux-x86_64".to_owned(), archive: "https://github.com/MoonshotAI/kimi-cli/releases/download/1.22.0/kimi-1.22.0-x86_64-unknown-linux-gnu.tar.gz".to_owned(), cmd: "./kimi".to_owned() }, BinaryTarget { target: "windows-x86_64".to_owned(), archive: "https://github.com/MoonshotAI/kimi-cli/releases/download/1.22.0/kimi-1.22.0-x86_64-pc-windows-msvc.zip".to_owned(), cmd: "./kimi.exe".to_owned() }],
npx: None,
uvx: None,
},
}
}
#[must_use]
pub fn agent_minion_code() -> Server {
Server {
metadata: AgentServerMetadata::new("minion-code", "Minion Code", "0.1.44").description("An enhanced AI code assistant built on the Minion framework with rich development tools").icon("https://cdn.agentclientprotocol.com/registry/v1/latest/minion-code.svg"),
repository: Some("https://github.com/femto/minion-code".to_owned()),
authors: vec!["femto".to_owned()],
license: "AGPL-3.0".to_owned(),
distribution: Distribution {
binary: vec![],
npx: None,
uvx: Some(PackageDistribution { manager: PackageManager::Uvx, package: "minion-code@0.1.44".to_owned(), args: vec!["acp".to_owned()], env: vec![] }),
},
}
}
#[must_use]
pub fn agent_mistral_vibe() -> Server {
Server {
metadata: AgentServerMetadata::new("mistral-vibe", "Mistral Vibe", "2.4.2").description("Mistral's open-source coding assistant").icon("https://cdn.agentclientprotocol.com/registry/v1/latest/mistral-vibe.svg"),
repository: Some("https://github.com/mistralai/mistral-vibe".to_owned()),
authors: vec!["Mistral AI".to_owned()],
license: "Apache-2.0".to_owned(),
distribution: Distribution {
binary: vec![BinaryTarget { target: "darwin-aarch64".to_owned(), archive: "https://github.com/mistralai/mistral-vibe/releases/download/v2.4.2/vibe-acp-darwin-aarch64-2.4.2.zip".to_owned(), cmd: "./vibe-acp".to_owned() }, BinaryTarget { target: "darwin-x86_64".to_owned(), archive: "https://github.com/mistralai/mistral-vibe/releases/download/v2.4.2/vibe-acp-darwin-x86_64-2.4.2.zip".to_owned(), cmd: "./vibe-acp".to_owned() }, BinaryTarget { target: "linux-aarch64".to_owned(), archive: "https://github.com/mistralai/mistral-vibe/releases/download/v2.4.2/vibe-acp-linux-aarch64-2.4.2.zip".to_owned(), cmd: "./vibe-acp".to_owned() }, BinaryTarget { target: "linux-x86_64".to_owned(), archive: "https://github.com/mistralai/mistral-vibe/releases/download/v2.4.2/vibe-acp-linux-x86_64-2.4.2.zip".to_owned(), cmd: "./vibe-acp".to_owned() }, BinaryTarget { target: "windows-aarch64".to_owned(), archive: "https://github.com/mistralai/mistral-vibe/releases/download/v2.4.2/vibe-acp-windows-aarch64-2.4.2.zip".to_owned(), cmd: "./vibe-acp.exe".to_owned() }, BinaryTarget { target: "windows-x86_64".to_owned(), archive: "https://github.com/mistralai/mistral-vibe/releases/download/v2.4.2/vibe-acp-windows-x86_64-2.4.2.zip".to_owned(), cmd: "./vibe-acp.exe".to_owned() }],
npx: None,
uvx: None,
},
}
}
#[must_use]
pub fn agent_nova() -> Server {
Server {
metadata: AgentServerMetadata::new("nova", "Nova", "1.0.78")
.description("Nova by Compass AI - a fully-fledged software engineer at your command")
.icon("https://cdn.agentclientprotocol.com/registry/v1/latest/nova.svg"),
repository: Some("https://github.com/Compass-Agentic-Platform/nova".to_owned()),
authors: vec!["Compass AI".to_owned()],
license: "proprietary".to_owned(),
distribution: Distribution {
binary: vec![],
npx: Some(PackageDistribution {
manager: PackageManager::Npx,
package: "@compass-ai/nova@1.0.78".to_owned(),
args: vec!["acp".to_owned()],
env: vec![],
}),
uvx: None,
},
}
}
#[must_use]
pub fn agent_opencode() -> Server {
Server {
metadata: AgentServerMetadata::new("opencode", "OpenCode", "1.2.26").description("The open source coding agent").icon("https://cdn.agentclientprotocol.com/registry/v1/latest/opencode.svg"),
repository: Some("https://github.com/anomalyco/opencode".to_owned()),
authors: vec!["Anomaly".to_owned()],
license: "MIT".to_owned(),
distribution: Distribution {
binary: vec![BinaryTarget { target: "darwin-aarch64".to_owned(), archive: "https://github.com/anomalyco/opencode/releases/download/v1.2.26/opencode-darwin-arm64.zip".to_owned(), cmd: "./opencode".to_owned() }, BinaryTarget { target: "darwin-x86_64".to_owned(), archive: "https://github.com/anomalyco/opencode/releases/download/v1.2.26/opencode-darwin-x64.zip".to_owned(), cmd: "./opencode".to_owned() }, BinaryTarget { target: "linux-aarch64".to_owned(), archive: "https://github.com/anomalyco/opencode/releases/download/v1.2.26/opencode-linux-arm64.tar.gz".to_owned(), cmd: "./opencode".to_owned() }, BinaryTarget { target: "linux-x86_64".to_owned(), archive: "https://github.com/anomalyco/opencode/releases/download/v1.2.26/opencode-linux-x64.tar.gz".to_owned(), cmd: "./opencode".to_owned() }, BinaryTarget { target: "windows-x86_64".to_owned(), archive: "https://github.com/anomalyco/opencode/releases/download/v1.2.26/opencode-windows-x64.zip".to_owned(), cmd: "./opencode.exe".to_owned() }],
npx: None,
uvx: None,
},
}
}
#[must_use]
pub fn agent_pi_acp() -> Server {
Server {
metadata: AgentServerMetadata::new("pi-acp", "pi ACP", "0.0.23")
.description("ACP adapter for pi coding agent")
.icon("https://cdn.agentclientprotocol.com/registry/v1/latest/pi-acp.svg"),
repository: Some("https://github.com/svkozak/pi-acp".to_owned()),
authors: vec!["Sergii Kozak <svkozak@gmail.com>".to_owned()],
license: "MIT".to_owned(),
distribution: Distribution {
binary: vec![],
npx: Some(PackageDistribution {
manager: PackageManager::Npx,
package: "pi-acp@0.0.23".to_owned(),
args: vec![],
env: vec![],
}),
uvx: None,
},
}
}
#[must_use]
pub fn agent_qoder() -> Server {
Server {
metadata: AgentServerMetadata::new("qoder", "Qoder CLI", "0.1.31")
.description("AI coding assistant with agentic capabilities")
.icon("https://cdn.agentclientprotocol.com/registry/v1/latest/qoder.svg"),
repository: None,
authors: vec!["Qoder AI".to_owned()],
license: "proprietary".to_owned(),
distribution: Distribution {
binary: vec![],
npx: Some(PackageDistribution {
manager: PackageManager::Npx,
package: "@qoder-ai/qodercli@0.1.31".to_owned(),
args: vec!["--acp".to_owned()],
env: vec![],
}),
uvx: None,
},
}
}
#[must_use]
pub fn agent_qwen_code() -> Server {
Server {
metadata: AgentServerMetadata::new("qwen-code", "Qwen Code", "0.12.3")
.description("Alibaba's Qwen coding assistant")
.icon("https://cdn.agentclientprotocol.com/registry/v1/latest/qwen-code.svg"),
repository: Some("https://github.com/QwenLM/qwen-code".to_owned()),
authors: vec!["Alibaba Qwen Team".to_owned()],
license: "Apache-2.0".to_owned(),
distribution: Distribution {
binary: vec![],
npx: Some(PackageDistribution {
manager: PackageManager::Npx,
package: "@qwen-code/qwen-code@0.12.3".to_owned(),
args: vec!["--acp".to_owned(), "--experimental-skills".to_owned()],
env: vec![],
}),
uvx: None,
},
}
}
#[must_use]
pub fn agent_stakpak() -> Server {
Server {
metadata: AgentServerMetadata::new("stakpak", "Stakpak", "0.3.68").description("Open-source DevOps agent in Rust with enterprise-grade security").icon("https://cdn.agentclientprotocol.com/registry/v1/latest/stakpak.svg"),
repository: Some("https://github.com/stakpak/agent".to_owned()),
authors: vec!["Stakpak Team <contact@stakpak.dev>".to_owned()],
license: "Apache-2.0".to_owned(),
distribution: Distribution {
binary: vec![BinaryTarget { target: "darwin-aarch64".to_owned(), archive: "https://github.com/stakpak/agent/releases/download/v0.3.68/stakpak-darwin-aarch64.tar.gz".to_owned(), cmd: "./stakpak".to_owned() }, BinaryTarget { target: "darwin-x86_64".to_owned(), archive: "https://github.com/stakpak/agent/releases/download/v0.3.68/stakpak-darwin-x86_64.tar.gz".to_owned(), cmd: "./stakpak".to_owned() }, BinaryTarget { target: "linux-aarch64".to_owned(), archive: "https://github.com/stakpak/agent/releases/download/v0.3.68/stakpak-linux-aarch64.tar.gz".to_owned(), cmd: "./stakpak".to_owned() }, BinaryTarget { target: "linux-x86_64".to_owned(), archive: "https://github.com/stakpak/agent/releases/download/v0.3.68/stakpak-linux-x86_64.tar.gz".to_owned(), cmd: "./stakpak".to_owned() }, BinaryTarget { target: "windows-x86_64".to_owned(), archive: "https://github.com/stakpak/agent/releases/download/v0.3.68/stakpak-windows-x86_64.zip".to_owned(), cmd: "./stakpak.exe".to_owned() }],
npx: None,
uvx: None,
},
}
}
#[must_use]
pub fn all() -> Vec<Server> {
vec![
agent_amp_acp(),
agent_auggie(),
agent_autohand(),
agent_claude_acp(),
agent_cline(),
agent_codebuddy_code(),
agent_codex_acp(),
agent_corust_agent(),
agent_crow_cli(),
agent_cursor(),
agent_deepagents(),
agent_dimcode(),
agent_factory_droid(),
agent_fast_agent(),
agent_gemini(),
agent_github_copilot_cli(),
agent_goose(),
agent_junie(),
agent_kilo(),
agent_kimi(),
agent_minion_code(),
agent_mistral_vibe(),
agent_nova(),
agent_opencode(),
agent_pi_acp(),
agent_qoder(),
agent_qwen_code(),
agent_stakpak(),
]
}
#[must_use]
pub fn get(id: &str) -> Option<Server> {
match id {
"amp-acp" => Some(agent_amp_acp()),
"auggie" => Some(agent_auggie()),
"autohand" => Some(agent_autohand()),
"claude-acp" => Some(agent_claude_acp()),
"cline" => Some(agent_cline()),
"codebuddy-code" => Some(agent_codebuddy_code()),
"codex-acp" => Some(agent_codex_acp()),
"corust-agent" => Some(agent_corust_agent()),
"crow-cli" => Some(agent_crow_cli()),
"cursor" => Some(agent_cursor()),
"deepagents" => Some(agent_deepagents()),
"dimcode" => Some(agent_dimcode()),
"factory-droid" => Some(agent_factory_droid()),
"fast-agent" => Some(agent_fast_agent()),
"gemini" => Some(agent_gemini()),
"github-copilot-cli" => Some(agent_github_copilot_cli()),
"goose" => Some(agent_goose()),
"junie" => Some(agent_junie()),
"kilo" => Some(agent_kilo()),
"kimi" => Some(agent_kimi()),
"minion-code" => Some(agent_minion_code()),
"mistral-vibe" => Some(agent_mistral_vibe()),
"nova" => Some(agent_nova()),
"opencode" => Some(agent_opencode()),
"pi-acp" => Some(agent_pi_acp()),
"qoder" => Some(agent_qoder()),
"qwen-code" => Some(agent_qwen_code()),
"stakpak" => Some(agent_stakpak()),
_ => None,
}
}
/// Returns the embedded agent-server catalog version.
#[must_use]
pub fn version() -> &'static str {
VERSION
}
/// Resolves an official ACP registry id and returns a typed lookup error on
/// failure.
///
/// # Errors
///
/// Returns [`Error::UnknownServer`] when the generated catalog does not
/// contain the requested id.
pub fn require(id: &str) -> Result<Server, Error> {
get(id).ok_or_else(|| Error::UnknownServer { id: id.to_owned() })
}
/// Resolves the current host into a known ACP registry target.
///
/// # Errors
///
/// Returns [`Error::UnsupportedHostPlatform`] when the build host does not map
/// to a supported registry target in v0.
pub fn host_platform() -> Result<HostPlatform, Error> {
HostPlatform::from_target(env::consts::OS, env::consts::ARCH)
}
/// Resolves the binary target for the current host when the server publishes
/// binaries.
///
/// Package-backed servers return `Ok(None)`.
///
/// # Errors
///
/// Returns [`Error::UnsupportedHostPlatform`] when the current host is not
/// mapped in v0, or [`Error::MissingBinaryTarget`] when the server publishes
/// binaries but not for the current host target.
pub fn host_binary_target(server: &Server) -> Result<Option<&BinaryTarget>, Error> {
binary_target_for(server, host_platform()?)
}
/// Resolves the binary target for a specific host platform when the server
/// publishes binaries.
///
/// Package-backed servers return `Ok(None)`.
///
/// # Errors
///
/// Returns [`Error::MissingBinaryTarget`] when the server publishes binaries
/// but not for the requested host target.
pub fn binary_target_for(
server: &Server,
platform: HostPlatform,
) -> Result<Option<&BinaryTarget>, Error> {
let binary_targets = server.distribution().binary_targets();
if binary_targets.is_empty() {
return Ok(None);
}
binary_targets
.iter()
.find(|target| target.target() == platform.registry_target())
.map_or_else(
|| {
Err(Error::MissingBinaryTarget {
id: server.id().to_owned(),
target: platform.registry_target().to_owned(),
})
},
|target| Ok(Some(target)),
)
}