@agentproto/driver-agent-cli
Version:
@agentproto/driver-agent-cli — AIP-45 AGENT-CLI.md reference implementation. Multi-protocol runner that loads an AGENT-CLI.md manifest, spawns the binary, and dispatches turns through an ACP / MCP / proprietary arm. ACP arm delegates to @agentproto/acp; e
1 lines • 372 kB
Source Map (JSON)
{"version":3,"sources":["../src/schema.ts","../src/protocol/acp-client.ts","../src/mcp-servers.ts","../src/process-tree.ts","../src/win32-spawn.ts","../src/command-sandbox-wrap.ts","../src/protocol/print-arm.ts","../src/protocol/proprietary.ts","../src/legacy-modes.ts","../src/manifest/compose.ts","../src/state-home.ts","../src/host-context.ts","../src/session-skills.ts","../src/session-controls.ts","../src/small-model.ts","../src/opencode-permission.ts","../src/npx-fast-path.ts","../src/define-agent-cli.ts"],"names":["resolve","join","basename","existsSync","isAbsolute","homedir","mkdirSync","writeFileSync","dirname","realpathSync","rmSync","resolvePath","ancestors","readFileSync","isPlainObject","mkdtempSync","tmpdir","spawn","randomUUID"],"mappings":"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","file":"chunk-YX33PB7P.mjs","sourcesContent":["/**\n * AIP-45 AGENT-CLI.md frontmatter zod schema.\n *\n * Mirrors `resources/aip-45/draft/AGENT-CLI.schema.json`. AIP-45 is a\n * sibling of AIP-29 (CLI.md, tool CLIs) covering interactive\n * agent-as-process binaries. The `protocol` discriminator (acp / mcp\n * / proprietary) selects the wire arm; cross-field rules ensure the\n * matching arm-specific block is present.\n *\n * Both authoring paths (`define-agent-cli.ts` and\n * `manifest/index.ts`) validate against this schema, so every\n * field-level constraint runs in both paths from a single source of\n * truth.\n */\n\nimport { z } from \"zod\"\n\nconst ID_PATTERN = /^[a-z0-9][a-z0-9-]{1,63}$/\nconst SEMVER_PATTERN = /^\\d+\\.\\d+\\.\\d+(?:[-+][\\w.-]+)?$/\nconst TAG_PATTERN = /^[a-z0-9][a-z0-9-]{0,63}$/\nconst SEMVER_RANGE_PATTERN = /^[><=^~ \\d.\\-+\\w*xX|, ]+$/\nconst ADAPTER_PATTERN = /^@?[a-z0-9][a-z0-9-./]*$/\nconst BIN_PATTERN = /^[A-Za-z0-9._\\-/]+$/\nconst MODE_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,63}$/\nconst OPTION_ID_PATTERN = /^[a-z0-9][a-z0-9_]{0,63}$/\n\nconst CONTINUATION_STRATEGY_IDS = [\n \"none\",\n \"pinned-session\",\n \"transcript\",\n \"native-resume\",\n] as const\n\nconst CONTINUATION_KEY_SCOPES = [\n \"conversation\",\n \"operator\",\n \"user\",\n \"guild\",\n \"workspace\",\n] as const\n\n// AIP-29 install methods, mirrored locally to avoid a runtime cross-package import.\n// Schema-level $ref to AIP-29 is preserved on the JSON Schema side\n// (resources/aip-45/draft/AGENT-CLI.schema.json); this zod copy is the\n// TS-side mirror used by `defineAgentCli`. When AIP-29 grows new\n// install methods, both sides update together via scaffold-aip.\n\nconst installMethodSchema = z.discriminatedUnion(\"method\", [\n z.object({ method: z.literal(\"brew\"), package: z.string(), experimental: z.boolean().optional() }).strict(),\n z.object({ method: z.literal(\"apt\"), package: z.string(), experimental: z.boolean().optional() }).strict(),\n z.object({ method: z.literal(\"dnf\"), package: z.string(), experimental: z.boolean().optional() }).strict(),\n z.object({ method: z.literal(\"pacman\"), package: z.string(), experimental: z.boolean().optional() }).strict(),\n z.object({ method: z.literal(\"choco\"), package: z.string(), experimental: z.boolean().optional() }).strict(),\n z.object({ method: z.literal(\"scoop\"), package: z.string(), experimental: z.boolean().optional() }).strict(),\n z.object({ method: z.literal(\"npm\"), package: z.string(), global: z.boolean().optional(), experimental: z.boolean().optional() }).strict(),\n z.object({ method: z.literal(\"pip\"), package: z.string(), user: z.boolean().optional(), experimental: z.boolean().optional() }).strict(),\n z.object({ method: z.literal(\"cargo\"), package: z.string(), experimental: z.boolean().optional() }).strict(),\n z.object({ method: z.literal(\"go\"), package: z.string(), experimental: z.boolean().optional() }).strict(),\n z.object({\n method: z.literal(\"curl\"),\n url: z.string().url(),\n verify_sha256: z.string().regex(/^[a-f0-9]{64}$/).optional(),\n experimental: z.boolean().optional(),\n }).strict(),\n z.object({\n method: z.literal(\"download\"),\n url: z.string().url(),\n extract_bin: z.string(),\n verify_sha256: z.string().regex(/^[a-f0-9]{64}$/).optional(),\n experimental: z.boolean().optional(),\n }).strict(),\n z.object({ method: z.literal(\"vendored\"), path: z.string(), experimental: z.boolean().optional() }).strict(),\n])\n\nconst versionCheckSchema = z.object({\n cmd: z.string(),\n parse: z.string().describe(\"ECMAScript regex with at least one capture group.\"),\n range: z.string().regex(SEMVER_RANGE_PATTERN).describe(\"npm-style semver range.\"),\n timeout_ms: z.number().int().min(100).default(5000),\n}).strict()\n\n// Harness upgrade declaration — see AgentCliUpgrade (types.ts). `latest` is a\n// two-arm union (registry query vs GitHub release); `cmd`/`rollback` are\n// ARGV arrays (never a shell string), because `harness upgrade` spawns them\n// directly. Consumed by the CLI only — the driver never reads this.\nconst upgradeSchema = z\n .object({\n latest: z.union([\n z.object({ npm: z.string().min(1) }).strict(),\n z.object({ githubRelease: z.string().regex(/^[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+$/) }).strict(),\n ]),\n cmd: z.array(z.string()).min(1),\n rollback: z.array(z.string()).min(1).optional(),\n })\n .strict()\n\nconst SETUP_STEP_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,63}$/\nconst SECRET_SLUG_PATTERN = /^([a-z][a-z0-9-]*[a-z0-9]\\/)?[a-z][a-z0-9-]*[a-z0-9]$/\n\n// `skip_if`: re-runnable health check that, when matching, skips the\n// enclosing setup step. Lets `agentproto setup <slug>` re-runs be\n// idempotent without external completion-ledger state.\nconst skipIfSchema = z\n .object({\n cmd: z.string(),\n exit_code: z.number().int().default(0),\n timeout_ms: z.number().int().min(100).default(5_000),\n })\n .strict()\n\n// `persist`: where the captured value lands so the runner can reuse\n// it on every spawn. Exactly one of env / secret_slug / cmd, enforced\n// via discriminated union.\nconst persistEnvSchema = z\n .object({ env: z.string().regex(/^[A-Z][A-Z0-9_]*$/) })\n .strict()\nconst persistSecretSchema = z\n .object({ secret_slug: z.string().regex(SECRET_SLUG_PATTERN).min(2).max(80) })\n .strict()\nconst persistCmdSchema = z.object({ cmd: z.string() }).strict()\nconst setupPersistSchema = z.union([\n persistEnvSchema,\n persistSecretSchema,\n persistCmdSchema,\n])\n\n// AIP-29 § Setup. Mirrors `resources/aip-29/draft/CLI.schema.json#/$defs/setupStep`.\n// The runner runs steps in declared order, persists completion per\n// (bundle.id, workspace.id, user.id), and surfaces `setup_required`\n// to headless callers when steps remain pending.\nconst setupStepSchema = z.discriminatedUnion(\"kind\", [\n z\n .object({\n id: z.string().regex(SETUP_STEP_ID_PATTERN),\n kind: z.literal(\"cmd\"),\n cmd: z.string(),\n description: z.string().max(2000).optional(),\n skip_if: skipIfSchema.optional(),\n timeout_ms: z.number().int().min(100).default(60_000),\n interactive: z.boolean().default(false),\n persist: setupPersistSchema.optional(),\n })\n .strict(),\n z\n .object({\n id: z.string().regex(SETUP_STEP_ID_PATTERN),\n kind: z.literal(\"prompt\"),\n prompt: z.string().min(1),\n description: z.string().max(2000).optional(),\n type: z.enum([\"text\", \"select\", \"boolean\", \"secret\"]).default(\"text\"),\n default: z.string().optional(),\n options: z\n .union([\n z.array(z.string().min(1)).min(1),\n z\n .object({\n cmd: z.string(),\n timeout_ms: z.number().int().min(100).default(30_000),\n })\n .strict(),\n ])\n .optional(),\n skip_if: skipIfSchema.optional(),\n persist: setupPersistSchema.optional(),\n })\n .strict(),\n z\n .object({\n id: z.string().regex(SETUP_STEP_ID_PATTERN),\n kind: z.literal(\"oauth\"),\n secret_slug: z.string().regex(SECRET_SLUG_PATTERN).min(2).max(80),\n description: z.string().max(2000).optional(),\n skip_if: skipIfSchema.optional(),\n })\n .strict(),\n z\n .object({\n id: z.string().regex(SETUP_STEP_ID_PATTERN),\n kind: z.literal(\"external\"),\n url: z.string().url(),\n description: z.string().max(2000).optional(),\n callback: z\n .object({\n param: z.string().min(1).optional(),\n timeout_ms: z.number().int().min(1_000).default(600_000),\n })\n .strict()\n .optional(),\n skip_if: skipIfSchema.optional(),\n persist: setupPersistSchema.optional(),\n })\n .strict(),\n])\n\nconst authSchema = z.object({\n ref: z.string().optional(),\n state: z.object({\n paths: z.array(z.string()).optional(),\n env: z.array(z.string()).optional(),\n }).strict().optional(),\n login: z.object({\n cmd: z.string(),\n interactive: z.boolean().optional(),\n requires_callback_url: z.boolean().optional(),\n }).strict().optional(),\n refresh: z.object({\n cmd: z.string(),\n interval_s: z.number().int().positive().optional(),\n }).strict().optional(),\n expiry: z.object({\n parse: z.string().optional(),\n grace_s: z.number().int().nonnegative().optional(),\n }).strict().optional(),\n}).strict()\n\n// Subscription (OAuth/bearer) billing declaration — see\n// AgentCliAuthSubscription. Presence = \"supports subscription mode\". Two\n// shapes:\n// - bearer-injection (claude-code): `setEnv` is the var the runtime SETS to\n// the resolved OAuth bearer.\n// - external / file-based (codex, gemini): `external: true` and NO `setEnv` —\n// the CLI reads its own local-login file (`~/.codex/auth.json`, …), so the\n// runtime injects NOTHING and only scrubs the conflicting api-key vars.\n// `conflictEnv` are sibling credential vars scrubbed in every mode (except when\n// set); `unsetEnvAdd` is native-mode-only gateway hygiene.\n//\n// `boxLogin` is the box-login bridge declaration (external surfaces only): how\n// a HOST re-creates a redacted copy of this login inside a sandbox BOX, whose\n// fresh filesystem has neither the host's `~/.codex/auth.json` nor its\n// keychain. `keep` is the allowlist of dotted paths that survive; refresh-like\n// keys are dropped even when keep-listed (see runtime `box-login-bridge.ts`).\nconst boxLoginSchema = z\n .object({\n // Provision-recipe id naming the login file (and the destination path,\n // unless `file` overrides it home-relative).\n recipe: z.string().min(1),\n // Multi-surface recipe flavor (opencode: anthropic-oauth / openai-oauth).\n methodId: z.string().min(1).optional(),\n // Allowlist of dotted paths retained in the copy — must be non-empty: an\n // empty one would copy nothing and the box's own verify would just fail.\n keep: z.array(z.string().min(1)).min(1),\n // Dotted path of the login's expiry inside the raw JSON (epoch s/ms/date).\n expiresPath: z.string().min(1).optional(),\n // Home-relative destination inside the box; absent ⇒ derived from the\n // recipe's own `file` source. Absolute / `..` paths are rejected at copy\n // time by the bridge, never written.\n file: z.string().min(1).optional(),\n })\n .strict()\n\nconst authSubscriptionEntrySchema = z.object({\n setEnv: z.string().min(1).optional(),\n external: z.boolean().optional(),\n conflictEnv: z.array(z.string()).optional(),\n unsetEnvAdd: z.array(z.string()).optional(),\n // Provider scope for a multi-provider adapter's bearer surface (pi's\n // ANTHROPIC_OAUTH_TOKEN is anthropic-only) — see AgentCliAuthSubscription.\n provider: z.string().min(1).optional(),\n boxLogin: boxLoginSchema.optional(),\n}).strict().superRefine((v, ctx) => {\n if (v.external) {\n if (v.setEnv !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"authSubscription.external: true must NOT declare setEnv — an external \" +\n \"(file-based) subscription injects no bearer; the CLI reads its own login file.\",\n path: [\"setEnv\"],\n })\n }\n } else if (v.setEnv === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"authSubscription requires setEnv unless external: true (the bearer must be \" +\n \"injected into some env var).\",\n path: [\"setEnv\"],\n })\n }\n if (v.boxLogin && v.external !== true) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"authSubscription.boxLogin requires external: true — only a file-based \" +\n \"(external) login has a file to bridge into a box; a bearer surface \" +\n \"crosses the boundary as an injected env var instead.\",\n path: [\"boxLogin\"],\n })\n }\n})\n\n// `authSubscription` accepts either ONE surface (today's shape, unscoped or\n// provider-scoped) or an ARRAY of surfaces — a multi-provider adapter that\n// ships more than one native OAuth login (mastracode: Claude AND ChatGPT)\n// declares one entry per provider. Two entries claiming the SAME provider\n// scope (or two unscoped entries) are ambiguous — the runtime's\n// `subscriptionSurfaceFor` has no tiebreak rule, so this is rejected at\n// validation time rather than resolved arbitrarily at spawn time.\nconst authSubscriptionSchema = z\n .union([authSubscriptionEntrySchema, z.array(authSubscriptionEntrySchema).min(1)])\n .superRefine((v, ctx) => {\n if (!Array.isArray(v)) return\n const seen = new Set<string>()\n for (const entry of v) {\n const key = entry.provider ?? \"\\0unscoped\"\n if (seen.has(key)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: entry.provider\n ? `authSubscription: duplicate provider scope \"${entry.provider}\" — two ` +\n `entries claim the same provider, which is ambiguous at spawn time.`\n : \"authSubscription: more than one unscoped entry (no `provider`) — \" +\n \"ambiguous which one applies at spawn time.\",\n })\n }\n seen.add(key)\n }\n })\n\nconst sessionSchema = z.object({\n mode: z.enum([\"ephemeral\", \"persistent\", \"resumable\"]).default(\"ephemeral\"),\n idle_timeout_ms: z.number().int().min(1000).default(600_000),\n // No default: undefined disables the per-turn watchdog entirely. Only\n // adapters known to sometimes drop the final `prompt` response (e.g.\n // hermes) should declare this — applying it broadly would risk\n // false-positiving on another adapter's legitimately long turns.\n turn_idle_timeout_ms: z.number().int().min(1000).optional(),\n max_turns: z.number().int().positive().optional(),\n context_carryover: z.boolean().default(true),\n}).strict()\n\n// A `models.allowed` entry: a bare id (provider unstated, adapter default)\n// or a { id, provider?, mode? } binding stating who serves it and which\n// adapter mode reaches it. See AgentCliModelEntry (types.ts).\nconst modelEntrySchema = z.union([\n z.string(),\n z.object({\n id: z.string(),\n provider: z.string().optional(),\n mode: z.string().optional(),\n }).strict(),\n])\n\nconst modelsSchema = z.object({\n default: z.string().optional(),\n allowed: z.array(modelEntrySchema).optional(),\n // Model-id patterns the adapter must never route to (case-insensitive,\n // trailing `*` = prefix match). Enforced at compose time — see\n // AgentCliModels.deny. Reserves premium providers for dedicated adapters.\n deny: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n // How a model is selected at session start: \"config\" (ACP\n // set_config_option, default) | \"command\" (a `/model <id>` control turn,\n // for agents like hermes that ignore the ACP session model config) |\n // \"arg\" (a CLI argument composed into bin_args at spawn).\n apply: z.enum([\"config\", \"command\", \"arg\"]).optional(),\n // Argv template for apply:\"arg\" — {model} interpolates the requested\n // model id. See AgentCliModels.bin_args_template.\n bin_args_template: z.array(z.string()).optional(),\n}).strict()\n\nconst capabilitiesSchema = z.object({\n streaming: z.boolean().optional(),\n tool_calls: z.boolean().optional(),\n sub_agents: z.boolean().optional(),\n file_io: z.boolean().optional(),\n multimodal: z.boolean().optional(),\n resumable: z.boolean().optional(),\n bidirectional: z.boolean().optional(),\n /**\n * Adapter has a verified native CLI resume into a real terminal/TUI\n * session (e.g. `claude --resume <id>` or `hermes --resume <id> --tui`).\n * When true, the host MAY restart this adapter via its native resume argv\n * as a PTY session. Distinct from ACP-level `resumable`.\n */\n nativeTerminalResume: z.boolean().optional(),\n /**\n * Harness defers mounted MCP tools behind its own native search tool\n * (Claude Code `ToolSearch`). Makes the daemon's `/mcp` self-mount default\n * to eager for this adapter instead of double-deferring behind the\n * daemon's `tool_search`. Defaults to false (conservative).\n */\n nativeToolSearch: z.boolean().optional(),\n /**\n * Adapter can ingest a filesystem path that the host UI just placed\n * on disk (host-side drag-drop into a terminal pastes the path\n * here). Implies the adapter has a Read-file tool wired so the\n * dropped path actually does something. Hosts gate drag-drop UI on\n * this flag — defaults to false (conservative).\n */\n file_attach: z.boolean().optional(),\n}).strict()\n\nexport const modeSchema = z.object({\n id: z.string().regex(MODE_ID_PATTERN),\n description: z.string().optional(),\n // Which orthogonal session-config axis this mode expresses (SPEC-tracked in\n // @agentproto/runtime's session-config.ts). Narrowed to only \"context\" (SPEC\n // §3.4a): route is derived from the model catalog (@route), not a manifest\n // mode, and posture comes from the harness's own ACP mode registry\n // (SessionModeState.availableModes) — neither is a `modes[]` entry anymore.\n // The legacy \"posture\"/\"route\" classification still exists, but only inside\n // the daemon's back-compat `decomposeMode` shim, not this manifest surface.\n kind: z.enum([\"context\"]).optional(),\n bin_args_prepend: z.array(z.string()).optional(),\n bin_args_append: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n // Env keys to DELETE from the spawn env (auth hygiene for gateway\n // modes — see AgentCliMode.env_unset). Applied at the runtime merge\n // point, not as a static set.\n env_unset: z.array(z.string()).optional(),\n // Honest support status surfaced to clients. Absent ⇒ \"active\".\n status: z.enum([\"active\", \"noop\", \"planned\"]).optional(),\n status_note: z.string().optional(),\n // How the host activates this mode: \"bin_args\" (default, argv/env\n // composed at spawn) | \"config\" (no CLI surface — forwarded to the ACP\n // arm's connect({mode}) and applied via session/set_config_option\n // configId:\"mode\", e.g. opencode).\n apply: z.enum([\"bin_args\", \"config\"]).optional(),\n}).strict()\n\nconst optionSchema = z.object({\n id: z.string().regex(OPTION_ID_PATTERN),\n type: z.enum([\"boolean\", \"integer\", \"string\", \"enum\"]),\n description: z.string().optional(),\n enum: z.array(z.string()).min(1).optional(),\n default: z.union([z.boolean(), z.number(), z.string()]).optional(),\n min: z.number().int().optional(),\n max: z.number().int().optional(),\n bin_args_prepend: z.array(z.string()).optional(),\n bin_args_template: z.array(z.string()).optional(),\n bin_args_append_when_true: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n // Env keys to DELETE from the spawn env when this option is active\n // (auth hygiene for value-bearing gateway options — see\n // AgentCliOption.env_unset). Symmetric with modeSchema.env_unset.\n env_unset: z.array(z.string()).optional(),\n}).strict().refine(\n // type === \"enum\" REQUIRES an `enum` array. The JSON Schema enforces\n // this via `if/then`; the zod side mirrors with a refine so both\n // validation paths reject the same shapes.\n o => o.type !== \"enum\" || (Array.isArray(o.enum) && o.enum.length > 0),\n { message: \"option.type === 'enum' requires a non-empty `enum` array\" }\n)\n\n// AIP-45 gateway-preset declaration (see AgentCliPresetDeclaration). A\n// backend an Anthropic/OpenAI-compatible adapter can front, declared in\n// the manifest so the catalog can surface adapter-contributed presets\n// alongside the built-in registry. `scrubEnv` is optional here — an\n// adapter that scrubs in code may omit it.\nconst presetSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1),\n description: z.string().optional(),\n schemaFlavor: z.enum([\"anthropic\", \"openai\"]),\n baseUrl: z.string().min(1),\n keyEnv: z.string().min(1),\n scrubEnv: z.array(z.string()).optional(),\n defaultModel: z.string().optional(),\n homepage: z.string().optional(),\n}).strict()\n\n\nconst continuationStrategyIdSchema = z.enum(CONTINUATION_STRATEGY_IDS)\n\nconst continuationSchema = z.object({\n default: continuationStrategyIdSchema,\n supported: z.array(continuationStrategyIdSchema).min(1),\n pinned_session: z.object({\n idle_timeout_ms: z.number().int().min(1000).default(1_800_000),\n key_scope: z\n .array(z.enum(CONTINUATION_KEY_SCOPES))\n .min(1)\n .default([\"conversation\", \"operator\"]),\n }).strict().optional(),\n}).strict().refine(\n // The chosen `default` must appear in `supported` — otherwise the\n // host has no valid strategy to fall back to.\n c => c.supported.includes(c.default),\n {\n message: \"continuation.default must be a member of continuation.supported\",\n }\n)\n\nconst mcpBlockSchema = z.object({\n command: z.string().optional(),\n args: z.array(z.string()).optional(),\n transport: z.enum([\"stdio\", \"http\", \"sse\"]),\n url: z.string().url().optional(),\n}).strict()\n\nconst printConfigSchema = z.object({\n prompt_flag: z.string().optional(),\n output_format: z.array(z.string()).optional(),\n pre_prompt: z.array(z.string()).optional(),\n resume: z.object({\n flag: z.string(),\n kind: z.enum([\"value\", \"boolean\"]),\n }).strict().optional(),\n event_schema: z.enum([\"claude-stream-json\", \"mastra-jsonl\", \"antigravity-stream-json\", \"jcode-ndjson\"]).optional(),\n}).strict().optional()\n\nexport const agentCliFrontmatterSchema = z\n .object({\n name: z.string().min(1).max(80),\n id: z.string().regex(ID_PATTERN),\n description: z.string().min(1).max(2000),\n version: z.string().regex(SEMVER_PATTERN),\n bin: z.string().regex(BIN_PATTERN),\n bin_args: z.array(z.string()).optional(),\n // Always-on spawn env (merged before mode/option env, which can\n // override). See AgentCliDefinition.env — used by generic ACP agents.\n env: z.record(z.string(), z.string()).optional(),\n install: z.array(installMethodSchema).min(1),\n version_check: versionCheckSchema,\n // In-place harness upgrade recipe — see AgentCliUpgrade. Optional: a\n // pinned-npx adapter (or a curl-only install) declares nothing here and\n // `harness upgrade` refuses it rather than improvising an installer.\n upgrade: upgradeSchema.optional(),\n setup: z.array(setupStepSchema).optional(),\n auth: authSchema.optional(),\n // Billing-auth resolver inputs (DECISION 3). `provider` is a CatalogProvider\n // id (validated against the catalog by the runtime resolver, not here, to\n // keep this generic doctype decoupled from @agentproto/model-catalog).\n provider: z.string().min(1).optional(),\n authSubscription: authSubscriptionSchema.optional(),\n // How this adapter receives a GATEWAY-routed bearer credential — see the\n // doc on AgentCliDefinition.gatewayAuth. Distinct from a gateway preset's\n // `keyEnv` (the providers-store lookup key) and from\n // authSubscription.setEnv (this adapter's own native bearer).\n gatewayAuth: z.object({\n setEnv: z.string().min(1),\n }).strict().optional(),\n // Auth-derivation axis (DECISION 3): true when the adapter's api-key auth\n // is derived from the requested model rather than a fixed `provider`\n // (e.g. `pi`, `opencode`, `mastracode`). When set, the runtime resolver\n // allows `\"api-key\"` mode on the model-derived direct endpoint and\n // includes it in eligibility manifests for by-model routers. DISTINCT\n // from `routeSelection` (the UI-facing route-choice axis).\n modelDerivedApiKey: z.boolean().optional(),\n // UI-facing route-choice axis (AIP-45 launch-menu drill-down, WP1).\n // Absent ⇒ \"free\" (route is an independent choice); \"derived-from-model\"\n // means the endpoint falls out of the model id's vendor prefix. DISTINCT\n // from `modelDerivedApiKey` (the auth-derivation axis) — see the field\n // doc on AgentCliDefinition.routeSelection.\n routeSelection: z.enum([\"free\", \"derived-from-model\"]).optional(),\n authEnforce: z.enum([\"always\", \"when-configured\"]).optional(),\n sandbox: z.union([z.string(), z.record(z.string(), z.unknown())]),\n stateHome: z.object({\n env: z.string().regex(/^[A-Z][A-Z0-9_]*$/),\n defaultDir: z.string().min(1).refine(d => !d.startsWith(\"/\") && !d.split(\"/\").includes(\"..\"), {\n message: \"defaultDir must be relative to $HOME and stay inside it\",\n }),\n share: z.array(z.string().regex(/^[^/]+$/)).optional(),\n seed: z.record(z.string().regex(/^[^/]+$/).refine(n => n !== \".\" && n !== \"..\", { message: \"seed names a file of the home\" }), z.string()).optional(),\n }).strict().optional(),\n credentialDataHome: z.object({ env: z.string().regex(/^[A-Z][A-Z0-9_]*$/) }).strict().optional(),\n smallModel: z.object({\n env: z.string().regex(/^[A-Z][A-Z0-9_]*$/),\n key: z.string().min(1),\n option: z.string().regex(OPTION_ID_PATTERN).optional(),\n userConfig: z.object({\n globalFiles: z.array(z.string().min(1)).optional(),\n fileEnv: z.array(z.string().regex(/^[A-Z][A-Z0-9_]*$/)).optional(),\n dirEnv: z.array(z.string().regex(/^[A-Z][A-Z0-9_]*$/)).optional(),\n projectFiles: z.array(z.string().min(1)).optional(),\n dirFiles: z.array(z.string().min(1)).optional(),\n projectDisableEnv: z.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),\n }).strict().optional(),\n }).strict().optional(),\n // How this CLI takes extra system-prompt text for a session (see\n // AgentCliSystemPrompt in types.ts). Absent ⇒ no channel.\n systemPrompt: z.union([\n z.object({ via: z.literal(\"acp-meta\") }).strict(),\n z.object({\n via: z.literal(\"inline-config\"),\n env: z.string().regex(/^[A-Z][A-Z0-9_]*$/),\n key: z.string().min(1),\n shape: z.enum([\"file-list\", \"text\"]),\n }).strict(),\n z.object({ via: z.literal(\"argv\"), flag: z.string().min(1) }).strict(),\n z.object({\n via: z.literal(\"env-file\"),\n env: z.string().regex(/^[A-Z][A-Z0-9_]*$/),\n maxChars: z.number().int().positive().optional(),\n }).strict(),\n ]).optional(),\n runner: z.union([z.string(), z.record(z.string(), z.unknown())]).optional(),\n protocol: z.enum([\"acp\", \"mcp\", \"proprietary\", \"print\"]),\n acp: z.string().optional(),\n mcp: mcpBlockSchema.optional(),\n adapter: z.string().regex(ADAPTER_PATTERN).optional(),\n print: printConfigSchema,\n session: sessionSchema.optional(),\n models: modelsSchema.optional(),\n capabilities: capabilitiesSchema.optional(),\n modes: z.array(modeSchema).optional(),\n options: z.array(optionSchema).optional(),\n // AIP-45 gateway presets this adapter can drive (merged into the\n // provider-preset catalog; built-in wins on id collision).\n presets: z.array(presetSchema).optional(),\n continuation: continuationSchema.optional(),\n requires: z.object({\n os: z.array(z.enum([\"darwin\", \"linux\", \"windows\"])).optional(),\n arch: z.array(z.enum([\"x64\", \"arm64\", \"x86\", \"arm\"])).optional(),\n min_disk_mb: z.number().int().nonnegative().optional(),\n min_memory_mb: z.number().int().nonnegative().optional(),\n }).strict().optional(),\n examples: z.array(z.object({\n goal: z.string(),\n prompt: z.string(),\n note: z.string().optional(),\n }).strict()).optional(),\n tags: z.array(z.string().regex(TAG_PATTERN)).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n })\n .strict()\n .superRefine((m, ctx) => {\n // Unique mode ids — duplicates would silently shadow.\n if (m.modes) {\n const seen = new Set<string>()\n for (const mode of m.modes) {\n if (seen.has(mode.id)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"modes\"],\n message: `Duplicate mode id '${mode.id}' — mode ids must be unique within a manifest.`,\n })\n }\n seen.add(mode.id)\n }\n }\n // Unique setup step ids — duplicates would silently shadow each\n // other in the host's completion ledger, leading to one step\n // never re-prompting and another always re-prompting.\n if (m.setup) {\n const seen = new Set<string>()\n for (const step of m.setup) {\n if (seen.has(step.id)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"setup\"],\n message: `Duplicate setup step id '${step.id}' — step ids must be unique within a manifest.`,\n })\n }\n seen.add(step.id)\n }\n }\n // Unique option ids — same reasoning as modes.\n if (m.options) {\n const seen = new Set<string>()\n for (const opt of m.options) {\n if (seen.has(opt.id)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"options\"],\n message: `Duplicate option id '${opt.id}' — option ids must be unique within a manifest.`,\n })\n }\n seen.add(opt.id)\n }\n }\n // continuation.default === \"native-resume\" requires capabilities.resumable: true.\n // Mirrors the JSON Schema's allOf rule so both validation paths\n // reject the same shape.\n if (\n m.continuation?.default === \"native-resume\" &&\n !m.capabilities?.resumable\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"continuation\", \"default\"],\n message:\n \"continuation.default === 'native-resume' requires capabilities.resumable: true.\",\n })\n }\n })\n .describe(\n \"Validates the YAML frontmatter portion of an AIP-45 AGENT-CLI.md manifest.\",\n )\n\nexport type AgentCliFrontmatter = z.infer<typeof agentCliFrontmatterSchema>\n\n// Re-export the per-call config schema for hosts that want to validate\n// `OPERATOR.runtime.config` against a manifest at load time. Validation\n// against the manifest's modes/options/continuation lives in\n// `manifest/compose.ts` (the spawn-arg composer) — this schema covers\n// only the SHAPE checks (types, enum values).\nexport const runtimeConfigSchema = z.object({\n mode: z.string().optional(),\n options: z.record(z.string(), z.union([z.boolean(), z.number(), z.string()]))\n .optional(),\n continuation: continuationStrategyIdSchema.optional(),\n}).strict()\n\nexport type RuntimeConfigInput = z.infer<typeof runtimeConfigSchema>\n","/**\n * AIP-45 protocol arm: `protocol: \"acp\"`.\n *\n * Wraps a subprocess's stdio in an `@agentproto/acp` client and\n * exposes the `AgentCliClient` shape the runner consumes. Each\n * `send()` call delegates to a single AcpClientSession.prompt() and\n * forwards the resulting StreamEvent stream.\n */\n\nimport type { ChildProcess } from \"node:child_process\"\nimport { Readable, Writable } from \"node:stream\"\nimport {\n createAcpClient,\n type AcpClient,\n type AcpClientSession,\n type AcpPermissionResolution,\n} from \"@agentproto/acp/client\"\nimport type {\n AgentCliClient,\n AgentCliConnectOptions,\n StreamEvent,\n} from \"../types.js\"\n\n/**\n * Outcome the host returns to the agent on a permission request.\n *\n * Mirrors the upstream ACP `RequestPermissionResponse` shape EXACTLY —\n * note the doubly-nested `outcome` field: the outer is the response\n * envelope, the inner is the discriminator (string literal, not a\n * `{ type: ... }` object). Get this wrong and the agent silently\n * interprets the response as a refusal (\"User refused permission to\n * run tool\"), so we type it strictly here.\n *\n * { outcome: { outcome: \"selected\", optionId: \"...\" } }\n * { outcome: { outcome: \"cancelled\" } }\n */\nexport type AcpPermissionOutcome =\n | { outcome: { outcome: \"selected\"; optionId: string } }\n | { outcome: { outcome: \"cancelled\" } }\n\nexport interface AcpPermissionRequestParams {\n sessionId?: string\n // `title`/`kind` allow `null` (not just `undefined`) so the upstream ACP\n // `RequestPermissionRequest` — whose `toolCall` is a `ToolCallUpdate` with\n // `title: string | null` / `kind: ToolKind | null` — is structurally\n // assignable to this shape. That lets the arm's handler take the SDK type\n // directly, with no `as` cast at the `createAcpClient` call site.\n toolCall?: {\n toolCallId?: string\n title?: string | null\n kind?: string | null\n rawInput?: unknown\n }\n options?: Array<{ optionId: string; name?: string; kind?: string }>\n}\n\nexport type AcpPermissionHandler = (\n params: AcpPermissionRequestParams\n) => Promise<AcpPermissionOutcome> | AcpPermissionOutcome\n\n/**\n * Default handler: pick the first option whose `kind` starts with\n * `allow_` (Claude Code offers `allow_once` and `allow_always`).\n * Falls back to the first option if none match — keeps the agent\n * unblocked rather than throwing on an unfamiliar option set.\n *\n * Mirrors the trust model of in-process Mastra agents: the user\n * approved the operator binding once; subsequent tool calls don't\n * re-prompt by default. Hosts that want explicit per-call gating\n * pass their own `onPermissionRequest`.\n *\n * NOT safe to use as-is for a `mode: \"plan\"` session — see\n * `planModePermissionHandler` below.\n */\nexport const autoAllowPermissionHandler: AcpPermissionHandler = ({\n options,\n}) => {\n if (!options || options.length === 0) {\n // No options offered — return cancelled so the agent gets a\n // deterministic answer instead of hanging on a dropped request.\n return { outcome: { outcome: \"cancelled\" } }\n }\n const allow =\n options.find(o => typeof o.kind === \"string\" && o.kind.startsWith(\"allow_\")) ??\n options[0]\n return { outcome: { outcome: \"selected\", optionId: allow!.optionId } }\n}\n\n/**\n * `toolCall.kind` Claude Code's ACP wrapper attaches to the \"ready to\n * code?\" permission request it raises when the agent wants to leave\n * plan mode (its internal `ExitPlanMode` tool, mapped by\n * `@agentclientprotocol/claude-agent-acp`'s `toolInfoFromToolUse`).\n * This is the ONLY reliable discriminator for that request — its\n * `options[].kind` values (`allow_always` / `allow_once` / `reject_once`)\n * are the same vocabulary an ordinary tool-permission request uses, so\n * `option.kind` alone can't tell the two apart.\n */\nconst PLAN_MODE_EXIT_TOOL_CALL_KIND = \"switch_mode\"\n\n/**\n * Permission handler for a session spawned with `mode: \"plan\"`.\n *\n * `autoAllowPermissionHandler` picks the first `allow_*` option, but for\n * the plan-mode-exit request that option is always an escalation away\n * from plan (`auto`, `acceptEdits`, or `bypassPermissions` depending on\n * what the wrapper offers) — auto-approving it silently defeats the\n * mode the caller asked for (see the regression this fixes: a `plan`\n * session that wrote a file when prompted to). Noted as a known gap in\n * a naive auto-allow handler when #143 shipped the `CLAUDE_CONFIG_DIR`\n * override that makes `mode: \"plan\"` take effect in the first place;\n * this closes it.\n *\n * Behaves exactly like `autoAllowPermissionHandler` for every other\n * request. For the plan-mode-exit request specifically, it selects the\n * offered `reject_once` option (\"No, keep planning\") so the wrapper\n * denies the exit with a clean, structured outcome — the tool call\n * fails, the agent stays in plan mode and can keep reasoning or tell\n * the user it's blocked, instead of the turn throwing on a `cancelled`\n * outcome. Falls back to `cancelled` if no `reject_once` option is\n * offered (shouldn't happen with the current wrapper, but a safe\n * default beats guessing an allow).\n *\n * This is a deliberate one-way gate: a plan-mode session driven by this\n * handler can never escalate itself out of plan mode. A caller that\n * wants a human (or a policy engine) to approve that escalation must\n * supply its own `onPermissionRequest` — this handler is only the\n * default for callers that don't.\n */\nexport const planModePermissionHandler: AcpPermissionHandler = params => {\n const { options, toolCall } = params\n if (!options || options.length === 0) {\n return { outcome: { outcome: \"cancelled\" } }\n }\n if (toolCall?.kind === PLAN_MODE_EXIT_TOOL_CALL_KIND) {\n const keepPlanning = options.find(o => o.kind === \"reject_once\")\n return keepPlanning\n ? { outcome: { outcome: \"selected\", optionId: keepPlanning.optionId } }\n : { outcome: { outcome: \"cancelled\" } }\n }\n return autoAllowPermissionHandler(params)\n}\n\n/** Picks the safe default permission handler for a requested AIP-45\n * mode when the caller didn't supply their own `onPermissionRequest`.\n * Only `\"plan\"` gets special handling today — other modes (accept-edits,\n * bypass-permissions) are already at-or-above the auto-allow handler's\n * trust level, so there's no escalation for it to guard against. */\nfunction defaultPermissionHandlerForMode(\n requestedMode: string | undefined,\n): AcpPermissionHandler {\n return requestedMode === \"plan\"\n ? planModePermissionHandler\n : autoAllowPermissionHandler\n}\n\nexport interface AcpProtocolOptions {\n child: ChildProcess\n cwd: string\n clientInfo?: { name: string; title?: string; version?: string }\n /** Called when the agent asks for permission to run a tool (Write,\n * Bash, ...). Defaults to `autoAllowPermissionHandler`, or\n * `planModePermissionHandler` when `requestedMode === \"plan\"`. Pass a\n * custom handler to plumb requests through a UI / governance\n * policy. Throwing or returning a rejected promise bubbles to the\n * agent as an internal error. */\n onPermissionRequest?: AcpPermissionHandler\n /**\n * AIP-45 mode requested at spawn (`opts.config.mode` in\n * `define-agent-cli.ts`'s `start()`), if any. Used to pick the default\n * permission handler when `onPermissionRequest` is omitted — see\n * `defaultPermissionHandlerForMode`.\n */\n requestedMode?: string\n /**\n * When true, permission requests are surfaced as `agent-prompt` StreamEvents\n * and HELD in the daemon's permission inbox rather than auto-answered —\n * forwarded verbatim to `createAcpClient({ permissionHold })`. The\n * `onPermissionRequest` / `requestedMode` handler is bypassed while this is\n * set. Default false (unchanged: requests are auto-answered in-arm).\n */\n permissionHold?: boolean\n}\n\nexport function createAcpProtocolArm(\n options: AcpProtocolOptions,\n): AgentCliClient {\n const { child, cwd } = options\n\n if (!child.stdin || !child.stdout) {\n throw new Error(\n \"AcpProtocolArm: subprocess must be spawned with piped stdin + stdout\",\n )\n }\n\n const output = Writable.toWeb(child.stdin) as WritableStream<Uint8Array>\n const input = Readable.toWeb(child.stdout) as ReadableStream<Uint8Array>\n\n let client: AcpClient | null = null\n let session: AcpClientSession | null = null\n const pendingByTurn = new Map<string, AsyncIterable<StreamEvent>>()\n // Disconnect subscribers registered BEFORE `connect()` created the client.\n // Drained (and then unused) in `connect`; a later subscriber attaches\n // straight to the live client instead.\n const earlyDisconnectListeners: Array<(err: Error) => void> = []\n\n return {\n get sessionId(): string | undefined {\n return session?.sessionId\n },\n get availableConfigOptions() {\n return session?.availableConfigOptions ?? []\n },\n get modelApplyRejection() {\n return session?.modelApplyRejection\n },\n get availableModes() {\n return session?.availableModes ?? []\n },\n get currentModeId(): string | undefined {\n return session?.currentModeId\n },\n isConnected(): boolean {\n // Pre-connect (`client === null`) reports true: nothing has died yet,\n // and a host that reads `false` here would tear down a session that was\n // merely still starting. Post-connect this defers to the SDK\n // connection's own abort signal — a live read, never a cached flag.\n return client?.isConnected() ?? true\n },\n onDisconnect(listener) {\n if (client) client.onDisconnect(listener)\n else earlyDisconnectListeners.push(listener)\n },\n async connect(opts: AgentCliConnectOptions) {\n const permissionHandler =\n options.onPermissionRequest ??\n defaultPermissionHandlerForMode(options.requestedMode)\n client = await createAcpClient({\n output,\n input,\n clientInfo: options.clientInfo,\n capabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n },\n onActivity: opts.onActivity,\n turnIdleTimeoutMs: opts.turnIdleTimeoutMs,\n // Permission-hold mode: surface + park requests for the daemon inbox\n // instead of auto-answering them in-arm (see AcpProtocolOptions).\n ...(options.permissionHold ? { permissionHold: true } : {}),\n // Wire the permission handler so the agent's `session/request_permission`\n // callbacks get a real answer instead of bubbling up as\n // \"AcpClient.requestPermission: no handler configured\" → which\n // surfaces in the chat as an opaque \"Internal error\" when the\n // agent tries to Write / Bash anything gated.\n // `params` is contextually typed as the SDK's `RequestPermissionRequest`\n // (via `AcpClientOptions.handlers`), which is assignable to\n // `AcpPermissionRequestParams` — so no cast is needed on either side.\n handlers: {\n requestPermission: async params => permissionHandler(params),\n },\n })\n // Attach any disconnect subscriber that arrived before the client\n // existed, BEFORE the first RPC below: `loadSession`/`newSession` are\n // exactly where a wrapper that dies on startup takes the connection\n // down with it, and a subscriber attached afterwards would still be\n // told (the client reports an already-aborted signal synchronously) —\n // attaching here just means it's told at the right moment.\n for (const listener of earlyDisconnectListeners.splice(0)) {\n client.onDisconnect(listener)\n }\n // When the host hands us a `resumeSessionId`, reattach to the\n // agent's existing session via `loadSession` so the conversation\n // (model context, tool history, working files) carries over a\n // cold start. We trust the host to only send ids it persisted\n // from a prior turn; if the agent's `loadSession: true` capability\n // wasn't advertised the SDK call surfaces the per-protocol error.\n //\n // No silent fallback to `newSession` on resume failure — that\n // would create a new session quietly and lose continuity, which\n // is the bug we're trying to prevent. Let the error propagate.\n if (opts.resumeSessionId) {\n session = await client.loadSession({\n sessionId: opts.resumeSessionId,\n cwd,\n mcpServers: opts.mcpServers,\n // Re-assert the requested model/effort/mode on the RESUMED session:\n // a cold-resume spawns a fresh subprocess whose in-memory config\n // starts from the harness default, and opencode persists+restores its\n // own session model. Omitting these let a restarted opencode session\n // drift to its default `opencode/big-pickle` (a rate-limited free id)\n // while agentproto still reported the requested model/route.\n ...(opts.model ? { model: opts.model } : {}),\n ...(opts.effort ? { effort: opts.effort } : {}),\n ...(opts.mode ? { mode: opts.mode } : {}),\n // claude-agent-acp re-reads `_meta.systemPrompt` on loadSession too\n // (native-resume cold-spawns every turn) — sent on BOTH calls or\n // the text is lost after turn 1.\n ...(opts.appendSystemPrompt\n ? { meta: { systemPrompt: { append: opts.appendSystemPrompt } } }\n : {}),\n })\n } else {\n session = await client.newSession({\n cwd,\n mcpServers: opts.mcpServers,\n ...(opts.model ? { model: opts.model } : {}),\n ...(opts.effort ? { effort: opts.effort } : {}),\n ...(opts.mode ? { mode: opts.mode } : {}),\n ...(opts.appendSystemPrompt\n ? { meta: { systemPrompt: { append: opts.appendSystemPrompt } } }\n : {}),\n })\n }\n },\n async send(turnId, message) {\n if (!session) throw new Error(\"AcpProtocolArm.send: not connected\")\n // ACP's `prompt` field is `ContentBlock[]` — multiple blocks\n // together form the user's turn (text + image + resource_link\n // + ...). Callers MAY pass either:\n // - a single block (`{type:\"text\",text:\"...\"}`) — wrapped\n // into a one-element array for the wire\n // - an array of blocks — forwarded verbatim, supporting\n // multimodal turns without callers re-shaping per-arm\n const messages = Array.isArray(message) ? message : [message]\n const stream = session.prompt({ messages })\n pendingByTurn.set(turnId, stream)\n },\n async *events(): AsyncIterable<StreamEvent> {\n const last = Array.from(pendingByTurn.values()).at(-1)\n if (!last) return\n for await (const evt of last) yield evt\n },\n async cancel(_turnId) {\n if (!session) return\n await session.cancel()\n },\n async setConfigOption(configId, value) {\n // No connected session yet — nothing to apply against. Distinct from\n // `not-supported` (a protocol-level absence): this arm DOES support\n // it, there's just no live connection right now.\n if (!session) return { applied: false, reason: \"not-connected\" }\n return session.setConfigOption(configId, value)\n },\n async setSessionMode(modeId) {\n // Same not-connected/not-supported split as setConfigOption above.\n if (!session) return { applied: false, reason: \"not-connected\" }\n return session.setSessionMode(modeId)\n },\n onOutOfTurnEvent(listener) {\n // Subscribed after `connect()` resolved (the runtime binds it to the\n // session it just started) — before that there is nothing to hear.\n if (!session) return () => {}\n return session.onOutOfTurnEvent(listener)\n },\n get steeringSupported() {\n return session?.steeringSupported ?? false\n },\n async steer(content) {\n // Nothing to steer before connect — same not-connected shape as the\n // other session controls, reported as \"promptRequired\" (no turn).\n if (!session) return \"promptRequired\"\n return session.steer(content)\n },\n respondPermission(\n requestId: string,\n resolution: AcpPermissionResolution,\n ): boolean {\n // Resolve a permission request parked by permission-hold mode. Routed\n // through the client (its pending map is keyed globally by request id).\n return client?.respondPermission(requestId, resolution) ?? false\n },\n async close() {\n if (session) await session.close()\n if (client) await client.close()\n },\n }\n}\n","/**\n * Shared converter from this repo's generic `AcpMcpServer[]`\n * (`{ name, transport: \"stdio\"|\"http\"|\"sse\", ref? }`) to the\n * `Record<string, McpServerConfig>` shape mastracode expects — both\n * for the in-process SDK config (`MastraCodeConfig.mcpServers`) and\n * for the file-based `.mastracode/mcp.json` the print arm writes.\n *\n * The target type is structurally identical in both contexts:\n * - stdio → `{ command, args?, env? }`\n * - http → `{ url, headers? }`\n * - sse → `{ url }` (mastracode's `McpHttpServerConfig` doc says\n * it handles SSE through the same `url` field, no separate\n * discriminator)\n *\n * Neither `McpServerConfig`/`McpStdioServerConfig`/`McpHttpServerConfig`\n * is exported from `mastracode`'s public surface (only `.`, `./tui`,\n * `./acp`, `./headless`, `./plugin` subpaths are exported — no `./mcp`),\n * so we define a local, structurally-matching type here. TS structural\n * typing means a plain object literal shaped correctly type-checks fine\n * against `MastraCodeConfig.mcpServers` without a named import.\n *\n * Mirrors EXACTLY the same transport→field semantics the ACP arm uses\n * in `toAcpMcpServer` (`@agentproto/acp/client`), just flattened to\n * mastracode's keyed-record shape instead of the ACP wire array.\n */\n\nimport type { AcpMcpServer } from \"./types.js\"\n\n/**\n * mastracode's per-server config entry (structural — not imported from\n * `mastracode`, which doesn't export these types from its public\n * surface). Detected structurally by mastracode: `command` present →\n * stdio, `url` present → http. Both keys present → entry is skipped\n * (mastracode's own validation).\n */\nexport type MastracodeMcpServerConfig =\n | { command: string; args?: string[]; env?: Record<string, string> }\n | { url: string; headers?: Record<string, string> }\n\n/**\n * Convert the repo's compact `AcpMcpServer[]` into mastracode's\n * `Record<string, McpServerConfig>` keyed by server name. Returns\n * `undefined` for an empty/missing input so callers can spread the\n * result conditionally (`...(cond ? { mcpServers } : {})`).\n *\n * On key collision the caller's entry simply overwrites — this matches\n * mastracode's own \"higher precedence overrides lower, by server name\"\n * merge semantics for both the SDK config field and the file-based\n * load-order.\n */\nexport function toFileBasedMcpServers(\n servers: readonly AcpMcpServer[] | undefined,\n): Record<string, MastracodeMcpServerConfig> | undefined {\n if (!servers || servers.length === 0) return undefined\n const out: Record<string, MastracodeMcpServerConfig> = {}\n for (const s of servers) {\n out[s.name] =\n s.transport === \"stdio\"\n ? {\n command: s.ref ?? \"\",\n ...(s.args !== undefined ? { args: s.args } : {}),\n ...(s.env !== undefined ? { env: s.env } : {}),\n }\n : { url: s.ref ?? \"\", ...(s.headers !== undefined ? { headers: s.headers } : {}) }\n }\n return out\n}\n","/**\n * Whole-tree teardown for a spawned adapter process.\n *\n * `child.kill(\"SIGTERM\")` alone signals only the direct child — for most\n * adapters that is an `npx`/`npm exec` wrapper, and the wrapper can ignore\n * SIGTERM (observed live) while the real adapter, its MCP servers, and any\n * headless Chrome they started keep running as its descendants. Worse, once\n * the wrapper does die those descendants reparent to init and are no longer\n * findable from the child's pid at all.\n *\n * So the tree is snapshotted (`ps -axo pid=,ppid=`) BEFORE anything is\n * signalled, every member gets SIGTERM, and whatever is still alive after a\n * grace period — plus anything it spawned meanwhile — gets SIGKILL.\n */\n\nimport { execFile, type ChildProcess } from \"node:child_process\"\n\nexport interface ProcessRow {\n pid: number\n ppid: number\n}\n\nexport interface TerminateTreeOptions {\n /** How long SIGTERM gets before survivors are SIGKILLed. Default 3000ms. */\n graceMs?: number\n /** Liveness poll interval during the grace period. Default 100ms. */\n pollMs?: number\n /** Process table source — injectable for tests. Default `ps -axo pid=,ppid=`. */\n listProcesses?: () => Promise<ProcessRow[]>\n}\n\nexport interface TerminateTreeResult {\n /** Descendant pids found in the pre-signal snapshot (root excluded). */\n descendants: number[]\n /** Pids (root included) still alive after the grace period, SIGKILLed. */\n killed: number[]\n}\n\nconst DEFAULT_GRACE_MS = 3000\nconst DEFAULT_POLL_MS = 100\n\n/** Every pid below `rootPid` in `rows` (breadth-first, root excluded). */\nexport function descendantsOf(rootPid: number, rows: readonly ProcessRow[]): number[] {\n const byParent = new Map<number, number[]>()\n for (const r of rows) {\n const list = byParent.get(r.ppid)\n if (list) list.push(r.pid)\n else byParent.set(r.ppid, [r.pid])\n }\n const out: number[] = []\n const seen = new Set<number>([rootPid])\n const queue = [rootPid]\n while (queue.length > 0) {\n const pid = queue.shift() as number\n for (const kid of byParent.get(pid) ?? []) {\n if (seen.has(kid)) continue\n seen.add(kid)\n out.push(kid)\n queue.push(kid)\n }\n }\n return out\n}\n\n/**\n * SIGTERM `child` and its whole process tree, then SIGKILL whatever survives\n * `graceMs`. Resolves once the tree is gone or the SIGKILLs are sent.\n *\n * The root is signalled through `child.kill()` and its liveness read off\n * `exitCode`/`signalCode`, never a raw `process.kill(child.pid)` — a child\n * whose spawn failed has no pid to signal (see the runtime's\n * `killChildIfSpawned`), and a root that already exited is a no-op, so this\n * never touches a pid it didn't verifiably spawn and still own.\n */\nexport async function terminateChildTree(\n child: ChildProcess,\n opts: TerminateTreeOptions = {},\n): Promise<TerminateTreeResult> {\n const graceMs = opts.graceMs ?? DEFAULT_GRACE_MS\n const pollMs = opts.pollMs ?? DEFAULT_POLL_MS\n const list = opts.listProcesses ?? listProcesses\n const rootPid = child.pid\n const rootAlive = (): boolean => child.exitCode === null && child.signalCode === null\n if (typeof rootPid !== \"number\" || rootPid <= 0 || rootPid === process.pid || !rootAlive()) {\n return { descendants: [], killed: [] }\n }\n\n // Snapshot first: after the root dies its descendants reparent to init.\n const descendants = descendantsOf(rootPid, await list()).filter(p => p !== process.pid)\n const tracked = new Set(descendants)\n\n try {\n child.kill(\"SIGTERM\")\n } catch {\n // already gone\n }\n for (const pid of tracked) signal(pid, \"SIGTERM\")\n\n const anyAlive = (): boolean => rootAlive() || [...tracked].some(isAlive)\n const deadline = Date.now() + graceMs\n while (anyAlive() && Date.now() < deadline) {\n await new Promise(r => setTimeout(r, pollMs))\n }\n if (!anyAlive()) return { descendants, killed: [] }\n\n // Anything a survivor spawned during the grace period belongs to the tree\n // too — re-walk from the root (if still alive) and from every survivor.\n const rows = await list()\n const survivors = [...tracked].filter(isAlive)\n for (const from of rootAlive() ? [rootPid, ...survivors] : survivors) {\n for (const pid of descendantsOf(from, rows)) {\n if (pid !== process.pid) tracked.add(pid)\n }\n }\n\n const killed: number[] = []\n if (rootAlive()) {\n try {\n child.kill(\"SIGKILL\")\n killed.push(rootPid)\n } catch {\n // already gone\n }\n }\n for (const pid of tracked) {\n if (isAlive(pid) && signal(pid, \"SIGKILL\")) killed.push(pid)\n }\n return { descendants, killed }\n}\n\nfunction signal(pid: number, sig: NodeJS.Signals): boolean {\n try {\n process.kill(pid, sig)\n return true\n } catch {\n return false\n }\n}\n\nfunction isAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch (err) {\n // EPERM: exists, just not ours to signal-probe.\n return (err as NodeJS.ErrnoException).code === \"EPERM\"\n }\n}\n\n/** `ps` is absent on Windows — resolve empty, degrading to root-only. */\nfunction listProcesses(): Promise<ProcessRow[]> {\n return new Promise(resolve => {\n execFile(\"ps\", [\"-axo\", \"pid=,ppid=\"], { maxBuffer: 32 * 1024 * 1024 }, (err, stdout) => {\n if (err) return resolve([])\n const out: ProcessRow[] = []\n for (const line of stdout.split(\"\\n\")) {\n const m = line.match(/^\\s*(\\d+)\\s+(\\d+)\\s*$/)\n if (m) out.push({ pid: Number(m[1]), ppid: Number(m[2]) })\n }\n resolve(out)\n })\n })\n}\n","/**\n * Win32 spawn argv resolution for AgentCli adapter launches — recap point 10\n * (WIN11 test 2026-09-29/30): a device-sandbox spawn onto a joined Windows\n * host reached its daemon and ran the inner `agent_start`, but the headless\n * adapter launch died with Node `spawn EINVAL`. e2b/Linux hosts had never\n * shown it because only Windows has npm `.cmd` shims.\n *\n * The mechanism (both file:line cited in the PR that ships this):\n * - `resolveSpawnBin` (`define-agent-cli.ts:115-121`) rewrites the\n * manifest `bin: \"npx\"` (opencode, claude-code, codex, …) to the\n * ABSOLUTE `<execPath-dir>\\npx.cmd` on win32.\n * - The ACP arm's spawn (`define-agent-cli.ts:527`) and the print arm's\n * spawn (`print-arm.ts:188`) then pass that `.cmd` path to\n * `child_process.spawn` WITHOUT the `shell` option.\n * - Node ≥ 18.20.2 / 20.12.2 / 22.0 (CVE-2024-27980: `IsWindowsBatchFile`\n * in `src/process_wrap.cc`) refuses every spawn whose file literal ends\n * in `.bat`/`.cmd` without `shell: true` → the whole `agent_start`\n * fails `spawn EINVAL`. Bare (extensionless) bins never hit that check\n * — the spawn paths that work on Windows (the PTY/ConPTY launches,\n * which cmd-resolve shims from a command-LINE string) pass either a\n * bare name or a real `.exe` — which is exactly the divergence between\n * the working local spawn and the device-bridge host spawn.\n *\n * Fix policy (two stages, keyed on the resolved bin's extension, win32 only):\n * 1. PREFERRED — rewrite a `.cmd`/`.bat` npm shim into the real node\n * entry it wraps (`npx.cmd` → `node …/node_modules/npm/bin/npx-cli.js`):\n * the spawn stays `shell:false` with clean argv, and no cmd.exe\n * interpolation of our args. Every shipped adapter (bin `npx`/`npm`)\n * takes this stage.\n * 2. FALLBACK — a `.cmd`/`.bat` bin we cannot rewrite (another global\n * package's shim named directly in a manifest) spawns with\n * `shell: true`, Node's documented escape hatch. Args reaching that\n * stage come from adapter manifests plus operator `model`/`effort`\n * values validated upstream — free-form shell input never goes here.\n */\n\nimport { existsSync } from \"node:fs\"\nimport { basename, dirname, join } from \"node:path\"\n\n/** True when `exe` is a batch file Node on Windows refuses to spawn\n * directly without `shell: true` (see module doc — CVE-2024-27980). */\nexport function isWindowsBatchFile(\n exe: string,\n deps?: { platform?: NodeJS.Platform },\n): boolean {\n if ((deps?.platform ?? process.platform) !== \"win32\") return false\n return /\\.(?:bat|cmd)$/i.test(exe)\n}\n\n/** `spawn` options telling Node to run a batch-file bin through cmd.exe —\n * empty (no options) on POSIX or for a non-batch bin. Spread verbatim\n * into both arms' `spawn(execBin, execArgs, { … })` calls once the spawn\n * args are final. */\nexport function windowsBatchShellOption(\n exe: string,\n deps?: { platform?: NodeJS.Platform },\n): { shell: true } | { shell?: never } {\n if (isWindowsBatchFile(exe, deps)) return { shell: true }\n return {}\n}\n\nexport interface WindowsBatchSpawnResolution {\n bin: string\n args: string[]\n}\n\n/** Stage 1: when `bin` is a `.cmd`/`.bat` npm shim whose real node entry\n * sits beside it, swap the shim for\n * `<execPath> <dirname(bin)/node_modules/npm/bin/<stem>-cli.js>`. npm's\n * own `.cmd` shims (`npx.cmd`, `npm.cmd`) are exactly this: a two-line\n * wrapper execing `node <…>/npm/bin/<npx|npm>-cli.js $*`, so the rewrite\n * is behavior-identical while keeping the spawn `shell:false` (cmd.exe\n * never sees our argv). `npx-cli.js`/`npm-cli.js` live next to their shim\n * both in a Node install dir (`C:\\Program Files\\nodejs\\`) and in an npm\n * global-prefix dir (`%APPDATA%\\npm\\`), so `dirname(bin)` is the right\n * root in both layouts. A third-party global bin shim (e.g.\n * `opencode.cmd`) has no such sibling JS — this returns `undefined` and\n * the caller falls back to {@link windowsBatchShellOption}. */\nexport function resolveWindowsBatchSpawn(\n bin: string,\n args: readonly string[],\n deps?: {\n platform?: NodeJS.Platform\n execPath?: string\n exists?: (p: string) => boolean\n },\n): WindowsBatchSpawnResolution | undefined {\n if ((deps?.platform ?? process.platform) !== \"win32\") return undefined\n if (!isWindowsBatchFile(bin, deps)) return undefined\n const stem = basename(bin).replace(/\\.(?:bat|cmd)$/i, \"\")\n if (stem !== \"npx\" && stem !== \"npm\") return undefined\n const script = join(dirname(bin), \"node_modules\", \"npm\", \"bin\", `${stem}-cli.js`)\n // Default to the fs-level check. The WIN11 field test (2026-09-30) shipped\n // a dist where the production caller passed no deps at all, so this branch\n // evaluated a placeholder `() => false` and the stage-1 rewrite silently\n // never took — every spawn fell to the `shell: true` fallback and cmd.exe\n // mangled the quoted `C:\\Program Files\\...` path (the \"ACP connection\n // closed\" wall). Tests inject this via `deps`; production must hit the\n // real filesystem.\n if (!(deps?.exists ?? existsSync)(script)) return undefined\n return { bin: deps?.execPath ?? process.execPath, args: [script, ...args] }\n}\n","/**\n * Wraps an agent-cli child's spawn argv through the shared OS-level\n * confinement backends (`@agentproto/command-sandbox` — macOS Seatbelt /\n * Linux bubblewrap), the same backends `@agentproto/runtime`'s\n * `command_execute` tool already wraps ALLOWLISTED commands through. This\n * confines the adapter's OWN process tree — the harness-agnostic\n * enforcement an ACP permission seam can never provide, since it only sees\n * tool calls the adapter chooses to report, not what an in-process Bash\n * actually touches.\n *\n * Used by both spawn sites in this package: the long-lived ACP/MCP arm\n * (`define-agent-cli.ts`) and the per-turn print-protocol arm\n * (`protocol/print-arm.ts`).\n */\n\nimport { homedir } from \"node:os\"\nimport { join } from \"node:path\"\nimport {\n loadAdapterSpawnSandboxConfig,\n resolveCommandSandbox,\n type SandboxMode,\n type SandboxPolicy,\n type SandboxZones,\n} from \"@agentproto/command-sandbox\"\n\n/**\n * Directories OUTSIDE the workspace, under `$HOME`, that a confined adapter\n * child needs WRITE access to just to function — toolchain self-management\n * (pnpm/npm) plus the adapter's own runtime bookkeeping. Read access to\n * `~/.npmrc` etc. is covered by Seatbelt's `allow default` / bwrap's\n * ro-bind-try of system dirs already; these are specifically the\n * WRITE-needing paths, all empirically required (2026-07-22) running a REAL\n * `npx`-spawned `claude-agent-acp` child under `workspace` mode:\n *\n * - pnpm/npm toolchain: a pnpm self-update or global install fails\n * otherwise — documented in `@agentproto/command-sandbox`'s own module\n * doc for the `command_execute` use of these same backends.\n * - `~/.claude/session-env/<sessionId>`: Claude Code's own Bash-tool\n * session bookkeeping directory (empty per-session dirs it creates\n * itself) — without write access here every Bash tool call in the\n * confined child fails with EPERM before the command even runs, since\n * the tool can't create its own scratch dir. Narrowly scoped to\n * `session-env` rather than all of `~/.claude` (which also holds\n * settings/credentials this confinement should NOT grant write access\n * to). Harmless to include for non-claude-code adapters — a directory\n * that doesn't exist is simply not bound (bwrap `--bind-try`) / not\n * matched (Seatbelt subpath allow on a nonexistent path is a no-op).\n */\nexport function defaultToolchainWritePaths(): string[] {\n const home = homedir()\n return [\n join(home, \"Library\", \"pnpm\", \".tools\"), // macOS pnpm self-managed toolchain\n join(home, \".local\", \"share\", \"pnpm\"), // Linux pnpm self-managed toolchain\n join(home, \".npm\"), // npm cache — self-update / global installs\n join(home, \".claude\", \"session-env\"), // claude-code's own Bash-tool session bookkeeping\n ]\n}\n\n/**\n * pnpm/npm config files OUTSIDE the workspace that need READ access — without\n * these, pnpm still limps along on its built-in defaults but prints an EPERM\n * warning on every invocation (empirically observed 2026-07-22 running\n * `pnpm --version` / `pnpm store path` inside a real confined adapter child)\n * and silently ignores whatever the operator configured there (registry\n * mirrors, auth tokens for private registries, …). Same footgun\n * `@agentproto/command-sandbox`'s own module doc already documents for the\n * `command_execute` use of these backends.\n *\n * Also covers the git/gh keychain-backed credential gap flagged by PR 6a's\n * empirical verification: under `workspace` mode, a confined `git ls-remote`\n * failed with `unable to access '~/.gitconfig': Operation not permitted` and\n * a confined `gh auth status` failed with `open '~/.config/gh/config.yml':\n * operation not permitted` — BEFORE either tool ever reached the OS\n * keychain, because their own config files live under the denied `$HOME`\n * subtree and only metadata (stat/lstat), not content, is re-allowed there.\n * Re-verified 2026-07-23: re-allowing `~/.gitconfig` + `~/.config/git` +\n * `~/.config/gh` (content read) fixes both commands; `gh auth status` then\n * still failed one more level down — `git-credential-osxkeychain get`\n * silently returned nothing under confinement (vs. a full credential record\n * unconfined) even with `~/Library/Keychains` reachable via `allow default`'s\n * mach-lookup to securityd. Adding `~/Library/Keychains` here (content read,\n * not just the mach-IPC path `allow default` already permits) fixed it: the\n * client-side keychain lookup needs to read its own keychain database file,\n * not only talk to securityd over XPC. READ-ONLY is deliberate — an agent\n * should be able to RETRIEVE a stored credential to authenticate a push, but\n * granting WRITE would let a confined process tamper with the host's real\n * keychain (`git credential-osxkeychain store/erase`); that's out of scope\n * and not needed for the push/fetch flows this gap was blocking.\n *\n * Linux has no equivalent OS keychain this backend integrates with (`gh`/git\n * there typically use libsecret/gnome-keyring over D-Bus, or a plaintext\n * `.git-credentials` store) — see `command-sandbox-wrap.ts`'s module doc for\n * the documented workaround under bwrap.\n */\nexport function defaultToolchainReadPaths(): string[] {\n const home = homedir()\n return [\n join(home, \".npmrc\"),\n join(home, \"Library\", \"Preferences\", \"pnpm\", \"rc\"),\n join(home, \".gitconfig\"), // git's own global config (credential.helper, user.*, …)\n join(home, \".config\", \"git\"), // XDG git config fallback\n join(home, \".config\", \"gh\"), // gh's config.yml + hosts.yml\n join(home, \"Library\", \"Keychains\"), // macOS Keychain DB — git/gh credential retrieval (read-only; see doc above)\n ]\n}\n\nexport interface WrapAgentCliSpawnOptions {\n /**\n * `undefined` ⇒ this call site didn't explicitly choose a mode — falls\n * back to the workspace's `.agentproto/command-sandbox.json`\n * `adapterSpawn.mode` (or `ADAPTER_COMMAND_SANDBOX_MODE_ENV`), and only\n * stays unconfined if THAT also resolves to `undefined` (no file, no\n * `adapterSpawn` key). An explicit mode here (from `agent_start`'s\n * `commandSandbox` param) always wins over the config file — see the\n * module's config-key doc in `@agentproto/command-sandbox` for why the\n * two are independent.\n */\n mode: SandboxMode | undefined\n /** The confinement boundary — normally the session's cwd. Also the\n * anchor `.agentproto/command-sandbox.json` is read from. */\n cwd: string\n /**\n * Extra write-capable paths beyond the default toolchain set (e.g. the\n * per-spawn `CLAUDE_CONFIG_DIR` temp dir mkdtemp'd BEFORE this spawn —\n * bwrap's `--tmpfs /tmp` would otherwise hide it on Linux). Merged with\n * (not a replacement for) the config file's own `adapterSpawn.extraWritePaths`.\n */\n extraWritePaths?: string[]\n /** Merged with the config file's own `adapterSpawn.extraReadPaths`. */\n extraReadPaths?: string[]\n /**\n * Host-declared filesystem zones (see `SandboxZones`). When present the\n * confinement is ALWAYS engaged — `mode` defaults to `\"workspace\"`\n * regardless of the workspace's config file, an explicit `\"off\"` is\n * refused, and the cwd's own `.agentproto/command-sandbox.json` extra\n * paths are ignored (the app being confined must not be able to widen its\n * own boundary from a file the boundary is meant to make read-only).\n */\n zones?: SandboxZones\n /** Adapter/arm identifier for the fail-closed error message. */\n label: string\n}\n\nfunction effectiveSpawnSandboxMode(\n opts: Pick<WrapAgentCliSpawnOptions, \"mode\" | \"zones\">,\n configured: SandboxMode | undefined,\n): SandboxMode | undefined {\n return opts.zones ? (opts.mode ?? \"workspace\") : (opts.mode ?? configured)\n}\n\n/**\n * Will {@link wrapAgentCliSpawn} confine this spawn? Same mode resolution\n * (zones force it on; an explicit mode wins over the workspace config file),\n * so callers can prepare confinement-only state BEFORE the env is frozen —\n * e.g. an isolated adapter state home the sandbox would otherwise deny.\n */\nexport async function willConfineAgentCliSpawn(\n opts: Pick<WrapAgentCliSpawnOptions, \"mode\" | \"zones\" | \"cwd\">,\n): Promise<boolean> {\n const cfg = await loadAdapterSpawnSandboxConfig(opts.cwd)\n const mode = effectiveSpawnSandboxMode(opts, cfg.mode)\n return mode !== undefined && mode !== \"off\"\n}\n\n/**\n * Wrap `[bin, ...args]` for confined execution, or return it unchanged when\n * unconfined. FAIL-CLOSED when a mode IS configured but no backend exists\n * for this platform — mirrors `command_execute`'s own fail-closed contract\n * in `@agentproto/runtime`'s `command-tools.ts`: an operator who explicitly\n * opted into confinement believing it's active, silently getting an\n * unconfined agent-cli child that can read `~/.ssh`, is strictly worse than\n * a clear error.\n *\n * Mode resolution order: `opts.mode` (explicit `agent_start.commandSandbox`)\n * wins outright; otherwise `.agentproto/command-sandbox.json`'s\n * `adapterSpawn.mode` (itself overridable by `ADAPTER_COMMAND_SANDBOX_MODE_ENV`)\n * applies. If BOTH resolve to `undefined` (no explicit call, no config file /\n * no `adapterSpawn` key), this stays SILENT and unconfined — unlike\n * `command_execute`'s per-call warning, which fires because `off` is what\n * ITS config loader always resolves an untouched workspace TO. Here\n * `undefined` specifically means \"this axis was never engaged by anyone\",\n * so warning would print on every single session spawn across the whole\n * fleet by default — a real behavior change, not the \"default off,\n * unchanged behaviour\" this option promises. A resolved `mode: \"off\"`\n * (explicit call OR an `adapterSpawn` config block that opted in and picked\n * unconfined) still gets the loud warning, matching `command_execute`'s\n * reasoning that a live \"off\" state shouldn't fade into background noise.\n *\n * Extra read/write paths (both the caller's `opts.extraReadPaths`/\n * `extraWritePaths` and the config file's `adapterSpawn.extraReadPaths`/\n * `extraWritePaths`) always merge in on top of the built-in toolchain\n * defaults whenever confinement is active, regardless of which side chose\n * the mode — they're workspace-level exceptions, not mode-selection.\n */\nexport async function wrapAgentCliSpawn(\n bin: string,\n args: string[],\n opts: WrapAgentCliSpawnOptions,\n): Promise<[string, string[]]> {\n const cfg = await loadAdapterSpawnSandboxConfig(opts.cwd)\n const mode = effectiveSpawnSandboxMode(opts, cfg.mode)\n if (mode === undefined) return [bin, args]\n if (mode === \"off\" && opts.zones) {\n throw new Error(\n `agent-cli '${opts.label}': filesystem zones (an app boundary) cannot be ` +\n `combined with commandSandbox \"off\" — the zones are only enforceable ` +\n `through the OS sandbox. Refusing to spawn.`,\n )\n }\n if (mode === \"off\") {\n console.error(\n `[agent-cli] ⚠ spawning '${opts.label}' UNCONFINED — no OS-level ` +\n `sandbox is active (commandSandbox mode is \"off\").`,\n )\n return [bin, args]\n }\n const backend = resolveCommandSandbox()\n if (!backend) {\n throw new Error(\n `agent-cli '${opts.label}': commandSandbox mode=\"${mode}\" is configured ` +\n `but no sandbox backend is available on ${process.platform} (macOS ` +\n `needs sandbox-exec, Linux needs bwrap installed). Refusing to spawn ` +\n `unconfined — pass commandSandbox: \"off\" to explicitly accept ` +\n `unconfined execution, or install the missing backend.`,\n )\n }\n const fileCfg = opts.zones ? undefined : cfg\n const policy: SandboxPolicy = {\n workspace: opts.cwd,\n extraReadPaths: [\n ...defaultToolchainReadPaths(),\n ...(fileCfg?.extraReadPaths ?? []),\n ...(opts.extraReadPaths ?? []),\n ],\n extraWritePaths: [\n ...defaultToolchainWritePaths(),\n ...(fileCfg?.extraWritePaths ?? []),\n ...(opts.extraWritePaths ?? []),\n ],\n ...(opts.zones ? { zones: opts.zones } : {}),\n network: mode === \"strict\" || cfg.network === \"deny\" ? \"deny\" : \"allow\",\n }\n const wrapped = backend.wrap([bin, ...args], policy)\n return [wrapped[0] ?? bin, wrapped.slice(1)]\n}\n","/**\n * AIP-45 protocol arm: `protocol: \"print\"`.\n *\n * Drives a headless CLI as one fresh subprocess per turn — no\n * long-lived ACP connection. Simpler than the ACP arm and immune to\n * the stale-proxy race condition: the session object itself never dies\n * between turns; only the per-turn child does.\n *\n * ## Configuration\n *\n * The adapter's `print` manifest block declares the CLI's one-shot\n * surface (flags, output format, event taxonomy). When the block is\n * absent, Claude Code defaults are applied for backward compatibility.\n *\n * ## Session tracking\n *\n * The `sessionId` property starts empty (or pre-seeded from\n * `resumeSessionId`) and is updated after the first successful turn\n * from the wire event that carries the session / thread identifier\n * (Claude: `result.session_id`; Mastra: `result.threadId`).\n * Subsequent turns pass the appropriate resume flag so the CLI\n * rehydrates the conversation.\n */\n\nimport { spawn } from \"node:child_process\"\nimport { existsSync, mkdirSync, readFileSync, rmdirSync, rmSync, writeFileSync } from \"node:fs\"\nimport { createInterface } from \"node:readline\"\nimport { join } from \"node:path\"\nimport type { SandboxMode } from \"@agentproto/command-sandbox\"\nimport { toFileBasedMcpServers } from \"../mcp-servers.js\"\nimport { terminateChildTree } from \"../process-tree.js\"\nimport { windowsBatchShellOption } from \"../win32-spawn.js\"\nimport { wrapAgentCliSpawn } from \"../command-sandbox-wrap.js\"\nimport type {\n AcpMcpServer,\n AgentCliPrintConfig,\n AgentCliRuntimeSession,\n StreamEvent,\n} from \"../types.js\"\n\nexport interface PrintArmOptions {\n bin: string\n /** Base argv passed to the binary BEFORE print flags and prompt.\n * Typically permission-mode and model overrides from `composeSpawn`. */\n baseArgs: string[]\n cwd: string\n env: Record<string, string>\n /** Pre-seed from `resumeSessionId` so the first turn reattaches. */\n resumeSessionId?: string\n /** Adapter-declared print surface config. Omit for Claude defaults. */\n printConfig?: AgentCliPrintConfig\n /**\n * MCP servers to mount into the agent's session. For the `mastracode`\n * print arm (`event_schema: \"mastra-jsonl\"`) these are written to\n * `<cwd>/.mastracode/mcp.json` before the first turn's spawn (the\n * mastracode CLI has no CLI flag / env var / config-dir override for\n * MCP config — this was exhaustively verified against its source) and\n * restored/removed on `close()`. Ignored for other print schemas\n * (e.g. Claude Code), which don't load MCP config from this path.\n */\n mcpServers?: AcpMcpServer[]\n /** OS-level confinement for the per-turn spawn — see\n * `AgentCliStartOptions.commandSandbox` in `../types.ts` and\n * `wrapAgentCliSpawn`'s doc for the fail-closed contract. */\n commandSandbox?: SandboxMode\n /** Extra write-capable paths beyond the default toolchain set, e.g. the\n * per-session `CLAUDE_CONFIG_DIR` temp dir set up by the caller. */\n extraWritePaths?: string[]\n /** Extra READ-only paths beyond the confinement boundary — the exact-file\n * AGENTS.md grant (`AgentCliStartOptions.additionalReadPaths`). READ\n * exceptions only; never widens writes. */\n extraReadPaths?: string[]\n /** See `AgentCliStartOptions.fsZones`. */\n fsZones?: { readOnly: string[]; writable: string[]; hidden?: string[] }\n /**\n * The explicitly requested model id — when set, a wire event that\n * truthfully reports which model the agent ACTUALLY started on (today:\n * the jcode-ndjson `start` line's `model` field) is checked against it,\n * and a mismatch aborts the turn loudly (child killed, error event)\n * instead of letting the agent run on a model the operator didn't name.\n * Set by `define-agent-cli.ts` only for `routeSelection:\n * \"derived-from-model\"` adapters with an explicit `model` option — the\n * print-protocol counterpart of its ACP-arm guard. The bug this closes:\n * jcode's CLI silently falls back to its own default on an unknown\n * `--model` id (observed live: `--model totally-bogus-xyz` →\n * `{\"type\":\"start\",\"model\":\"gpt-5.6-sol\",\"provider\":\"OpenAI\"}`), which\n * for a derived-from-model adapter is a different provider on a\n * different bill. Schemas that never report the started model are\n * unaffected. Compared via {@link printModelMismatch} (basename,\n * `@suffix`/`provider/`-prefix tolerant).\n */\n expectedModel?: string\n}\n\n/**\n * Whether the agent's reported model contradicts the requested one.\n * Compares the model BASENAME (last `/` segment, `@route` suffix stripped,\n * case-insensitive) because the wire echoes a normalized form of the id:\n * jcode reports `deepseek/deepseek-v4-pro` for a requested\n * `deepseek/deepseek-v4-pro@openrouter` — same model, different spelling.\n * Basename equality keeps that a match while still catching a silent\n * default-model fallback (requested `gpt-5` vs reported `gpt-5.6-sol` IS a\n * mismatch — no substring leniency).\n */\nexport function printModelMismatch(requested: string, reported: string): boolean {\n const basename = (id: string): string => {\n const noSuffix = id.split(\"@\")[0] ?? id\n const segs = noSuffix.split(\"/\")\n return (segs[segs.length - 1] ?? noSuffix).trim().toLowerCase()\n }\n return basename(requested) !== basename(reported)\n}\n\n// ── Defaults (Claude Code backward-compatible) ──────────────────────\n\nconst DEFAULT_OUTPUT: string[] = [\"--output-format\", \"stream-json\"]\nconst DEFAULT_PRE_PROMPT: string[] = [\"--no-interactive\"]\nconst DEFAULT_RESUME = { flag: \"--resume\", kind: \"value\" as const }\n\n/** The event taxonomies the print arm knows how to map. Mirrors\n * `AgentCliPrintConfig.event_schema` (minus the optional/undefined) so the\n * mapper dispatch and the manifest stay in lockstep. */\ntype PrintEventSchema = NonNullable<AgentCliPrintConfig[\"event_schema\"]>\n\nexport function createPrintSession(\n opts: PrintArmOptions,\n): AgentCliRuntimeSession {\n const config = opts.printConfig\n const outputFormat = config?.output_format ?? DEFAULT_OUTPUT\n const prePrompt = config?.pre_prompt ?? DEFAULT_PRE_PROMPT\n const promptFlag = config?.prompt_flag\n const resumeCfg = config?.resume ?? DEFAULT_RESUME\n const eventSchema = config?.event_schema ?? \"claude-stream-json\"\n\n let sessionId = opts.resumeSessionId ?? \"\"\n let activeChild: ReturnType<typeof spawn> | null = null\n\n // ── MCP server injection (mastracode print arm only) ─────────────\n // The mastracode CLI has no CLI flag, env var, or config-dir override\n // for MCP config (exhaustively verified against its source). The only\n // way to mount host-chosen MCP servers into a print-arm subprocess is\n // to write them into `<cwd>/.mastracode/mcp.json`, which mastracode\n // loads at process startup as its highest-precedence project-scope\n // config. This is done once here (before the first turn's spawn) and\n // restored on close(). Only applies when the adapter is mastracode\n // (`event_schema: \"mastra-jsonl\"`) — other print adapters (Claude\n // Code) don't read this path.\n const mcpRestore = setupMcpConfigFile(opts, eventSchema)\n\n return {\n get sessionId(): string {\n return sessionId\n },\n\n async *send(message: unknown): AsyncIterable<StreamEvent> {\n const prompt = extractPromptText(message)\n\n // Build argv: baseArgs + output_format + pre_prompt +\n // resume_flag(+value) + prompt_flag(+text) | positional\n const args: string[] = [\n ...opts.baseArgs,\n ...outputFormat,\n ...prePrompt,\n ]\n\n // Resume flag\n if (sessionId) {\n args.push(resumeCfg.flag)\n if (resumeCfg.kind === \"value\") args.push(sessionId)\n }\n\n // Prompt: flag or positional\n if (promptFlag) {\n args.push(promptFlag, prompt)\n } else {\n args.push(prompt)\n }\n\n // OS-level confinement — same fail-closed contract as the ACP arm's\n // spawn in `define-agent-cli.ts`; see `wrapAgentCliSpawn`'s doc.\n const [execBin, execArgs] = await wrapAgentCliSpawn(opts.bin, args, {\n mode: opts.commandSandbox,\n cwd: opts.cwd,\n ...(opts.extraWritePaths ? { extraWritePaths: opts.extraWritePaths } : {}),\n ...(opts.extraReadPaths ? { extraReadPaths: opts.extraReadPaths } : {}),\n ...(opts.fsZones ? { zones: opts.fsZones } : {}),\n label: \"print-arm\",\n })\n const child = spawn(execBin, execArgs, {\n cwd: opts.cwd,\n env: opts.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n // Win32: only reached for a `.cmd`/`.bat` bin that\n // `resolveWindowsBatchSpawn` couldn't rewrite to its node entry\n // (see `win32-spawn.ts` — Node refuses direct batch spawning,\n // CVE-2024-27980, the recap-10 `spawn EINVAL`). POSIX: `{}`.\n ...windowsBatchShellOption(execBin),\n })\n activeChild = child\n\n // Attached synchronously, before any `await`/generator suspension\n // below, so a spawn failure (bad binary, PATH miss) is never left\n // as an unhandled 'error' on the child — which would throw and\n // crash the whole daemon process. See the matching guard + incident\n // note in `define-agent-cli.ts`'s ACP spawn.\n let spawnFailure: Error | undefined\n await new Promise<void>(resolve => {\n child.once(\"spawn\", () => resolve())\n child.once(\"error\", err => {\n spawnFailure = err\n resolve()\n })\n })\n if (spawnFailure) {\n activeChild = null\n yield {\n kind: \"error\",\n error: { message: `failed to spawn '${execBin} ${execArgs.join(\" \")}': ${spawnFailure.message}` },\n }\n return\n }\n\n const stderrLines: string[] = []\n const STDERR_KEEP = 80\n child.stderr?.setEncoding(\"utf8\")\n child.stderr?.on(\"data\", (chunk: string) => {\n for (const line of chunk.split(/\\r?\\n/)) {\n if (!line) continue\n stderrLines.push(line)\n if (stderrLines.length > STDERR_KEEP) stderrLines.shift()\n }\n })\n\n try {\n if (!child.stdout)\n throw new Error(\"print-arm: child has no stdout pipe\")\n\n let capturedSessionId = \"\"\n const mastraState =\n eventSchema === \"mastra-jsonl\"\n ? createMastraMapperState()\n : undefined\n const jcodeState =\n eventSchema === \"jcode-ndjson\"\n ? createJcodeMapperState()\n : undefined\n\n // ── Decouple pipe draining from downstream consumption ────────\n // A `for await (const line of rl)` loop backpressures onto\n // `child.stdout`: when the loop suspends at a slow downstream\n // consumer (e.g. an SSE write to the orchestrator client that has\n // stopped reading), readline pauses the stream, the child's stdout\n // OS pipe buffer fills, and the child's next `write()` fails with\n // `ENOBUFS` and the process dies. High-volume producers (kimi via\n // mastracode: 900+ tool results / 1200+ lines) hit this reliably.\n //\n // Instead, readline's `\"line\"` event (flowing mode) drains the\n // pipe CONTINUOUSLY — parsing and mapping each line the instant it\n // arrives — and pushes mapped events into an in-memory queue. The\n // generator below yields from that queue at whatever pace\n // downstream consumes. The child therefore never observes\n // backpressure from a slow client.\n const rl = createInterface({ input: child.stdout, crlfDelay: Infinity })\n const queue = new EventQueue()\n let modelMismatchAborted = false\n\n rl.on(\"line\", (line: string) => {\n if (!line.trim()) return\n if (modelMismatchAborted) return\n let evt: Record<string, unknown>\n try {\n evt = JSON.parse(line) as Record<string, unknown>\n } catch {\n return\n }\n\n // Derived-from-model guard (see PrintArmOptions.expectedModel):\n // the jcode-ndjson `start` line truthfully names the model the\n // agent actually chose — if that contradicts the explicitly\n // requested one, the CLI silently fell back to its own default.\n // Abort the turn NOW, before the model call completes, instead\n // of running (and billing) a model the operator didn't name.\n if (\n opts.expectedModel &&\n eventSchema === \"jcode-ndjson\" &&\n evt.type === \"start\" &&\n typeof evt.model === \"string\" &&\n printModelMismatch(opts.expectedModel, evt.model)\n ) {\n modelMismatchAborted = true\n const provider =\n typeof evt.provider === \"string\" ? ` (provider ${evt.provider})` : \"\"\n queue.push({\n kind: \"error\",\n error: {\n message:\n `model mismatch: requested \"${opts.expectedModel}\" but the agent ` +\n `started on \"${evt.model}\"${provider} — its CLI silently fell back ` +\n `to a default it resolved itself. This adapter routes AND bills by ` +\n `the model id, so the turn was aborted instead of silently running ` +\n `(and billing) a model you didn't ask for. Check the id against ` +\n `the adapter's model menu.`,\n },\n })\n queue.end()\n child.kill(\"SIGTERM\")\n return\n }\n\n // Capture the session/thread id from the wire event\n const csid = captureSessionId(evt, eventSchema)\n if (csid) capturedSessionId = csid\n\n const sid = capturedSessionId || sessionId || \"\"\n const mapped = mapEvent(evt, sid, stderrLines, eventSchema, mastraState, jcodeState)\n // A single wire line can fan out to several StreamEvents — e.g. an\n // Antigravity tool step carries both the call and its result, and its\n // terminal `result` line carries usage + turn-end together.\n if (Array.isArray(mapped)) {\n for (const m of mapped) queue.push(m)\n } else if (mapped) {\n queue.push(mapped)\n }\n })\n rl.once(\"close\", () => queue.end())\n\n // Yield mapped events as downstream pulls them; the `\"line\"`\n // handler above keeps draining the pipe regardless of how far\n // behind this loop is.\n for await (const mapped of queue) {\n yield mapped\n }\n\n const exitCode = await waitForExit(child)\n if (capturedSessionId) sessionId = capturedSessionId\n\n if (exitCode !== 0 && exitCode !== null) {\n const binLabel =\n eventSchema === \"mastra-jsonl\"\n ? \"mastracode\"\n : eventSchema === \"antigravity-stream-json\"\n ? \"agy\"\n : eventSchema === \"jcode-ndjson\"\n ? \"jcode\"\n : \"claude\"\n const errEvt: StreamEvent = {\n kind: \"error\",\n error: {\n message: `${binLabel} exited with code ${exitCode}`,\n ...(stderrLines.length\n ? { data: { stderr: stderrLines.join(\"\\n\") } }\n : {}),\n },\n }\n yield errEvt\n }\n } finally {\n activeChild = null\n }\n },\n\n async cancel(): Promise<void> {\n activeChild?.kill(\"SIGTERM\")\n },\n\n // The print arm spawns a fresh subprocess PER TURN from `baseArgs`,\n // which already has the model baked in (composed once, before this\n // session object was even constructed — see `bin_args_template`\n // handling in define-agent-cli.ts/compose.ts). There is no live\n // connection to apply a mid-session config change to, and rebuilding\n // `baseArgs` would mean a fresh session, not a live switch — so this\n // is honestly `requires-restart`, same as the `arg` model-apply\n // strategy for ACP arms.\n async setModel(): Promise<{ applied: false; reason: string }> {\n return { applied: false, reason: \"requires-restart\" }\n },\n\n // No ACP session — no wrapper-advertised capability read-surface and\n // no `session/set_mode` RPC to switch live. Mirrors the \"arm has no\n // mid-session config surface\" case `define-agent-cli.ts` reports for\n // `setModel` on other arms.\n availableConfigOptions: [],\n availableModes: [],\n currentModeId: undefined,\n async setSessionMode(): Promise<{ applied: false; reason: string }> {\n return { applied: false, reason: \"not-supported\" }\n },\n\n // Same as `setSessionMode`: a print arm has no live ACP session to apply\n // `set_config_option(configId:\"effort\")` against — effort is baked into\n // the spawn argv/env, so a live change is honestly `not-supported`.\n async setEffort(): Promise<{ applied: false; reason: string }> {\n return { applied: false, reason: \"not-supported\" }\n },\n\n async close(): Promise<void> {\n // Whole tree — the print CLI's own subprocesses (MCP servers, tools)\n // must not outlive the session. Restore runs regardless.\n const closing = activeChild ? terminateChildTree(activeChild) : undefined\n mcpRestore?.()\n await closing\n },\n }\n}\n\n// ── MCP config file injection (mastracode print arm) ────────────────\n\n/**\n * Before the first turn's spawn, shallow-merges our injected MCP servers\n * into `<cwd>/.mastracode/mcp.json` (the highest-precedence project-scope\n * config mastracode loads). Returns a restore function that reverts the\n * file to its pre-session state on `close()`, or `undefined` if no\n * injection was performed.\n *\n * Only activates when `eventSchema === \"mastra-jsonl\"` (mastracode) AND\n * `opts.mcpServers` is non-empty. Other print adapters (Claude Code)\n * don't read this path and are left untouched.\n *\n * Our injected servers win on key collision — this matches mastracode's\n * own \"higher precedence overrides lower, by server name\" merge\n * semantics, and the SDK's documented \"merged with, and overriding,\n * file-based configs\" behavior for the in-process arm, so both arms\n * behave consistently.\n *\n * KNOWN LIMITATION: two concurrent mastracode print sessions sharing\n * the SAME `cwd` will race on this read-merge-write (last writer wins\n * on the shared file). This is an upstream mastracode CLI limitation —\n * no config-dir isolation exists to route around it. This is a real but\n * narrow edge case (only matters for concurrent orchestrator children\n * spawned into the identical directory); no locking mechanism is built\n * here, by design.\n */\nfunction setupMcpConfigFile(\n opts: PrintArmOptions,\n eventSchema: PrintEventSchema,\n): (() => void) | undefined {\n if (eventSchema !== \"mastra-jsonl\") {\n // A credentialed mount that reaches an arm which cannot mount it at all\n // must not fail silently: the caller believes the server will see the\n // Authorization header, the server instead sees an anonymous caller.\n // Warn with the mount names so the loss is attributable (the mcpServers\n // feature itself is mastra-jsonl-only — see the doc block above).\n const credentialed = (opts.mcpServers ?? [])\n .filter(s => s.transport !== \"stdio\" && s.headers !== undefined && Object.keys(s.headers).length > 0)\n .map(s => s.name)\n if (credentialed.length > 0) {\n console.error(\n `[agentproto] WARNING: mcpServers ${credentialed.map(n => `\"${n}\"`).join(\", \")} declare ` +\n `headers but the \"${eventSchema}\" print adapter has no MCP mounting path — ` +\n \"the mounts (and their credentials) will NOT reach the agent.\",\n )\n }\n return undefined\n }\n if (!opts.mcpServers || opts.mcpServers.length === 0) return undefined\n\n const dir = join(opts.cwd, \".mastracode\")\n const file = join(dir, \"mcp.json\")\n const injected = toFileBasedMcpServers(opts.mcpServers)\n if (!injected) return undefined\n\n // Snapshot the pre-session state so close() can restore it.\n const fileExisted = existsSync(file)\n let originalContent: string | undefined\n if (fileExisted) {\n try {\n originalContent = readFileSync(file, \"utf8\")\n } catch {\n originalContent = undefined\n }\n }\n const dirExisted = existsSync(dir)\n\n // Ensure `.mastracode/` exists, then read-merge-write.\n if (!dirExisted) {\n mkdirSync(dir, { recursive: true })\n }\n\n let existingServers: Record<string, unknown> = {}\n if (originalContent !== undefined) {\n try {\n const parsed = JSON.parse(originalContent) as Record<string, unknown>\n if (parsed && typeof parsed.mcpServers === \"object\" && parsed.mcpServers !== null) {\n existingServers = parsed.mcpServers as Record<string, unknown>\n }\n } catch {\n // Corrupt or unparseable file — start fresh with just our servers.\n existingServers = {}\n }\n }\n\n // Shallow-merge: our injected servers override on key collision.\n const merged: Record<string, unknown> = { ...existingServers, ...injected }\n const output = JSON.stringify({ mcpServers: merged }, null, 2)\n writeFileSync(file, output, \"utf8\")\n\n // Return the restore function.\n return () => {\n try {\n if (!fileExisted) {\n // We created the file — remove it. Also remove the `.mastracode/`\n // dir only if we created that too AND it's now empty (don't\n // rm -rf someone's existing directory).\n rmSync(file, { force: true })\n if (!dirExisted) {\n try {\n // `rmdirSync` (not `rmSync`) — only removes an EMPTY\n // directory, throwing ENOTEMPTY otherwise. `rmSync` without\n // `recursive: true` throws on any directory regardless of\n // contents, which would always land in the catch below and\n // silently leave the directory behind even when empty.\n rmdirSync(dir)\n } catch {\n // Directory not empty (other files were added) — leave it.\n }\n }\n } else if (originalContent !== undefined) {\n // File existed before — restore its original content, but first\n // remove only our injected keys from the merged object so any\n // concurrent changes (if the file was modified externally) are\n // preserved minus our entries. If that produces an empty\n // mcpServers map, restore the original file verbatim.\n let current: Record<string, unknown> = {}\n try {\n const parsed = JSON.parse(readFileSync(file, \"utf8\")) as Record<string, unknown>\n if (parsed && typeof parsed.mcpServers === \"object\" && parsed.mcpServers !== null) {\n current = parsed.mcpServers as Record<string, unknown>\n }\n } catch {\n // Can't read current state — restore original verbatim.\n writeFileSync(file, originalContent, \"utf8\")\n return\n }\n for (const key of Object.keys(injected)) {\n delete current[key]\n }\n if (Object.keys(current).length === 0) {\n // All servers were ours — restore original file content.\n writeFileSync(file, originalContent, \"utf8\")\n } else {\n writeFileSync(file, JSON.stringify({ mcpServers: current }, null, 2), \"utf8\")\n }\n }\n } catch {\n // Best-effort — never throw from close().\n }\n }\n}\n\n// ── Prompt extraction ───────────────────────────────────────────────\n\n/** Print-mode CLIs (mastracode, antigravity, jcode, …) declare\n * `capabilities.multimodal: false` — this arm spawns a fresh subprocess\n * per turn and hands it ONE plain-text argv value, with no wire-level\n * content-block channel for an image/resource block to ride on. A\n * non-text block therefore has nowhere to go: silently dropping it (the\n * previous behavior — filtering an array down to just its text blocks)\n * would send an incomplete prompt with no indication anything was lost.\n * Throwing here instead surfaces a clear `[turn error]` in the session's\n * event stream (same convention as an ACP adapter rejecting content its\n * own `promptCapabilities` doesn't advertise) — the caller should upload\n * the file via `POST /files/upload` and reference its path in the prompt\n * text instead, which this adapter reads natively (see its `file_attach`\n * capability). */\nfunction extractPromptText(message: unknown): string {\n if (typeof message === \"string\") return message\n const blocks = Array.isArray(message) ? message : [message]\n const texts: string[] = []\n for (const block of blocks) {\n if (block !== null && typeof block === \"object\") {\n const b = block as Record<string, unknown>\n if (b.type === \"text\" && typeof b.text === \"string\") {\n texts.push(b.text)\n continue\n }\n if (b.type === undefined && typeof b.text === \"string\") {\n // Not an ACP-shaped block at all — a caller-supplied `{text: \"...\"}`\n // convenience shape rather than `{type:\"text\", text:\"...\"}`.\n texts.push(b.text)\n continue\n }\n }\n const kind =\n block !== null && typeof block === \"object\" && typeof (block as Record<string, unknown>).type === \"string\"\n ? ((block as Record<string, unknown>).type as string)\n : typeof block\n throw new Error(\n `this adapter has no multimodal input (capabilities.multimodal: false) — got a ` +\n `\"${kind}\" content block it can't send. Upload the file via POST /files/upload ` +\n `and reference its path in the prompt text instead.`\n )\n }\n return texts.join(\"\\n\")\n}\n\n// ── Session id capture per event schema ─────────────────────────────\n\nfunction captureSessionId(\n evt: Record<string, unknown>,\n schema: PrintEventSchema,\n): string | null {\n switch (schema) {\n case \"claude-stream-json\":\n if (\n evt.type === \"result\" &&\n typeof evt.session_id === \"string\" &&\n evt.session_id\n )\n return evt.session_id\n return null\n case \"antigravity-stream-json\": {\n // `agy` stamps `conversation_id` on every line, but at two different\n // levels: top-level on the opening `init` event, and nested in the\n // payload on `result`. Capture it from the `init` (available before\n // the turn produces any text — so a mid-turn crash still resumes) and\n // re-confirm it from the authoritative terminal `result`. A pre-flight\n // failure (e.g. unknown --model) emits `result` with an empty\n // conversation_id; the `&& id` guard drops that so we never clobber a\n // good id with \"\". Verified against antigravity.google/docs/cli/headless.\n if (evt.event === \"init\" && typeof evt.conversation_id === \"string\" && evt.conversation_id)\n return evt.conversation_id\n if (evt.event === \"result\") {\n const r = evt.result as Record<string, unknown> | undefined\n if (typeof r?.conversation_id === \"string\" && r.conversation_id)\n return r.conversation_id\n }\n return null\n }\n case \"mastra-jsonl\":\n // Mastra Code writes exactly one authoritative final line per run\n // regardless of success/failure path: { type: \"result\", threadId,\n // text, finishReason, exitCode, ... }. Reading it here (rather than\n // the incidental om_status event, which only fires when\n // Observational Memory is enabled) guarantees the thread id is\n // captured on every turn.\n if (\n evt.type === \"result\" &&\n typeof evt.threadId === \"string\" &&\n evt.threadId\n )\n return evt.threadId\n return null\n case \"jcode-ndjson\":\n // jcode stamps `session_id` on the opening `start` line (available\n // before any text — so a mid-turn crash still resumes) and again on\n // the terminal `done` line, which re-confirms it.\n if (\n (evt.type === \"start\" || evt.type === \"done\") &&\n typeof evt.session_id === \"string\" &&\n evt.session_id\n )\n return evt.session_id\n return null\n }\n}\n\n// ── Event mapping ───────────────────────────────────────────────────\n\nfunction mapEvent(\n evt: Record<string, unknown>,\n sessionId: string,\n stderrLines: string[],\n schema: PrintEventSchema,\n mastraState?: MastraMapperState,\n jcodeState?: JcodeMapperState,\n): StreamEvent | StreamEvent[] | null {\n switch (schema) {\n case \"claude-stream-json\":\n return mapClaudeEvent(evt, sessionId, stderrLines)\n case \"antigravity-stream-json\":\n return mapAntigravityEvent(evt, sessionId, stderrLines)\n case \"mastra-jsonl\": {\n if (!mastraState) {\n // Should never happen — mastra-jsonl schema always creates state\n return mapClaudeEvent(evt, sessionId, stderrLines)\n }\n return mapMastraEvent(evt, sessionId, stderrLines, mastraState)\n }\n case \"jcode-ndjson\":\n return mapJcodeEvent(evt, sessionId, jcodeState ?? createJcodeMapperState())\n default:\n return mapClaudeEvent(evt, sessionId, stderrLines)\n }\n}\n\n// ── Claude Code stream-json mapper ──────────────────────────────────\n\nfunction mapClaudeEvent(\n evt: Record<string, unknown>,\n sessionId: string,\n stderrLines: string[],\n): StreamEvent | null {\n switch (evt.type) {\n case \"text\":\n return typeof evt.text === \"string\"\n ? { kind: \"text-delta\", sessionId, text: evt.text }\n : null\n\n case \"thinking\":\n return typeof evt.thinking === \"string\"\n ? { kind: \"thought\", sessionId, text: evt.thinking }\n : null\n\n case \"tool_use\":\n return {\n kind: \"tool-call\",\n sessionId,\n toolCallId: typeof evt.id === \"string\" ? evt.id : \"\",\n toolName: typeof evt.name === \"string\" ? evt.name : \"?\",\n arguments: evt.input ?? {},\n }\n\n case \"tool_result\":\n return {\n kind: \"tool-result\",\n sessionId,\n toolCallId:\n typeof evt.tool_use_id === \"string\" ? evt.tool_use_id : \"\",\n result: evt.content ?? null,\n isError: evt.is_error === true,\n }\n\n case \"result\":\n if (\n evt.subtype === \"error_during_execution\" ||\n evt.is_error === true\n ) {\n return {\n kind: \"error\",\n sessionId,\n error: {\n message:\n typeof evt.error === \"string\"\n ? evt.error\n : \"Unknown error\",\n ...(stderrLines.length\n ? { data: { stderr: stderrLines.join(\"\\n\") } }\n : {}),\n },\n }\n }\n if (evt.subtype === \"success\") {\n return { kind: \"turn-end\", sessionId, reason: \"completed\" }\n }\n return null\n\n case \"system\":\n case \"assistant\":\n return null\n\n default:\n return null\n }\n}\n\n// ── Google Antigravity stream-json mapper ──────────────────────────\n\n/**\n * Maps a single Google Antigravity (`agy --output-format stream-json`)\n * NDJSON line to this repo's {@link StreamEvent} taxonomy.\n *\n * The wire shape was verified against antigravity.google/docs/cli/headless.\n * Despite `agy` mirroring Claude Code's headless FLAGS (`-p`,\n * `--output-format stream-json`, `--continue`), its EVENTS are a different\n * taxonomy discriminated by an `event` field, not Claude's `type`:\n *\n * {\"event\":\"init\",\"conversation_id\":\"…\",\"init\":{cwd,tools,permission_mode,…}}\n * {\"event\":\"step_update\",\"step_update\":{conversation_id,step_index,state,\n * step_type,text_delta?,tool_name?,tool_info?,usage?,…}}\n * {\"event\":\"result\",\"result\":{conversation_id,status,response,error?,usage,…}}\n *\n * - Text streams as INCREMENTAL `step_update.text_delta` fragments on\n * `agent_response` steps (the docs' own `jq -j … .text_delta` recipe\n * concatenates them, so fragments never overlap — emit each verbatim, no\n * accumulation state needed, unlike the Mastra mapper).\n * - A `tool` step's terminal `DONE` carries the call AND its result in one\n * `tool_info` ({name, parameters, output, error?}). `agy` assigns no tool\n * call id, so we synthesize one from `step_index` to correlate the pair.\n * Returning a two-element array fans that single line out to a `tool-call`\n * + `tool-result` (the print-arm line handler flattens arrays).\n * - The terminal `result` carries the run's total `usage` and its `status`;\n * we emit a `usage_update` then the terminal `turn-end`/`error`.\n */\nfunction mapAntigravityEvent(\n evt: Record<string, unknown>,\n sessionId: string,\n stderrLines: string[],\n): StreamEvent | StreamEvent[] | null {\n switch (evt.event) {\n case \"step_update\": {\n const su = evt.step_update as Record<string, unknown> | undefined\n if (!su) return null\n const stepType = su.step_type\n\n // Incremental assistant text.\n if (\n stepType === \"agent_response\" &&\n typeof su.text_delta === \"string\" &&\n su.text_delta\n ) {\n return { kind: \"text-delta\", sessionId, text: su.text_delta }\n }\n\n // A completed tool step carries the call and its result together.\n // Emit the pair only on DONE; a preceding ACTIVE tool step (if any)\n // is skipped so the call isn't announced twice.\n if (stepType === \"tool\" && su.state === \"DONE\") {\n const ti = su.tool_info as Record<string, unknown> | undefined\n const toolName =\n typeof su.tool_name === \"string\" && su.tool_name\n ? su.tool_name\n : typeof ti?.name === \"string\" && ti.name\n ? (ti.name as string)\n : \"?\"\n const toolCallId =\n typeof su.step_index === \"number\" ? `step-${su.step_index}` : \"\"\n const err = ti?.error as Record<string, unknown> | undefined\n const call: StreamEvent = {\n kind: \"tool-call\",\n sessionId,\n toolCallId,\n toolName,\n arguments: ti?.parameters ?? {},\n }\n const result: StreamEvent = {\n kind: \"tool-result\",\n sessionId,\n toolCallId,\n result: err\n ? typeof err.message === \"string\"\n ? err.message\n : err\n : (ti?.output ?? null),\n isError: !!err,\n }\n return [call, result]\n }\n\n // user_input / checkpoint / subagent steps carry no host-facing\n // StreamEvent — skip them (subagents are surfaced by their own run).\n return null\n }\n\n case \"result\": {\n const r = evt.result as Record<string, unknown> | undefined\n if (!r) return null\n const status = typeof r.status === \"string\" ? r.status : \"\"\n const out: StreamEvent[] = []\n\n const usage = mapAntigravityUsage(r.usage, sessionId)\n if (usage) out.push(usage)\n\n if (status === \"ERROR\" || status === \"INVALID\") {\n out.push({\n kind: \"error\",\n sessionId,\n error: {\n message:\n typeof r.error === \"string\" && r.error\n ? r.error\n : `agy run ended with status ${status || \"ERROR\"}`,\n ...(stderrLines.length\n ? { data: { stderr: stderrLines.join(\"\\n\") } }\n : {}),\n },\n })\n } else {\n out.push({\n kind: \"turn-end\",\n sessionId,\n reason: mapAntigravityStatus(status),\n })\n }\n return out.length ? out : null\n }\n\n // init and any unknown event carry no host-facing StreamEvent.\n default:\n return null\n }\n}\n\n/**\n * Normalize `agy` terminal `result.status` to a StreamEvent turn-end reason.\n * ERROR / INVALID are handled as `error` events upstream, so only the\n * non-error terminal statuses land here.\n */\nfunction mapAntigravityStatus(\n raw: string,\n): \"completed\" | \"cancelled\" | \"max_turns\" | \"error\" {\n switch (raw) {\n case \"CANCELED\":\n case \"INTERRUPTED\":\n return \"cancelled\"\n // SUCCESS, WAITING, RUNNING (or anything else non-error): the turn ended.\n default:\n return \"completed\"\n }\n}\n\n/**\n * Map `agy`'s `result.usage` ({input_tokens, output_tokens, thinking_tokens,\n * cache_read_tokens, total_tokens}) to a `usage_update` StreamEvent. `agy`\n * reports no context-window size/used or per-turn cost here, so those stay 0\n * / absent (the daemon's projector guards on >0 and never clobbers a real\n * size). Returns null when no token counts are present.\n */\nfunction mapAntigravityUsage(\n usage: unknown,\n sessionId: string,\n): StreamEvent | null {\n if (usage === null || typeof usage !== \"object\") return null\n const u = usage as Record<string, unknown>\n const tokensIn = typeof u.input_tokens === \"number\" ? u.input_tokens : undefined\n const tokensOut =\n typeof u.output_tokens === \"number\" ? u.output_tokens : undefined\n if (tokensIn === undefined && tokensOut === undefined) return null\n return {\n kind: \"usage_update\",\n sessionId,\n size: 0,\n used: 0,\n ...(tokensIn !== undefined ? { tokensIn } : {}),\n ...(tokensOut !== undefined ? { tokensOut } : {}),\n }\n}\n\n// ── jcode NDJSON mapper ─────────────────────────────────────────────\n\n/**\n * Mutable per-stream state for the jcode NDJSON mapper. Tool arguments\n * arrive as JSON-string `tool_input` deltas between `tool_start` and\n * `tool_exec`, so the pending call accumulates here until complete.\n */\nexport interface JcodeMapperState {\n pending?: { id: string; name: string; input: string }\n}\n\nexport function createJcodeMapperState(): JcodeMapperState {\n return {}\n}\n\n/**\n * Maps a single `jcode run --ndjson` line to this repo's\n * {@link StreamEvent} taxonomy. Wire shape verified against a live\n * `jcode run --ndjson` (2026-08-14):\n *\n * {type:\"start\", session_id, model, provider} → session capture\n * {type:\"status_detail\"|\"connection_phase\"|\n * \"connection_type\"|\"message_end\", …} → dropped (noise)\n * {type:\"text_delta\", text} → text-delta\n * {type:\"tool_start\", id, name} → open pending call\n * {type:\"tool_input\", delta} → accumulate args\n * {type:\"tool_exec\", id, name} → tool-call\n * {type:\"tool_done\", id, name, output, error} → tool-result\n * {type:\"tokens\", input, output, cache_read_input, …} → usage_update\n * {type:\"done\", text, session_id, usage} → turn-end\n *\n * `tokens` fires once per upstream API call (a tool round-trip produces\n * several), so usage arrives as successive updates, not one total.\n */\nexport function mapJcodeEvent(\n evt: Record<string, unknown>,\n sessionId: string,\n state: JcodeMapperState,\n): StreamEvent | StreamEvent[] | null {\n switch (evt.type) {\n case \"text_delta\":\n return typeof evt.text === \"string\"\n ? { kind: \"text-delta\", sessionId, text: evt.text }\n : null\n\n case \"tool_start\":\n state.pending = {\n id: typeof evt.id === \"string\" ? evt.id : \"\",\n name: typeof evt.name === \"string\" ? evt.name : \"?\",\n input: \"\",\n }\n return null\n\n case \"tool_input\":\n if (state.pending && typeof evt.delta === \"string\")\n state.pending.input += evt.delta\n return null\n\n case \"tool_exec\":\n return flushPendingJcodeCall(state, sessionId)\n\n case \"tool_done\": {\n // Defensive: if `tool_exec` never arrived, flush the call here so\n // the result is never orphaned from its call.\n const call = flushPendingJcodeCall(state, sessionId)\n const result: StreamEvent = {\n kind: \"tool-result\",\n sessionId,\n toolCallId: typeof evt.id === \"string\" ? evt.id : \"\",\n result: evt.output ?? null,\n isError: evt.error !== null && evt.error !== undefined,\n }\n return call ? [call, result] : result\n }\n\n case \"tokens\": {\n const tokensIn = typeof evt.input === \"number\" ? evt.input : undefined\n const tokensOut = typeof evt.output === \"number\" ? evt.output : undefined\n if (tokensIn === undefined && tokensOut === undefined) return null\n // jcode reports no context-window size/used here, so those stay 0\n // (the daemon's projector guards on >0 and never clobbers a real\n // size) — same contract as the antigravity usage mapper.\n return {\n kind: \"usage_update\",\n sessionId,\n size: 0,\n used: 0,\n ...(tokensIn !== undefined ? { tokensIn } : {}),\n ...(tokensOut !== undefined ? { tokensOut } : {}),\n }\n }\n\n case \"done\":\n return { kind: \"turn-end\", sessionId, reason: \"completed\" }\n\n default:\n return null\n }\n}\n\nfunction flushPendingJcodeCall(\n state: JcodeMapperState,\n sessionId: string,\n): StreamEvent | null {\n const pending = state.pending\n state.pending = undefined\n if (!pending) return null\n let args: unknown\n try {\n args = JSON.parse(pending.input)\n } catch {\n args = { raw: pending.input }\n }\n return {\n kind: \"tool-call\",\n sessionId,\n toolCallId: pending.id,\n toolName: pending.name,\n arguments: args,\n }\n}\n\n// ── Mastra Code JSONL mapper ────────────────────────────────────────\n\n/**\n * Mutable per-stream state for the Mastra Code event mapper.\n * Mastra Code sends the FULL accumulated text on each `message_update`,\n * so we track the previous length to emit only the new portion.\n *\n * Exported so other Mastra Code protocol arms (e.g. the in-process\n * `proprietary` arm in `@agentproto/adapter-mastracode-inprocess`) can\n * reuse the same event mapper instead of reimplementing it — the wire\n * shape here is `AgentControllerEvent` regardless of whether it arrived\n * over a JSONL subprocess pipe or as a live in-process object.\n */\nexport interface MastraMapperState {\n lastTextLength: number\n}\n\nexport function createMastraMapperState(): MastraMapperState {\n return { lastTextLength: 0 }\n}\n\n/**\n * Extract text from Mastra Code content blocks.\n * Blocks are normally a `{ type: \"text\", text: \"...\" }` array directly on\n * `message.content`, but newer Mastra Code builds wrap them in an object —\n * `{ format: 2, parts: [...] }` — so unwrap that shape to the blocks array\n * first.\n */\nfunction extractTextFromBlocks(\n content: unknown,\n): string {\n let blocks = content\n if (\n blocks !== null &&\n typeof blocks === \"object\" &&\n !Array.isArray(blocks) &&\n Array.isArray((blocks as Record<string, unknown>).parts)\n ) {\n blocks = (blocks as Record<string, unknown>).parts\n }\n if (!Array.isArray(blocks)) return \"\"\n return (blocks as Array<Record<string, unknown>>)\n .filter(c => c.type === \"text\" && typeof c.text === \"string\")\n .map(c => c.text as string)\n .join(\"\")\n}\n\n/**\n * Maps a single Mastra Code `AgentControllerEvent` (already a plain\n * object — JSON-parsed from a subprocess line, or handed over directly\n * by an in-process arm) to this repo's {@link StreamEvent} taxonomy.\n * `stderrLines` enriches `error` events for arms that have a real\n * subprocess to report on; pass `[]` when there is none (e.g. the\n * in-process arm).\n */\nexport function mapMastraEvent(\n evt: Record<string, unknown>,\n sessionId: string,\n stderrLines: string[],\n state: MastraMapperState,\n): StreamEvent | null {\n switch (evt.type) {\n // ── Text streaming ──────────────────────────────────────────\n case \"message_update\": {\n const content = (evt.message as Record<string, unknown>)?.content\n const fullText = extractTextFromBlocks(content)\n if (fullText.length > state.lastTextLength) {\n const delta = fullText.slice(state.lastTextLength)\n state.lastTextLength = fullText.length\n return delta ? { kind: \"text-delta\", sessionId, text: delta } : null\n }\n return null\n }\n\n case \"message_end\": {\n const msg = evt.message as Record<string, unknown> | undefined\n if (msg?.role !== \"assistant\") return null\n const fullText = extractTextFromBlocks(msg?.content)\n // Emit any remaining text not covered by message_update deltas\n if (fullText.length > state.lastTextLength) {\n const delta = fullText.slice(state.lastTextLength)\n state.lastTextLength = fullText.length\n return delta ? { kind: \"text-delta\", sessionId, text: delta } : null\n }\n return null\n }\n\n // ── Tool calls ──────────────────────────────────────────────\n case \"tool_start\":\n return {\n kind: \"tool-call\",\n sessionId,\n toolCallId:\n typeof evt.toolCallId === \"string\" ? evt.toolCallId : \"\",\n toolName:\n typeof evt.toolName === \"string\" ? evt.toolName : \"?\",\n // Mastra's controller event carries the tool call payload under\n // `args`, not `input` (that's the Claude Code stream-json field\n // name used by the sibling mapClaudeEvent tool_use case below).\n arguments: evt.args ?? {},\n }\n\n case \"tool_end\":\n return {\n kind: \"tool-result\",\n sessionId,\n toolCallId:\n typeof evt.toolCallId === \"string\" ? evt.toolCallId : \"\",\n result: evt.result ?? null,\n isError: evt.isError === true,\n }\n\n // ── Turn end ────────────────────────────────────────────────\n case \"agent_end\": {\n const rawReason =\n typeof evt.reason === \"string\"\n ? evt.reason\n : \"complete\"\n const reason = mapMastraFinishReason(rawReason)\n return { kind: \"turn-end\", sessionId, reason }\n }\n\n // ── Final result line ────────────────────────────────────────\n // Always written last, once, whether or not `agent_end` fired —\n // pre-flight failures (bad model, unresolvable thread, missing API\n // key) call straight into this without ever streaming an\n // `agent_end` or `error` event. `turn-end` already came from\n // `agent_end` on the success path, so this only needs to surface\n // an error for the pre-flight-failure path.\n case \"result\": {\n const err = evt.error as Record<string, unknown> | undefined\n if (!err) return null\n return {\n kind: \"error\",\n sessionId,\n error: {\n message:\n typeof err.message === \"string\" ? err.message : \"Unknown error\",\n ...(stderrLines.length\n ? { data: { stderr: stderrLines.join(\"\\n\") } }\n : {}),\n },\n }\n }\n\n // ── Errors ─────────────────────────────────────────────────\n case \"error\": {\n const err = evt.error as Record<string, unknown> | undefined\n return {\n kind: \"error\",\n sessionId,\n error: {\n message:\n typeof err?.message === \"string\"\n ? err.message\n : \"Unknown error\",\n ...(stderrLines.length\n ? { data: { stderr: stderrLines.join(\"\\n\") } }\n : {}),\n },\n }\n }\n\n // ── Token usage ─────────────────────────────────────────────\n // Mastra Code DOES expose usage: its `AgentController` emits a native\n // `usage_update` event ({ type: \"usage_update\", usage: TokenUsage })\n // on every model step-finish — verified against @mastra/core 1.48.0's\n // AgentControllerEvent union and its emit site\n // (`this.#session.emit({ type: \"usage_update\", usage: stepUsage })`).\n // `TokenUsage` carries `{ promptTokens, completionTokens, totalTokens }`.\n // Map it to this repo's `usage_update` StreamEvent (the SAME shape\n // claude-code emits over ACP) so mastracode sessions — both the print\n // arm and the in-process arm, which share this mapper — carry token\n // telemetry in the transcript. mastracode reports these cumulatively\n // (its own headless `runMC` result-usage is last-write-wins over these\n // events), and last-write-wins on the descriptor matches that. It\n // carries no context-window size/used or per-turn cost here, so those\n // stay 0 / absent (projectEvent guards on >0, never clobbering a real\n // size).\n case \"usage_update\": {\n const usage = evt.usage as Record<string, unknown> | undefined\n const promptTokens =\n typeof usage?.promptTokens === \"number\" ? usage.promptTokens : undefined\n const completionTokens =\n typeof usage?.completionTokens === \"number\"\n ? usage.completionTokens\n : undefined\n if (promptTokens === undefined && completionTokens === undefined)\n return null\n return {\n kind: \"usage_update\",\n sessionId,\n size: 0,\n used: 0,\n ...(promptTokens !== undefined ? { tokensIn: promptTokens } : {}),\n ...(completionTokens !== undefined\n ? { tokensOut: completionTokens }\n : {}),\n }\n }\n\n // ── Shell output (tool-like) ────────────────────────────────\n case \"shell_output\":\n return typeof evt.output === \"string\"\n ? {\n kind: \"tool-result\",\n sessionId,\n toolCallId: \"\",\n result: evt.output,\n isError: false,\n }\n : null\n\n // ── Skipped events ─────────────────────────────────────────\n case \"agent_start\":\n case \"subagent_start\":\n case \"subagent_end\":\n case \"tool_approval_required\":\n case \"tool_suspended\":\n return null\n\n default:\n return null\n }\n}\n\n// ── Decoupling queue ────────────────────────────────────────────────\n\n/**\n * High-water mark (in buffered events) at which {@link EventQueue} logs a\n * single warning. This does NOT cap the buffer or drop events: the whole\n * point of this queue is to keep draining `child.stdout` so the subprocess\n * never hits `ENOBUFS`, and dropping mapped events would corrupt the\n * transcript / ring buffer this feeds. The mark exists purely to make a\n * genuinely stuck downstream consumer (one that has stopped pulling for an\n * extended period, letting the buffer grow toward a memory problem)\n * observable to operators instead of failing silently.\n *\n * Sized well above the worst incident seen in the wild (a mastracode run\n * emitting ~1200 lines / ~900 tool results): a transient burst is absorbed\n * without noise, while a persistently slow client trips the warning.\n */\nconst QUEUE_HIGH_WATER_MARK = 10_000\n\n/**\n * A bounded-signal async FIFO that decouples a fast push-side producer\n * (readline draining a subprocess pipe) from a slow pull-side consumer\n * (the daemon's event projector → transcript + ring buffer + SSE stream).\n *\n * `push()` never blocks and never rejects — the producer keeps draining\n * the OS pipe so the child never backpressures into `ENOBUFS`. The\n * consumer drives it as an async iterable; each `next()` resolves as soon\n * as an event is available (or immediately if one is already buffered),\n * and completes once {@link end} is called and the buffer is exhausted.\n *\n * Backpressure is applied to the CONSUMER, not the producer: the iterator\n * only advances when the caller pulls. If the caller stops pulling for a\n * long time the buffer grows; crossing {@link QUEUE_HIGH_WATER_MARK} emits\n * one warning so the condition is never silent (see the constant's doc for\n * why we favour bounded-visibility growth over dropping events).\n */\nclass EventQueue implements AsyncIterable<StreamEvent> {\n private readonly buffer: StreamEvent[] = []\n private resolveNext: (() => void) | null = null\n private ended = false\n private highWaterWarned = false\n\n push(evt: StreamEvent): void {\n this.buffer.push(evt)\n if (\n this.buffer.length > QUEUE_HIGH_WATER_MARK &&\n !this.highWaterWarned\n ) {\n this.highWaterWarned = true\n console.warn(\n `print-arm: event backlog exceeded ${QUEUE_HIGH_WATER_MARK} ` +\n `buffered events — downstream consumer is not keeping up. The ` +\n `child's stdout is still being drained (no ENOBUFS), but memory ` +\n `will grow until the consumer catches up.`,\n )\n }\n // Wake a consumer parked in next().\n const resolve = this.resolveNext\n this.resolveNext = null\n resolve?.()\n }\n\n /** Signal that no further events will be pushed. */\n end(): void {\n this.ended = true\n const resolve = this.resolveNext\n this.resolveNext = null\n resolve?.()\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n for (;;) {\n const evt = this.buffer.shift()\n if (evt !== undefined) {\n yield evt\n continue\n }\n if (this.ended) return\n // Nothing buffered and not ended — park until push()/end() wakes us.\n await new Promise<void>(resolve => {\n this.resolveNext = resolve\n })\n }\n }\n}\n\n// ── Process helpers ─────────────────────────────────────────────────\n\n/**\n * Normalize Mastra Code `agent_end.finishReason` to StreamEvent turn-end reason.\n * Mastra uses: \"complete\", \"aborted\", \"error\", \"suspended\"\n * StreamEvent expects: \"completed\", \"cancelled\", \"error\", \"max_turns\"\n */\nfunction mapMastraFinishReason(\n raw: string,\n): \"completed\" | \"cancelled\" | \"max_turns\" | \"error\" {\n switch (raw) {\n case \"complete\":\n return \"completed\"\n case \"aborted\":\n case \"suspended\":\n return \"cancelled\"\n case \"error\":\n return \"error\"\n default:\n return \"completed\"\n }\n}\n\nfunction waitForExit(\n child: ReturnType<typeof spawn>,\n): Promise<number | null> {\n return new Promise(resolve => {\n child.once(\"exit\", code => resolve(code))\n child.once(\"error\", () => resolve(null))\n })\n}\n","/**\n * AIP-45 protocol arm: `protocol: \"proprietary\"`.\n *\n * Loads an NPM adapter package (named in the manifest's `adapter`\n * field) implementing `AgentCliClient`. The package translates the\n * vendor's REPL/proprietary stream into the canonical StreamEvent\n * taxonomy.\n *\n * Unlike the `acp` / `print` arms (built into this package, driving a\n * spawned subprocess), a proprietary arm may not involve a subprocess\n * at all — e.g. an in-process SDK integration. `createAgentCliRuntime`\n * skips the subprocess spawn entirely for `protocol: \"proprietary\"`\n * (see `define-agent-cli.ts`); this loader has no opinion on whether\n * the loaded package owns a child process, a socket, or nothing.\n *\n * ## Adapter package contract\n *\n * The named package's default export path (its `main`/`exports[\".\"]`)\n * must export a factory:\n *\n * export function createAgentCliClient(\n * definition: AgentCliHandle,\n * ): AgentCliClient | Promise<AgentCliClient>\n *\n * A default export function is accepted as a fallback for adapters\n * that only have one thing to export. The factory receives the full\n * manifest handle so adapter-specific config (models, capabilities,\n * metadata) is available without a second lookup — mirrors the ACP\n * arm receiving `clientInfo` derived from the manifest.\n */\n\nimport { isAbsolute } from \"node:path\"\nimport { pathToFileURL } from \"node:url\"\nimport type { AgentCliClient, AgentCliHandle } from \"../types.js\"\n\nexport interface ProprietaryProtocolOptions {\n /** NPM package name to load — from manifest.adapter. */\n adapter: string\n /** Full manifest handle, forwarded verbatim to the loaded factory. */\n definition: AgentCliHandle\n}\n\ntype AgentCliClientFactory = (\n definition: AgentCliHandle,\n) => AgentCliClient | Promise<AgentCliClient>\n\nexport async function createProprietaryProtocolArm(\n options: ProprietaryProtocolOptions,\n): Promise<AgentCliClient> {\n let mod: Record<string, unknown>\n try {\n // `withResolvedProprietaryAdapter` (packages/cli/src/registry/resolve.ts)\n // may hand us an ABSOLUTE filesystem path (adapter resolved to a real\n // .js/.cjs/.mjs file). A dynamic `import()` of such a path works on\n // POSIX (the loader resolves it against cwd) but fails on win32 with\n // `ERR_UNSUPPORTED_ESM_URL_SCHEME` / `Received protocol 'c:'` — the\n // WIN11 field test in issue #1637. Rewriting absolute paths to\n // `file://` URLs is behavior-identical on POSIX and fixes win32; a\n // bare package specifier (no absolute path) imports as-is.\n const target = isAbsolute(options.adapter)\n ? pathToFileURL(options.adapter).href\n : options.adapter\n mod = (await import(target)) as Record<string, unknown>\n } catch (err) {\n const cause = err instanceof Error ? err.message : String(err)\n throw new Error(\n `createProprietaryProtocolArm: could not load adapter package '${options.adapter}'. ` +\n `Install it with: npm i ${options.adapter}\\n cause: ${cause}`,\n )\n }\n\n const candidate =\n \"createAgentCliClient\" in mod ? mod.createAgentCliClient : mod.default\n if (typeof candidate !== \"function\") {\n throw new Error(\n `createProprietaryProtocolArm: adapter package '${options.adapter}' does not export a ` +\n `'createAgentCliClient' factory function (or a default export function). A ` +\n `protocol=\"proprietary\" adapter must export ` +\n `createAgentCliClient(definition: AgentCliHandle): AgentCliClient | Promise<AgentCliClient>.`,\n )\n }\n\n return await (candidate as AgentCliClientFactory)(options.definition)\n}\n","/**\n * Legacy AIP-45 mode-id classification — the SINGLE SOURCE for recognizing the\n * gateway (route) and permission (posture) ids that used to be declared as\n * `modes[]` entries before the SPEC §3.4a route/posture extraction.\n *\n * Those entries are now deleted from the adapter manifests: route is derived\n * from the model catalog's `@route` route-identity and posture comes from the\n * harness's own ACP mode registry (`SessionModeState.availableModes`) plus the\n * canonical-posture layer (step 2c). But a caller may STILL pass one of the old\n * ids as `config.mode` — a persisted OPERATOR.md `runtime.config.mode`, a\n * `defaults.adapters.<slug>` binding, or an in-flight request written against\n * the pre-migration manifest. Both the compose path (`composeSpawn`) and the\n * daemon-boundary shim (`@agentproto/runtime`'s `decomposeMode`) therefore need\n * to recognize the legacy vocabulary. `@agentproto/runtime` imports this module\n * rather than re-hardcoding the list, so the id→axis classification stays\n * single-sourced across the driver/runtime boundary (runtime → driver only; the\n * driver stays lean, never depending back on the runtime).\n *\n * This module classifies onto the AXIS only (`route`/`posture`/`context`); the\n * canonical-posture value mapping (`bypass-permissions` → `bypass`, …) is a\n * daemon concept and lives in `@agentproto/runtime`, keyed by\n * {@link LEGACY_POSTURE_MODE_IDS}.\n */\n\n/** Gateway-preset ids that were declared as `kind:\"route\"` modes. */\nexport const LEGACY_GATEWAY_MODE_IDS: ReadonlySet<string> = new Set([\n \"moonshot\",\n \"openrouter\",\n \"requesty\",\n \"deepseek\",\n])\n\n/**\n * Permission-profile ids that were declared as `kind:\"posture\"` modes across\n * the claude-code / codex / opencode adapters (the superset over adapters —\n * some ids are another adapter's vocabulary: codex's `full-access`, opencode's\n * `build`).\n */\nexport const LEGACY_POSTURE_MODE_IDS: ReadonlySet<string> = new Set([\n \"default\",\n \"plan\",\n \"accept-edits\",\n \"bypass-permissions\",\n \"read-only\",\n \"full-access\",\n \"build\",\n])\n\n/**\n * Classify a legacy mode id onto its orthogonal axis. Gateway ids ⇒ `\"route\"`,\n * known permission ids ⇒ `\"posture\"`, everything else ⇒ `\"context\"` — the\n * least-privilege default, so a truly-unknown id never silently grants a\n * posture or reroutes billing (SPEC R4).\n */\nexport function inferLegacyModeKind(\n modeId: string,\n): \"posture\" | \"route\" | \"context\" {\n if (LEGACY_GATEWAY_MODE_IDS.has(modeId)) return \"route\"\n if (LEGACY_POSTURE_MODE_IDS.has(modeId)) return \"posture\"\n return \"context\"\n}\n\n/**\n * True when `modeId` is a KNOWN legacy route-or-posture id that used to be a\n * `modes[]` entry but was extracted (SPEC §3.4a) — i.e. it classifies as\n * `route` or `posture`, not `context` and not a genuinely-unknown id.\n * `composeSpawn` degrades such an id to a soft no-op (no env/argv patch: route\n * now resolves from the catalog, posture from the ACP registry / canonical\n * layer) instead of throwing `unknown_mode`; a truly-unknown id — for which\n * this returns `false` — still throws.\n */\nexport function isLegacyExtractedModeId(modeId: string): boolean {\n return (\n LEGACY_GATEWAY_MODE_IDS.has(modeId) || LEGACY_POSTURE_MODE_IDS.has(modeId)\n )\n}\n","/**\n * Spawn-argument composer.\n *\n * Pure function: given an `AgentCliHandle` and a per-call\n * `RuntimeConfig`, produces the final `binArgs + env` to pass to the\n * runtime's `start()`. Validates the config against the manifest's\n * declared `modes` / `options` / `continuation.supported`; unknown ids\n * throw `RuntimeConfigError` (the host should NOT spawn — the user\n * configured something the manifest doesn't accept).\n *\n * Composition order (matches AIP-45 spec):\n * 1. Every declared `bin_args_prepend` (mode's, then each present\n * option's in declaration order) — argv that must precede a\n * subcommand baked into `bin_args` (e.g. hermes'\n * `--ignore-user-config` ahead of `acp`).\n * 2. Manifest's default `bin_args` (from `handle.bin_args`).\n * 3. Every declared `bin_args_append` / `bin_args_append_when_true`\n * / `bin_args_template` (mode's, then each present option's in\n * declaration order), then finally `models.bin_args_template`\n * when `models.apply === \"arg\"` and a model was requested — a CLI arg,\n * not an ACP session config.\n * Final argv is `[...prepend, ...bin_args, ...append]`.\n *\n * Mode is applied before options because modes are coarse profile\n * switches (claude-code's `--permission-mode`) — options refine them.\n * Within options, declaration order is honoured so adapter authors\n * can express \"this flag must come after that one\" without the host\n * needing to know the rule.\n */\n\nimport type {\n AgentCliHandle,\n AgentCliOption,\n RuntimeConfig,\n} from \"../types.js\"\nimport { isLegacyExtractedModeId } from \"../legacy-modes.js\"\n\n/**\n * Thrown when `RuntimeConfig` references manifest entries that don't\n * exist or violates a declared constraint (type / enum / bounds). The\n * `code` field lets callers map to friendly UI messages without\n * inspecting the message string.\n */\nexport class RuntimeConfigError extends Error {\n readonly code:\n | \"unknown_mode\"\n | \"unknown_option\"\n | \"option_type_mismatch\"\n | \"option_enum_violation\"\n | \"option_bounds_violation\"\n | \"unsupported_continuation\"\n | \"model_denied\"\n | \"missing_auth_credential\"\n readonly path: string\n constructor(\n code: RuntimeConfigError[\"code\"],\n path: string,\n message: string\n ) {\n super(`[${code} at ${path}] ${message}`)\n this.code = code\n this.path = path\n this.name = \"RuntimeConfigError\"\n }\n}\n\n/**\n * Resolved spawn args + env. The runtime's `start()` impl merges\n * `env` into the host process env / sandbox env before exec.\n */\nexport interface ComposedSpawn {\n binArgs: string[]\n env: Record<string, string>\n /**\n * Env keys the active mode AND active options declared for deletion\n * (AgentCliMode.env_unset / AgentCliOption.env_unset). Surfaced\n * pure-side so the runtime's `start()` — which owns the process.env\n * merge — can apply the deletions at the one point where the ambient\n * env is actually present (compose starts from `{}` and can't delete\n * what isn't there yet). Empty when nothing declares any.\n */\n envUnset: string[]\n}\n\n/**\n * Optional spawn-time hints that are outside the pure runtime config.\n * Today the only consumer is auth-aware codex model handling: the\n * composer can be told to skip `models.apply:\"arg\"` when the caller has\n * already determined that the current auth mode must preserve the CLI's\n * default model.\n */\nexport interface ComposeSpawnOptions {\n skipModelArg?: boolean\n}\n\n/**\n * Compose the final spawn args from a manifest + per-call config.\n * Pure — no I/O, no sandbox access, no global state. Safe to call\n * repeatedly with the same input.\n *\n * `config` may be undefined or an empty object — both fall back to\n * the manifest's defaults verbatim (manifest `bin_args`, no mode\n * patch, no option patches). Continuation is not applied here — the\n * `ContinuationStrategy` registry handles that — but we DO validate\n * `config.continuation` against `manifest.continuation.supported` so\n * a misconfigured operator fails fast at compose time, not at the\n * point the strategy tries to acquire a session.\n */\nexport function composeSpawn(\n handle: AgentCliHandle,\n config?: RuntimeConfig,\n opts?: ComposeSpawnOptions\n): ComposedSpawn {\n if (!config)\n return {\n binArgs: [...(handle.bin_args ?? [])],\n env: { ...(handle.env ?? {}) },\n envUnset: [],\n }\n\n const prepend: string[] = []\n const append: string[] = []\n // Always-on manifest env goes in first so a selected mode/option can\n // still override any key it also declares (mode/option intent wins).\n const env: Record<string, string> = { ...(handle.env ?? {}) }\n const envUnset: string[] = []\n\n // ── Mode patch ──────────────────────────────────────────────────\n if (config.mode !== undefined) {\n const mode = (handle.modes ?? []).find(m => m.id === config.mode)\n if (!mode) {\n // Back-compat (SPEC §3.4a route/posture extraction): route and posture\n // are no longer manifest `modes[]` entries — route resolves from the\n // model catalog `@route`, posture from the harness ACP mode registry /\n // canonical-posture layer. A caller can still pass one of those extracted\n // legacy ids as `config.mode` (a persisted OPERATOR.md\n // `runtime.config.mode`, a `defaults.adapters.<slug>` binding, an\n // in-flight request written against the pre-migration manifest), so a\n // KNOWN legacy route/posture id DEGRADES to a soft no-op here — its\n // env/argv patch is gone, and the axis it targeted is applied elsewhere\n // (or, until step 2c lands, dormant) — rather than hard-failing the spawn.\n // Only a genuinely-unknown id (never a valid mode) still throws. The\n // legacy-id set is single-sourced in `../legacy-modes`, shared with the\n // daemon's `decomposeMode` shim so the two can't drift.\n if (!isLegacyExtractedModeId(config.mode)) {\n const known = (handle.modes ?? []).map(m => m.id).join(\", \") || \"(none)\"\n throw new RuntimeConfigError(\n \"unknown_mode\",\n \"config.mode\",\n `Mode '${config.mode}' is not declared by manifest '${handle.id}'. Known modes: ${known}`\n )\n }\n // Known legacy extracted id → soft no-op: fall through with no mode patch.\n } else if ((mode.apply ?? \"bin_args\") === \"bin_args\") {\n // \"config\" modes have no argv/env surface — the CLI doesn't accept a\n // flag for this mode at all (e.g. opencode's plan/build). The mode id\n // is instead forwarded to the ACP arm's connect({mode}) by\n // define-agent-cli.ts and applied via session/set_config_option. Skip\n // bin_args_prepend/bin_args_append/env here even if an author declared\n // them alongside apply:\"config\" — config wins, argv is never composed,\n // so a typo'd flag can't crash the spawn the way this whole bug did.\n if (mode.bin_args_prepend) prepend.push(...mode.bin_args_prepend)\n if (mode.bin_args_append) append.push(...mode.bin_args_append)\n if (mode.env) Object.assign(env, mode.env)\n if (mode.env_unset) envUnset.push(...mode.env_unset)\n }\n }\n\n // ── Option patches (declaration order) ──────────────────────────\n if (config.options && Object.keys(config.options).length > 0) {\n const declared = handle.options ?? []\n const declaredById = new Map(declared.map(o => [o.id, o]))\n // Reject unknown ids first so the operator sees ALL the typos\n // (not just the one we hit first when iterating declared).\n for (const id of Object.keys(config.options)) {\n if (!declaredById.has(id)) {\n const known = declared.map(o => o.id).join(\", \") || \"(none)\"\n throw new RuntimeConfigError(\n \"unknown_option\",\n `config.options.${id}`,\n `Option '${id}' is not declared by manifest '${handle.id}'. Known options: ${known}`\n )\n }\n }\n // Then apply patches in declaration order so adapter-author intent\n // wins over operator-config key order.\n for (const option of declared) {\n if (!(option.id in config.options)) continue\n const value = config.options[option.id] as boolean | number | string\n validateOptionValue(option, value)\n const patch = renderOptionPatch(option, value)\n prepend.push(...patch.prepend)\n append.push(...patch.append)\n Object.assign(env, patch.env)\n if (patch.envUnset.length) envUnset.push(...patch.envUnset)\n }\n }\n\n // ── Model deny-list enforcement ─────────────────────────────────\n // The `model` option is deliberately free-form (any provider id), so\n // `models.allowed` is only a curated menu — it can't *prevent* a caller\n // from passing an off-menu id. `models.deny` is the hard guardrail: a\n // requested model matching any deny pattern is refused here, before we\n // spawn anything, so a budget adapter can't be steered onto a provider it\n // must never use (e.g. Anthropic models are reserved for claude-code).\n const requestedModel = config.options?.model\n if (typeof requestedModel === \"string\" && handle.models?.deny?.length) {\n const denyHit = handle.models.deny.find(pattern =>\n matchesModelPattern(pattern, requestedModel)\n )\n if (denyHit) {\n throw new RuntimeConfigError(\n \"model_denied\",\n \"config.options.model\",\n `Model '${requestedModel}' is denied by manifest '${handle.id}' (matches deny pattern '${denyHit}'). This adapter deliberately does not route to that provider — use a permitted model or a different adapter.`\n )\n }\n }\n\n // ── Model apply:\"arg\" — CLI-argument model selection ────────────\n // For adapters whose wrapper takes its model as a CLI arg rather than\n // an ACP session config, compose\n // the manifest's `models.bin_args_template` here with `{model}`\n // interpolated. define-agent-cli.ts reads `models.apply` and only\n // forwards `model` into the ACP connect() call for \"config\" — \"arg\"\n // never reaches the ACP layer at all, so this is the only place the\n // requested model is actually applied.\n if (\n typeof requestedModel === \"string\" &&\n handle.models?.apply === \"arg\" &&\n handle.models.bin_args_template &&\n !opts?.skipModelArg\n ) {\n append.push(\n ...handle.models.bin_args_template.map(token =>\n token.replace(\"{model}\", requestedModel)\n )\n )\n }\n\n // ── Continuation validation (no patch — strategy registry owns) ─\n if (config.continuation !== undefined && handle.continuation) {\n if (!handle.continuation.supported.includes(config.continuation)) {\n throw new RuntimeConfigError(\n \"unsupported_continuation\",\n \"config.continuation\",\n `Continuation strategy '${config.continuation}' is not in manifest '${handle.id}'.continuation.supported (${handle.continuation.supported.join(\", \")}).`\n )\n }\n }\n\n return {\n binArgs: [...prepend, ...(handle.bin_args ?? []), ...append],\n env,\n envUnset,\n }\n}\n\n/**\n * Resolve the continuation strategy id to use for this call. Operator\n * config wins; manifest default is the fallback; \"none\" if neither\n * declares anything (preserves pre-AIP-45-extension behaviour).\n */\nexport function resolveContinuationStrategy(\n handle: AgentCliHandle,\n config?: RuntimeConfig\n): import(\"../types.js\").ContinuationStrategyId {\n if (config?.continuation) return config.continuation\n return handle.continuation?.default ?? \"none\"\n}\n\n/**\n * Case-insensitive match of a model id against a deny/allow pattern.\n * Supports a single trailing `*` wildcard (prefix match); otherwise exact.\n */\nfunction matchesModelPattern(pattern: string, modelId: string): boolean {\n const p = pattern.toLowerCase()\n const m = modelId.toLowerCase()\n return p.endsWith(\"*\") ? m.startsWith(p.slice(0, -1)) : m === p\n}\n\nfunction validateOptionValue(\n option: AgentCliOption,\n value: boolean | number | string\n): void {\n const path = `config.options.${option.id}`\n switch (option.type) {\n case \"boolean\":\n if (typeof value !== \"boolean\") {\n throw new RuntimeConfigError(\n \"option_type_mismatch\",\n path,\n `Expected boolean, got ${typeof value} (${JSON.stringify(value)}).`\n )\n }\n return\n case \"integer\":\n if (typeof value !== \"number\" || !Number.isInteger(value)) {\n throw new RuntimeConfigError(\n \"option_type_mismatch\",\n path,\n `Expected integer, got ${typeof value === \"number\" ? \"non-integer number\" : typeof value} (${JSON.stringify(value)}).`\n )\n }\n if (option.min !== undefined && value < option.min) {\n throw new RuntimeConfigError(\n \"option_bounds_violation\",\n path,\n `Value ${value} is below the declared minimum ${option.min}.`\n )\n }\n if (option.max !== undefined && value > option.max) {\n throw new RuntimeConfigError(\n \"option_bounds_violation\",\n path,\n `Value ${value} is above the declared maximum ${option.max}.`\n )\n }\n return\n case \"string\":\n if (typeof value !== \"string\") {\n throw new RuntimeConfigError(\n \"option_type_mismatch\",\n path,\n `Expected string, got ${typeof value} (${JSON.stringify(value)}).`\n )\n }\n return\n case \"enum\":\n if (typeof value !== \"string\") {\n throw new RuntimeConfigError(\n \"option_type_mismatch\",\n path,\n `Expected string (enum value), got ${typeof value} (${JSON.stringify(value)}).`\n )\n }\n if (!(option.enum ?? []).includes(value)) {\n throw new RuntimeConfigError(\n \"option_enum_violation\",\n path,\n `Value '${value}' is not in the declared enum (${(option.enum ?? []).join(\", \")}).`\n )\n }\n return\n }\n}\n\nfunction renderOptionPatch(\n option: AgentCliOption,\n value: boolean | number | string\n): { prepend: string[]; append: string[]; env: Record<string, string>; envUnset: string[] } {\n const stringValue = String(value)\n\n // boolean type: only emit the bare flag when value === true and the\n // option declared `bin_args_append_when_true`. Honor `env` too —\n // adapter authors might want to surface the bool via env. Booleans\n // have no prepend counterpart — `bin_args_append_when_true` is for\n // bare flags, which never need to precede a baked-in subcommand.\n if (option.type === \"boolean\") {\n if (value !== true) return { prepend: [], append: [], env: {}, envUnset: [] }\n return {\n prepend: [],\n append: option.bin_args_append_when_true\n ? [...option.bin_args_append_when_true]\n : [],\n env: option.env ? interpolateEnv(option.env, stringValue) : {},\n envUnset: option.env_unset ? [...option.env_unset] : [],\n }\n }\n\n // value-bearing types — apply `bin_args_prepend` / `bin_args_template`\n // (with `{value}` interpolation) and merge `env`. `env_unset` applies\n // whenever the option is active with a non-default value (the same\n // condition under which `env` merges) — so a `base_url` option, e.g.,\n // scrubs the ambient ANTHROPIC_API_KEY the moment it's set.\n return {\n prepend: option.bin_args_prepend\n ? option.bin_args_prepend.map(token =>\n token.replace(/\\{value\\}/g, stringValue)\n )\n : [],\n append: option.bin_args_template\n ? option.bin_args_template.map(token =>\n token.replace(/\\{value\\}/g, stringValue)\n )\n : [],\n env: option.env ? interpolateEnv(option.env, stringValue) : {},\n envUnset: option.env_unset ? [...option.env_unset] : [],\n }\n}\n\nfunction interpolateEnv(\n env: Record<string, string>,\n value: string\n): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [k, v] of Object.entries(env)) {\n out[k] = v.replace(/\\{value\\}/g, value)\n }\n return out\n}\n","/**\n * Isolated adapter state home for OS-confined spawns.\n *\n * Some CLIs keep mutable runtime state in a home directory under `$HOME`\n * (codex: `~/.codex` — a sqlite state db, `tmp/arg0` PATH aliases, session\n * rollouts). The OS sandbox denies `$HOME` outright, so a confined spawn of\n * such a CLI dies at startup (\"failed to initialize sqlite state runtime\").\n *\n * Granting the REAL home writable would let a confined agent rewrite the\n * operator's own config (codex `config.toml`: MCP servers, sandbox mode) for\n * every later, unconfined run, and read every other session's transcripts.\n * Instead the confined spawn gets its own home — the per-session-lineage\n * `configDir` when the host keys one (so native resume finds its rollouts\n * after a respawn), else a throwaway temp dir — pointed at by the CLI's home\n * env var. Only the files the definition lists in `share` (the login file)\n * are symlinked back to the real home, and only those exact files are\n * granted through the sandbox, so a token refresh written through the link\n * lands in the operator's real login rather than a diverging copy.\n */\n\nimport { existsSync, lstatSync, mkdirSync, mkdtempSync, realpathSync, symlinkSync, unlinkSync, writeFileSync } from \"node:fs\"\nimport { homedir, tmpdir } from \"node:os\"\nimport { isAbsolute, join, resolve } from \"node:path\"\nimport type { AgentCliStateHome } from \"./types.js\"\n\nexport interface IsolatedStateHome {\n /** The per-spawn home the CLI's `env` var now points at. */\n dir: string\n /** Read+write grants for the sandbox: the home itself + each shared file's real path. */\n writePaths: string[]\n}\n\n/** The operator's real home for this CLI: the ambient env override, else `~/<defaultDir>`. */\nexport function realStateHome(stateHome: AgentCliStateHome, env: Record<string, string | undefined>): string {\n const fromEnv = env[stateHome.env]\n if (fromEnv && isAbsolute(fromEnv)) return fromEnv\n return resolve(homedir(), stateHome.defaultDir)\n}\n\nexport function prepareIsolatedStateHome(\n stateHome: AgentCliStateHome,\n opts: { configDir?: string; env: Record<string, string | undefined> },\n): IsolatedStateHome {\n const real = realStateHome(stateHome, opts.env)\n let dir: string\n if (opts.configDir) {\n dir = opts.configDir\n mkdirSync(dir, { recursive: true })\n } else {\n dir = mkdtempSync(join(tmpdir(), `agentproto-${stateHome.env.toLowerCase()}-`))\n }\n const writePaths = [dir]\n for (const name of stateHome.share ?? []) {\n const target = join(real, name)\n const link = join(dir, name)\n // Re-assert every spawn: a reused lineage dir may hold a stale link, or a\n // regular file the CLI wrote while the real one was absent.\n try {\n lstatSync(link)\n unlinkSync(link)\n } catch {\n // absent — nothing to replace\n }\n if (!existsSync(target)) continue\n symlinkSync(target, link)\n // The sandbox checks the resolved path, so grant the real file.\n writePaths.push(realpathSync(target))\n }\n for (const [name, content] of Object.entries(stateHome.seed ?? {})) {\n const file = join(dir, name)\n // Unlink first so a link left in a reused dir is never written through\n // into the real home.\n try {\n unlinkSync(file)\n } catch {\n // absent\n }\n writeFileSync(file, content)\n }\n return { dir, writePaths }\n}\n\n/** Subdir of the session `configDir` holding a login-less data home. */\nexport const CREDENTIAL_DATA_SUBDIR = \"auth-data\"\n\n/**\n * The empty data home a credential-injecting spawn runs in (see\n * `AgentCliDefinition.credentialDataHome`): `<configDir>/auth-data` when the\n * host keys a per-session dir (so native resume finds its rows after a\n * respawn), else a throwaway temp dir.\n */\nexport function isolatedCredentialDataHome(configDir?: string): string {\n const dir = configDir\n ? join(configDir, CREDENTIAL_DATA_SUBDIR)\n : mkdtempSync(join(tmpdir(), \"agentproto-data-\"))\n mkdirSync(dir, { recursive: true })\n return dir\n}\n","import { realpathSync } from \"node:fs\"\nimport { dirname, resolve } from \"node:path\"\n\n/** Adapters with a verified switch for excluding host instruction files. */\nexport function agentCliSupportsHostContextIsolation(adapterId: string): boolean {\n return adapterId === \"claude-code\"\n}\n\n// claudeMdExcludes entries are picomatch globs, so a literal path with glob\n// metacharacters must be escaped or it silently matches nothing.\nfunction escapeGlob(p: string): string {\n return p.replace(/[\\\\*?[\\]{}()!+@]/g, \"\\\\$&\")\n}\n\nfunction ancestors(dir: string): string[] {\n const out: string[] = []\n let cur = dirname(dir)\n for (;;) {\n out.push(cur)\n const parent = dirname(cur)\n if (parent === cur) return out\n cur = parent\n }\n}\n\n/**\n * `claudeMdExcludes` entries covering every instruction file Claude Code\n * would load from a STRICT ancestor of `cwd` (the host monorepo around an\n * installed app). `cwd`'s own CLAUDE.md is deliberately left loadable — it\n * is the app's. Both the lexical and the symlink-resolved ancestor chains\n * are covered, since the SDK may walk either.\n */\nexport function hostContextExcludes(cwd: string): string[] {\n const abs = resolve(cwd)\n let real = abs\n try {\n real = realpathSync(abs)\n } catch {\n // cwd not created yet — the lexical chain is all there is\n }\n const dirs = new Set([...ancestors(abs), ...ancestors(real)])\n const out: string[] = []\n for (const d of dirs) {\n const base = d === \"/\" ? \"\" : escapeGlob(d)\n out.push(\n `${base}/CLAUDE.md`,\n `${base}/CLAUDE.local.md`,\n `${base}/.claude/CLAUDE.md`,\n `${base}/.claude/rules/**`,\n )\n }\n return out\n}\n","/**\n * Per-session skill delivery — the driver half of the skill-imports feature.\n *\n * The daemon resolves imported skills at spawn (see `@agentproto/runtime`'s\n * `resolveSessionSkills`) and hands them down as\n * {@link AgentCliStartOptions.sessionSkills}. This module copies each skill\n * folder into the session's isolated config dir, at a location the ADAPTER\n * declares so its harness discovers the skills natively under its own\n * isolated home:\n *\n * <adapterConfigDir>/<dir>/<alias>/SKILL.md\n *\n * The location and any env var naming it come from the adapter manifest's\n * `metadata.sessionSkills` field ({@link SessionSkillsMetadata}) — an adapter\n * that declares none gets no delivery (the field is the opt-in). The whole\n * `<dir>` tree is wiped first, so a respawn never leaves a stale skill behind.\n *\n * For opencode this is the only route that survives `lean` mode: the mode sets\n * `OPENCODE_DISABLE_EXTERNAL_SKILLS=1`, which gates opencode's AUTO-DISCOVERY\n * of `~/.claude/skills`, `~/.agents/skills`, and project-ancestor `.claude`/\n * `.agents` dirs — but NOT its own config-dir scan. Pointing `OPENCODE_CONFIG_DIR`\n * at the session dir (whose `skills/` we populate) loads the skills regardless\n * of that flag, because opencode's `Skill.discovery` scans every config dir\n * (including `$OPENCODE_CONFIG_DIR`) unconditionally. Verified against the\n * installed opencode 1.18.x/1.19.x binary; see the report.\n */\n\nimport { cpSync, mkdirSync, rmSync } from \"node:fs\"\nimport { isAbsolute, join, relative, resolve as resolvePath } from \"node:path\"\nimport type { AgentCliSessionSkill } from \"./types.js\"\n\n/** Placeholder an adapter manifest uses in `metadata.sessionSkills.env` values\n * for \"the absolute session config dir\" (the base that holds `dir`). */\nexport const SESSION_SKILLS_ABS_DIR = \"<abs dir>\"\n\n/** Shape of an adapter manifest's `metadata.sessionSkills`. */\nexport interface SessionSkillsMetadata {\n /**\n * Skill dir RELATIVE to the session config dir — the copy target is\n * `<adapterConfigDir>/<dir>/<alias>/`. claude-code and opencode both use\n * `\"skills\"` (the flat one-subdir-per-skill shape).\n */\n dir: string\n /**\n * Env vars to point at the session config dir so the harness discovers the\n * delivered skills under its isolated home. The literal\n * {@link SESSION_SKILLS_ABS_DIR} in a value is substituted with the absolute\n * session config dir. opencode needs `OPENCODE_CONFIG_DIR`; claude-code\n * needs none (`CLAUDE_CONFIG_DIR` is already the session dir).\n */\n env?: Record<string, string>\n}\n\n/**\n * Read + validate `metadata.sessionSkills` from an adapter manifest. Returns\n * `undefined` when absent or malformed (an adapter that opts out, or a manifest\n * typo) — delivery is purely additive and must never break a spawn.\n */\nexport function readSessionSkillsMetadata(\n metadata: Record<string, unknown> | undefined,\n): SessionSkillsMetadata | undefined {\n const raw = metadata?.sessionSkills\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return undefined\n const record = raw as Record<string, unknown>\n const dir = record.dir\n if (typeof dir !== \"string\" || dir.length === 0) return undefined\n const env: Record<string, string> = {}\n const envRaw = record.env\n if (envRaw && typeof envRaw === \"object\" && !Array.isArray(envRaw)) {\n for (const [name, value] of Object.entries(envRaw)) {\n if (typeof value === \"string\") env[name] = value\n }\n }\n return { dir, ...(Object.keys(env).length > 0 ? { env } : {}) }\n}\n\nexport interface ApplySessionSkillsArgs {\n skills: readonly AgentCliSessionSkill[]\n meta: SessionSkillsMetadata\n /** The absolute session config dir that holds `meta.dir`. */\n baseDir: string\n /** Mutated in place with the resolved `meta.env` entries. */\n env: Record<string, string>\n}\n\nexport interface ApplySessionSkillsResult {\n /** The delivered skills dir — an extra write path for a confined spawn. */\n targetDir: string\n /** Non-fatal per-skill problems (a bad alias, a copy failure). Delivery is\n * additive and must NEVER sink the spawn — one broken skill is reported and\n * skipped, the rest still land. */\n warnings: string[]\n}\n\n/**\n * Copy each skill folder into `<baseDir>/<dir>/<alias>/`, wiping `<dir>` first.\n * A copy (not a symlink) so the delivered tree survives the source moving, and\n * a recursive copy so multi-file skills (`scripts/`, references) come along.\n * Per-skill failures are collected as warnings, never thrown.\n */\nexport function applySessionSkills(args: ApplySessionSkillsArgs): ApplySessionSkillsResult {\n const targetDir = join(args.baseDir, args.meta.dir)\n // Wipe stale entries wholesale: a skill removed from the import set (or\n // renamed) must not linger for the next spawn to accidentally discover.\n rmSync(targetDir, { recursive: true, force: true })\n mkdirSync(targetDir, { recursive: true })\n const warnings: string[] = []\n for (const skill of args.skills) {\n // Defense in depth: the registry validates `alias` as a bare slug, but a\n // hand-edited/corrupt registry could carry `..`/separators — never let a\n // copy escape the target dir.\n const dest = resolvePath(targetDir, skill.alias)\n const rel = relative(targetDir, dest)\n if (rel === \"\" || rel.startsWith(\"..\") || isAbsolute(rel)) {\n warnings.push(`skill \"${skill.alias}\" has an invalid alias — not delivered`)\n continue\n }\n try {\n cpSync(skill.path, dest, { recursive: true })\n } catch (err) {\n warnings.push(\n `skill \"${skill.alias}\" could not be delivered: ${\n err instanceof Error ? err.message : String(err)\n }`,\n )\n }\n }\n if (args.meta.env) {\n for (const [name, value] of Object.entries(args.meta.env)) {\n args.env[name] = value.split(SESSION_SKILLS_ABS_DIR).join(args.baseDir)\n }\n }\n return { targetDir, warnings }\n}\n","/**\n * Live-session control surface, built once from a connected protocol arm.\n *\n * `AgentCliRuntimeSession` requires six members beyond\n * `send`/`cancel`/`close`: the three mid-session switches (`setModel`,\n * `setSessionMode`, `setEffort`, SPEC §3.9/§3.4a) and the three\n * read-surface snapshots (`availableConfigOptions`, `availableModes`,\n * `currentModeId`). All six are pure delegation to the arm — none of\n * them touch the child process, the spawn, or the transport.\n *\n * They used to live inline inside `createAgentCliRuntime`, which made\n * them unreachable for any host that builds its OWN session over a\n * different transport. Those hosts exist and are the whole point of\n * `createAcpProtocolArm` being exported: guilde runs one runtime whose\n * child lives in an e2b sandbox and another whose child lives on a\n * remote daemon behind a WS tunnel, both driving the same ACP arm. Every\n * such host had to hand-copy this block, and silently broke the day the\n * interface grew a seventh member.\n *\n * So it lives here, exported, and `createAgentCliRuntime` consumes it\n * like everyone else — one implementation, one place to extend.\n */\n\nimport { randomUUID } from \"node:crypto\"\nimport type {\n AgentCliClient,\n AgentCliHandle,\n AgentCliRuntimeSession,\n SetModelResult,\n StreamEvent,\n} from \"./types.js\"\n\n/**\n * The slice of `AgentCliRuntimeSession` {@link createArmSessionControls}\n * supplies. Spread it into the session literal alongside the\n * transport-specific `sessionId`/`send`/`cancel`/`close`.\n */\nexport type ArmSessionControls = Pick<\n AgentCliRuntimeSession,\n | \"setModel\"\n | \"setSessionMode\"\n | \"setEffort\"\n | \"availableConfigOptions\"\n | \"availableModes\"\n | \"currentModeId\"\n>\n\n/**\n * Build the control surface from a CONNECTED arm.\n *\n * Call this after `arm.connect()` has resolved: the read-surface fields\n * are snapshots, so an ACP arm's captured `newSession`/`loadSession`\n * response has to already be populated. Arms that don't model this\n * (print, proprietary) leave the getters undefined and are defaulted\n * here to the same empty/absent shape their `setModel`-style\n * counterparts use for \"not supported\".\n *\n * Every switch resolves — none throws, none tears down the session, even\n * when the underlying agent rejects the request. See\n * {@link SetModelResult} and friends for the reason vocabulary.\n */\nexport function createArmSessionControls(\n arm: AgentCliClient,\n definition: AgentCliHandle,\n): ArmSessionControls {\n const modelApply = definition.models?.apply ?? \"config\"\n\n return {\n // Capability read-surface (SPEC §3.9/§3.4a) — snapshotted once\n // `arm.connect()` has resolved. Not live-updated by a later\n // `setModel`/`setSessionMode` call.\n availableConfigOptions: arm.availableConfigOptions ?? [],\n availableModes: arm.availableModes ?? [],\n currentModeId: arm.currentModeId,\n\n /**\n * Mid-session model switch — the runtime counterpart to the\n * spawn-time model apply. Dispatches on the same\n * `definition.models.apply` strategy so a live switch behaves\n * exactly like the spawn-time apply would have, just against an\n * already-running session.\n */\n async setModel(modelId: string): Promise<SetModelResult> {\n if (modelApply === \"arg\") {\n // This CLI takes its model as a spawn-time argv token\n // (bin_args_template, composed once before spawn) — there is\n // no live surface to change it against a running session.\n return { applied: false, reason: \"requires-restart\" }\n }\n if (modelApply === \"command\") {\n return applyModelCommand(arm, modelId)\n }\n // \"config\" (default): apply via the arm's setConfigOption, which\n // only the ACP arm implements — other arms (print, proprietary)\n // simply don't have a mid-session config surface.\n if (!arm.setConfigOption) {\n return { applied: false, reason: \"not-supported\" }\n }\n const result = await arm.setConfigOption(\"model\", modelId)\n return result.applied\n ? { applied: true, model: modelId }\n : { applied: false, ...(result.reason ? { reason: result.reason } : {}) }\n },\n\n /**\n * Mid-session posture switch — the native-mode counterpart to\n * `setModel`, wired directly to the arm's `setSessionMode` (only the\n * ACP arm implements it).\n */\n async setSessionMode(modeId: string) {\n if (!arm.setSessionMode) {\n return { applied: false, reason: \"not-supported\" }\n }\n const result = await arm.setSessionMode(modeId)\n return result.applied\n ? { applied: true, modeId }\n : { applied: false, ...(result.reason ? { reason: result.reason } : {}) }\n },\n\n /**\n * Mid-session effort switch — the effort-axis counterpart to\n * `setModel`'s `\"config\"` strategy, wired to the same\n * `arm.setConfigOption` surface with `configId:\"effort\"`. Best-effort:\n * an effort label the current model rejects resolves\n * `{applied:false, reason}` (SPEC risk R7).\n */\n async setEffort(effort: string) {\n if (!arm.setConfigOption) {\n return { applied: false, reason: \"not-supported\" }\n }\n const result = await arm.setConfigOption(\"effort\", effort)\n return result.applied\n ? { applied: true, effort }\n : { applied: false, ...(result.reason ? { reason: result.reason } : {}) }\n },\n }\n}\n\n/**\n * Loose acknowledgement match shared by `applyModelCommand`'s dedicated\n * control turn below AND the ordinary-prompt learn-path\n * (`@agentproto/runtime`'s `sessions.ts` `runAgentTurn`, which watches a\n * plain `/model <id>` typed as a normal conversational turn — the shape the\n * hermes spawn recipe's `/model` shortcut actually sends today, since it\n * never goes through this control turn). Hermes replies \"Model switched to:\n * <id> · Provider: …\"; other adapters phrase it differently, so this is\n * deliberately lax rather than coupled to one adapter's wording or a\n * specific `StreamEvent` shape.\n *\n * REPORTED BY THE ADAPTER, NOT INDEPENDENTLY VERIFIED — good enough as a\n * display hint (`SessionDescriptor.activeModel`), never as a source of\n * billing/cost truth. A caller that ever reads `activeModel` for cost\n * purposes must know it read a heuristic, not a fact.\n */\nexport const MODEL_SWITCH_ACK_RE = /switch|model\\s+set|now using/i\n\n/** See {@link MODEL_SWITCH_ACK_RE}. */\nexport function isModelSwitchAcknowledgement(evt: unknown): boolean {\n return MODEL_SWITCH_ACK_RE.test(JSON.stringify(evt))\n}\n\n/**\n * Extract the target model id from a plain-text turn that opens with a\n * `/model <id>` control command — whether it arrives through\n * `applyModelCommand`'s dedicated control turn or as an ORDINARY\n * conversational prompt (see {@link MODEL_SWITCH_ACK_RE}'s doc for why the\n * latter matters: it's the case the hermes spawn recipe actually produces).\n */\nexport function parseModelSwitchCommand(text: string): string | undefined {\n return /^\\s*\\/model\\s+(\\S+)/i.exec(text)?.[1]\n}\n\n/**\n * Switch the active model via a `/model <id>` control turn, for adapters\n * whose ACP session config doesn't select the model (`models.apply:\n * \"command\"`, e.g. hermes). The turn is fully drained so the switch\n * completes before the caller's next real turn. Best-effort: a transport\n * failure or a missing acknowledgement is warned and reported as\n * `{applied:false, reason}`, never thrown — the session simply continues\n * on whatever model it already had. Shared by the spawn-time apply\n * (return value ignored there) and the mid-session `setModel(\"command\")`\n * path (return value surfaced to the caller).\n */\nexport async function applyModelCommand(\n arm: AgentCliClient,\n modelId: string,\n): Promise<SetModelResult> {\n const turnId = randomUUID()\n let acked = false\n try {\n for await (const evt of promptTurn(arm, turnId, {\n type: \"text\",\n text: `/model ${modelId}`,\n })) {\n if (isModelSwitchAcknowledgement(evt)) acked = true\n }\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err)\n console.warn(\n `[agent-cli] /model ${modelId} control turn failed (continuing on default):`,\n err instanceof Error ? err.message : err,\n )\n return { applied: false, reason }\n }\n if (!acked) {\n const reason = \"no switch acknowledgement — agent may be on its default model\"\n console.warn(`[agent-cli] /model ${modelId}: ${reason}`)\n return { applied: false, reason }\n }\n return { applied: true, model: modelId }\n}\n\n/**\n * Parse a single `key=value` logfmt line into a flat map. Values may be\n * bare (`small=false`) or double-quoted (`message=\"stream error\"`,\n * `error.error=\"AI_APICallError: …\"`); a quoted value's inner `\\\"` / `\\\\`\n * escapes are unescaped. Deliberately tiny — this only ever reads\n * opencode's structured stderr log lines, not a general logfmt corpus.\n */\nfunction parseLogfmtLine(line: string): Record<string, string> {\n const out: Record<string, string> = {}\n const re = /([A-Za-z0-9_.-]+)=(\"(?:[^\"\\\\]|\\\\.)*\"|\\S+)/g\n let m: RegExpExecArray | null\n while ((m = re.exec(line)) !== null) {\n const key = m[1]!\n let value = m[2]!\n if (value.startsWith('\"')) {\n // Single-pass unescape so `\\\\` and `\\\"` can't be mis-ordered.\n value = value.slice(1, -1).replace(/\\\\(.)/g, \"$1\")\n }\n out[key] = value\n }\n return out\n}\n\n/**\n * Strip a leading error-class prefix off a provider error string so the\n * operator sees the human reason, not the class: `\"AI_APICallError: Go\n * usage limit exceeded\"` → `\"Go usage limit exceeded\"`. A message with no\n * recognizable `…Error:` / `…Exception:` prefix is returned verbatim.\n */\nfunction providerMessageFromError(raw: string): string {\n const m = raw.match(/^[A-Za-z_][\\w.]*(?:Error|Exception)\\s*:\\s*([\\s\\S]+)$/)\n return (m ? m[1]! : raw).trim()\n}\n\n/**\n * Parse an opencode-style logfmt stderr line into the provider error it\n * reports, or `undefined` when the line is not a turn-fatal provider\n * error.\n *\n * opencode's ACP server treats a provider 429 / usage-cap as retryable and\n * loops internally; it logs the reason ONLY to stderr — e.g.\n *\n * timestamp=2026-10-02T12:20:59.007Z level=ERROR run=f897ee16 \\\n * message=\"stream error\" providerID=opencode-go modelID=glm-5.3-flash \\\n * session.id=ses_x small=false agent=build \\\n * error.error=\"AI_APICallError: Go usage limit exceeded\"\n *\n * — while `session/prompt` never resolves, so the daemon sees a silent,\n * 0-token, busy session forever. Surfacing that line as the turn's error\n * is what turns the hang into a readable failure. `agent=title` /\n * `small=true` lines are opencode's background title generator and MUST\n * NOT fail the user's turn, so they are ignored.\n */\nexport function parseStderrStreamError(line: string): string | undefined {\n if (!line.includes(\"stream error\")) return undefined\n const fields = parseLogfmtLine(line)\n if ((fields.level ?? \"\").toUpperCase() !== \"ERROR\") return undefined\n if (fields.message !== \"stream error\") return undefined\n if (fields.small === \"true\") return undefined\n if (fields.agent === \"title\") return undefined\n const raw = fields[\"error.error\"] ?? fields.error\n if (!raw) return undefined\n return providerMessageFromError(raw)\n}\n\n/**\n * Send a turn and yield the arm's events for it.\n *\n * Re-attaches the recent stderr tail to error events. The ACP layer\n * surfaces a terse `{message: \"Invalid params\"}`; the child's stderr\n * almost always has a more useful line (\"npx claude-agent-acp: not\n * authenticated, run `claude login`\"). Hosts read `error.data` when\n * present, falling back to `message` for older payloads.\n *\n * When `stderrTurnError` is supplied, a line it parses into a message\n * (see {@link parseStderrStreamError}) is surfaced as THIS turn's error:\n * the turn is cancelled and ended with `reason:\"error\"` instead of hanging\n * forever on a `prompt` the server never resolves. Only armed for adapters\n * whose transport retries silently (opencode); every other adapter keeps\n * the exact prior behavior.\n */\nexport async function* promptTurn(\n arm: AgentCliClient,\n turnId: string,\n message: unknown,\n stderrTurnError?: (line: string) => string | undefined,\n): AsyncIterable<StreamEvent> {\n const stderrTail = arm._stderrTail\n\n // Subscribe BEFORE `send` so a provider error logged while the prompt is\n // being dispatched isn't missed. The parser filters for turn-fatal lines\n // only (title-generator noise is dropped inside it).\n const pendingErrors: string[] = []\n let wake: (() => void) | undefined\n const unsubscribe =\n stderrTurnError && arm._onStderrLine\n ? arm._onStderrLine(line => {\n const parsed = stderrTurnError(line)\n if (parsed === undefined) return\n pendingErrors.push(parsed)\n wake?.()\n wake = undefined\n })\n : undefined\n\n let iterator: AsyncIterator<StreamEvent> | undefined\n try {\n await arm.send(turnId, message)\n iterator = arm.events()[Symbol.asyncIterator]()\n while (true) {\n if (pendingErrors.length > 0) {\n // The provider error only exists on stderr and the server is stuck\n // retrying — stop it and end the turn with the reason.\n await arm.cancel(turnId).catch(() => {})\n yield {\n kind: \"error\",\n sessionId: arm.sessionId,\n error: {\n message: pendingErrors.join(\"\\n\"),\n data: { stderr: stderrTail?.() ?? \"\" },\n },\n }\n yield {\n kind: \"turn-end\",\n sessionId: arm.sessionId ?? \"\",\n reason: \"error\",\n }\n return\n }\n const nextEvent = iterator.next()\n const stderrArrived = new Promise<void>(resolve => {\n wake = resolve\n })\n const winner = await Promise.race([\n nextEvent.then(result => ({ source: \"event\" as const, result })),\n stderrArrived.then(() => ({ source: \"stderr\" as const })),\n ])\n if (winner.source === \"stderr\") continue\n if (winner.result.done) return\n const evt = winner.result.value\n if (evt.kind === \"error\" && typeof stderrTail === \"function\") {\n const tail = stderrTail()\n if (tail) {\n const existing = (evt.error.data ?? {}) as Record<string, unknown>\n evt.error.data = { ...existing, stderr: tail }\n }\n }\n yield evt\n }\n } finally {\n unsubscribe?.()\n // Release the underlying prompt stream best-effort. Never awaited: a\n // server still stuck in its internal retry loop may not settle the\n // pending `next()`, and blocking teardown on that would reintroduce\n // the very hang this path exists to break.\n void iterator?.return?.()?.catch?.(() => {})\n }\n}\n","/**\n * Pin a CLI's auxiliary \"small model\" to the session's own model.\n *\n * opencode runs a second model for background chores (session titles,\n * summaries). Unless `small_model` is configured it picks one itself, and on\n * OpenCode Zen that pick is a PAID model (GPT-5.4 Nano) even when the session\n * runs a `-free` one: every free-model session then logs a `402 Rejected` per\n * title call, and would bill as soon as the key held credit. Pointing the\n * small model at the session model keeps the whole session on one route and\n * one bill.\n *\n * The value is layered into the CLI's inline JSON config env var\n * (`OPENCODE_CONFIG_CONTENT`), the highest-precedence config layer — so it is\n * only set when nobody chose already: not when the inline config carries the\n * key, not when the user's own config files set it, not when the spawn passes\n * the adapter's explicit option (which wins over the session model).\n */\n\nimport { existsSync, readFileSync } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { dirname, join, resolve } from \"node:path\"\nimport type { AgentCliSmallModel } from \"./types.js\"\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v)\n}\n\n/** Every directory from `cwd` up to the filesystem root, nearest first. */\nfunction ancestors(cwd: string): string[] {\n const out: string[] = []\n let dir = resolve(cwd)\n for (;;) {\n out.push(dir)\n const parent = dirname(dir)\n if (parent === dir) return out\n dir = parent\n }\n}\n\n/**\n * Config files the CLI may read `key` from. A superset of what it actually\n * loads (project files are looked up to `/`, not just to the git root): a\n * false hit only means we leave the CLI's own default alone, which is the\n * behaviour before this pin existed.\n */\nfunction userConfigFiles(\n decl: NonNullable<AgentCliSmallModel[\"userConfig\"]>,\n cwd: string,\n env: Record<string, string | undefined>,\n): string[] {\n const home = env.HOME || homedir()\n const files: string[] = []\n const xdgConfig = env.XDG_CONFIG_HOME || join(home, \".config\")\n for (const f of decl.globalFiles ?? []) files.push(join(xdgConfig, f))\n for (const name of decl.fileEnv ?? []) {\n if (env[name]) files.push(env[name]!)\n }\n for (const name of decl.dirEnv ?? []) {\n if (env[name]) for (const f of decl.dirFiles ?? []) files.push(join(env[name]!, f))\n }\n const dirs = [...ancestors(cwd), home]\n const projectDisabled = !!(decl.projectDisableEnv && env[decl.projectDisableEnv])\n for (const dir of dirs) {\n if (!projectDisabled) for (const f of decl.projectFiles ?? []) files.push(join(dir, f))\n for (const f of decl.dirFiles ?? []) files.push(join(dir, f))\n }\n return files\n}\n\n/**\n * Text match, not a parse: the files are JSONC (comments, trailing commas). A\n * commented-out key also matches — a false hit, so we stay out of the way.\n */\nfunction fileSetsKey(file: string, key: string): boolean {\n try {\n if (!existsSync(file)) return false\n return readFileSync(file, \"utf8\").includes(`\"${key}\"`)\n } catch {\n return false\n }\n}\n\n/**\n * The env patch pinning the small model, or `undefined` to leave the spawn\n * env alone. `env` is the FINAL spawn env (ambient + mode/option + auth +\n * host layers), so a value any layer already put in the inline config wins.\n */\nexport function resolveSmallModelEnv(\n decl: AgentCliSmallModel | undefined,\n input: {\n model?: unknown\n options?: Record<string, unknown>\n env: Record<string, string>\n cwd: string\n },\n): Record<string, string> | undefined {\n if (!decl) return undefined\n const explicit = decl.option ? input.options?.[decl.option] : undefined\n const value =\n typeof explicit === \"string\" && explicit\n ? explicit\n : typeof input.model === \"string\" && input.model\n ? input.model\n : undefined\n if (!value) return undefined\n\n const prior = input.env[decl.env]\n let inline: Record<string, unknown> = {}\n if (prior !== undefined && prior !== \"\") {\n let parsed: unknown\n try {\n parsed = JSON.parse(prior)\n } catch {\n // Not JSON — the CLI will complain on its own; never rewrite it.\n return undefined\n }\n if (!isPlainObject(parsed)) return undefined\n if (parsed[decl.key] !== undefined) return undefined\n inline = parsed\n }\n\n // An explicit option is the operator's pick for THIS spawn — it beats\n // whatever the user's config files say. The session-model default does not.\n if (!explicit && decl.userConfig) {\n const files = userConfigFiles(decl.userConfig, input.cwd, input.env)\n if (files.some(f => fileSetsKey(f, decl.key))) return undefined\n }\n\n return { [decl.env]: JSON.stringify({ ...inline, [decl.key]: value }) }\n}\n","/**\n * Canonical posture → opencode `permission` config (SPEC §3.4a, risk Rw).\n *\n * opencode's ACP server advertises only its `build`/`plan` agents as session\n * modes, so a canonical posture with no native mode (`bypass`, `accept-edits`,\n * `read-only`) used to reach an opencode session as an ADVISORY system-prompt\n * preamble only — `posture: \"bypass\"` still showed opencode's own permission\n * prompts. This module turns those postures into a real boundary the same way\n * claude-code gets one (`permissions.defaultMode` in its isolated\n * `CLAUDE_CONFIG_DIR`): a `permission` block layered into the session's own\n * `OPENCODE_CONFIG_CONTENT` — the per-session, highest-precedence config layer\n * (deep-merged over the user's global and project config, never written to\n * them).\n *\n * Shape verified against the pinned opencode (1.18.x) bundle: `permission` is\n * `\"allow\"|\"ask\"|\"deny\"` or an object keyed by permission name (plus `*` and\n * arbitrary extra keys), each value an action or a `{ pattern: action }`\n * object. Rules are flattened in key order and the LAST match wins, and the\n * config-level block is merged AFTER every built-in agent's defaults — so a key\n * set here overrides opencode's own `ask` defaults (`doom_loop`,\n * `external_directory`, `*.env` reads) and the user's config for that key.\n *\n * `plan` maps to nothing here on purpose: opencode advertises a native `plan`\n * agent, which the runtime switches to via `setSessionMode` (a real boundary\n * already), and a config-level `edit: \"deny\"` would override that agent's own\n * allowance for writing its plan file. `default` is neutral.\n *\n * Known limits (documented, not silent): a user's per-agent\n * `agent.<name>.permission` block is merged after the config-level one and can\n * still re-introduce a prompt; `read-only` denies opencode's own mutating tools\n * (`edit`/`write`/`apply_patch`, `bash`) but not an MCP server's tools.\n */\n\n/** opencode's well-known permission keys (1.18.x `PermissionConfig`). */\nconst OPENCODE_PERMISSION_KEYS = [\n \"read\",\n \"edit\",\n \"glob\",\n \"grep\",\n \"list\",\n \"bash\",\n \"task\",\n \"external_directory\",\n \"todowrite\",\n \"question\",\n \"webfetch\",\n \"websearch\",\n \"lsp\",\n \"doom_loop\",\n \"skill\",\n] as const\n\ntype OpencodePermissionAction = \"allow\" | \"ask\" | \"deny\"\nexport type OpencodePermissionBlock = Readonly<Record<string, OpencodePermissionAction>>\n\n/**\n * canonical posture → the `permission` block it writes. `bypass` leads with\n * `*` (catches any permission, including tool names this list doesn't know)\n * and then names every well-known key explicitly, so a user config that set\n * one of them to `ask` (or to a pattern object) is replaced rather than left\n * ahead of the wildcard.\n */\nconst OPENCODE_POSTURE_PERMISSIONS: Readonly<Record<string, OpencodePermissionBlock>> = {\n bypass: {\n \"*\": \"allow\",\n ...Object.fromEntries(OPENCODE_PERMISSION_KEYS.map(key => [key, \"allow\" as const])),\n },\n \"accept-edits\": { edit: \"allow\" },\n \"read-only\": { edit: \"deny\", bash: \"deny\" },\n}\n\n/** The canonical postures this module turns into a real opencode boundary. */\nexport const OPENCODE_SPAWN_ENFORCED_POSTURES: readonly string[] = Object.keys(\n OPENCODE_POSTURE_PERMISSIONS,\n)\n\n/**\n * The opencode `permission` block a canonical posture enforces, or `undefined`\n * when the posture has no config mapping (`default`, `plan` — see the module\n * doc — an unknown value, or none requested).\n */\nexport function opencodePermissionForPosture(\n posture: string | undefined,\n): OpencodePermissionBlock | undefined {\n if (!posture) return undefined\n return OPENCODE_POSTURE_PERMISSIONS[posture]\n}\n\n/**\n * Layer a posture's `permission` block into an inline opencode config JSON\n * string (`OPENCODE_CONFIG_CONTENT`'s current value, possibly absent) and return\n * the new JSON. Every other config key (`instructions`, `small_model`, `mcp`, a\n * provider block) is preserved; an existing inline `permission` object keeps\n * its other keys, while each posture key is removed and re-added so it sits\n * LAST in key order (opencode's last-match-wins evaluation).\n *\n * Throws when the existing value is not a JSON object: the caller asked for a\n * permission boundary, and spawning without it would be the silent advisory\n * fallback this exists to remove.\n */\nexport function mergeOpencodePermission(\n prior: string | undefined,\n permission: OpencodePermissionBlock,\n envName: string,\n): string {\n let inline: Record<string, unknown> = {}\n if (prior !== undefined && prior !== \"\") {\n let parsed: unknown\n try {\n parsed = JSON.parse(prior)\n } catch {\n parsed = undefined\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\n `opencode posture: ${envName} is not a JSON object, so the requested ` +\n \"permission posture cannot be enforced — refusing to spawn with an advisory-only posture.\",\n )\n }\n inline = parsed as Record<string, unknown>\n }\n const existing = inline.permission\n const merged: Record<string, unknown> =\n typeof existing === \"string\"\n ? { \"*\": existing }\n : existing && typeof existing === \"object\" && !Array.isArray(existing)\n ? { ...(existing as Record<string, unknown>) }\n : {}\n for (const [key, action] of Object.entries(permission)) {\n delete merged[key]\n merged[key] = action\n }\n return JSON.stringify({ ...inline, permission: merged })\n}\n","import { createHash } from \"node:crypto\"\nimport { existsSync, readFileSync } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { basename, join } from \"node:path\"\n\n/**\n * Skip `npm exec` for an adapter launched as `npx -y <pkg>@<exact version>`\n * whose exact version already sits in npm's npx cache — exec the cached bin\n * directly instead.\n *\n * Why (F34b, measured live 2026-09-26): before `npx` runs anything it does a\n * full arborist `loadActual()` of the project tree around the CHILD's cwd\n * (~20s warm, ~2min cold for a large pnpm monorepo), then a second one of\n * the npx cache dir under a cross-process `concurrency.lock` keyed by the\n * package spec — i.e. one lock per adapter. Every step is filesystem-bound,\n * so a concurrent worktree provision (`pnpm install` + build in its setup\n * hooks) on the same disk stretched a plain claude-code spawn to minutes,\n * which looked exactly like spawns queuing behind provisioning. The\n * daemon never held a lock; npm did the waiting.\n *\n * Only EXACT versions qualify: an unpinned spec (`-y opencode-ai`) relies on\n * npx's registry check to pick up new releases, and bypassing it would\n * silently freeze the version. Anything that doesn't resolve cleanly (cache\n * miss, version mismatch, ambiguous bin, Windows `.cmd` shims) returns\n * `undefined` so the caller spawns `npx` exactly as before — the fast path\n * can only ever remove work, never change which version runs.\n */\nexport interface NpxFastPath {\n /** Absolute path of the cached bin to exec in place of `npx`. */\n bin: string\n /** The argv after the package spec — what npx would have forwarded. */\n args: string[]\n /** `<cache>/_npx/<hash>/node_modules/.bin` — npx prepends it to the\n * child's PATH, so the fast path does too. */\n binDir: string\n}\n\n/** Same key libnpmexec uses for `<cache>/_npx/<hash>`: sha512 over the\n * sorted package specs, newline-joined, first 16 hex chars. */\nexport function npxCacheKey(packages: readonly string[]): string {\n return createHash(\"sha512\")\n .update([...packages].sort((a, b) => a.localeCompare(b, \"en\")).join(\"\\n\"))\n .digest(\"hex\")\n .slice(0, 16)\n}\n\n/** `name@1.2.3` (optionally scoped, optional prerelease/build) → parts;\n * anything else (range, tag, bare name, url, path) → undefined. */\nfunction parseExactSpec(spec: string): { name: string; version: string } | undefined {\n const m = /^((?:@[a-z0-9][\\w.-]*\\/)?[a-z0-9][\\w.-]*)@(\\d+\\.\\d+\\.\\d+(?:-[\\w.-]+)?(?:\\+[\\w.-]+)?)$/i.exec(spec)\n return m ? { name: m[1]!, version: m[2]! } : undefined\n}\n\n/** npm's own rule (`get-bin-from-manifest`): a lone bin wins; otherwise the\n * bin named after the unscoped package name; otherwise ambiguous. */\nfunction binNameFromManifest(name: string, bin: unknown): string | undefined {\n const unscoped = name.replace(/^@[^/]+\\//, \"\")\n if (typeof bin === \"string\") return unscoped\n if (!bin || typeof bin !== \"object\") return undefined\n const names = Object.keys(bin)\n if (names.length === 1) return names[0]\n return names.includes(unscoped) ? unscoped : undefined\n}\n\nexport function resolveNpxFastPath(\n bin: string,\n args: readonly string[],\n env: Record<string, string | undefined>,\n deps?: {\n platform?: NodeJS.Platform\n home?: string\n exists?: (p: string) => boolean\n readFile?: (p: string) => string\n },\n): NpxFastPath | undefined {\n if ((deps?.platform ?? process.platform) === \"win32\") return undefined\n if (basename(bin) !== \"npx\") return undefined\n const [yes, spec, ...rest] = args\n if (yes !== \"-y\" && yes !== \"--yes\") return undefined\n if (spec === undefined) return undefined\n const parsed = parseExactSpec(spec)\n if (!parsed) return undefined\n\n const exists = deps?.exists ?? existsSync\n const readFile = deps?.readFile ?? ((p: string) => readFileSync(p, \"utf8\"))\n const cacheRoot =\n env[\"npm_config_cache\"] ?? env[\"NPM_CONFIG_CACHE\"] ?? join(deps?.home ?? homedir(), \".npm\")\n const installDir = join(cacheRoot, \"_npx\", npxCacheKey([spec]))\n try {\n const pkg = JSON.parse(readFile(join(installDir, \"node_modules\", parsed.name, \"package.json\"))) as {\n version?: unknown\n bin?: unknown\n }\n if (pkg.version !== parsed.version) return undefined\n const binName = binNameFromManifest(parsed.name, pkg.bin)\n if (!binName) return undefined\n const binDir = join(installDir, \"node_modules\", \".bin\")\n const binPath = join(binDir, binName)\n if (!exists(binPath)) return undefined\n return { bin: binPath, args: rest, binDir }\n } catch {\n return undefined\n }\n}\n","import { spawn, type ChildProcess } from \"node:child_process\"\nimport { randomUUID } from \"node:crypto\"\nimport { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from \"node:fs\"\nimport { tmpdir } from \"node:os\"\nimport { delimiter, dirname, join } from \"node:path\"\nimport { createDoctype } from \"@agentproto/define-doctype\"\nimport { agentCliFrontmatterSchema } from \"./schema.js\"\nimport { createAcpProtocolArm } from \"./protocol/acp-client.js\"\nimport { createPrintSession } from \"./protocol/print-arm.js\"\nimport { createProprietaryProtocolArm } from \"./protocol/proprietary.js\"\nimport { composeSpawn, RuntimeConfigError } from \"./manifest/compose.js\"\nimport { willConfineAgentCliSpawn, wrapAgentCliSpawn } from \"./command-sandbox-wrap.js\"\nimport { isolatedCredentialDataHome, prepareIsolatedStateHome } from \"./state-home.js\"\nimport { hostContextExcludes } from \"./host-context.js\"\nimport { resolveSmallModelEnv } from \"./small-model.js\"\nimport {\n mergeOpencodePermission,\n OPENCODE_SPAWN_ENFORCED_POSTURES,\n opencodePermissionForPosture,\n} from \"./opencode-permission.js\"\nimport { applySessionSkills, readSessionSkillsMetadata } from \"./session-skills.js\"\nimport { terminateChildTree } from \"./process-tree.js\"\nimport { resolveNpxFastPath } from \"./npx-fast-path.js\"\nimport { resolveWindowsBatchSpawn, windowsBatchShellOption } from \"./win32-spawn.js\"\nimport {\n applyModelCommand,\n createArmSessionControls,\n parseStderrStreamError,\n promptTurn,\n} from \"./session-controls.js\"\nimport type {\n AgentCliClient,\n AgentCliDefinition,\n AgentCliHandle,\n AgentCliRuntime,\n AgentCliRuntimeSession,\n AgentCliStartOptions,\n SetModelResult,\n StreamEvent,\n} from \"./types.js\"\n\nexport const defineAgentCli = createDoctype<AgentCliDefinition, AgentCliHandle>(\n {\n aip: 45,\n name: \"agent-cli\",\n readIdentity: (def) => def.id,\n validate(def: AgentCliDefinition) {\n const result = agentCliFrontmatterSchema.safeParse(def)\n if (!result.success) {\n throw new Error(\n `defineAgentCli (AIP-45): ${result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")}`,\n )\n }\n\n const data = result.data\n\n if (data.protocol === \"acp\" && !data.acp) {\n throw new Error(\n \"defineAgentCli (AIP-45): `acp` ref is required when protocol=acp\",\n )\n }\n if (data.protocol === \"mcp\" && !data.mcp) {\n throw new Error(\n \"defineAgentCli (AIP-45): `mcp` block is required when protocol=mcp\",\n )\n }\n if (data.protocol === \"proprietary\" && !data.adapter) {\n throw new Error(\n \"defineAgentCli (AIP-45): `adapter` package is required when protocol=proprietary\",\n )\n }\n\n if (\n data.session?.mode === \"resumable\" &&\n data.capabilities?.resumable !== true\n ) {\n throw new Error(\n \"defineAgentCli (AIP-45): session.mode=resumable requires capabilities.resumable: true\",\n )\n }\n\n if (\n data.models?.apply === \"arg\" &&\n !data.models.bin_args_template?.length\n ) {\n throw new Error(\n \"defineAgentCli (AIP-45): models.apply=\\\"arg\\\" requires models.bin_args_template\",\n )\n }\n },\n build(def: AgentCliDefinition) {\n return { ...def } as AgentCliHandle\n },\n },\n)\n\n/**\n * A manifest `bin: \"node\"` means \"run with the node that's driving THIS\n * process\" (the daemon's own `process.execPath`), not \"look up `node` on\n * the child's PATH\". A bare `spawn(\"node\", ...)` depends on PATH containing\n * a `node` entry — true in an interactive shell (nvm etc.) but NOT\n * guaranteed under launchd, which starts the daemon with a minimal PATH.\n * Resolving to `process.execPath` sidesteps PATH entirely for the one bin\n * value that always means \"this runtime\".\n *\n * `npx` / `npm` get the same treatment when possible: every Node install\n * layout (nvm, fnm, homebrew, system, Volta) ships them as siblings of the\n * `node` binary, so a daemon whose PATH lacks that dir (launchd again —\n * observed live 2026-08-30 as `spawn npx ENOENT` on a codex `agent_start`)\n * can still resolve them relative to its own `process.execPath`. Falls back\n * to the bare name (PATH lookup, prior behavior) when no sibling exists —\n * e.g. a trimmed container image exposing npx elsewhere on PATH.\n *\n * Every other bin (hermes, gemini, …) is left untouched — those are meant\n * to be resolved off PATH.\n */\nexport function resolveSpawnBin(\n bin: string,\n deps?: { execPath?: string; exists?: (p: string) => boolean },\n): string {\n const execPath = deps?.execPath ?? process.execPath\n if (bin === \"node\") return execPath\n if (bin === \"npx\" || bin === \"npm\") {\n const exists = deps?.exists ?? existsSync\n const sibling = join(\n dirname(execPath),\n process.platform === \"win32\" ? `${bin}.cmd` : bin,\n )\n if (exists(sibling)) return sibling\n }\n return bin\n}\n\n/**\n * Ensure the running node binary's directory is on the child env's PATH.\n * Resolving `npx` to an absolute sibling path (above) is necessary but not\n * sufficient: npx is a `#!/usr/bin/env node` script, so its shebang — and\n * the `node` its target package's own bin shim execs — still resolve off\n * the CHILD's PATH. Under a launchd daemon whose PATH lacks the nvm bin\n * dir, an absolute-path npx would otherwise die right after spawn.\n * APPENDED, not prepended, so an operator-supplied PATH (opts.env) keeps\n * picking its own toolchain first; this only adds a fallback.\n */\nfunction ensureExecDirOnPath(\n env: Record<string, string>,\n execPath: string = process.execPath,\n): void {\n const execDir = dirname(execPath)\n const parts = (env.PATH ?? \"\").split(delimiter).filter(Boolean)\n if (parts.includes(execDir)) return\n env.PATH = [...parts, execDir].join(delimiter)\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v)\n}\n\nfunction deepMergeJson(base: Record<string, unknown>, over: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = { ...base }\n for (const [k, v] of Object.entries(over)) {\n const prev = out[k]\n out[k] = isPlainObject(prev) && isPlainObject(v) ? deepMergeJson(prev, v) : v\n }\n return out\n}\n\n/** `over` wins; when both parse as JSON objects they are deep-merged, else `over` replaces `base`. */\nexport function mergeJsonEnvValue(base: string, over: string): string {\n try {\n const a = JSON.parse(base) as unknown\n const b = JSON.parse(over) as unknown\n if (isPlainObject(a) && isPlainObject(b)) return JSON.stringify(deepMergeJson(a, b))\n } catch {\n // not JSON — fall through to replace\n }\n return over\n}\n\nexport function createAgentCliRuntime(\n definition: AgentCliHandle,\n): AgentCliRuntime {\n return {\n definition,\n async start(opts?: AgentCliStartOptions): Promise<AgentCliRuntimeSession> {\n const cwd = opts?.cwd ?? process.cwd()\n const resolvedBin = resolveSpawnBin(definition.bin)\n // Compose final argv + env from the manifest + per-call config.\n // Mode patches and option patches land BEFORE the host-provided\n // env so an operator-set option can be observed by the CLI even\n // when the manifest also touches the same env key (operator\n // intent wins). Validation runs here too — a misconfigured\n // operator throws RuntimeConfigError before we exec anything.\n // `contextProfile` is the one decomposed axis that still has a\n // manifest-level spawn projection. Preserve an explicit legacy mode\n // for backwards compatibility; otherwise select the declared context\n // mode (for example claude-code's `lean`) without overloading posture\n // or route into `config.mode` again.\n const contextMode = opts?.contextProfile\n ? (definition.modes ?? []).find(\n mode => mode.id === opts.contextProfile && mode.kind === \"context\",\n )\n : undefined\n const config =\n opts?.config?.mode || !contextMode\n ? opts?.config\n : { ...opts?.config, mode: contextMode.id }\n const composed = composeSpawn(definition, config)\n const env: Record<string, string> = {\n ...filterStringEnv(process.env),\n ...composed.env,\n }\n // Mode-declared env scrub (AgentCliMode.env_unset): delete AFTER the\n // ambient + mode/option env are merged but BEFORE the host-provided\n // opts.env. A gateway mode (e.g. claude-code's `moonshot`) declares\n // keys that must never reach a non-native Anthropic-compatible endpoint\n // — scrubbing here is the only point where the real key is actually\n // present (compose starts from `{}` and can't delete what isn't there).\n // opts.env is applied after so an operator who explicitly forwards a\n // scrubbed key takes responsibility for it (operator intent wins).\n for (const k of composed.envUnset) delete env[k]\n\n // Deterministic billing-auth (AgentCliStartOptions.auth). MECHANICAL:\n // the runtime resolver already decided the provider, mode, env var to\n // SET, and vars to SCRUB — this driver imports no catalog/registry and\n // makes no policy choice, it just applies the resolved spec. EXPLICIT\n // credential selection, not scrub-by-absence: the credential is SET from\n // the resolver's named ref, never inferred from what's ambient.\n //\n // ENGAGE when the adapter enforces `always` (claude-code — every spawn,\n // preserving #312 fail-fast) OR the operator explicitly configured auth\n // (`explicit`). An unconfigured `when-configured` adapter (codex/hermes/\n // claude-sdk with no auth) does NOT engage → runs ambient, unchanged.\n const authSpec = opts?.auth\n let credentialDataDir: string | undefined\n // A gateway mode (moonshot/openrouter) or an explicit `auth_token`\n // option already injected ANTHROPIC_AUTH_TOKEN into composed.env for\n // Bearer auth against a non-Anthropic endpoint. Billing-auth\n // engagement must not run in that case: an `always`-enforcing adapter\n // (claude-code) would otherwise SET CLAUDE_CODE_OAUTH_TOKEN for\n // subscription mode alongside it — two credentials the claude binary\n // can't reconcile with a gateway ANTHROPIC_BASE_URL, and the resolved\n // spec's own conflictEnv scrub can't remove ANTHROPIC_AUTH_TOKEN\n // either (composed.env's own keys are protected from the blanket\n // scrub below, by design). The gateway's Bearer token wins outright —\n // skip engagement rather than let two auth mechanisms collide.\n //\n // Symmetric case: a `base_url` option (or gateway mode) can also be\n // set WITHOUT an `auth_token` — e.g. the caller forgot it, or it's\n // supplied a different way. `hasGatewayAuthToken` alone doesn't catch\n // this: `engageAuth` would still be true, and since the per-key scrub\n // loop below only deletes keys NOT already in `composed.env` (this\n // spawn's own base_url is protected there, by the same design as\n // above), nothing stops `env[authSpec.setEnv] = authSpec.credential`\n // from injecting a real Anthropic subscription credential\n // (CLAUDE_CODE_OAUTH_TOKEN) into a spawn whose ANTHROPIC_BASE_URL\n // points at a foreign host. An explicit gateway base_url must protect\n // against native creds leaking IN, exactly as an explicit gateway auth\n // token already protects against native creds leaking OUT — skip\n // engagement in both directions.\n const hasGatewayAuthToken = \"ANTHROPIC_AUTH_TOKEN\" in composed.env\n const hasGatewayBaseUrl = \"ANTHROPIC_BASE_URL\" in composed.env\n // A gateway route resolved BY THE RUNTIME couples its base_url with the\n // matching api-key credential in ONE spec — `authSpec.baseUrl` is set\n // ONLY on that path (resolveAuthSpec fills it exclusively in the gateway-\n // route branch, which forces api-key; a native/subscription spec never\n // carries a baseUrl). In that case the ANTHROPIC_BASE_URL now in\n // composed.env came from THIS very resolution — routed into the base_url\n // option alongside the credential — so engaging billing-auth is exactly\n // right: it injects the gateway bearer (ANTHROPIC_AUTH_TOKEN) that pairs\n // with it and scrubs the raw provider var. WITHOUT this the credential is\n // silently dropped (the `hasGatewayBaseUrl` skip below swallows it) and\n // the outbound request reaches the gateway UNAUTHENTICATED → the real\n // upstream 401s → \"Authentication required\" (the P0 bug). The skip guard\n // still fires for the DIFFERENT case it exists for: a base_url set\n // MANUALLY via option paired with a NATIVE spec (no `authSpec.baseUrl`),\n // where engaging would leak a native credential to a foreign host.\n const resolverCoupledGateway = authSpec?.baseUrl !== undefined\n const engageAuth =\n !!authSpec &&\n !hasGatewayAuthToken &&\n (resolverCoupledGateway || !hasGatewayBaseUrl) &&\n (authSpec.enforce === \"always\" || authSpec.explicit === true)\n if (authSpec && engageAuth) {\n // Scrub the conflicting credential(s)/toggles BEFORE setting this\n // mode's own credential. A key this spawn's own mode/option patch\n // explicitly SET (e.g. a gateway preset's ANTHROPIC_BASE_URL) wins\n // over the blanket scrub — composed.env is the record of keys this\n // spawn's own config explicitly assigned.\n for (const key of authSpec.unsetEnv) {\n if (!(key in composed.env)) delete env[key]\n }\n // File-based (external) subscription — codex/gemini: the CLI reads its\n // OWN local-login file (`~/.codex/auth.json`, …), so there is no bearer\n // to inject and no credential to fail-fast on. The scrub above (the\n // api-key vars) is the whole job: it stops a leftover OPENAI_API_KEY /\n // GEMINI_API_KEY from silently flipping the CLI to api-key billing under\n // a \"subscription\" label. Money-safe by construction — NOTHING is set\n // into any env var, so an OAuth bearer can never land in an api-key\n // channel. The host already verified the login is present (fail-loud)\n // before resolving this spec.\n // An external subscription stops here: the scrub above is the entire\n // effect. Only the inject-a-credential path continues below.\n if (!authSpec.externalCredential) {\n // Fail-fast: the credential is resolved by the HOST from a named\n // config/store ref, never read ambiently — if it didn't resolve,\n // refuse the spawn rather than silently falling back to another or an\n // ambient credential. Checked against the RESOLVED credential, not the\n // merged env, so an unrelated `opts.env` key can't paper over a\n // genuinely missing one. Message NAMES the fix instead of reciting\n // prose (kept short — the old wall-of-text overflowed the VS Code\n // notification box): when `neitherConfigured` is set, `mode` above is\n // an arbitrary fallback pick, not a real signal — a zero-credential\n // user must see BOTH paths, not just the one preference[0] happened\n // to land on (that was the bug: an api-key-only user told to buy a\n // subscription).\n // A resolved CREDENTIAL is what this path injects; the box-login\n // bridge marker (`authSpec.loginFile`, see\n // `AgentCliAuthSubscription.boxLogin`) means the credential is a FILE\n // the host already uploaded into the box — so there is no bearer to\n // inject and, deliberately, NO missing-credential fail-fast either:\n // the file beside the spawn is what bills. Only reachable when the\n // spec's runtime did not also set `externalCredential` (which stops\n // above) — the belt-and-braces that keeps a host/box version skew\n // from failing a spawn whose login file IS present. With NEITHER,\n // today's fail-loud behavior is untouched.\n if (authSpec.credential === undefined && !authSpec.loginFile) {\n const slug = definition.id\n const providerLabel = definition.provider ?? \"<provider>\"\n const configBlock =\n `{\"defaults\":{\"adapters\":{\"${slug}\":{\"auth\":{\"mode\":\"api-key\"}}}}}` +\n ` in ~/.agentproto/config.json`\n const storeHint = authSpec.ignoredApiKeyInStore\n ? ` (providers.json already has a stored key for ${providerLabel} — ignored until that block exists)`\n : \"\"\n const supportsSub = !!definition.authSubscription\n const message =\n authSpec.neitherConfigured && supportsSub\n ? `agent-cli '${slug}': no billing auth. Subscription → \\`claude setup-token\\`. ` +\n `Api-key → \\`agentproto auth provider set ${providerLabel} sk-…\\`${storeHint}. ` +\n `Add ${configBlock}. Never inherited from the shell.`\n : authSpec.mode === \"subscription\"\n ? `agent-cli '${slug}': run \\`claude setup-token\\` and configure the result — ` +\n `bills the Max/Pro subscription, not API credits. Never inherited from the shell.`\n : `agent-cli '${slug}': run \\`agentproto auth provider set ${providerLabel} sk-…\\`` +\n `${storeHint}, then add ${configBlock}. Never inherited from the shell.`\n throw new RuntimeConfigError(\"missing_auth_credential\", \"opts.auth.credential\", message)\n }\n // Everything below is keyed to an INJECTED credential — a login-file\n // spawn has none and must not be steered into a login-less data home\n // (that would HIDE the very file this spawn bills through).\n if (authSpec.credential !== undefined) {\n env[authSpec.setEnv] = authSpec.credential\n if (authSpec.extraEnv) {\n for (const [key, value] of Object.entries(authSpec.extraEnv)) {\n // A mode (e.g. a lean context profile) may already carry a JSON config\n // under the same key; layer the credential's block over it rather\n // than clobbering it. Ambient env is never merged in.\n env[key] = key in composed.env ? mergeJsonEnvValue(composed.env[key]!, value) : value\n }\n }\n // A CLI whose own stored login (opencode's console account in its\n // data dir) overrides an env credential gets a login-less data dir\n // for exactly this credential-injecting spawn, so the credential it\n // was handed is the one that bills.\n if (definition.credentialDataHome && authSpec.isolateDataHome !== false) {\n credentialDataDir = isolatedCredentialDataHome(opts?.configDir)\n env[definition.credentialDataHome.env] = credentialDataDir\n }\n }\n }\n }\n\n Object.assign(env, opts?.env ?? {})\n // After every env layer, so an inline config any of them carries (lean\n // mode, a console-org block, the host's own) is merged into — and a\n // `small_model` it already sets wins. See `small-model.ts`.\n const smallModelEnv = resolveSmallModelEnv(definition.smallModel, {\n model: config?.options?.model,\n ...(config?.options ? { options: config.options } : {}),\n env,\n cwd,\n })\n if (smallModelEnv) Object.assign(env, smallModelEnv)\n // ── System-prompt channel (AgentCliDefinition.systemPrompt) ──────\n // `inline-config` layers the text into the CLI's inline JSON config env\n // var — AFTER the small-model pin above so this merge lands on the final\n // JSON. `shape: \"file-list\"` writes the text into the session's config\n // dir and appends that file's absolute path to the `key` array (opencode\n // concatenates `instructions` arrays across config layers, so an existing\n // array is extended, never replaced); no config dir ⇒ a private temp\n // dir. `shape: \"text\"` sets `key` to the text\n // itself, \"\\n\\n\"-joined after any existing string value (codex\n // `developer_instructions`) and needs no config dir. An unparseable\n // existing value is left untouched (same stance as `small-model.ts`: the\n // CLI complains about its own broken config) and the dropped text warned.\n // `env-file` writes the same file and points the declared env var at its\n // absolute path (hermes' agentproto plugin reads\n // `AGENTPROTO_SYSTEM_PROMPT_FILE`).\n const systemPromptDecl = definition.systemPrompt\n // A private temp dir holding the file-list text when the host gave no\n // config dir — removed with the session (see `close()` below).\n let systemPromptTmpDir: string | undefined\n const systemPromptText = opts?.appendSystemPrompt\n // Write the system-prompt text to `<config dir>/agentproto-system-prompt.md`\n // — or a private temp dir when the host gave no config dir (tracked in\n // `systemPromptTmpDir` for removal in `close()`) — and return the file's\n // absolute path. Shared by the `inline-config` file-list shape and the\n // `env-file` channel.\n const writeSystemPromptFile = (text: string): string => {\n const dir =\n opts?.configDir ??\n (systemPromptTmpDir = mkdtempSync(join(tmpdir(), \"agentproto-system-prompt-\")))\n mkdirSync(dir, { recursive: true })\n const file = join(dir, \"agentproto-system-prompt.md\")\n writeFileSync(file, text)\n return file\n }\n if (systemPromptText && systemPromptDecl?.via === \"inline-config\") {\n const isFileList = systemPromptDecl.shape === \"file-list\"\n let payload: string | undefined\n if (isFileList) {\n // The session's config dir when the host gave one; otherwise a\n // private temp dir — the runtime already counted on this channel\n // (no prefix fallback), so the text must land somewhere.\n payload = writeSystemPromptFile(systemPromptText)\n } else {\n payload = systemPromptText\n }\n if (payload !== undefined) {\n const prior = env[systemPromptDecl.env]\n let inline: Record<string, unknown> | undefined\n if (prior === undefined || prior === \"\") {\n inline = {}\n } else {\n try {\n const parsed: unknown = JSON.parse(prior)\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n inline = parsed as Record<string, unknown>\n }\n } catch {\n // Not JSON — leave the value for the CLI to complain about.\n }\n if (!inline) {\n // The runtime already skipped its prefix fallback for this\n // channel, so a dropped text must at least be said out loud.\n console.warn(\n `[agent-cli] system prompt: ${systemPromptDecl.env} is not a JSON object — ` +\n \"the AGENT.md system-prompt text is not delivered to this session.\",\n )\n }\n }\n if (inline) {\n const existing = inline[systemPromptDecl.key]\n inline[systemPromptDecl.key] = isFileList\n ? Array.isArray(existing)\n ? [...existing, payload]\n : [payload]\n : typeof existing === \"string\" && existing.length > 0\n ? `${existing}\\n\\n${payload}`\n : payload\n env[systemPromptDecl.env] = JSON.stringify(inline)\n }\n }\n }\n // `env-file`: the same file the file-list shape writes, with the\n // declared env var set to its absolute path (hermes' agentproto plugin\n // reads `AGENTPROTO_SYSTEM_PROMPT_FILE`; one `hermes acp` process per\n // session, so the path always reaches the plugin). `maxChars` is the\n // runtime's budget to check BEFORE the spawn — never a driver-side\n // truncation (a silent cut would change the agent's instructions).\n if (systemPromptText && systemPromptDecl?.via === \"env-file\") {\n env[systemPromptDecl.env] = writeSystemPromptFile(systemPromptText)\n }\n // opencode advertises no native `bypass`/`accept-edits`/`read-only`\n // mode, so the runtime's only path for those was the advisory prompt\n // preamble. Enforce them instead through the session's own inline\n // config (OPENCODE_CONFIG_CONTENT, the per-session top layer — the\n // user's opencode config files are never touched), the opencode\n // counterpart of claude-code's isolated `permissions.defaultMode`\n // below. Last inline-config write, so it lands on the final JSON. See\n // `opencode-permission.ts` for the mapping and its limits.\n const opencodePermission =\n definition.id === \"opencode\" ? opencodePermissionForPosture(opts?.posture) : undefined\n if (opencodePermission) {\n env.OPENCODE_CONFIG_CONTENT = mergeOpencodePermission(\n env.OPENCODE_CONFIG_CONTENT,\n opencodePermission,\n \"OPENCODE_CONFIG_CONTENT\",\n )\n }\n // After ALL env layers (ambient, mode/option patches, billing-auth,\n // opts.env) so the append lands on the final PATH — see the helper's\n // doc for why even an absolute-path npx needs this.\n ensureExecDirOnPath(env)\n // Pinned `npx -y pkg@x.y.z` already in the npx cache ⇒ exec the cached\n // bin directly; npm's own pre-run tree scans made spawns wait minutes\n // behind unrelated disk load (see `resolveNpxFastPath`'s doc).\n const npxFast = resolveNpxFastPath(resolvedBin, composed.binArgs, env)\n if (npxFast) {\n // Runs AFTER ensureExecDirOnPath, so this only adds to its append —\n // matches what npx itself would have put first on the child's PATH.\n env.PATH = [npxFast.binDir, ...(env.PATH ?? \"\").split(delimiter).filter(Boolean)].join(delimiter)\n }\n const spawnBin = npxFast?.bin ?? resolvedBin\n let spawnArgs = npxFast?.args ?? composed.binArgs\n // `systemPrompt.via: \"argv\"`: the flag rides THIS process's argv, so it\n // lands on every spawn — a native-resume cold start recomposes bin_args\n // the same way, so resume is covered by construction. A `proprietary`\n // arm builds its own argv in its client (pi's `client.ts`) and is handed\n // the text through `connect` below instead; it never spawns here.\n if (\n systemPromptText &&\n systemPromptDecl?.via === \"argv\" &&\n definition.protocol !== \"proprietary\"\n ) {\n spawnArgs = [...spawnArgs, systemPromptDecl.flag, systemPromptText]\n }\n // Win32 batch-file shims (see `win32-spawn.ts`'s module doc — recap\n // point 10, the Windows-host device-sandbox `spawn EINVAL`): rewrite\n // npm `.cmd` shims to their real node entry (preferred, stays\n // shell:false) BEFORE the arms spawn, so both arms inherit a clean\n // argv; whatever still ends in `.cmd`/`.bat` gets `shell: true`\n // inside the arm via `windowsBatchShellOption`.\n const batchRewrite = resolveWindowsBatchSpawn(spawnBin, spawnArgs)\n const finalBin = batchRewrite?.bin ?? spawnBin\n const finalArgs = batchRewrite?.args ?? spawnArgs\n\n // Exact-file read grant (`AgentCliStartOptions.additionalReadPaths`):\n // the runtime hands down the exact AGENTS.md path(s) an inherited\n // pointer prompt names (see `session-spawn.ts`'s\n // `additionalReadPathsForAgentsMd`). Derive the child env var adapters\n // read (`AGENTPROTO_ADDITIONAL_READ_PATHS`, a JSON array) HERE, from\n // this one option as the single authority, so BOTH arms — ACP and\n // print — carry it. Read-only by contract; nothing here widens writes.\n if (opts?.additionalReadPaths?.length) {\n env.AGENTPROTO_ADDITIONAL_READ_PATHS = JSON.stringify(opts.additionalReadPaths)\n }\n\n // claude-code's ACP wrapper never reads `--permission-mode` from argv\n // (the `bin_args_append` above is a no-op against it) — it resolves\n // `permissions.defaultMode` exclusively via `CLAUDE_CONFIG_DIR`/\n // `<cwd>/.claude/settings(.local).json`, merged through the SDK's\n // `resolveSettings`. Point a per-session `CLAUDE_CONFIG_DIR` at a\n // throwaway temp dir carrying just that one field, so a non-default\n // requested mode (e.g. \"plan\") actually takes effect without ever\n // touching the target repo's own `.claude` directory. A repo that\n // commits its own escalated `permissions.defaultMode` can still\n // defeat this (see resolveClaudeCodePermissionMode's doc) — that's a\n // documented limitation, not a bug in this override.\n const permissionMode = resolveClaudeCodePermissionMode(\n definition,\n opts?.posture,\n config?.mode,\n )\n // Isolation from ambient config must NOT be conditional on a\n // requested posture/mode — a caller that never passes `posture` (the\n // common case: `agent_start` / `spawnAgentSession` with no opinion on\n // permission posture) used to get NO `CLAUDE_CONFIG_DIR` override at\n // all, so the child inherited the DAEMON's own `process.env` and,\n // through it, the operator's real `~/.claude.json` — including every\n // globally-registered MCP server (e.g. an `agentproto` MCP entry\n // pointing right back at this same daemon's `agent_start`, letting an\n // unscoped one-shot worker spawn further unscoped children on its\n // own). Confirmed in production 2026-08-07: a batch worker\n // (`pmlawhub/tools/fiches/run-lane.sh`) self-spawned dozens of\n // uncontrolled child sessions this way. Verified by reading\n // `@anthropic-ai/claude-agent-sdk`'s bundled `sdk.mjs` directly: the\n // SDK resolves its GLOBAL config file (the one carrying `mcpServers`)\n // as `$CLAUDE_CONFIG_DIR/.claude.json` (falling back to\n // `$CLAUDE_CONFIG_DIR/.config.json` if present) — never the real\n // `~/.claude.json` once `CLAUDE_CONFIG_DIR` is set to anything else.\n // So isolating every claude-code spawn through this path, regardless\n // of whether a posture/mode was requested, closes the leak; only the\n // settings.json CONTENT (permissions.defaultMode) stays conditional\n // on `permissionMode` actually resolving to something.\n const isolateClaudeCodeConfig = definition.id === \"claude-code\"\n // Hoisted out of the `if` below so it's visible to the commandSandbox\n // wrap further down: bwrap's `--tmpfs /tmp` (`command-sandbox.ts`)\n // would otherwise HIDE this dir on Linux since it's mkdtemp'd under\n // `os.tmpdir()` BEFORE the confined spawn — it must ride along as an\n // extraWritePaths entry, not rely on the workspace bind.\n let claudeConfigDir: string | undefined\n if (isolateClaudeCodeConfig) {\n // `opts.configDir` (AgentCliStartOptions.configDir) makes the\n // isolated dir PERSISTENT instead of throwaway: the caller picks a\n // stable path (the daemon keys it per session lineage) so the SDK's\n // own conversation store — `projects/<cwd-slug>/<uuid>.jsonl`, the\n // thing `resumeSessionId` needs to find — survives adapter respawns.\n // A fresh mkdtemp per spawn is why a reaped-then-resumed session\n // used to lose native resume: the transcript sat in the previous\n // process's temp dir, and the new one minted an empty dir. The\n // isolation content below is written either way — the ISOLATION\n // invariant lives in the files, not in the dir being temporary.\n if (opts?.configDir) {\n claudeConfigDir = opts.configDir\n mkdirSync(claudeConfigDir, { recursive: true })\n } else {\n claudeConfigDir = mkdtempSync(\n join(tmpdir(), \"agentproto-claude-config-\"),\n )\n }\n // Explicit empty `mcpServers` rather than just leaving the global\n // config file absent — an absent file falls back to whatever the\n // SDK treats as \"fresh install\" defaults, which is unspecified and\n // could change; writing it makes the isolation load-bearing on our\n // own content, not on unverified fallback behavior. On a REUSED\n // persistent dir, preserve the SDK's own accumulated state (project\n // trust, onboarding flags — it rewrites this file itself) but\n // RE-ASSERT `mcpServers: {}` every spawn: a session that ran\n // `claude mcp add` mid-conversation must not smuggle that server\n // back into its next respawn — same ambient-leak surface the\n // temp-dir isolation closed (#824).\n const globalConfigPath = join(claudeConfigDir, \".claude.json\")\n let priorGlobalConfig: Record<string, unknown> = {}\n try {\n const parsed: unknown = JSON.parse(readFileSync(globalConfigPath, \"utf8\"))\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n priorGlobalConfig = parsed as Record<string, unknown>\n }\n } catch {\n // absent or unparseable — start from the empty baseline\n }\n writeFileSync(\n globalConfigPath,\n JSON.stringify({ ...priorGlobalConfig, mcpServers: {} }),\n )\n // Isolating CLAUDE_CONFIG_DIR also shadows the operator's real\n // `~/.claude/settings.json` — including `attribution`, the key an\n // operator sets to suppress Claude Code's own default \"🤖 Generated\n // with Claude Code\" PR-body footer / `Co-authored-by: Claude` commit\n // trailer. A spawned session has no ambient settings.json to fall\n // back to at all once isolated, so it reverts to those CLI defaults\n // regardless of what's configured globally — confirmed on\n // agentproto/ts PR #837, opened after this isolation went\n // unconditional (#824), which carried the footer despite the\n // spawning operator's global settings disabling it. Bake the\n // suppression into every isolated settings.json unconditionally\n // rather than reading the real file back in: that would reopen\n // exactly the ambient-leak surface this isolation exists to close,\n // and make spawn output depend on whatever happens to be in the\n // runner's home dir.\n const isolatedSettings: Record<string, unknown> = {\n attribution: { commit: \"\", pr: \"\", sessionUrl: false },\n }\n const isolatedPermissions: Record<string, unknown> = {}\n if (permissionMode) isolatedPermissions.defaultMode = permissionMode\n if (opts?.fsZones?.writable.length) {\n // The OS sandbox already allows these; registering them keeps the\n // harness from prompting on (or refusing) a write it can't tell is\n // in-bounds — the run workspace sits outside the app-dir cwd.\n isolatedPermissions.additionalDirectories = opts.fsZones.writable\n }\n if (Object.keys(isolatedPermissions).length > 0) {\n isolatedSettings.permissions = isolatedPermissions\n }\n if (opts?.isolateHostContext) {\n isolatedSettings.claudeMdExcludes = hostContextExcludes(cwd)\n }\n writeFileSync(\n join(claudeConfigDir, \"settings.json\"),\n JSON.stringify(isolatedSettings),\n )\n env.CLAUDE_CONFIG_DIR = claudeConfigDir\n }\n\n // ── Per-session skill delivery (skill imports) ──────────────────\n // Copy each resolved imported skill into the session's isolated config\n // dir where this adapter's harness discovers it natively. The location\n // (and any env var naming it) comes from the manifest's\n // `metadata.sessionSkills`; an adapter without it gets no delivery.\n // Base dir: the claude-code isolation dir when that exists (its\n // `CLAUDE_CONFIG_DIR` IS the session dir), else the caller's\n // `opts.configDir` (the daemon always passes one for a real spawn).\n const sessionSkillsMeta = readSessionSkillsMetadata(definition.metadata)\n const sessionSkillsBase = claudeConfigDir ?? opts?.configDir\n let sessionSkillsTargetDir: string | undefined\n if (sessionSkillsMeta && opts?.sessionSkills?.length && sessionSkillsBase) {\n const applied = applySessionSkills({\n skills: opts.sessionSkills,\n meta: sessionSkillsMeta,\n baseDir: sessionSkillsBase,\n env,\n })\n sessionSkillsTargetDir = applied.targetDir\n // Delivery is additive — a single broken skill must not sink the spawn.\n for (const warning of applied.warnings) {\n console.warn(`[agent-cli] session skills: ${warning}`)\n }\n }\n\n // A CLI that keeps mutable state under `$HOME` (codex: `~/.codex`) can't\n // start once the OS sandbox denies `$HOME` — give a confined spawn its\n // own home instead of opening the operator's (see `state-home.ts`).\n const extraWritePaths = claudeConfigDir ? [claudeConfigDir] : []\n if (credentialDataDir) extraWritePaths.push(credentialDataDir)\n if (sessionSkillsTargetDir) extraWritePaths.push(sessionSkillsTargetDir)\n if (\n definition.stateHome &&\n definition.protocol !== \"proprietary\" &&\n (await willConfineAgentCliSpawn({ mode: opts?.commandSandbox, cwd, zones: opts?.fsZones }))\n ) {\n const isolated = prepareIsolatedStateHome(definition.stateHome, {\n ...(opts?.configDir ? { configDir: opts.configDir } : {}),\n env,\n })\n env[definition.stateHome.env] = isolated.dir\n extraWritePaths.push(...isolated.writePaths)\n }\n\n // The print arm spawns a fresh subprocess per turn — no\n // long-lived child, no AgentCliClient connect/events cycle.\n // Short-circuit here so buildProtocolArm is never called for it.\n if (definition.protocol === \"print\") {\n // Derived-from-model guard, print flavor: hand the arm the\n // explicitly requested model so it can abort a turn whose wire\n // `start` event names a DIFFERENT model — jcode's CLI silently\n // falls back to its own default on an unknown `--model` id, which\n // for a derived-from-model adapter is a different provider on a\n // different bill (same contract as the ACP-arm guard below; see\n // PrintArmOptions.expectedModel).\n const printModel = config?.options?.model\n return createPrintSession({\n bin: finalBin,\n baseArgs: finalArgs,\n cwd,\n env,\n ...(opts?.resumeSessionId\n ? { resumeSessionId: opts.resumeSessionId }\n : {}),\n ...(opts?.mcpServers ? { mcpServers: opts.mcpServers } : {}),\n printConfig: definition.print,\n commandSandbox: opts?.commandSandbox,\n ...(opts?.fsZones ? { fsZones: opts.fsZones } : {}),\n ...(extraWritePaths.length ? { extraWritePaths } : {}),\n // Exact-file read grant — see the ACP arm's wrapAgentCliSpawn call.\n ...(opts?.additionalReadPaths?.length\n ? { extraReadPaths: opts.additionalReadPaths }\n : {}),\n ...(definition.routeSelection === \"derived-from-model\" && printModel\n ? { expectedModel: String(printModel) }\n : {}),\n })\n }\n\n // `proprietary` arms are not guaranteed to own a subprocess at all\n // (e.g. an in-process SDK integration) — `buildProtocolArm` decides\n // per-protocol whether `child` is required. Skip the spawn entirely\n // for `proprietary` so an in-process arm pays no subprocess cost.\n let child: ChildProcess | undefined\n const stderrBuf: string[] = []\n // Live subscribers to the child's stderr lines — `promptTurn` attaches\n // one for the duration of a turn to surface provider errors that exist\n // only on stderr (opencode's silent `stream error` retry loop). Set\n // below; empty for arms that spawn no child.\n const stderrLineListeners = new Set<(line: string) => void>()\n if (definition.protocol !== \"proprietary\") {\n // OS-level confinement (`AgentCliStartOptions.commandSandbox`):\n // wraps THIS spawn's argv through the same Seatbelt/bwrap backends\n // `command_execute` already uses (`@agentproto/command-sandbox`),\n // so the adapter's own process tree — not just its reported tool\n // calls — is denied out-of-workspace reads/writes. Off by default;\n // see `wrapAgentCliSpawn`'s doc for the fail-closed contract.\n const [execBin, execArgs] = await wrapAgentCliSpawn(\n finalBin,\n finalArgs,\n {\n mode: opts?.commandSandbox,\n cwd,\n ...(opts?.fsZones ? { zones: opts.fsZones } : {}),\n ...(extraWritePaths.length ? { extraWritePaths } : {}),\n // Exact-file read grant (see additionalReadPaths above):\n // READ-only exceptions to the confinement boundary, never writes.\n ...(opts?.additionalReadPaths?.length\n ? { extraReadPaths: opts.additionalReadPaths }\n : {}),\n label: definition.id,\n },\n )\n const spawned = spawn(execBin, execArgs, {\n cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n signal: opts?.signal,\n // Win32: a `.cmd`/`.bat` bin that `resolveWindowsBatchSpawn`\n // couldn't rewrite to its node entry needs the shell — Node\n // refuses to spawn batch files directly (CVE-2024-27980, the\n // recap-10 `spawn EINVAL`). POSIX: `{}` — unchanged.\n ...windowsBatchShellOption(execBin),\n })\n child = spawned\n\n // Attached synchronously, before any `await` below, so a spawn\n // failure (bad binary, PATH missing the target under a minimal\n // launchd env, …) is always observed by a listener. Node throws\n // an UNHANDLED exception — crashing this ENTIRE process, every\n // session on the box, not just this spawn — when a ChildProcess\n // emits 'error' with nobody listening. Confirmed live 2026-08-11:\n // a launchd-started daemon (PATH without the interactive shell's\n // nvm setup) hit `spawn('node') ENOENT` from an `app_run` →\n // mastra-agent spawn with no 'error' listener anywhere on the\n // chain, taking down every running session. Race 'spawn' vs\n // 'error' and turn a failure into a normal rejection instead —\n // the caller (`session-spawn.ts` / `app_run`) already turns a\n // rejected `start()` into a clean `{ok:false, message}` result.\n let spawnFailure: Error | undefined\n await new Promise<void>(resolve => {\n spawned.once(\"spawn\", () => resolve())\n spawned.once(\"error\", err => {\n spawnFailure = err\n resolve()\n })\n })\n if (spawnFailure) {\n const isEnoent =\n (spawnFailure as NodeJS.ErrnoException).code === \"ENOENT\"\n // Node reports a nonexistent WORKING DIRECTORY as the byte-identical\n // `spawn <bin> ENOENT` it uses for a missing binary — a stale\n // workspace path masquerades as \"npx is not installed\" and sends\n // whoever reads the error down the wrong trail. Disambiguate here,\n // where the failure is in hand, rather than preflighting every\n // start: the cwd probe only runs on the already-failed path.\n const cwdMissing = isEnoent && !existsSync(cwd)\n const enoentHint = !isEnoent\n ? \"\"\n : cwdMissing\n ? `\\ncwd '${cwd}' does not exist — Node reports a missing working directory with this same ENOENT. Recreate the directory, or pass a valid cwd/workspace (is the workspace path stale, or its worktree removed?).`\n : `\\n'${execBin}' was not found on the daemon's PATH. If it works in your own terminal, the daemon's environment may be stale — restart the daemon from a shell where \\`which ${definition.bin}\\` resolves (\\`agentproto daemon restart\\`).`\n throw new Error(\n `agent-cli '${definition.id}': failed to spawn '${execBin} ${execArgs.join(\" \")}': ${spawnFailure.message}${enoentHint}`,\n )\n }\n // The spawn itself succeeded — keep a listener attached for the\n // rest of the child's life so a LATER 'error' (e.g. a broken\n // pipe) never goes unhandled either.\n spawned.on(\"error\", err => {\n stderrBuf.push(`[spawn error] ${err.message}`)\n })\n\n // Drain child.stderr — without this the kernel pipe buffer\n // (~64 KB on macOS / Linux) eventually fills up and blocks the\n // child mid-write, hanging the entire ACP exchange. Buffer the\n // last few KB so a downstream error event can attach the tail\n // for debugging — adapters like claude-agent-acp print useful\n // context here (\"not authenticated\", \"model gated\") that the\n // JSON-RPC reply would otherwise reduce to \"Invalid params\".\n const STDERR_KEEP_LINES = 80\n child.stderr?.setEncoding(\"utf8\")\n child.stderr?.on(\"data\", (chunk: string) => {\n for (const line of chunk.split(/\\r?\\n/)) {\n if (!line) continue\n stderrBuf.push(line)\n if (stderrBuf.length > STDERR_KEEP_LINES) stderrBuf.shift()\n for (const listener of stderrLineListeners) listener(line)\n }\n })\n }\n\n const arm = await buildProtocolArm(\n definition,\n child,\n cwd,\n config?.mode,\n opts?.permissionHold ?? false,\n )\n arm._stderrTail = () => stderrBuf.join(\"\\n\")\n arm._onStderrLine = listener => {\n stderrLineListeners.add(listener)\n return () => stderrLineListeners.delete(listener)\n }\n\n const abortController = new AbortController()\n if (opts?.signal) {\n opts.signal.addEventListener(\"abort\", () => abortController.abort(), {\n once: true,\n })\n }\n // Extract model + effort from the config options so the protocol\n // arm can apply them via ACP session/set_config_option — the ACP\n // wrapper (claude-agent-acp) does not read its own CLI args and\n // forward them to claude, so bin_args_template alone is not\n // sufficient. The compose step still adds them to binArgs as a\n // best-effort fallback for non-ACP arms.\n const optModel = config?.options?.model\n const optEffort = config?.options?.effort\n // Model-selection strategy (AgentCliModels.apply, default \"config\"):\n // \"config\" → apply via ACP session config (set_config_option) at\n // connect — works for claude-code.\n // \"command\" → the ACP session config is a no-op on this agent\n // (e.g. hermes silently keeps its own default), so we\n // DON'T pass model to connect; instead we send a\n // `/model <id>` control turn after newSession (below).\n // \"arg\" → this CLI takes its model as a CLI argument, already\n // composed into binArgs by compose.ts before spawn — we DON'T pass\n // model to connect() at all, same as \"command\".\n const modelApply = definition.models?.apply ?? \"config\"\n const configModel =\n optModel && modelApply === \"config\" ? String(optModel) : undefined\n // Mode-selection strategy (AgentCliMode.apply, default \"bin_args\"):\n // \"bin_args\" → the mode's argv/env patch (already composed above)\n // is how the CLI picks the mode — no ACP config to send.\n // \"config\" → the CLI has no argv/env surface for this mode (e.g.\n // opencode's plan/build); compose.ts already skipped its\n // bin_args/env, so forward the mode id to the ACP arm's\n // connect({mode}) instead, applied via\n // session/set_config_option(configId:\"mode\").\n const requestedModeId = config?.mode\n const requestedModeDecl = requestedModeId\n ? (definition.modes ?? []).find(m => m.id === requestedModeId)\n : undefined\n const configMode =\n requestedModeDecl?.apply === \"config\" ? requestedModeId : undefined\n // Caller-supplied override wins; otherwise fall back to the\n // manifest's declared default (if any) so an adapter known to drop\n // responses (e.g. hermes) gets watchdog protection without every\n // host having to opt in per spawn.\n const turnIdleTimeoutMs =\n opts?.turnIdleTimeoutMs ?? definition.session?.turn_idle_timeout_ms\n // Which system-prompt channels reach the arm THROUGH connect():\n // `acp-meta` (the arm forwards it as `_meta.systemPrompt.append` on BOTH\n // newSession and loadSession — native-resume re-reads it on every cold\n // spawn) and `argv` on a `proprietary` arm (its client owns the argv and\n // pushes the manifest's flag itself). `inline-config` already landed in\n // `env` above, and a non-proprietary `argv` in the spawn args.\n const connectSystemPrompt =\n systemPromptText !== undefined &&\n (systemPromptDecl?.via === \"acp-meta\" ||\n (systemPromptDecl?.via === \"argv\" && definition.protocol === \"proprietary\"))\n ? systemPromptText\n : undefined\n await arm.connect({\n cwd,\n env,\n abortSignal: abortController.signal,\n ...(opts?.resumeSessionId\n ? { resumeSessionId: opts.resumeSessionId }\n : {}),\n ...(opts?.mcpServers ? { mcpServers: opts.mcpServers } : {}),\n ...(configModel ? { model: configModel } : {}),\n ...(optEffort ? { effort: String(optEffort) } : {}),\n ...(configMode ? { mode: configMode } : {}),\n // Channel decision above: `acp-meta` (the arm's `_meta.systemPrompt`)\n // or a `proprietary` arm's own `argv` push.\n ...(connectSystemPrompt !== undefined\n ? { appendSystemPrompt: connectSystemPrompt }\n : {}),\n ...(opts?.onActivity ? { onActivity: opts.onActivity } : {}),\n ...(turnIdleTimeoutMs !== undefined ? { turnIdleTimeoutMs } : {}),\n ...(opts?.permissionHold ? { permissionHold: true } : {}),\n })\n\n // Derived-from-model guard: when the ACP server REJECTED the\n // connect-time model apply, the session is alive but on the agent's\n // own default model. For a free/fixed-routing adapter that's a\n // tolerable degradation (the route and bill don't change — keep\n // agentproto#186's warn-and-continue). For a\n // routeSelection:\"derived-from-model\" adapter (opencode, mastracode,\n // hermes, jcode) the model id IS the route: \"kept the default\" means\n // a DIFFERENT provider on a DIFFERENT bill than the operator named\n // (observed live: opencode spawned with a claude-code-style\n // `…@openrouter` id silently ran anthropic/claude-sonnet-4-5).\n // That's a misroute, not a preference — refuse the spawn loudly,\n // with the server's own reason and the id shape this adapter needs.\n if (\n configModel &&\n definition.routeSelection === \"derived-from-model\" &&\n arm.modelApplyRejection\n ) {\n const { requested, reason } = arm.modelApplyRejection\n await arm.close().catch(() => {})\n if (child && !child.killed) child.kill(\"SIGTERM\")\n throw derivedModelRefusalError(definition, requested, reason)\n }\n\n // \"command\" model strategy: switch the model via a drained `/model\n // <id>` control turn. Best-effort for free/fixed-routing adapters — a\n // failure is warned, never fatal, so the session still starts (on the\n // agent's default model). For a derived-from-model adapter (hermes is\n // the command-apply case today) the SAME guard as the config path\n // above applies: an unacknowledged/failed switch means the session is\n // on a model — and a bill — the operator didn't name, so refuse the\n // spawn instead of continuing silently.\n if (optModel && modelApply === \"command\") {\n const commandResult = await applyModelCommand(arm, String(optModel))\n if (\n !commandResult.applied &&\n definition.routeSelection === \"derived-from-model\"\n ) {\n await arm.close().catch(() => {})\n if (child && !child.killed) child.kill(\"SIGTERM\")\n throw derivedModelRefusalError(\n definition,\n String(optModel),\n commandResult.reason ?? \"model switch not acknowledged\",\n )\n }\n }\n\n // Prefer the protocol-layer session id (ACP, etc.) so the host\n // can persist it for a future native-resume. Fall back to a\n // random UUID for protocols that don't model sessions — keeps\n // the field always-populated for downstream loggers.\n const sessionId = arm.sessionId ?? randomUUID()\n\n // The turn `cancel()` acts on. `send()` mints a fresh id per turn and\n // dropped it on the floor, which left `cancel()` with nothing to name —\n // see its comment below.\n let currentTurnId: string | undefined\n\n return {\n sessionId,\n pid: child?.pid,\n // Transport liveness, delegated to the arm (see the fields' docs on\n // AgentCliRuntimeSession). An arm that models no long-lived\n // connection reports nothing, which reads as \"connected\" — there is\n // no stream for it to have lost, and nothing to subscribe to.\n isConnected: () => arm.isConnected?.() ?? true,\n ...(arm.onDisconnect\n ? { onDisconnect: (listener: (err: Error) => void) => arm.onDisconnect!(listener) }\n : {}),\n // Live model/mode/effort switches + the capability read-surface,\n // all pure arm delegation — shared with every host that builds\n // its own session over another transport. See session-controls.ts.\n // Snapshotted after `arm.connect()` above resolved.\n ...createArmSessionControls(arm, definition),\n ...(spawnEnforcedPostures(definition).length > 0\n ? { spawnEnforcedPostures: spawnEnforcedPostures(definition) }\n : {}),\n send(message): AsyncIterable<StreamEvent> {\n const turnId = randomUUID()\n currentTurnId = turnId\n // opencode's ACP server swallows provider 429/usage-cap errors\n // into an internal retry loop and never resolves `prompt`; its\n // structured `stream error` stderr line is the only signal. Arm\n // the parser for opencode only — other adapters keep the prior\n // behavior untouched.\n const stderrTurnError =\n definition.id === \"opencode\" ? parseStderrStreamError : undefined\n return promptTurn(arm, turnId, message, stderrTurnError)\n },\n /**\n * Cancel the in-flight turn — the wire equivalent of Ctrl-C at the\n * agent's own TUI, and the primitive the host's interrupt path\n * (`SessionsRegistry.interruptSession`, `{interrupt: true}`) is built\n * on.\n *\n * This used to be `abortController.abort()` alone, which cancelled\n * NOTHING: that controller is the CONNECTION-level signal, handed to\n * `arm.connect({abortSignal})` at spawn, and no arm reads it. So the\n * abort fired into the void while the agent kept working — a turn\n * \"cancelled\" this way ran happily to completion, and the host's 60s\n * settle-wait then timed out on a turn that was never asked to stop.\n * It only ever LOOKED like it worked for turns that happened to end\n * naturally inside that wait.\n *\n * Both arms have always implemented the real thing — the ACP arm\n * sends `session/cancel`, the print arm SIGTERMs the child — it was\n * simply never called. Call it.\n *\n * Connection-level abort deliberately stays out of this: aborting the\n * connection would end the SESSION, and cancelling a turn must leave\n * it alive and idle for the next prompt. That distinction is the whole\n * point of interrupt-vs-kill.\n */\n async cancel() {\n // No turn has been sent yet — nothing to cancel, and naming a turn\n // that never existed would be a lie to the arm.\n if (currentTurnId === undefined) return\n // Deliberately NOT cleared afterwards: a second cancel re-sends the\n // same id, and both arms are idempotent on it (ACP `session/cancel`\n // for a settled turn is a no-op; SIGTERM to an already-dead child\n // does nothing). Clearing it would instead make a cancel racing a\n // turn-end silently skip the arm — the exact no-op this whole fix\n // exists to remove.\n await arm.cancel(currentTurnId)\n },\n ...(arm.respondPermission\n ? {\n respondPermission(requestId, resolution) {\n return arm.respondPermission!(requestId, resolution)\n },\n }\n : {}),\n ...(arm.onOutOfTurnEvent\n ? {\n onOutOfTurnEvent(listener) {\n return arm.onOutOfTurnEvent!(listener)\n },\n }\n : {}),\n ...(arm.steer\n ? {\n // Snapshotted after `arm.connect()` resolved, like the\n // config/mode read surfaces above.\n steeringSupported: arm.steeringSupported === true,\n steer(content: unknown) {\n return arm.steer!(content)\n },\n }\n : {}),\n async close() {\n await arm.close()\n // The whole tree, not just `child`: that is usually an npx/npm-exec\n // wrapper that may ignore SIGTERM, with the real adapter (and its\n // MCP servers / headless Chrome) running underneath it.\n if (child) await terminateChildTree(child)\n if (systemPromptTmpDir) rmSync(systemPromptTmpDir, { recursive: true, force: true })\n },\n }\n },\n }\n}\n\nasync function buildProtocolArm(\n def: AgentCliHandle,\n child: ChildProcess | undefined,\n cwd: string,\n requestedMode?: string,\n permissionHold?: boolean,\n): Promise<AgentCliClient> {\n switch (def.protocol) {\n case \"acp\":\n if (!child) {\n throw new Error(\"createAgentCliRuntime: acp protocol requires a spawned subprocess\")\n }\n return createAcpProtocolArm({\n child,\n cwd,\n clientInfo: { name: def.id, version: def.version },\n requestedMode,\n ...(permissionHold ? { permissionHold: true } : {}),\n })\n case \"mcp\":\n throw new Error(\"createAgentCliRuntime: mcp protocol arm not yet implemented\")\n case \"proprietary\":\n if (!def.adapter) {\n // defineAgentCli's validate() already enforces this for manifests\n // built through it — this guards a hand-built AgentCliHandle that\n // bypassed that check.\n throw new Error(\n \"createAgentCliRuntime: proprietary protocol requires manifest.adapter\",\n )\n }\n return createProprietaryProtocolArm({ adapter: def.adapter, definition: def })\n case \"print\":\n // Unreachable: print is handled by the early-return in start() above.\n throw new Error(\"createAgentCliRuntime: print arm bypasses buildProtocolArm\")\n }\n}\n\n/**\n * Derives the `permissions.defaultMode` value claude-code's settings.json\n * expects for a requested AIP-45 mode, by reading the same\n * `[\"--permission-mode\", \"<value>\"]` pair already declared in the\n * adapter's `modes[].bin_args_append` (one vocabulary, one source of\n * truth — see `adapters/claude-code/src/index.ts`). Scoped to\n * `definition.id === \"claude-code\"` since this settings-file mechanism\n * is specific to that adapter's ACP wrapper; every other adapter's\n * `bin_args_append` is applied to argv as normal and this returns\n * `undefined` for them. Also `undefined` for an unrequested mode, or a\n * mode (like \"default\") that has no `--permission-mode` patch — the\n * caller (`start()` above) uses that to skip writing\n * `permissions.defaultMode` into the isolated `CLAUDE_CONFIG_DIR`'s\n * `settings.json`, NOT to skip the `CLAUDE_CONFIG_DIR` override itself:\n * that override is unconditional for every claude-code spawn (see\n * `isolateClaudeCodeConfig` in `start()`) so ambient global config\n * (`~/.claude.json`, including registered `mcpServers`) never leaks into a\n * spawn that never requested a posture.\n */\n// Canonical posture is a first-class axis. It deliberately does not depend\n// on the retired claude-code posture entries in `modes[]`: context profiles\n// can therefore select `lean` at the same time as a permission posture.\n// `read-only` maps to Claude Code's plan permission boundary; Claude Code\n// does not expose a stricter read-only native mode.\nconst CLAUDE_CODE_POSTURE_PERMISSION_MODES: Readonly<Record<string, string | undefined>> = {\n plan: \"plan\",\n \"read-only\": \"plan\",\n \"accept-edits\": \"acceptEdits\",\n bypass: \"bypassPermissions\",\n}\n\n/**\n * The canonical postures this driver enforces as a real boundary at\n * spawn/restart through the adapter's own isolated config — claude-code's\n * `permissions.defaultMode`, opencode's per-session `permission` block —\n * independently of any advertised ACP mode. Empty for every other adapter.\n * Surfaced on the session (`AgentCliRuntimeSession.spawnEnforcedPostures`) so\n * the runtime can report such a posture as enforced rather than as the\n * advisory preamble its mode registry alone would suggest.\n */\nexport function spawnEnforcedPostures(definition: Pick<AgentCliDefinition, \"id\">): readonly string[] {\n if (definition.id === \"claude-code\") return Object.keys(CLAUDE_CODE_POSTURE_PERMISSION_MODES)\n if (definition.id === \"opencode\") return OPENCODE_SPAWN_ENFORCED_POSTURES\n return []\n}\n\nfunction resolveClaudeCodePermissionMode(\n definition: AgentCliHandle,\n posture: string | undefined,\n configMode: string | undefined,\n): string | undefined {\n if (definition.id !== \"claude-code\") return undefined\n\n if (posture && CLAUDE_CODE_POSTURE_PERMISSION_MODES[posture]) {\n return CLAUDE_CODE_POSTURE_PERMISSION_MODES[posture]\n }\n\n // Legacy callers that still send a single AIP-45 mode remain supported.\n if (!configMode) return undefined\n const mode = (definition.modes ?? []).find((m) => m.id === configMode)\n const args = mode?.bin_args_append ?? []\n const flagIndex = args.indexOf(\"--permission-mode\")\n if (flagIndex === -1 || flagIndex + 1 >= args.length) return undefined\n return args[flagIndex + 1]\n}\n\nfunction filterStringEnv(env: NodeJS.ProcessEnv): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [k, v] of Object.entries(env)) {\n if (typeof v === \"string\") out[k] = v\n }\n return out\n}\n\n/**\n * The spawn-refusal error for a derived-from-model adapter whose explicitly\n * requested model did not take — shared by the \"config\" (ACP rejection) and\n * \"command\" (`/model` control turn, unacknowledged/failed) apply paths so\n * the two guards can never drift. Names the requested id, the concrete\n * reason, and the adapter's own expected id shape (first menu entry).\n */\nfunction derivedModelRefusalError(\n definition: AgentCliDefinition,\n requested: string,\n reason: string,\n): Error {\n const first = definition.models?.allowed?.[0]\n const example =\n (typeof first === \"string\" ? first : first?.id) ??\n \"openrouter/anthropic/claude-sonnet-4-6\"\n return new Error(\n `${definition.bin}: refusing to start on the default model — the requested model ` +\n `\"${requested}\" was not applied (${reason}). This adapter routes AND ` +\n `bills by the model id's own provider prefix, so continuing would silently run ` +\n `(and bill) a model you didn't ask for. Use the adapter's ` +\n `\"<provider>/<model>\" form (e.g. \"${example}\"), or pick an id from its model menu.`,\n )\n}\n"]}