From 5becc73e45ab2a70bf8fc050fc567723b76d09b0 Mon Sep 17 00:00:00 2001 From: 0x1 Date: Thu, 23 Jul 2026 18:31:58 +0200 Subject: [PATCH] feat(desktop): add Devin CLI as a known ACP runtime Devin CLI (https://devin.ai) has native ACP support via `devin acp`. This adds it to the runtime catalog so it appears alongside Goose, Claude Code, Codex, and Buzz Agent in onboarding, Doctor, and agent configuration. Changes: - KnownAcpRuntime entry in discovery.rs (command: `devin`, invokes `devin acp` via default_agent_args, same pattern as Goose) - Added to ONBOARDING_RUNTIME_ORDER so it's visible in onboarding - RuntimeIcon.tsx: inline logo import for onboarding UI - DoctorSettingsPanel.tsx: logo URL + scale mapping for Doctor page - devin.png icon in harness-logos and runtime-icons Devin CLI authenticates via `devin auth` (probed at startup) and uses provider_locked=true since model selection is handled by the Devin account, not by Buzz env vars. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> Signed-off-by: AIandI0x1 --- desktop/public/runtime-icons/devin.png | Bin 0 -> 10260 bytes .../src-tauri/src/managed_agents/discovery.rs | 35 +++++++++++++++++- .../onboarding/assets/harness-logos/devin.png | Bin 0 -> 10260 bytes .../features/onboarding/ui/RuntimeIcon.tsx | 2 + .../ui/onboardingRuntimeSelection.ts | 2 +- .../settings/ui/DoctorSettingsPanel.tsx | 2 + 6 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 desktop/public/runtime-icons/devin.png create mode 100644 desktop/src/features/onboarding/assets/harness-logos/devin.png diff --git a/desktop/public/runtime-icons/devin.png b/desktop/public/runtime-icons/devin.png new file mode 100644 index 0000000000000000000000000000000000000000..5123f92799ddc4dfa02c1b1ff782f0cdb02a81ab GIT binary patch literal 10260 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 literal 0 HcmV?d00001 diff --git a/desktop/src-tauri/src/managed_agents/discovery.rs b/desktop/src-tauri/src/managed_agents/discovery.rs index 50206567ad..20a50849f3 100644 --- a/desktop/src-tauri/src/managed_agents/discovery.rs +++ b/desktop/src-tauri/src/managed_agents/discovery.rs @@ -18,6 +18,8 @@ const CLAUDE_CODE_AVATAR_URL: &str = "https://anthropic.gallerycdn.vsassets.io/e const CODEX_AVATAR_URL: &str = "https://openai.gallerycdn.vsassets.io/extensions/openai/chatgpt/26.5313.41514/1773706730621/Microsoft.VisualStudio.Services.Icons.Default"; const BUZZ_AGENT_AVATAR_URL: &str = "https://raw.githubusercontent.com/block/buzz/refs/heads/main/crates/buzz-agent/buzz-agent.png"; +const DEVIN_AVATAR_URL: &str = + "https://avatars.githubusercontent.com/u/158243242?s=200&v=4"; fn common_binary_paths() -> &'static [PathBuf] { static PATHS: OnceLock> = OnceLock::new(); @@ -188,6 +190,37 @@ const KNOWN_ACP_RUNTIMES: &[KnownAcpRuntime] = &[ login_hint: None, auth_probe_args: None, }, + KnownAcpRuntime { + id: "devin", + label: "Devin CLI", + commands: &["devin"], + aliases: &["devin-cli"], + avatar_url: DEVIN_AVATAR_URL, + mcp_command: None, + mcp_hooks: false, + underlying_cli: Some("devin"), + cli_install_commands: &["curl -fsSL https://devin.ai/install.sh | bash"], + cli_install_commands_windows: &[], + adapter_install_commands: &[], + install_instructions_url: "https://devin.ai", + cli_install_hint: "Install the Devin CLI via the official install script.", + adapter_install_hint: "", + skill_dir: Some(".devin/skills"), + supports_acp_model_switching: false, + model_env_var: None, + provider_env_var: None, + provider_locked: true, + default_env: &[], + config_file_path: None, + config_file_format: None, + supports_acp_native_config: false, + thinking_env_var: None, + max_tokens_env_var: None, + context_limit_env_var: None, + required_normalized_fields: &[], + login_hint: Some("Run `devin auth` to complete authentication."), + auth_probe_args: Some(&["devin", "auth", "status"]), + }, ]; /// Skill discovery directories declared by known runtimes. @@ -342,7 +375,7 @@ pub use overrides::{apply_agent_command_update, create_time_agent_command_overri fn default_agent_args(command: &str) -> Option> { match normalize_command_identity(command).as_str() { - "goose" => Some(vec!["acp".to_string()]), + "goose" | "devin" => Some(vec!["acp".to_string()]), "codex" | "codex-acp" | "claude-agent-acp" | "claude-code-acp" | "claude-code" | "claudecode" | "buzz-agent" => Some(Vec::new()), _ => None, diff --git a/desktop/src/features/onboarding/assets/harness-logos/devin.png b/desktop/src/features/onboarding/assets/harness-logos/devin.png new file mode 100644 index 0000000000000000000000000000000000000000..5123f92799ddc4dfa02c1b1ff782f0cdb02a81ab GIT binary patch literal 10260 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 literal 0 HcmV?d00001 diff --git a/desktop/src/features/onboarding/ui/RuntimeIcon.tsx b/desktop/src/features/onboarding/ui/RuntimeIcon.tsx index a410914377..3876b3479a 100644 --- a/desktop/src/features/onboarding/ui/RuntimeIcon.tsx +++ b/desktop/src/features/onboarding/ui/RuntimeIcon.tsx @@ -7,11 +7,13 @@ import { useTheme } from "@/shared/theme/ThemeProvider"; import { BuzzMark } from "@/shared/ui/buzz-logo/BuzzMark"; import chatgptLogoUrl from "../assets/harness-logos/chatgpt.png?inline"; import claudeLogoUrl from "../assets/harness-logos/claude.png?inline"; +import devinLogoUrl from "../assets/harness-logos/devin.png?inline"; import gooseLogoUrl from "../assets/harness-logos/goose.png?inline"; const RUNTIME_LOGOS: Record = { claude: claudeLogoUrl, codex: chatgptLogoUrl, + devin: devinLogoUrl, goose: gooseLogoUrl, }; diff --git a/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.ts b/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.ts index 51339e2afe..c57dfff9c4 100644 --- a/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.ts +++ b/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.ts @@ -1,6 +1,6 @@ import type { AcpRuntimeCatalogEntry } from "@/shared/api/types"; -export const ONBOARDING_RUNTIME_ORDER = ["claude", "codex"]; +export const ONBOARDING_RUNTIME_ORDER = ["claude", "codex", "devin"]; const VISIBLE_ONBOARDING_RUNTIME_IDS = new Set( ONBOARDING_RUNTIME_ORDER, diff --git a/desktop/src/features/settings/ui/DoctorSettingsPanel.tsx b/desktop/src/features/settings/ui/DoctorSettingsPanel.tsx index cee156ece7..9f3f2aaa48 100644 --- a/desktop/src/features/settings/ui/DoctorSettingsPanel.tsx +++ b/desktop/src/features/settings/ui/DoctorSettingsPanel.tsx @@ -38,6 +38,7 @@ const RUNTIME_LOGO_URLS: Record = { "buzz-agent": "/app-icon@2x.png", claude: "/runtime-icons/claude.png", codex: "/runtime-icons/codex.png", + devin: "/runtime-icons/devin.png", goose: "/runtime-icons/goose.svg", }; @@ -45,6 +46,7 @@ const RUNTIME_LOGO_SCALE: Record = { "buzz-agent": "scale-110", claude: "scale-110", codex: "scale-110", + devin: "scale-110", goose: "scale-125", };