From 0bc5cf3643a25454c2dafcf6a753c1cef1d6d007 Mon Sep 17 00:00:00 2001 From: Matthew Jaggard Date: Tue, 29 Sep 2026 16:50:16 +0100 Subject: [PATCH 1/4] Add Devin CLI as an agent provider --- README.md | 19 +++++-- docs/model-catalog.json | 7 +++ src/main/devinPrompt.ts | 41 +++++++++++++++ src/main/hive.ts | 2 +- src/main/index.ts | 19 ++++++- src/main/memory.ts | 2 +- src/main/realtimeActions.ts | 2 +- src/renderer/src/components/AddAgentModal.tsx | 2 + .../src/components/OnboardingWizard.tsx | 3 +- src/renderer/src/i18n/locales/en.json | 3 +- src/renderer/src/realtime/actions.ts | 2 +- src/renderer/src/store/config.ts | 2 + src/shared/agentProvider.ts | 28 +++++++++- src/shared/modelCatalog.json | 7 +++ src/shared/providerAutomation.ts | 4 ++ test/cli-install-ladder.test.cjs | 9 ++++ test/devin-prompt.test.cjs | 52 +++++++++++++++++++ test/model-catalog-remote.test.cjs | 5 ++ test/model-catalog.test.cjs | 2 +- test/provider-automation.test.cjs | 5 +- test/provider-config.test.cjs | 23 +++++++- test/worker-permission-parity.test.cjs | 10 ++++ 22 files changed, 233 insertions(+), 16 deletions(-) create mode 100644 src/main/devinPrompt.ts create mode 100644 test/devin-prompt.test.cjs diff --git a/README.md b/README.md index fc1e934b7..6806ddcd8 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ countries and as low as $100 a year. ` intact. */ +export function prepareDevinPromptFile(args: string[], cwd: string, agentDir: string): string[] { + const separator = args.lastIndexOf('--'); + if (separator < 0 || separator !== args.length - 2) return args; + + let fileArg = -1; + let sourcePath = ''; + let equalsForm = false; + for (let i = 0; i < separator; i++) { + if (args[i] === '--prompt-file' && i + 1 < separator) { + fileArg = i + 1; + sourcePath = args[i + 1]; + equalsForm = false; + i++; + } else if (args[i].startsWith('--prompt-file=')) { + fileArg = i; + sourcePath = args[i].slice('--prompt-file='.length); + equalsForm = true; + } + } + if (fileArg < 0) return args; + + const expanded = sourcePath === '~' ? homedir() : sourcePath.startsWith('~/') ? join(homedir(), sourcePath.slice(2)) : sourcePath; + const source = isAbsolute(expanded) ? expanded : resolve(cwd, expanded); + const personalPrompt = readFileSync(source, 'utf8'); + const privateDir = join(agentDir, '.devin'); + mkdirSync(privateDir, { recursive: true, mode: 0o700 }); + const combinedPath = join(privateDir, 'initial-prompt.md'); + writeFileSync(combinedPath, `${personalPrompt.trimEnd()}\n\n${args[separator + 1]}\n`, { mode: 0o600 }); + + const result = args.slice(0, separator); + result[fileArg] = equalsForm ? `--prompt-file=${combinedPath}` : combinedPath; + return result; +} diff --git a/src/main/hive.ts b/src/main/hive.ts index 5f9c38bff..af99d4c46 100644 --- a/src/main/hive.ts +++ b/src/main/hive.ts @@ -236,7 +236,7 @@ function shortRand(): string { const PROXY_BIND_ATTEMPTS = 3; const PROXY_BIND_BACKOFF_MS = [250, 750]; -const MINE_IGNORE_LINES = ['settings.json', 'cursor.json', 'inbox/', 'outbox/', '.codex/']; +const MINE_IGNORE_LINES = ['settings.json', 'cursor.json', 'inbox/', 'outbox/', '.codex/', '.devin/']; /** Idempotently ensure `/.gitignore` excludes the non-memory files. * Append-only: writes only the missing lines, leaving any existing entries. */ diff --git a/src/main/index.ts b/src/main/index.ts index 0cc017c8d..253a5e686 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -80,6 +80,7 @@ import { type AgentProvider } from '../shared/agentProvider'; import { buildMissingCliScript, chooseInstallRung } from './cliInstall'; +import { prepareDevinPromptFile } from './devinPrompt'; import { detectNodeVersion, nodeIsUsable, resolveNodeInstaller } from './nodeInstall'; import { toolCatalog, type ToolStatus } from '../shared/toolCatalog'; import { listLocalSkills, loadCatalog, installSkill, uninstallSkill, type LocalSkill } from './skills'; @@ -2775,6 +2776,11 @@ async function spawnAgentCore(opts: AgentSpawnOptions, owner: Electron.WebConten // seedDelivery:'type-into-tui') rather than passed on argv. Surfaced in the spawn // result so the renderer types it through the per-pty write-chain. (ondev-b) let seedPrompt: string | undefined; + // Devin uses `-- `; all CLI options must precede that + // separator. Main-only hires also need the same auto-mode posture as GUI hires. + if (provider === 'devin') { + opts.args = argsWithAutoModeFlag(opts.args ?? [], readConfig().autoMode, provider); + } if (opts.hive && hive.enabled()) { try { const inj = await hive.ensureAgent( @@ -2796,7 +2802,10 @@ async function spawnAgentCore(opts: AgentSpawnOptions, owner: Electron.WebConten extraWritableDirs: [memory.env().MEMPALACE_PALACE_PATH].filter((p): p is string => !!p) } ); - opts.args = [...(opts.args ?? []), ...inj.args]; + const injectedArgs = [...(opts.args ?? []), ...inj.args]; + opts.args = provider === 'devin' + ? prepareDevinPromptFile(injectedArgs, opts.cwd, inj.env.AGENT_DIR) + : injectedArgs; seedPrompt = inj.seedPrompt; // A degraded spawn (proxy bridge never bound) is told to the user the same // way breaker escalations are: a native toast, gated on the notifications @@ -2905,7 +2914,13 @@ async function spawnAgentCore(opts: AgentSpawnOptions, owner: Electron.WebConten const sid = typedSid || (opts.resume === true ? hive.lastSession(opts.hive.id) : undefined); if (sid && rf) { const args = opts.args ?? []; - if (!args.includes(rf)) { args.push(rf, sid); opts.args = args; didResume = true; } + if (!args.includes(rf)) { + const promptSeparator = preset.initialPromptFlag === '--' ? args.indexOf('--') : -1; + if (promptSeparator >= 0) args.splice(promptSeparator, 0, rf, sid); + else args.push(rf, sid); + opts.args = args; + didResume = true; + } } else if (sid && rsub) { // Subcommand form (Codex): `codex resume [OPTIONS] [SESSION_ID]` — the // subcommand MUST be argv[0], the id trails the flags. Codex indexes diff --git a/src/main/memory.ts b/src/main/memory.ts index d1be74e1d..4377c4e26 100644 --- a/src/main/memory.ts +++ b/src/main/memory.ts @@ -30,7 +30,7 @@ import { quarantineDirsToReap, quarantineStampMs, nextMineDelayMs } from './pala * that are not currently running. See hive.ts for why `.codex/` matters beyond * mempalace: it is also what stopped the hive's git repo from versioning every * Codex transcript and sqlite log into a 7.5GB history. */ -const MINE_IGNORE_LINES = ['settings.json', 'cursor.json', 'inbox/', 'outbox/', '.codex/']; +const MINE_IGNORE_LINES = ['settings.json', 'cursor.json', 'inbox/', 'outbox/', '.codex/', '.devin/']; /** Idempotently ensure `/.gitignore` excludes the non-memory files. * Writes only the missing lines (append-only) so it's safe to call every cycle. */ diff --git a/src/main/realtimeActions.ts b/src/main/realtimeActions.ts index 21ebd3e81..d9f473060 100644 --- a/src/main/realtimeActions.ts +++ b/src/main/realtimeActions.ts @@ -164,7 +164,7 @@ const PENDING_TTL_MS = 120_000; const PROVIDER_COMMAND: Record = { claude: 'claude', codex: 'codex', antigravity: 'antigravity', gemini: 'gemini', opencode: 'opencode', crush: 'crush', pi: 'pi', qwen: 'qwen', copilot: 'copilot', - cursor: 'cursor-agent' + cursor: 'cursor-agent', devin: 'devin' }; /** Bare affirmations that must NEVER authorize a destructive op on their own — diff --git a/src/renderer/src/components/AddAgentModal.tsx b/src/renderer/src/components/AddAgentModal.tsx index 7545c66ea..de2200b7a 100644 --- a/src/renderer/src/components/AddAgentModal.tsx +++ b/src/renderer/src/components/AddAgentModal.tsx @@ -1020,6 +1020,8 @@ export function AddAgentModal({ onClose, config, onConfigChange }: AddAgentModal ? 'agy' : provider === 'codex' ? 'codex' + : provider === 'devin' + ? 'devin' : provider === 'custom' ? 'your-agent-cli' : 'claude' diff --git a/src/renderer/src/components/OnboardingWizard.tsx b/src/renderer/src/components/OnboardingWizard.tsx index 4438ee0eb..88d9312e6 100644 --- a/src/renderer/src/components/OnboardingWizard.tsx +++ b/src/renderer/src/components/OnboardingWizard.tsx @@ -84,7 +84,8 @@ const PROVIDER_BLURB_KEYS: Partial> = { codex: 'onboarding.providerBlurb.codex', antigravity: 'onboarding.providerBlurb.antigravity', qwen: 'onboarding.providerBlurb.qwen', - cursor: 'onboarding.providerBlurb.cursor' + cursor: 'onboarding.providerBlurb.cursor', + devin: 'onboarding.providerBlurb.devin' }; export function OnboardingWizard({ onComplete }: OnboardingWizardProps) { diff --git a/src/renderer/src/i18n/locales/en.json b/src/renderer/src/i18n/locales/en.json index 68aac2743..61ec95f11 100644 --- a/src/renderer/src/i18n/locales/en.json +++ b/src/renderer/src/i18n/locales/en.json @@ -642,7 +642,8 @@ "antigravity": "Antigravity — Google Gemini", "qwen": "Qwen — runs a local Qwen model on your machine", "gemini": "Gemini CLI - Google Gemini", - "cursor": "Cursor Agent CLI — uses your Cursor credits (Luna, Composer, …)" + "cursor": "Cursor Agent CLI — uses your Cursor credits (Luna, Composer, …)", + "devin": "Devin CLI — local agent with SWE-2 models" }, "home": { "descPlain": "Create a new, empty folder for the app to call home. Everything the app remembers — its own settings and your agents' memory — is stored here. Something like ~/HarnessAgents works well. We'll create it for you if it doesn't exist.", diff --git a/src/renderer/src/realtime/actions.ts b/src/renderer/src/realtime/actions.ts index 552fbbe1b..6ebcf2c8a 100644 --- a/src/renderer/src/realtime/actions.ts +++ b/src/renderer/src/realtime/actions.ts @@ -187,7 +187,7 @@ export function realtimeActionTools(): ReturnType[] { parameters: { type: 'object', properties: { - provider: { type: 'string', description: 'Engine: claude (default), codex, gemini, opencode, crush, pi, qwen, copilot, cursor.' }, + provider: { type: 'string', description: 'Engine: claude (default), codex, gemini, opencode, crush, pi, qwen, copilot, cursor, devin.' }, role: { type: 'string', description: 'Optional. The role/job for the new agent.' }, name: { type: 'string', description: 'Optional. A name for the agent.' }, cwd: { type: 'string', description: 'Optional. Working directory; defaults to the hive root.' } diff --git a/src/renderer/src/store/config.ts b/src/renderer/src/store/config.ts index 4f11435af..1bff259cb 100644 --- a/src/renderer/src/store/config.ts +++ b/src/renderer/src/store/config.ts @@ -230,6 +230,8 @@ export type { CatalogModel, ModelCatalog } from '@shared/modelCatalogPayload'; * - cursor: ids match `cursor-agent models` / `--model` (Cursor account catalog). * Luna is the cheap, high-context default for Michael; the rest are curated * quick-picks and the command field stays editable for any live slug. + * - devin: `devin models list` accepts the SWE-2 family slug or its specific + * variants. The command field also accepts the user's `--prompt-file` flag. * - grok: the models reported by the installed Grok CLI (`grok models`). * - kimi: managed Kimi Code aliases accepted by `kimi --model `. * - custom: no presets at all; the command field is the whole interface. diff --git a/src/shared/agentProvider.ts b/src/shared/agentProvider.ts index 0c3e5fb5f..a9adb2bb2 100644 --- a/src/shared/agentProvider.ts +++ b/src/shared/agentProvider.ts @@ -34,6 +34,7 @@ export type AgentProvider = | 'pi' | 'copilot' | 'cursor' + | 'devin' | 'custom'; /** Structured descriptor for how a NON-hiveAware provider gets hive lifecycle @@ -567,6 +568,29 @@ export const AGENT_PROVIDER_PRESETS: AgentProviderPreset[] = [ }, docsUrl: 'https://cursor.com/docs/cli/install' }, + { + id: 'devin', + label: 'Devin CLI', + defaultCommand: 'devin', + commandGroups: [], + // Devin's interactive CLI accepts the hive briefing after `--` as its + // initial prompt. It remains open for subsequent turns and inbox nudges. + autoModeFlag: '--permission-mode dangerous', + autoFlag: '--permission-mode dangerous', + autoStanceTokens: ['--permission-mode', '--sandbox'], + supportsModel: true, + modelFlag: '--model', + hiveAware: false, + canReceiveInbox: true, + initialPromptFlag: '--', + recommendedOrchestratorModel: 'swe-2', + resumeFlag: '--resume', + nativeInstallCommand: { + posix: 'curl -fsSL https://cli.devin.ai/install.sh | bash', + win32: 'powershell -c irm https://static.devin.ai/cli/setup.ps1 ^| iex' + }, + docsUrl: 'https://docs.devin.ai/cli' + }, { id: 'custom', label: 'Custom', @@ -594,6 +618,7 @@ export function isAgentProvider(value: unknown): value is AgentProvider { value === 'pi' || value === 'copilot' || value === 'cursor' || + value === 'devin' || value === 'custom' ); } @@ -645,6 +670,7 @@ export function inferAgentProvider(command: string | undefined, explicit?: unkno if (bin === 'crush') return 'crush'; if (bin === 'pi') return 'pi'; if (bin === 'copilot') return 'copilot'; + if (bin === 'devin') return 'devin'; // Cursor ships as `cursor-agent`; `agent` is a shorter alias (generic name — check last). if (bin === 'cursor-agent') return 'cursor'; if (bin === 'agent') return 'cursor'; @@ -699,7 +725,7 @@ export function hasAutoModeStance(args: string[], provider: AgentProvider): bool const flag = preset.autoModeFlag ?? ''; const lead = flag.trim().split(/\s+/)[0]; const stance = new Set([...(lead ? [lead] : []), ...(preset.autoStanceTokens ?? [])]); - return args.some((a) => stance.has(a)); + return args.some((a) => stance.has(a.split('=', 1)[0])); } /** Returns any env vars the provider needs for non-interactive / first-run suppression. */ diff --git a/src/shared/modelCatalog.json b/src/shared/modelCatalog.json index ec5e088f3..91e47a3ee 100644 --- a/src/shared/modelCatalog.json +++ b/src/shared/modelCatalog.json @@ -108,6 +108,13 @@ { "id": "claude-opus-4-8-high", "label": "Opus 4.8 1M", "minAppVersion": null, "maxAppVersion": null }, { "id": "claude-sonnet-5-thinking-high", "label": "Sonnet 5 1M Thinking", "minAppVersion": null, "maxAppVersion": null } ], + "devin": [ + { "label": "CLI default", "minAppVersion": null, "maxAppVersion": null }, + { "id": "swe-2", "label": "SWE-2", "minAppVersion": null, "maxAppVersion": null }, + { "id": "swe-2-high", "label": "SWE-2 High", "minAppVersion": null, "maxAppVersion": null }, + { "id": "swe-2-medium", "label": "SWE-2 Medium", "minAppVersion": null, "maxAppVersion": null }, + { "id": "swe-2-max", "label": "SWE-2 Max", "minAppVersion": null, "maxAppVersion": null } + ], "custom": [] } } diff --git a/src/shared/providerAutomation.ts b/src/shared/providerAutomation.ts index 2ca684893..aedae6c74 100644 --- a/src/shared/providerAutomation.ts +++ b/src/shared/providerAutomation.ts @@ -144,6 +144,10 @@ const CONTEXT_COMMANDS: Record = { // auto-compact. Revisit when a shipped command table is transcribed. cursor: NO_CONTEXT_COMMANDS, + // Devin's Essential Commands reference lists /compact (no documented focus + // argument) and /clear for a fresh conversation. + devin: { compact: '/compact', clear: '/clear', compactTakesFocus: false }, + // An arbitrary user binary. We cannot know its command surface, and guessing // means typing slashes into someone's unknown REPL. custom: NO_CONTEXT_COMMANDS diff --git a/test/cli-install-ladder.test.cjs b/test/cli-install-ladder.test.cjs index 2672afba1..6b770eb1a 100644 --- a/test/cli-install-ladder.test.cjs +++ b/test/cli-install-ladder.test.cjs @@ -47,6 +47,15 @@ test('cursor prefers its native curl installer (no npm package)', () => { assert.match(withoutNpm.command, /cursor\.com\/install/); }); +test('Devin uses its official native installer on both platforms', () => { + const mac = installInfoForProvider('devin', 'darwin'); + const windows = installInfoForProvider('devin', 'win32'); + assert.equal(mac.command, undefined); + assert.match(mac.nativeCommand, /cli\.devin\.ai\/install\.sh/); + assert.match(windows.nativeCommand, /static\.devin\.ai\/cli\/setup\.ps1/); + assert.equal(chooseInstallRung(mac, true).kind, 'native'); +}); + test('with npm absent and no native installer, NOTHING is run', () => { const info = installInfoForProvider('codex'); assert.equal(info.nativeCommand, undefined, 'fixture assumes codex has no native installer'); diff --git a/test/devin-prompt.test.cjs b/test/devin-prompt.test.cjs new file mode 100644 index 000000000..d39bac388 --- /dev/null +++ b/test/devin-prompt.test.cjs @@ -0,0 +1,52 @@ +'use strict'; + +const test = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const os = require('node:os'); +const path = require('node:path'); +const loadTs = require('./load-ts.cjs'); + +const { prepareDevinPromptFile } = loadTs('src/main/devinPrompt.ts'); + +test('Devin keeps an inline hive prompt when no personal prompt file is set', () => { + const args = ['--model', 'swe-2', '--', 'Hive briefing']; + assert.strictEqual(prepareDevinPromptFile(args, '/tmp', '/tmp/agent'), args); +}); + +test('Devin combines a personal prompt file with the hive briefing', () => { + const root = fs.mkdtempSync(path.join(os.tmpdir(), 'md-devin-')); + try { + const agentDir = path.join(root, 'agent'); + fs.mkdirSync(agentDir); + const personalPath = path.join(root, 'DEVIN.md'); + fs.writeFileSync(personalPath, 'Personal identity\n'); + const args = ['--model', 'swe-2', '--permission-mode', 'dangerous', + '--prompt-file', 'DEVIN.md', '--', 'Hive briefing']; + + const result = prepareDevinPromptFile(args, root, agentDir); + assert.deepEqual(result.slice(0, 5), args.slice(0, 5)); + assert.equal(result.includes('--'), false); + assert.equal(result[5], path.join(agentDir, '.devin', 'initial-prompt.md')); + assert.equal(fs.readFileSync(result[5], 'utf8'), 'Personal identity\n\nHive briefing\n'); + assert.equal(fs.readFileSync(personalPath, 'utf8'), 'Personal identity\n'); + assert.equal(fs.statSync(result[5]).mode & 0o777, 0o600); + } finally { + fs.rmSync(root, { recursive: true, force: true }); + } +}); + +test('Devin accepts the equals form of --prompt-file', () => { + const root = fs.mkdtempSync(path.join(os.tmpdir(), 'md-devin-')); + try { + const agentDir = path.join(root, 'agent'); + fs.mkdirSync(agentDir); + fs.writeFileSync(path.join(root, 'instructions.md'), 'Personal'); + const result = prepareDevinPromptFile( + ['--prompt-file=instructions.md', '--', 'Hive'], root, agentDir + ); + assert.deepEqual(result, [`--prompt-file=${path.join(agentDir, '.devin', 'initial-prompt.md')}`]); + } finally { + fs.rmSync(root, { recursive: true, force: true }); + } +}); diff --git a/test/model-catalog-remote.test.cjs b/test/model-catalog-remote.test.cjs index d83e1812d..f90484ae3 100644 --- a/test/model-catalog-remote.test.cjs +++ b/test/model-catalog-remote.test.cjs @@ -65,6 +65,11 @@ test('the remote file and the baked file agree on every model', () => { assert.deepEqual(remote.providers, baked.providers); }); +test('Devin has the same SWE-2 choices before and after a remote refresh', () => { + const remote = require('../docs/model-catalog.json'); + assert.deepEqual(remote.providers.devin, baked.providers.devin); +}); + test('a version this build does not know is rejected whole', () => { assert.equal(parseModelCatalog({ version: 2, providers: { claude: [{ label: 'X' }] } }), null); assert.equal(parseModelCatalog({ providers: { claude: [{ label: 'X' }] } }), null); diff --git a/test/model-catalog.test.cjs b/test/model-catalog.test.cjs index 82ccf8dfb..82f2768f7 100644 --- a/test/model-catalog.test.cjs +++ b/test/model-catalog.test.cjs @@ -148,7 +148,7 @@ test('the catalog is the schema config.ts expects', () => { assert.equal(catalog.version, 1); assert.deepEqual( Object.keys(catalog.providers).sort(), - ['antigravity', 'claude', 'copilot', 'codex', 'crush', 'cursor', 'custom', + ['antigravity', 'claude', 'copilot', 'codex', 'crush', 'cursor', 'custom', 'devin', 'gemini', 'grok', 'kimi', 'opencode', 'pi', 'qwen'].sort() ); }); diff --git a/test/provider-automation.test.cjs b/test/provider-automation.test.cjs index 09ce203e5..c35807ee0 100644 --- a/test/provider-automation.test.cjs +++ b/test/provider-automation.test.cjs @@ -17,7 +17,7 @@ const { // — the queue's one-pending-compact invariant depends entirely on this predicate — test('isCompactionCommand matches every provider that has a compact verb', () => { - for (const p of ['claude', 'codex', 'grok', 'kimi', 'qwen', 'opencode', 'pi', 'copilot', 'cursor']) { + for (const p of ['claude', 'codex', 'grok', 'kimi', 'qwen', 'opencode', 'pi', 'copilot', 'cursor', 'devin']) { const cmd = compactionCommandForProvider(p, ''); if (!cmd) continue; // provider has no typeable compaction — nothing to dedupe assert.equal(isCompactionCommand(cmd), true, `${p}: ${cmd}`); @@ -56,6 +56,7 @@ test('each provider receives only its supported compaction syntax', () => { assert.equal(compactionCommandForProvider('qwen', ''), '/compress'); assert.equal(compactionCommandForProvider('opencode', ''), '/compact'); assert.equal(compactionCommandForProvider('pi', ''), '/compact'); + assert.equal(compactionCommandForProvider('devin', ''), '/compact'); // No command we can trust → no keystrokes at all. for (const p of ['antigravity', 'crush', 'copilot', 'cursor', 'custom']) { @@ -74,6 +75,7 @@ test('the focus rides along only where the TUI parses it', () => { // codex/opencode ignore trailing text, so it must be dropped, not typed. assert.equal(compactionCommandForProvider('codex', focus), '/compact'); assert.equal(compactionCommandForProvider('opencode', focus), '/compact'); + assert.equal(compactionCommandForProvider('devin', focus), '/compact'); // Omitting the message keeps the trigger default, not a bare command. assert.equal( @@ -89,6 +91,7 @@ test('clearing uses each CLI own verb, not a hardcoded /clear', () => { assert.equal(clearCommandForProvider('codex'), '/clear'); assert.equal(clearCommandForProvider('kimi'), '/clear'); assert.equal(clearCommandForProvider('qwen'), '/clear'); + assert.equal(clearCommandForProvider('devin'), '/clear'); // agy's /clear resets the conversation; Ctrl+L is the screen-only one. assert.equal(clearCommandForProvider('antigravity'), '/clear'); // These three start a fresh session instead — '/clear' is not a command there. diff --git a/test/provider-config.test.cjs b/test/provider-config.test.cjs index eab71c764..2d908e926 100644 --- a/test/provider-config.test.cjs +++ b/test/provider-config.test.cjs @@ -90,6 +90,25 @@ test('every non-hive-aware inbox provider declares exactly one bootstrap deliver } }); +test('Devin is selectable with an interactive prompt, model, and permission flags', () => { + assert.equal(isAgentProvider('devin'), true); + assert.equal(inferAgentProvider('/opt/homebrew/bin/devin --model swe-2'), 'devin'); + const preset = providerPreset('devin'); + assert.equal(preset.defaultCommand, 'devin'); + assert.equal(preset.initialPromptFlag, '--'); + assert.equal(preset.autoFlag, '--permission-mode dangerous'); + assert.deepEqual(preset.autoStanceTokens, ['--permission-mode', '--sandbox']); + assert.equal(preset.modelFlag, '--model'); + assert.equal(preset.canReceiveInbox, true); + assert.equal(preset.resumeFlag, '--resume'); + assert.equal( + buildSpawnCommand(autoConfig, 'swe-2', 'devin'), + 'devin --model swe-2 --permission-mode dangerous' + ); + assert.deepEqual(modelsForProvider('devin').map((model) => model.id), + [undefined, 'swe-2', 'swe-2-high', 'swe-2-medium', 'swe-2-max']); +}); + test('provider commands use matching models and equivalent bypass modes', () => { assert.equal( buildSpawnCommand(autoConfig, 'claude-sonnet-5', 'claude'), @@ -177,10 +196,10 @@ test('God only sees providers that can drain hive inbox messages', () => { // Cursor is interactive (no -p) so it IS god-eligible. assert.deepEqual( modelProvidersForAgent(true).map((preset) => preset.id), - ['claude', 'codex', 'grok', 'gemini', 'antigravity', 'qwen', 'opencode', 'crush', 'pi', 'cursor'] + ['claude', 'codex', 'grok', 'gemini', 'antigravity', 'qwen', 'opencode', 'crush', 'pi', 'cursor', 'devin'] ); assert.deepEqual( modelProvidersForAgent(false).map((preset) => preset.id), - ['claude', 'codex', 'grok', 'kimi', 'gemini', 'antigravity', 'qwen', 'opencode', 'crush', 'pi', 'copilot', 'cursor'] + ['claude', 'codex', 'grok', 'kimi', 'gemini', 'antigravity', 'qwen', 'opencode', 'crush', 'pi', 'copilot', 'cursor', 'devin'] ); }); diff --git a/test/worker-permission-parity.test.cjs b/test/worker-permission-parity.test.cjs index 7a7a2829f..6eb18d229 100644 --- a/test/worker-permission-parity.test.cjs +++ b/test/worker-permission-parity.test.cjs @@ -66,3 +66,13 @@ test('codex\'s multi-token auto flag is applied the same way as Claude\'s two-to ['--model', 'gpt-5.6-sol', '-a', 'never', '-s', 'workspace-write'] ); }); + +test('Devin auto mode honours an explicit permission choice', () => { + assert.deepEqual(argsWithAutoModeFlag(['--model', 'swe-2'], true, 'devin'), + ['--model', 'swe-2', '--permission-mode', 'dangerous']); + assert.deepEqual(argsWithAutoModeFlag(['--permission-mode', 'smart'], true, 'devin'), + ['--permission-mode', 'smart']); + assert.deepEqual(argsWithAutoModeFlag(['--permission-mode=smart'], true, 'devin'), + ['--permission-mode=smart']); + assert.deepEqual(argsWithAutoModeFlag(['--sandbox'], true, 'devin'), ['--sandbox']); +}); From 29772f96ea78c1c75287fb82904eeffbd3abaa65 Mon Sep 17 00:00:00 2001 From: Matthew Jaggard Date: Tue, 29 Sep 2026 16:55:53 +0100 Subject: [PATCH 2/4] Add before and after Devin provider evidence --- evidence/devin-after.png | Bin 0 -> 51324 bytes evidence/devin-before.png | Bin 0 -> 46214 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 evidence/devin-after.png create mode 100644 evidence/devin-before.png diff --git a/evidence/devin-after.png b/evidence/devin-after.png new file mode 100644 index 0000000000000000000000000000000000000000..0df64dab022d99cfc5a56c984c1be040d598472e GIT binary patch literal 51324 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∾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

>OEGFl(>!SZAG(452BsA|3kDZ8WTIS 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 literal 0 HcmV?d00001 diff --git a/evidence/devin-before.png b/evidence/devin-before.png new file mode 100644 index 0000000000000000000000000000000000000000..bde10c82f809f2035f2ec86535748ff9078b6cd5 GIT binary patch literal 46214 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 Date: Tue, 29 Sep 2026 16:58:25 +0100 Subject: [PATCH 3/4] Recognise existing custom Devin agents --- src/shared/agentProvider.ts | 5 ++++- test/provider-config.test.cjs | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/shared/agentProvider.ts b/src/shared/agentProvider.ts index a9adb2bb2..553cb993a 100644 --- a/src/shared/agentProvider.ts +++ b/src/shared/agentProvider.ts @@ -658,8 +658,11 @@ function commandBinary(command: string | undefined): string { /** Infer the provider from a command (or honor an explicit override). */ export function inferAgentProvider(command: string | undefined, explicit?: unknown): AgentProvider { const normalized = normalizeAgentProvider(explicit); - if (normalized) return normalized; const bin = commandBinary(command); + // Older installs stored Devin commands as explicit `custom` agents because + // Devin had no preset. Recognise those on restore so existing agents inherit + // the model, prompt-file and permission handling without being recreated. + if (normalized && !(normalized === 'custom' && bin === 'devin')) return normalized; if (bin === 'codex') return 'codex'; if (bin === 'grok') return 'grok'; if (bin === 'kimi') return 'kimi'; diff --git a/test/provider-config.test.cjs b/test/provider-config.test.cjs index 2d908e926..952e72700 100644 --- a/test/provider-config.test.cjs +++ b/test/provider-config.test.cjs @@ -93,6 +93,8 @@ test('every non-hive-aware inbox provider declares exactly one bootstrap deliver test('Devin is selectable with an interactive prompt, model, and permission flags', () => { assert.equal(isAgentProvider('devin'), true); assert.equal(inferAgentProvider('/opt/homebrew/bin/devin --model swe-2'), 'devin'); + assert.equal(inferAgentProvider('devin --permission-mode dangerous --prompt-file /tmp/DEVIN.md', 'custom'), 'devin'); + assert.equal(inferAgentProvider('my-wrapper --model swe-2', 'custom'), 'custom'); const preset = providerPreset('devin'); assert.equal(preset.defaultCommand, 'devin'); assert.equal(preset.initialPromptFlag, '--'); From 0202b6e55c56317dde32e03c8430424b884ff95a Mon Sep 17 00:00:00 2001 From: Matthew Jaggard Date: Tue, 29 Sep 2026 17:11:30 +0100 Subject: [PATCH 4/4] Add curated Devin and Fusion model choices --- docs/model-catalog.json | 11 ++++++++++- src/shared/modelCatalog.json | 11 ++++++++++- test/provider-config.test.cjs | 17 ++++++++++++++++- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/docs/model-catalog.json b/docs/model-catalog.json index 11dfe8466..ad9d92a2e 100644 --- a/docs/model-catalog.json +++ b/docs/model-catalog.json @@ -122,10 +122,19 @@ ], "devin": [ { "label": "CLI default", "minAppVersion": null, "maxAppVersion": null }, + { "id": "adaptive", "label": "Adaptive", "minAppVersion": null, "maxAppVersion": null }, { "id": "swe-2", "label": "SWE-2", "minAppVersion": null, "maxAppVersion": null }, { "id": "swe-2-high", "label": "SWE-2 High", "minAppVersion": null, "maxAppVersion": null }, { "id": "swe-2-medium", "label": "SWE-2 Medium", "minAppVersion": null, "maxAppVersion": null }, - { "id": "swe-2-max", "label": "SWE-2 Max", "minAppVersion": null, "maxAppVersion": null } + { "id": "swe-2-max", "label": "SWE-2 Max", "minAppVersion": null, "maxAppVersion": null }, + { "id": "claude-opus-5-5-medium", "label": "Opus 5.5 Medium", "minAppVersion": null, "maxAppVersion": null }, + { "id": "claude-fable-5-1-medium", "label": "Fable 5.1 Medium", "minAppVersion": null, "maxAppVersion": null }, + { "id": "gpt-6-sol-medium", "label": "GPT-6 Sol Medium", "minAppVersion": null, "maxAppVersion": null }, + { "id": "gpt-6-astra-medium", "label": "GPT-6 Astra Medium", "minAppVersion": null, "maxAppVersion": null }, + { "id": "fusion-claude-opus-5-5-high-sidekick-swe-2-medium", "label": "Fusion · Opus 5.5 High + SWE-2 Medium", "minAppVersion": null, "maxAppVersion": null }, + { "id": "fusion-claude-fable-5-1-high-sidekick-swe-2-medium", "label": "Fusion · Fable 5.1 High + SWE-2 Medium", "minAppVersion": null, "maxAppVersion": null }, + { "id": "fusion-gpt-6-sol-high-sidekick-swe-2-medium", "label": "Fusion · GPT-6 Sol High + SWE-2 Medium", "minAppVersion": null, "maxAppVersion": null }, + { "id": "fusion-gpt-6-astra-high-sidekick-swe-2-medium", "label": "Fusion · GPT-6 Astra High + SWE-2 Medium", "minAppVersion": null, "maxAppVersion": null } ], "custom": [] } diff --git a/src/shared/modelCatalog.json b/src/shared/modelCatalog.json index 91e47a3ee..f2e1f6619 100644 --- a/src/shared/modelCatalog.json +++ b/src/shared/modelCatalog.json @@ -110,10 +110,19 @@ ], "devin": [ { "label": "CLI default", "minAppVersion": null, "maxAppVersion": null }, + { "id": "adaptive", "label": "Adaptive", "minAppVersion": null, "maxAppVersion": null }, { "id": "swe-2", "label": "SWE-2", "minAppVersion": null, "maxAppVersion": null }, { "id": "swe-2-high", "label": "SWE-2 High", "minAppVersion": null, "maxAppVersion": null }, { "id": "swe-2-medium", "label": "SWE-2 Medium", "minAppVersion": null, "maxAppVersion": null }, - { "id": "swe-2-max", "label": "SWE-2 Max", "minAppVersion": null, "maxAppVersion": null } + { "id": "swe-2-max", "label": "SWE-2 Max", "minAppVersion": null, "maxAppVersion": null }, + { "id": "claude-opus-5-5-medium", "label": "Opus 5.5 Medium", "minAppVersion": null, "maxAppVersion": null }, + { "id": "claude-fable-5-1-medium", "label": "Fable 5.1 Medium", "minAppVersion": null, "maxAppVersion": null }, + { "id": "gpt-6-sol-medium", "label": "GPT-6 Sol Medium", "minAppVersion": null, "maxAppVersion": null }, + { "id": "gpt-6-astra-medium", "label": "GPT-6 Astra Medium", "minAppVersion": null, "maxAppVersion": null }, + { "id": "fusion-claude-opus-5-5-high-sidekick-swe-2-medium", "label": "Fusion · Opus 5.5 High + SWE-2 Medium", "minAppVersion": null, "maxAppVersion": null }, + { "id": "fusion-claude-fable-5-1-high-sidekick-swe-2-medium", "label": "Fusion · Fable 5.1 High + SWE-2 Medium", "minAppVersion": null, "maxAppVersion": null }, + { "id": "fusion-gpt-6-sol-high-sidekick-swe-2-medium", "label": "Fusion · GPT-6 Sol High + SWE-2 Medium", "minAppVersion": null, "maxAppVersion": null }, + { "id": "fusion-gpt-6-astra-high-sidekick-swe-2-medium", "label": "Fusion · GPT-6 Astra High + SWE-2 Medium", "minAppVersion": null, "maxAppVersion": null } ], "custom": [] } diff --git a/test/provider-config.test.cjs b/test/provider-config.test.cjs index 952e72700..d621f655e 100644 --- a/test/provider-config.test.cjs +++ b/test/provider-config.test.cjs @@ -108,7 +108,22 @@ test('Devin is selectable with an interactive prompt, model, and permission flag 'devin --model swe-2 --permission-mode dangerous' ); assert.deepEqual(modelsForProvider('devin').map((model) => model.id), - [undefined, 'swe-2', 'swe-2-high', 'swe-2-medium', 'swe-2-max']); + [ + undefined, + 'adaptive', + 'swe-2', + 'swe-2-high', + 'swe-2-medium', + 'swe-2-max', + 'claude-opus-5-5-medium', + 'claude-fable-5-1-medium', + 'gpt-6-sol-medium', + 'gpt-6-astra-medium', + 'fusion-claude-opus-5-5-high-sidekick-swe-2-medium', + 'fusion-claude-fable-5-1-high-sidekick-swe-2-medium', + 'fusion-gpt-6-sol-high-sidekick-swe-2-medium', + 'fusion-gpt-6-astra-high-sidekick-swe-2-medium' + ]); }); test('provider commands use matching models and equivalent bypass modes', () => {