issue-flow 0.19.1 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/dist/{agent-EWKA7357.js → agent-4DHRKZ2Z.js} +11 -11
- package/dist/{analyze-Z7ODC27F.js → analyze-UEJ2R3H5.js} +19 -19
- package/dist/{apply-VNSWQS6O.js → apply-QDYNQMUX.js} +11 -11
- package/dist/{bench-ZJEIACUK.js → bench-RNRXVEFK.js} +16 -16
- package/dist/{chunk-2EZW4X57.js → chunk-37O2FMAN.js} +8 -8
- package/dist/{chunk-IMB6FA2F.js → chunk-44RF3VFG.js} +48 -4
- package/dist/chunk-44RF3VFG.js.map +1 -0
- package/dist/{chunk-WPHC6JBR.js → chunk-7WBUEBD5.js} +4 -4
- package/dist/{chunk-KDQRNVBZ.js → chunk-ADH6RJNX.js} +3 -3
- package/dist/{chunk-HHXWAWU6.js → chunk-AKL5UPR6.js} +11 -11
- package/dist/{chunk-XKR3VD2Z.js → chunk-BTBJ5UOO.js} +3 -3
- package/dist/{chunk-UDRAD7MF.js → chunk-CLZ6RRZL.js} +7 -7
- package/dist/{chunk-J6VJ5M2U.js → chunk-DBLXLKGU.js} +7 -7
- package/dist/{chunk-3JD25HHJ.js → chunk-DZ3DZ3EN.js} +5 -5
- package/dist/{chunk-P7ZYOC23.js → chunk-EORDSKWZ.js} +7 -7
- package/dist/chunk-EORDSKWZ.js.map +1 -0
- package/dist/{chunk-XQLNZW7I.js → chunk-EYKPWHT7.js} +9 -9
- package/dist/{chunk-2YYP7AE6.js → chunk-FU2FQ4JE.js} +10 -10
- package/dist/{chunk-RGFMQFX7.js → chunk-G442RDFX.js} +5 -5
- package/dist/{chunk-7CMVL4X6.js → chunk-I64N6RL6.js} +2 -2
- package/dist/{chunk-XHCP6ZNO.js → chunk-JBYXJOJJ.js} +11 -11
- package/dist/{chunk-GD7JZMSJ.js → chunk-JCR5C5A7.js} +2 -2
- package/dist/{chunk-UPAAZU4W.js → chunk-K5NM26NV.js} +2 -2
- package/dist/{chunk-TJVX42KY.js → chunk-KUA6KBBD.js} +2 -2
- package/dist/{chunk-WB2FVIUS.js → chunk-KUL64XUF.js} +5 -5
- package/dist/{chunk-DXH4TQRB.js → chunk-MML2G7IC.js} +2 -2
- package/dist/{chunk-IQYXXFRC.js → chunk-PM5YWJYO.js} +5 -5
- package/dist/chunk-PM5YWJYO.js.map +1 -0
- package/dist/{chunk-HWWB22HC.js → chunk-PXPTIXJF.js} +9 -8
- package/dist/chunk-PXPTIXJF.js.map +1 -0
- package/dist/{chunk-MHA7Q3KU.js → chunk-QJHZ3HYJ.js} +24 -24
- package/dist/{chunk-LYC57OXF.js → chunk-RDPK7LYK.js} +4 -4
- package/dist/{chunk-46S7APLQ.js → chunk-RMIBLFG3.js} +9 -9
- package/dist/{chunk-ZAYATXJD.js → chunk-T736DSZI.js} +5 -5
- package/dist/{chunk-MQTVMB7W.js → chunk-UDUUUFQF.js} +35 -12
- package/dist/chunk-UDUUUFQF.js.map +1 -0
- package/dist/{chunk-PHPAK2L6.js → chunk-V7GETODQ.js} +18 -12
- package/dist/{chunk-PHPAK2L6.js.map → chunk-V7GETODQ.js.map} +1 -1
- package/dist/{chunk-PRGPSNGA.js → chunk-VHQMMY2D.js} +2 -2
- package/dist/{chunk-F2NFJ27Z.js → chunk-VJ3PF6B7.js} +50 -16
- package/dist/chunk-VJ3PF6B7.js.map +1 -0
- package/dist/{chunk-HEHHQU4G.js → chunk-WB4FA2EH.js} +6 -6
- package/dist/{chunk-2Q6PG3MT.js → chunk-WQSGL5LX.js} +11 -5
- package/dist/chunk-WQSGL5LX.js.map +1 -0
- package/dist/{chunk-LRWIP7QS.js → chunk-Y2KOWABB.js} +3 -3
- package/dist/{chunk-UHDXXLYH.js → chunk-YC24E66P.js} +538 -40
- package/dist/chunk-YC24E66P.js.map +1 -0
- package/dist/{chunk-NYDAHE3Y.js → chunk-Z6RCKCVB.js} +8 -8
- package/dist/{chunk-ERAG5IQB.js → chunk-ZPGNVBWY.js} +3 -3
- package/dist/cli.js +55 -53
- package/dist/cli.js.map +1 -1
- package/dist/{compat-YPDZB34U.js → compat-OJG76J4I.js} +5 -5
- package/dist/{config-56B4OHZE.js → config-6YTWPDBK.js} +10 -10
- package/dist/{conventions-DW2CM5I3.js → conventions-5UPOTU42.js} +13 -13
- package/dist/{db-5NU77PJA.js → db-QAZG4LQD.js} +9 -9
- package/dist/{diagnostics-UCTS2VUF.js → diagnostics-YEFB42E5.js} +6 -6
- package/dist/execute-QCT64D37.js +38 -0
- package/dist/{generate-O7GUXLN4.js → generate-QATMDKOK.js} +17 -17
- package/dist/{git-LCG45YXD.js → git-XGOECXWG.js} +2 -2
- package/dist/{history-6GSURU3H.js → history-NBPUZVGQ.js} +9 -9
- package/dist/{init-DD6DBRC5.js → init-4LB2YKWP.js} +11 -11
- package/dist/{operations-HU5ZFEBA.js → operations-RUQP2Y2F.js} +11 -11
- package/dist/{permissions-NNNSRC4P.js → permissions-QZPUUBSO.js} +3 -3
- package/dist/plan-2NMSHTMD.js +38 -0
- package/dist/{policy-RFJOJQL6.js → policy-RKKFF5A2.js} +11 -11
- package/dist/pr-QKFO5HI3.js +42 -0
- package/dist/pr-review-H2BFD6F2.js +33 -0
- package/dist/prd-ET6XKYRS.js +37 -0
- package/dist/{ps-AKRHGPSR.js → ps-UIKSOUAQ.js} +10 -10
- package/dist/{recorder-T7426CKV.js → recorder-LOU3PTIE.js} +6 -6
- package/dist/{registry-DWRKD65A.js → registry-HV7M6MAH.js} +4 -4
- package/dist/{repository-TABBRW2C.js → repository-RCRR6RDE.js} +2 -2
- package/dist/{resume-GDXKK5XP.js → resume-BWJZGBLZ.js} +36 -36
- package/dist/review-2MTZLNSS.js +38 -0
- package/dist/{routing-FPNUVE7T.js → routing-RM5ABHHD.js} +12 -12
- package/dist/run-XMACQBRJ.js +61 -0
- package/dist/{state-manager-IGNTD4AB.js → state-manager-SRN4VJSX.js} +4 -4
- package/dist/{usage-XW27AL5K.js → usage-JOODVE5O.js} +9 -9
- package/dist/{web-NCDBVZ5Y.js → web-TLMWJ2BM.js} +15 -15
- package/package.json +3 -2
- package/web/public/app.js +2 -2
- package/dist/chunk-2Q6PG3MT.js.map +0 -1
- package/dist/chunk-F2NFJ27Z.js.map +0 -1
- package/dist/chunk-HWWB22HC.js.map +0 -1
- package/dist/chunk-IMB6FA2F.js.map +0 -1
- package/dist/chunk-IQYXXFRC.js.map +0 -1
- package/dist/chunk-MQTVMB7W.js.map +0 -1
- package/dist/chunk-P7ZYOC23.js.map +0 -1
- package/dist/chunk-UHDXXLYH.js.map +0 -1
- package/dist/execute-R7AVOLNG.js +0 -38
- package/dist/plan-XR6B7EM3.js +0 -38
- package/dist/pr-OSCNJCOO.js +0 -42
- package/dist/pr-review-IKIYHFBO.js +0 -33
- package/dist/prd-HFDZJJQR.js +0 -37
- package/dist/review-JJHMQA2O.js +0 -38
- package/dist/run-RLCURLLL.js +0 -61
- /package/dist/{agent-EWKA7357.js.map → agent-4DHRKZ2Z.js.map} +0 -0
- /package/dist/{analyze-Z7ODC27F.js.map → analyze-UEJ2R3H5.js.map} +0 -0
- /package/dist/{apply-VNSWQS6O.js.map → apply-QDYNQMUX.js.map} +0 -0
- /package/dist/{bench-ZJEIACUK.js.map → bench-RNRXVEFK.js.map} +0 -0
- /package/dist/{chunk-2EZW4X57.js.map → chunk-37O2FMAN.js.map} +0 -0
- /package/dist/{chunk-WPHC6JBR.js.map → chunk-7WBUEBD5.js.map} +0 -0
- /package/dist/{chunk-KDQRNVBZ.js.map → chunk-ADH6RJNX.js.map} +0 -0
- /package/dist/{chunk-HHXWAWU6.js.map → chunk-AKL5UPR6.js.map} +0 -0
- /package/dist/{chunk-XKR3VD2Z.js.map → chunk-BTBJ5UOO.js.map} +0 -0
- /package/dist/{chunk-UDRAD7MF.js.map → chunk-CLZ6RRZL.js.map} +0 -0
- /package/dist/{chunk-J6VJ5M2U.js.map → chunk-DBLXLKGU.js.map} +0 -0
- /package/dist/{chunk-3JD25HHJ.js.map → chunk-DZ3DZ3EN.js.map} +0 -0
- /package/dist/{chunk-XQLNZW7I.js.map → chunk-EYKPWHT7.js.map} +0 -0
- /package/dist/{chunk-2YYP7AE6.js.map → chunk-FU2FQ4JE.js.map} +0 -0
- /package/dist/{chunk-RGFMQFX7.js.map → chunk-G442RDFX.js.map} +0 -0
- /package/dist/{chunk-7CMVL4X6.js.map → chunk-I64N6RL6.js.map} +0 -0
- /package/dist/{chunk-XHCP6ZNO.js.map → chunk-JBYXJOJJ.js.map} +0 -0
- /package/dist/{chunk-GD7JZMSJ.js.map → chunk-JCR5C5A7.js.map} +0 -0
- /package/dist/{chunk-UPAAZU4W.js.map → chunk-K5NM26NV.js.map} +0 -0
- /package/dist/{chunk-TJVX42KY.js.map → chunk-KUA6KBBD.js.map} +0 -0
- /package/dist/{chunk-WB2FVIUS.js.map → chunk-KUL64XUF.js.map} +0 -0
- /package/dist/{chunk-DXH4TQRB.js.map → chunk-MML2G7IC.js.map} +0 -0
- /package/dist/{chunk-MHA7Q3KU.js.map → chunk-QJHZ3HYJ.js.map} +0 -0
- /package/dist/{chunk-LYC57OXF.js.map → chunk-RDPK7LYK.js.map} +0 -0
- /package/dist/{chunk-46S7APLQ.js.map → chunk-RMIBLFG3.js.map} +0 -0
- /package/dist/{chunk-ZAYATXJD.js.map → chunk-T736DSZI.js.map} +0 -0
- /package/dist/{chunk-PRGPSNGA.js.map → chunk-VHQMMY2D.js.map} +0 -0
- /package/dist/{chunk-HEHHQU4G.js.map → chunk-WB4FA2EH.js.map} +0 -0
- /package/dist/{chunk-LRWIP7QS.js.map → chunk-Y2KOWABB.js.map} +0 -0
- /package/dist/{chunk-NYDAHE3Y.js.map → chunk-Z6RCKCVB.js.map} +0 -0
- /package/dist/{chunk-ERAG5IQB.js.map → chunk-ZPGNVBWY.js.map} +0 -0
- /package/dist/{compat-YPDZB34U.js.map → compat-OJG76J4I.js.map} +0 -0
- /package/dist/{config-56B4OHZE.js.map → config-6YTWPDBK.js.map} +0 -0
- /package/dist/{conventions-DW2CM5I3.js.map → conventions-5UPOTU42.js.map} +0 -0
- /package/dist/{db-5NU77PJA.js.map → db-QAZG4LQD.js.map} +0 -0
- /package/dist/{diagnostics-UCTS2VUF.js.map → diagnostics-YEFB42E5.js.map} +0 -0
- /package/dist/{execute-R7AVOLNG.js.map → execute-QCT64D37.js.map} +0 -0
- /package/dist/{generate-O7GUXLN4.js.map → generate-QATMDKOK.js.map} +0 -0
- /package/dist/{git-LCG45YXD.js.map → git-XGOECXWG.js.map} +0 -0
- /package/dist/{history-6GSURU3H.js.map → history-NBPUZVGQ.js.map} +0 -0
- /package/dist/{init-DD6DBRC5.js.map → init-4LB2YKWP.js.map} +0 -0
- /package/dist/{operations-HU5ZFEBA.js.map → operations-RUQP2Y2F.js.map} +0 -0
- /package/dist/{permissions-NNNSRC4P.js.map → permissions-QZPUUBSO.js.map} +0 -0
- /package/dist/{plan-XR6B7EM3.js.map → plan-2NMSHTMD.js.map} +0 -0
- /package/dist/{policy-RFJOJQL6.js.map → policy-RKKFF5A2.js.map} +0 -0
- /package/dist/{pr-OSCNJCOO.js.map → pr-QKFO5HI3.js.map} +0 -0
- /package/dist/{pr-review-IKIYHFBO.js.map → pr-review-H2BFD6F2.js.map} +0 -0
- /package/dist/{prd-HFDZJJQR.js.map → prd-ET6XKYRS.js.map} +0 -0
- /package/dist/{ps-AKRHGPSR.js.map → ps-UIKSOUAQ.js.map} +0 -0
- /package/dist/{recorder-T7426CKV.js.map → recorder-LOU3PTIE.js.map} +0 -0
- /package/dist/{registry-DWRKD65A.js.map → registry-HV7M6MAH.js.map} +0 -0
- /package/dist/{repository-TABBRW2C.js.map → repository-RCRR6RDE.js.map} +0 -0
- /package/dist/{resume-GDXKK5XP.js.map → resume-BWJZGBLZ.js.map} +0 -0
- /package/dist/{review-JJHMQA2O.js.map → review-2MTZLNSS.js.map} +0 -0
- /package/dist/{routing-FPNUVE7T.js.map → routing-RM5ABHHD.js.map} +0 -0
- /package/dist/{run-RLCURLLL.js.map → run-XMACQBRJ.js.map} +0 -0
- /package/dist/{state-manager-IGNTD4AB.js.map → state-manager-SRN4VJSX.js.map} +0 -0
- /package/dist/{usage-XW27AL5K.js.map → usage-JOODVE5O.js.map} +0 -0
- /package/dist/{web-NCDBVZ5Y.js.map → web-TLMWJ2BM.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/dependencies.ts","../src/agents/availability.ts","../src/agents/opencode.ts","../src/core/shutdown.ts","../src/core/watchdog.ts","../src/agents/antigravity.ts","../src/agents/claude.ts","../src/core/stream.ts","../src/agents/argv.ts","../src/agents/process.ts","../src/agents/registry.ts","../src/agents/codex.ts","../src/agents/cursor.ts","../src/routing/opencode-go.ts","../src/agents/origins.ts","../src/agents/resolve.ts","../src/config/layers.ts","../src/config/agent.ts","../src/config/engine.ts","../src/config/issues.ts","../src/config/policy.ts","../src/config/pr-review.ts","../src/config/resilience.ts","../src/config/routing.ts","../src/config/telemetry.ts","../src/config/verify.ts","../src/config/web.ts","../src/config.ts"],"sourcesContent":["import { platform } from 'node:os';\nimport { installHint } from '../agents/availability.js';\nimport { runnerFor } from '../agents/registry.js';\nimport type { AgentProviderId } from '../agents/types.js';\nimport { AGENT_PHASES } from '../agents/types.js';\nimport { run } from '../utils/shell.js';\nimport { loadAgentConfig } from './agent.js';\n\n/**\n * Return a platform-appropriate install hint for a given package.\n */\nexport function getInstallHint(pkg: string): string {\n const os = platform();\n\n if (os === 'darwin') {\n return `brew install ${pkg}`;\n }\n if (os === 'linux') {\n return `apt install ${pkg} (or your distro's package manager)`;\n }\n if (os === 'win32') {\n return `winget install ${pkg} (or choco install ${pkg})`;\n }\n\n return `install ${pkg} using your system package manager`;\n}\n\n/**\n * Validate that required external dependencies are available.\n * Returns an array of error messages (empty if all deps are found).\n */\nexport async function validateDependencies(): Promise<string[]> {\n const errors: string[] = [];\n\n // Check git\n const gitResult = await run('git', ['--version']);\n if (gitResult.exitCode !== 0) {\n errors.push(` - git (install with: ${getInstallHint('git')})`);\n }\n\n // Check the agents this run actually selected — never every binary on the\n // machine. An unconfigured run still only needs `claude`, which is the\n // behaviour every release before the agent layer had.\n const agent = await loadAgentConfig();\n const needed = new Set<AgentProviderId>([agent.provider]);\n for (const phase of AGENT_PHASES) {\n const provider = agent.phases[phase]?.provider;\n if (provider !== undefined) needed.add(provider);\n }\n for (const id of needed) {\n // The binary is the runner's, never a guess. Mapping every non-Codex\n // provider to `claude` made preflight demand the wrong CLI for Cursor and\n // pass without `agy` installed for Antigravity.\n const { command, args } = runnerFor(id).versionCommand();\n const result = await run(command, args);\n if (result.exitCode !== 0) {\n errors.push(` - ${command} (${installHint(id)})`);\n }\n }\n\n // Note: jq is NOT required — the TypeScript CLI handles JSON natively\n\n return errors;\n}\n","import { execa } from 'execa';\nimport { interpretOpenCodeAuth } from './opencode.js';\nimport { ensureRunnersRegistered, runnerFor } from './registry.js';\nimport { resolveAgentFor } from './resolve.js';\nimport { AGENT_PROVIDER_IDS, type AgentPhase, type AgentProviderId } from './types.js';\n\nexport const READINESS_SCHEMA_VERSION = '1';\nexport const DEFAULT_READINESS_TTL_MS = 5 * 60_000;\n\nexport type ReadinessState = 'ready' | 'conditional' | 'unavailable';\nexport type AuthenticationState = 'confirmed' | 'failed' | 'unverified';\nexport type ProbeConfidence = 'confirmed' | 'inferred' | 'unknown';\nexport type ReadinessSource =\n | 'probe'\n | 'config'\n | 'successful-run'\n | 'failure-history'\n | 'static-catalog';\n\nexport interface ModelReadiness {\n id: string | null;\n access: 'accessible' | 'denied' | 'unverified';\n confidence: ProbeConfidence;\n source: ReadinessSource;\n}\n\nexport interface ProviderReadiness {\n provider: AgentProviderId;\n harness: string;\n installed: boolean;\n authentication: AuthenticationState;\n state: ReadinessState;\n models: ModelReadiness[];\n version: string | null;\n detail: string;\n observedAt: string;\n expiresAt: string;\n source: ReadinessSource;\n cooldownUntil: string | null;\n}\n\nexport interface ReadinessSnapshot {\n schemaVersion: typeof READINESS_SCHEMA_VERSION;\n observedAt: string;\n expiresAt: string;\n providers: Record<AgentProviderId, ProviderReadiness>;\n}\n\n/**\n * Legacy surface kept for callers that only need \"may we attempt\". Prefer\n * `authentication` + `state` when distinguishing confirmed vs unverified.\n */\nexport interface AgentAvailability {\n id: AgentProviderId;\n installed: boolean;\n version: string | null;\n /**\n * True when the provider may be attempted: installed and not auth-failed.\n * `authProbe: 'none'` stays attemptable when installed even though\n * authentication is `unverified`.\n */\n authenticated: boolean;\n authentication: AuthenticationState;\n state: ReadinessState;\n detail: string;\n observedAt: string;\n expiresAt: string;\n source: ReadinessSource;\n cooldownUntil: string | null;\n}\n\nconst PROVIDER_HARNESS: Record<AgentProviderId, string> = {\n claude: 'claude-code',\n codex: 'codex-cli',\n cursor: 'cursor-cli',\n antigravity: 'antigravity-cli',\n opencode: 'opencode-cli',\n};\n\nconst ALL_PROVIDERS: readonly AgentProviderId[] = AGENT_PROVIDER_IDS;\n\nconst probeCache = new Map<AgentProviderId, Promise<AgentAvailability>>();\nlet inventoryCache: { expiresAtMs: number; promise: Promise<ReadinessSnapshot> } | null = null;\n\nexport function clearAvailabilityCache(): void {\n probeCache.clear();\n inventoryCache = null;\n}\n\nexport function harnessForProvider(provider: AgentProviderId): string {\n return PROVIDER_HARNESS[provider];\n}\n\nexport function providerForHarness(harness: string): AgentProviderId | null {\n const entry = (Object.entries(PROVIDER_HARNESS) as [AgentProviderId, string][]).find(\n ([, value]) => value === harness,\n );\n return entry?.[0] ?? null;\n}\n\nfunction deriveState(\n installed: boolean,\n authentication: AuthenticationState,\n cooldownUntil: string | null,\n nowMs: number,\n): ReadinessState {\n if (!installed) return 'unavailable';\n if (cooldownUntil !== null && Date.parse(cooldownUntil) > nowMs) return 'unavailable';\n if (authentication === 'failed') return 'unavailable';\n if (authentication === 'unverified') return 'conditional';\n return 'ready';\n}\n\nfunction toAvailability(readiness: ProviderReadiness): AgentAvailability {\n return {\n id: readiness.provider,\n installed: readiness.installed,\n version: readiness.version,\n authenticated: readiness.installed && readiness.authentication !== 'failed',\n authentication: readiness.authentication,\n state: readiness.state,\n detail: readiness.detail,\n observedAt: readiness.observedAt,\n expiresAt: readiness.expiresAt,\n source: readiness.source,\n cooldownUntil: readiness.cooldownUntil,\n };\n}\n\nexport async function probeAgent(id: AgentProviderId): Promise<AgentAvailability> {\n const cached = probeCache.get(id);\n if (cached) return cached;\n const pending = probeAgentUncached(id).then(toAvailability);\n probeCache.set(id, pending);\n return pending;\n}\n\nasync function probeAgentUncached(\n id: AgentProviderId,\n options: { now?: () => Date; ttlMs?: number; cooldownUntil?: string | null } = {},\n): Promise<ProviderReadiness> {\n ensureRunnersRegistered();\n const runner = runnerFor(id);\n const now = options.now?.() ?? new Date();\n const ttlMs = options.ttlMs ?? DEFAULT_READINESS_TTL_MS;\n const observedAt = now.toISOString();\n const expiresAt = new Date(now.getTime() + ttlMs).toISOString();\n const cooldownUntil = options.cooldownUntil ?? null;\n\n let version: string | null = null;\n let installed = false;\n try {\n const { command, args } = runner.versionCommand();\n const proc = await execa(command, args, { reject: false, timeout: 10_000 });\n installed = proc.exitCode === 0;\n version = installed ? proc.stdout?.toString().trim() || 'unknown' : null;\n } catch {\n installed = false;\n }\n\n let authentication: AuthenticationState = installed ? 'unverified' : 'failed';\n let detail = installed ? (version ?? 'installed') : 'not found';\n let source: ReadinessSource = 'probe';\n\n if (!installed) {\n authentication = 'failed';\n detail = 'not found';\n } else if (runner.authCommand && runner.capabilities.authProbe !== 'none') {\n try {\n const { command, args } = runner.authCommand();\n const auth = await execa(command, args, { reject: false, timeout: 10_000 });\n const text = `${auth.stdout?.toString() ?? ''}\\n${auth.stderr?.toString() ?? ''}`;\n const ok =\n runner.capabilities.authProbe === 'text'\n ? id === 'opencode'\n ? interpretOpenCodeAuth(text)\n : !/not logged in|not authenticated|no models available/i.test(text)\n : auth.exitCode === 0;\n authentication = ok ? 'confirmed' : 'failed';\n detail = ok ? `${version} (authenticated)` : `${version} (not authenticated)`;\n } catch {\n authentication = 'failed';\n detail = `${version} (not authenticated)`;\n }\n } else {\n // authProbe: 'none' — installation is not authentication.\n authentication = 'unverified';\n detail = `${version} (auth unverified)`;\n source = 'probe';\n }\n\n const state = deriveState(installed, authentication, cooldownUntil, now.getTime());\n if (\n state === 'unavailable' &&\n cooldownUntil !== null &&\n Date.parse(cooldownUntil) > now.getTime()\n ) {\n detail = `${detail}; cooldown until ${cooldownUntil}`;\n }\n\n return {\n provider: id,\n harness: PROVIDER_HARNESS[id],\n installed,\n authentication,\n state,\n models: [\n {\n id: null,\n access: installed ? 'unverified' : 'denied',\n confidence: 'unknown',\n source: 'static-catalog',\n },\n ],\n version,\n detail,\n observedAt,\n expiresAt,\n source,\n cooldownUntil,\n };\n}\n\n/**\n * Concurrent inventory of every registered harness. Pure consumers (routing)\n * receive this snapshot; they never probe themselves.\n */\nexport async function probeReadinessInventory(\n options: {\n now?: () => Date;\n ttlMs?: number;\n cooldowns?: Partial<Record<AgentProviderId, string | null>>;\n force?: boolean;\n } = {},\n): Promise<ReadinessSnapshot> {\n const now = options.now?.() ?? new Date();\n const ttlMs = options.ttlMs ?? DEFAULT_READINESS_TTL_MS;\n if (!options.force && inventoryCache !== null && inventoryCache.expiresAtMs > now.getTime()) {\n return inventoryCache.promise;\n }\n\n const promise = (async () => {\n const providers = await Promise.all(\n ALL_PROVIDERS.map((id) =>\n probeAgentUncached(id, {\n now: () => now,\n ttlMs,\n cooldownUntil: options.cooldowns?.[id] ?? null,\n }),\n ),\n );\n const byId = Object.fromEntries(providers.map((entry) => [entry.provider, entry])) as Record<\n AgentProviderId,\n ProviderReadiness\n >;\n for (const entry of providers) {\n probeCache.set(entry.provider, Promise.resolve(toAvailability(entry)));\n }\n return {\n schemaVersion: READINESS_SCHEMA_VERSION,\n observedAt: now.toISOString(),\n expiresAt: new Date(now.getTime() + ttlMs).toISOString(),\n providers: byId,\n } satisfies ReadinessSnapshot;\n })();\n\n inventoryCache = { expiresAtMs: now.getTime() + ttlMs, promise };\n return promise;\n}\n\nexport function installHint(id: AgentProviderId): string {\n if (id === 'codex') {\n return 'Install Codex CLI: https://developers.openai.com/codex/noninteractive';\n }\n if (id === 'cursor') {\n return 'Install Cursor CLI: curl https://cursor.com/install -fsS | bash';\n }\n if (id === 'antigravity') {\n return 'Install Antigravity CLI: https://antigravity.google/docs/cli/install/';\n }\n if (id === 'opencode') {\n return 'Install OpenCode CLI: https://opencode.ai/docs';\n }\n return 'Install Claude Code: https://docs.anthropic.com/en/docs/claude-code';\n}\n\n/**\n * Fail before a run starts when a configured provider is missing or\n * authentication has failed. Unverified auth (authProbe: none) is allowed —\n * the first real invocation is the confirmation.\n */\nexport async function assertAgentAvailable(\n phase: AgentPhase,\n providerId?: AgentProviderId,\n): Promise<void> {\n const provider = providerId ?? (await resolveAgentFor(phase)).provider;\n const probe = await probeAgent(provider);\n if (!probe.installed || probe.state === 'unavailable') {\n if (!probe.installed) {\n throw new AgentUnavailableError(\n `Phase '${phase}' is configured to use '${provider}', but ${provider} is not installed. ${installHint(provider)}`,\n phase,\n provider,\n );\n }\n if (probe.authentication === 'failed') {\n throw new AgentUnavailableError(\n `Phase '${phase}' is configured to use '${provider}', but ${provider} is not authenticated. ${\n provider === 'codex'\n ? 'Run: codex login --with-api-key (or set CODEX_API_KEY)'\n : provider === 'cursor'\n ? 'Run: cursor-agent login (or cursor-agent status)'\n : provider === 'antigravity'\n ? 'Antigravity has no auth probe. Log in with `agy` interactively; Issue Flow never reads GEMINI_API_KEY.'\n : provider === 'opencode'\n ? 'Run: opencode auth login'\n : 'Run: claude auth login'\n }`,\n phase,\n provider,\n );\n }\n throw new AgentUnavailableError(\n `Phase '${phase}' is configured to use '${provider}', but ${provider} is unavailable (${probe.detail}).`,\n phase,\n provider,\n );\n }\n}\n\nexport class AgentUnavailableError extends Error {\n readonly phase: AgentPhase;\n readonly provider: AgentProviderId;\n\n constructor(message: string, phase: AgentPhase, provider: AgentProviderId) {\n super(message);\n this.name = 'AgentUnavailableError';\n this.phase = phase;\n this.provider = provider;\n }\n}\n\n/** Synthetic readiness for tests — no I/O. */\nexport function readinessFixture(\n overrides: Partial<Record<AgentProviderId, Partial<ProviderReadiness>>> = {},\n options: { now?: Date; ttlMs?: number } = {},\n): ReadinessSnapshot {\n const now = options.now ?? new Date('2026-08-30T12:00:00.000Z');\n const ttlMs = options.ttlMs ?? DEFAULT_READINESS_TTL_MS;\n const observedAt = now.toISOString();\n const expiresAt = new Date(now.getTime() + ttlMs).toISOString();\n const providers = {} as Record<AgentProviderId, ProviderReadiness>;\n for (const id of ALL_PROVIDERS) {\n const base: ProviderReadiness = {\n provider: id,\n harness: PROVIDER_HARNESS[id],\n installed: true,\n authentication: id === 'claude' || id === 'antigravity' ? 'unverified' : 'confirmed',\n state: id === 'claude' || id === 'antigravity' ? 'conditional' : 'ready',\n models: [{ id: null, access: 'unverified', confidence: 'unknown', source: 'static-catalog' }],\n version: 'test',\n detail: 'fixture',\n observedAt,\n expiresAt,\n source: 'probe',\n cooldownUntil: null,\n };\n const patch = overrides[id];\n providers[id] = patch\n ? {\n ...base,\n ...patch,\n provider: id,\n harness: patch.harness ?? PROVIDER_HARNESS[id],\n state:\n patch.state ??\n deriveState(\n patch.installed ?? base.installed,\n patch.authentication ?? base.authentication,\n patch.cooldownUntil ?? base.cooldownUntil,\n now.getTime(),\n ),\n }\n : base;\n }\n return { schemaVersion: READINESS_SCHEMA_VERSION, observedAt, expiresAt, providers };\n}\n","import { execa } from 'execa';\nimport { registerChild } from '../core/shutdown.js';\nimport { createWatchdog, describeStall } from '../core/watchdog.js';\nimport { compareVersions } from './antigravity.js';\nimport { peekHarnessVersion } from './claude.js';\nimport { describeAgentFailure, wasTimedOut } from './process.js';\nimport {\n type AgentInvocation,\n type AgentPermission,\n type AgentRunner,\n type AgentRunResult,\n type AgentUsage,\n OPENCODE_CAPABILITIES,\n type OpenCodeSettings,\n type ResolvedAgentSettings,\n} from './types.js';\n\nexport const OPENCODE_MIN_VERSION = '1.15.0';\nexport const DEFAULT_MAX_PROMPT_BYTES = 100_000;\nexport const OPENCODE_INSTALL_URL = 'https://opencode.ai/docs';\n\nconst MUTATING_BASH: readonly string[] = [\n 'rm *',\n 'rmdir *',\n 'mv *',\n 'cp *',\n 'chmod *',\n 'chown *',\n 'mkdir *',\n 'touch *',\n 'tee *',\n 'git add *',\n 'git commit *',\n 'git push *',\n 'git checkout *',\n 'git reset *',\n 'git rebase *',\n 'npm install *',\n 'npm ci *',\n 'pnpm install *',\n 'yarn add *',\n];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport interface OpenCodeParsed {\n result: string;\n sessionId: string | null;\n model: string | null;\n usage: AgentUsage | null;\n seenTerminal: boolean;\n error: string | null;\n permissionDenied: { tool: string; message: string } | null;\n}\n\nexport function maxPromptBytesOf(settings: OpenCodeSettings): number {\n return settings.maxPromptBytes ?? DEFAULT_MAX_PROMPT_BYTES;\n}\n\nexport function interpretOpenCodeAuth(text: string): boolean {\n const cleaned = text.replaceAll(`${String.fromCharCode(27)}[`, '[').trim();\n if (cleaned === '') return false;\n if (/no credentials|not logged|not authenticated|no providers/i.test(cleaned)) return false;\n return /[a-z0-9][a-z0-9._-]*/i.test(cleaned);\n}\n\nexport function parseOpenCodeUsage(tokens: unknown): AgentUsage | null {\n if (!isRecord(tokens)) return null;\n const result: AgentUsage = {};\n if (typeof tokens.input === 'number' && Number.isFinite(tokens.input)) {\n result.inputTokens = tokens.input;\n }\n if (typeof tokens.output === 'number' && Number.isFinite(tokens.output)) {\n result.outputTokens = tokens.output;\n }\n const cache = isRecord(tokens.cache) ? tokens.cache : {};\n if (typeof cache.read === 'number' && Number.isFinite(cache.read)) {\n result.cacheReadTokens = cache.read;\n }\n if (typeof cache.write === 'number' && Number.isFinite(cache.write)) {\n result.cacheCreationTokens = cache.write;\n }\n return Object.keys(result).length === 0 ? null : result;\n}\n\nfunction isPermissionDenial(message: string): boolean {\n return /permission|denied|not allowed|external_directory/i.test(message);\n}\n\nfunction toolDetail(name: string, input: Record<string, unknown>): string {\n const key =\n name === 'bash' || name === 'read' || name === 'edit' || name === 'write'\n ? ['command', 'path', 'filePath', 'file']\n : ['path', 'pattern', 'query', 'url', 'command'];\n for (const field of key) {\n const value = input[field];\n if (typeof value === 'string' && value !== '') {\n return value.length > 80 ? `${value.slice(0, 77)}...` : value;\n }\n }\n return '';\n}\n\nfunction extractError(event: Record<string, unknown>): string {\n if (typeof event.error === 'string' && event.error !== '') return event.error;\n const error = isRecord(event.error) ? event.error : {};\n const data = isRecord(error.data) ? error.data : {};\n if (typeof data.message === 'string' && data.message !== '') return data.message;\n if (typeof error.message === 'string' && error.message !== '') return error.message;\n if (typeof error.name === 'string' && error.name !== '') return error.name;\n return 'OpenCode reported an error';\n}\n\nexport function consumeOpenCodeEvent(\n event: Record<string, unknown>,\n onEvent: AgentInvocation['onEvent'],\n acc: OpenCodeParsed,\n): void {\n if (typeof event.sessionID === 'string' && event.sessionID !== '') {\n acc.sessionId = event.sessionID;\n }\n\n if (event.type === 'text') {\n const part = isRecord(event.part) ? event.part : {};\n if (typeof part.text === 'string' && part.text !== '') {\n acc.result += part.text;\n onEvent?.({ kind: 'text', text: part.text });\n }\n return;\n }\n\n if (event.type === 'tool_use') {\n const part = isRecord(event.part) ? event.part : {};\n const name = typeof part.tool === 'string' ? part.tool : 'tool';\n const state = isRecord(part.state) ? part.state : {};\n const input = isRecord(state.input) ? state.input : {};\n const detail = toolDetail(name, input);\n onEvent?.({ kind: 'tool', name, ...(detail === '' ? {} : { detail }) });\n const error = isRecord(state.error) ? state.error : {};\n const message =\n typeof error.message === 'string'\n ? error.message\n : typeof state.status === 'string' && state.status === 'error'\n ? `${name} failed`\n : '';\n if (message !== '' && isPermissionDenial(message)) {\n acc.permissionDenied = { tool: name, message };\n }\n return;\n }\n\n if (event.type === 'step_finish') {\n const part = isRecord(event.part) ? event.part : {};\n if (part.reason === 'stop') acc.seenTerminal = true;\n const usage = parseOpenCodeUsage(part.tokens);\n if (usage) acc.usage = usage;\n return;\n }\n\n if (event.type === 'error') {\n acc.error = extractError(event);\n acc.seenTerminal = true;\n }\n}\n\nexport function parseOpenCodeStream(\n raw: string,\n onEvent?: AgentInvocation['onEvent'],\n): OpenCodeParsed {\n const acc: OpenCodeParsed = {\n result: '',\n sessionId: null,\n model: null,\n usage: null,\n seenTerminal: false,\n error: null,\n permissionDenied: null,\n };\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed === '') continue;\n try {\n const event = JSON.parse(trimmed) as unknown;\n if (!isRecord(event)) continue;\n consumeOpenCodeEvent(event, onEvent, acc);\n } catch {\n // Malformed NDJSON is ignored, like the other runners.\n }\n }\n return acc;\n}\n\nexport function buildOpenCodePermission(\n permission: AgentPermission,\n addDirs: readonly string[] = [],\n): Record<string, unknown> {\n const external: Record<string, string> = { '*': 'deny' };\n for (const dir of addDirs) {\n const normalized = dir.replace(/\\\\/g, '/').replace(/\\/$/, '');\n if (normalized === '') continue;\n external[normalized] = 'allow';\n external[`${normalized}/**`] = 'allow';\n }\n\n const bash =\n permission === 'read-only'\n ? Object.fromEntries([['*', 'allow'], ...MUTATING_BASH.map((rule) => [rule, 'deny'])])\n : 'allow';\n\n return {\n edit: permission === 'read-only' ? 'deny' : 'allow',\n bash,\n question: 'deny',\n external_directory: external,\n };\n}\n\nexport function buildOpenCodeArgv(\n invocation: AgentInvocation,\n settings: ResolvedAgentSettings,\n): { command: string; args: string[]; env: NodeJS.ProcessEnv } | { error: string } {\n if (settings.model && !settings.model.includes('/')) {\n return {\n error:\n 'configuration: OpenCode model must be provider/model (for example opencode-go/qwen3.8-flash).',\n };\n }\n\n const promptBytes = Buffer.byteLength(invocation.prompt, 'utf8');\n const limit = maxPromptBytesOf(settings.opencode);\n if (promptBytes > limit) {\n return {\n error: `configuration: prompt exceeds OpenCode argv limit (${promptBytes} bytes > ${limit} maxPromptBytes). The promptChannel is argv; shorten the prompt or raise agent.opencode.maxPromptBytes.`,\n };\n }\n\n const workspace = invocation.workingDirectory ?? process.cwd();\n const args = ['run', '--format', 'json', '--dir', workspace, '--auto'];\n if (settings.model) args.push('--model', settings.model);\n if (settings.opencode.variant) args.push('--variant', settings.opencode.variant);\n args.push(invocation.prompt);\n\n return {\n command: 'opencode',\n args,\n env: {\n ...process.env,\n OPENCODE_PERMISSION: JSON.stringify(\n buildOpenCodePermission(invocation.permission, invocation.addDirs ?? []),\n ),\n },\n };\n}\n\nexport function opencodeRunVerdict(input: {\n exitCode: number;\n parsed: OpenCodeParsed;\n timedOut: boolean;\n}): { success: boolean; error: string | null } {\n if (input.parsed.permissionDenied) {\n return {\n success: false,\n error: `configuration: permission denied for ${input.parsed.permissionDenied.tool}. ${input.parsed.permissionDenied.message}`,\n };\n }\n if (input.parsed.error) {\n return { success: false, error: input.parsed.error };\n }\n const hasTerminalEvidence =\n input.parsed.seenTerminal || input.parsed.result.trim() !== '' || input.parsed.error !== null;\n if (!hasTerminalEvidence) {\n return {\n success: false,\n error: 'configuration: OpenCode finished without a terminal event in the stream.',\n };\n }\n if (input.exitCode !== 0 || input.timedOut) {\n return {\n success: false,\n error: input.parsed.error ?? `opencode exited with code ${input.exitCode}`,\n };\n }\n return { success: true, error: null };\n}\n\nfunction configurationFailure(\n agent: AgentRunResult['agent'],\n message: string,\n rawOutput = message,\n): AgentRunResult {\n return {\n success: false,\n result: '',\n rawOutput,\n exitCode: 1,\n usage: null,\n error: message,\n agent,\n harnessVersion: peekHarnessVersion('opencode'),\n };\n}\n\nexport class OpenCodeRunner implements AgentRunner {\n readonly id = 'opencode' as const;\n readonly capabilities = OPENCODE_CAPABILITIES;\n\n versionCommand(): { command: string; args: string[] } {\n return { command: 'opencode', args: ['--version'] };\n }\n\n authCommand(): { command: string; args: string[] } {\n return { command: 'opencode', args: ['auth', 'list'] };\n }\n\n async run(invocation: AgentInvocation, settings: ResolvedAgentSettings): Promise<AgentRunResult> {\n const agent = { provider: this.id, model: settings.model } as const;\n const built = buildOpenCodeArgv(invocation, settings);\n if ('error' in built) return configurationFailure(agent, built.error);\n\n const minimum = settings.opencode.minVersion ?? OPENCODE_MIN_VERSION;\n const installed = peekHarnessVersion(this.id);\n if (typeof installed === 'string' && compareVersions(installed, minimum) < 0) {\n return configurationFailure(\n agent,\n `configuration: opencode ${installed} is below the minimum ${minimum}. Update OpenCode CLI.`,\n );\n }\n\n const { command, args, env } = built;\n const startTime = Date.now();\n const timeoutMs = invocation.timeout;\n\n let cleanup: (() => void) | null = null;\n try {\n const subprocess = execa(command, args, {\n reject: false,\n timeout: timeoutMs > 0 ? timeoutMs : undefined,\n stripFinalNewline: false,\n stdin: 'ignore',\n env,\n ...(invocation.workingDirectory ? { cwd: invocation.workingDirectory } : {}),\n });\n const unregister = registerChild({\n kill: (signal) => subprocess.kill(signal),\n done: subprocess.then(\n () => undefined,\n () => undefined,\n ),\n });\n const watchdog = createWatchdog({\n ...(invocation.inactivityTimeoutMs === undefined\n ? {}\n : { inactivityTimeoutMs: invocation.inactivityTimeoutMs }),\n child: {\n kill: (signal) => subprocess.kill(signal),\n done: subprocess.then(\n () => undefined,\n () => undefined,\n ),\n },\n });\n cleanup = () => {\n watchdog.stop();\n unregister();\n };\n\n const chunks: string[] = [];\n if (subprocess.stdout) {\n subprocess.stdout.on('data', (chunk: Buffer | string) => {\n watchdog.beat();\n const text = chunk.toString();\n chunks.push(text);\n invocation.onLine?.(text);\n });\n }\n if (subprocess.stderr) {\n subprocess.stderr.on('data', () => {\n watchdog.beat();\n });\n }\n\n const proc = await subprocess;\n watchdog.stop();\n unregister();\n\n const stdout = chunks.join('') || proc.stdout?.toString() || '';\n const stderr = proc.stderr?.toString() ?? '';\n const parsed = parseOpenCodeStream(stdout, invocation.onEvent);\n const rawOutput = stdout + (stderr ? `\\n${stderr}` : '');\n const exitCode = proc.exitCode ?? 1;\n const elapsedMs = Date.now() - startTime;\n const timedOut = wasTimedOut(proc, timeoutMs, elapsedMs);\n const stalled = watchdog.stalled;\n const authFailed =\n /not authenticated|unauthorized|no api key|auth required|login required/i.test(\n `${stderr}\\n${stdout}`,\n );\n\n if (stalled) {\n return {\n success: false,\n result: '',\n rawOutput: describeStall(watchdog.silentMs, 'opencode'),\n exitCode: 1,\n usage: parsed.usage,\n error: describeStall(watchdog.silentMs, 'opencode'),\n agent: { provider: this.id, model: parsed.model ?? settings.model },\n sessionId: parsed.sessionId ?? undefined,\n harnessVersion: peekHarnessVersion(this.id),\n };\n }\n\n if (authFailed) {\n return {\n success: false,\n result: parsed.result,\n rawOutput,\n exitCode: timedOut ? 1 : exitCode,\n usage: parsed.usage,\n error: stderr.trim() || 'OpenCode is not authenticated.',\n agent: { provider: this.id, model: parsed.model ?? settings.model },\n sessionId: parsed.sessionId ?? undefined,\n harnessVersion: peekHarnessVersion(this.id),\n };\n }\n\n const verdict = opencodeRunVerdict({ exitCode, parsed, timedOut });\n if (!verdict.success) {\n return {\n success: false,\n result: parsed.result,\n rawOutput,\n exitCode:\n timedOut || (exitCode === 0 && verdict.error?.startsWith('configuration:') === true)\n ? 1\n : exitCode,\n usage: parsed.usage,\n error: timedOut\n ? describeAgentFailure(proc, stderr || rawOutput, timeoutMs, elapsedMs, command)\n : (verdict.error ?? parsed.error ?? (stderr.trim() || rawOutput)),\n agent: { provider: this.id, model: parsed.model ?? settings.model },\n sessionId: parsed.sessionId ?? undefined,\n harnessVersion: peekHarnessVersion(this.id),\n };\n }\n\n return {\n success: true,\n result: parsed.result,\n rawOutput,\n exitCode,\n usage: parsed.usage,\n error: null,\n agent: { provider: this.id, model: parsed.model ?? settings.model },\n sessionId: parsed.sessionId ?? undefined,\n harnessVersion: peekHarnessVersion(this.id),\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const missing = /ENOENT|not found|command not found/i.test(message);\n return configurationFailure(\n agent,\n missing\n ? `configuration: opencode is not installed. Install OpenCode CLI: ${OPENCODE_INSTALL_URL}`\n : message,\n );\n } finally {\n cleanup?.();\n }\n }\n}\n","/**\n * Graceful shutdown: what a `Ctrl+C` does to a run that has been going for\n * hours.\n *\n * Before this module there was no `SIGINT` handler anywhere in the pipeline —\n * the only one in the project belonged to the web server — so an interrupt\n * killed the process mid-phase: nothing was marked as paused, no `session:end`\n * was published (leaving `session.json` on `running` forever), and the `claude`\n * child was orphaned rather than asked to stop. Resumption then worked by\n * accident, because a stale `in_progress` happens to be treated as \"do this\n * one first\".\n *\n * The sequence here is fixed, and the order is the whole design:\n *\n * 1. **stop accepting new work** — the process-wide `AbortSignal` fires, which\n * is the same signal every retry backoff already waits on, so a run sitting\n * in a two-minute delay stops in that instant instead of two minutes later;\n * 2. **write the checkpoint** — while the child is still alive and the state is\n * still coherent. Checkpointing after the kill would race the very writes it\n * is trying to capture;\n * 3. **ask the child to stop** — `SIGTERM`, then a grace period, then\n * `SIGKILL`. An agent given no chance to finish its sentence leaves a\n * half-written file behind;\n * 4. **close the surfaces** — the journal and the snapshot last, so everything\n * the previous steps published is on disk before the process ends.\n *\n * A second interrupt during the grace ends the process immediately: someone who\n * pressed `Ctrl+C` twice has said what they want, and waiting fifteen more\n * seconds to be polite is not it.\n */\n\n/** How long a child has to exit on its own before it is killed outright. */\nexport const SHUTDOWN_GRACE_MS = 15_000;\n\n/** How often the grace period checks whether the child is gone. */\nconst GRACE_POLL_MS = 100;\n\nexport type ShutdownReason = 'SIGINT' | 'SIGTERM';\n\n/** Exit codes by convention: 128 + the signal number. */\nconst EXIT_CODES: Readonly<Record<ShutdownReason, number>> = { SIGINT: 130, SIGTERM: 143 };\n\n/**\n * A child process the shutdown may terminate.\n *\n * Structural on purpose: an execa subprocess satisfies it without this module\n * depending on execa, and a test satisfies it with two lines.\n */\nexport interface TerminableChild {\n kill(signal?: NodeJS.Signals): boolean;\n /** Resolves once the process has exited, however it exited. Never rejects. */\n done: Promise<unknown>;\n}\n\nexport type ShutdownPhase =\n | /** Persist state. Runs while the child is still alive. */ 'checkpoint'\n | /** Flush and close output surfaces. Runs last. */ 'close';\n\nexport interface ShutdownHook {\n phase: ShutdownPhase;\n run: (reason: ShutdownReason) => void | Promise<void>;\n}\n\nexport interface InstallShutdownOptions {\n /** Grace given to a child between SIGTERM and SIGKILL. */\n graceMs?: number;\n /** Injectable exit, so a test can observe the code without dying. */\n exit?: (code: number) => void;\n /** Where the \"press again\" notice goes. Defaults to stderr. */\n notify?: (message: string) => void;\n /** Injectable signal source, so a test never touches the real process. */\n onSignal?: (signal: ShutdownReason, handler: () => void) => void;\n}\n\nlet controller: AbortController | null = null;\nlet installed = false;\nlet shuttingDown = false;\nlet forced = false;\nconst hooks = new Set<ShutdownHook>();\nconst children = new Set<TerminableChild>();\n\n/**\n * The process-wide abort signal.\n *\n * Created on first use rather than at install time, so a caller that only needs\n * the signal — a retry backoff, say — works identically whether or not handlers\n * were ever installed. That is what keeps every existing test path unchanged.\n */\nexport function getShutdownSignal(): AbortSignal {\n controller ??= new AbortController();\n return controller.signal;\n}\n\n/** Whether a shutdown has begun. New work must not be started after this. */\nexport function isShuttingDown(): boolean {\n return shuttingDown;\n}\n\n/** Register a hook. Returns the function that removes it again. */\nexport function onShutdown(hook: ShutdownHook): () => void {\n hooks.add(hook);\n return () => {\n hooks.delete(hook);\n };\n}\n\n/**\n * Register a child so the shutdown can ask it to stop.\n *\n * The returned function deregisters it, and **must** be called when the child\n * finishes normally: a set that only grows would have the shutdown signalling\n * pids that belong to something else entirely by then.\n */\nexport function registerChild(child: TerminableChild): () => void {\n children.add(child);\n return () => {\n children.delete(child);\n };\n}\n\n/**\n * Install the `SIGINT`/`SIGTERM` handlers, once per process.\n *\n * Idempotent by design: several entry points may call it, and a second set of\n * handlers would run the whole sequence twice — two checkpoints, two kills, two\n * exits.\n */\nexport function installShutdownHandlers(options: InstallShutdownOptions = {}): void {\n if (installed) return;\n installed = true;\n\n const listen =\n options.onSignal ??\n ((signal: ShutdownReason, handler: () => void) => {\n process.on(signal, handler);\n });\n\n for (const signal of ['SIGINT', 'SIGTERM'] as const) {\n listen(signal, () => {\n void beginShutdown(signal, options);\n });\n }\n}\n\n/**\n * Run the shutdown sequence. Exported for the callers that need to trigger it\n * without a signal (a fatal condition, a test).\n */\nexport async function beginShutdown(\n reason: ShutdownReason,\n options: InstallShutdownOptions = {},\n): Promise<void> {\n const exit = options.exit ?? ((code: number) => process.exit(code));\n const notify = options.notify ?? ((message: string) => process.stderr.write(`${message}\\n`));\n\n if (shuttingDown) {\n // Second interrupt. The person has said what they want.\n forced = true;\n killChildren('SIGKILL');\n exit(EXIT_CODES[reason]);\n return;\n }\n\n shuttingDown = true;\n // 1. Stop accepting new work, and cut every pending backoff short.\n getShutdownSignal();\n controller?.abort();\n notify(\n `\\nInterrupted. Saving a checkpoint and stopping the agent (press ${reason === 'SIGINT' ? 'Ctrl+C' : 'the signal'} again to quit now)…`,\n );\n\n // 2. Checkpoint, while the child is still alive and the state is coherent.\n await runHooks('checkpoint', reason, notify);\n\n // 3. Ask the child to stop, then insist.\n await terminateChildren(options.graceMs ?? SHUTDOWN_GRACE_MS);\n\n // 4. Close the output surfaces last, so everything above is on disk.\n await runHooks('close', reason, notify);\n\n exit(EXIT_CODES[reason]);\n}\n\nasync function runHooks(\n phase: ShutdownPhase,\n reason: ShutdownReason,\n notify: (message: string) => void,\n): Promise<void> {\n for (const hook of [...hooks]) {\n if (hook.phase !== phase) continue;\n try {\n await hook.run(reason);\n } catch (err) {\n // A hook that fails must not stop the ones after it: the journal still\n // has to be closed even if the checkpoint could not be written.\n notify(\n `issue-flow: a shutdown step failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n}\n\nfunction killChildren(signal: NodeJS.Signals): void {\n for (const child of [...children]) {\n try {\n child.kill(signal);\n } catch {\n // Already gone. Nothing to do.\n }\n }\n}\n\n/**\n * `SIGTERM`, then wait, then `SIGKILL`.\n *\n * The wait ends early when every child has exited, and immediately when a\n * second interrupt arrives — polling rather than racing the `done` promises so\n * that a child which never settles cannot hold the process open forever.\n */\nasync function terminateChildren(graceMs: number): Promise<void> {\n if (children.size === 0) return;\n\n const pending = [...children];\n let alive = pending.length;\n for (const child of pending) {\n void child.done.then(\n () => {\n alive--;\n },\n () => {\n alive--;\n },\n );\n }\n\n killChildren('SIGTERM');\n\n const deadline = Date.now() + graceMs;\n while (alive > 0 && !forced && Date.now() < deadline) {\n await sleep(GRACE_POLL_MS);\n }\n\n if (alive > 0) killChildren('SIGKILL');\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n timer.unref?.();\n });\n}\n\n/** Drop every handler, hook and child. For tests only. */\nexport function resetShutdownState(): void {\n controller = null;\n installed = false;\n shuttingDown = false;\n forced = false;\n hooks.clear();\n children.clear();\n}\n","import { SHUTDOWN_GRACE_MS, type TerminableChild } from './shutdown.js';\n\n/**\n * Inactivity watchdog: telling a long task from a stuck one.\n *\n * The pipeline had exactly one instrument for a hung agent — the absolute\n * timeout — and it cannot tell the difference between a phase that has been\n * working hard for fourteen minutes and a phase that has produced nothing for\n * fourteen minutes. The execute loop did not even have that: it runs with\n * `timeout: 0` by design, because its budget is iterations rather than seconds,\n * so a `claude` that hangs without printing anything hangs forever.\n *\n * What separates the two cases is *output*. An agent that is working emits\n * events continuously; one that is stuck emits nothing. So the watchdog watches\n * the stream, not the clock: every event is a heartbeat, and only the **absence**\n * of heartbeats for longer than the limit is a stall.\n *\n * The absolute timeout stays exactly where it was. This is a second, tighter\n * instrument, not a replacement: the ceiling still bounds a task that keeps\n * talking and never finishes.\n */\n\n/** Default silence before a child is considered stuck. */\nexport const DEFAULT_INACTIVITY_TIMEOUT_MS = 600_000;\n\nexport interface WatchdogOptions {\n /** Silence tolerated before the child is stopped. `0` disables the watchdog. */\n inactivityTimeoutMs?: number;\n /** The process to stop. Omitted for a watchdog that only reports. */\n child?: TerminableChild;\n /** Grace between `SIGTERM` and `SIGKILL`. Defaults to the shutdown's. */\n graceMs?: number;\n /** Called once, when the silence limit is crossed. */\n onStall?: (silentMs: number) => void;\n /** Injectable clock, so a test drives the silence without waiting for it. */\n clock?: () => number;\n /** Injectable timer factory, so a test can use fake timers deliberately. */\n setInterval?: (handler: () => void, ms: number) => NodeJS.Timeout;\n clearInterval?: (timer: NodeJS.Timeout) => void;\n}\n\nexport interface Watchdog {\n /** Record a sign of life. Called once per event of the stream. */\n beat(): void;\n /** Whether the watchdog decided the child was stuck. */\n readonly stalled: boolean;\n /** How long the child had been silent when it was judged. */\n readonly silentMs: number;\n /** Stop watching. Idempotent; always call it when the child finishes. */\n stop(): void;\n}\n\n/** How often the silence is measured, as a fraction of the limit. */\nconst CHECK_DIVISOR = 10;\nconst MIN_CHECK_MS = 250;\nconst MAX_CHECK_MS = 5_000;\n\nfunction checkIntervalFor(timeoutMs: number): number {\n return Math.min(MAX_CHECK_MS, Math.max(MIN_CHECK_MS, Math.floor(timeoutMs / CHECK_DIVISOR)));\n}\n\n/**\n * Watch a stream for silence and stop the child when it goes quiet.\n *\n * `inactivityTimeoutMs: 0` returns an inert watchdog: `beat()` is a no-op and\n * nothing is ever killed. That is the documented \"off\" switch, and it is what\n * keeps this feature opt-out without a second code path anywhere else.\n */\nexport function createWatchdog(options: WatchdogOptions = {}): Watchdog {\n const timeoutMs = options.inactivityTimeoutMs ?? DEFAULT_INACTIVITY_TIMEOUT_MS;\n const clock = options.clock ?? Date.now;\n const start = options.setInterval ?? ((handler, ms) => setInterval(handler, ms));\n const clear = options.clearInterval ?? ((timer) => clearInterval(timer));\n\n const state = { stalled: false, silentMs: 0 };\n\n if (timeoutMs <= 0) {\n return {\n beat: () => {},\n stop: () => {},\n get stalled() {\n return state.stalled;\n },\n get silentMs() {\n return state.silentMs;\n },\n };\n }\n\n let lastBeat = clock();\n let timer: NodeJS.Timeout | null = null;\n let killTimer: NodeJS.Timeout | null = null;\n\n const stop = (): void => {\n if (timer !== null) {\n clear(timer);\n timer = null;\n }\n if (killTimer !== null) {\n clearTimeout(killTimer);\n killTimer = null;\n }\n };\n\n const declareStalled = (): void => {\n state.stalled = true;\n state.silentMs = clock() - lastBeat;\n stop();\n options.onStall?.(state.silentMs);\n\n const child = options.child;\n if (child === undefined) return;\n\n // The same courtesy the shutdown extends: ask first, insist after. An agent\n // killed outright mid-write leaves a half-written file behind.\n child.kill('SIGTERM');\n killTimer = setTimeout(() => {\n child.kill('SIGKILL');\n }, options.graceMs ?? SHUTDOWN_GRACE_MS);\n killTimer.unref?.();\n void child.done.then(\n () => {\n if (killTimer !== null) {\n clearTimeout(killTimer);\n killTimer = null;\n }\n },\n () => {},\n );\n };\n\n timer = start(() => {\n if (state.stalled) return;\n if (clock() - lastBeat > timeoutMs) declareStalled();\n }, checkIntervalFor(timeoutMs));\n timer.unref?.();\n\n return {\n beat: () => {\n lastBeat = clock();\n },\n stop,\n get stalled() {\n return state.stalled;\n },\n get silentMs() {\n return state.silentMs;\n },\n };\n}\n\n/**\n * The message a stalled invocation reports.\n *\n * The wording is a contract, exactly like the timeout's: `classify()` reads it\n * as a last resort, and `stalled` has to survive the trip through a plain\n * string so the phase gets its retries.\n */\nexport function describeStall(silentMs: number, provider = 'claude'): string {\n return `${provider} produced no output for ${Math.round(silentMs / 1000)}s and was stopped (stalled)`;\n}\n","import { execa } from 'execa';\nimport { registerChild } from '../core/shutdown.js';\nimport { createWatchdog, describeStall } from '../core/watchdog.js';\nimport { peekHarnessVersion } from './claude.js';\nimport { describeAgentFailure, wasTimedOut } from './process.js';\nimport {\n type AgentInvocation,\n type AgentRunner,\n type AgentRunResult,\n type AgentUsage,\n ANTIGRAVITY_CAPABILITIES,\n type AntigravitySettings,\n type ResolvedAgentSettings,\n} from './types.js';\n\nexport const ANTIGRAVITY_MIN_VERSION = '1.1.22';\nexport const DEFAULT_EXECUTE_TIMEOUT_MS = 4 * 60 * 60 * 1000;\nexport const DEFAULT_MAX_PROMPT_BYTES = 100_000;\n\nconst TOOL_NAMES: Record<string, string> = {\n run_command: 'Bash',\n command_status: 'Bash',\n view_file: 'Read',\n read_resource: 'Read',\n write_to_file: 'Edit',\n replace_file_content: 'Edit',\n multi_replace_file_content: 'Edit',\n notebook_edit: 'Edit',\n grep_search: 'Grep',\n find_by_name: 'Glob',\n list_dir: 'Glob',\n read_url_content: 'WebFetch',\n open_browser_url: 'WebFetch',\n};\n\nexport type AntigravityStatus = 'SUCCESS' | 'ERROR' | 'CANCELED' | 'INTERRUPTED' | 'WAITING';\n\nexport interface AntigravityParsed {\n result: string;\n status: AntigravityStatus | null;\n sessionId: string | null;\n model: string | null;\n usage: AgentUsage | null;\n seenResult: boolean;\n permissionDenied: { tool: string; message: string } | null;\n warnings: string[];\n error: string | null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport function formatPrintTimeout(ms: number): string {\n const totalSeconds = Math.max(1, Math.round(ms / 1000));\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n let out = '';\n if (hours > 0) out += `${hours}h`;\n if (minutes > 0 || hours > 0) out += `${minutes}m`;\n out += `${seconds}s`;\n return out;\n}\n\nexport function parseDurationMs(value: string | number | null | undefined): number | null {\n if (value === undefined) return DEFAULT_EXECUTE_TIMEOUT_MS;\n if (value === null) return null;\n if (typeof value === 'number') return value > 0 ? value : null;\n const trimmed = value.trim();\n if (trimmed === '' || trimmed === '0') return null;\n const match = trimmed.match(/^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+(?:\\.\\d+)?)s)?$/);\n if (!match || match[0] === '') return null;\n const hours = Number(match[1] ?? 0);\n const minutes = Number(match[2] ?? 0);\n const seconds = Number(match[3] ?? 0);\n const ms = ((hours * 60 + minutes) * 60 + seconds) * 1000;\n return ms > 0 ? ms : null;\n}\n\nexport function resolveAntigravityTimeoutMs(\n invocation: Pick<AgentInvocation, 'timeout'>,\n settings: Pick<ResolvedAgentSettings, 'antigravity'>,\n): number | null {\n if (invocation.timeout > 0) return invocation.timeout;\n return parseDurationMs(settings.antigravity.executeTimeout);\n}\n\nexport function compareVersions(actual: string, minimum: string): number {\n const left = actual\n .replace(/^v/i, '')\n .split(/[.-]/)\n .map((part) => Number.parseInt(part, 10) || 0);\n const right = minimum\n .replace(/^v/i, '')\n .split(/[.-]/)\n .map((part) => Number.parseInt(part, 10) || 0);\n const length = Math.max(left.length, right.length);\n for (let i = 0; i < length; i++) {\n const a = left[i] ?? 0;\n const b = right[i] ?? 0;\n if (a > b) return 1;\n if (a < b) return -1;\n }\n return 0;\n}\n\nexport function normalizeAntigravityTool(name: string): string {\n if (name.startsWith('call_mcp_tool')) return name;\n return TOOL_NAMES[name] ?? name;\n}\n\nexport function parseAntigravityUsage(\n usage: unknown,\n numTurns: number | undefined,\n): AgentUsage | null {\n if (!isRecord(usage)) return null;\n if (numTurns === 0) return null;\n const input = usage.input_tokens;\n const output = usage.output_tokens;\n const cacheRead = usage.cache_read_tokens;\n const result: AgentUsage = {};\n if (typeof input === 'number' && Number.isFinite(input)) result.inputTokens = input;\n if (typeof output === 'number' && Number.isFinite(output)) result.outputTokens = output;\n if (typeof cacheRead === 'number' && Number.isFinite(cacheRead)) {\n result.cacheReadTokens = cacheRead;\n }\n if (typeof numTurns === 'number' && Number.isFinite(numTurns)) result.numTurns = numTurns;\n if (Object.keys(result).length === 0) return null;\n return result;\n}\n\nfunction isPermissionDenial(message: string): boolean {\n return /permission check failed|user denied permission/i.test(message);\n}\n\nfunction mainParameter(parameters: Record<string, unknown>): string {\n for (const key of ['CommandLine', 'TargetFile', 'Path', 'Query', 'Url', 'url']) {\n const value = parameters[key];\n if (typeof value === 'string' && value !== '') {\n return value.length > 80 ? `${value.slice(0, 77)}...` : value;\n }\n }\n return '';\n}\n\nexport function consumeAntigravityEvent(\n event: Record<string, unknown>,\n onEvent: AgentInvocation['onEvent'],\n acc: AntigravityParsed,\n): void {\n if (event.event === 'init') {\n if (typeof event.conversation_id === 'string') acc.sessionId = event.conversation_id;\n return;\n }\n\n if (event.event === 'step_update') {\n const step = isRecord(event.step_update) ? event.step_update : {};\n if (typeof step.text_delta === 'string' && step.text_delta !== '') {\n onEvent?.({ kind: 'text', text: step.text_delta });\n }\n if (step.step_type === 'tool') {\n const rawName = typeof step.tool_name === 'string' ? step.tool_name : 'tool';\n const info = isRecord(step.tool_info) ? step.tool_info : {};\n const parameters = isRecord(info.parameters) ? info.parameters : {};\n const detail = mainParameter(parameters);\n const name =\n rawName === 'call_mcp_tool' ? mcpToolName(parameters) : normalizeAntigravityTool(rawName);\n if (step.state === 'ACTIVE') {\n onEvent?.({ kind: 'tool', name, ...(detail === '' ? {} : { detail }) });\n }\n if (step.state === 'ERROR') {\n const err = isRecord(info.error) ? info.error : {};\n const message = typeof err.message === 'string' ? err.message : 'TOOL_ERROR';\n if (isPermissionDenial(message)) {\n acc.permissionDenied = { tool: rawName, message };\n } else {\n acc.warnings.push(`TOOL_ERROR on ${rawName}: ${message}`);\n }\n }\n }\n return;\n }\n\n if (event.event === 'result') {\n acc.seenResult = true;\n const result = isRecord(event.result) ? event.result : event;\n if (typeof result.conversation_id === 'string') acc.sessionId = result.conversation_id;\n if (typeof result.response === 'string') acc.result = result.response;\n if (typeof result.error === 'string' && result.error !== '') acc.error = result.error;\n if (typeof result.status === 'string') {\n acc.status = result.status as AntigravityStatus;\n }\n const numTurns = typeof result.num_turns === 'number' ? result.num_turns : undefined;\n acc.usage = parseAntigravityUsage(result.usage, numTurns);\n }\n}\n\nfunction mcpToolName(parameters: Record<string, unknown>): string {\n const server = typeof parameters.server === 'string' ? parameters.server : '';\n const tool = typeof parameters.tool === 'string' ? parameters.tool : '';\n if (server && tool) return `${server}/${tool}`;\n if (tool) return tool;\n if (server) return server;\n return 'call_mcp_tool';\n}\n\nexport function parseAntigravityStream(\n raw: string,\n onEvent?: AgentInvocation['onEvent'],\n): AntigravityParsed {\n const acc: AntigravityParsed = {\n result: '',\n status: null,\n sessionId: null,\n model: null,\n usage: null,\n seenResult: false,\n permissionDenied: null,\n warnings: [],\n error: null,\n };\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed === '') continue;\n try {\n const event = JSON.parse(trimmed) as unknown;\n if (!isRecord(event)) continue;\n consumeAntigravityEvent(event, onEvent, acc);\n } catch {\n // Malformed NDJSON is ignored, like the other runners.\n }\n }\n return acc;\n}\n\nexport function maxPromptBytesOf(settings: AntigravitySettings): number {\n return settings.maxPromptBytes ?? DEFAULT_MAX_PROMPT_BYTES;\n}\n\nexport function buildAntigravityArgv(\n invocation: AgentInvocation,\n settings: ResolvedAgentSettings,\n): { command: string; args: string[] } | { error: string } {\n const timeoutMs = resolveAntigravityTimeoutMs(invocation, settings);\n if (timeoutMs === null) {\n return {\n error:\n 'configuration: Antigravity has nativeTimeout and received timeout: 0 without a ceiling. Set agent.antigravity.executeTimeout (default 4h).',\n };\n }\n\n const promptBytes = Buffer.byteLength(invocation.prompt, 'utf8');\n const limit = maxPromptBytesOf(settings.antigravity);\n if (promptBytes > limit) {\n return {\n error: `configuration: prompt exceeds Antigravity argv limit (${promptBytes} bytes > ${limit} maxPromptBytes). The promptChannel is argv; shorten the prompt or raise agent.antigravity.maxPromptBytes.`,\n };\n }\n\n const workspace = invocation.workingDirectory ?? process.cwd();\n const args = [\n '-p',\n invocation.prompt,\n '--output-format',\n 'stream-json',\n '--print-timeout',\n formatPrintTimeout(timeoutMs),\n '--add-dir',\n workspace,\n '--dangerously-skip-permissions',\n '--disable-slash-commands',\n '--mode',\n invocation.permission === 'read-only' ? 'plan' : 'accept-edits',\n ];\n for (const dir of invocation.addDirs ?? []) {\n args.push('--add-dir', dir);\n }\n if (settings.model) args.push('--model', settings.model);\n if (settings.antigravity.effort) args.push('--effort', settings.antigravity.effort);\n if (settings.antigravity.sandbox === true) args.push('--sandbox');\n return { command: 'agy', args };\n}\n\nexport function antigravityRunVerdict(input: {\n exitCode: number;\n parsed: AntigravityParsed;\n timedOut: boolean;\n}): { success: boolean; error: string | null } {\n if (input.parsed.permissionDenied) {\n return {\n success: false,\n error: `configuration: permission check failed for ${input.parsed.permissionDenied.tool}. --dangerously-skip-permissions is required so Antigravity does not finish SUCCESS without writing. ${input.parsed.permissionDenied.message}`,\n };\n }\n if (input.parsed.status === 'WAITING') {\n return {\n success: false,\n error:\n 'configuration: Antigravity ended waiting for human input (status: WAITING). Headless runs cannot continue from a prompt.',\n };\n }\n if (input.parsed.status === 'CANCELED' || input.parsed.status === 'INTERRUPTED') {\n return { success: false, error: `Antigravity was ${input.parsed.status.toLowerCase()}.` };\n }\n if (!input.parsed.seenResult) {\n return {\n success: false,\n error: 'configuration: Antigravity finished without a result event in the stream.',\n };\n }\n if (\n input.parsed.status === 'ERROR' ||\n input.parsed.status !== 'SUCCESS' ||\n input.exitCode !== 0 ||\n input.timedOut\n ) {\n return {\n success: false,\n error: input.parsed.error ?? `agy exited with code ${input.exitCode}`,\n };\n }\n return { success: true, error: null };\n}\n\nfunction configurationFailure(\n agent: AgentRunResult['agent'],\n message: string,\n rawOutput = message,\n): AgentRunResult {\n return {\n success: false,\n result: '',\n rawOutput,\n exitCode: 1,\n usage: null,\n error: message,\n agent,\n harnessVersion: peekHarnessVersion('antigravity'),\n };\n}\n\nexport class AntigravityRunner implements AgentRunner {\n readonly id = 'antigravity' as const;\n readonly capabilities = ANTIGRAVITY_CAPABILITIES;\n\n versionCommand(): { command: string; args: string[] } {\n return { command: 'agy', args: ['--version'] };\n }\n\n async run(invocation: AgentInvocation, settings: ResolvedAgentSettings): Promise<AgentRunResult> {\n const agent = { provider: this.id, model: settings.model } as const;\n const built = buildAntigravityArgv(invocation, settings);\n if ('error' in built) return configurationFailure(agent, built.error);\n\n const minimum = settings.antigravity.minVersion ?? ANTIGRAVITY_MIN_VERSION;\n const installed = peekHarnessVersion(this.id);\n if (typeof installed === 'string' && compareVersions(installed, minimum) < 0) {\n return configurationFailure(\n agent,\n `configuration: agy ${installed} is below the minimum ${minimum}. Update Antigravity CLI.`,\n );\n }\n\n const { command, args } = built;\n const startTime = Date.now();\n const timeoutMs = resolveAntigravityTimeoutMs(invocation, settings) ?? invocation.timeout;\n\n let cleanup: (() => void) | null = null;\n try {\n const subprocess = execa(command, args, {\n reject: false,\n timeout: timeoutMs > 0 ? timeoutMs : undefined,\n stripFinalNewline: false,\n stdin: 'ignore',\n ...(invocation.workingDirectory ? { cwd: invocation.workingDirectory } : {}),\n });\n const unregister = registerChild({\n kill: (signal) => subprocess.kill(signal),\n done: subprocess.then(\n () => undefined,\n () => undefined,\n ),\n });\n const watchdog = createWatchdog({\n ...(invocation.inactivityTimeoutMs === undefined\n ? {}\n : { inactivityTimeoutMs: invocation.inactivityTimeoutMs }),\n child: {\n kill: (signal) => subprocess.kill(signal),\n done: subprocess.then(\n () => undefined,\n () => undefined,\n ),\n },\n });\n // The stream can reject; the watchdog timer and the shutdown registry\n // must not outlive the call either way.\n cleanup = () => {\n watchdog.stop();\n unregister();\n };\n\n const chunks: string[] = [];\n if (subprocess.stdout) {\n subprocess.stdout.on('data', (chunk: Buffer | string) => {\n watchdog.beat();\n const text = chunk.toString();\n chunks.push(text);\n invocation.onLine?.(text);\n });\n }\n if (subprocess.stderr) {\n subprocess.stderr.on('data', () => {\n watchdog.beat();\n });\n }\n\n const proc = await subprocess;\n watchdog.stop();\n unregister();\n\n const stdout = chunks.join('') || proc.stdout?.toString() || '';\n const stderr = proc.stderr?.toString() ?? '';\n const parsed = parseAntigravityStream(stdout, invocation.onEvent);\n const warningBlock = parsed.warnings.length > 0 ? `\\n${parsed.warnings.join('\\n')}` : '';\n const rawOutput = stdout + (stderr ? `\\n${stderr}` : '') + warningBlock;\n const exitCode = proc.exitCode ?? 1;\n const elapsedMs = Date.now() - startTime;\n const timedOut = wasTimedOut(proc, timeoutMs, elapsedMs);\n const stalled = watchdog.stalled;\n const authFailed = /not logged into antigravity|authentication required/i.test(\n `${stderr}\\n${stdout}`,\n );\n\n // A stall has to survive as text in `rawOutput`: that is the field the\n // executor forwards to `classify()`, and `error` never reaches it. Same\n // shape as claude.ts and codex.ts.\n if (stalled) {\n return {\n success: false,\n result: '',\n rawOutput: describeStall(watchdog.silentMs, 'agy'),\n exitCode: 1,\n usage: parsed.usage,\n error: describeStall(watchdog.silentMs, 'agy'),\n agent: { provider: this.id, model: parsed.model ?? settings.model },\n sessionId: parsed.sessionId ?? undefined,\n harnessVersion: peekHarnessVersion(this.id),\n };\n }\n\n if (authFailed) {\n return {\n success: false,\n result: parsed.result,\n rawOutput,\n exitCode: timedOut ? 1 : exitCode,\n usage: parsed.usage,\n error: stderr.trim() || 'You are not logged into Antigravity.',\n agent: { provider: this.id, model: parsed.model ?? settings.model },\n sessionId: parsed.sessionId ?? undefined,\n harnessVersion: peekHarnessVersion(this.id),\n };\n }\n\n const verdict = antigravityRunVerdict({ exitCode, parsed, timedOut });\n if (!verdict.success) {\n return {\n success: false,\n result: parsed.result,\n rawOutput,\n exitCode:\n timedOut || (exitCode === 0 && verdict.error?.startsWith('configuration:') === true)\n ? 1\n : exitCode,\n usage: parsed.usage,\n error: timedOut\n ? describeAgentFailure(proc, stderr || rawOutput, timeoutMs, elapsedMs, command)\n : (verdict.error ?? parsed.error ?? (stderr.trim() || rawOutput)),\n agent: { provider: this.id, model: parsed.model ?? settings.model },\n sessionId: parsed.sessionId ?? undefined,\n harnessVersion: peekHarnessVersion(this.id),\n };\n }\n\n return {\n success: true,\n result: parsed.result,\n rawOutput,\n exitCode,\n usage: parsed.usage,\n error: null,\n agent: { provider: this.id, model: parsed.model ?? settings.model },\n sessionId: parsed.sessionId ?? undefined,\n harnessVersion: peekHarnessVersion(this.id),\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const missing = /ENOENT|not found|command not found/i.test(message);\n return configurationFailure(\n agent,\n missing\n ? 'configuration: agy is not installed. Install Antigravity CLI: https://antigravity.google/docs/cli/install/'\n : message,\n );\n } finally {\n cleanup?.();\n }\n }\n}\n","import { execa } from 'execa';\nimport { parseUsage } from '../core/metrics.js';\nimport { registerChild } from '../core/shutdown.js';\nimport { readClaudeStream } from '../core/stream.js';\nimport { createWatchdog, describeStall } from '../core/watchdog.js';\nimport { pushRepeatedFlag } from './argv.js';\nimport { describeAgentFailure, reachedTimeout } from './process.js';\nimport {\n type AgentInvocation,\n type AgentRunner,\n type AgentRunResult,\n CLAUDE_CAPABILITIES,\n type ResolvedAgentSettings,\n} from './types.js';\n\n/**\n * Tools that let a \"read-only\" Claude session write anyway: a subagent\n * (`Agent`/`Task`) inherits the full toolset, `Monitor` runs shell in the\n * background, `NotebookEdit` writes files. Deny-list, not allow-list — the\n * evidence is in the issue comments (`awslabs/cli-agent-orchestrator`).\n */\nconst READ_ONLY_DENIED_TOOLS = [\n 'Agent',\n 'Task',\n 'Monitor',\n 'NotebookEdit',\n 'Edit',\n 'Write',\n] as const;\n\nfunction toolContext(name: string, input: Record<string, unknown>): string {\n switch (name) {\n case 'Read':\n case 'Write':\n case 'Edit':\n return shortPath(typeof input.file_path === 'string' ? input.file_path : undefined);\n case 'Glob':\n case 'Grep':\n return typeof input.pattern === 'string' ? input.pattern : '';\n case 'Bash': {\n const cmd = typeof input.command === 'string' ? input.command : '';\n return cmd.length > 60 ? `${cmd.substring(0, 57)}...` : cmd;\n }\n default:\n return '';\n }\n}\n\nfunction shortPath(filePath: string | undefined): string {\n if (!filePath) return '';\n const cwd = process.cwd();\n if (filePath.startsWith(cwd)) return filePath.substring(cwd.length + 1);\n const parts = filePath.split('/');\n return parts.length > 2 ? `.../${parts.slice(-2).join('/')}` : filePath;\n}\n\nfunction emitClaudeEvent(\n event: Record<string, unknown>,\n onEvent: AgentInvocation['onEvent'],\n): void {\n if (!onEvent) return;\n if (event.type !== 'assistant') return;\n const message = event.message;\n if (typeof message !== 'object' || message === null) return;\n const content = (message as { content?: unknown }).content;\n if (!Array.isArray(content)) return;\n\n for (const block of content) {\n if (typeof block !== 'object' || block === null) continue;\n const item = block as {\n type?: string;\n text?: string;\n name?: string;\n input?: Record<string, unknown>;\n };\n if (item.type === 'text' && item.text) {\n onEvent({ kind: 'text', text: item.text });\n }\n if (item.type === 'tool_use' && item.name) {\n const detail = item.input ? toolContext(item.name, item.input) : '';\n onEvent({ kind: 'tool', name: item.name, ...(detail ? { detail } : {}) });\n }\n }\n}\n\n/**\n * Build the argv for one Claude invocation.\n *\n * Unconfigured `workspace` matches the historical `runHeadless` argv\n * byte for byte. Unconfigured `autonomous` matches `executeClaude`.\n * `read-only` is the one translation that changed: `--allowedTools` alone\n * does not restrict, so the runner adds `--permission-mode plan` and a\n * deny-list. `--model` and `--setting-sources` appear only when resolved.\n */\nexport function buildClaudeArgv(\n invocation: AgentInvocation,\n settings: ResolvedAgentSettings,\n): { args: string[]; stdinMode: 'ignore' | 'prompt' } {\n if (invocation.permission === 'autonomous') {\n const args = [\n '--dangerously-skip-permissions',\n '--print',\n '--output-format',\n 'stream-json',\n '--verbose',\n ];\n if (settings.model) args.push('--model', settings.model);\n if (settings.claude.ignoreUserConfig === true) {\n args.push('--setting-sources', 'project');\n if (settings.claude.strictMcpConfig !== false) {\n args.push('--strict-mcp-config');\n }\n }\n pushRepeatedFlag(args, '--add-dir', invocation.addDirs);\n return { args, stdinMode: 'prompt' };\n }\n\n const maxTurns = invocation.maxTurns ?? 10;\n const args = [\n '-p',\n invocation.prompt,\n '--output-format',\n 'stream-json',\n '--verbose',\n '--max-turns',\n String(maxTurns),\n ];\n\n pushRepeatedFlag(args, '--allowedTools', invocation.allowedTools);\n pushRepeatedFlag(args, '--add-dir', invocation.addDirs);\n\n if (invocation.permission === 'read-only') {\n args.push('--permission-mode', 'plan');\n const allowed = new Set(invocation.allowedTools ?? []);\n const denied = READ_ONLY_DENIED_TOOLS.filter((tool) => !allowed.has(tool));\n if (denied.length > 0) {\n args.push('--disallowedTools', ...denied);\n }\n }\n\n if (settings.model) args.push('--model', settings.model);\n if (settings.claude.ignoreUserConfig === true) {\n args.push('--setting-sources', 'project');\n if (settings.claude.strictMcpConfig !== false) {\n args.push('--strict-mcp-config');\n }\n }\n\n return { args, stdinMode: 'ignore' };\n}\n\nexport class ClaudeCodeRunner implements AgentRunner {\n readonly id = 'claude' as const;\n readonly capabilities = CLAUDE_CAPABILITIES;\n\n versionCommand(): { command: string; args: string[] } {\n return { command: 'claude', args: ['--version'] };\n }\n\n async run(invocation: AgentInvocation, settings: ResolvedAgentSettings): Promise<AgentRunResult> {\n const { args, stdinMode } = buildClaudeArgv(invocation, settings);\n const execaOptions = {\n reject: false as const,\n timeout: invocation.timeout,\n stripFinalNewline: false as const,\n ...(stdinMode === 'prompt' ? { input: invocation.prompt } : { stdin: 'ignore' as const }),\n ...(invocation.workingDirectory ? { cwd: invocation.workingDirectory } : {}),\n };\n\n const startTime = Date.now();\n const agent = { provider: this.id, model: settings.model } as const;\n const base = {\n agent,\n harnessVersion: peekHarnessVersion(this.id),\n };\n\n let cleanup: (() => void) | null = null;\n try {\n const subprocess = execa('claude', args, execaOptions);\n const unregister = registerChild({\n kill: (signal) => subprocess.kill(signal),\n done: subprocess.then(\n () => undefined,\n () => undefined,\n ),\n });\n\n const watchdog = createWatchdog({\n ...(invocation.inactivityTimeoutMs === undefined\n ? {}\n : { inactivityTimeoutMs: invocation.inactivityTimeoutMs }),\n child: {\n kill: (signal) => subprocess.kill(signal),\n done: subprocess.then(\n () => undefined,\n () => undefined,\n ),\n },\n });\n // The stream can reject; the watchdog timer and the shutdown registry\n // must not outlive the call either way.\n cleanup = () => {\n watchdog.stop();\n unregister();\n };\n\n let streamed: Awaited<ReturnType<typeof readClaudeStream>> = {\n result: '',\n isError: false,\n usage: null,\n events: 0,\n raw: '',\n };\n if (subprocess.stdout) {\n streamed = await readClaudeStream(subprocess.stdout, {\n onLine: (line) => {\n watchdog.beat();\n invocation.onLine?.(line);\n },\n onEvent: (event) => emitClaudeEvent(event, invocation.onEvent),\n });\n }\n\n const proc = await subprocess;\n watchdog.stop();\n unregister();\n\n const stdout = streamed.raw === '' ? (proc.stdout?.toString() ?? '') : streamed.raw;\n const stderr = proc.stderr?.toString() ?? '';\n const rawOutput = stdout + (stderr ? `\\n${stderr}` : '');\n const exitCode = proc.exitCode ?? 1;\n const elapsedMs = Date.now() - startTime;\n\n if (watchdog.stalled) {\n return {\n success: false,\n result: '',\n rawOutput: describeStall(watchdog.silentMs),\n exitCode: exitCode === 0 ? 1 : exitCode,\n usage: null,\n error: describeStall(watchdog.silentMs),\n ...base,\n };\n }\n\n if (exitCode !== 0) {\n return {\n success: false,\n result: '',\n rawOutput,\n exitCode,\n usage: null,\n error: describeAgentFailure(\n proc,\n stderr || stdout,\n invocation.timeout,\n elapsedMs,\n 'claude',\n ),\n ...base,\n };\n }\n\n if (streamed.result !== '') {\n return {\n success: !streamed.isError,\n result: streamed.result,\n rawOutput,\n exitCode,\n usage: streamed.usage,\n error: streamed.isError ? streamed.result : null,\n ...base,\n };\n }\n\n try {\n const parsed = JSON.parse(stdout) as Record<string, unknown>;\n const resultText = typeof parsed.result === 'string' ? parsed.result : stdout;\n const isError = parsed.is_error === true;\n return {\n success: !isError,\n result: resultText,\n rawOutput,\n exitCode,\n usage: parseUsage(parsed),\n error: isError ? resultText : null,\n ...base,\n };\n } catch {\n return {\n success: true,\n result: rawOutput,\n rawOutput,\n exitCode,\n usage: null,\n error: null,\n ...base,\n };\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const elapsedMs = Date.now() - startTime;\n const timedOut = message.includes('timed out') || message.includes('ETIMEDOUT');\n return {\n success: false,\n result: '',\n rawOutput: message,\n exitCode: 1,\n usage: null,\n error: timedOut\n ? describeAgentFailure(\n { timedOut: reachedTimeout(invocation.timeout, elapsedMs) },\n message,\n invocation.timeout,\n elapsedMs,\n 'claude',\n )\n : message,\n ...base,\n };\n } finally {\n cleanup?.();\n }\n }\n}\n\n/** Process-wide harness versions, filled by `ensureHarnessVersion`. */\nconst harnessVersions = new Map<string, string | null>();\n\nexport function peekHarnessVersion(id: string): string | null | undefined {\n return harnessVersions.has(id) ? (harnessVersions.get(id) ?? null) : undefined;\n}\n\nexport function cacheHarnessVersion(id: string, version: string | null): void {\n harnessVersions.set(id, version);\n}\n","import { createInterface } from 'node:readline';\nimport type { Readable } from 'node:stream';\nimport { type ClaudeUsage, parseUsage } from './metrics.js';\n\n/**\n * Reading the CLI's `stream-json` output.\n *\n * The project used to ask for two different formats depending on whether the\n * user passed `--verbose`: `stream-json` when it had something to print, and a\n * single `json` envelope otherwise. The envelope is one write at the very end,\n * which means the non-verbose path — the common one, and the one that runs\n * unattended for hours — had **no signal at all** while the agent worked. An\n * agent that hung produced exactly the same observable behaviour as one that\n * was thinking.\n *\n * So the stream is now always what is requested, and only the *rendering*\n * differs: verbose prints each event, non-verbose feeds a spinner and a\n * watchdog heartbeat. This module is the half both share — the parsing, the\n * final result and the usage — so neither can drift from the other.\n */\n\n/** What a finished stream yielded. */\nexport interface StreamOutcome {\n /** Assistant text of the `result` event; `''` when none arrived. */\n result: string;\n /** Whether the `result` event reported an error. */\n isError: boolean;\n usage: ClaudeUsage | null;\n /** How many lines were read. `0` means the CLI printed nothing at all. */\n events: number;\n /**\n * Everything the stream printed, joined back together.\n *\n * The fallback for a CLI build that ignores `--output-format` and prints\n * plain text: the stream is consumed by the time the process finishes, so\n * `result.stdout` is empty and this is the only copy of what it said.\n */\n raw: string;\n}\n\nexport interface ReadStreamOptions {\n /** Called for every line, parsed or not. This is the watchdog's heartbeat. */\n onLine?: (line: string) => void;\n /** Called for every event that parsed, after `onLine`. */\n onEvent?: (event: Record<string, unknown>) => void;\n}\n\n/**\n * Consume `stream-json` from `stdout` until it ends.\n *\n * Malformed lines are skipped rather than fatal: the CLI interleaves its own\n * diagnostics with the stream, and a run must not die because one line was not\n * JSON. They still count as activity — a process writing anything is a process\n * that is alive, which is the only question the watchdog is asking.\n */\nexport async function readClaudeStream(\n stdout: Readable,\n options: ReadStreamOptions = {},\n): Promise<StreamOutcome> {\n const outcome: StreamOutcome = { result: '', isError: false, usage: null, events: 0, raw: '' };\n const collected: string[] = [];\n\n const lines = createInterface({ input: stdout });\n for await (const line of lines) {\n options.onLine?.(line);\n if (line.trim() === '') continue;\n outcome.events++;\n collected.push(line);\n\n let event: unknown;\n try {\n event = JSON.parse(line);\n } catch {\n continue;\n }\n if (typeof event !== 'object' || event === null) continue;\n\n const record = event as Record<string, unknown>;\n options.onEvent?.(record);\n\n if (record.type === 'result') {\n outcome.result = typeof record.result === 'string' ? record.result : '';\n outcome.isError = record.is_error === true;\n // Keep the previous metrics when this event carries none, so a malformed\n // trailing result never erases what was already captured.\n outcome.usage = parseUsage(record) ?? outcome.usage;\n }\n }\n\n outcome.raw = collected.join('\\n');\n return outcome;\n}\n","/**\n * Shared argv helpers. An empty or absent list leaves `args` untouched, so\n * callers that pass nothing keep the exact same argv they had before.\n */\n\nexport function pushRepeatedFlag(args: string[], flag: string, values: string[] | undefined): void {\n if (!values || values.length === 0) return;\n for (const value of values) {\n args.push(flag, value);\n }\n}\n\n/** Format a `-c key=value` TOML literal for Codex. */\nexport function formatCodexConfigValue(value: string | number | boolean): string {\n if (typeof value === 'boolean' || typeof value === 'number') return String(value);\n if (/^[A-Za-z0-9_.-]+$/.test(value)) return value;\n return JSON.stringify(value);\n}\n","import { formatDuration } from '../ui/logger.js';\n\n/**\n * Timeout detection shared by both runners.\n *\n * `reject: false` means execa resolves on a timeout instead of throwing. The\n * wording of the error must keep saying \"timed out\": `classify()` falls back\n * to that text, and it is what earns the phase its retries.\n */\n\nexport interface FinishedProcess {\n exitCode?: number | undefined;\n signal?: string | undefined;\n timedOut?: boolean | undefined;\n stdout?: string | undefined;\n stderr?: string | undefined;\n}\n\nconst TIMEOUT_ATTRIBUTION_RATIO = 0.9;\n\nexport function reachedTimeout(timeoutMs: number, elapsedMs: number): boolean {\n return timeoutMs > 0 && elapsedMs >= timeoutMs * TIMEOUT_ATTRIBUTION_RATIO;\n}\n\nexport function wasTimedOut(proc: FinishedProcess, timeoutMs: number, elapsedMs: number): boolean {\n if (proc.timedOut === true) return true;\n if (!reachedTimeout(timeoutMs, elapsedMs)) return false;\n return (\n proc.signal === 'SIGTERM' ||\n proc.signal === 'SIGKILL' ||\n proc.exitCode === 143 ||\n proc.exitCode === 137\n );\n}\n\nexport function describeAgentFailure(\n proc: FinishedProcess,\n diagnostics: string,\n timeoutMs: number,\n elapsedMs: number,\n command: string,\n): string {\n if (wasTimedOut(proc, timeoutMs, elapsedMs)) {\n return `Headless invocation timed out after ${formatDuration(Math.round(timeoutMs / 1000))}. Raise the limit with --timeout <seconds> (0 = no limit).`;\n }\n return diagnostics.trim() || `${command} exited with code ${proc.exitCode ?? 'unknown'}`;\n}\n","import { execa } from 'execa';\nimport { AntigravityRunner } from './antigravity.js';\nimport { ClaudeCodeRunner, cacheHarnessVersion, peekHarnessVersion } from './claude.js';\nimport { CodexRunner } from './codex.js';\nimport { CursorRunner } from './cursor.js';\nimport { OpenCodeRunner } from './opencode.js';\nimport type { AgentProviderId, AgentRunner } from './types.js';\n\nconst runners = new Map<AgentProviderId, AgentRunner>();\n\nexport function registerRunner(runner: AgentRunner): void {\n runners.set(runner.id, runner);\n}\n\nexport function getRegisteredProviders(): AgentProviderId[] {\n return [...runners.keys()];\n}\n\nexport function clearRunners(): void {\n runners.clear();\n}\n\nexport function ensureRunnersRegistered(): void {\n const registered = new Set(getRegisteredProviders());\n if (!registered.has('claude')) registerRunner(new ClaudeCodeRunner());\n if (!registered.has('codex')) registerRunner(new CodexRunner());\n if (!registered.has('cursor')) registerRunner(new CursorRunner());\n if (!registered.has('antigravity')) registerRunner(new AntigravityRunner());\n if (!registered.has('opencode')) registerRunner(new OpenCodeRunner());\n}\n\n/**\n * Look up the runner for a provider.\n *\n * @throws when the id is not registered, listing what is available.\n */\nexport function runnerFor(providerId: AgentProviderId): AgentRunner {\n ensureRunnersRegistered();\n const runner = runners.get(providerId);\n if (runner === undefined) {\n const available = getRegisteredProviders();\n const hint =\n available.length > 0\n ? `Available providers: ${available.join(', ')}.`\n : 'No agent runners are registered.';\n throw new Error(`Unknown agent provider: '${providerId}'. ${hint}`);\n }\n return runner;\n}\n\nexport async function ensureHarnessVersion(providerId: AgentProviderId): Promise<string | null> {\n const cached = peekHarnessVersion(providerId);\n if (cached !== undefined) return cached;\n\n const runner = runnerFor(providerId);\n const { command, args } = runner.versionCommand();\n try {\n const proc = await execa(command, args, { reject: false, timeout: 10_000 });\n const version = proc.exitCode === 0 ? (proc.stdout?.toString().trim() ?? null) : null;\n cacheHarnessVersion(providerId, version);\n return version;\n } catch {\n cacheHarnessVersion(providerId, null);\n return null;\n }\n}\n","import { mkdtemp, readFile, rm } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { execa } from 'execa';\nimport { parseCodexUsage } from '../core/metrics.js';\nimport { registerChild } from '../core/shutdown.js';\nimport { createWatchdog, describeStall } from '../core/watchdog.js';\nimport { printWarning } from '../ui/logger.js';\nimport { formatCodexConfigValue, pushRepeatedFlag } from './argv.js';\nimport { peekHarnessVersion } from './claude.js';\nimport { describeAgentFailure, reachedTimeout } from './process.js';\nimport {\n type AgentEvent,\n type AgentInvocation,\n type AgentRunner,\n type AgentRunResult,\n CODEX_CAPABILITIES,\n type CodexSandbox,\n type ResolvedAgentSettings,\n} from './types.js';\n\nconst BANNED_CODEX_FLAGS = [\n '--dangerously-bypass-approvals-and-sandbox',\n '--dangerously-bypass-hook-trust',\n] as const;\n\nfunction sandboxFor(\n permission: AgentInvocation['permission'],\n configured: CodexSandbox | undefined,\n): CodexSandbox {\n if (configured === 'danger-full-access') return 'danger-full-access';\n if (permission === 'read-only') return 'read-only';\n return 'workspace-write';\n}\n\nfunction shortPath(filePath: string | undefined): string {\n if (!filePath) return '';\n const cwd = process.cwd();\n if (filePath.startsWith(cwd)) return filePath.substring(cwd.length + 1);\n const parts = filePath.split('/');\n return parts.length > 2 ? `.../${parts.slice(-2).join('/')}` : filePath;\n}\n\nfunction truncateCommand(command: string): string {\n return command.length > 60 ? `${command.substring(0, 57)}...` : command;\n}\n\n/**\n * Build the argv for one `codex exec` invocation.\n *\n * `--sandbox` is always explicit. The prompt goes on stdin (`-`) so a large\n * Issue Flow prompt never hits `ARG_MAX` and the process never blocks waiting\n * for an inherited stdin. Banned `--dangerously-bypass-*` flags have no path\n * that can introduce them.\n */\nexport function buildCodexArgv(\n invocation: AgentInvocation,\n settings: ResolvedAgentSettings,\n outputFile: string,\n): string[] {\n const sandbox = sandboxFor(invocation.permission, settings.codex.sandbox);\n if (sandbox === 'danger-full-access') {\n printWarning(\n 'agent.codex.sandbox is \"danger-full-access\": the Codex sandbox is off for this invocation.',\n );\n }\n\n const args = [\n 'exec',\n '--json',\n '--output-last-message',\n outputFile,\n '--sandbox',\n sandbox,\n '--color',\n 'never',\n ];\n\n if (invocation.workingDirectory) args.push('--cd', invocation.workingDirectory);\n pushRepeatedFlag(args, '--add-dir', invocation.addDirs);\n if (settings.model) args.push('--model', settings.model);\n if (settings.codex.reasoningEffort) {\n args.push('-c', `model_reasoning_effort=${settings.codex.reasoningEffort}`);\n }\n if (settings.codex.ignoreUserConfig === true) args.push('--ignore-user-config');\n if (settings.codex.skipGitRepoCheck === true) args.push('--skip-git-repo-check');\n for (const [key, value] of Object.entries(settings.codex.configOverrides ?? {})) {\n args.push('-c', `${key}=${formatCodexConfigValue(value)}`);\n }\n args.push('-');\n\n for (const banned of BANNED_CODEX_FLAGS) {\n if (args.includes(banned)) {\n throw new Error(`Internal error: banned Codex flag ${banned} reached argv.`);\n }\n }\n return args;\n}\n\ninterface CodexParseState {\n result: string;\n lastAgentMessage: string;\n usage: ReturnType<typeof parseCodexUsage>;\n sessionId?: string;\n failed: boolean;\n error: string | null;\n completed: boolean;\n}\n\nfunction emptyCodexState(): CodexParseState {\n return {\n result: '',\n lastAgentMessage: '',\n usage: null,\n failed: false,\n error: null,\n completed: false,\n };\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null ? (value as Record<string, unknown>) : null;\n}\n\n/**\n * Consume one Codex JSONL event. `item.type === 'error'` is a warning, never\n * a failure — skill-context notices arrive that way on successful runs.\n */\nexport function consumeCodexEvent(\n event: Record<string, unknown>,\n state: CodexParseState,\n onEvent?: (event: AgentEvent) => void,\n): void {\n const type = event.type;\n if (type === 'thread.started' && typeof event.thread_id === 'string') {\n state.sessionId = event.thread_id;\n return;\n }\n if (type === 'turn.completed') {\n state.completed = true;\n state.usage = parseCodexUsage(event.usage) ?? state.usage;\n return;\n }\n if (type === 'turn.failed') {\n state.failed = true;\n const err = asRecord(event.error);\n state.error = typeof err?.message === 'string' ? err.message : 'turn.failed';\n return;\n }\n if (type === 'error') {\n state.failed = true;\n state.error = typeof event.message === 'string' ? event.message : 'error';\n return;\n }\n\n const item = asRecord(event.item);\n if (!item) return;\n const itemType = item.type;\n\n if (type === 'item.completed' && itemType === 'agent_message' && typeof item.text === 'string') {\n state.lastAgentMessage = item.text;\n onEvent?.({ kind: 'text', text: item.text });\n return;\n }\n if (type === 'item.completed' && itemType === 'error' && typeof item.message === 'string') {\n onEvent?.({ kind: 'text', text: item.message });\n return;\n }\n if (type === 'item.started' && itemType === 'command_execution') {\n const command = typeof item.command === 'string' ? item.command : '';\n onEvent?.({ kind: 'tool', name: 'Bash', detail: truncateCommand(command) });\n return;\n }\n if (type === 'item.started' && itemType === 'file_change') {\n const changes = Array.isArray(item.changes) ? item.changes : [];\n const first = asRecord(changes[0]);\n const path = typeof first?.path === 'string' ? first.path : '';\n onEvent?.({ kind: 'tool', name: 'Edit', detail: shortPath(path) });\n return;\n }\n if (type === 'item.completed' && itemType === 'web_search') {\n const query = typeof item.query === 'string' ? item.query : '';\n onEvent?.({ kind: 'tool', name: 'WebSearch', ...(query ? { detail: query } : {}) });\n return;\n }\n if (type === 'item.completed' && itemType === 'mcp_tool_call') {\n const server = typeof item.server === 'string' ? item.server : '';\n const tool = typeof item.tool === 'string' ? item.tool : '';\n const name = [server, tool].filter(Boolean).join('.') || 'mcp';\n onEvent?.({ kind: 'tool', name });\n }\n}\n\nexport function parseCodexStream(\n lines: string[],\n onEvent?: (event: AgentEvent) => void,\n): CodexParseState {\n const state = emptyCodexState();\n for (const line of lines) {\n if (line.trim() === '') continue;\n let event: unknown;\n try {\n event = JSON.parse(line);\n } catch {\n continue;\n }\n const record = asRecord(event);\n if (!record) continue;\n consumeCodexEvent(record, state, onEvent);\n }\n return state;\n}\n\nexport class CodexRunner implements AgentRunner {\n readonly id = 'codex' as const;\n readonly capabilities = CODEX_CAPABILITIES;\n\n versionCommand(): { command: string; args: string[] } {\n return { command: 'codex', args: ['--version'] };\n }\n\n authCommand(): { command: string; args: string[] } {\n return { command: 'codex', args: ['login', 'status'] };\n }\n\n async run(invocation: AgentInvocation, settings: ResolvedAgentSettings): Promise<AgentRunResult> {\n const tmp = await mkdtemp(join(tmpdir(), 'issue-flow-codex-'));\n const outputFile = join(tmp, 'last-message.txt');\n const args = buildCodexArgv(invocation, settings, outputFile);\n const agent = { provider: this.id, model: settings.model } as const;\n const base = { agent, harnessVersion: peekHarnessVersion(this.id) };\n const startTime = Date.now();\n\n let cleanup: (() => void) | null = null;\n try {\n const subprocess = execa('codex', args, {\n input: invocation.prompt,\n reject: false,\n timeout: invocation.timeout,\n stripFinalNewline: false,\n ...(invocation.workingDirectory ? { cwd: invocation.workingDirectory } : {}),\n });\n const unregister = registerChild({\n kill: (signal) => subprocess.kill(signal),\n done: subprocess.then(\n () => undefined,\n () => undefined,\n ),\n });\n\n const watchdog = createWatchdog({\n ...(invocation.inactivityTimeoutMs === undefined\n ? {}\n : { inactivityTimeoutMs: invocation.inactivityTimeoutMs }),\n child: {\n kill: (signal) => subprocess.kill(signal),\n done: subprocess.then(\n () => undefined,\n () => undefined,\n ),\n },\n });\n // The stream can reject; the watchdog timer and the shutdown registry\n // must not outlive the call either way.\n cleanup = () => {\n watchdog.stop();\n unregister();\n };\n\n const collected: string[] = [];\n if (subprocess.stdout) {\n const { createInterface } = await import('node:readline');\n const lines = createInterface({ input: subprocess.stdout });\n for await (const line of lines) {\n watchdog.beat();\n invocation.onLine?.(line);\n if (line.trim() !== '') collected.push(line);\n }\n }\n\n const proc = await subprocess;\n watchdog.stop();\n unregister();\n\n const stdout = collected.join('\\n');\n const stderr = proc.stderr?.toString() ?? '';\n const rawOutput = stdout + (stderr ? `\\n${stderr}` : '');\n const exitCode = proc.exitCode ?? 1;\n const elapsedMs = Date.now() - startTime;\n const parsed = parseCodexStream(collected, invocation.onEvent);\n\n let lastMessage = '';\n try {\n lastMessage = (await readFile(outputFile, 'utf-8')).trimEnd();\n } catch {\n lastMessage = '';\n }\n const resultText = lastMessage || parsed.lastAgentMessage;\n\n if (watchdog.stalled) {\n return {\n success: false,\n result: '',\n rawOutput: describeStall(watchdog.silentMs, 'codex'),\n exitCode: exitCode === 0 ? 1 : exitCode,\n usage: null,\n error: describeStall(watchdog.silentMs, 'codex'),\n sessionId: parsed.sessionId,\n ...base,\n };\n }\n\n const failureText = describeAgentFailure(\n proc,\n stderr || stdout,\n invocation.timeout,\n elapsedMs,\n 'codex',\n );\n\n if (exitCode !== 0 || parsed.failed) {\n return {\n success: false,\n result: resultText,\n rawOutput,\n exitCode: exitCode === 0 ? 1 : exitCode,\n usage: parsed.usage,\n error: parsed.error ?? failureText,\n sessionId: parsed.sessionId,\n ...base,\n };\n }\n\n return {\n success: parsed.completed && !parsed.failed,\n result: resultText,\n rawOutput,\n exitCode,\n usage: parsed.usage,\n error: parsed.failed ? parsed.error : null,\n sessionId: parsed.sessionId,\n ...base,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const elapsedMs = Date.now() - startTime;\n const timedOut = message.includes('timed out') || message.includes('ETIMEDOUT');\n return {\n success: false,\n result: '',\n rawOutput: message,\n exitCode: 1,\n usage: null,\n error: timedOut\n ? describeAgentFailure(\n { timedOut: reachedTimeout(invocation.timeout, elapsedMs) },\n message,\n invocation.timeout,\n elapsedMs,\n 'codex',\n )\n : message,\n ...base,\n };\n } finally {\n cleanup?.();\n await rm(tmp, { recursive: true, force: true }).catch(() => undefined);\n }\n }\n}\n","import { execa } from 'execa';\nimport { registerChild } from '../core/shutdown.js';\nimport { createWatchdog, describeStall } from '../core/watchdog.js';\nimport { peekHarnessVersion } from './claude.js';\nimport { describeAgentFailure, wasTimedOut } from './process.js';\nimport {\n type AgentInvocation,\n type AgentRunner,\n type AgentRunResult,\n CURSOR_CAPABILITIES,\n type ResolvedAgentSettings,\n} from './types.js';\n\nexport const CURSOR_MIN_VERSION = '2026.01.23';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction toolName(call: Record<string, unknown>): { name: string; detail: string } {\n if (isRecord(call.readToolCall)) {\n const args = isRecord(call.readToolCall.args) ? call.readToolCall.args : {};\n return { name: 'Read', detail: typeof args.path === 'string' ? args.path : '' };\n }\n if (isRecord(call.writeToolCall)) {\n const args = isRecord(call.writeToolCall.args) ? call.writeToolCall.args : {};\n return { name: 'Edit', detail: typeof args.path === 'string' ? args.path : '' };\n }\n const key = Object.keys(call).find((name) => name.endsWith('ToolCall'));\n return { name: key?.replace(/ToolCall$/, '') ?? 'tool', detail: '' };\n}\n\nexport function consumeCursorEvent(\n event: Record<string, unknown>,\n onEvent: AgentInvocation['onEvent'],\n): { text?: string; sessionId?: string; model?: string; isError?: boolean; result?: string } {\n if (event.type === 'system' && event.subtype === 'init') {\n return {\n sessionId: typeof event.session_id === 'string' ? event.session_id : undefined,\n model: typeof event.model === 'string' ? event.model : undefined,\n };\n }\n if (event.type === 'assistant') {\n const message = isRecord(event.message) ? event.message : {};\n const content = Array.isArray(message.content) ? message.content : [];\n const texts: string[] = [];\n for (const block of content) {\n if (isRecord(block) && typeof block.text === 'string') texts.push(block.text);\n }\n const text = texts.join('');\n if (text && onEvent) onEvent({ kind: 'text', text });\n return { text };\n }\n if (event.type === 'tool_call' && event.subtype === 'started') {\n const call = isRecord(event.tool_call) ? event.tool_call : {};\n const { name, detail } = toolName(call);\n onEvent?.({ kind: 'tool', name, ...(detail === '' ? {} : { detail }) });\n return {};\n }\n if (event.type === 'result') {\n return {\n result: typeof event.result === 'string' ? event.result : '',\n sessionId: typeof event.session_id === 'string' ? event.session_id : undefined,\n isError: event.is_error === true,\n };\n }\n return {};\n}\n\nexport function parseCursorStream(\n raw: string,\n onEvent?: AgentInvocation['onEvent'],\n): {\n result: string;\n isError: boolean;\n sessionId: string | null;\n model: string | null;\n text: string;\n} {\n let result = '';\n let isError = false;\n let sessionId: string | null = null;\n let model: string | null = null;\n const texts: string[] = [];\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed === '') continue;\n try {\n const event = JSON.parse(trimmed) as unknown;\n if (!isRecord(event)) continue;\n const seen = consumeCursorEvent(event, onEvent);\n if (seen.result !== undefined) result = seen.result;\n if (seen.isError === true) isError = true;\n if (seen.sessionId) sessionId = seen.sessionId;\n if (seen.model) model = seen.model;\n if (seen.text) texts.push(seen.text);\n } catch {\n // Malformed NDJSON is ignored, like the other runners.\n }\n }\n return { result, isError, sessionId, model, text: texts.join('') };\n}\n\nexport function buildCursorArgv(\n invocation: AgentInvocation,\n settings: ResolvedAgentSettings,\n): { command: string; args: string[] } {\n const args = ['-p', '--output-format', 'stream-json'];\n args.push('--workspace', invocation.workingDirectory ?? process.cwd());\n if (settings.model) args.push('--model', settings.model);\n if (invocation.permission === 'read-only') {\n args.push('--mode', 'plan');\n } else {\n args.push('--force');\n }\n if (settings.cursor.sandbox !== undefined) {\n args.push('--sandbox', settings.cursor.sandbox);\n }\n if (settings.cursor.approveMcps === true) {\n args.push('--approve-mcps');\n }\n args.push(invocation.prompt);\n return { command: 'cursor-agent', args };\n}\n\nexport class CursorRunner implements AgentRunner {\n readonly id = 'cursor' as const;\n readonly capabilities = CURSOR_CAPABILITIES;\n\n versionCommand(): { command: string; args: string[] } {\n return { command: 'cursor-agent', args: ['--version'] };\n }\n\n authCommand(): { command: string; args: string[] } {\n return { command: 'cursor-agent', args: ['status'] };\n }\n\n async run(invocation: AgentInvocation, settings: ResolvedAgentSettings): Promise<AgentRunResult> {\n const { command, args } = buildCursorArgv(invocation, settings);\n const startTime = Date.now();\n const agent = { provider: this.id, model: settings.model } as const;\n\n let cleanup: (() => void) | null = null;\n try {\n const subprocess = execa(command, args, {\n reject: false,\n timeout: invocation.timeout,\n stripFinalNewline: false,\n stdin: 'ignore',\n ...(invocation.workingDirectory ? { cwd: invocation.workingDirectory } : {}),\n });\n const unregister = registerChild({\n kill: (signal) => subprocess.kill(signal),\n done: subprocess.then(\n () => undefined,\n () => undefined,\n ),\n });\n const watchdog = createWatchdog({\n ...(invocation.inactivityTimeoutMs === undefined\n ? {}\n : { inactivityTimeoutMs: invocation.inactivityTimeoutMs }),\n child: {\n kill: (signal) => subprocess.kill(signal),\n done: subprocess.then(\n () => undefined,\n () => undefined,\n ),\n },\n });\n // The stream can reject; the watchdog timer and the shutdown registry\n // must not outlive the call either way.\n cleanup = () => {\n watchdog.stop();\n unregister();\n };\n\n const chunks: string[] = [];\n if (subprocess.stdout) {\n subprocess.stdout.on('data', (chunk: Buffer | string) => {\n watchdog.beat();\n const text = chunk.toString();\n chunks.push(text);\n invocation.onLine?.(text);\n });\n }\n if (subprocess.stderr) {\n subprocess.stderr.on('data', () => {\n watchdog.beat();\n });\n }\n\n const proc = await subprocess;\n watchdog.stop();\n unregister();\n\n const stdout = chunks.join('') || proc.stdout?.toString() || '';\n const stderr = proc.stderr?.toString() ?? '';\n const parsed = parseCursorStream(stdout, invocation.onEvent);\n const rawOutput = stdout + (stderr ? `\\n${stderr}` : '');\n const exitCode = proc.exitCode ?? 1;\n const elapsedMs = Date.now() - startTime;\n const timedOut = wasTimedOut(proc, invocation.timeout, elapsedMs);\n const authFailed = /authentication required/i.test(stderr) && stdout.trim() === '';\n const stalled = watchdog.stalled;\n const success = exitCode === 0 && parsed.result !== '' && !parsed.isError && !timedOut;\n\n // A stall has to survive as text in `rawOutput`: that is the field the\n // executor forwards to `classify()`, and `error` never reaches it. Same\n // shape as claude.ts and codex.ts.\n if (stalled) {\n return {\n success: false,\n result: '',\n rawOutput: describeStall(watchdog.silentMs, 'cursor-agent'),\n exitCode: exitCode === 0 ? 1 : exitCode,\n usage: null,\n error: describeStall(watchdog.silentMs, 'cursor-agent'),\n agent: { provider: this.id, model: parsed.model ?? settings.model },\n sessionId: parsed.sessionId ?? undefined,\n harnessVersion: peekHarnessVersion(this.id),\n };\n }\n\n return {\n success,\n result: parsed.result || parsed.text,\n rawOutput,\n exitCode: timedOut ? 1 : exitCode,\n usage: null,\n error: success\n ? null\n : authFailed\n ? stderr.trim()\n : describeAgentFailure(\n proc,\n stderr || rawOutput,\n invocation.timeout,\n elapsedMs,\n command,\n ),\n agent: { provider: this.id, model: parsed.model ?? settings.model },\n sessionId: parsed.sessionId ?? undefined,\n harnessVersion: peekHarnessVersion(this.id),\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n result: '',\n rawOutput: message,\n exitCode: 1,\n usage: null,\n error: message,\n agent,\n harnessVersion: peekHarnessVersion(this.id),\n };\n } finally {\n cleanup?.();\n }\n }\n}\n","import type { AgentPhase } from '../agents/types.js';\nimport type { ModelEntry, ModelTier } from './models.js';\nimport type { RiskLevel, RoutingProfile, TaskClass } from './types.js';\n\n/** Bump when a role, phase default or ladder step changes. */\nexport const OPENCODE_GO_POLICY_VERSION = '1';\n\nexport const OPENCODE_GO_MODELS = {\n cheap: 'opencode-go/mimo-v2.5',\n default: 'opencode-go/qwen3.8-flash',\n codingCheap: 'opencode-go/deepseek-v4-flash',\n escalate: 'opencode-go/gpt-5.6-luna',\n specialist: 'opencode-go/kimi-k2.7-code',\n} as const;\n\nexport type OpenCodeGoRole = 'cheap' | 'default' | 'coding-cheap' | 'escalate' | 'specialist';\n\n/**\n * Main climb only. DeepSeek is a lateral coding-cheap step: it escalates\n * to Qwen, never to MiMo.\n */\nexport const OPENCODE_GO_LADDER: readonly string[] = [\n OPENCODE_GO_MODELS.cheap,\n OPENCODE_GO_MODELS.default,\n OPENCODE_GO_MODELS.escalate,\n OPENCODE_GO_MODELS.specialist,\n];\n\nconst ROLE_BY_MODEL: Record<string, OpenCodeGoRole> = {\n [OPENCODE_GO_MODELS.cheap]: 'cheap',\n [OPENCODE_GO_MODELS.default]: 'default',\n [OPENCODE_GO_MODELS.codingCheap]: 'coding-cheap',\n [OPENCODE_GO_MODELS.escalate]: 'escalate',\n [OPENCODE_GO_MODELS.specialist]: 'specialist',\n};\n\nconst TIER_BY_ROLE: Record<OpenCodeGoRole, ModelTier> = {\n cheap: 'fast',\n default: 'mid',\n 'coding-cheap': 'mid',\n escalate: 'strong',\n specialist: 'strong',\n};\n\nconst COST_BY_ROLE: Record<OpenCodeGoRole, { relativeCost: number; relativeLatency: number }> = {\n cheap: { relativeCost: 1, relativeLatency: 1 },\n default: { relativeCost: 2.5, relativeLatency: 1.3 },\n 'coding-cheap': { relativeCost: 1.8, relativeLatency: 1.15 },\n escalate: { relativeCost: 5, relativeLatency: 1.8 },\n specialist: { relativeCost: 7, relativeLatency: 2 },\n};\n\nexport interface OpenCodeGoInput {\n phase: AgentPhase;\n taskClass?: TaskClass;\n risk?: RiskLevel;\n profile?: RoutingProfile;\n correctionCycle?: number;\n}\n\nexport interface OpenCodeGoChoice {\n model: string;\n role: OpenCodeGoRole;\n reasonCodes: string[];\n}\n\nexport function isOpenCodeGoModel(model: string | null | undefined): boolean {\n return model !== null && model !== undefined && ROLE_BY_MODEL[model] !== undefined;\n}\n\nfunction choice(role: OpenCodeGoRole, reasonCodes: string[]): OpenCodeGoChoice {\n return {\n model: OPENCODE_GO_MODELS[role === 'coding-cheap' ? 'codingCheap' : role],\n role,\n reasonCodes,\n };\n}\n\nfunction phaseDefault(phase: AgentPhase): OpenCodeGoRole {\n if (phase === 'analyze') return 'cheap';\n if (phase === 'pr-review') return 'escalate';\n return 'default';\n}\n\nfunction correctionRole(cycle: number): OpenCodeGoRole {\n if (cycle <= 1) return 'coding-cheap';\n if (cycle === 2) return 'default';\n if (cycle === 3) return 'escalate';\n return 'specialist';\n}\n\n/**\n * Intra-OpenCode model for a phase. Kimi is never a first pick — only\n * `nextOpenCodeGoModel` or correction cycle ≥ 4 reach it.\n */\nexport function resolveOpenCodeGoModel(input: OpenCodeGoInput): OpenCodeGoChoice {\n const reasons = ['OPENCODE_GO_POLICY'];\n if ((input.correctionCycle ?? 0) >= 1 && input.phase === 'execute') {\n const role = correctionRole(input.correctionCycle ?? 1);\n if (role === 'specialist') reasons.push('OPENCODE_GO_SPECIALIST');\n else if (role === 'escalate') reasons.push('OPENCODE_GO_ESCALATE');\n else if (role === 'coding-cheap') reasons.push('OPENCODE_GO_CODING_CHEAP');\n return choice(role, reasons);\n }\n\n const taskClass = input.taskClass ?? 'feature';\n const risk = input.risk ?? 'low';\n let role = phaseDefault(input.phase);\n\n if (input.phase === 'analyze' && risk === 'high') {\n role = 'default';\n } else if (input.phase === 'generate' && taskClass === 'docs') {\n role = 'cheap';\n reasons.push('OPENCODE_GO_CHEAP');\n } else if (input.phase === 'prd' && (risk === 'high' || taskClass === 'infra')) {\n role = 'escalate';\n reasons.push('OPENCODE_GO_ESCALATE');\n } else if (input.phase === 'plan' && risk === 'high') {\n role = 'escalate';\n reasons.push('OPENCODE_GO_ESCALATE');\n } else if (input.phase === 'plan' && input.profile === 'economy' && risk === 'low') {\n role = 'cheap';\n reasons.push('OPENCODE_GO_CHEAP');\n } else if (input.phase === 'execute') {\n if (risk === 'high' || taskClass === 'infra' || (taskClass === 'refactor' && risk !== 'low')) {\n role = 'escalate';\n reasons.push('OPENCODE_GO_ESCALATE');\n } else if ((taskClass === 'bugfix' || taskClass === 'test') && risk === 'low') {\n role = 'coding-cheap';\n reasons.push('OPENCODE_GO_CODING_CHEAP');\n }\n } else if (input.phase === 'review' && risk === 'high') {\n role = 'escalate';\n reasons.push('OPENCODE_GO_ESCALATE');\n } else if (input.phase === 'pr' && taskClass === 'bugfix' && risk === 'low') {\n role = 'coding-cheap';\n reasons.push('OPENCODE_GO_CODING_CHEAP');\n } else if (input.phase === 'pr-review' && risk === 'low' && taskClass === 'docs') {\n role = 'default';\n }\n\n return choice(role, reasons);\n}\n\n/** Next stronger Go model. DeepSeek climbs to Qwen. Kimi has nowhere to go. */\nexport function nextOpenCodeGoModel(\n current: string | null | undefined,\n tried: readonly string[] = [],\n): string | null {\n const seen = new Set(tried);\n if (current !== null && current !== undefined) seen.add(current);\n const start =\n current === OPENCODE_GO_MODELS.codingCheap\n ? OPENCODE_GO_MODELS.default\n : current === null || current === undefined\n ? OPENCODE_GO_MODELS.default\n : (() => {\n const index = OPENCODE_GO_LADDER.indexOf(current);\n return index === -1 ? OPENCODE_GO_MODELS.default : OPENCODE_GO_LADDER[index + 1];\n })();\n if (start === undefined) return null;\n if (!seen.has(start)) return start;\n const startIndex = OPENCODE_GO_LADDER.indexOf(start);\n for (const model of OPENCODE_GO_LADDER.slice(Math.max(0, startIndex))) {\n if (!seen.has(model)) return model;\n }\n return null;\n}\n\nexport function openCodeGoEntry(model: string): ModelEntry | null {\n const role = ROLE_BY_MODEL[model];\n if (role === undefined) return null;\n const cost = COST_BY_ROLE[role];\n return { id: model, tier: TIER_BY_ROLE[role], ...cost };\n}\n","import type { AgentOrigin, AgentPhase } from './types.js';\n\n/** Origins recorded by the last `loadAgentConfig` call. */\nexport interface TrackedAgentOrigins {\n provider: AgentOrigin;\n model: AgentOrigin;\n phases: Partial<Record<AgentPhase, { provider?: AgentOrigin; model?: AgentOrigin }>>;\n}\n\nlet trackedOrigins: TrackedAgentOrigins | null = null;\n\nexport function setTrackedOrigins(origins: TrackedAgentOrigins | null): void {\n trackedOrigins = origins;\n}\n\nexport function getTrackedOrigins(): TrackedAgentOrigins | null {\n return trackedOrigins;\n}\n","import { type OpenCodeGoInput, resolveOpenCodeGoModel } from '../routing/opencode-go.js';\nimport { getTrackedOrigins } from './origins.js';\nimport {\n AGENT_PHASES,\n type AgentBlock,\n type AgentCliOverrides,\n type AgentConfig,\n type AgentOrigin,\n type AgentPhase,\n type AgentProviderId,\n type ClaudeSettings,\n type CodexSettings,\n isAgentPhase,\n isAgentProviderId,\n type ResolvedAgentSettings,\n} from './types.js';\n\n/**\n * Merge two agent blocks key by key. Later wins, and only on keys it\n * actually declares — declaring just `model` keeps the provider.\n */\nexport function mergeAgentBlocks(base: AgentBlock, overlay: AgentBlock | undefined): AgentBlock {\n if (overlay === undefined) return { ...base };\n return {\n ...base,\n ...dropUndefined(overlay),\n claude: { ...base.claude, ...dropUndefined(overlay.claude ?? {}) },\n codex: { ...base.codex, ...dropUndefined(overlay.codex ?? {}) },\n cursor: { ...base.cursor, ...dropUndefined(overlay.cursor ?? {}) },\n antigravity: { ...base.antigravity, ...dropUndefined(overlay.antigravity ?? {}) },\n opencode: { ...base.opencode, ...dropUndefined(overlay.opencode ?? {}) },\n };\n}\n\nfunction dropUndefined<T extends object>(value: T): Partial<T> {\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n if (item !== undefined) result[key] = item;\n }\n return result as Partial<T>;\n}\n\nexport interface ResolveAgentOptions {\n config?: AgentConfig;\n cli?: AgentCliOverrides;\n}\n\n/**\n * Resolve the agent that will run `phase`.\n *\n * 1. default block climbs the five-layer ladder\n * 2. the phase block climbs the same ladder, key by key\n * 3. phase overlays default only on the keys it declares\n * 4. `--agent` / `--agent-model` without a phase overwrite everything\n */\nexport async function resolveAgentFor(\n phase: AgentPhase,\n options: ResolveAgentOptions = {},\n): Promise<ResolvedAgentSettings> {\n const { getAgentCliOverrides, loadAgentConfig } = await import('../config.js');\n const config = options.config ?? (await loadAgentConfig());\n const cli = options.cli ?? getAgentCliOverrides();\n\n const defaultBlock: AgentBlock = {\n provider: config.provider,\n model: config.model,\n claude: config.claude,\n codex: config.codex,\n cursor: config.cursor,\n antigravity: config.antigravity,\n opencode: config.opencode,\n };\n\n const phaseBlock = mergeAgentBlocks(config.phases[phase] ?? {}, cli.phases?.[phase]);\n const merged = mergeAgentBlocks(defaultBlock, phaseBlock);\n\n const inspected = await inspectAgentResolution(phase, config, cli);\n\n let provider = (merged.provider ?? 'claude') as AgentProviderId;\n let model = merged.model ?? null;\n let providerOrigin = inspected.providerOrigin;\n let modelOrigin = inspected.modelOrigin;\n\n if (cli?.forceProvider !== undefined) {\n provider = cli.forceProvider;\n providerOrigin = 'cli';\n }\n if (cli?.forceModel !== undefined) {\n model = cli.forceModel;\n modelOrigin = 'cli';\n }\n\n if (provider === 'opencode' && model === null) {\n model = resolveOpenCodeGoModel({ phase }).model;\n }\n\n return {\n provider,\n model,\n claude: merged.claude ?? {},\n codex: merged.codex ?? {},\n cursor: merged.cursor ?? {},\n antigravity: merged.antigravity ?? {},\n opencode: merged.opencode ?? {},\n origin: { provider: providerOrigin, model: modelOrigin },\n };\n}\n\nexport interface InspectedPhase {\n provider: AgentProviderId;\n model: string | null;\n providerOrigin: AgentOrigin;\n modelOrigin: AgentOrigin;\n claude: ClaudeSettings;\n codex: CodexSettings;\n}\n\n/**\n * Recover provenance after the layers have been merged.\n *\n * `loadAgentConfig` already applied precedence. This function labels each\n * winning value by asking the inspector that `loadAgentConfig` fills in.\n * When called with a pre-built config (tests), origins degrade to\n * `default` / `project` based on whether the value differs from the baked\n * default — good enough for unit tests that pass an explicit config.\n */\nexport async function inspectAgentResolution(\n phase: AgentPhase,\n config: AgentConfig,\n cli?: AgentCliOverrides,\n): Promise<InspectedPhase> {\n const overlay = config.phases[phase];\n const provider = overlay?.provider ?? config.provider;\n const model = overlay?.model !== undefined ? overlay.model : config.model;\n\n let providerOrigin: AgentOrigin =\n provider === 'claude' && overlay?.provider === undefined ? 'default' : 'project';\n let modelOrigin: AgentOrigin =\n model === null && overlay?.model === undefined ? 'default' : 'project';\n\n const tracked = getTrackedOrigins();\n if (tracked) {\n providerOrigin =\n overlay?.provider !== undefined\n ? (tracked.phases[phase]?.provider ?? tracked.provider)\n : tracked.provider;\n modelOrigin =\n overlay?.model !== undefined\n ? (tracked.phases[phase]?.model ?? tracked.model)\n : tracked.model;\n }\n\n if (cli?.forceProvider !== undefined) providerOrigin = 'cli';\n if (cli?.forceModel !== undefined) modelOrigin = 'cli';\n\n return {\n provider,\n model,\n providerOrigin,\n modelOrigin,\n claude: { ...config.claude, ...overlay?.claude },\n codex: { ...config.codex, ...overlay?.codex },\n };\n}\n\nexport function parseAgentPhaseFlag(value: string): { phase: AgentPhase; block: AgentBlock } {\n const eq = value.indexOf('=');\n if (eq <= 0) {\n throw new Error(\n `Invalid --agent-phase value \"${value}\". Expected <phase>=<provider>[:<model>].`,\n );\n }\n const phase = value.slice(0, eq);\n const rest = value.slice(eq + 1);\n if (!isAgentPhase(phase)) {\n throw new Error(\n `Unknown agent phase \"${phase}\". Valid phases: analyze, generate, prd, plan, execute, review, pr, pr-review.`,\n );\n }\n const [providerRaw, ...modelParts] = rest.split(':');\n if (!providerRaw || !isAgentProviderId(providerRaw)) {\n throw new Error(\n `Unknown agent provider \"${providerRaw ?? ''}\". Valid providers: claude, codex, cursor, antigravity, opencode.`,\n );\n }\n const model = modelParts.length > 0 ? modelParts.join(':') : undefined;\n return {\n phase,\n block: {\n provider: providerRaw,\n ...(model ? { model } : {}),\n },\n };\n}\n\n/** Fill or refine the OpenCode Go model only when the user did not pin one. */\nexport function applyOpenCodeGoModel(\n settings: ResolvedAgentSettings,\n input: OpenCodeGoInput,\n): ResolvedAgentSettings {\n if (settings.provider !== 'opencode' || settings.origin.model !== 'default') {\n return settings;\n }\n const model = resolveOpenCodeGoModel(input).model;\n if (model === settings.model) return settings;\n return { ...settings, model };\n}\n\n/** Whether any layer other than the baked default has spoken. */\nexport interface RunAgentSummary {\n /** `misto` when at least one phase differs from the default provider. */\n label: AgentProviderId | 'misto';\n defaultProvider: AgentProviderId;\n defaultModel: string | null;\n defaultOrigin: { provider: AgentOrigin; model: AgentOrigin };\n byPhase: Record<\n AgentPhase,\n {\n provider: AgentProviderId;\n model: string | null;\n origin: { provider: AgentOrigin; model: AgentOrigin };\n }\n >;\n}\n\nexport async function describeRunAgents(\n phases: readonly AgentPhase[] = AGENT_PHASES,\n): Promise<RunAgentSummary> {\n const target = phases.length > 0 ? phases : AGENT_PHASES;\n const byPhase = {} as RunAgentSummary['byPhase'];\n let defaultProvider: AgentProviderId = 'claude';\n let defaultModel: string | null = null;\n const providers = new Set<AgentProviderId>();\n\n for (const phase of target) {\n const settings = await resolveAgentFor(phase);\n byPhase[phase] = {\n provider: settings.provider,\n model: settings.model,\n origin: settings.origin,\n };\n providers.add(settings.provider);\n if (phase === target[0]) {\n defaultProvider = settings.provider;\n defaultModel = settings.model;\n }\n }\n\n // The run default is the unscoped provider, not the first phase's overlay.\n const { loadAgentConfig } = await import('../config.js');\n const config = await loadAgentConfig();\n defaultProvider = config.provider;\n defaultModel = config.model;\n const tracked = getTrackedOrigins();\n\n return {\n label: providers.size > 1 ? 'misto' : (providers.values().next().value ?? defaultProvider),\n defaultProvider,\n defaultModel,\n defaultOrigin: {\n provider: tracked?.provider ?? (defaultProvider === 'claude' ? 'default' : 'project'),\n model: tracked?.model ?? (defaultModel === null ? 'default' : 'project'),\n },\n byPhase,\n };\n}\n\nexport function hasExplicitAgentSelection(\n config: AgentConfig,\n cli?: AgentCliOverrides,\n phase?: AgentPhase,\n): boolean {\n if (cli?.forceProvider !== undefined || cli?.forceModel !== undefined) return true;\n if (\n cli?.phases &&\n (phase === undefined ? Object.keys(cli.phases).length > 0 : cli.phases[phase] !== undefined)\n ) {\n return true;\n }\n if (config.provider !== 'claude') return true;\n if (config.model !== null) return true;\n if (\n phase === undefined ? Object.keys(config.phases).length > 0 : config.phases[phase] !== undefined\n ) {\n return true;\n }\n if (config.claude.ignoreUserConfig !== undefined) return true;\n if (Object.keys(config.codex).length > 0) return true;\n return false;\n}\n","/**\n * Shared merge helpers for the configuration precedence ladder.\n * See docs/configuration.md. Domains import from here only.\n */\n\nexport interface ConfigLayers<T extends object> {\n /** Hard-coded fallbacks, e.g. DEFAULTS or the values baked into a schema. */\n defaults?: Partial<T>;\n /**\n * Values read from the consumer repository itself — the policies discovered\n * by `src/policy/`. They sit just above the defaults: a repository's own\n * convention beats a fallback Issue Flow invented, and loses to anything the\n * user explicitly configured.\n */\n discovered?: Partial<T>;\n /** ~/.issue-flow/config.json, via loadGlobalConfig(). */\n global?: Partial<T>;\n /** The matching key of .issue-flow.json in the project root. */\n project?: Partial<T>;\n /** ISSUE_FLOW_* environment variables. */\n env?: Partial<T>;\n /** CLI flags. */\n cli?: Partial<T>;\n}\n\n/**\n * Merge configuration layers following the documented precedence.\n *\n * Pure and shallow: a layer only participates with the keys it actually\n * carries, so an absent key never erases the layer below it. `undefined` counts\n * as absent — that is what lets a layer be built by assigning only the values\n * that were really provided.\n *\n * Because the merge is shallow, nested objects (`web`, `retry`) are replaced\n * whole rather than merged field by field; callers that need per-field\n * precedence inside a nested key must flatten it into its own merge.\n *\n * Caveat for the `project` layer: it must be the *raw* set of keys the user\n * wrote, not the output of a schema that materializes defaults. In zod 4 a\n * `.default()` survives `.partial()`, so parsing the project file with\n * `webConfigSchema.partial()` yields every default and would make the project\n * layer swallow the global one.\n */\nexport function mergeConfigLayers<T extends object>(layers: ConfigLayers<T>): Partial<T> {\n const merged: Record<string, unknown> = {};\n\n for (const layer of [\n layers.defaults,\n layers.discovered,\n layers.global,\n layers.project,\n layers.env,\n layers.cli,\n ]) {\n for (const [key, value] of Object.entries(layer ?? {})) {\n if (value !== undefined) {\n merged[key] = value;\n }\n }\n }\n\n return merged as Partial<T>;\n}\n\n/**\n * Drop the keys a layer left as `null` or `undefined`.\n *\n * `mergeConfigLayers` only treats `undefined` as \"absent\", and the input schema\n * accepts `null` as the natural way to write \"I do not declare this\" — without\n * this, a `\"baseBranch\": null` would win over the branch discovery found.\n */\nexport function dropNullish<T extends object>(layer: T | undefined): Partial<T> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(layer ?? {})) {\n if (value !== undefined && value !== null) {\n result[key] = value;\n }\n }\n return result as Partial<T>;\n}\n\nconst FALSY_ENV_VALUES = new Set(['', '0', 'false', 'no', 'off']);\n\nexport function parseBooleanEnv(value: string): boolean {\n return !FALSY_ENV_VALUES.has(value.trim().toLowerCase());\n}\n\nexport function readNumberEnv(\n env: NodeJS.ProcessEnv,\n name: string,\n warn: (message: string) => void,\n): number | undefined {\n const raw = env[name];\n if (raw === undefined) {\n return undefined;\n }\n const parsed = Number(raw);\n if (!Number.isFinite(parsed)) {\n warn(`Ignoring ${name}=\"${raw}\": not a number.`);\n return undefined;\n }\n return parsed;\n}\n","import { setTrackedOrigins } from '../agents/origins.js';\nimport { agentConfigInputSchema, parsePhasesInput } from '../agents/schemas.js';\nimport type {\n AgentBlock,\n AgentCliOverrides,\n AgentConfig,\n AgentOrigin,\n AgentPhase,\n AgentProviderId,\n AntigravitySettings,\n ClaudeSettings,\n CodexSettings,\n CursorSettings,\n OpenCodeSettings,\n} from '../agents/types.js';\nimport { AGENT_PHASES, isAgentProviderId } from '../agents/types.js';\nimport { printWarning } from '../ui/logger.js';\nimport { mergeConfigLayers, parseBooleanEnv } from './layers.js';\nimport {\n GLOBAL_CONFIG_FILENAME,\n loadGlobalConfig,\n PROJECT_CONFIG_FILENAME,\n readProjectConfigFile,\n} from './sources.js';\n\nexport type { AgentCliOverrides, AgentConfig };\n\nlet agentCliOverrides: AgentCliOverrides = {};\nlet cachedAgentConfig: AgentConfig | undefined;\n\nexport function setAgentCliOverrides(overrides: AgentCliOverrides): void {\n agentCliOverrides = overrides;\n cachedAgentConfig = undefined;\n}\n\nexport function getAgentCliOverrides(): AgentCliOverrides {\n return agentCliOverrides;\n}\n\nexport interface LoadAgentConfigOptions {\n cli?: AgentCliOverrides;\n env?: NodeJS.ProcessEnv;\n projectRoot?: string;\n globalRoot?: string;\n warn?: (message: string) => void;\n}\n\nfunction readAgentEnv(env: NodeJS.ProcessEnv, warn: (message: string) => void): AgentCliOverrides {\n const layer: AgentCliOverrides = {};\n if (env.ISSUE_FLOW_AGENT !== undefined) {\n if (isAgentProviderId(env.ISSUE_FLOW_AGENT)) {\n layer.provider = env.ISSUE_FLOW_AGENT;\n } else {\n warn(\n `Ignoring ISSUE_FLOW_AGENT=\"${env.ISSUE_FLOW_AGENT}\": expected claude, codex, cursor, antigravity or opencode.`,\n );\n }\n }\n if (env.ISSUE_FLOW_AGENT_MODEL !== undefined && env.ISSUE_FLOW_AGENT_MODEL !== '') {\n layer.model = env.ISSUE_FLOW_AGENT_MODEL;\n }\n const codex: CodexSettings = {};\n if (env.ISSUE_FLOW_CODEX_SANDBOX !== undefined) {\n if (\n env.ISSUE_FLOW_CODEX_SANDBOX === 'read-only' ||\n env.ISSUE_FLOW_CODEX_SANDBOX === 'workspace-write' ||\n env.ISSUE_FLOW_CODEX_SANDBOX === 'danger-full-access'\n ) {\n codex.sandbox = env.ISSUE_FLOW_CODEX_SANDBOX;\n } else {\n warn(`Ignoring ISSUE_FLOW_CODEX_SANDBOX=\"${env.ISSUE_FLOW_CODEX_SANDBOX}\".`);\n }\n }\n if (env.ISSUE_FLOW_CODEX_REASONING_EFFORT !== undefined) {\n const effort = env.ISSUE_FLOW_CODEX_REASONING_EFFORT;\n if (\n effort === 'minimal' ||\n effort === 'low' ||\n effort === 'medium' ||\n effort === 'high' ||\n effort === 'xhigh'\n ) {\n codex.reasoningEffort = effort;\n } else {\n warn(`Ignoring ISSUE_FLOW_CODEX_REASONING_EFFORT=\"${effort}\".`);\n }\n }\n if (env.ISSUE_FLOW_CODEX_IGNORE_USER_CONFIG !== undefined) {\n codex.ignoreUserConfig = parseBooleanEnv(env.ISSUE_FLOW_CODEX_IGNORE_USER_CONFIG);\n }\n if (Object.keys(codex).length > 0) layer.codex = codex;\n const cursor: CursorSettings = {};\n if (env.ISSUE_FLOW_CURSOR_SANDBOX !== undefined) {\n if (\n env.ISSUE_FLOW_CURSOR_SANDBOX === 'enabled' ||\n env.ISSUE_FLOW_CURSOR_SANDBOX === 'disabled'\n ) {\n cursor.sandbox = env.ISSUE_FLOW_CURSOR_SANDBOX;\n } else {\n warn(`Ignoring ISSUE_FLOW_CURSOR_SANDBOX=\"${env.ISSUE_FLOW_CURSOR_SANDBOX}\".`);\n }\n }\n if (env.ISSUE_FLOW_CURSOR_PERMISSIONS_FILE !== undefined) {\n if (\n env.ISSUE_FLOW_CURSOR_PERMISSIONS_FILE === 'global' ||\n env.ISSUE_FLOW_CURSOR_PERMISSIONS_FILE === 'project' ||\n env.ISSUE_FLOW_CURSOR_PERMISSIONS_FILE === 'none'\n ) {\n cursor.permissionsFile = env.ISSUE_FLOW_CURSOR_PERMISSIONS_FILE;\n } else {\n warn(\n `Ignoring ISSUE_FLOW_CURSOR_PERMISSIONS_FILE=\"${env.ISSUE_FLOW_CURSOR_PERMISSIONS_FILE}\".`,\n );\n }\n }\n if (Object.keys(cursor).length > 0) layer.cursor = cursor;\n const antigravity: AntigravitySettings = {};\n if (env.ISSUE_FLOW_ANTIGRAVITY_EFFORT !== undefined) {\n const effort = env.ISSUE_FLOW_ANTIGRAVITY_EFFORT;\n if (effort === 'low' || effort === 'medium' || effort === 'high') {\n antigravity.effort = effort;\n } else {\n warn(`Ignoring ISSUE_FLOW_ANTIGRAVITY_EFFORT=\"${effort}\".`);\n }\n }\n if (env.ISSUE_FLOW_ANTIGRAVITY_SANDBOX !== undefined) {\n antigravity.sandbox = parseBooleanEnv(env.ISSUE_FLOW_ANTIGRAVITY_SANDBOX);\n }\n if (env.ISSUE_FLOW_ANTIGRAVITY_EXECUTE_TIMEOUT !== undefined) {\n antigravity.executeTimeout = env.ISSUE_FLOW_ANTIGRAVITY_EXECUTE_TIMEOUT;\n }\n if (Object.keys(antigravity).length > 0) layer.antigravity = antigravity;\n const opencode: OpenCodeSettings = {};\n if (env.ISSUE_FLOW_OPENCODE_VARIANT !== undefined && env.ISSUE_FLOW_OPENCODE_VARIANT !== '') {\n opencode.variant = env.ISSUE_FLOW_OPENCODE_VARIANT;\n }\n if (\n env.ISSUE_FLOW_OPENCODE_MIN_VERSION !== undefined &&\n env.ISSUE_FLOW_OPENCODE_MIN_VERSION !== ''\n ) {\n opencode.minVersion = env.ISSUE_FLOW_OPENCODE_MIN_VERSION;\n }\n if (Object.keys(opencode).length > 0) layer.opencode = opencode;\n return layer;\n}\n\nfunction readAgentKey(\n raw: unknown,\n label: string,\n warn: (message: string) => void,\n): AgentCliOverrides {\n if (raw === undefined) return {};\n const parsed = agentConfigInputSchema.safeParse(raw);\n if (!parsed.success) {\n warn(\n `Ignoring \"agent\" key of ${label}: ${parsed.error.issues[0]?.message ?? 'invalid value'}.`,\n );\n return {};\n }\n const phases = parsePhasesInput(\n raw !== null && typeof raw === 'object' && 'phases' in raw\n ? (raw as { phases?: unknown }).phases\n : undefined,\n warn,\n );\n return {\n ...(parsed.data.provider !== undefined ? { provider: parsed.data.provider } : {}),\n ...(parsed.data.model !== undefined ? { model: parsed.data.model } : {}),\n ...(parsed.data.claude !== undefined ? { claude: parsed.data.claude } : {}),\n ...(parsed.data.codex !== undefined ? { codex: parsed.data.codex } : {}),\n ...(parsed.data.cursor !== undefined ? { cursor: parsed.data.cursor } : {}),\n ...(parsed.data.antigravity !== undefined ? { antigravity: parsed.data.antigravity } : {}),\n ...(parsed.data.opencode !== undefined ? { opencode: parsed.data.opencode } : {}),\n ...(Object.keys(phases).length > 0 ? { phases } : {}),\n };\n}\n\nfunction pickOrigin(layers: Array<{ origin: AgentOrigin; value: unknown }>): AgentOrigin {\n let current: AgentOrigin = 'default';\n for (const layer of layers) {\n if (layer.value !== undefined) current = layer.origin;\n }\n return current;\n}\n\ntype TrackedPhaseOrigins = Partial<\n Record<AgentPhase, { provider?: AgentOrigin; model?: AgentOrigin }>\n>;\n\nfunction mergeAgentBlockLayers(\n layers: Array<{ origin: AgentOrigin; block: AgentBlock | undefined }>,\n): AgentBlock | undefined {\n let merged: AgentBlock = {};\n let any = false;\n for (const layer of layers) {\n if (layer.block === undefined) continue;\n any = true;\n merged = {\n ...merged,\n ...dropUndefinedBlock(layer.block),\n claude: { ...merged.claude, ...layer.block.claude },\n codex: { ...merged.codex, ...layer.block.codex },\n cursor: { ...merged.cursor, ...layer.block.cursor },\n antigravity: { ...merged.antigravity, ...layer.block.antigravity },\n opencode: { ...merged.opencode, ...layer.block.opencode },\n };\n }\n return any ? merged : undefined;\n}\n\nfunction dropUndefinedBlock(block: AgentBlock): AgentBlock {\n const result: AgentBlock = {};\n if (block.provider !== undefined) result.provider = block.provider;\n if (block.model !== undefined) result.model = block.model;\n if (block.claude !== undefined) result.claude = block.claude;\n if (block.codex !== undefined) result.codex = block.codex;\n if (block.cursor !== undefined) result.cursor = block.cursor;\n if (block.antigravity !== undefined) result.antigravity = block.antigravity;\n if (block.opencode !== undefined) result.opencode = block.opencode;\n return result;\n}\n\n/**\n * Resolve the `agent` key with the documented precedence:\n *\n * default(claude) < ~/.issue-flow/config.json < .issue-flow.json\n * < ISSUE_FLOW_* < CLI\n *\n * Nested `phases` and `codex`/`claude` are merged key by key so a project's\n * `phases.plan` cannot erase a global `phases.review`. Invalid values warn\n * and degrade; nothing throws.\n */\nexport async function loadAgentConfig(options: LoadAgentConfigOptions = {}): Promise<AgentConfig> {\n const canCache =\n options.cli === undefined &&\n options.env === undefined &&\n options.projectRoot === undefined &&\n options.globalRoot === undefined &&\n options.warn === undefined;\n if (canCache && cachedAgentConfig !== undefined) return cachedAgentConfig;\n\n const warn = options.warn ?? printWarning;\n const cli = options.cli ?? agentCliOverrides;\n const env = options.env ?? process.env;\n\n const globalFile = await loadGlobalConfig({\n env,\n globalRoot: options.globalRoot,\n warn,\n });\n const globalLayer = readAgentKey(globalFile.agent, GLOBAL_CONFIG_FILENAME, warn);\n\n const projectFile = await readProjectConfigFile(options.projectRoot, warn);\n const projectLayer = readAgentKey(projectFile?.agent, PROJECT_CONFIG_FILENAME, warn);\n const envLayer = readAgentEnv(env, warn);\n\n const provider = (cli.forceProvider ??\n cli.provider ??\n envLayer.provider ??\n projectLayer.provider ??\n globalLayer.provider ??\n 'claude') as AgentProviderId;\n const model =\n cli.forceModel ??\n cli.model ??\n envLayer.model ??\n projectLayer.model ??\n globalLayer.model ??\n null;\n\n const claude = mergeConfigLayers<ClaudeSettings>({\n global: globalLayer.claude,\n project: projectLayer.claude,\n env: envLayer.claude,\n cli: cli.claude,\n });\n const codex = mergeConfigLayers<CodexSettings>({\n global: globalLayer.codex,\n project: projectLayer.codex,\n env: envLayer.codex,\n cli: cli.codex,\n });\n const cursor = mergeConfigLayers<CursorSettings>({\n global: globalLayer.cursor,\n project: projectLayer.cursor,\n env: envLayer.cursor,\n cli: cli.cursor,\n });\n const antigravity = mergeConfigLayers<AntigravitySettings>({\n global: globalLayer.antigravity,\n project: projectLayer.antigravity,\n env: envLayer.antigravity,\n cli: cli.antigravity,\n });\n const opencode = mergeConfigLayers<OpenCodeSettings>({\n global: globalLayer.opencode,\n project: projectLayer.opencode,\n env: envLayer.opencode,\n cli: cli.opencode,\n });\n\n const phases: AgentConfig['phases'] = {};\n const phaseOrigins: TrackedPhaseOrigins = {};\n for (const phase of AGENT_PHASES) {\n const block = mergeAgentBlockLayers([\n { origin: 'global', block: globalLayer.phases?.[phase] },\n { origin: 'project', block: projectLayer.phases?.[phase] },\n { origin: 'env', block: envLayer.phases?.[phase] },\n { origin: 'cli', block: cli.phases?.[phase] },\n ]);\n if (block && Object.keys(block).length > 0) {\n phases[phase] = block;\n phaseOrigins[phase] = {\n provider:\n block.provider !== undefined\n ? pickOrigin([\n { origin: 'global', value: globalLayer.phases?.[phase]?.provider },\n { origin: 'project', value: projectLayer.phases?.[phase]?.provider },\n { origin: 'env', value: envLayer.phases?.[phase]?.provider },\n { origin: 'cli', value: cli.phases?.[phase]?.provider },\n ])\n : undefined,\n model:\n block.model !== undefined\n ? pickOrigin([\n { origin: 'global', value: globalLayer.phases?.[phase]?.model },\n { origin: 'project', value: projectLayer.phases?.[phase]?.model },\n { origin: 'env', value: envLayer.phases?.[phase]?.model },\n { origin: 'cli', value: cli.phases?.[phase]?.model },\n ])\n : undefined,\n };\n }\n }\n\n setTrackedOrigins({\n provider: pickOrigin([\n { origin: 'default', value: 'claude' },\n { origin: 'global', value: globalLayer.provider },\n { origin: 'project', value: projectLayer.provider },\n { origin: 'env', value: envLayer.provider },\n { origin: 'cli', value: cli.forceProvider ?? cli.provider },\n ]),\n model: pickOrigin([\n { origin: 'default', value: undefined },\n { origin: 'global', value: globalLayer.model },\n { origin: 'project', value: projectLayer.model },\n { origin: 'env', value: envLayer.model },\n { origin: 'cli', value: cli.forceModel ?? cli.model },\n ]),\n phases: phaseOrigins,\n });\n\n const resolved = { provider, model, claude, codex, cursor, antigravity, opencode, phases };\n if (canCache) cachedAgentConfig = resolved;\n return resolved;\n}\n","import { join } from 'node:path';\nimport { resolveIssuePaths } from '../storage/resolve.js';\nimport type { EngineConfig, ResolvedPaths } from '../types.js';\nimport { getProjectRoot } from '../utils/git.js';\n\n/**\n * Default configuration values — matching the Bash script exactly.\n */\nexport const DEFAULTS = {\n retryLimit: 10,\n retryForever: false,\n backoffBaseSeconds: 30,\n backoffMaxSeconds: 900,\n} as const;\n\n/**\n * Create a EngineConfig with defaults merged with provided options.\n */\nexport function createConfig(options: Partial<EngineConfig>): EngineConfig {\n return {\n issueNumber: options.issueNumber,\n inPipeline: options.inPipeline,\n maxIterations: options.maxIterations,\n retryLimit: options.retryLimit ?? DEFAULTS.retryLimit,\n retryForever: options.retryForever ?? DEFAULTS.retryForever,\n backoffBaseSeconds: options.backoffBaseSeconds ?? DEFAULTS.backoffBaseSeconds,\n backoffMaxSeconds: options.backoffMaxSeconds ?? DEFAULTS.backoffMaxSeconds,\n // Left absent (rather than defaulted to an empty string) so the execute\n // prompt keeps its historical commit format unless a queue asks otherwise.\n ...(options.commitScope === undefined ? {} : { commitScope: options.commitScope }),\n storiesPerIteration: options.storiesPerIteration ?? 1,\n };\n}\n\n/**\n * Resolve file paths based on issue number and project root.\n *\n * With --issue N, every artifact comes from the global storage layer via\n * `resolveIssuePaths()`, which also migrates the legacy `<projectRoot>/issues/`\n * tree on first read:\n * prdFile = ~/.issue-flow/projects/{id}/issues/{N}/tasks.json\n * progressFile = ~/.issue-flow/projects/{id}/issues/{N}/progress.txt\n *\n * Standalone:\n * prdFile = {projectRoot}/prd.json\n * progressFile = {projectRoot}/progress.txt\n *\n * Beware of the asymmetric mapping in the issue branch: `ResolvedPaths.prdFile`\n * is the engine's *task plan*, so it maps to `IssuePaths.tasksFile`\n * (`tasks.json`) and **not** to `IssuePaths.prdFile` (`prd.md`, the human-facing\n * document produced by the `prd` phase). The name predates the split and is kept\n * because standalone mode really does read a `prd.json`.\n *\n * `projectRoot` stays on the result either way: `core/engine.ts` uses it as the\n * cwd of its git operations, which the global storage does not replace.\n */\nexport async function resolvePaths(\n config: EngineConfig,\n scriptDir?: string,\n): Promise<ResolvedPaths> {\n const projectRoot = await getProjectRoot();\n\n if (config.issueNumber) {\n // projectRoot is forwarded so the resolver does not shell out to\n // `git rev-parse --show-toplevel` a second time for the answer we just got.\n const issuePaths = await resolveIssuePaths(config.issueNumber, { projectRoot });\n return {\n prdFile: issuePaths.tasksFile,\n progressFile: issuePaths.progressFile,\n archiveDir: issuePaths.archiveDir,\n lastBranchFile: issuePaths.lastBranchFile,\n projectRoot,\n };\n }\n\n // Standalone mode — use scriptDir if available, otherwise projectRoot\n const base = scriptDir ?? projectRoot;\n const standalone = {\n prdFile: join(base, 'prd.json'),\n progressFile: join(base, 'progress.txt'),\n archiveDir: join(base, 'archive'),\n lastBranchFile: join(base, '.last-branch'),\n projectRoot,\n };\n const { bindTelemetry } = await import('../telemetry/recorder.js');\n bindTelemetry({ tasksPath: standalone.prdFile });\n return standalone;\n}\n","import type { IssuesConfig } from '../issues/types.js';\nimport { issuesConfigSchema } from '../schemas.js';\nimport { printWarning } from '../ui/logger.js';\nimport { PROJECT_CONFIG_FILENAME, readProjectConfigFile } from './sources.js';\n\n/**\n * CLI overrides captured by the preAction hook in cli.ts (--local, --github,\n * --prefer-local, --prefer-github, --ask). Highest-precedence source consumed\n * by loadIssuesConfig().\n */\nlet issuesCliOverrides: Partial<IssuesConfig> = {};\n\nexport function setIssuesCliOverrides(overrides: Partial<IssuesConfig>): void {\n issuesCliOverrides = overrides;\n}\n\nexport interface LoadIssuesConfigOptions {\n /** CLI flag overrides. Defaults to the values set via setIssuesCliOverrides(). */\n cli?: Partial<IssuesConfig>;\n /** Directory containing .issue-flow.json. Defaults to the git project root. */\n projectRoot?: string;\n /** Warning sink. Defaults to printWarning. */\n warn?: (message: string) => void;\n}\n\nasync function readIssuesConfigFile(\n projectRoot: string | undefined,\n warn: (message: string) => void,\n): Promise<Partial<IssuesConfig>> {\n const file = await readProjectConfigFile(projectRoot, warn);\n const issues = file?.issues;\n if (issues === undefined) {\n return {};\n }\n\n const result = issuesConfigSchema.partial().safeParse(issues);\n if (!result.success) {\n warn(\n `Ignoring \"issues\" key of ${PROJECT_CONFIG_FILENAME}: ${result.error.issues[0]?.message ?? 'invalid value'}.`,\n );\n return {};\n }\n return result.data;\n}\n\n/**\n * Resolve the Issue provider configuration with the documented precedence:\n * CLI flag > .issue-flow.json > defaults.\n *\n * Never throws: missing or invalid sources degrade to the defaults with a\n * warning, and the defaults reproduce the GitHub-only behaviour.\n */\nexport async function loadIssuesConfig(\n options: LoadIssuesConfigOptions = {},\n): Promise<IssuesConfig> {\n const warn = options.warn ?? printWarning;\n const cli = options.cli ?? issuesCliOverrides;\n\n const fileLayer = await readIssuesConfigFile(options.projectRoot, warn);\n const merged = { ...fileLayer, ...cli };\n\n const result = issuesConfigSchema.safeParse(merged);\n if (result.success) {\n return result.data;\n }\n warn(\n `Invalid Issue provider configuration (${result.error.issues[0]?.message ?? 'invalid value'}); using defaults.`,\n );\n return issuesConfigSchema.parse({});\n}\n","import {\n type PolicyConfig,\n type PolicyConfigInput,\n policyConfigInputSchema,\n policyConfigSchema,\n} from '../schemas.js';\nimport { printWarning } from '../ui/logger.js';\nimport { dropNullish, mergeConfigLayers, parseBooleanEnv, readNumberEnv } from './layers.js';\nimport { PROJECT_CONFIG_FILENAME, readProjectConfigFile } from './sources.js';\n\n/**\n * CLI overrides for the `policy` key, captured by the preAction hook in cli.ts.\n * Highest-precedence source consumed by loadPolicyConfig().\n */\nlet policyCliOverrides: PolicyConfigInput = {};\n\nexport function setPolicyCliOverrides(overrides: PolicyConfigInput): void {\n policyCliOverrides = overrides;\n}\n\nexport interface LoadPolicyConfigOptions {\n /** CLI flag overrides. Defaults to the values set via setPolicyCliOverrides(). */\n cli?: PolicyConfigInput;\n /** Environment source. Defaults to process.env. */\n env?: NodeJS.ProcessEnv;\n /** Directory containing .issue-flow.json. Defaults to the git project root. */\n projectRoot?: string;\n /** Warning sink. Defaults to printWarning. */\n warn?: (message: string) => void;\n}\n\nfunction readPolicyConfigEnv(\n env: NodeJS.ProcessEnv,\n warn: (message: string) => void,\n): PolicyConfigInput {\n const layer: PolicyConfigInput = {};\n\n if (env.ISSUE_FLOW_POLICY !== undefined) {\n layer.enabled = parseBooleanEnv(env.ISSUE_FLOW_POLICY);\n }\n const budget = readNumberEnv(env, 'ISSUE_FLOW_POLICY_CONTEXT_BUDGET', warn);\n if (budget !== undefined) {\n layer.contextBudget = budget;\n }\n\n const issues: NonNullable<PolicyConfigInput['issues']> = {};\n if (env.ISSUE_FLOW_POLICY_ISSUE_TITLE_CONVENTION !== undefined) {\n issues.titleConvention = env.ISSUE_FLOW_POLICY_ISSUE_TITLE_CONVENTION;\n }\n if (Object.keys(issues).length > 0) layer.issues = issues;\n\n const pullRequests: NonNullable<PolicyConfigInput['pullRequests']> = {};\n if (env.ISSUE_FLOW_POLICY_BASE_BRANCH !== undefined) {\n pullRequests.baseBranch = env.ISSUE_FLOW_POLICY_BASE_BRANCH;\n }\n if (env.ISSUE_FLOW_POLICY_PR_TITLE_CONVENTION !== undefined) {\n pullRequests.titleConvention = env.ISSUE_FLOW_POLICY_PR_TITLE_CONVENTION;\n }\n if (Object.keys(pullRequests).length > 0) layer.pullRequests = pullRequests;\n\n const git: NonNullable<PolicyConfigInput['git']> = {};\n if (env.ISSUE_FLOW_POLICY_BRANCH_CONVENTION !== undefined) {\n git.branchConvention = env.ISSUE_FLOW_POLICY_BRANCH_CONVENTION;\n }\n if (env.ISSUE_FLOW_POLICY_COMMIT_CONVENTION !== undefined) {\n git.commitConvention = env.ISSUE_FLOW_POLICY_COMMIT_CONVENTION;\n }\n if (Object.keys(git).length > 0) layer.git = git;\n\n // An empty string is how a shell spells \"unset it again\"; it reaches the\n // schema below and is reported like any other invalid value would be.\n const invalid = Object.entries(layer).find(\n ([, value]) => typeof value === 'object' && value !== null && Object.values(value).includes(''),\n );\n if (invalid !== undefined) {\n warn(`Ignoring empty ISSUE_FLOW_POLICY_* value in \"${invalid[0]}\".`);\n }\n\n return layer;\n}\n\nasync function readPolicyConfigFile(\n projectRoot: string | undefined,\n warn: (message: string) => void,\n): Promise<PolicyConfigInput> {\n const file = await readProjectConfigFile(projectRoot, warn);\n const policy = file?.policy;\n if (policy === undefined) {\n return {};\n }\n\n const result = policyConfigInputSchema.safeParse(policy);\n if (!result.success) {\n warn(\n `Ignoring \"policy\" key of ${PROJECT_CONFIG_FILENAME}: ${result.error.issues[0]?.message ?? 'invalid value'}.`,\n );\n return {};\n }\n return result.data;\n}\n\n/**\n * Resolve the repository policy configuration with the documented precedence:\n * CLI flag > ISSUE_FLOW_POLICY_* > .issue-flow.json > defaults.\n *\n * This is only the *explicit* half of the ladder. What the repository declares\n * about itself is discovered by `src/policy/` and merged one rung below, so\n * this function deliberately does not materialize the declarations as `null`:\n * an unset `baseBranch` must stay absent, or it would overrule the base branch\n * discovery actually found.\n *\n * Never throws: an absent, malformed or invalid source degrades to the\n * defaults — discovery on, nothing declared — with a warning.\n */\nexport async function loadPolicyConfig(\n options: LoadPolicyConfigOptions = {},\n): Promise<PolicyConfig> {\n const warn = options.warn ?? printWarning;\n const cli = options.cli ?? policyCliOverrides;\n const env = options.env ?? process.env;\n\n const fileLayer = await readPolicyConfigFile(options.projectRoot, warn);\n const envLayer = readPolicyConfigEnv(env, warn);\n\n const merged = {\n ...mergeConfigLayers<{ enabled: boolean; contextBudget: number }>({\n project: dropNullish({ enabled: fileLayer.enabled, contextBudget: fileLayer.contextBudget }),\n env: dropNullish({ enabled: envLayer.enabled, contextBudget: envLayer.contextBudget }),\n cli: dropNullish({ enabled: cli.enabled, contextBudget: cli.contextBudget }),\n }),\n discovery: mergeConfigLayers({\n project: dropNullish(fileLayer.discovery),\n env: dropNullish(envLayer.discovery),\n cli: dropNullish(cli.discovery),\n }),\n issues: mergeConfigLayers({\n project: dropNullish(fileLayer.issues),\n env: dropNullish(envLayer.issues),\n cli: dropNullish(cli.issues),\n }),\n pullRequests: mergeConfigLayers({\n project: dropNullish(fileLayer.pullRequests),\n env: dropNullish(envLayer.pullRequests),\n cli: dropNullish(cli.pullRequests),\n }),\n git: mergeConfigLayers({\n project: dropNullish(fileLayer.git),\n env: dropNullish(envLayer.git),\n cli: dropNullish(cli.git),\n }),\n };\n\n const result = policyConfigSchema.safeParse(merged);\n if (result.success) {\n return result.data;\n }\n warn(\n `Invalid repository policy configuration (${result.error.issues[0]?.message ?? 'invalid value'}); using defaults.`,\n );\n return policyConfigSchema.parse({});\n}\n","import type { PrReviewConfig } from '../schemas.js';\nimport { prReviewConfigSchema } from '../schemas.js';\nimport { printWarning } from '../ui/logger.js';\nimport { PROJECT_CONFIG_FILENAME, readProjectConfigFile } from './sources.js';\n\nexport interface LoadPrReviewConfigOptions {\n /** Highest-precedence layer, for a future `--publisher` flag. */\n cli?: Partial<PrReviewConfig>;\n /** Environment source. Defaults to process.env. */\n env?: NodeJS.ProcessEnv;\n /** Directory containing .issue-flow.json. Defaults to the git project root. */\n projectRoot?: string;\n /** Warning sink. Defaults to printWarning. */\n warn?: (message: string) => void;\n}\n\nfunction readPrReviewConfigEnv(env: NodeJS.ProcessEnv): Partial<PrReviewConfig> {\n const publisher = env.ISSUE_FLOW_PR_REVIEW_PUBLISHER;\n // An unknown value is not dropped here: it goes through the schema below, so\n // the user gets the same warning a bad config file would produce.\n return publisher === undefined ? {} : { publisher: publisher as PrReviewConfig['publisher'] };\n}\n\nasync function readPrReviewConfigFile(\n projectRoot: string | undefined,\n warn: (message: string) => void,\n): Promise<Partial<PrReviewConfig>> {\n const file = await readProjectConfigFile(projectRoot, warn);\n const prReview = file?.prReview;\n if (prReview === undefined) {\n return {};\n }\n\n const result = prReviewConfigSchema.partial().safeParse(prReview);\n if (!result.success) {\n warn(\n `Ignoring \"prReview\" key of ${PROJECT_CONFIG_FILENAME}: ${result.error.issues[0]?.message ?? 'invalid value'}.`,\n );\n return {};\n }\n return result.data;\n}\n\n/**\n * Resolve the `pr-review` configuration with the documented precedence:\n * CLI flag > environment variable > .issue-flow.json > defaults.\n *\n * Never throws: an absent, malformed or unknown value degrades to the default\n * publisher with a warning, so a typo in .issue-flow.json costs a warning\n * rather than the review.\n */\nexport async function loadPrReviewConfig(\n options: LoadPrReviewConfigOptions = {},\n): Promise<PrReviewConfig> {\n const warn = options.warn ?? printWarning;\n const env = options.env ?? process.env;\n\n const fileLayer = await readPrReviewConfigFile(options.projectRoot, warn);\n const envLayer = readPrReviewConfigEnv(env);\n const merged = { ...fileLayer, ...envLayer, ...(options.cli ?? {}) };\n\n const result = prReviewConfigSchema.safeParse(merged);\n if (result.success) {\n return result.data;\n }\n warn(\n `Invalid PR review configuration (${result.error.issues[0]?.message ?? 'invalid value'}); using defaults.`,\n );\n return prReviewConfigSchema.parse({});\n}\n","import { RETRY_CONFIG_KEYS, type RetryPolicyOverride } from '../resilience/policy.js';\nimport {\n type ResilienceConfig,\n type ResilienceRetryConfig,\n resilienceConfigSchema,\n} from '../storage/schemas.js';\nimport { printWarning } from '../ui/logger.js';\nimport { mergeConfigLayers, parseBooleanEnv, readNumberEnv } from './layers.js';\nimport { loadGlobalConfig, PROJECT_CONFIG_FILENAME, readProjectConfigFile } from './sources.js';\n\n/**\n * CLI overrides for the `resilience` key, captured by the preAction hook in\n * cli.ts. Highest-precedence source consumed by loadResilienceConfig().\n */\nlet resilienceCliOverrides: ResilienceConfig = {};\n\nexport function setResilienceCliOverrides(overrides: ResilienceConfig): void {\n resilienceCliOverrides = overrides;\n}\n\nexport interface LoadResilienceConfigOptions {\n /** CLI flag overrides. Defaults to the values set via setResilienceCliOverrides(). */\n cli?: ResilienceConfig;\n /** Environment source. Defaults to process.env. */\n env?: NodeJS.ProcessEnv;\n /** Pre-read `config.json` layer, so a caller holding it avoids a second read. */\n global?: ResilienceConfig;\n /** Directory holding config.json. Defaults to getGlobalRoot(). */\n globalRoot?: string;\n /** Directory containing .issue-flow.json. Defaults to the git project root. */\n projectRoot?: string;\n /** Warning sink. Defaults to printWarning. */\n warn?: (message: string) => void;\n}\n\n/**\n * Merge one nested section of the key across the four layers, in the ladder's\n * order, and report **absence as absence**: a section nobody configured comes\n * back `undefined` rather than `{}`, which is what lets an unconfigured\n * `resilience` resolve to an empty object instead of a skeleton of empty ones.\n */\nfunction mergeResilienceSection<T extends object>(\n layers: readonly (Partial<T> | undefined)[],\n): Partial<T> | undefined {\n const merged = mergeConfigLayers<T>({\n global: layers[0],\n project: layers[1],\n env: layers[2],\n cli: layers[3],\n });\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\n/**\n * `resilience.retry`, merged per `FailureKind` **and** per field inside each\n * kind: a project file that only raises `network.maxDelayMs` must not erase a\n * `network.retryForever` set machine-wide, nor the other kinds next to it.\n *\n * This is the one place the merge goes deeper than `mergeConfigLayers()` does\n * on its own — the documented shallowness stops at the first nested object, and\n * `retry` is two levels deep by construction.\n */\nfunction mergeResilienceRetry(\n layers: readonly (ResilienceRetryConfig | undefined)[],\n): ResilienceRetryConfig | undefined {\n const merged: ResilienceRetryConfig = {};\n for (const key of RETRY_CONFIG_KEYS) {\n const entry = mergeResilienceSection<RetryPolicyOverride>(layers.map((layer) => layer?.[key]));\n if (entry !== undefined) {\n merged[key] = entry;\n }\n }\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\n/** Validate one layer, degrading a malformed one to \"nothing configured\". */\nfunction parseResilienceLayer(\n value: unknown,\n origin: string,\n warn: (message: string) => void,\n): ResilienceConfig {\n const result = resilienceConfigSchema.safeParse(value);\n if (!result.success) {\n warn(\n `Ignoring \"resilience\" key of ${origin}: ${result.error.issues[0]?.message ?? 'invalid value'}.`,\n );\n return {};\n }\n return result.data;\n}\n\nasync function readResilienceConfigFile(\n projectRoot: string | undefined,\n warn: (message: string) => void,\n): Promise<ResilienceConfig> {\n const file = await readProjectConfigFile(projectRoot, warn);\n const resilience = file?.resilience;\n if (resilience === undefined) {\n return {};\n }\n return parseResilienceLayer(resilience, PROJECT_CONFIG_FILENAME, warn);\n}\n\n/**\n * The `ISSUE_FLOW_RESILIENCE_*` layer.\n *\n * Only the scalar knobs get a variable of their own; the per-kind `retry` table\n * is too shaped for a shell variable, so it travels whole as JSON in\n * `ISSUE_FLOW_RESILIENCE_RETRY`. Everything collected here still goes through\n * the schema afterwards, so a typo warns exactly like a bad config file does.\n */\nfunction readResilienceConfigEnv(\n env: NodeJS.ProcessEnv,\n warn: (message: string) => void,\n): ResilienceConfig {\n const layer: Record<string, unknown> = {};\n\n if (env.ISSUE_FLOW_RESILIENCE_PROFILE !== undefined) {\n layer.profile = env.ISSUE_FLOW_RESILIENCE_PROFILE;\n }\n if (env.ISSUE_FLOW_RESILIENCE_FAILOVER_ON_AUTH !== undefined) {\n layer.failoverOnAuth = parseBooleanEnv(env.ISSUE_FLOW_RESILIENCE_FAILOVER_ON_AUTH);\n }\n\n const retry = env.ISSUE_FLOW_RESILIENCE_RETRY;\n if (retry !== undefined) {\n try {\n layer.retry = JSON.parse(retry);\n } catch {\n warn('Ignoring ISSUE_FLOW_RESILIENCE_RETRY: invalid JSON.');\n }\n }\n\n const providers: Record<string, unknown> = {};\n if (env.ISSUE_FLOW_RESILIENCE_FAILOVER !== undefined) {\n providers.failover = parseBooleanEnv(env.ISSUE_FLOW_RESILIENCE_FAILOVER);\n }\n if (env.ISSUE_FLOW_RESILIENCE_PROVIDER_CHAIN !== undefined) {\n providers.chain = env.ISSUE_FLOW_RESILIENCE_PROVIDER_CHAIN.split(',')\n .map((name) => name.trim())\n .filter((name) => name !== '');\n }\n const cooldown = readNumberEnv(env, 'ISSUE_FLOW_RESILIENCE_PROVIDER_COOLDOWN_MS', warn);\n if (cooldown !== undefined) {\n providers.cooldownMs = cooldown;\n }\n const maxCooldown = readNumberEnv(env, 'ISSUE_FLOW_RESILIENCE_PROVIDER_MAX_COOLDOWN_MS', warn);\n if (maxCooldown !== undefined) {\n providers.maxCooldownMs = maxCooldown;\n }\n const failureWindow = readNumberEnv(\n env,\n 'ISSUE_FLOW_RESILIENCE_PROVIDER_FAILURE_WINDOW_MS',\n warn,\n );\n if (failureWindow !== undefined) {\n providers.failureWindowMs = failureWindow;\n }\n const failuresToTrip = readNumberEnv(\n env,\n 'ISSUE_FLOW_RESILIENCE_PROVIDER_FAILURES_TO_TRIP',\n warn,\n );\n if (failuresToTrip !== undefined) {\n providers.failuresToTrip = failuresToTrip;\n }\n if (Object.keys(providers).length > 0) layer.providers = providers;\n\n const queue: Record<string, unknown> = {};\n if (env.ISSUE_FLOW_RESILIENCE_ON_ISSUE_FAILURE !== undefined) {\n queue.onIssueFailure = env.ISSUE_FLOW_RESILIENCE_ON_ISSUE_FAILURE;\n }\n const maxIssueAttempts = readNumberEnv(env, 'ISSUE_FLOW_RESILIENCE_MAX_ISSUE_ATTEMPTS', warn);\n if (maxIssueAttempts !== undefined) {\n queue.maxIssueAttempts = maxIssueAttempts;\n }\n if (Object.keys(queue).length > 0) layer.queue = queue;\n\n const inactivity = readNumberEnv(env, 'ISSUE_FLOW_RESILIENCE_INACTIVITY_TIMEOUT_MS', warn);\n if (inactivity !== undefined) {\n layer.watchdog = { inactivityTimeoutMs: inactivity };\n }\n\n const journal: Record<string, unknown> = {};\n if (env.ISSUE_FLOW_RESILIENCE_JOURNAL !== undefined) {\n journal.enabled = parseBooleanEnv(env.ISSUE_FLOW_RESILIENCE_JOURNAL);\n }\n const journalBytes = readNumberEnv(env, 'ISSUE_FLOW_RESILIENCE_JOURNAL_MAX_BYTES', warn);\n if (journalBytes !== undefined) {\n journal.maxFileBytes = journalBytes;\n }\n if (Object.keys(journal).length > 0) layer.journal = journal;\n\n if (env.ISSUE_FLOW_RESILIENCE_AUTO_DECOMPOSE !== undefined) {\n layer.decompose = { auto: parseBooleanEnv(env.ISSUE_FLOW_RESILIENCE_AUTO_DECOMPOSE) };\n }\n\n if (Object.keys(layer).length === 0) {\n return {};\n }\n return parseResilienceLayer(layer, 'the ISSUE_FLOW_RESILIENCE_* environment', warn);\n}\n\n/**\n * Resolve the `resilience` key with the documented precedence:\n * CLI flag > `ISSUE_FLOW_RESILIENCE_*` > `.issue-flow.json` > `config.json` >\n * defaults.\n *\n * **An unconfigured project resolves to `{}`** — not to a skeleton of empty\n * sections, and never to a materialized default. That is the whole contract of\n * this loader: `resolvePolicy(kind, {})` is the base table of the PRD, so\n * \"nothing configured\" and \"the behaviour of every release before this one\" are\n * the same object. The defaults of each sub-key belong to the layer that\n * consumes it (`resilience/policy.ts` for `retry`, and one later story each for\n * `providers`, `queue`, `watchdog`, `journal` and `decompose`), never here.\n *\n * Never throws: an absent, malformed or invalid source degrades to \"nothing\n * configured\" with a warning, key by key.\n */\nexport async function loadResilienceConfig(\n options: LoadResilienceConfigOptions = {},\n): Promise<ResilienceConfig> {\n const warn = options.warn ?? printWarning;\n const env = options.env ?? process.env;\n const cli = options.cli ?? resilienceCliOverrides;\n\n const globalLayer =\n options.global ??\n (\n await loadGlobalConfig({\n env,\n ...(options.globalRoot === undefined ? {} : { globalRoot: options.globalRoot }),\n warn,\n })\n ).resilience ??\n {};\n const projectLayer = await readResilienceConfigFile(options.projectRoot, warn);\n const envLayer = readResilienceConfigEnv(env, warn);\n\n const layers = [globalLayer, projectLayer, envLayer, cli] as const;\n\n const scalars = mergeConfigLayers<Pick<ResilienceConfig, 'profile' | 'failoverOnAuth'>>({\n global: { profile: globalLayer.profile, failoverOnAuth: globalLayer.failoverOnAuth },\n project: { profile: projectLayer.profile, failoverOnAuth: projectLayer.failoverOnAuth },\n env: { profile: envLayer.profile, failoverOnAuth: envLayer.failoverOnAuth },\n cli: { profile: cli.profile, failoverOnAuth: cli.failoverOnAuth },\n });\n\n const retry = mergeResilienceRetry(layers.map((layer) => layer.retry));\n const providers = mergeResilienceSection(layers.map((layer) => layer.providers));\n const queue = mergeResilienceSection(layers.map((layer) => layer.queue));\n const watchdog = mergeResilienceSection(layers.map((layer) => layer.watchdog));\n const journal = mergeResilienceSection(layers.map((layer) => layer.journal));\n const decompose = mergeResilienceSection(layers.map((layer) => layer.decompose));\n\n return {\n ...scalars,\n ...(retry === undefined ? {} : { retry }),\n ...(providers === undefined ? {} : { providers }),\n ...(queue === undefined ? {} : { queue }),\n ...(watchdog === undefined ? {} : { watchdog }),\n ...(journal === undefined ? {} : { journal }),\n ...(decompose === undefined ? {} : { decompose }),\n };\n}\n\n/**\n * The `resilience` key in force for this process.\n *\n * Read **synchronously**, by call sites that cannot afford four disk reads per\n * `gh` invocation and must not perform I/O of their own — a provider that\n * shelled out to `git` to find its retry budget would be doing exactly the\n * thing this key exists to make survivable.\n *\n * It starts empty on purpose: `{}` is the base table of `resolvePolicy()`, so\n * a process that never installs anything behaves exactly as it did before the\n * key existed. `initResilienceConfig()` is what fills it in, once, from the\n * command that owns the run.\n */\nlet activeResilienceConfig: ResilienceConfig = {};\n\n/** The key in force. `{}` until a command installs one. */\nexport function getActiveResilienceConfig(): ResilienceConfig {\n return activeResilienceConfig;\n}\n\n/** Install a key directly. For tests, and for a caller that already loaded it. */\nexport function setActiveResilienceConfig(config: ResilienceConfig): void {\n activeResilienceConfig = config;\n}\n\n/**\n * Load the key off the ladder and install it. Never throws: a failed load\n * leaves the base table in place, which is the documented default.\n */\nexport async function initResilienceConfig(\n options: LoadResilienceConfigOptions = {},\n): Promise<ResilienceConfig> {\n try {\n activeResilienceConfig = await loadResilienceConfig(options);\n } catch {\n activeResilienceConfig = {};\n }\n return activeResilienceConfig;\n}\n","import {\n type RoutingConfig,\n type RoutingConfigInput,\n routingConfigInputSchema,\n routingConfigSchema,\n} from '../schemas.js';\nimport { printWarning } from '../ui/logger.js';\nimport { loadGlobalConfig, PROJECT_CONFIG_FILENAME, readProjectConfigFile } from './sources.js';\n\nlet routingCliOverrides: Partial<RoutingConfig> = {};\n\nexport function setRoutingCliOverrides(overrides: Partial<RoutingConfig>): void {\n routingCliOverrides = overrides;\n}\n\nexport async function loadRoutingConfig(\n options: {\n projectRoot?: string;\n globalRoot?: string;\n env?: NodeJS.ProcessEnv;\n global?: RoutingConfigInput;\n warn?: (message: string) => void;\n cli?: RoutingConfigInput;\n } = {},\n): Promise<RoutingConfig> {\n const warn = options.warn ?? printWarning;\n const global =\n options.global ??\n (\n await loadGlobalConfig({\n env: options.env ?? process.env,\n ...(options.globalRoot === undefined ? {} : { globalRoot: options.globalRoot }),\n warn,\n })\n ).routing;\n const file = await readProjectConfigFile(options.projectRoot, warn);\n const raw = file?.routing;\n const parsedResult = routingConfigInputSchema.safeParse(raw ?? {});\n if (!parsedResult.success) {\n warn(\n `Ignoring \"routing\" key of ${PROJECT_CONFIG_FILENAME}: ${parsedResult.error.issues[0]?.message ?? 'invalid value'}.`,\n );\n }\n const project = parsedResult.success ? parsedResult.data : {};\n const cli = options.cli ?? routingCliOverrides;\n const result = routingConfigSchema.safeParse({\n ...global,\n ...project,\n ...cli,\n escalation: {\n ...global?.escalation,\n ...project.escalation,\n ...cli.escalation,\n },\n ceilings: {\n ...global?.ceilings,\n ...project.ceilings,\n ...cli.ceilings,\n },\n });\n if (result.success) return result.data;\n warn(\n `Invalid routing configuration (${result.error.issues[0]?.message ?? 'invalid value'}); using defaults.`,\n );\n return routingConfigSchema.parse({});\n}\n","import { type TelemetryConfigInput, telemetryConfigInputSchema } from '../storage/schemas.js';\nimport { DEFAULT_TELEMETRY_CONFIG, type TelemetryConfig } from '../telemetry/types.js';\nimport { printWarning } from '../ui/logger.js';\nimport { mergeConfigLayers, parseBooleanEnv, readNumberEnv } from './layers.js';\nimport { loadGlobalConfig, PROJECT_CONFIG_FILENAME, readProjectConfigFile } from './sources.js';\n\nexport interface LoadTelemetryConfigOptions {\n env?: NodeJS.ProcessEnv;\n global?: TelemetryConfigInput;\n globalRoot?: string;\n projectRoot?: string;\n warn?: (message: string) => void;\n}\n\nfunction parseTelemetryLayer(\n value: unknown,\n source: string,\n warn: (message: string) => void,\n): TelemetryConfigInput {\n if (value === undefined) return {};\n const result = telemetryConfigInputSchema.safeParse(value);\n if (result.success) return result.data;\n warn(\n `Ignoring \"telemetry\" key of ${source}: ${result.error.issues[0]?.message ?? 'invalid value'}.`,\n );\n return {};\n}\n\nfunction readTelemetryEnv(\n env: NodeJS.ProcessEnv,\n warn: (message: string) => void,\n): TelemetryConfigInput {\n const layer: TelemetryConfigInput = {};\n if (env.ISSUE_FLOW_TELEMETRY !== undefined) {\n layer.enabled = parseBooleanEnv(env.ISSUE_FLOW_TELEMETRY);\n }\n const max = readNumberEnv(env, 'ISSUE_FLOW_TELEMETRY_MAX_EXECUTIONS', warn);\n if (max !== undefined) layer.maxExecutions = max;\n if (env.ISSUE_FLOW_TELEMETRY_ESTIMATE !== undefined) {\n layer.pricing = { estimate: parseBooleanEnv(env.ISSUE_FLOW_TELEMETRY_ESTIMATE) };\n }\n return layer;\n}\n\n/**\n * defaults < `config.json` < `.issue-flow.json` < `ISSUE_FLOW_TELEMETRY*`.\n *\n * Nested `pricing` is flattened so a project `estimate` does not erase a\n * global `overrides` map.\n */\nexport async function loadTelemetryConfig(\n options: LoadTelemetryConfigOptions = {},\n): Promise<TelemetryConfig> {\n const warn = options.warn ?? printWarning;\n const env = options.env ?? process.env;\n const globalFile =\n options.global ??\n (\n await loadGlobalConfig({\n env,\n ...(options.globalRoot === undefined ? {} : { globalRoot: options.globalRoot }),\n warn,\n })\n ).telemetry;\n const projectFile = await readProjectConfigFile(options.projectRoot, warn);\n const project = parseTelemetryLayer(projectFile?.telemetry, PROJECT_CONFIG_FILENAME, warn);\n const envLayer = readTelemetryEnv(env, warn);\n\n const pricing = mergeConfigLayers<TelemetryConfig['pricing']>({\n defaults: DEFAULT_TELEMETRY_CONFIG.pricing,\n global: globalFile?.pricing,\n project: project.pricing,\n env: envLayer.pricing,\n });\n const overrides = {\n ...DEFAULT_TELEMETRY_CONFIG.pricing.overrides,\n ...globalFile?.pricing?.overrides,\n ...project.pricing?.overrides,\n ...envLayer.pricing?.overrides,\n };\n\n const scalars = mergeConfigLayers<Pick<TelemetryConfig, 'enabled' | 'maxExecutions'>>({\n defaults: {\n enabled: DEFAULT_TELEMETRY_CONFIG.enabled,\n maxExecutions: DEFAULT_TELEMETRY_CONFIG.maxExecutions,\n },\n global: {\n ...(globalFile?.enabled === undefined ? {} : { enabled: globalFile.enabled }),\n ...(globalFile?.maxExecutions === undefined\n ? {}\n : { maxExecutions: globalFile.maxExecutions }),\n },\n project: {\n ...(project.enabled === undefined ? {} : { enabled: project.enabled }),\n ...(project.maxExecutions === undefined ? {} : { maxExecutions: project.maxExecutions }),\n },\n env: {\n ...(envLayer.enabled === undefined ? {} : { enabled: envLayer.enabled }),\n ...(envLayer.maxExecutions === undefined ? {} : { maxExecutions: envLayer.maxExecutions }),\n },\n });\n\n return {\n enabled: scalars.enabled ?? DEFAULT_TELEMETRY_CONFIG.enabled,\n maxExecutions: scalars.maxExecutions ?? DEFAULT_TELEMETRY_CONFIG.maxExecutions,\n pricing: {\n estimate: pricing.estimate ?? DEFAULT_TELEMETRY_CONFIG.pricing.estimate,\n overrides,\n },\n };\n}\n","import type { VerifyConfig } from '../schemas.js';\nimport { verifyConfigSchema } from '../schemas.js';\nimport { printWarning } from '../ui/logger.js';\nimport { PROJECT_CONFIG_FILENAME, readProjectConfigFile } from './sources.js';\n\nlet verifyCliOverrides: Partial<VerifyConfig> = {};\n\nexport function setVerifyCliOverrides(overrides: Partial<VerifyConfig>): void {\n verifyCliOverrides = overrides;\n}\n\nexport interface LoadVerifyConfigOptions {\n cli?: Partial<VerifyConfig>;\n projectRoot?: string;\n warn?: (message: string) => void;\n}\n\nasync function readVerifyConfigFile(\n projectRoot: string | undefined,\n warn: (message: string) => void,\n): Promise<Partial<VerifyConfig>> {\n const file = await readProjectConfigFile(projectRoot, warn);\n const verify = file?.verify;\n if (verify === undefined) return {};\n const result = verifyConfigSchema.partial().safeParse(verify);\n if (!result.success) {\n warn(\n `Ignoring \"verify\" key of ${PROJECT_CONFIG_FILENAME}: ${result.error.issues[0]?.message ?? 'invalid value'}.`,\n );\n return {};\n }\n return result.data;\n}\n\n/**\n * Resolve the acceptance-contract configuration.\n * CLI > .issue-flow.json > defaults. Absence is `{}` (L1, discover).\n */\nexport async function loadVerifyConfig(\n options: LoadVerifyConfigOptions = {},\n): Promise<VerifyConfig> {\n const warn = options.warn ?? printWarning;\n const cli = options.cli ?? verifyCliOverrides;\n const fileLayer = await readVerifyConfigFile(options.projectRoot, warn);\n const merged = { ...fileLayer, ...cli };\n const result = verifyConfigSchema.safeParse(merged);\n if (result.success) return result.data;\n warn(\n `Invalid verify configuration (${result.error.issues[0]?.message ?? 'invalid value'}); using defaults.`,\n );\n return verifyConfigSchema.parse({});\n}\n","import type { WebConfig } from '../schemas.js';\nimport { webConfigSchema } from '../schemas.js';\nimport { printWarning } from '../ui/logger.js';\nimport { parseBooleanEnv, readNumberEnv } from './layers.js';\nimport { PROJECT_CONFIG_FILENAME, readProjectConfigFile } from './sources.js';\n\n/**\n * CLI overrides captured by the preAction hook in cli.ts. Highest-precedence\n * source consumed by loadWebConfig().\n */\nlet webCliOverrides: Partial<WebConfig> = {};\n\nexport function setWebCliOverrides(overrides: Partial<WebConfig>): void {\n webCliOverrides = overrides;\n}\n\nexport interface LoadWebConfigOptions {\n /** CLI flag overrides. Defaults to the values set via setWebCliOverrides(). */\n cli?: Partial<WebConfig>;\n /** Environment source. Defaults to process.env. */\n env?: NodeJS.ProcessEnv;\n /** Directory containing .issue-flow.json. Defaults to the git project root. */\n projectRoot?: string;\n /** Warning sink. Defaults to printWarning. */\n warn?: (message: string) => void;\n}\n\nfunction readWebConfigEnv(\n env: NodeJS.ProcessEnv,\n warn: (message: string) => void,\n): Partial<WebConfig> {\n const layer: Partial<WebConfig> = {};\n if (env.ISSUE_FLOW_WEB !== undefined) {\n layer.enabled = parseBooleanEnv(env.ISSUE_FLOW_WEB);\n }\n const port = readNumberEnv(env, 'ISSUE_FLOW_WEB_PORT', warn);\n if (port !== undefined) {\n layer.port = port;\n }\n if (env.ISSUE_FLOW_WEB_HOST !== undefined) {\n layer.host = env.ISSUE_FLOW_WEB_HOST;\n }\n const refresh = readNumberEnv(env, 'ISSUE_FLOW_WEB_REFRESH', warn);\n if (refresh !== undefined) {\n layer.refreshSeconds = refresh;\n }\n const logLimit = readNumberEnv(env, 'ISSUE_FLOW_WEB_LOG_LIMIT', warn);\n if (logLimit !== undefined) {\n layer.logLimit = logLimit;\n }\n return layer;\n}\n\nasync function readWebConfigFile(\n projectRoot: string | undefined,\n warn: (message: string) => void,\n): Promise<Partial<WebConfig>> {\n const file = await readProjectConfigFile(projectRoot, warn);\n const web = file?.web;\n if (web === undefined) {\n return {};\n }\n\n const result = webConfigSchema.partial().safeParse(web);\n if (!result.success) {\n warn(\n `Ignoring \"web\" key of ${PROJECT_CONFIG_FILENAME}: ${result.error.issues[0]?.message ?? 'invalid value'}.`,\n );\n return {};\n }\n return result.data;\n}\n\n/**\n * Resolve the web monitoring configuration with the documented precedence:\n * CLI flag > environment variable > .issue-flow.json > defaults.\n *\n * Never throws: missing or invalid sources degrade to the defaults with a\n * warning.\n */\nexport async function loadWebConfig(options: LoadWebConfigOptions = {}): Promise<WebConfig> {\n const warn = options.warn ?? printWarning;\n const cli = options.cli ?? webCliOverrides;\n const env = options.env ?? process.env;\n\n const fileLayer = await readWebConfigFile(options.projectRoot, warn);\n const envLayer = readWebConfigEnv(env, warn);\n const merged = { ...fileLayer, ...envLayer, ...cli };\n\n const result = webConfigSchema.safeParse(merged);\n if (result.success) {\n return result.data;\n }\n warn(\n `Invalid web monitoring configuration (${result.error.issues[0]?.message ?? 'invalid value'}); using defaults.`,\n );\n return webConfigSchema.parse({});\n}\n","/**\n * Configuration façade — re-exports the public surface of `src/config/`.\n * Domains live under `./config/`; this file must not hold loader logic.\n */\n\nimport {\n GLOBAL_CONFIG_FILENAME,\n type LoadGlobalConfigOptions,\n loadGlobalConfig,\n PROJECT_CONFIG_FILENAME,\n} from './config/sources.js';\n\nexport { getInstallHint, validateDependencies } from './config/dependencies.js';\nexport { createConfig, DEFAULTS, resolvePaths } from './config/engine.js';\n\nexport type { ConfigLayers } from './config/layers.js';\nexport { mergeConfigLayers } from './config/layers.js';\n\nexport {\n GLOBAL_CONFIG_FILENAME,\n type LoadGlobalConfigOptions,\n loadGlobalConfig,\n PROJECT_CONFIG_FILENAME,\n};\n\n/** @deprecated Use {@link PROJECT_CONFIG_FILENAME}. Historical alias kept for call-site compatibility. */\nexport const WEB_CONFIG_FILENAME = PROJECT_CONFIG_FILENAME;\n\nexport type { AgentCliOverrides, AgentConfig } from './config/agent.js';\nexport {\n getAgentCliOverrides,\n type LoadAgentConfigOptions,\n loadAgentConfig,\n setAgentCliOverrides,\n} from './config/agent.js';\nexport {\n type LoadIssuesConfigOptions,\n loadIssuesConfig,\n setIssuesCliOverrides,\n} from './config/issues.js';\n\nexport {\n type LoadPolicyConfigOptions,\n loadPolicyConfig,\n setPolicyCliOverrides,\n} from './config/policy.js';\nexport {\n type LoadPrReviewConfigOptions,\n loadPrReviewConfig,\n} from './config/pr-review.js';\n\nexport {\n getActiveResilienceConfig,\n initResilienceConfig,\n type LoadResilienceConfigOptions,\n loadResilienceConfig,\n setActiveResilienceConfig,\n setResilienceCliOverrides,\n} from './config/resilience.js';\nexport { loadRoutingConfig, setRoutingCliOverrides } from './config/routing.js';\nexport {\n type LoadTelemetryConfigOptions,\n loadTelemetryConfig,\n} from './config/telemetry.js';\n\nexport {\n type LoadVerifyConfigOptions,\n loadVerifyConfig,\n setVerifyCliOverrides,\n} from './config/verify.js';\nexport {\n type LoadWebConfigOptions,\n loadWebConfig,\n setWebCliOverrides,\n} from './config/web.js';\n"],"mappings":"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","names":["execa","execa","timer","execa","args","installed","execa","DEFAULT_MAX_PROMPT_BYTES","isRecord","maxPromptBytesOf","isPermissionDenial","configurationFailure","installed","execa","execa","execa","shortPath","execa","createInterface","execa","isRecord","execa","execa","role","getAgentCliOverrides","loadAgentConfig","installed","execa","join","join"]}
|