/** * Static per-runtime metadata (binary, install hint, streaming, full access, * tool-activity fidelity) for every AgentRunner runtime id. Split out of * runner-registry.ts (file-size rule), which merges each entry with its * RUNNER_FEATURES flags and re-exports `RunnerSpec`. * * Binary names and env overrides MUST mirror the `_CLI_BIN` lookups in * each orgrt/*-runner.ts — a mismatch here means scan reports a runner as * installed when its runner would spawn a different binary (or vice versa). */ import type { ProviderKind, RuntimeKind } from './daemon.js'; import type { RunnerAccess } from './runner-access.js'; import type { RunnerFeatures } from './runner-features.js'; export interface RunnerSpec extends RunnerFeatures, RunnerAccess { /** Runtime id accepted by `agent exec --runtime` and org role `runtime`. */ id: RuntimeKind; /** Binary probed on PATH (null for in-process runtimes like vercel). */ binary: string | null; /** Env var that overrides the binary path (mirrors each runner's lookup). */ binEnv?: string; /** One-line install hint, shown by scan and the missing-binary error. */ installHint: string; /** Login/auth command appended to auth-class errors (§3.4 auth code). */ loginHint?: string; /** Installed binary is discoverable but automated execution is unavailable. */ executionUnsupportedReason?: string; /** Version-specific readiness, independently from binary presence. */ executionPrerequisite?: (version: string | null) => string | undefined; /** * Whether this runner delivers real incremental (per-token/per-chunk) * `assistant` text as a turn streams, vs. only ever yielding a complete * message at a step/turn boundary. Callers (agent scan --json §6, the * `start` frame's `streams_incrementally` field §3.2) use this to set * the end user's expectations honestly instead of a live UI implying a * hang during a turn that was never going to show partial output. * * See doc/agent-exec-protocol.md's "Adding a new AgentRunner" section * for the checklist a new runner should follow to decide and wire this. */ streamsIncrementally: boolean; /** * #355: whether `agent exec --access full` (unrestricted native tool * access, no approvals, no CLI sandbox) is implemented for this runtime. * Rev 20: every coding runtime (claude, codex, opencode, antigravity, * kimicode, grok, qwen, copilot, crush, pi, pi-rpc, cline, aider, dsh); * the rest (vercel — no native tools; hermes, qwen-rpc — no resume/tool * events) reject `--access full` with `error * {code:"unsupported", fatal:true}` rather than silently running scoped. * Discoverable via `agent scan --json`'s `full_access` field. */ supportsFullAccess: boolean; /** * #357: how faithfully this runner's AgentMessage stream can be turned * into `tool_activity` start/end pairs (doc §3.2/§9) — `"full"` (real * tool_use id, input, and a matched end from a real tool_result), * `"start-only"` (a lightweight `{type:'tool_use', text: toolName}` * liveness signal with no id to correlate an end with), or `"none"` (no * tool signal surfaces in this runner's AgentMessage stream at all today). */ toolActivityFidelity: 'full' | 'start-only' | 'none'; } export declare const BASE_SPECS: Array>; /** Auto-resolve runtime from provider kind. Returns undefined for Claude default. */ export declare function autoRuntimeFromProvider(kind?: ProviderKind): RuntimeKind | undefined; /** The runtime resolveRoleRunner selects for a role, undefined for the * default Claude path. What the session ledger and its audit key on (#562). */ export declare function resolveRoleRuntime(roleRuntime?: RuntimeKind, orgRuntime?: RuntimeKind, roleProviderKind?: ProviderKind, orgProviderKind?: ProviderKind): RuntimeKind | undefined; /** The runtime whose runner hosts a role — what the session ledger, the * full-access check, the sandbox choice and `org sign`'s review all name * (#562, #567). Takes raw values so the sign review can pass unvalidated * JSON. A configured runtime (the role's or the org's) is returned as is: * the schema admits only known ones, and an unknown one keeps the stricter * treatment it always had (no runner spec, so no full access). With none, * provider.kind or MONOMIND_RUNTIME decide as in resolveRoleRunner; a name * no runner answers to leaves the default Claude runner, so it is 'claude'. */ export declare function effectiveRoleRuntime(roleRuntime: unknown, orgRuntime: unknown, providerKind: unknown): string; //# sourceMappingURL=runner-specs.d.ts.map