@wrongstack/acp 0.274.0 → 0.275.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/agent/stdio-transport.ts","../src/agent/tools-registry.ts","../src/types/acp-v1.ts","../src/agent/protocol-handler.ts","../src/agent/wrongstack-acp-agent.ts","../src/client/tool-translator.ts","../src/client/file-server.ts","../src/client/permission.ts","../src/client/terminal-server.ts","../src/client/acp-session.ts","../src/integration/acp-subagent-runner.ts","../src/registry/agents.catalog.ts","../src/registry/ensemble-registry.ts","../src/integration/ensemble-runner.ts"],"names":["resolve","spawn","writeErr","expectDefined","path","path2"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * StdioTransport — bidirectional stdin/stdout communication for ACP.\n *\n * ACP uses newline-delimited JSON-RPC 2.0 messages over stdio:\n * client → agent: JSON-RPC request/notification on stdin\n * agent → client: JSON-RPC response/notification on stdout\n *\n * Start message: clients look for the `[wstack-acp]` marker on stdout before\n * treating subsequent lines as protocol messages.\n */\nimport { expectDefined, writeErr } from '@wrongstack/core';\nimport type { ACPMessage } from '../types/acp-messages.js';\nexport interface AgentServerTransport {\n send(msg: ACPMessage): Promise<void>;\n sendRaw(chunk: string): void;\n read(): Promise<ACPMessage | null>;\n close(): void;\n onMessage(handler: (msg: ACPMessage) => void): () => void;\n}\n\nexport class StdioTransport implements AgentServerTransport {\n private readonly stdin = process.stdin;\n private readonly stdout = process.stdout;\n private readonly stderr = process.stderr;\n\n private buffer = '';\n private readonly handlers = new Set<(msg: ACPMessage) => void>();\n private closed = false;\n private resolveRead: ((msg: ACPMessage | null) => void) | null = null;\n private messageQueue: ACPMessage[] = [];\n\n constructor() {\n this.stdin.resume();\n this.stdin.setEncoding('utf8');\n this.stdin.on('data', (chunk: string) => this.onData(chunk));\n this.stdin.on('end', () => this.handleClose());\n this.stdin.on('error', (err: Error) => this.failAll(err));\n }\n\n sendStartupMarker(): void {\n this.stdout.write('[wstack-acp]\\n', 'utf8');\n }\n\n send(msg: ACPMessage): Promise<void> {\n if (this.closed) return Promise.resolve();\n return new Promise((resolve) => {\n const line = JSON.stringify(msg) + '\\n';\n this.stdout.write(line, 'utf8', () => resolve());\n });\n }\n\n sendRaw(chunk: string): void {\n this.stdout.write(chunk, 'utf8');\n }\n\n read(): Promise<ACPMessage | null> {\n if (this.messageQueue.length > 0) return Promise.resolve(expectDefined(this.messageQueue.shift()));\n if (this.closed) return Promise.resolve(null);\n return new Promise((resolve) => {\n this.resolveRead = resolve;\n });\n }\n\n onMessage(handler: (msg: ACPMessage) => void): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n close(): void {\n this.closed = true;\n this.stdin.pause();\n this.resolveRead?.(null);\n this.resolveRead = null;\n }\n\n private onData(chunk: string): void {\n this.buffer += chunk;\n const lines = this.buffer.split('\\n');\n /* v8 ignore next -- split() always yields ≥1 element, so pop() is never undefined; the ?? '' is defensive. */\n this.buffer = lines.pop() ?? '';\n\n for (const raw of lines) {\n if (!raw.trim()) continue;\n try {\n this.dispatch(JSON.parse(raw) as ACPMessage);\n } catch (err) {\n this.stderr.write(`[wstack-acp parse error] ${err}\\n`, 'utf8');\n }\n }\n }\n\n private dispatch(msg: ACPMessage): void {\n if (this.resolveRead) {\n const resolve = this.resolveRead;\n this.resolveRead = null;\n resolve(msg);\n } else {\n this.messageQueue.push(msg);\n }\n for (const handler of this.handlers) {\n try {\n handler(msg);\n } catch (err) {\n this.stderr.write(`[wstack-acp handler error] ${err}\\n`, 'utf8');\n }\n }\n }\n\n private handleClose(): void {\n this.closed = true;\n this.resolveRead?.(null);\n this.resolveRead = null;\n }\n\n private failAll(err: Error): void {\n this.stderr.write(`[wstack-acp stdin error] ${err.message}\\n`, 'utf8');\n this.close();\n }\n}\n\n// ---------------------------------------------------------------------------\n// ClientTransport — spawns a child ACP agent process (DIR-1)\n// ---------------------------------------------------------------------------\n\nimport type { EventEmitter } from 'node:events';\n\nexport interface ClientTransportOptions {\n command: string;\n args?: string[] | undefined;\n env?: Record<string, string>;\n cwd?: string | undefined;\n handshakeTimeoutMs?: number | undefined;\n /**\n * Set to true when the child is an external ACP agent (Claude Code,\n * Gemini CLI, Codex CLI, …) that does NOT emit a `[wstack-acp]\\n`\n * marker on startup. The v1 client (`ACPSession`) sets this; the\n * server-side transport (the default) keeps the marker check.\n */\n skipHandshakeMarker?: boolean | undefined;\n}\n\nexport interface ACPChildProcess extends EventEmitter {\n stdout: NodeJS.ReadableStream;\n stdin: NodeJS.WritableStream;\n stderr: NodeJS.ReadableStream;\n pid: number | undefined;\n kill(): void;\n}\n\nexport class ClientTransport {\n private child: ACPChildProcess | null = null;\n private buffer = '';\n private readonly handlers = new Set<(msg: ACPMessage) => void>();\n private closed = false;\n private resolveRead: ((msg: ACPMessage | null) => void) | null = null;\n private messageQueue: ACPMessage[] = [];\n private readonly opts: Required<Pick<ClientTransportOptions, 'handshakeTimeoutMs'>> &\n ClientTransportOptions;\n\n constructor(options: ClientTransportOptions) {\n this.opts = {\n handshakeTimeoutMs: 30_000,\n ...options,\n };\n }\n\n async start(): Promise<void> {\n if (this.child) return;\n const [{ spawn }, { buildChildEnv }] = await Promise.all([\n import('node:child_process'),\n import('@wrongstack/core'),\n ]);\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(\n new Error(`ACP child process failed to start within ${this.opts.handshakeTimeoutMs}ms`),\n );\n }, this.opts.handshakeTimeoutMs);\n\n try {\n this.child = spawn(this.opts.command, this.opts.args ?? [], {\n env: { ...buildChildEnv(), ...this.opts.env },\n cwd: this.opts.cwd,\n stdio: ['pipe', 'pipe', 'pipe'],\n windowsHide: true,\n // On Windows, most ACP-supporting tools (claude, gemini, codex,\n // qwen, copilot) are installed as `.cmd` shims under\n // AppData\\Roaming\\npm\\. Node's spawn won't find them via\n // `shell: false` because the .cmd extension is not in the\n // default PATHEXT lookup. The argv here is always from our\n // own static catalog or from a hardcoded spec, never from\n // user input, so shell-expansion is bounded.\n shell: process.platform === 'win32',\n }) as never as ACPChildProcess;\n /* v8 ignore start -- spawn() throwing synchronously is a defensive guard (e.g. argv0 type errors); the realistic async failure path is the child 'error' event, covered by tests. */\n } catch (err) {\n clearTimeout(timeout);\n reject(err);\n return;\n }\n /* v8 ignore stop */\n\n const child = this.child;\n\n child.stdout.setEncoding('utf8');\n\n const onReady = (): void => {\n child.stdout.on('data', (c: string) => this.onChildData(c));\n child.stderr.on('data', (c: string) => this.onChildError(c));\n child.on('close', (code: number | null) => this.onChildClose(code));\n clearTimeout(timeout);\n resolve();\n };\n\n if (this.opts.skipHandshakeMarker) {\n // External ACP agents don't emit a startup marker — they're\n // ready to accept JSON-RPC immediately. Resolve as soon as\n // the child process is spawned and stdout is flowing.\n onReady();\n return;\n }\n\n const waitForMarker = (chunk: string) => {\n this.buffer += chunk;\n const idx = this.buffer.indexOf('[wstack-acp]\\n');\n if (idx !== -1) {\n this.buffer = this.buffer.slice(idx + '[wstack-acp]\\n'.length);\n child.stdout.removeListener('data', waitForMarker);\n onReady();\n }\n };\n\n child.stdout.on('data', waitForMarker);\n child.stdout.on('error', (err: Error) => {\n clearTimeout(timeout);\n reject(err);\n });\n child.on('error', (err: Error) => {\n clearTimeout(timeout);\n reject(err);\n });\n });\n }\n\n send(msg: ACPMessage): Promise<void> {\n if (!this.child) return Promise.reject(new Error('ClientTransport not started'));\n return new Promise((resolve, reject) => {\n const line = JSON.stringify(msg) + '\\n';\n this.child?.stdin.write(line, 'utf8', (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n read(): Promise<ACPMessage | null> {\n if (this.messageQueue.length > 0) return Promise.resolve(expectDefined(this.messageQueue.shift()));\n if (this.closed) return Promise.resolve(null);\n return new Promise((resolve) => {\n this.resolveRead = resolve;\n });\n }\n\n onMessage(handler: (msg: ACPMessage) => void): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n stop(): void {\n if (!this.child) return;\n this.closed = true;\n try {\n this.child.kill();\n } catch {\n // already dead\n }\n this.child = null;\n }\n\n private onChildData(chunk: string): void {\n this.buffer += chunk;\n const lines = this.buffer.split('\\n');\n /* v8 ignore next -- split() always yields ≥1 element, so pop() is never undefined; the ?? '' is defensive. */\n this.buffer = lines.pop() ?? '';\n\n for (const raw of lines) {\n if (!raw.trim()) continue;\n try {\n this.dispatch(JSON.parse(raw) as ACPMessage);\n } catch {\n // skip malformed\n }\n }\n }\n\n private onChildError(chunk: string): void {\n writeErr(`[acp-child stderr] ${chunk}`);\n }\n\n private onChildClose(code: number | null): void {\n this.closed = true;\n this.resolveRead?.(null);\n this.resolveRead = null;\n if (code !== 0 && code !== null) {\n writeErr(`[acp-child exited with code ${code}]\\n`);\n }\n }\n\n private dispatch(msg: ACPMessage): void {\n if (this.resolveRead) {\n const resolve = this.resolveRead;\n this.resolveRead = null;\n resolve(msg);\n } else {\n this.messageQueue.push(msg);\n }\n for (const handler of this.handlers) {\n try {\n handler(msg);\n } catch {\n // non-fatal\n }\n }\n }\n}\n","/**\n * Tools registry for ACP agent-side.\n *\n * Translates WrongStack Tool definitions → ACP ACPToolDefinition format.\n * Provides tool lookup and result assembly for the ACP protocol handler.\n */\nimport type {Tool} from '@wrongstack/core';\nimport type {\n ACPToolDefinition,\n ACPToolList,\n ACPInputSchema,\n ACPToolResult,\n ContentBlock,\n} from '../types/acp-messages.js';\n\nexport class ACPToolsRegistry {\n private tools = new Map<string, Tool>();\n private readonly owner: string;\n\n constructor(owner = 'wrongstack') {\n this.owner = owner;\n }\n\n /**\n * Register one or more tools.\n * Throws on duplicate name unless force=true.\n */\n register(tools: Tool[]): void {\n for (const tool of tools) {\n this.tools.set(tool.name, tool);\n }\n }\n\n /**\n * Replace the current tool set.\n */\n setTools(tools: Tool[]): void {\n this.tools.clear();\n for (const tool of tools) this.tools.set(tool.name, tool);\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n list(): Tool[] {\n return Array.from(this.tools.values());\n }\n\n /** Build the ACP tools/list payload from registered tools. */\n buildToolList(): ACPToolList {\n return {\n tools: Array.from(this.tools.values()).map((t) =>\n toACPToolDefinition(t, this.owner),\n ),\n };\n }\n\n /**\n * Execute a tool by name and return ACP-formatted result.\n * Returns null if the tool is not found.\n */\n async execute(\n name: string,\n args: Record<string, unknown>,\n ctx: unknown,\n signal: AbortSignal,\n ): Promise<ACPToolResult | null> {\n const tool = this.tools.get(name);\n if (!tool) return null;\n\n try {\n const result = await tool.execute(args, ctx as Parameters<Tool['execute']>[1], {\n signal,\n });\n return toACPToolResult(result);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {content: [{type: 'text', text: msg}], isError: true} satisfies ACPToolResult;\n }\n }\n}\n\n/** Convert a WrongStack Tool → ACP ACPToolDefinition */\nfunction toACPToolDefinition(tool: Tool, _owner: string): ACPToolDefinition {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: toACPInputSchema(tool.inputSchema),\n annotations: {\n title: tool.name,\n description: tool.usageHint ?? tool.description,\n priority: toolToPriority(tool),\n alwaysAccept: tool.permission === 'auto',\n },\n };\n}\n\n/** Minimal JSON Schema → ACP input schema. ACP uses JSON Schema draft-07. */\nfunction toACPInputSchema(src: unknown): ACPInputSchema {\n if (!src || typeof src !== 'object') {\n return {};\n }\n const s = src as Record<string, unknown>;\n const out: ACPInputSchema = {};\n if (typeof s.type === 'string') out.type = s.type;\n if (Array.isArray(s.enum)) out.enum = s.enum;\n if (typeof s.description === 'string') out.description = s.description;\n if ('default' in s) out.default = s.default;\n if (typeof s.minimum === 'number') out.minimum = s.minimum;\n if (typeof s.maximum === 'number') out.maximum = s.maximum;\n if (s.items) out.items = toACPInputSchema(s.items);\n\n // Recursively convert properties\n if (s.properties && typeof s.properties === 'object') {\n const props: Record<string, ACPInputSchema> = {};\n for (const [k, v] of Object.entries(s.properties as Record<string, unknown>)) {\n props[k] = toACPInputSchema(v);\n }\n out.properties = props;\n if (Array.isArray(s.required)) out.required = s.required as string[];\n }\n\n return out;\n}\n\n/** Convert a WrongStack ToolResult → ACP ContentBlock[] */\nfunction toACPToolResult(result: unknown): ACPToolResult {\n const blocks: ContentBlock[] = [];\n\n if (result === undefined || result === null) {\n return {content: [{type: 'text', text: 'ok'}]};\n }\n\n if (typeof result === 'string') {\n blocks.push({type: 'text', text: result});\n } else if (typeof result === 'object') {\n blocks.push({type: 'text', text: JSON.stringify(result, null, 2)});\n } else {\n blocks.push({type: 'text', text: String(result)});\n }\n\n return {content: blocks};\n}\n\nfunction toolToPriority(tool: Tool): 'high' | 'medium' | 'low' {\n if (tool.riskTier === 'destructive') return 'high';\n if (tool.riskTier === 'standard' || tool.permission === 'confirm') return 'medium';\n return 'low';\n}\n","/**\n * ACP v1 type definitions — Agent Client Protocol, stable v1 spec.\n *\n * Scope: discriminated union for the `session/update` notification payload\n * (the `update` field of a `session/update` JSON-RPC notification), plus the\n * subset of supporting types it depends on.\n *\n * Spec: https://agentclientprotocol.com/protocol/v1/overview\n *\n * Design notes\n * ────────────\n * • The stable v1 spec defines 11 `sessionUpdate` discriminator values. We\n * type exactly those 11, plus an `_unstable_*` escape hatch for v2-RFD\n * kinds (e.g. `next_edit_suggestions`, `elicitation`) that real agents\n * may emit before the spec stabilises them, and an `unknown` fallback for\n * everything else. We do NOT synthesise 32 fake variants to match a\n * number cited in passing — the union is honest about the surface.\n *\n * • Per the spec's conventions, discriminator values use snake_case. The\n * property keys inside each variant are camelCase (the JSON-RPC envelope\n * is JSON-RPC 2.0, everything else is camelCase unless the spec says\n * otherwise).\n *\n * • Optional fields that the spec marks optional are marked `?:`. Required\n * fields have no `?`. We do not include spec fields the spec marks\n * \"SHOULD NOT\" or \"reserved\".\n *\n * • The existing `acp-messages.ts` types describe an older draft of the\n * protocol (string `protocolVersion: '2024-11'`, fake `tools/call`\n * method, etc.). Do NOT import from it here — `acp-v1.ts` is\n * self-contained so the new code path can be reviewed in isolation and\n * deleted wholesale if the rewrite is ever reverted.\n */\n\n// ────────────────────────────────────────────────────────────────────────────\n// Shared building blocks\n// ────────────────────────────────────────────────────────────────────────────\n\n/** Stable protocol version (integer per the spec, not a date-string). */\nexport const ACP_PROTOCOL_VERSION = 1 as const;\nexport type ACPProtocolVersion = typeof ACP_PROTOCOL_VERSION;\n\n/** Per the spec: opaque, unique id. We type as branded string. */\nexport type SessionId = string & { readonly __acpSessionId: unique symbol };\nexport type ToolCallId = string & { readonly __acpToolCallId: unique symbol };\nexport type MessageId = string & { readonly __acpMessageId: unique symbol };\nexport type TerminalId = string & { readonly __acpTerminalId: unique symbol };\nexport type PlanEntryId = string & { readonly __acpPlanEntryId: unique symbol };\n\n// ────────────────────────────────────────────────────────────────────────────\n// Content blocks — reused from MCP per the spec\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Annotations attached to a content block. Optional, agent-supplied hint\n * about audience/priority. Spec leaves shape open; we mirror the fields\n * the spec shows in its examples.\n */\nexport interface ContentAnnotations {\n audience?: ('user' | 'assistant')[] | undefined;\n priority?: number | undefined;\n [key: string]: unknown;\n}\n\nexport interface TextContent {\n type: 'text';\n text: string;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport interface ImageContent {\n type: 'image';\n mimeType: string;\n /** Base64-encoded image data. */\n data: string;\n uri?: string | undefined;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport interface AudioContent {\n type: 'audio';\n mimeType: string;\n /** Base64-encoded audio data. */\n data: string;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport interface TextResourceContents {\n uri: string;\n mimeType?: string | undefined;\n text: string;\n}\n\nexport interface BlobResourceContents {\n uri: string;\n mimeType?: string | undefined;\n /** Base64-encoded binary. */\n blob: string;\n}\n\nexport type EmbeddedResourceContents = TextResourceContents | BlobResourceContents;\n\nexport interface EmbeddedResourceContent {\n type: 'resource';\n resource: EmbeddedResourceContents;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport interface ResourceLinkContent {\n type: 'resource_link';\n uri: string;\n name: string;\n mimeType?: string | undefined;\n title?: string | undefined;\n description?: string | undefined;\n size?: number | undefined;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport type ContentBlock =\n | TextContent\n | ImageContent\n | AudioContent\n | EmbeddedResourceContent\n | ResourceLinkContent;\n\n// ────────────────────────────────────────────────────────────────────────────\n// Tool calls\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type ToolKind =\n | 'read'\n | 'edit'\n | 'delete'\n | 'move'\n | 'search'\n | 'execute'\n | 'think'\n | 'fetch'\n | 'switch_mode'\n | 'other';\n\nexport type ToolCallStatus = 'pending' | 'in_progress' | 'completed' | 'failed';\n\n/** A single concrete content payload attached to a tool call. */\nexport type ToolCallContent =\n | { type: 'content'; content: ContentBlock }\n | {\n type: 'diff';\n path: string;\n oldText: string | null;\n newText: string;\n }\n | { type: 'terminal'; terminalId: TerminalId };\n\nexport interface ToolCallLocation {\n path: string;\n /** 1-based per the spec's argument requirements. */\n line?: number | undefined;\n}\n\nexport interface ToolCall {\n toolCallId: ToolCallId;\n title: string;\n kind?: ToolKind | undefined;\n status?: ToolCallStatus | undefined;\n content?: ToolCallContent[] | undefined;\n locations?: ToolCallLocation[] | undefined;\n rawInput?: Record<string, unknown> | undefined;\n rawOutput?: Record<string, unknown> | undefined;\n}\n\n/**\n * Partial update of a previously-emitted tool call. All fields except\n * `toolCallId` are optional — only the changed fields are included.\n * Declared standalone (not `extends ToolCall`) because `title` is required\n * on `ToolCall` but optional here; the structural variance is the point.\n */\nexport interface ToolCallUpdateFields {\n toolCallId: ToolCallId;\n status?: ToolCallStatus | undefined;\n content?: ToolCallContent[] | undefined;\n title?: string | undefined;\n kind?: ToolKind | undefined;\n locations?: ToolCallLocation[] | undefined;\n rawInput?: Record<string, unknown> | undefined;\n rawOutput?: Record<string, unknown> | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Plan\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type PlanEntryPriority = 'high' | 'medium' | 'low';\nexport type PlanEntryStatus = 'pending' | 'in_progress' | 'completed';\n\nexport interface PlanEntry {\n /** Required by the spec for the array shape, but per-entry id is optional. */\n content: string;\n priority: PlanEntryPriority;\n status: PlanEntryStatus;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Slash commands\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface AvailableCommandInput {\n hint: string;\n}\n\nexport interface AvailableCommand {\n name: string;\n description: string;\n input?: AvailableCommandInput | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Session modes\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type SessionModeId = string & { readonly __acpModeId: unique symbol };\n\nexport interface SessionMode {\n id: SessionModeId;\n name: string;\n description?: string | undefined;\n}\n\nexport interface SessionModeState {\n currentModeId: SessionModeId;\n availableModes: SessionMode[];\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Config options\n// ────────────────────────────────────────────────────────────────────────────\n\n/** Reserved spec categories. Underscore-prefixed names are free for custom use. */\nexport type ConfigOptionCategory =\n | 'mode'\n | 'model'\n | 'thought_level'\n | `_${string}`;\n\nexport type ConfigOptionType = 'select' | string;\n\nexport interface ConfigOptionValue {\n value: string;\n name: string;\n description?: string | undefined;\n}\n\nexport interface ConfigOption {\n id: string;\n name: string;\n description?: string | undefined;\n category?: ConfigOptionCategory | undefined;\n type: ConfigOptionType;\n currentValue: string;\n options: ConfigOptionValue[];\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Session info\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface SessionInfo {\n sessionId: SessionId;\n cwd: string;\n title?: string | undefined;\n updatedAt?: string | undefined;\n /** Agent-supplied extension metadata; opaque to clients. */\n _meta?: Record<string, unknown> | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Usage (token / cost) updates\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface UsageCost {\n amount: number;\n /** ISO 4217 currency code, e.g. \"USD\". */\n currency: string;\n}\n\nexport interface UsageUpdate {\n /** Tokens used in the current session context. Required, non-null. */\n used: number;\n /** Total context window size in tokens. Required, non-null. */\n size: number;\n cost?: UsageCost | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Permission requests\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type PermissionOptionKind =\n | 'allow_once'\n | 'allow_always'\n | 'reject_once'\n | 'reject_always';\n\nexport interface PermissionOption {\n optionId: string;\n name: string;\n kind: PermissionOptionKind;\n}\n\nexport type RequestPermissionOutcome =\n | { outcome: 'cancelled' }\n | { outcome: 'selected'; optionId: string };\n\n// ────────────────────────────────────────────────────────────────────────────\n// Stop reasons\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type StopReason =\n | 'end_turn'\n | 'max_tokens'\n | 'max_turn_requests'\n | 'refusal'\n | 'cancelled'\n | string;\n\n// ────────────────────────────────────────────────────────────────────────────\n// SessionUpdate — the discriminated union\n// ────────────────────────────────────────────────────────────────────────────\n\n/** Stable v1 variants. The spec currently defines exactly 11. */\nexport type SessionUpdate =\n | UserMessageChunkUpdate\n | AgentMessageChunkUpdate\n | ThoughtChunkUpdate\n | ToolCallUpdateUpdate\n | ToolCallUpdateNotification\n | PlanUpdate\n | AvailableCommandsUpdate\n | CurrentModeUpdate\n | ConfigOptionUpdate\n | SessionInfoUpdate\n | UsageUpdateUpdate;\n\n// --- Streaming message chunks -----------------------------------------------\n\nexport interface UserMessageChunkUpdate {\n sessionUpdate: 'user_message_chunk';\n messageId?: MessageId | undefined;\n content: ContentBlock;\n}\n\nexport interface AgentMessageChunkUpdate {\n sessionUpdate: 'agent_message_chunk';\n messageId?: MessageId | undefined;\n content: ContentBlock;\n}\n\nexport interface ThoughtChunkUpdate {\n sessionUpdate: 'thought_chunk';\n messageId?: MessageId | undefined;\n content: ContentBlock;\n}\n\n// --- Tool calls ------------------------------------------------------------\n\n/** First notification for a new tool call. */\nexport interface ToolCallUpdateUpdate {\n sessionUpdate: 'tool_call';\n toolCallId: ToolCallId;\n title: string;\n kind?: ToolKind | undefined;\n status?: ToolCallStatus | undefined;\n content?: ToolCallContent[] | undefined;\n locations?: ToolCallLocation[] | undefined;\n rawInput?: Record<string, unknown> | undefined;\n}\n\n/** Subsequent updates to a previously-emitted tool call. */\nexport interface ToolCallUpdateNotification {\n sessionUpdate: 'tool_call_update';\n toolCallId: ToolCallId;\n status?: ToolCallStatus | undefined;\n content?: ToolCallContent[] | undefined;\n title?: string | undefined;\n kind?: ToolKind | undefined;\n locations?: ToolCallLocation[] | undefined;\n rawInput?: Record<string, unknown> | undefined;\n rawOutput?: Record<string, unknown> | undefined;\n}\n\n// --- Plan ------------------------------------------------------------------\n\nexport interface PlanUpdate {\n sessionUpdate: 'plan';\n entries: PlanEntry[];\n}\n\n// --- Commands / modes / config ---------------------------------------------\n\nexport interface AvailableCommandsUpdate {\n sessionUpdate: 'available_commands_update';\n availableCommands: AvailableCommand[];\n}\n\nexport interface CurrentModeUpdate {\n sessionUpdate: 'current_mode_update';\n modeId: SessionModeId;\n}\n\nexport interface ConfigOptionUpdate {\n sessionUpdate: 'config_option_update';\n configOptions: ConfigOption[];\n}\n\n// --- Session metadata ------------------------------------------------------\n\nexport interface SessionInfoUpdate {\n sessionUpdate: 'session_info_update';\n title?: string | null | undefined;\n updatedAt?: string | null | undefined;\n _meta?: Record<string, unknown> | undefined;\n}\n\n// --- Usage -----------------------------------------------------------------\n\nexport interface UsageUpdateUpdate {\n sessionUpdate: 'usage_update';\n used: number;\n size: number;\n cost?: UsageCost | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Escape hatches: unknown / unstable\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Escape hatch for v2-RFD `sessionUpdate` kinds that have been published\n * but are not yet stabilised in the v1 spec. Examples seen in the wild:\n * `next_edit_suggestions`, `elicitation`, `proxy_extension`. We surface\n * the raw payload so forward-compat code can switch on\n * `kind === 'next_edit_suggestions'` etc. without losing the data.\n */\nexport interface UnstableSessionUpdate {\n sessionUpdate: `_unstable_${string}`;\n [key: string]: unknown;\n}\n\n/**\n * Last-resort variant: the agent sent a discriminator string we don't\n * recognise at all. The full payload is preserved as a record so consumers\n * can still log/inspect it. Prefer matching the known variants first.\n */\nexport interface UnknownSessionUpdate {\n sessionUpdate: string;\n [key: string]: unknown;\n}\n\n/** The full union, including escape hatches. */\nexport type AnySessionUpdate = SessionUpdate | UnstableSessionUpdate | UnknownSessionUpdate;\n\n// ────────────────────────────────────────────────────────────────────────────\n// Top-level notification envelope\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface SessionUpdateNotification {\n jsonrpc?: '2.0' | undefined;\n method: 'session/update';\n params: {\n sessionId: SessionId;\n update: AnySessionUpdate;\n };\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Type guards\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Exhaustiveness helper. Call from the `default:` branch of a switch on\n * `sessionUpdate` to get a compile-time error when a new variant is added\n * without updating the consumer.\n */\nexport function assertNeverSessionUpdate(x: never): never {\n throw new Error(\n `Unhandled sessionUpdate: ${JSON.stringify(x)}`,\n );\n}\n","/**\n * ACP v1 server-side protocol handler.\n *\n * Receives JSON-RPC requests from an external ACP client (Zed, JetBrains\n * Junie, VS Code ACP extension, etc.) over stdio and answers them per the\n * v1 spec. See https://agentclientprotocol.com/protocol/v1/overview.\n *\n * Supported methods\n * ─────────────────\n * - initialize — handshake\n * - authenticate — optional, no-op when auth isn't required\n * - session/new — create a session\n * - session/load — restore a session by id\n * - session/prompt — run one turn, stream session/update\n * notifications, return stopReason\n * - session/cancel — notification (no response); cancels the\n * in-flight turn on the target session\n * - session/set_mode — change the active mode for a session\n * - session/set_config_option — change a config option value\n * - session/list — list known sessions\n *\n * Method execution\n * ────────────────\n * The handler is transport-agnostic; it sends responses via the\n * `AgentServerTransport` injected at construction. The actual\n * agent-loop work for a `session/prompt` turn is delegated to the\n * caller-provided `runTurn` callback, which receives the prompt\n * blocks and the per-turn AbortSignal and resolves with the final\n * stopReason. Updates are streamed via the `emit` callback passed\n * to `runTurn`; the handler wraps each as a `session/update`\n * notification.\n *\n * This separation keeps the handler unit-testable: tests can supply\n * a fake `runTurn` that yields a canned sequence of updates, and\n * assert on the JSON-RPC traffic the handler produces. A real\n * production caller wires `runTurn` to a core `Agent` instance.\n *\n * Concurrency\n * ───────────\n * Each session is single-threaded (one active turn at a time). The\n * handler keeps a per-session AbortController so a `session/cancel`\n * notification can stop the running turn mid-stream without tearing\n * down the session. Multiple sessions can be active concurrently.\n */\nimport { ACP_PROTOCOL_VERSION, type StopReason, type ContentBlock, type PlanEntry, type UsageCost } from '../types/acp-v1.js';\nimport type { AgentServerTransport } from './stdio-transport.js';\nimport type { ACPMessage } from '../types/acp-messages.js';\n\n// Transport's `send` is typed `ACPMessage` which predates v1 and\n// doesn't carry a `jsonrpc` field. The runtime is fine — the\n// transport just `JSON.stringify`s the message — so cast at the\n// boundary.\ntype WireMessage = { jsonrpc?: '2.0'; id?: string | number; method?: string; params?: unknown; result?: unknown; error?: unknown };\nfunction toWire(msg: WireMessage): ACPMessage {\n return msg as never as ACPMessage;\n}\n\nexport const WRONGSTACK_VERSION = '0.263.0';\n\n/** What kinds of content the agent accepts in a prompt. */\nexport interface PromptCapabilities {\n image: boolean;\n audio: boolean;\n embeddedContext: boolean;\n}\n\nexport interface AgentCapabilities {\n loadSession: boolean;\n promptCapabilities: PromptCapabilities;\n}\n\nexport interface RunTurnInput {\n sessionId: string;\n /** Content blocks the client sent. */\n prompt: readonly ContentBlock[];\n /** Cancelled when the client sends `session/cancel` for this session. */\n signal: AbortSignal;\n}\n\nexport interface RunTurnResult {\n stopReason: StopReason;\n /** Optional summary text the agent produced. */\n text?: string;\n plan?: PlanEntry[];\n usage?: { used: number; size: number; cost?: UsageCost | undefined };\n}\n\n/**\n * The agent's per-turn work. Streams `SessionUpdate` notifications to\n * `emit` and resolves with the final stopReason. Errors thrown from\n * this iterable are converted to a `prompt_failed` JSON-RPC error.\n */\nexport type RunTurn = (\n input: RunTurnInput,\n emit: (update: unknown) => void,\n) => Promise<RunTurnResult>;\n\nexport interface SessionState {\n id: string;\n cwd: string;\n /** Per-turn abort signal — aborted when the session is cancelled or closed. */\n abort: AbortController;\n /** Active mode, advertised to the client in current_mode_update. */\n modeId: string;\n /** Created at, for session/list ordering. */\n createdAt: string;\n /** Last activity timestamp, for session/info_update. */\n updatedAt: string;\n /** Optional human title. */\n title?: string;\n}\n\n/** MCP-style session mode advertised in current_mode_update. */\nexport interface SessionMode {\n id: string;\n name: string;\n description?: string | undefined;\n}\n\nexport interface SessionConfigOption {\n id: string;\n name: string;\n type: 'select' | string;\n currentValue: string;\n options: { value: string; name: string; description?: string | undefined }[];\n}\n\nexport interface ProtocolHandlerOptions {\n transport: AgentServerTransport;\n /** Where the server is running; used for new sessions' default cwd. */\n defaultCwd: string;\n /** Agent's per-turn implementation. */\n runTurn: RunTurn;\n /**\n * Optional callbacks for the lifecycle events the server should\n * surface to the client. All default to no-ops.\n */\n onSessionNew?: ((state: SessionState) => void) | undefined;\n /** Static list of available modes (advertised to clients). */\n modes?: readonly SessionMode[] | undefined;\n /** Static list of config options. */\n configOptions?: readonly SessionConfigOption[] | undefined;\n /** Agent name advertised in initialize. */\n agentName?: string | undefined;\n}\n\n/** Single global mode id, sufficient for v1. */\nconst DEFAULT_MODE_ID = 'code';\n\nconst DEFAULT_MODES: readonly SessionMode[] = [\n {\n id: DEFAULT_MODE_ID,\n name: 'Code',\n description: 'Default agent mode for code-generation tasks.',\n },\n];\n\nexport class ACPProtocolHandler {\n private readonly transport: AgentServerTransport;\n private readonly defaultCwd: string;\n private readonly runTurn: RunTurn;\n private readonly onSessionNew: (state: SessionState) => void;\n private readonly modes: readonly SessionMode[];\n private readonly configOptions: readonly SessionConfigOption[];\n private readonly agentName: string;\n\n private initialized = false;\n private readonly sessions = new Map<string, SessionState>();\n private nextId = 1;\n\n constructor(opts: ProtocolHandlerOptions) {\n this.transport = opts.transport;\n this.defaultCwd = opts.defaultCwd;\n this.runTurn = opts.runTurn;\n this.onSessionNew = opts.onSessionNew ?? (() => {});\n this.modes = opts.modes ?? DEFAULT_MODES;\n this.configOptions = opts.configOptions ?? [];\n this.agentName = opts.agentName ?? 'wrongstack';\n }\n\n /**\n * Process one inbound message. Returns true if this was a terminal\n * message (rare; reserved for future use by the server's own\n * shutdown signal).\n */\n async handleMessage(msg: unknown): Promise<boolean> {\n if (typeof msg !== 'object' || msg === null) return false;\n const m = msg as { id?: unknown; method?: unknown; params?: unknown; result?: unknown; error?: unknown };\n\n // Response (we never initiate requests, but be defensive).\n if (m.id !== undefined && (m.result !== undefined || m.error !== undefined)) {\n return false;\n }\n\n // Request (has id, has method, no result/error)\n if (m.id !== undefined && typeof m.method === 'string') {\n return this.handleRequest(m.id as string | number, m.method, m.params);\n }\n\n // Notification (no id, has method)\n if (typeof m.method === 'string') {\n return this.handleNotification(m.method, m.params);\n }\n\n return false;\n }\n\n /** Abort all active turns and drop session state. */\n close(): void {\n for (const [, session] of this.sessions) {\n session.abort.abort();\n }\n this.sessions.clear();\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Requests\n // ────────────────────────────────────────────────────────────────────\n\n private async handleRequest(\n id: string | number,\n method: string,\n params: unknown,\n ): Promise<boolean> {\n // The only method allowed before initialize is `initialize` itself.\n if (method !== 'initialize' && !this.initialized) {\n await this.sendError(id, -32000, 'Not initialized');\n return false;\n }\n\n try {\n switch (method) {\n case 'initialize':\n return await this.handleInitialize(id, params);\n case 'authenticate':\n return await this.handleAuthenticate(id, params);\n case 'session/new':\n return await this.handleSessionNew(id, params);\n case 'session/load':\n return await this.handleSessionLoad(id, params);\n case 'session/prompt':\n return await this.handleSessionPrompt(id, params);\n case 'session/set_mode':\n return await this.handleSetMode(id, params);\n case 'session/set_config_option':\n return await this.handleSetConfigOption(id, params);\n case 'session/list':\n return await this.handleSessionList(id);\n default:\n await this.sendError(id, -32601, `Unknown method: ${method}`);\n return false;\n }\n } catch (err) {\n const { code, message, data } = errorToJsonRpc(err);\n await this.sendError(id, code, message, data);\n return false;\n }\n }\n\n private async handleInitialize(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { protocolVersion?: unknown };\n const requested = typeof p.protocolVersion === 'number' ? p.protocolVersion : 1;\n if (requested !== ACP_PROTOCOL_VERSION) {\n // v1 spec: \"If the client requests a different protocol version, the\n // agent SHOULD respond with an error and the version it supports.\"\n await this.sendError(\n id,\n -32000,\n `server speaks protocolVersion=${ACP_PROTOCOL_VERSION}, client requested ${requested}`,\n );\n return false;\n }\n this.initialized = true;\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {\n protocolVersion: ACP_PROTOCOL_VERSION,\n agentCapabilities: {\n loadSession: true,\n promptCapabilities: {\n image: false,\n audio: false,\n embeddedContext: true,\n },\n },\n agentInfo: {\n name: this.agentName,\n title: 'WrongStack',\n version: WRONGSTACK_VERSION,\n },\n // Static options advertised at handshake. They are also\n // re-sent on every `current_mode_update` / `config_option_update`\n // notification so late-joining clients see them.\n authMethods: [],\n modes: this.modes,\n configOptions: this.configOptions,\n },\n }));\n return false;\n }\n\n private async handleAuthenticate(id: string | number, _params: unknown): Promise<boolean> {\n // WrongStack doesn't currently require auth. Per spec, a server\n // MAY respond with an unauthenticated outcome to tell the client\n // to proceed without credentials.\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: { outcome: 'unauthenticated' },\n }));\n return false;\n }\n\n private async handleSessionNew(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { cwd?: unknown; mcpServers?: unknown };\n const cwd = typeof p.cwd === 'string' ? p.cwd : this.defaultCwd;\n const sessionId = `sess_${this.allocId()}`;\n const now = new Date().toISOString();\n const state: SessionState = {\n id: sessionId,\n cwd,\n abort: new AbortController(),\n modeId: DEFAULT_MODE_ID,\n createdAt: now,\n updatedAt: now,\n };\n this.sessions.set(sessionId, state);\n this.onSessionNew(state);\n\n // Per spec, the server MAY emit current_mode_update /\n // config_option_update / available_commands_update notifications\n // immediately after session/new to populate the client UI. We do.\n await this.sendNotification({\n sessionId,\n update: {\n sessionUpdate: 'current_mode_update',\n modeId: this.modes[0]?.id ?? DEFAULT_MODE_ID,\n },\n });\n if (this.configOptions.length > 0) {\n await this.sendNotification({\n sessionId,\n update: {\n sessionUpdate: 'config_option_update',\n configOptions: [...this.configOptions],\n },\n });\n }\n\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {\n sessionId,\n modes: this.modes,\n configOptions: this.configOptions,\n },\n }));\n return false;\n }\n\n private async handleSessionLoad(id: string | number, params: unknown): Promise<boolean> {\n // v1 spec: \"If `loadSession: true` is not in the agent's\n // capabilities, the client SHOULD NOT call this method.\" We\n // declared loadSession: true in initialize, so we accept it.\n // We don't persist sessions across restarts yet — for now,\n // session/load is a no-op alias of session/new.\n return this.handleSessionNew(id, params);\n }\n\n private async handleSessionPrompt(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown; prompt?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n if (!sessionId || !this.sessions.has(sessionId)) {\n await this.sendError(id, -32000, 'unknown or missing sessionId');\n return false;\n }\n if (!Array.isArray(p.prompt)) {\n await this.sendError(id, -32602, 'prompt must be an array of content blocks');\n return false;\n }\n const session = this.sessions.get(sessionId)!;\n\n // If the previous turn was cancelled, recreate the AbortController\n // so a stale signal doesn't cancel the new turn.\n if (session.abort.signal.aborted) {\n session.abort = new AbortController();\n }\n\n const turnSignal = new AbortController();\n // Forward session/cancel notifications to the turn's signal.\n const onCancel = (): void => turnSignal.abort();\n session.abort.signal.addEventListener('abort', onCancel, { once: true });\n\n let result: RunTurnResult;\n try {\n result = await this.runTurn(\n { sessionId, prompt: p.prompt as ContentBlock[], signal: turnSignal.signal },\n (update) => this.sendNotification({ sessionId, update }),\n );\n } catch (err) {\n session.abort.signal.removeEventListener('abort', onCancel);\n const { code, message, data } = errorToJsonRpc(err);\n await this.sendError(id, code, message, data);\n return false;\n }\n session.abort.signal.removeEventListener('abort', onCancel);\n session.updatedAt = new Date().toISOString();\n\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: { stopReason: result.stopReason },\n }));\n return false;\n }\n\n private async handleSetMode(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown; modeId?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const modeId = typeof p.modeId === 'string' ? p.modeId : null;\n const session = sessionId ? this.sessions.get(sessionId) : undefined;\n if (!session || !modeId || !this.modes.some((m) => m.id === modeId)) {\n await this.sendError(id, -32602, 'invalid sessionId or modeId');\n return false;\n }\n session.modeId = modeId;\n session.updatedAt = new Date().toISOString();\n await this.sendNotification({\n sessionId,\n update: { sessionUpdate: 'current_mode_update', modeId },\n });\n await this.transport.send(toWire({ jsonrpc: '2.0', id, result: {} }));\n return false;\n }\n\n private async handleSetConfigOption(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown; configOptionId?: unknown; value?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const optionId = typeof p.configOptionId === 'string' ? p.configOptionId : null;\n const value = typeof p.value === 'string' ? p.value : null;\n const session = sessionId ? this.sessions.get(sessionId) : undefined;\n const option = optionId ? this.configOptions.find((o) => o.id === optionId) : undefined;\n if (!session || !option || value === null || !option.options.some((o) => o.value === value)) {\n await this.sendError(id, -32602, 'invalid sessionId, configOptionId, or value');\n return false;\n }\n option.currentValue = value;\n session.updatedAt = new Date().toISOString();\n await this.sendNotification({\n sessionId,\n update: {\n sessionUpdate: 'config_option_update',\n configOptions: [...this.configOptions],\n },\n });\n await this.transport.send(toWire({ jsonrpc: '2.0', id, result: {} }));\n return false;\n }\n\n private async handleSessionList(id: string | number): Promise<boolean> {\n const sessions = Array.from(this.sessions.values()).map((s) => {\n const out: { sessionId: string; cwd: string; updatedAt: string; title?: string } = {\n sessionId: s.id,\n cwd: s.cwd,\n updatedAt: s.updatedAt,\n };\n if (s.title !== undefined) out.title = s.title;\n return out;\n });\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: { sessions },\n }));\n return false;\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Notifications\n // ────────────────────────────────────────────────────────────────────\n\n private async handleNotification(method: string, params: unknown): Promise<boolean> {\n switch (method) {\n case 'session/cancel': {\n const p = (params ?? {}) as { sessionId?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const session = sessionId ? this.sessions.get(sessionId) : undefined;\n if (session) {\n session.abort.abort();\n }\n return false;\n }\n case 'exit':\n // Client is shutting down. Best-effort: abort all sessions.\n this.close();\n return true;\n default:\n // Unknown notification — log and ignore.\n return false;\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Wire helpers\n // ────────────────────────────────────────────────────────────────────\n\n private async sendNotification(params: unknown): Promise<void> {\n await this.transport.send(toWire({ jsonrpc: '2.0', method: 'session/update', params }));\n }\n\n private async sendError(\n id: string | number,\n code: number,\n message: string,\n data?: unknown,\n ): Promise<void> {\n const error: { code: number; message: string; data?: unknown } = { code, message };\n if (data !== undefined) error.data = data;\n await this.transport.send(toWire({ jsonrpc: '2.0', id, error }));\n }\n\n private allocId(): number {\n return this.nextId++;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Error mapping\n// ─────────────────────────────────────────────────────────────────────────\n\nfunction errorToJsonRpc(err: unknown): { code: number; message: string; data?: unknown } {\n if (err && typeof err === 'object') {\n const e = err as { code?: unknown; message?: unknown; data?: unknown };\n if (typeof e.code === 'number' && typeof e.message === 'string') {\n const result: { code: number; message: string; data?: unknown } = {\n code: e.code,\n message: e.message,\n };\n if (e.data !== undefined) result.data = e.data;\n return result;\n }\n }\n const message = err instanceof Error ? err.message : String(err);\n return { code: -32603, message };\n}\n","/**\n * WrongStackACPServer — ACP v1 server-side entry point.\n *\n * Exposes WrongStack as an ACP-compatible agent. ACP clients (Zed, JetBrains\n * Junie, VS Code ACP extension) spawn this as a subprocess, send JSON-RPC\n * messages over stdio, and receive v1-protocol responses.\n *\n * Usage:\n * node dist/agent/wrongstack-acp-agent.js\n *\n * Or via the CLI:\n * wstack acp-server\n *\n * Wiring a real agent: this class is the surface; the bootstrap\n * binary uses a no-op echo by default so the binary is a useful\n * connectivity smoke test. For a real server, instantiate\n * `WrongStackACPServer` programmatically and pass a `runTurn`\n * produced by `makeACPServerAgentTurn({ agentFor: ... })` from\n * `./server-agent-turn.js`. The factory is responsible for building\n * a real core `Agent` (with the right provider, model, system prompt,\n * etc.) per session.\n *\n * Startup: prints the legacy `[wstack-acp]\\n` marker (kept for backward\n * compatibility with the old `StdioTransport` handshake) so the client\n * knows the protocol boundary. v1 initialize is then sent by the client\n * and answered by `ACPProtocolHandler`.\n */\nimport { fileURLToPath } from 'node:url';\nimport { writeErr } from '@wrongstack/core';\nimport {\n ACPProtocolHandler,\n type RunTurn,\n type RunTurnResult,\n} from './protocol-handler.js';\nimport { StdioTransport } from './stdio-transport.js';\n\nexport interface WrongStackACPServerOptions {\n /**\n * Per-turn implementation. If omitted, the server runs a no-op turn\n * that just resolves with `end_turn`. The real production usage\n * passes the result of `makeACPServerAgentTurn({ agentFor: ... })`\n * from `./server-agent-turn.js` so each session gets a real\n * `Agent` instance.\n */\n runTurn?: RunTurn | undefined;\n /** Default cwd for new sessions. Defaults to the current process cwd. */\n defaultCwd?: string | undefined;\n /** Agent name advertised in initialize. */\n agentName?: string | undefined;\n}\n\nexport class WrongStackACPServer {\n private readonly transport: StdioTransport;\n private readonly handler: ACPProtocolHandler;\n private running = false;\n\n constructor(opts: WrongStackACPServerOptions = {}) {\n this.transport = new StdioTransport();\n const runTurn: RunTurn = opts.runTurn ?? defaultEchoRunTurn;\n this.handler = new ACPProtocolHandler({\n transport: this.transport,\n defaultCwd: opts.defaultCwd ?? process.cwd(),\n runTurn,\n agentName: opts.agentName,\n });\n }\n\n /**\n * Start the server. Blocks until the client disconnects.\n *\n * 1. Print the legacy `[wstack-acp]\\n` marker so the client knows the\n * process is the ACP server (the old `StdioTransport` handshake).\n * 2. Loop: read messages, dispatch to the handler, until EOF / error.\n */\n async start(): Promise<void> {\n this.transport.sendStartupMarker();\n this.running = true;\n while (this.running) {\n const msg = await this.transport.read();\n if (!msg) break; // EOF\n const terminal = await this.handler.handleMessage(msg);\n if (terminal) break;\n }\n this.transport.close();\n }\n\n /** Stop the server. */\n stop(): void {\n this.running = false;\n this.transport.close();\n }\n}\n\n/**\n * Default per-turn implementation: a no-op that echoes nothing useful\n * and returns `end_turn`. Lets the server boot end-to-end without\n * needing the core Agent factory (which would couple this entrypoint\n * to a long-lived model provider). The real implementation is\n * `ACPServerAgentTurn` (follow-up PR) that wires a core `Agent`.\n */\nconst defaultEchoRunTurn: RunTurn = async (_input, _emit): Promise<RunTurnResult> => {\n return { stopReason: 'end_turn' };\n};\n\n/**\n * Bootstrap function for `node dist/agent/wrongstack-acp-agent.js`.\n * Instantiates the server with the default (no-op) runTurn so the\n * binary is useful as a connectivity smoke test.\n *\n * In practice the CLI will instantiate and run `WrongStackACPServer`\n * directly, passing a real `runTurn` wired to a core `Agent`.\n */\n/* v8 ignore start -- process entrypoint: bootstrap + auto-start only run when launched as `node wrongstack-acp-agent.js`, never on import (which the CLI does to reuse the class). */\nasync function main(): Promise<void> {\n const server = new WrongStackACPServer();\n await server.start();\n}\n\nconst isEntrypoint =\n process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1];\nif (isEntrypoint) {\n main().catch((err) => {\n writeErr(`[wstack-acp fatal] ${err}\\n`);\n process.exit(1);\n });\n}\n/* v8 ignore stop */\n","import { expectDefined } from '@wrongstack/core';\n/**\n * ToolTranslator — bidirectional translation between WrongStack tools and\n * ACP tool representations.\n *\n * Used by DIR-1 (WrongStack as ACP client) to:\n * - Map WrongStack TaskSpec → ACP task payload\n * - Map ACP tool responses → TaskResult\n *\n * Used by DIR-2 (WrongStack as ACP server) to:\n * - Convert the WrongStack Tool.inputSchema → ACPToolDefinition.inputSchema\n * - (handled by tools-registry.ts — same logic lives there)\n *\n * For DIR-1 async tool calls: ACP agents send progress notifications while\n * a tool is running, then send a final result. The translator handles this\n * by polling for the final [result] notification on the transport.\n */\nimport type {ACPMessage, ACPToolDefinition, ACPToolCallResponse, ContentBlock} from '../types/acp-messages.js';\nimport type {TaskSpec, TaskResult} from '@wrongstack/core';\nexport interface ToolTranslatorOptions {\n /**\n * If true (default), wrap tool calls in an async poll loop that waits\n * for progress notifications until a final result arrives.\n */\n asyncTools?: boolean | undefined;\n pollIntervalMs?: number | undefined;\n totalTimeoutMs?: number | undefined;\n}\n\nconst DEFAULT_OPTIONS: Required<ToolTranslatorOptions> = {\n asyncTools: true,\n pollIntervalMs: 500,\n totalTimeoutMs: 120_000,\n};\n\n/** Convert an ACP ACPToolDefinition → a JSON schema object recognisable by WrongStack */\nexport function acpToolToSchema(def: ACPToolDefinition): Record<string, unknown> {\n if (!def.inputSchema) return {type: 'object', properties: {}};\n return def.inputSchema as Record<string, unknown>;\n}\n\n/** Extract tool result text from ACP ContentBlock[] */\nexport function extractTextFromContent(blocks: ContentBlock[]): string {\n const parts: string[] = [];\n for (const b of blocks) {\n if (b.type === 'text') parts.push(b.text);\n else if (b.type === 'resource') parts.push(`[resource: ${b.resource.uri}]`);\n else if (b.type === 'image') parts.push(`[image: ${b.data.slice(0, 20)}...]`);\n else if (b.type === 'progress') {\n if (b.messages?.length) parts.push(b.messages.join('\\n'));\n }\n }\n return parts.join('\\n');\n}\n\n/** Build a TaskSpec from an ACP task payload */\nexport function buildTaskSpec(payload: {\n taskId: string;\n task: string;\n subagentId?: string | undefined;\n}): TaskSpec {\n return {\n id: payload.taskId,\n description: payload.task,\n subagentId: payload.subagentId,\n };\n}\n\n/** Parse an ACP tools/call response → TaskResult */\nexport function parseToolResponse(\n taskId: string,\n subagentId: string,\n response: ACPToolCallResponse,\n): TaskResult {\n const blocks = response.result.content;\n const text = extractTextFromContent(blocks);\n\n // Detect error state from isError flag or error-like text\n const isError =\n response.result.isError || text.toLowerCase().includes('error') ||\n text.toLowerCase().includes('failed');\n\n return {\n taskId,\n subagentId,\n status: isError ? 'failed' : 'success',\n result: text,\n iterations: 1,\n toolCalls: 1,\n durationMs: 0,\n };\n}\n\n/** ToolTranslator for DIR-1 — wraps ACP client transport, adds task semantics */\nexport class ToolTranslator {\n private readonly opts: Required<ToolTranslatorOptions>;\n private readonly pending = new Map<string | number, {\n resolve: (v: ACPToolCallResponse) => void;\n reject: (e: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }>();\n\n constructor(opts: ToolTranslatorOptions = {}) {\n this.opts = {...DEFAULT_OPTIONS, ...opts};\n }\n\n /**\n * Start listening to a transport for tool responses and cancellations.\n * Call this once after constructing the translator and before sending tasks.\n */\n attachToTransport(\n transport: {onMessage: (h: (msg: ACPMessage) => void) => () => void; send: (msg: ACPMessage) => Promise<void>},\n ): void {\n transport.onMessage((msg) => {\n if (msg.method === 'tools/call' && msg.id !== undefined) {\n const pending = this.pending.get(msg.id);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pending.delete(expectDefined(msg.id));\n pending.resolve(msg as never as ACPToolCallResponse);\n }\n }\n\n // Handle cancellation notifications\n if (msg.method === 'cancel' && msg.id !== undefined) {\n const pending = this.pending.get(msg.id);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pending.delete(expectDefined(msg.id));\n pending.reject(new Error('Call cancelled by client'));\n }\n }\n });\n }\n\n /**\n * Send a tool call over the transport and wait for a response.\n * If asyncTools is true, polls for progress and resolves when the final\n * response arrives.\n */\n async callTool(\n transport: {send: (msg: ACPMessage) => Promise<void>},\n name: string,\n args: Record<string, unknown>,\n callId: string | number = crypto.randomUUID(),\n ): Promise<ACPToolCallResponse> {\n await transport.send({\n method: 'tools/call',\n id: callId,\n params: {name, arguments: args},\n });\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pending.delete(callId);\n reject(new Error(`Tool call ${name} timed out after ${this.opts.totalTimeoutMs}ms`));\n }, this.opts.totalTimeoutMs);\n\n this.pending.set(callId, {resolve, reject, timeout});\n });\n }\n\n cancelAll(): void {\n for (const [, p] of this.pending) {\n clearTimeout(p.timeout);\n }\n this.pending.clear();\n }\n}\n","/**\n * FileServer — answers `fs/read_text_file` and `fs/write_text_file`\n * from an ACP agent, scoped to a single project root.\n *\n * Per the spec, all file paths in ACP MUST be absolute. We additionally\n * require them to resolve under `projectRoot` after normalisation;\n * anything else is rejected with a JSON-RPC error so the agent can't\n * use us to read `/etc/passwd` or write to `~/.ssh/`.\n *\n * The server itself is transport-agnostic: the caller (ACPSession)\n * routes incoming fs/* requests to `handle()` and sends the result\n * back. Keeping the routing out of this class lets the file logic be\n * unit-tested in isolation.\n */\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface FileServerOptions {\n /** Absolute path; only files under this root are accessible. */\n projectRoot: string;\n /** Per-call timeout, default 30s. */\n timeoutMs?: number;\n}\n\nexport interface ReadFileParams {\n sessionId: string;\n path: string;\n}\n\nexport interface WriteFileParams {\n sessionId: string;\n path: string;\n content: string;\n}\n\nexport type FsErrorCode = 'ENOENT' | 'EACCES' | 'OUTSIDE_ROOT' | 'TIMEOUT' | 'INVALID_PATH';\n\n/**\n * Thrown for protocol-level rejections (path outside root, etc.).\n * The session converts these into JSON-RPC error responses.\n */\nexport class FsError extends Error {\n readonly code: FsErrorCode;\n readonly path: string;\n constructor(code: FsErrorCode, path: string, message: string) {\n super(message);\n this.name = 'FsError';\n this.code = code;\n this.path = path;\n }\n}\n\nexport class FileServer {\n private readonly root: string;\n private readonly timeoutMs: number;\n\n constructor(opts: FileServerOptions) {\n this.root = path.resolve(opts.projectRoot);\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n }\n\n /** Read a text file. Returns the content as a string. */\n async readTextFile(params: ReadFileParams): Promise<{ content: string }> {\n const safe = this.resolveInside(params.path);\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const content = await fsp.readFile(safe, {\n encoding: 'utf8',\n signal: controller.signal,\n });\n return { content };\n } catch (err) {\n if (controller.signal.aborted) {\n throw new FsError('TIMEOUT', safe, `readTextFile timed out after ${this.timeoutMs}ms`);\n }\n throw mapFsError(err, safe);\n } finally {\n clearTimeout(timer);\n }\n }\n\n /** Write a text file. Atomic via write-then-rename. */\n async writeTextFile(params: WriteFileParams): Promise<void> {\n const safe = this.resolveInside(params.path);\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n const tmp = `${safe}.${randomHex(4)}.tmp`;\n try {\n await fsp.writeFile(tmp, params.content, {\n encoding: 'utf8',\n signal: controller.signal,\n });\n await fsp.rename(tmp, safe);\n } catch (err) {\n // Best-effort cleanup of the tmp file\n try {\n await fsp.unlink(tmp);\n } catch {\n // tmp didn't exist; ignore\n }\n if (controller.signal.aborted) {\n throw new FsError('TIMEOUT', safe, `writeTextFile timed out after ${this.timeoutMs}ms`);\n }\n throw mapFsError(err, safe);\n } finally {\n clearTimeout(timer);\n }\n }\n\n /**\n * Resolve a path; throw `FsError('OUTSIDE_ROOT')` if the result is\n * not under the project root. Symlinks are not followed here — we\n * operate on the textual path. A future hardening pass can\n * `fs.realpath` each access to catch symlink escapes.\n */\n private resolveInside(p: string): string {\n if (typeof p !== 'string' || p.length === 0) {\n throw new FsError('INVALID_PATH', p, 'path is empty or not a string');\n }\n if (!path.isAbsolute(p)) {\n throw new FsError('INVALID_PATH', p, 'path must be absolute (ACP requirement)');\n }\n const resolved = path.resolve(p);\n // +path.sep prevents \"/project-evil\" matching \"/project\" as a prefix.\n const rootWithSep = this.root.endsWith(path.sep) ? this.root : this.root + path.sep;\n if (resolved !== this.root && !resolved.startsWith(rootWithSep)) {\n throw new FsError('OUTSIDE_ROOT', resolved, 'path is outside the project root');\n }\n return resolved;\n }\n}\n\nfunction mapFsError(err: unknown, p: string): FsError {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return new FsError('ENOENT', p, `no such file: ${p}`);\n if (code === 'EACCES' || code === 'EPERM') {\n return new FsError('EACCES', p, `permission denied: ${p}`);\n }\n const msg = err instanceof Error ? err.message : String(err);\n return new FsError('INVALID_PATH', p, msg);\n}\n\nfunction randomHex(bytes: number): string {\n // Avoid importing node:crypto for a 4-byte hex string — use Math.random\n // with a clear warning-free use case (temp file suffix only).\n let out = '';\n for (let i = 0; i < bytes * 2; i++) {\n out += Math.floor(Math.random() * 16).toString(16);\n }\n return out;\n}\n","/**\n * Permission policy for ACP v1 client sessions.\n *\n * ACP agents can call `session/request_permission` to ask the user\n * before executing a tool call. The client is expected to surface\n * the question, get a decision, and respond. This module is the seam\n * where WrongStack-specific permission UI can plug in; for v1 we ship\n * a minimal default that auto-approves the first `allow_once` option\n * (or `allow_always` if present) and rejects on abort.\n */\nimport type {\n PermissionOption,\n RequestPermissionOutcome,\n ToolCallUpdateNotification,\n} from '../types/acp-v1.js';\n\n/** A single permission decision request. */\nexport interface PermissionRequest {\n toolCall: ToolCallUpdateNotification;\n options: readonly PermissionOption[];\n signal: AbortSignal;\n}\n\n/** A permission policy decides how to respond to a request. */\nexport type PermissionPolicy = (\n req: PermissionRequest,\n) => Promise<RequestPermissionOutcome>;\n\n/**\n * Default policy: pick the safest-looking allow option if the signal\n * is not aborted, otherwise report cancelled. Order of preference:\n *\n * 1. `allow_always`\n * 2. `allow_once`\n * 3. anything else with `optionId` (last resort)\n *\n * Real WrongStack permission UIs replace this; the contract is the\n * `PermissionPolicy` function type, not the implementation.\n */\nexport const defaultPermissionPolicy: PermissionPolicy = async (req) => {\n if (req.signal.aborted) return { outcome: 'cancelled' };\n\n const ranked = [...req.options].sort((a, b) => {\n const score = (k: PermissionOption['kind']): number => {\n if (k === 'allow_always') return 0;\n if (k === 'allow_once') return 1;\n if (k === 'reject_once') return 2;\n return 3;\n };\n return score(a.kind) - score(b.kind);\n });\n const chosen = ranked[0];\n if (!chosen || chosen.kind === 'reject_once' || chosen.kind === 'reject_always') {\n return { outcome: 'cancelled' };\n }\n return { outcome: 'selected', optionId: chosen.optionId };\n};\n","/**\n * TerminalServer — answers `terminal/*` methods from an ACP agent.\n *\n * The spec lets agents spawn shell commands inside the client's\n * environment and observe their output. We honour the protocol, but\n * every command runs under a per-process timeout and a byte limit on\n * retained output, both to keep runaway agents from filling memory\n * and to give the runner a clean signal when something is stuck.\n *\n * Scoping: commands run with `cwd` set to the agent's requested cwd\n * if it's inside `projectRoot`, else `projectRoot`. There is no\n * per-terminal `env` allowlist in v1; the agent's env is propagated\n * from the spawn options.\n */\nimport { spawn } from 'node:child_process';\nimport * as path from 'node:path';\n\nexport interface TerminalServerOptions {\n projectRoot: string;\n /** Hard cap on per-command wall-clock. Default 5 minutes. */\n commandTimeoutMs?: number;\n /** Bytes of output to retain per terminal. Default 1 MiB. */\n outputByteLimit?: number;\n /** Optional abort signal that kills ALL active terminals. */\n signal?: AbortSignal;\n}\n\ninterface TerminalState {\n proc: ReturnType<typeof spawn>;\n cwd: string;\n command: string;\n args: string[];\n /** Output buffer as a string; appended as bytes arrive. */\n output: string;\n /** Bytes currently retained (post-truncation). */\n retainedBytes: number;\n /** True once we've dropped output to fit under the per-call byte limit. */\n truncated: boolean;\n exitStatus?: { exitCode: number | null; signal: string | null } | undefined;\n /** Resolves when the process exits. */\n exitPromise: Promise<{ exitCode: number | null; signal: string | null }>;\n /** Per-terminal timeout handle. */\n timeoutHandle: ReturnType<typeof setTimeout> | null;\n}\n\nexport class TerminalServer {\n private readonly terminals = new Map<string, TerminalState>();\n private readonly projectRoot: string;\n private readonly commandTimeoutMs: number;\n private readonly outputByteLimit: number;\n private nextId = 1;\n\n constructor(opts: TerminalServerOptions) {\n this.projectRoot = path.resolve(opts.projectRoot);\n this.commandTimeoutMs = opts.commandTimeoutMs ?? 5 * 60_000;\n this.outputByteLimit = opts.outputByteLimit ?? 1024 * 1024;\n if (opts.signal) {\n opts.signal.addEventListener('abort', () => this.releaseAll());\n }\n }\n\n /** Spawn a new terminal. Returns the agent-facing id. */\n create(params: {\n sessionId: string;\n command: string;\n args?: string[];\n env?: { name: string; value: string }[];\n cwd?: string;\n outputByteLimit?: number;\n }): { terminalId: string } {\n const id = `term_${this.nextId++}`;\n const cwd = this.resolveCwd(params.cwd);\n const proc = spawn(params.command, params.args ?? [], {\n cwd,\n env: this.buildEnv(params.env),\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n // shell: false on purpose. The terminal server is invoked with\n // the agent's explicit argv; turning on shell-mode would make\n // the command a single shell-parsed string, which breaks\n // Windows cmd quoting for the common case of running node with\n // `-e \"<script>\"`. If a future feature needs shell features\n // (pipes, redirects), it should be opt-in per-call, not the\n // default.\n });\n\n const state: TerminalState = {\n proc,\n cwd,\n command: params.command,\n args: params.args ?? [],\n output: '',\n retainedBytes: 0,\n truncated: false,\n exitStatus: undefined,\n timeoutHandle: null,\n exitPromise: new Promise((resolve) => {\n proc.on('close', (code, signalName) => {\n if (state.timeoutHandle) {\n clearTimeout(state.timeoutHandle);\n state.timeoutHandle = null;\n }\n const exitStatus = {\n exitCode: typeof code === 'number' ? code : null,\n signal: typeof signalName === 'string' ? signalName : null,\n };\n state.exitStatus = exitStatus;\n resolve(exitStatus);\n });\n proc.on('error', (err) => {\n // Spawn-time errors (ENOENT etc.) — surface as a special\n // exit status with exitCode 127 (command not found).\n if (state.timeoutHandle) {\n clearTimeout(state.timeoutHandle);\n state.timeoutHandle = null;\n }\n const exitStatus = { exitCode: 127, signal: null };\n state.exitStatus = exitStatus;\n state.output += `[spawn error] ${err.message}\\n`;\n state.retainedBytes += Buffer.byteLength(state.output, 'utf8');\n resolve(exitStatus);\n });\n }),\n };\n\n const perCallByteLimit = params.outputByteLimit ?? this.outputByteLimit;\n proc.stdout?.setEncoding('utf8');\n proc.stderr?.setEncoding('utf8');\n const onData = (chunk: string): void => {\n state.output += chunk;\n state.retainedBytes = Buffer.byteLength(state.output, 'utf8');\n // Truncate from the start if we exceed the limit. Per spec, the\n // truncation MUST happen at a character boundary. UTF-8 slicing\n // a string can land mid-codepoint; we trim back to the last\n // complete code point to honour that.\n while (state.retainedBytes > perCallByteLimit) {\n const trimmed = state.output.slice(1);\n // Cheap boundary check: if dropping the first char doesn't\n // shrink us by at least one byte, we're slicing inside a\n // multi-byte sequence; keep dropping.\n state.output = trimmed;\n const newBytes = Buffer.byteLength(state.output, 'utf8');\n if (newBytes >= state.retainedBytes) {\n // give up — would loop forever\n break;\n }\n state.retainedBytes = newBytes;\n state.truncated = true;\n }\n };\n proc.stdout?.on('data', onData);\n proc.stderr?.on('data', onData);\n\n state.timeoutHandle = setTimeout(() => {\n // Best-effort kill; we don't have an exact \"TIMEOUT\" stop reason\n // so we just exit with -1.\n try {\n proc.kill('SIGTERM');\n } catch {\n // already dead\n }\n }, this.commandTimeoutMs);\n\n this.terminals.set(id, state);\n return { terminalId: id };\n }\n\n /** Return captured output and (if available) the exit status. */\n output(terminalId: string): { output: string; truncated: boolean; exitStatus?: { exitCode: number | null; signal: string | null } } {\n const state = this.terminals.get(terminalId);\n if (!state) throw new Error(`unknown terminal: ${terminalId}`);\n return {\n output: state.output,\n truncated: state.truncated,\n ...(state.exitStatus ? { exitStatus: state.exitStatus } : {}),\n };\n }\n\n /** Block until the process exits. Resolves with the exit status. */\n async waitForExit(terminalId: string): Promise<{ exitCode: number | null; signal: string | null }> {\n const state = this.terminals.get(terminalId);\n if (!state) throw new Error(`unknown terminal: ${terminalId}`);\n return state.exitPromise;\n }\n\n /** Kill the process but keep the terminal record (agent can still read output). */\n kill(terminalId: string): void {\n const state = this.terminals.get(terminalId);\n if (!state) throw new Error(`unknown terminal: ${terminalId}`);\n try {\n state.proc.kill('SIGTERM');\n } catch {\n // already dead\n }\n }\n\n /** Kill the process if alive and remove the record. */\n release(terminalId: string): void {\n const state = this.terminals.get(terminalId);\n if (!state) return;\n if (state.timeoutHandle) {\n clearTimeout(state.timeoutHandle);\n state.timeoutHandle = null;\n }\n try {\n state.proc.kill('SIGKILL');\n } catch {\n // already dead\n }\n this.terminals.delete(terminalId);\n }\n\n /** Kill all active terminals. Used on session close. */\n releaseAll(): void {\n for (const id of [...this.terminals.keys()]) {\n this.release(id);\n }\n }\n\n private resolveCwd(cwd: string | undefined): string {\n if (!cwd) return this.projectRoot;\n const resolved = path.resolve(cwd);\n const rootWithSep = this.projectRoot.endsWith(path.sep)\n ? this.projectRoot\n : this.projectRoot + path.sep;\n if (resolved !== this.projectRoot && !resolved.startsWith(rootWithSep)) {\n return this.projectRoot;\n }\n return resolved;\n }\n\n private buildEnv(\n agentEnv?: { name: string; value: string }[],\n ): NodeJS.ProcessEnv {\n // On Windows, `process.env` stores PATH as `Path` (the OS-native\n // case). Node's child_process.spawn looks up `env.PATH` (uppercase)\n // when resolving the binary. A plain `{ ...process.env }` spread\n // preserves `Path` but not `PATH`, which causes ENOENT for any\n // binary resolved via $PATH on Windows. Copy uppercase aliases so\n // spawn can find the binary.\n const env: NodeJS.ProcessEnv = { ...process.env };\n if (process.platform === 'win32') {\n if (env.Path !== undefined && env.PATH === undefined) env.PATH = env.Path;\n if (env.PATHEXT !== undefined && env.PATHEXT_CASE === undefined) {\n env.PATHEXT_CASE = env.PATHEXT;\n }\n }\n if (agentEnv) {\n for (const { name, value } of agentEnv) {\n env[name] = value;\n }\n }\n return env;\n }\n}\n","/**\n * ACPSession — v1-correct ACP client.\n *\n * Owns one child process running an ACP-supporting agent (Claude Code,\n * Gemini CLI, Codex CLI, etc.) and translates the wire protocol into\n * a `SubagentRunner`-shaped surface for the rest of WrongStack.\n *\n * Spec: https://agentclientprotocol.com/protocol/v1/overview\n * Design: see ./acp-session.design.md in this directory.\n */\nimport { ClientTransport } from '../agent/stdio-transport.js';\nimport type { ACPMessage } from '../types/acp-messages.js';\nimport {\n ACP_PROTOCOL_VERSION,\n type ContentBlock,\n type PlanEntry,\n type StopReason,\n type ToolCallUpdateNotification,\n type UsageCost,\n} from '../types/acp-v1.js';\nimport { FileServer, FsError } from './file-server.js';\nimport {\n defaultPermissionPolicy,\n type PermissionPolicy,\n} from './permission.js';\nimport { TerminalServer } from './terminal-server.js';\n\nexport interface ACPSessionOptions {\n command: string;\n args?: readonly string[] | undefined;\n env?: Record<string, string> | undefined;\n cwd?: string | undefined;\n role?: string | undefined;\n /** Sandbox root for fs/* and terminal/* methods. */\n projectRoot: string;\n /** Hard timeout for one prompt turn. Default 5 minutes. */\n timeoutMs?: number | undefined;\n /** Override the permission policy. */\n permissionPolicy?: PermissionPolicy | undefined;\n /** Per-fs-call timeout, default 30s. */\n fsTimeoutMs?: number | undefined;\n /** Per-terminal command timeout, default 5 minutes. */\n terminalTimeoutMs?: number | undefined;\n /** Per-terminal output byte cap, default 1 MiB. */\n terminalOutputByteLimit?: number | undefined;\n}\n\nexport interface ACPSessionRunResult {\n text: string;\n stopReason: StopReason;\n hasText: boolean;\n usage?: { used: number; size: number; cost?: UsageCost | undefined } | undefined;\n plan?: PlanEntry[] | undefined;\n}\n\nexport type ACPSessionErrorKind =\n | 'spawn_failed'\n | 'init_failed'\n | 'protocol_error'\n | 'session_create_failed'\n | 'prompt_failed'\n | 'aborted'\n | 'closed'\n | 'agent_died'\n | 'unsupported_capability';\n\nexport class ACPSessionError extends Error {\n readonly kind: ACPSessionErrorKind;\n override readonly cause: unknown;\n constructor(kind: ACPSessionErrorKind, message: string, cause?: unknown) {\n super(message);\n this.name = 'ACPSessionError';\n this.kind = kind;\n this.cause = cause;\n }\n}\n\ninterface PendingRequest {\n method: string;\n resolve: (v: unknown) => void;\n reject: (e: Error) => void;\n /** Wall-clock cap for this specific request. */\n timeoutMs: number;\n timeoutHandle: ReturnType<typeof setTimeout>;\n}\n\ntype State = 'init' | 'ready' | 'sessioning' | 'prompting' | 'done' | 'closed';\n\ninterface JsonRpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\nfunction isJsonRpcError(v: unknown): v is JsonRpcError {\n return (\n typeof v === 'object' &&\n v !== null &&\n typeof (v as { code?: unknown }).code === 'number' &&\n typeof (v as { message?: unknown }).message === 'string'\n );\n}\n\nexport class ACPSession {\n private readonly transport: ClientTransport;\n private readonly fileServer: FileServer;\n private readonly terminalServer: TerminalServer;\n private readonly permissionPolicy: PermissionPolicy;\n private readonly timeoutMs: number;\n private readonly opts: ACPSessionOptions;\n\n private state: State = 'init';\n private sessionId: string | null = null;\n /** Pending outbound requests (initialize, session/new, session/prompt, etc). */\n private readonly pending = new Map<string | number, PendingRequest>();\n private nextId = 1;\n /** True after close() has been called. */\n private closed = false;\n\n private constructor(opts: ACPSessionOptions, transport: ClientTransport) {\n this.opts = opts;\n this.transport = transport;\n this.timeoutMs = opts.timeoutMs ?? 5 * 60_000;\n const fsOpts: ConstructorParameters<typeof FileServer>[0] = {\n projectRoot: opts.projectRoot,\n };\n if (opts.fsTimeoutMs !== undefined) fsOpts.timeoutMs = opts.fsTimeoutMs;\n this.fileServer = new FileServer(fsOpts);\n const termOpts: ConstructorParameters<typeof TerminalServer>[0] = {\n projectRoot: opts.projectRoot,\n };\n if (opts.terminalTimeoutMs !== undefined) {\n termOpts.commandTimeoutMs = opts.terminalTimeoutMs;\n }\n if (opts.terminalOutputByteLimit !== undefined) {\n termOpts.outputByteLimit = opts.terminalOutputByteLimit;\n }\n this.terminalServer = new TerminalServer(termOpts);\n this.permissionPolicy = opts.permissionPolicy ?? defaultPermissionPolicy;\n }\n\n /**\n * Spawn the child, run the initialize handshake, install the\n * message dispatch, and return a ready session.\n */\n static async start(opts: ACPSessionOptions): Promise<ACPSession> {\n const transportOpts: ConstructorParameters<typeof ClientTransport>[0] = {\n command: opts.command,\n args: opts.args ? [...opts.args] : [],\n handshakeTimeoutMs: 30_000,\n // ACPSession is the v1 CLIENT side: it speaks to external agents\n // (Claude Code, Gemini CLI, …) that do NOT emit a `[wstack-acp]\\n`\n // startup marker. The transport should treat the child as ready\n // as soon as the process is spawned and stdout is flowing.\n skipHandshakeMarker: true,\n };\n if (opts.env !== undefined) transportOpts.env = opts.env;\n if (opts.cwd !== undefined) transportOpts.cwd = opts.cwd;\n const transport = new ClientTransport(transportOpts);\n try {\n await transport.start();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new ACPSessionError('spawn_failed', `failed to spawn ${opts.command}: ${msg}`, err);\n }\n\n const session = new ACPSession(opts, transport);\n transport.onMessage((msg) => session.handleMessage(msg));\n\n try {\n await session.initialize();\n } catch (err) {\n try {\n transport.stop();\n } catch {\n // best effort\n }\n throw err;\n }\n return session;\n }\n\n private async initialize(): Promise<void> {\n const id = this.allocId();\n const result = await this.sendRequest(id, 'initialize', {\n protocolVersion: ACP_PROTOCOL_VERSION,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n terminal: true,\n promptCapabilities: { image: false, audio: false, embeddedContext: true },\n },\n clientInfo: { name: 'wrongstack', title: 'WrongStack', version: '0.263.0' },\n });\n if (isJsonRpcError(result)) {\n throw new ACPSessionError('init_failed', `initialize failed: ${result.message}`, result);\n }\n if (\n typeof result !== 'object' ||\n result === null ||\n typeof (result as { protocolVersion?: unknown }).protocolVersion !== 'number'\n ) {\n throw new ACPSessionError('protocol_error', 'initialize returned no protocolVersion');\n }\n const r = result as { protocolVersion: number };\n if (r.protocolVersion !== ACP_PROTOCOL_VERSION) {\n throw new ACPSessionError(\n 'unsupported_capability',\n `agent speaks protocolVersion=${r.protocolVersion}, client speaks ${ACP_PROTOCOL_VERSION}`,\n );\n }\n this.state = 'ready';\n }\n\n /**\n * Run one prompt turn. Creates a session if needed, sends the\n * prompt, streams session/update notifications, and resolves with\n * the agent's response.\n *\n * Cancellation: if `signal` aborts mid-prompt, we send\n * `session/cancel` (a notification per spec) and keep accepting\n * updates until the agent returns with `stopReason: 'cancelled'`.\n * The result is the same shape as a normal turn, with\n * `stopReason === 'cancelled'`.\n */\n async prompt(text: string, signal: AbortSignal): Promise<ACPSessionRunResult> {\n if (this.closed) {\n throw new ACPSessionError('closed', 'session is closed');\n }\n if (this.state !== 'ready' && this.state !== 'done') {\n throw new ACPSessionError('protocol_error', `prompt called in state=${this.state}`);\n }\n\n // Pre-aborted signals short-circuit BEFORE we create a session\n // and before any wire activity. Per spec, a cancelled prompt is\n // a normal outcome and the spec's \"cancel via session/cancel\n // notification\" path only applies to in-flight prompts. A\n // never-started prompt just returns the cancelled stopReason\n // with no text.\n if (signal.aborted) {\n return { text: '', stopReason: 'cancelled', hasText: false };\n }\n\n if (!this.sessionId) {\n await this.createSession();\n }\n\n this.resetScratch();\n\n const promptId = this.allocId();\n const turnPromise = this.sendRequest(\n promptId,\n 'session/prompt',\n {\n sessionId: this.sessionId,\n prompt: [textContent(text)] satisfies ContentBlock[],\n },\n this.timeoutMs,\n );\n\n let cancelled = false;\n const onAbort = (): void => {\n cancelled = true;\n // Best-effort cancel: send a notification (no id). Per spec the\n // agent MUST eventually respond to our session/prompt request\n // with `stopReason: 'cancelled'`.\n this.transport\n .send({ method: 'session/cancel', params: { sessionId: this.sessionId } })\n .catch(() => {\n // transport may already be torn down — ignore\n });\n };\n signal.addEventListener('abort', onAbort, { once: true });\n\n this.state = 'prompting';\n let response: unknown;\n try {\n response = await turnPromise;\n } catch (err) {\n this.state = 'done';\n signal.removeEventListener('abort', onAbort);\n if (cancelled || signal.aborted) {\n throw new ACPSessionError('aborted', 'prompt was aborted by the parent');\n }\n const msg = err instanceof Error ? err.message : String(err);\n throw new ACPSessionError('prompt_failed', `session/prompt failed: ${msg}`, err);\n } finally {\n signal.removeEventListener('abort', onAbort);\n }\n\n this.state = 'done';\n if (isJsonRpcError(response)) {\n throw new ACPSessionError('prompt_failed', `agent error: ${response.message}`, response);\n }\n const stopReason = (response as { stopReason?: StopReason }).stopReason ?? 'end_turn';\n const finalText = this.scratch.text;\n return {\n text: finalText,\n stopReason,\n hasText: finalText.length > 0,\n usage: this.scratch.usage,\n plan: this.scratch.plan,\n };\n }\n\n private async createSession(): Promise<void> {\n const id = this.allocId();\n const result = await this.sendRequest(id, 'session/new', {\n cwd: this.opts.cwd ?? this.opts.projectRoot,\n mcpServers: [],\n });\n if (isJsonRpcError(result)) {\n throw new ACPSessionError(\n 'session_create_failed',\n `session/new failed: ${result.message}`,\n result,\n );\n }\n const sessionId = (result as { sessionId?: unknown }).sessionId;\n if (typeof sessionId !== 'string' || sessionId.length === 0) {\n throw new ACPSessionError(\n 'protocol_error',\n 'session/new returned no sessionId',\n result,\n );\n }\n this.sessionId = sessionId;\n }\n\n /** Tear down the session and kill the child process. */\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.state = 'closed';\n this.terminalServer.releaseAll();\n // Reject any pending outbound requests so their awaits return.\n for (const [, p] of this.pending) {\n clearTimeout(p.timeoutHandle);\n p.reject(new ACPSessionError('closed', 'session was closed'));\n }\n this.pending.clear();\n try {\n this.transport.stop();\n } catch {\n // best effort\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Wire layer\n // ────────────────────────────────────────────────────────────────────\n\n private allocId(): number {\n return this.nextId++;\n }\n\n private async sendRequest(\n id: number,\n method: string,\n params: unknown,\n timeoutMs?: number,\n ): Promise<unknown> {\n return new Promise<unknown>((resolve, reject) => {\n const effectiveTimeout = timeoutMs ?? this.timeoutMs;\n const handle = setTimeout(() => {\n this.pending.delete(id);\n reject(\n new ACPSessionError(\n 'protocol_error',\n `${method} timed out after ${effectiveTimeout}ms`,\n ),\n );\n }, effectiveTimeout);\n this.pending.set(id, {\n method,\n resolve: resolve as (v: unknown) => void,\n reject,\n timeoutMs: effectiveTimeout,\n timeoutHandle: handle,\n });\n this.transport\n .send({ jsonrpc: '2.0', id, method, params } as never as ACPMessage)\n .catch((err) => {\n clearTimeout(handle);\n this.pending.delete(id);\n const msg = err instanceof Error ? err.message : String(err);\n reject(new ACPSessionError('protocol_error', `send ${method} failed: ${msg}`, err));\n });\n });\n }\n\n private handleMessage(msg: ACPMessage): void {\n // Response to an outbound request (has id and either result or error)\n if (msg.id !== undefined && (msg.result !== undefined || msg.error !== undefined)) {\n const pending = this.pending.get(msg.id);\n if (!pending) return;\n clearTimeout(pending.timeoutHandle);\n this.pending.delete(msg.id);\n if (msg.error !== undefined) {\n pending.reject(new Error(msg.error.message ?? 'unknown JSON-RPC error'));\n } else {\n pending.resolve(msg.result);\n }\n return;\n }\n\n // session/update notification (no id)\n if (msg.method === 'session/update') {\n this.handleUpdate(msg);\n return;\n }\n\n // session/request_permission (has id, expected response: outcome)\n if (msg.method === 'session/request_permission') {\n void this.handlePermissionRequest(msg);\n return;\n }\n\n // fs/* requests\n if (msg.method === 'fs/read_text_file' || msg.method === 'fs/write_text_file') {\n void this.handleFsRequest(msg);\n return;\n }\n\n // terminal/* requests\n if (msg.method?.startsWith('terminal/')) {\n void this.handleTerminalRequest(msg);\n return;\n }\n\n // Anything else: log to stderr and ignore. Don't crash.\n if (msg.method) {\n // eslint-disable-next-line no-console\n console.warn(`[acp-session] unhandled method: ${msg.method}`);\n }\n }\n\n private handleUpdate(msg: ACPMessage): void {\n const update = (msg as { params?: { update?: unknown } }).params?.update;\n if (typeof update !== 'object' || update === null) return;\n const u = update as { sessionUpdate?: string; [k: string]: unknown };\n switch (u.sessionUpdate) {\n case 'agent_message_chunk': {\n const text = extractText(u.content);\n if (text) this.accumulatedText(text);\n return;\n }\n case 'thought_chunk':\n // Log only; v1 doesn't surface thoughts to the TUI yet.\n return;\n case 'tool_call':\n case 'tool_call_update':\n // Tool calls run inside the external agent; we observe but\n // don't proxy execution. The TUI can read these from the\n // session JSONL if it needs to display them.\n return;\n case 'plan':\n if (Array.isArray(u.entries)) {\n this.accumulatedPlan(u.entries as PlanEntry[]);\n }\n return;\n case 'usage_update':\n if (typeof u.used === 'number' && typeof u.size === 'number') {\n this.accumulatedUsage({\n used: u.used,\n size: u.size,\n ...(typeof u.cost === 'object' && u.cost !== null\n ? {\n cost: u.cost as UsageCost,\n }\n : {}),\n });\n }\n return;\n case 'available_commands_update':\n case 'current_mode_update':\n case 'config_option_update':\n case 'session_info_update':\n case 'user_message_chunk':\n // Observed but not consumed in v1.\n return;\n default:\n // _unstable_* and unknown — log once per kind.\n // eslint-disable-next-line no-console\n console.warn(`[acp-session] unhandled sessionUpdate: ${u.sessionUpdate}`);\n return;\n }\n }\n\n // Per-prompt scratch state. Reset at the start of each prompt() and\n // read at the end to assemble the ACPSessionRunResult. The stream\n // pump writes to it via the three `accumulated*` helpers below.\n private scratch: {\n text: string;\n plan?: PlanEntry[];\n usage?: { used: number; size: number; cost?: UsageCost | undefined };\n } = { text: '' };\n\n private accumulatedText(chunk: string): void {\n this.scratch.text += chunk;\n }\n private accumulatedPlan(entries: PlanEntry[]): void {\n this.scratch.plan = entries;\n }\n private accumulatedUsage(u: { used: number; size: number; cost?: UsageCost | undefined }): void {\n this.scratch.usage = u;\n }\n\n private resetScratch(): void {\n this.scratch = { text: '' };\n }\n\n private async handlePermissionRequest(msg: ACPMessage): Promise<void> {\n const id = msg.id;\n if (id === undefined) return;\n const params = (msg as { params?: { toolCall?: unknown; options?: unknown } }).params;\n const toolCall = params?.toolCall as ToolCallUpdateNotification | undefined;\n const options = Array.isArray(params?.options)\n ? (params.options as never as Parameters<PermissionPolicy>[0]['options'])\n : [];\n if (!toolCall) {\n await this.transport.send({\n id,\n method: 'session/request_permission',\n error: { code: -32602, message: 'toolCall is required' },\n });\n return;\n }\n const policyAbort = new AbortController();\n const outcome = await this.permissionPolicy({\n toolCall,\n options,\n signal: policyAbort.signal,\n });\n await this.transport.send({\n id,\n method: 'session/request_permission',\n result: { outcome },\n });\n }\n\n private async handleFsRequest(msg: ACPMessage): Promise<void> {\n const id = msg.id;\n if (id === undefined) return;\n const params = (msg as { params?: { sessionId?: string; path?: string; content?: string } }).params;\n if (!params?.path) {\n await this.transport.send({\n id,\n method: msg.method,\n error: { code: -32602, message: 'path is required' },\n });\n return;\n }\n try {\n if (msg.method === 'fs/read_text_file') {\n const result = await this.fileServer.readTextFile({\n sessionId: params.sessionId ?? '',\n path: params.path,\n });\n await this.transport.send({ id, method: msg.method, result });\n } else {\n await this.fileServer.writeTextFile({\n sessionId: params.sessionId ?? '',\n path: params.path,\n content: params.content ?? '',\n });\n await this.transport.send({ id, method: msg.method, result: {} });\n }\n } catch (err) {\n const code = err instanceof FsError ? -32602 : -32603;\n const message = err instanceof Error ? err.message : String(err);\n await this.transport.send({ id, method: msg.method, error: { code, message } });\n }\n }\n\n private async handleTerminalRequest(msg: ACPMessage): Promise<void> {\n const id = msg.id;\n if (id === undefined) return;\n const params = (msg as { params?: Record<string, unknown> }).params ?? {};\n try {\n switch (msg.method) {\n case 'terminal/create': {\n const createOpts: Parameters<TerminalServer['create']>[0] = {\n sessionId: String(params.sessionId ?? ''),\n command: String(params.command ?? ''),\n args: Array.isArray(params.args) ? (params.args as string[]) : [],\n };\n if (Array.isArray(params.env)) {\n createOpts.env = params.env as { name: string; value: string }[];\n }\n if (typeof params.cwd === 'string') {\n createOpts.cwd = params.cwd;\n }\n if (typeof params.outputByteLimit === 'number') {\n createOpts.outputByteLimit = params.outputByteLimit;\n }\n const result = this.terminalServer.create(createOpts);\n await this.transport.send({ id, method: msg.method, result });\n return;\n }\n case 'terminal/output': {\n const terminalId = String(params.terminalId ?? '');\n const out = this.terminalServer.output(terminalId);\n await this.transport.send({ id, method: msg.method, result: out });\n return;\n }\n case 'terminal/wait_for_exit': {\n const terminalId = String(params.terminalId ?? '');\n const exit = await this.terminalServer.waitForExit(terminalId);\n await this.transport.send({ id, method: msg.method, result: exit });\n return;\n }\n case 'terminal/kill': {\n const terminalId = String(params.terminalId ?? '');\n this.terminalServer.kill(terminalId);\n await this.transport.send({ id, method: msg.method, result: {} });\n return;\n }\n case 'terminal/release': {\n const terminalId = String(params.terminalId ?? '');\n this.terminalServer.release(terminalId);\n await this.transport.send({ id, method: msg.method, result: {} });\n return;\n }\n default:\n await this.transport.send({\n id,\n method: msg.method,\n error: { code: -32601, message: `unknown method: ${msg.method}` },\n });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await this.transport.send({\n id,\n method: msg.method,\n error: { code: -32603, message },\n });\n }\n }\n}\n\nfunction textContent(text: string): ContentBlock {\n return { type: 'text', text };\n}\n\nfunction extractText(block: unknown): string {\n if (typeof block !== 'object' || block === null) return '';\n const b = block as { type?: string; text?: unknown };\n if (b.type === 'text' && typeof b.text === 'string') return b.text;\n return '';\n}\n","/**\n * ACPSubagentRunner — `SubagentRunner` implementation for DIR-1.\n *\n * Wraps an external ACP-supporting agent (Claude Code, Gemini CLI, Codex\n * CLI, Cline, Goose, OpenHands, etc.) as a WrongStack subagent. The\n * external agent runs its own agent loop; we send it a task via the ACP\n * v1 protocol and return the result.\n *\n * v1 spec: https://agentclientprotocol.com/protocol/v1/overview\n *\n * Connected to the Director / MultiAgentCoordinator via the\n * `SubagentRunner` interface (same shape as `AgentSubagentRunner`).\n */\nimport type {\n SubagentError,\n SubagentErrorKind,\n SubagentRunContext,\n SubagentRunOutcome,\n SubagentRunner,\n TaskSpec,\n} from '@wrongstack/core';\nimport { ACPSession, ACPSessionError } from '../client/acp-session.js';\nimport type { ACPSessionErrorKind } from '../client/acp-session.js';\n\nexport interface ACPSubagentRunnerOptions {\n /** How to spawn the external agent. */\n command: string;\n args?: string[] | undefined;\n env?: Record<string, string> | undefined;\n cwd?: string | undefined;\n /** Subagent role label — surfaced in errors and used for logging. */\n role?: string | undefined;\n /**\n * Hard wall-clock cap for one prompt turn. Defaults to 5 minutes.\n * Overrides `SubagentRunContext.budget.limits.timeoutMs` if both are set.\n */\n timeoutMs?: number | undefined;\n /**\n * Filesystem sandbox root. Defaults to `options.cwd` (when set) or\n * the process's current working directory. All `fs/read_text_file` /\n * `fs/write_text_file` calls are bounded to this root.\n */\n projectRoot?: string | undefined;\n}\n\n/**\n * Static catalog of agent ids → spawn options.\n *\n * The CLI and the host's `buildACPRunner` look up entries by id. The\n * canonical, multi-source catalog is `packages/acp/src/registry/agents.catalog.ts`\n * (the 12-entry static catalog introduced in commit 4ad287b4). This\n * map stays for backward compatibility with existing call sites that\n * import it directly; new code should prefer the registry.\n */\nexport const ACP_AGENT_COMMANDS: Record<string, ACPSubagentRunnerOptions> = {\n cline: {\n command: 'npx',\n args: ['-y', '@agentify/cline'],\n role: 'cline',\n },\n 'gemini-cli': {\n command: 'gemini',\n role: 'gemini-cli',\n },\n copilot: {\n command: 'gh',\n args: ['copilot', 'agent'],\n role: 'copilot',\n },\n openhands: {\n command: 'openhands',\n role: 'openhands',\n },\n goose: {\n command: 'goose',\n role: 'goose',\n },\n};\n\n/**\n * Build a one-shot `SubagentRunner` for a single agent invocation. Each\n * call to the returned function spawns a fresh child process, runs one\n * prompt turn, and tears everything down. The cost is ~1 second of\n * process-startup per call; for long-lived sessions (multi-turn\n * conversations), use `makeACPSubagentRunnerWithStop` and call `stop()`\n * explicitly.\n */\nexport async function makeACPSubagentRunner(\n options: ACPSubagentRunnerOptions,\n): Promise<SubagentRunner> {\n const { runner, stop } = await makeACPSubagentRunnerWithStop(options);\n // Wrap so we always tear down after the turn, even if the caller\n // forgot to call `stop()`. stop() is idempotent, so a double-call is\n // safe.\n const wrappedRunner: SubagentRunner = async (task, ctx) => {\n try {\n return await runner(task, ctx);\n } finally {\n stop();\n }\n };\n return wrappedRunner;\n}\n\n/**\n * Build a long-lived `SubagentRunner` plus an explicit `stop()` for\n * teardown. The caller is responsible for calling `stop()` when done\n * (or when the host's signal fires). Useful for the `wstack acp spawn`\n * CLI command, which holds the child open for the duration of a user\n * task and tears down on SIGINT.\n */\nexport async function makeACPSubagentRunnerWithStop(\n options: ACPSubagentRunnerOptions,\n): Promise<{ runner: SubagentRunner; stop: () => void }> {\n const projectRoot = options.projectRoot ?? options.cwd ?? process.cwd();\n const timeoutMs = options.timeoutMs ?? 5 * 60_000;\n\n const runner: SubagentRunner = async (\n task: TaskSpec,\n ctx: SubagentRunContext,\n ): Promise<SubagentRunOutcome> => {\n let session: ACPSession | null = null;\n try {\n session = await ACPSession.start({\n command: options.command,\n ...(options.args !== undefined ? { args: options.args } : {}),\n ...(options.env !== undefined ? { env: options.env } : {}),\n ...(options.cwd !== undefined ? { cwd: options.cwd } : {}),\n projectRoot,\n timeoutMs,\n role: options.role,\n });\n } catch (err) {\n // init / spawn failure. Throw a structured error so the host can\n // classify it (SubagentErrorKind).\n throw acpErrorToSubagentError(err, options.role ?? 'acp-subagent');\n }\n\n try {\n const result = await session.prompt(task.description, ctx.signal);\n // We don't surface plan/usage in the simple SubagentRunOutcome;\n // a future PR can add them if the TUI/renderer wants to display\n // them. Treat \"no text emitted\" as a soft signal (an ACP agent\n // may legitimately end with no message), not an error.\n return {\n result: result.text,\n iterations: 1,\n toolCalls: 0,\n };\n } catch (err) {\n if (err instanceof ACPSessionError && err.kind === 'aborted') {\n // The host's AbortController fired. Surface a structured\n // 'aborted_by_parent' so the coordinator's classifier can\n // branch correctly.\n throw acpErrorToSubagentError(err, options.role ?? 'acp-subagent');\n }\n throw acpErrorToSubagentError(err, options.role ?? 'acp-subagent');\n } finally {\n // Per design: stop() is idempotent. We always close after a turn\n // — multi-turn conversations are a future feature, not v1.\n try {\n await session.close();\n } catch {\n // best-effort cleanup\n }\n }\n };\n\n // No long-lived resources outside of `session`, which is created\n // and destroyed per call. `stop()` is a no-op kept for API parity\n // with the previous version.\n const stop = (): void => {\n // no-op; session is closed in the runner's finally block.\n };\n\n return { runner, stop };\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Error mapping\n// ─────────────────────────────────────────────────────────────────────────\n\n/**\n * Map an ACPSessionError (or arbitrary Error from the session layer)\n * to a structured `SubagentError` that the existing coordinator can\n * classify and act on. Unknown error shapes get `kind: 'unknown'` —\n * they shouldn't crash the parent.\n */\nfunction acpErrorToSubagentError(\n err: unknown,\n subagentId: string,\n): SubagentError {\n if (err instanceof ACPSessionError) {\n const kind = mapACPKind(err.kind);\n return {\n kind,\n message: `${subagentId}: ${err.message}`,\n retryable: isRetryable(kind),\n cause: {\n name: err.name,\n message: err.message,\n ...(err.stack !== undefined ? { stack: err.stack } : {}),\n },\n };\n }\n const message = err instanceof Error ? err.message : String(err);\n return {\n kind: 'bridge_failed',\n message: `${subagentId}: ${message}`,\n retryable: false,\n cause: {\n name: err instanceof Error ? err.name : 'Error',\n message,\n ...(err instanceof Error && err.stack !== undefined ? { stack: err.stack } : {}),\n },\n };\n}\n\nfunction mapACPKind(acpKind: ACPSessionErrorKind): SubagentErrorKind {\n switch (acpKind) {\n case 'spawn_failed':\n case 'init_failed':\n case 'session_create_failed':\n case 'agent_died':\n case 'protocol_error':\n return 'bridge_failed';\n case 'prompt_failed':\n return 'tool_failed';\n case 'aborted':\n return 'aborted_by_parent';\n case 'closed':\n case 'unsupported_capability':\n return 'unknown';\n }\n}\n\nfunction isRetryable(kind: SubagentErrorKind): boolean {\n // Conservative: spawn / init / protocol / agent-died are NOT\n // retryable as-is (they need config or a re-install). Timeouts and\n // prompt failures might be — the parent's classifier will branch on\n // `kind` and decide.\n switch (kind) {\n case 'provider_5xx':\n case 'provider_rate_limit':\n case 'provider_timeout':\n case 'tool_threw':\n case 'budget_timeout':\n return true;\n default:\n return false;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Unused but exported for future use\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Re-export so the CLI handler can import the session type. */\nexport type { ACPSession };\n\n/** Exposed for the `wstack acp list` renderer. */\nexport function describeAgent(id: string): {\n command: string;\n args: readonly string[];\n role: string;\n} | null {\n const entry = ACP_AGENT_COMMANDS[id];\n if (!entry) return null;\n return {\n command: entry.command,\n args: entry.args ?? [],\n role: entry.role ?? id,\n };\n}\n","/**\n * Static catalog of ACP-supporting agents known to WrongStack.\n *\n * Scope: CLI-spawnable agents only (i.e. agents that can be run as a\n * subprocess with stdio JSON-RPC, per the ACP v1 spec's local-transport\n * model). IDE-only or SaaS-only entries from\n * https://agentclientprotocol.com/get-started/agents are deliberately\n * omitted — they can't be driven by a SubagentRunner.\n *\n * Maintenance\n * ───────────\n * This is a static catalog by design. ACP v1 is a moving target: agents\n * ship ACP support, deprecate it, change invocation flags. Auto-fetching\n * a live registry sounds appealing but adds a runtime dependency on\n * network + on whatever schema the ACP team decides on for the Registry\n * RFD. A typed static file the maintainer refreshes on a known schedule\n * is more reliable, easier to diff in PRs, and keeps probe failures\n * attributable to the local machine rather than to a transient registry\n * outage.\n *\n * Each entry tags its `integration` mechanism:\n * - `native` — the agent ships with a documented ACP entry flag.\n * - `adapter` — runs through Zed's SDK adapter or similar wrapper.\n * - `community` — community-maintained wrapper (e.g. `@agentify/cline`,\n * `bub-acp-server`, `pi-acp`).\n * - `experimental` — listed by ACP but no public ACP entry yet;\n * entry may not work.\n *\n * When the maintainer verifies an entry works, flip `integration` from\n * `experimental` to `native`/`adapter`/`community` and remove the warning.\n *\n * Detection\n * ─────────\n * The `EnsembleRegistry` (sibling module) probes each entry's `probe`\n * argv in parallel via `Promise.allSettled`. A probe that exits 0 with\n * a non-empty stdout line is considered installed. Probes that time out\n * or print nothing are treated as not-installed.\n */\nimport type { ACPAgentDescriptor } from './ensemble-registry.js';\n\n/**\n * The catalog. Order is significant for the TUI render — most-requested\n * agents go first. Edit by re-ordering, not by alphabetising.\n */\nexport const AGENTS_CATALOG: readonly ACPAgentDescriptor[] = [\n // ── Anthropic ────────────────────────────────────────────────────────\n {\n id: 'claude-code',\n displayName: 'Claude Code',\n vendor: 'anthropic',\n probe: { command: 'claude', args: ['--version'] },\n // Native ACP entry is gated behind the SDK adapter in early releases;\n // see https://agentclientprotocol.com/get-started/agents\n acp: { command: 'claude', args: [] },\n supports: {\n loadSession: true,\n promptImages: true,\n terminal: true,\n fs: true,\n },\n integration: 'adapter',\n docs: 'https://docs.anthropic.com/en/docs/claude-code',\n },\n\n // ── Google ───────────────────────────────────────────────────────────\n {\n id: 'gemini-cli',\n displayName: 'Gemini CLI',\n vendor: 'google',\n probe: { command: 'gemini', args: ['--version'] },\n acp: { command: 'gemini', args: [] },\n supports: {\n loadSession: true,\n promptImages: true,\n terminal: true,\n fs: true,\n },\n integration: 'native',\n docs: 'https://github.com/google-gemini/gemini-cli',\n },\n\n // ── OpenAI ───────────────────────────────────────────────────────────\n {\n id: 'codex-cli',\n displayName: 'Codex CLI',\n vendor: 'openai',\n probe: { command: 'codex', args: ['--version'] },\n acp: { command: 'codex', args: [] },\n supports: {\n loadSession: false,\n promptImages: false,\n terminal: true,\n fs: true,\n },\n integration: 'adapter',\n docs: 'https://github.com/openai/codex',\n },\n\n // ── GitHub ───────────────────────────────────────────────────────────\n {\n id: 'copilot',\n displayName: 'GitHub Copilot CLI',\n vendor: 'github',\n probe: { command: 'gh', args: ['copilot', '--help'] },\n acp: { command: 'gh', args: ['copilot'] },\n supports: {\n loadSession: false,\n promptImages: false,\n terminal: true,\n fs: false,\n },\n integration: 'experimental',\n docs: 'https://github.com/features/copilot/cli',\n },\n\n // ── Community / wrappers ─────────────────────────────────────────────\n {\n id: 'cline',\n displayName: 'Cline',\n vendor: 'community',\n probe: { command: 'npx', args: ['--version'] },\n acp: {\n command: 'npx',\n args: ['-y', '@agentify/cline'],\n },\n supports: {\n loadSession: true,\n promptImages: true,\n terminal: true,\n fs: true,\n },\n integration: 'community',\n docs: 'https://github.com/cline/cline',\n },\n {\n id: 'goose',\n displayName: 'Goose',\n vendor: 'community',\n probe: { command: 'goose', args: ['--version'] },\n acp: { command: 'goose', args: [] },\n supports: {\n loadSession: true,\n promptImages: true,\n terminal: true,\n fs: true,\n },\n integration: 'experimental',\n docs: 'https://github.com/block/goose',\n },\n {\n id: 'openhands',\n displayName: 'OpenHands',\n vendor: 'community',\n probe: { command: 'openhands', args: ['--version'] },\n acp: { command: 'openhands', args: [] },\n supports: {\n loadSession: false,\n promptImages: true,\n terminal: true,\n fs: true,\n },\n integration: 'experimental',\n // Canonical repo URL — the org renamed; All-Hands-AI/OpenHands 301-redirects here.\n docs: 'https://github.com/OpenHands/OpenHands',\n },\n\n // ── Vendor CLIs (native binaries) ───────────────────────────────────\n {\n id: 'qwen-code',\n displayName: 'Qwen Code',\n vendor: 'community',\n probe: { command: 'qwen', args: ['--version'] },\n acp: { command: 'qwen', args: [] },\n supports: {\n loadSession: false,\n promptImages: false,\n terminal: true,\n fs: false,\n },\n integration: 'experimental',\n docs: 'https://github.com/QwenLM/Qwen3-Coder',\n },\n {\n id: 'kiro-cli',\n displayName: 'Kiro CLI',\n vendor: 'community',\n probe: { command: 'kiro', args: ['--version'] },\n acp: { command: 'kiro', args: [] },\n supports: {\n loadSession: false,\n promptImages: false,\n terminal: true,\n fs: true,\n },\n integration: 'experimental',\n docs: 'https://kiro.dev',\n },\n {\n id: 'opencode',\n displayName: 'OpenCode',\n vendor: 'community',\n probe: { command: 'opencode', args: ['--version'] },\n acp: { command: 'opencode', args: [] },\n supports: {\n loadSession: true,\n promptImages: true,\n terminal: true,\n fs: true,\n },\n integration: 'native',\n docs: 'https://github.com/sst/opencode',\n },\n {\n id: 'mistral-vibe',\n displayName: 'Mistral Vibe',\n vendor: 'community',\n probe: { command: 'vibe', args: ['--version'] },\n acp: { command: 'vibe', args: [] },\n supports: {\n loadSession: false,\n promptImages: false,\n terminal: true,\n fs: false,\n },\n integration: 'experimental',\n docs: 'https://github.com/mistralai/mistral-vibe',\n },\n {\n id: 'cursor',\n displayName: 'Cursor',\n vendor: 'community',\n probe: { command: 'cursor', args: ['--version'] },\n acp: { command: 'cursor', args: [] },\n supports: {\n loadSession: true,\n promptImages: true,\n terminal: true,\n fs: true,\n },\n integration: 'experimental',\n docs: 'https://cursor.com',\n },\n] as const;\n\n/** O(1) lookup by id. Returns `undefined` for unknown ids. */\nexport function findAgentDescriptor(\n id: string,\n): ACPAgentDescriptor | undefined {\n return AGENTS_CATALOG.find((a) => a.id === id);\n}\n","/**\n * EnsembleRegistry — discovery layer for ACP-supporting agents.\n *\n * Combines the static catalog (`agents.catalog.ts`) with a runtime\n * `$PATH` probe to report which agents are installed on this machine.\n * The result feeds `wstack acp list`, the `/spawn` picker, and the\n * ensemble UI.\n *\n * Why probe on demand rather than cache at module load\n * ─────────────────────────────────────────────────────\n * The maintainer installs a new agent mid-session. Caching at module\n * load means the cache is stale for the rest of the run. A 5-second\n * per-process cache (`cachedAt`) keeps the common case cheap and the\n * fresh case correct.\n */\nimport { spawn } from 'node:child_process';\nimport type { ChildProcess } from 'node:child_process';\nimport { AGENTS_CATALOG } from './agents.catalog.js';\n\n/** Vendor classification — used to filter the catalog by family. */\nexport type ACPAgentVendor =\n | 'anthropic'\n | 'google'\n | 'openai'\n | 'github'\n | 'community';\n\n/** How the agent is integrated into ACP. */\nexport type ACPIntegration =\n /** Agent ships with a documented ACP entry flag. */\n | 'native'\n /** Runs through Zed's SDK adapter or similar wrapper. */\n | 'adapter'\n /** Community-maintained wrapper (e.g. @agentify/cline, bub-acp-server). */\n | 'community'\n /** Listed by ACP but no public ACP entry yet; may not work. */\n | 'experimental';\n\n/** Static metadata for a known agent. */\nexport interface ACPAgentDescriptor {\n /** Stable identifier used as the spawn key. Lowercase, hyphenated. */\n id: string;\n /** Display name shown in the TUI / WebUI / CLI. */\n displayName: string;\n vendor: ACPAgentVendor;\n /** argv to detect installation. Exits 0 with stdout on success. */\n probe: { command: string; args?: readonly string[] };\n /** argv to start the agent in ACP mode. */\n acp: { command: string; args?: readonly string[]; env?: Record<string, string> };\n /** Capability hints — used to fail fast when the binary predates ACP. */\n supports: {\n loadSession: boolean;\n promptImages: boolean;\n terminal: boolean;\n fs: boolean;\n };\n integration: ACPIntegration;\n /** Documentation URL — shown in `wstack acp list` and the ensemble UI. */\n docs: string;\n}\n\n/** A descriptor with its runtime detection result attached. */\nexport interface DetectedAgent extends ACPAgentDescriptor {\n installed: boolean;\n /** Absolute path to the binary, if discovered. */\n path?: string;\n /** Captured version string, if `probe` produced one. */\n version?: string;\n /**\n * When `installed: false`, a short reason — typically \"binary not\n * found\", \"binary predates ACP\", or \"probe timed out\".\n */\n reason?: string;\n}\n\n/** A single probe failure — never thrown, always returned. */\ninterface ProbeFailure {\n ok: false;\n reason: string;\n /** Wall-clock duration of the failed probe in ms. */\n durationMs: number;\n}\n\ninterface ProbeSuccess {\n ok: true;\n version: string;\n path?: string;\n durationMs: number;\n}\n\ntype ProbeResult = ProbeSuccess | ProbeFailure;\n\nconst PROBE_TIMEOUT_MS = 5_000;\nconst PROBE_CACHE_MS = 5_000;\n\nexport interface EnsembleRegistryOptions {\n /** Override the catalog (mostly for tests). */\n catalog?: readonly ACPAgentDescriptor[];\n /** Override the probe timeout (ms). */\n probeTimeoutMs?: number;\n /** Inject a custom probe function (used by tests). */\n probeFn?: (descriptor: ACPAgentDescriptor) => Promise<ProbeResult>;\n}\n\n/**\n * Probe a single descriptor by running its `probe` argv. Resolves with\n * a structured result rather than throwing — a failed probe is data, not\n * an error.\n */\nasync function defaultProbe(\n desc: ACPAgentDescriptor,\n timeoutMs: number,\n): Promise<ProbeResult> {\n const start = Date.now();\n return new Promise((resolve) => {\n let settled = false;\n let stdout = '';\n let stderr = '';\n\n const finish = (result: ProbeResult): void => {\n if (settled) return;\n settled = true;\n try {\n child.kill();\n } catch {\n // already dead\n }\n resolve(result);\n };\n\n let child: ChildProcess;\n try {\n child = spawn(desc.probe.command, [...(desc.probe.args ?? [])], {\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n // On Windows, `claude`, `gemini`, `npx`, etc. are typically\n // installed as `.cmd` shims under AppData\\Roaming\\npm\\. Node's\n // spawn() will not find them without shell-mode unless the\n // extension is present. `shell: true` resolves this for the\n // common case. The probe argv is always from our static\n // catalog, never user input, so shell-expansion is bounded.\n shell: process.platform === 'win32',\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n finish({ ok: false, reason: `spawn failed: ${msg}`, durationMs: 0 });\n return;\n }\n\n const timer = setTimeout(() => {\n finish({ ok: false, reason: 'probe timed out', durationMs: Date.now() - start });\n }, timeoutMs);\n\n child.stdout?.setEncoding('utf8');\n child.stdout?.on('data', (chunk: string) => {\n stdout += chunk;\n });\n child.stderr?.setEncoding('utf8');\n child.stderr?.on('data', (chunk: string) => {\n stderr += chunk;\n });\n\n child.on('error', (err) => {\n clearTimeout(timer);\n finish({\n ok: false,\n reason: `binary not found: ${err.message}`,\n durationMs: Date.now() - start,\n });\n });\n\n child.on('close', (code) => {\n clearTimeout(timer);\n const durationMs = Date.now() - start;\n const out = (stdout + stderr).trim();\n\n // With `shell: true` on Windows, spawn() never ENOENTs — the\n // cmd shell launches, prints \"<command> is not recognized\", and\n // exits non-zero. Detect that specific shape and treat the binary\n // as not-installed. The literal string is locale-stable for\n // Windows cmd.exe English (the only locale we ship in CI).\n const isWindowsShellMiss =\n process.platform === 'win32' &&\n out.toLowerCase().includes('is not recognized');\n\n if (isWindowsShellMiss) {\n finish({\n ok: false,\n reason: 'binary not found',\n durationMs,\n });\n return;\n }\n\n if (out.length > 0) {\n // The binary ran and produced output. We don't gate on exit\n // code: some agents print version info but exit non-zero; some\n // print to stderr. If we got here without a shell-miss, the\n // binary is installed.\n finish({\n ok: true,\n version: out.split('\\n')[0]?.trim() ?? '',\n path: desc.probe.command,\n durationMs,\n });\n return;\n }\n // Empty output: the binary didn't behave as a version probe.\n // Treat as not-installed with the exit code as the reason.\n finish({\n ok: false,\n reason: `exit code ${code ?? 'null'}; no output`,\n durationMs,\n });\n });\n });\n}\n\nexport class EnsembleRegistry {\n private readonly catalog: readonly ACPAgentDescriptor[];\n private readonly timeoutMs: number;\n private readonly probe: (d: ACPAgentDescriptor) => Promise<ProbeResult>;\n private cache: { at: number; result: readonly DetectedAgent[] } | null = null;\n\n constructor(options: EnsembleRegistryOptions = {}) {\n this.catalog = options.catalog ?? AGENTS_CATALOG;\n this.timeoutMs = options.probeTimeoutMs ?? PROBE_TIMEOUT_MS;\n this.probe = options.probeFn ?? ((d) => defaultProbe(d, this.timeoutMs));\n }\n\n /** Return the full catalog (no probe), in catalog order. */\n listAll(): readonly ACPAgentDescriptor[] {\n return this.catalog;\n }\n\n /**\n * Probe every catalog entry in parallel and return the detection\n * results. Results are cached for `PROBE_CACHE_MS`.\n */\n async list(): Promise<readonly DetectedAgent[]> {\n if (this.cache && Date.now() - this.cache.at < PROBE_CACHE_MS) {\n return this.cache.result;\n }\n const result = await Promise.all(\n this.catalog.map((d) => this.detect(d)),\n );\n this.cache = { at: Date.now(), result };\n return result;\n }\n\n /** Probe a single descriptor. Always returns a `DetectedAgent`. */\n async detect(desc: ACPAgentDescriptor): Promise<DetectedAgent> {\n const result = await this.probe(desc);\n if (result.ok) {\n const detected: DetectedAgent = {\n ...desc,\n installed: true,\n version: result.version,\n };\n if (result.path !== undefined) detected.path = result.path;\n return detected;\n }\n return { ...desc, installed: false, reason: result.reason };\n }\n\n /** Invalidate the per-process cache. */\n invalidate(): void {\n this.cache = null;\n }\n\n /** Convenience: just the installed agents. */\n async listInstalled(): Promise<readonly DetectedAgent[]> {\n const all = await this.list();\n return all.filter((a) => a.installed);\n }\n}\n","/**\n * Ensemble runner — fan a single task out to multiple ACP agents in parallel.\n *\n * This is the engine behind both:\n * - `wstack acp parallel <csv> <task>` (CLI subcommand)\n * - `/ensemble <csv> <task>` (TUI slash command)\n *\n * The CLI wraps `runEnsemble` with a plain-text renderer. The TUI can\n * call it directly and format the result however it likes (text dump,\n * per-agent tabbed panels, etc.).\n *\n * Design notes\n * ────────────\n * - Skipping is up-front. We probe the registry once, then run only\n * the installed agents. This keeps the \"no installed agents\" path\n * cheap (no spawn attempts) and the error message clear.\n * - All agents run concurrently via `Promise.allSettled`. A single\n * failed agent doesn't kill the others; the call returns once every\n * agent has either completed or crashed.\n * - Per-agent errors are captured as structured `{kind, message}`\n * objects, not thrown. The aggregated result is one `EnsembleResult`\n * with per-agent outcomes. Callers can render it as they please.\n * - The `signal` option propagates as the parent AbortSignal for each\n * `SubagentRunner`. Aborting cancels all in-flight agents.\n * - Idempotent cleanup: each agent's `stop()` is called in a\n * `finally`, so a throw in the body still tears the child down.\n */\nimport { EnsembleRegistry, type DetectedAgent } from '../registry/ensemble-registry.js';\nimport { findAgentDescriptor } from '../registry/agents.catalog.js';\nimport { SubagentBudget } from '@wrongstack/core/coordination';\nimport {\n ACP_AGENT_COMMANDS,\n makeACPSubagentRunnerWithStop,\n type ACPSubagentRunnerOptions,\n} from './acp-subagent-runner.js';\n\n/**\n * Per-agent outcome from an ensemble run.\n * `status === 'skipped'` carries a `reason`; the other statuses carry\n * either a result or an error envelope.\n */\nexport interface EnsembleAgentResult {\n agentId: string;\n status: 'success' | 'failed' | 'skipped' | 'cancelled';\n /** The agent's text result. Present for `status === 'success'`. */\n result?: string | undefined;\n /** Structured error. Present for `status === 'failed' | 'cancelled'`. */\n error?: { kind: string; message: string } | undefined;\n /** Why the agent was skipped (not installed, unknown id, etc.). */\n reason?: string | undefined;\n /** Wall-clock time spent on this agent. 0 for skipped. */\n durationMs: number;\n /** Agent-reported iteration count (1 per ACP turn). */\n iterations: number;\n /** Agent-reported tool call count (currently 0 for ACP). */\n toolCalls: number;\n}\n\n/** Aggregate result of one ensemble run. */\nexport interface EnsembleResult {\n /** The task that was dispatched. */\n task: string;\n /** Agent ids as the user provided them, after dedup. */\n requested: string[];\n /** Per-agent outcomes, in the order they were requested. */\n results: EnsembleAgentResult[];\n /** Roll-up of the per-agent statuses. */\n summary: {\n succeeded: number;\n failed: number;\n skipped: number;\n cancelled: number;\n };\n /** Total wall-clock time of the run (longest agent). */\n totalDurationMs: number;\n}\n\n/** Sync command resolver: id → command, or null if unknown. */\nexport type EnsembleCmdResolver = (id: string) => ACPSubagentRunnerOptions | null;\n\nexport interface EnsembleRunnerOptions {\n /**\n * Comma-separated agent ids. Whitespace, empty entries, and\n * duplicates are filtered out. Order is preserved.\n */\n agentIds: string;\n /** The task description forwarded verbatim to each agent. */\n task: string;\n /**\n * Per-agent hard timeout in ms. Defaults to 5 minutes; the\n * `SubagentRunner` itself layers a turn-level timeout under this.\n */\n timeoutMs?: number;\n /**\n * Override the registry used for the install probe. Defaults to\n * `new EnsembleRegistry()`. Useful for tests.\n */\n registry?: EnsembleRegistry;\n /**\n * Override the command resolver. Defaults to\n * `defaultEnsembleCmdResolver` (legacy `ACP_AGENT_COMMANDS` map\n * with catalog fallback via `findAgentDescriptor`). Useful for\n * tests that don't want the real `makeACPSubagentRunnerWithStop`.\n */\n resolveCmd?: EnsembleCmdResolver;\n /**\n * Cancellation signal. Aborting stops all in-flight agents via the\n * `SubagentRunContext.signal` they receive.\n */\n signal?: AbortSignal | undefined;\n}\n\n/**\n * Default command resolver. Checks the legacy `ACP_AGENT_COMMANDS` map\n * first, then falls back to the 12-entry catalog. Returns `null` for\n * ids that aren't in either source.\n */\nexport const defaultEnsembleCmdResolver: EnsembleCmdResolver = (id) => {\n const fromMap = ACP_AGENT_COMMANDS[id];\n if (fromMap) return fromMap;\n const desc = findAgentDescriptor(id);\n if (!desc) return null;\n const out: ACPSubagentRunnerOptions = {\n command: desc.acp.command,\n args: [...(desc.acp.args ?? [])],\n role: id,\n };\n if (desc.acp.env) out.env = desc.acp.env;\n return out;\n};\n\n/**\n * Update one result in-place. Keeps the array order stable so callers\n * can render results in the same order they were requested.\n */\nfunction setResult(\n results: EnsembleAgentResult[],\n agentId: string,\n patch: Partial<EnsembleAgentResult>,\n): void {\n const i = results.findIndex((r) => r.agentId === agentId);\n if (i < 0) return;\n const current = results[i]!;\n results[i] = { ...current, ...patch };\n}\n\n/**\n * Run a single agent and return its structured outcome. Always\n * resolves (never throws) — errors are encoded in the returned\n * `EnsembleAgentResult.status`.\n */\nasync function runOne(\n agentId: string,\n cmd: ACPSubagentRunnerOptions,\n task: string,\n timeoutMs: number,\n signal: AbortSignal | undefined,\n): Promise<Omit<EnsembleAgentResult, 'agentId'>> {\n const startedAt = Date.now();\n try {\n const { runner, stop } = await makeACPSubagentRunnerWithStop({\n ...cmd,\n timeoutMs,\n });\n try {\n // SubagentRunner signature: (task, ctx) => Promise<{result, iterations, toolCalls}>.\n // The budget is required by the context type but the runner never\n // invokes it for a single ACP turn. We construct a real one so the\n // cast stays clean and the context satisfies the type system.\n const budget = new SubagentBudget({\n timeoutMs,\n maxIterations: 2000,\n maxToolCalls: 5000,\n });\n const result = await runner(\n { id: `ensemble-${agentId}`, description: task },\n {\n subagentId: agentId,\n config: {\n id: agentId,\n name: agentId,\n role: agentId,\n provider: 'acp',\n prompt: '',\n },\n budget,\n signal: signal ?? new AbortController().signal,\n bridge: null,\n },\n );\n return {\n status: 'success',\n result: result.result == null ? '' : String(result.result),\n durationMs: Date.now() - startedAt,\n iterations: result.iterations,\n toolCalls: result.toolCalls,\n };\n } finally {\n try {\n stop();\n } catch {\n /* best-effort */\n }\n }\n } catch (err) {\n const e = err as { kind?: string; message?: string; name?: string };\n const isAbort =\n e?.name === 'AbortError' ||\n e?.kind === 'aborted' ||\n e?.kind === 'aborted_by_parent' ||\n e?.message?.toLowerCase().includes('aborted');\n return {\n status: isAbort ? 'cancelled' : 'failed',\n error: {\n kind: e?.kind ?? (isAbort ? 'aborted' : 'unknown'),\n message:\n e?.message ?? (err instanceof Error ? err.message : String(err)),\n },\n durationMs: Date.now() - startedAt,\n iterations: 0,\n toolCalls: 0,\n };\n }\n}\n\n/**\n * Fan a task out to multiple ACP agents concurrently.\n *\n * Returns once every requested agent has either completed, failed, or\n * been cancelled. Skipped agents (not installed, unknown id) are\n * reported with `status: 'skipped'` and don't block the result.\n *\n * The function is a pure orchestrator — it does NOT render output. The\n * caller decides how to format the `EnsembleResult`.\n */\nexport async function runEnsemble(opts: EnsembleRunnerOptions): Promise<EnsembleResult> {\n const timeoutMs = opts.timeoutMs ?? 5 * 60_000;\n const registry = opts.registry ?? new EnsembleRegistry();\n const resolveCmd = opts.resolveCmd ?? defaultEnsembleCmdResolver;\n\n // 1. Parse + dedup the comma list, preserving order.\n const seen = new Set<string>();\n const requested: string[] = [];\n for (const raw of opts.agentIds.split(',')) {\n const id = raw.trim();\n if (!id || seen.has(id)) continue;\n seen.add(id);\n requested.push(id);\n }\n\n const results: EnsembleAgentResult[] = requested.map((agentId) => ({\n agentId,\n status: 'skipped',\n durationMs: 0,\n iterations: 0,\n toolCalls: 0,\n }));\n const startMs = Date.now();\n\n if (requested.length === 0) {\n return {\n task: opts.task,\n requested,\n results,\n summary: { succeeded: 0, failed: 0, skipped: 0, cancelled: 0 },\n totalDurationMs: 0,\n };\n }\n\n // 2. Probe the registry to classify each id as installed / not.\n const detected = await registry.list();\n const detectedById = new Map(detected.map((a: DetectedAgent) => [a.id, a]));\n\n // 3. Build the runnable set. Agents that aren't installed stay\n // 'skipped' in the result; agents with no command resolver get\n // 'failed' (unknown_agent).\n const runnable: { id: string; cmd: ACPSubagentRunnerOptions }[] = [];\n for (const id of requested) {\n const det = detectedById.get(id);\n if (!det?.installed) {\n setResult(results, id, {\n status: 'skipped',\n reason: det?.reason ?? 'not in catalog',\n });\n continue;\n }\n const cmd = resolveCmd(id);\n if (!cmd) {\n setResult(results, id, {\n status: 'failed',\n error: { kind: 'unknown_agent', message: `Unknown ACP agent: ${id}` },\n durationMs: 0,\n });\n continue;\n }\n runnable.push({ id, cmd });\n }\n\n // 4. Fan out the runnable set. AllSettled so one failure doesn't\n // poison the others.\n await Promise.allSettled(\n runnable.map(async ({ id, cmd }) => {\n // Honor parent abort BEFORE doing anything expensive.\n if (opts.signal?.aborted) {\n setResult(results, id, {\n status: 'cancelled',\n error: { kind: 'aborted', message: 'aborted by parent' },\n durationMs: 0,\n });\n return;\n }\n const outcome = await runOne(id, cmd, opts.task, timeoutMs, opts.signal);\n setResult(results, id, outcome);\n }),\n );\n\n // 5. Build the summary.\n const summary = { succeeded: 0, failed: 0, skipped: 0, cancelled: 0 };\n for (const r of results) {\n if (r.status === 'success') summary.succeeded++;\n else if (r.status === 'failed') summary.failed++;\n else if (r.status === 'cancelled') summary.cancelled++;\n else summary.skipped++;\n }\n\n return {\n task: opts.task,\n requested,\n results,\n summary,\n totalDurationMs: Date.now() - startMs,\n };\n}\n\n/**\n * Render an `EnsembleResult` as a plain-text block. Useful as the\n * default for the CLI; the TUI can call this or build a richer view.\n *\n * The format mirrors the output the `wstack acp parallel` subcommand\n * emits, so existing scripts that parse the CLI's output keep working.\n */\nexport function renderEnsembleText(result: EnsembleResult): string {\n const lines: string[] = [];\n if (result.requested.length === 0) {\n lines.push('No agent ids provided.');\n return lines.join('\\n');\n }\n for (const r of result.results) {\n lines.push(`\\n=== ${r.agentId} ===`);\n switch (r.status) {\n case 'success':\n lines.push(r.result && r.result.length > 0 ? r.result : '(no result)');\n lines.push(\n `[${r.agentId}] success ${r.durationMs}ms iterations=${r.iterations} toolCalls=${r.toolCalls}`,\n );\n break;\n case 'failed':\n lines.push(\n `[${r.error?.kind ?? 'unknown'}] ${r.error?.message ?? 'failed'}`,\n );\n lines.push(`[${r.agentId}] failed ${r.durationMs}ms`);\n break;\n case 'cancelled':\n lines.push(\n `[${r.error?.kind ?? 'aborted'}] ${r.error?.message ?? 'cancelled'}`,\n );\n lines.push(`[${r.agentId}] cancelled ${r.durationMs}ms`);\n break;\n case 'skipped':\n lines.push(`(skipped — ${r.reason ?? 'not installed'})`);\n break;\n }\n }\n const { succeeded, failed, skipped, cancelled } = result.summary;\n lines.push(\n `\\nEnsemble summary: ${succeeded} succeeded, ${failed} failed, ${cancelled} cancelled, ${skipped} skipped. (${result.totalDurationMs}ms total)`,\n );\n return lines.join('\\n');\n}\n"]}
1
+ {"version":3,"sources":["../src/agent/stdio-transport.ts","../src/agent/tools-registry.ts","../src/types/acp-v1.ts","../src/agent/protocol-handler.ts","../src/agent/wrongstack-acp-agent.ts","../src/client/websocket-transport.ts","../src/client/tool-translator.ts","../src/client/file-server.ts","../src/client/permission.ts","../src/client/terminal-server.ts","../src/client/acp-session.ts","../src/registry/agents.catalog.ts","../src/integration/acp-subagent-runner.ts","../src/registry/ensemble-registry.ts","../src/registry/acp-registry-fetch.ts","../src/integration/ensemble-runner.ts","../src/integration/acp-bench.ts"],"names":["resolve","spawn","params","writeErr","expectDefined","path","path2","SubagentBudget","reason","path3","fsp2"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * StdioTransport — bidirectional stdin/stdout communication for ACP.\n *\n * ACP uses newline-delimited JSON-RPC 2.0 messages over stdio:\n * client → agent: JSON-RPC request/notification on stdin\n * agent → client: JSON-RPC response/notification on stdout\n *\n * Legacy startup marker support remains for older internal harnesses, but\n * standard ACP agents must not write non-JSON data to stdout.\n */\nimport { expectDefined, writeErr } from '@wrongstack/core';\nimport type { ACPMessage } from '../types/acp-messages.js';\nexport interface AgentServerTransport {\n send(msg: ACPMessage): Promise<void>;\n sendRaw(chunk: string): void;\n read(): Promise<ACPMessage | null>;\n close(): void;\n onMessage(handler: (msg: ACPMessage) => void): () => void;\n}\n\n/**\n * Minimal client-side transport contract `ACPSession` drives. `ClientTransport`\n * (stdio subprocess) and `WebSocketClientTransport` (remote) both implement it,\n * so the session is agnostic to how bytes reach the agent.\n */\nexport interface ACPClientTransport {\n start(): Promise<void>;\n send(msg: ACPMessage): Promise<void>;\n onMessage(handler: (msg: ACPMessage) => void): () => void;\n stop(): void;\n}\n\nexport class StdioTransport implements AgentServerTransport {\n private readonly stdin = process.stdin;\n private readonly stdout = process.stdout;\n private readonly stderr = process.stderr;\n\n private buffer = '';\n private readonly handlers = new Set<(msg: ACPMessage) => void>();\n private closed = false;\n private resolveRead: ((msg: ACPMessage | null) => void) | null = null;\n private messageQueue: ACPMessage[] = [];\n\n constructor() {\n this.stdin.resume();\n this.stdin.setEncoding('utf8');\n this.stdin.on('data', (chunk: string) => this.onData(chunk));\n this.stdin.on('end', () => this.handleClose());\n this.stdin.on('error', (err: Error) => this.failAll(err));\n }\n\n sendStartupMarker(): void {\n this.stdout.write('[wstack-acp]\\n', 'utf8');\n }\n\n send(msg: ACPMessage): Promise<void> {\n if (this.closed) return Promise.resolve();\n return new Promise((resolve) => {\n const line = JSON.stringify(msg) + '\\n';\n this.stdout.write(line, 'utf8', () => resolve());\n });\n }\n\n sendRaw(chunk: string): void {\n this.stdout.write(chunk, 'utf8');\n }\n\n read(): Promise<ACPMessage | null> {\n if (this.messageQueue.length > 0) return Promise.resolve(expectDefined(this.messageQueue.shift()));\n if (this.closed) return Promise.resolve(null);\n return new Promise((resolve) => {\n this.resolveRead = resolve;\n });\n }\n\n onMessage(handler: (msg: ACPMessage) => void): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n close(): void {\n this.closed = true;\n this.stdin.pause();\n this.resolveRead?.(null);\n this.resolveRead = null;\n }\n\n private onData(chunk: string): void {\n this.buffer += chunk;\n const lines = this.buffer.split('\\n');\n /* v8 ignore next -- split() always yields ≥1 element, so pop() is never undefined; the ?? '' is defensive. */\n this.buffer = lines.pop() ?? '';\n\n for (const raw of lines) {\n if (!raw.trim()) continue;\n try {\n this.dispatch(JSON.parse(raw) as ACPMessage);\n } catch (err) {\n this.stderr.write(`[wstack-acp parse error] ${err}\\n`, 'utf8');\n }\n }\n }\n\n private dispatch(msg: ACPMessage): void {\n if (this.resolveRead) {\n const resolve = this.resolveRead;\n this.resolveRead = null;\n resolve(msg);\n } else {\n this.messageQueue.push(msg);\n }\n for (const handler of this.handlers) {\n try {\n handler(msg);\n } catch (err) {\n this.stderr.write(`[wstack-acp handler error] ${err}\\n`, 'utf8');\n }\n }\n }\n\n private handleClose(): void {\n this.closed = true;\n this.resolveRead?.(null);\n this.resolveRead = null;\n }\n\n private failAll(err: Error): void {\n this.stderr.write(`[wstack-acp stdin error] ${err.message}\\n`, 'utf8');\n this.close();\n }\n}\n\n// ---------------------------------------------------------------------------\n// ClientTransport — spawns a child ACP agent process (DIR-1)\n// ---------------------------------------------------------------------------\n\nimport type { EventEmitter } from 'node:events';\n\nexport interface ClientTransportOptions {\n command: string;\n args?: string[] | undefined;\n env?: Record<string, string>;\n cwd?: string | undefined;\n handshakeTimeoutMs?: number | undefined;\n /**\n * Set to true when the child is an external ACP agent (Claude Code,\n * Gemini CLI, Codex CLI, …) that does NOT emit a `[wstack-acp]\\n`\n * marker on startup. The v1 client (`ACPSession`) sets this; the\n * server-side transport (the default) keeps the marker check.\n */\n skipHandshakeMarker?: boolean | undefined;\n}\n\nexport interface ACPChildProcess extends EventEmitter {\n stdout: NodeJS.ReadableStream;\n stdin: NodeJS.WritableStream;\n stderr: NodeJS.ReadableStream;\n pid: number | undefined;\n kill(): void;\n}\n\nexport class ClientTransport implements ACPClientTransport {\n private child: ACPChildProcess | null = null;\n private buffer = '';\n private readonly handlers = new Set<(msg: ACPMessage) => void>();\n private closed = false;\n private resolveRead: ((msg: ACPMessage | null) => void) | null = null;\n private messageQueue: ACPMessage[] = [];\n private readonly opts: Required<Pick<ClientTransportOptions, 'handshakeTimeoutMs'>> &\n ClientTransportOptions;\n\n constructor(options: ClientTransportOptions) {\n this.opts = {\n handshakeTimeoutMs: 30_000,\n ...options,\n };\n }\n\n async start(): Promise<void> {\n if (this.child) return;\n const [{ spawn }, { buildChildEnv }, os] = await Promise.all([\n import('node:child_process'),\n import('@wrongstack/core'),\n import('node:os'),\n ]);\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(\n new Error(`ACP child process failed to start within ${this.opts.handshakeTimeoutMs}ms`),\n );\n }, this.opts.handshakeTimeoutMs);\n\n // `npx`/`uvx` resolve+install the package using the npm/pip config of\n // the spawn cwd. Inside a repo with dependency `overrides` (WrongStack\n // pins undici/jsdom), that install fails with EOVERRIDE and the adapter\n // never starts → handshake timeout. Spawn package launchers from a\n // NEUTRAL dir (home) so they install cleanly; the agent still learns the\n // project directory via the ACP `session/new` `cwd` param, not this cwd.\n const isPkgLauncher = this.opts.command === 'npx' || this.opts.command === 'uvx';\n const spawnCwd = isPkgLauncher ? os.homedir() : this.opts.cwd;\n\n try {\n this.child = spawn(this.opts.command, this.opts.args ?? [], {\n env: { ...buildChildEnv(), ...this.opts.env },\n cwd: spawnCwd,\n stdio: ['pipe', 'pipe', 'pipe'],\n windowsHide: true,\n // On Windows, most ACP-supporting tools (claude, gemini, codex,\n // qwen, copilot) are installed as `.cmd` shims under\n // AppData\\Roaming\\npm\\. Node's spawn won't find them via\n // `shell: false` because the .cmd extension is not in the\n // default PATHEXT lookup. The argv here is always from our\n // own static catalog or from a hardcoded spec, never from\n // user input, so shell-expansion is bounded.\n shell: process.platform === 'win32',\n }) as never as ACPChildProcess;\n /* v8 ignore start -- spawn() throwing synchronously is a defensive guard (e.g. argv0 type errors); the realistic async failure path is the child 'error' event, covered by tests. */\n } catch (err) {\n clearTimeout(timeout);\n reject(err);\n return;\n }\n /* v8 ignore stop */\n\n const child = this.child;\n\n child.stdout.setEncoding('utf8');\n\n let settled = false;\n // Register failure handlers IMMEDIATELY, before either readiness path,\n // so a spawn failure (ENOENT / EACCES) rejects start() instead of\n // emitting an unhandled 'error' event that crashes the host process.\n // This is critical for the skip-marker path (external ACP agents),\n // which previously returned before any 'error' listener was attached.\n const onSpawnFailure = (err: Error): void => {\n if (settled) {\n // Post-ready error: just tear the connection down.\n this.closed = true;\n return;\n }\n settled = true;\n clearTimeout(timeout);\n reject(err);\n };\n child.on('error', onSpawnFailure);\n child.stdout.on('error', onSpawnFailure);\n\n if (this.opts.skipHandshakeMarker) {\n // External ACP agents don't emit a startup marker. Attach the data\n // pump right away so no early output is dropped, then resolve once\n // the OS confirms the process actually spawned (the 'spawn' event).\n // If the binary is missing, 'error' fires instead and rejects above.\n child.stdout.on('data', (c: string) => this.onChildData(c));\n child.stderr.on('data', (c: string) => this.onChildError(c));\n child.on('close', (code: number | null) => this.onChildClose(code));\n child.once('spawn', () => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n resolve();\n });\n return;\n }\n\n const onReady = (): void => {\n if (settled) return;\n settled = true;\n child.stdout.on('data', (c: string) => this.onChildData(c));\n child.stderr.on('data', (c: string) => this.onChildError(c));\n child.on('close', (code: number | null) => this.onChildClose(code));\n clearTimeout(timeout);\n resolve();\n };\n\n const waitForMarker = (chunk: string) => {\n this.buffer += chunk;\n const idx = this.buffer.indexOf('[wstack-acp]\\n');\n if (idx !== -1) {\n this.buffer = this.buffer.slice(idx + '[wstack-acp]\\n'.length);\n child.stdout.removeListener('data', waitForMarker);\n onReady();\n }\n };\n\n child.stdout.on('data', waitForMarker);\n });\n }\n\n send(msg: ACPMessage): Promise<void> {\n if (!this.child) return Promise.reject(new Error('ClientTransport not started'));\n return new Promise((resolve, reject) => {\n const line = JSON.stringify(msg) + '\\n';\n this.child?.stdin.write(line, 'utf8', (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n read(): Promise<ACPMessage | null> {\n if (this.messageQueue.length > 0) return Promise.resolve(expectDefined(this.messageQueue.shift()));\n if (this.closed) return Promise.resolve(null);\n return new Promise((resolve) => {\n this.resolveRead = resolve;\n });\n }\n\n onMessage(handler: (msg: ACPMessage) => void): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n stop(): void {\n if (!this.child) return;\n this.closed = true;\n try {\n this.child.kill();\n } catch {\n // already dead\n }\n this.child = null;\n }\n\n private onChildData(chunk: string): void {\n this.buffer += chunk;\n const lines = this.buffer.split('\\n');\n /* v8 ignore next -- split() always yields ≥1 element, so pop() is never undefined; the ?? '' is defensive. */\n this.buffer = lines.pop() ?? '';\n\n for (const raw of lines) {\n if (!raw.trim()) continue;\n try {\n this.dispatch(JSON.parse(raw) as ACPMessage);\n } catch {\n // skip malformed\n }\n }\n }\n\n private onChildError(chunk: string): void {\n writeErr(`[acp-child stderr] ${chunk}`);\n }\n\n private onChildClose(code: number | null): void {\n this.closed = true;\n this.resolveRead?.(null);\n this.resolveRead = null;\n if (code !== 0 && code !== null) {\n writeErr(`[acp-child exited with code ${code}]\\n`);\n }\n }\n\n private dispatch(msg: ACPMessage): void {\n if (this.resolveRead) {\n const resolve = this.resolveRead;\n this.resolveRead = null;\n resolve(msg);\n } else {\n this.messageQueue.push(msg);\n }\n for (const handler of this.handlers) {\n try {\n handler(msg);\n } catch {\n // non-fatal\n }\n }\n }\n}\n","/**\n * Tools registry for ACP agent-side.\n *\n * Translates WrongStack Tool definitions → ACP ACPToolDefinition format.\n * Provides tool lookup and result assembly for the ACP protocol handler.\n */\nimport type {Tool} from '@wrongstack/core';\nimport type {\n ACPToolDefinition,\n ACPToolList,\n ACPInputSchema,\n ACPToolResult,\n ContentBlock,\n} from '../types/acp-messages.js';\n\nexport class ACPToolsRegistry {\n private tools = new Map<string, Tool>();\n private readonly owner: string;\n\n constructor(owner = 'wrongstack') {\n this.owner = owner;\n }\n\n /**\n * Register one or more tools.\n * Throws on duplicate name unless force=true.\n */\n register(tools: Tool[]): void {\n for (const tool of tools) {\n this.tools.set(tool.name, tool);\n }\n }\n\n /**\n * Replace the current tool set.\n */\n setTools(tools: Tool[]): void {\n this.tools.clear();\n for (const tool of tools) this.tools.set(tool.name, tool);\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n list(): Tool[] {\n return Array.from(this.tools.values());\n }\n\n /** Build the ACP tools/list payload from registered tools. */\n buildToolList(): ACPToolList {\n return {\n tools: Array.from(this.tools.values()).map((t) =>\n toACPToolDefinition(t, this.owner),\n ),\n };\n }\n\n /**\n * Execute a tool by name and return ACP-formatted result.\n * Returns null if the tool is not found.\n */\n async execute(\n name: string,\n args: Record<string, unknown>,\n ctx: unknown,\n signal: AbortSignal,\n ): Promise<ACPToolResult | null> {\n const tool = this.tools.get(name);\n if (!tool) return null;\n\n try {\n const result = await tool.execute(args, ctx as Parameters<Tool['execute']>[1], {\n signal,\n });\n return toACPToolResult(result);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {content: [{type: 'text', text: msg}], isError: true} satisfies ACPToolResult;\n }\n }\n}\n\n/** Convert a WrongStack Tool → ACP ACPToolDefinition */\nfunction toACPToolDefinition(tool: Tool, _owner: string): ACPToolDefinition {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: toACPInputSchema(tool.inputSchema),\n annotations: {\n title: tool.name,\n description: tool.usageHint ?? tool.description,\n priority: toolToPriority(tool),\n alwaysAccept: tool.permission === 'auto',\n },\n };\n}\n\n/** Minimal JSON Schema → ACP input schema. ACP uses JSON Schema draft-07. */\nfunction toACPInputSchema(src: unknown): ACPInputSchema {\n if (!src || typeof src !== 'object') {\n return {};\n }\n const s = src as Record<string, unknown>;\n const out: ACPInputSchema = {};\n if (typeof s.type === 'string') out.type = s.type;\n if (Array.isArray(s.enum)) out.enum = s.enum;\n if (typeof s.description === 'string') out.description = s.description;\n if ('default' in s) out.default = s.default;\n if (typeof s.minimum === 'number') out.minimum = s.minimum;\n if (typeof s.maximum === 'number') out.maximum = s.maximum;\n if (s.items) out.items = toACPInputSchema(s.items);\n\n // Recursively convert properties\n if (s.properties && typeof s.properties === 'object') {\n const props: Record<string, ACPInputSchema> = {};\n for (const [k, v] of Object.entries(s.properties as Record<string, unknown>)) {\n props[k] = toACPInputSchema(v);\n }\n out.properties = props;\n if (Array.isArray(s.required)) out.required = s.required as string[];\n }\n\n return out;\n}\n\n/** Convert a WrongStack ToolResult → ACP ContentBlock[] */\nfunction toACPToolResult(result: unknown): ACPToolResult {\n const blocks: ContentBlock[] = [];\n\n if (result === undefined || result === null) {\n return {content: [{type: 'text', text: 'ok'}]};\n }\n\n if (typeof result === 'string') {\n blocks.push({type: 'text', text: result});\n } else if (typeof result === 'object') {\n blocks.push({type: 'text', text: JSON.stringify(result, null, 2)});\n } else {\n blocks.push({type: 'text', text: String(result)});\n }\n\n return {content: blocks};\n}\n\nfunction toolToPriority(tool: Tool): 'high' | 'medium' | 'low' {\n if (tool.riskTier === 'destructive') return 'high';\n if (tool.riskTier === 'standard' || tool.permission === 'confirm') return 'medium';\n return 'low';\n}\n","/**\n * ACP v1 type definitions — Agent Client Protocol, stable v1 spec.\n *\n * Scope: discriminated union for the `session/update` notification payload\n * (the `update` field of a `session/update` JSON-RPC notification), plus the\n * subset of supporting types it depends on.\n *\n * Spec: https://agentclientprotocol.com/protocol/v1/overview\n *\n * Design notes\n * ────────────\n * • The stable v1 spec defines 11 `sessionUpdate` discriminator values. We\n * type exactly those 11, plus an `_unstable_*` escape hatch for v2-RFD\n * kinds (e.g. `next_edit_suggestions`, `elicitation`) that real agents\n * may emit before the spec stabilises them, and an `unknown` fallback for\n * everything else. We do NOT synthesise 32 fake variants to match a\n * number cited in passing — the union is honest about the surface.\n *\n * • Per the spec's conventions, discriminator values use snake_case. The\n * property keys inside each variant are camelCase (the JSON-RPC envelope\n * is JSON-RPC 2.0, everything else is camelCase unless the spec says\n * otherwise).\n *\n * • Optional fields that the spec marks optional are marked `?:`. Required\n * fields have no `?`. We do not include spec fields the spec marks\n * \"SHOULD NOT\" or \"reserved\".\n *\n * • The existing `acp-messages.ts` types describe an older draft of the\n * protocol (string `protocolVersion: '2024-11'`, fake `tools/call`\n * method, etc.). Do NOT import from it here — `acp-v1.ts` is\n * self-contained so the new code path can be reviewed in isolation and\n * deleted wholesale if the rewrite is ever reverted.\n */\n\n// ────────────────────────────────────────────────────────────────────────────\n// Shared building blocks\n// ────────────────────────────────────────────────────────────────────────────\n\n/** Stable protocol version (integer per the spec, not a date-string). */\nexport const ACP_PROTOCOL_VERSION = 1 as const;\nexport type ACPProtocolVersion = typeof ACP_PROTOCOL_VERSION;\n\n/** Per the spec: opaque, unique id. We type as branded string. */\nexport type SessionId = string & { readonly __acpSessionId: unique symbol };\nexport type ToolCallId = string & { readonly __acpToolCallId: unique symbol };\nexport type MessageId = string & { readonly __acpMessageId: unique symbol };\nexport type TerminalId = string & { readonly __acpTerminalId: unique symbol };\nexport type PlanEntryId = string & { readonly __acpPlanEntryId: unique symbol };\n\n// ────────────────────────────────────────────────────────────────────────────\n// Implementation metadata\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface Implementation {\n /** Programmatic/logical name — also a display-name fallback if title is absent. */\n name: string;\n /** Human-readable display name for UI contexts. */\n title?: string | undefined;\n /** Version string (display/debug/metrics). */\n version: string;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Client capabilities — sent in the initialize request\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface ClientCapabilities {\n fs?: {\n readTextFile?: boolean | undefined;\n writeTextFile?: boolean | undefined;\n } | undefined;\n terminal?: boolean | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Agent capabilities — received in the initialize response\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface PromptCapabilities {\n image?: boolean | undefined;\n audio?: boolean | undefined;\n embeddedContext?: boolean | undefined;\n}\n\nexport interface McpCapabilities {\n http?: boolean | undefined;\n sse?: boolean | undefined;\n}\n\nexport interface SessionCapabilities {\n close?: Record<string, unknown> | undefined;\n list?: Record<string, unknown> | undefined;\n delete?: Record<string, unknown> | undefined;\n resume?: Record<string, unknown> | undefined;\n additionalDirectories?: Record<string, unknown> | undefined;\n}\n\nexport interface AuthCapabilities {\n logout?: Record<string, unknown> | undefined;\n}\n\nexport interface AgentCapabilities {\n loadSession?: boolean | undefined;\n promptCapabilities?: PromptCapabilities | undefined;\n mcpCapabilities?: McpCapabilities | undefined;\n sessionCapabilities?: SessionCapabilities | undefined;\n auth?: AuthCapabilities | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Authentication\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface AuthMethod {\n id: string;\n name: string;\n description?: string | undefined;\n type?: 'agent' | 'oauth' | 'http' | undefined;\n}\n\nexport interface AuthenticateRequest {\n methodId: string;\n}\n\nexport interface AuthenticateResponse {}\n\nexport interface LogoutRequest {}\n\nexport interface LogoutResponse {}\n\n// ────────────────────────────────────────────────────────────────────────────\n// MCP server configuration — sent in session lifecycle requests\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface StdioMcpServer {\n name: string;\n command: string;\n args?: string[] | undefined;\n env?: { name: string; value: string }[] | undefined;\n}\n\nexport interface HttpMcpServer {\n type: 'http';\n name: string;\n url: string;\n headers?: { name: string; value: string }[] | undefined;\n}\n\nexport interface SseMcpServer {\n type: 'sse';\n name: string;\n url: string;\n headers?: { name: string; value: string }[] | undefined;\n}\n\nexport type McpServer = StdioMcpServer | HttpMcpServer | SseMcpServer;\n\n// ────────────────────────────────────────────────────────────────────────────\n// Session lifecycle — request/response types\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface NewSessionRequest {\n cwd: string;\n mcpServers: McpServer[];\n additionalDirectories?: string[] | undefined;\n}\n\nexport interface NewSessionResponse {\n sessionId: SessionId;\n initialMode?: SessionModeState | null | undefined;\n configOptions?: SessionConfigOption[] | null | undefined;\n}\n\nexport interface LoadSessionRequest {\n sessionId: SessionId;\n cwd: string;\n mcpServers: McpServer[];\n additionalDirectories?: string[] | undefined;\n}\n\nexport interface LoadSessionResponse {\n initialMode?: SessionModeState | null | undefined;\n configOptions?: SessionConfigOption[] | null | undefined;\n}\n\nexport interface ResumeSessionRequest {\n sessionId: SessionId;\n cwd: string;\n mcpServers: McpServer[];\n additionalDirectories?: string[] | undefined;\n}\n\nexport interface ResumeSessionResponse {\n initialMode?: SessionModeState | null | undefined;\n configOptions?: SessionConfigOption[] | null | undefined;\n}\n\nexport interface CloseSessionRequest {\n sessionId: SessionId;\n}\n\nexport interface CloseSessionResponse {}\n\nexport interface ListSessionsRequest {\n cursor?: string | undefined;\n cwd?: string | undefined;\n}\n\nexport interface ListSessionsResponse {\n sessions: SessionInfo[];\n nextCursor?: string | undefined;\n}\n\nexport interface DeleteSessionRequest {\n sessionId: SessionId;\n}\n\nexport interface DeleteSessionResponse {}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Session config options\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface SessionConfigOption {\n id: string;\n name: string;\n description?: string | undefined;\n category?: ConfigOptionCategory | undefined;\n type: ConfigOptionType;\n defaultValue?: string | undefined;\n currentValue: string;\n options: ConfigOptionValue[];\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Content blocks — reused from MCP per the spec\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Annotations attached to a content block. Optional, agent-supplied hint\n * about audience/priority. Spec leaves shape open; we mirror the fields\n * the spec shows in its examples.\n */\nexport interface ContentAnnotations {\n audience?: ('user' | 'assistant')[] | undefined;\n priority?: number | undefined;\n [key: string]: unknown;\n}\n\nexport interface TextContent {\n type: 'text';\n text: string;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport interface ImageContent {\n type: 'image';\n mimeType: string;\n /** Base64-encoded image data. */\n data: string;\n uri?: string | undefined;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport interface AudioContent {\n type: 'audio';\n mimeType: string;\n /** Base64-encoded audio data. */\n data: string;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport interface TextResourceContents {\n uri: string;\n mimeType?: string | undefined;\n text: string;\n}\n\nexport interface BlobResourceContents {\n uri: string;\n mimeType?: string | undefined;\n /** Base64-encoded binary. */\n blob: string;\n}\n\nexport type EmbeddedResourceContents = TextResourceContents | BlobResourceContents;\n\nexport interface EmbeddedResourceContent {\n type: 'resource';\n resource: EmbeddedResourceContents;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport interface ResourceLinkContent {\n type: 'resource_link';\n uri: string;\n name: string;\n mimeType?: string | undefined;\n title?: string | undefined;\n description?: string | undefined;\n size?: number | undefined;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport type ContentBlock =\n | TextContent\n | ImageContent\n | AudioContent\n | EmbeddedResourceContent\n | ResourceLinkContent;\n\n// ────────────────────────────────────────────────────────────────────────────\n// Tool calls\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type ToolKind =\n | 'read'\n | 'edit'\n | 'delete'\n | 'move'\n | 'search'\n | 'execute'\n | 'think'\n | 'fetch'\n | 'switch_mode'\n | 'other';\n\nexport type ToolCallStatus = 'pending' | 'in_progress' | 'completed' | 'failed';\n\n/** A single concrete content payload attached to a tool call. */\nexport type ToolCallContent =\n | { type: 'content'; content: ContentBlock }\n | {\n type: 'diff';\n path: string;\n oldText: string | null;\n newText: string;\n }\n | { type: 'terminal'; terminalId: TerminalId };\n\nexport interface ToolCallLocation {\n path: string;\n /** 1-based per the spec's argument requirements. */\n line?: number | undefined;\n}\n\nexport interface ToolCall {\n toolCallId: ToolCallId;\n title: string;\n kind?: ToolKind | undefined;\n status?: ToolCallStatus | undefined;\n content?: ToolCallContent[] | undefined;\n locations?: ToolCallLocation[] | undefined;\n rawInput?: Record<string, unknown> | undefined;\n rawOutput?: Record<string, unknown> | undefined;\n}\n\n/**\n * Partial update of a previously-emitted tool call. All fields except\n * `toolCallId` are optional — only the changed fields are included.\n * Declared standalone (not `extends ToolCall`) because `title` is required\n * on `ToolCall` but optional here; the structural variance is the point.\n */\nexport interface ToolCallUpdateFields {\n toolCallId: ToolCallId;\n status?: ToolCallStatus | undefined;\n content?: ToolCallContent[] | undefined;\n title?: string | undefined;\n kind?: ToolKind | undefined;\n locations?: ToolCallLocation[] | undefined;\n rawInput?: Record<string, unknown> | undefined;\n rawOutput?: Record<string, unknown> | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Plan\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type PlanEntryPriority = 'high' | 'medium' | 'low';\nexport type PlanEntryStatus = 'pending' | 'in_progress' | 'completed';\n\nexport interface PlanEntry {\n /** Required by the spec for the array shape, but per-entry id is optional. */\n content: string;\n priority: PlanEntryPriority;\n status: PlanEntryStatus;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Slash commands\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface AvailableCommandInput {\n hint: string;\n}\n\nexport interface AvailableCommand {\n name: string;\n description: string;\n input?: AvailableCommandInput | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Session modes\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type SessionModeId = string & { readonly __acpModeId: unique symbol };\n\nexport interface SessionMode {\n id: SessionModeId;\n name: string;\n description?: string | undefined;\n}\n\nexport interface SessionModeState {\n currentModeId: SessionModeId;\n availableModes: SessionMode[];\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Config options\n// ────────────────────────────────────────────────────────────────────────────\n\n/** Reserved spec categories. Underscore-prefixed names are free for custom use. */\nexport type ConfigOptionCategory =\n | 'mode'\n | 'model'\n | 'thought_level'\n | `_${string}`;\n\nexport type ConfigOptionType = 'select' | string;\n\nexport interface ConfigOptionValue {\n value: string;\n name: string;\n description?: string | undefined;\n}\n\nexport interface ConfigOption {\n id: string;\n name: string;\n description?: string | undefined;\n category?: ConfigOptionCategory | undefined;\n type: ConfigOptionType;\n currentValue: string;\n options: ConfigOptionValue[];\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Session info\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface SessionInfo {\n sessionId: SessionId;\n cwd: string;\n title?: string | undefined;\n updatedAt?: string | undefined;\n /** Agent-supplied extension metadata; opaque to clients. */\n _meta?: Record<string, unknown> | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Usage (token / cost) updates\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface UsageCost {\n amount: number;\n /** ISO 4217 currency code, e.g. \"USD\". */\n currency: string;\n}\n\nexport interface UsageUpdate {\n /** Tokens used in the current session context. Required, non-null. */\n used: number;\n /** Total context window size in tokens. Required, non-null. */\n size: number;\n cost?: UsageCost | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Permission requests\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type PermissionOptionKind =\n | 'allow_once'\n | 'allow_always'\n | 'reject_once'\n | 'reject_always';\n\nexport interface PermissionOption {\n optionId: string;\n name: string;\n kind: PermissionOptionKind;\n}\n\nexport type RequestPermissionOutcome =\n | { outcome: 'cancelled' }\n | { outcome: 'selected'; optionId: string };\n\n// ────────────────────────────────────────────────────────────────────────────\n// Stop reasons\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type StopReason =\n | 'end_turn'\n | 'max_tokens'\n | 'max_turn_requests'\n | 'refusal'\n | 'cancelled'\n | string;\n\n// ────────────────────────────────────────────────────────────────────────────\n// SessionUpdate — the discriminated union\n// ────────────────────────────────────────────────────────────────────────────\n\n/** Stable v1 variants. The spec currently defines exactly 11. */\nexport type SessionUpdate =\n | UserMessageChunkUpdate\n | AgentMessageChunkUpdate\n | ThoughtChunkUpdate\n | ToolCallUpdateUpdate\n | ToolCallUpdateNotification\n | PlanUpdate\n | AvailableCommandsUpdate\n | CurrentModeUpdate\n | ConfigOptionUpdate\n | SessionInfoUpdate\n | UsageUpdateUpdate;\n\n// --- Streaming message chunks -----------------------------------------------\n\nexport interface UserMessageChunkUpdate {\n sessionUpdate: 'user_message_chunk';\n messageId?: MessageId | undefined;\n content: ContentBlock;\n}\n\nexport interface AgentMessageChunkUpdate {\n sessionUpdate: 'agent_message_chunk';\n messageId?: MessageId | undefined;\n content: ContentBlock;\n}\n\nexport interface ThoughtChunkUpdate {\n sessionUpdate: 'thought_chunk';\n messageId?: MessageId | undefined;\n content: ContentBlock;\n}\n\n// --- Tool calls ------------------------------------------------------------\n\n/** First notification for a new tool call. */\nexport interface ToolCallUpdateUpdate {\n sessionUpdate: 'tool_call';\n toolCallId: ToolCallId;\n title: string;\n kind?: ToolKind | undefined;\n status?: ToolCallStatus | undefined;\n content?: ToolCallContent[] | undefined;\n locations?: ToolCallLocation[] | undefined;\n rawInput?: Record<string, unknown> | undefined;\n}\n\n/** Subsequent updates to a previously-emitted tool call. */\nexport interface ToolCallUpdateNotification {\n sessionUpdate: 'tool_call_update';\n toolCallId: ToolCallId;\n status?: ToolCallStatus | undefined;\n content?: ToolCallContent[] | undefined;\n title?: string | undefined;\n kind?: ToolKind | undefined;\n locations?: ToolCallLocation[] | undefined;\n rawInput?: Record<string, unknown> | undefined;\n rawOutput?: Record<string, unknown> | undefined;\n}\n\n// --- Plan ------------------------------------------------------------------\n\nexport interface PlanUpdate {\n sessionUpdate: 'plan';\n entries: PlanEntry[];\n}\n\n// --- Commands / modes / config ---------------------------------------------\n\nexport interface AvailableCommandsUpdate {\n sessionUpdate: 'available_commands_update';\n availableCommands: AvailableCommand[];\n}\n\nexport interface CurrentModeUpdate {\n sessionUpdate: 'current_mode_update';\n modeId: SessionModeId;\n}\n\nexport interface ConfigOptionUpdate {\n sessionUpdate: 'config_option_update';\n configOptions: ConfigOption[];\n}\n\n// --- Session metadata ------------------------------------------------------\n\nexport interface SessionInfoUpdate {\n sessionUpdate: 'session_info_update';\n title?: string | null | undefined;\n updatedAt?: string | null | undefined;\n _meta?: Record<string, unknown> | undefined;\n}\n\n// --- Usage -----------------------------------------------------------------\n\nexport interface UsageUpdateUpdate {\n sessionUpdate: 'usage_update';\n used: number;\n size: number;\n cost?: UsageCost | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Escape hatches: unknown / unstable\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Escape hatch for v2-RFD `sessionUpdate` kinds that have been published\n * but are not yet stabilised in the v1 spec. Examples seen in the wild:\n * `next_edit_suggestions`, `elicitation`, `proxy_extension`. We surface\n * the raw payload so forward-compat code can switch on\n * `kind === 'next_edit_suggestions'` etc. without losing the data.\n */\nexport interface UnstableSessionUpdate {\n sessionUpdate: `_unstable_${string}`;\n [key: string]: unknown;\n}\n\n/**\n * Last-resort variant: the agent sent a discriminator string we don't\n * recognise at all. The full payload is preserved as a record so consumers\n * can still log/inspect it. Prefer matching the known variants first.\n */\nexport interface UnknownSessionUpdate {\n sessionUpdate: string;\n [key: string]: unknown;\n}\n\n/** The full union, including escape hatches. */\nexport type AnySessionUpdate = SessionUpdate | UnstableSessionUpdate | UnknownSessionUpdate;\n\n// ────────────────────────────────────────────────────────────────────────────\n// Top-level notification envelope\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface SessionUpdateNotification {\n jsonrpc?: '2.0' | undefined;\n method: 'session/update';\n params: {\n sessionId: SessionId;\n update: AnySessionUpdate;\n };\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Type guards\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Exhaustiveness helper. Call from the `default:` branch of a switch on\n * `sessionUpdate` to get a compile-time error when a new variant is added\n * without updating the consumer.\n */\nexport function assertNeverSessionUpdate(x: never): never {\n throw new Error(\n `Unhandled sessionUpdate: ${JSON.stringify(x)}`,\n );\n}\n","/**\n * ACP v1 server-side protocol handler.\n *\n * Receives JSON-RPC requests from an external ACP client (Zed, JetBrains\n * Junie, VS Code ACP extension, etc.) over stdio and answers them per the\n * v1 spec. See https://agentclientprotocol.com/protocol/v1/overview.\n *\n * Supported methods\n * ─────────────────\n * - initialize — handshake\n * - authenticate — optional, no-op when auth isn't required\n * - session/new — create a session\n * - session/load — restore a session by id\n * - session/prompt — run one turn, stream session/update\n * notifications, return stopReason\n * - session/cancel — notification (no response); cancels the\n * in-flight turn on the target session\n * - session/set_mode — change the active mode for a session\n * - session/set_config_option — change a config option value\n * - session/list — list known sessions\n *\n * Method execution\n * ────────────────\n * The handler is transport-agnostic; it sends responses via the\n * `AgentServerTransport` injected at construction. The actual\n * agent-loop work for a `session/prompt` turn is delegated to the\n * caller-provided `runTurn` callback, which receives the prompt\n * blocks and the per-turn AbortSignal and resolves with the final\n * stopReason. Updates are streamed via the `emit` callback passed\n * to `runTurn`; the handler wraps each as a `session/update`\n * notification.\n *\n * This separation keeps the handler unit-testable: tests can supply\n * a fake `runTurn` that yields a canned sequence of updates, and\n * assert on the JSON-RPC traffic the handler produces. A real\n * production caller wires `runTurn` to a core `Agent` instance.\n *\n * Concurrency\n * ───────────\n * Each session is single-threaded (one active turn at a time). The\n * handler keeps a per-session AbortController so a `session/cancel`\n * notification can stop the running turn mid-stream without tearing\n * down the session. Multiple sessions can be active concurrently.\n */\nimport {\n ACP_PROTOCOL_VERSION,\n type StopReason,\n type ContentBlock,\n type PermissionOption,\n type PlanEntry,\n type RequestPermissionOutcome,\n type ToolKind,\n type UsageCost,\n} from '../types/acp-v1.js';\nimport type { AgentServerTransport } from './stdio-transport.js';\nimport type { ACPMessage } from '../types/acp-messages.js';\n\n// Transport's `send` is typed `ACPMessage` which predates v1 and\n// doesn't carry a `jsonrpc` field. The runtime is fine — the\n// transport just `JSON.stringify`s the message — so cast at the\n// boundary.\ntype WireMessage = { jsonrpc?: '2.0'; id?: string | number; method?: string; params?: unknown; result?: unknown; error?: unknown };\nfunction toWire(msg: WireMessage): ACPMessage {\n return msg as never as ACPMessage;\n}\n\nexport const WRONGSTACK_VERSION = '0.274.1';\nconst WRONGSTACK_AUTH_METHODS = [\n {\n id: 'wrongstack-auth',\n name: 'Run wstack auth',\n description: 'Configure a WrongStack model provider in an interactive terminal.',\n type: 'terminal',\n args: ['auth'],\n },\n];\n\n/** What kinds of content the agent accepts in a prompt. */\nexport interface PromptCapabilities {\n image: boolean;\n audio: boolean;\n embeddedContext: boolean;\n}\n\nexport interface AgentCapabilities {\n loadSession: boolean;\n promptCapabilities: PromptCapabilities;\n}\n\nexport interface RunTurnInput {\n sessionId: string;\n /** Content blocks the client sent. */\n prompt: readonly ContentBlock[];\n /** Cancelled when the client sends `session/cancel` for this session. */\n signal: AbortSignal;\n}\n\nexport interface RunTurnResult {\n stopReason: StopReason;\n /** Optional summary text the agent produced. */\n text?: string;\n plan?: PlanEntry[];\n usage?: { used: number; size: number; cost?: UsageCost | undefined };\n}\n\n/**\n * A tool-call permission request the agent surfaces to the client.\n */\nexport interface RunTurnPermissionRequest {\n toolCall: { toolCallId: string; title: string; kind?: ToolKind | undefined };\n options: PermissionOption[];\n}\n\n/** Client filesystem/terminal capabilities advertised at initialize. */\nexport interface ClientCapabilities {\n fs?: { readTextFile?: boolean | undefined; writeTextFile?: boolean | undefined } | undefined;\n terminal?: boolean | undefined;\n}\n\n/**\n * Client-callback API handed to `runTurn`. Lets the agent's tools call back\n * into the connected ACP client — ask for permission, and (when the client\n * advertises the capability) use the client's filesystem and terminal so the\n * editor's view (including unsaved buffers) is the source of truth.\n */\nexport interface RunTurnApi {\n /**\n * Ask the connected ACP client to approve/reject a tool call via the\n * `session/request_permission` method. Resolves with the client's\n * outcome. Rejects if no client channel is available or the request\n * times out — the caller decides the fallback.\n */\n requestPermission(req: RunTurnPermissionRequest): Promise<RequestPermissionOutcome>;\n /** Capabilities the client advertised at initialize — gate tool wiring on these. */\n clientCapabilities: ClientCapabilities;\n /** Read a text file from the client's filesystem (`fs/read_text_file`). */\n readTextFile(params: { path: string; line?: number; limit?: number }): Promise<string>;\n /** Write a text file in the client's filesystem (`fs/write_text_file`). */\n writeTextFile(params: { path: string; content: string }): Promise<void>;\n /**\n * Run a command in the client's terminal (`terminal/create` →\n * `wait_for_exit` → `output` → `release`) and resolve with the combined\n * output and exit code.\n */\n runTerminal(params: {\n command: string;\n args?: string[] | undefined;\n cwd?: string | undefined;\n }): Promise<{ output: string; exitCode: number | null }>;\n}\n\n/**\n * The agent's per-turn work. Streams `SessionUpdate` notifications to\n * `emit` and resolves with the final stopReason. Errors thrown from\n * this iterable are converted to a `prompt_failed` JSON-RPC error.\n *\n * `api` is an optional client-callback surface (permission requests).\n * Older runTurn implementations that ignore it keep working unchanged.\n */\nexport type RunTurn = (\n input: RunTurnInput,\n emit: (update: unknown) => void,\n api?: RunTurnApi,\n) => Promise<RunTurnResult>;\n\nexport interface SessionState {\n id: string;\n cwd: string;\n /** Per-turn abort signal — aborted when the session is cancelled or closed. */\n abort: AbortController;\n /** Active mode, advertised to the client in current_mode_update. */\n modeId: string;\n /** Created at, for session/list ordering. */\n createdAt: string;\n /** Last activity timestamp, for session/info_update. */\n updatedAt: string;\n /** Optional human title. */\n title?: string;\n}\n\n/** MCP-style session mode advertised in current_mode_update. */\nexport interface SessionMode {\n id: string;\n name: string;\n description?: string | undefined;\n}\n\nexport interface SessionConfigOption {\n id: string;\n name: string;\n type: 'select' | string;\n currentValue: string;\n options: { value: string; name: string; description?: string | undefined }[];\n}\n\nexport interface ProtocolHandlerOptions {\n transport: AgentServerTransport;\n /** Where the server is running; used for new sessions' default cwd. */\n defaultCwd: string;\n /** Agent's per-turn implementation. */\n runTurn: RunTurn;\n /**\n * Optional callbacks for the lifecycle events the server should\n * surface to the client. All default to no-ops.\n */\n onSessionNew?: ((state: SessionState) => void) | undefined;\n /** Static list of available modes (advertised to clients). */\n modes?: readonly SessionMode[] | undefined;\n /** Static list of config options. */\n configOptions?: readonly SessionConfigOption[] | undefined;\n /** Agent name advertised in initialize. */\n agentName?: string | undefined;\n /**\n * Optional source of replayable conversation history for `session/load`.\n * Returns the `session/update` payloads (user/agent message chunks) to\n * stream back to the client before the load response. Wired from\n * `makeACPServerAgentTurn(...).replay`.\n */\n replayFor?: ((sessionId: string) => Array<{ sessionUpdate: string; content: unknown }>) | undefined;\n /**\n * Optional hook to prime the turn engine's session history on cold\n * `session/load` (server restart). Wired from `makeACPServerAgentTurn(...).seed`\n * — it re-feeds the persisted conversation into the next-created Agent so\n * the model resumes, not just the client UI.\n */\n seedFor?: ((sessionId: string, history: Array<{ sessionUpdate: string; content: unknown }>) => void) | undefined;\n /**\n * Optional durable session store. When set, sessions + their recorded\n * history are persisted on create/prompt and restored on `session/load`,\n * so a reconnecting client can resume after a server restart.\n * (Structural type — `ACPSessionStore` satisfies it without a value import.)\n */\n store?: SessionPersistence | undefined;\n}\n\n/** Minimal durable-store contract the handler uses (ACPSessionStore satisfies it). */\nexport interface SessionPersistence {\n save(\n state: SessionState,\n history?: Array<{ sessionUpdate: string; content: unknown }>,\n ): Promise<unknown>;\n load(\n sessionId: string,\n ): Promise<\n | (Partial<SessionState> & { history?: Array<{ sessionUpdate: string; content: unknown }> | undefined })\n | null\n >;\n}\n\n/** Single global mode id, sufficient for v1. */\nconst DEFAULT_MODE_ID = 'code';\n\nconst DEFAULT_MODES: readonly SessionMode[] = [\n {\n id: DEFAULT_MODE_ID,\n name: 'Code',\n description: 'Default agent mode for code-generation tasks.',\n },\n];\n\nexport class ACPProtocolHandler {\n private readonly transport: AgentServerTransport;\n private readonly defaultCwd: string;\n private readonly runTurn: RunTurn;\n private readonly onSessionNew: (state: SessionState) => void;\n private readonly modes: readonly SessionMode[];\n private readonly configOptions: readonly SessionConfigOption[];\n private readonly agentName: string;\n private readonly replayFor:\n | ((sessionId: string) => Array<{ sessionUpdate: string; content: unknown }>)\n | undefined;\n private readonly seedFor:\n | ((sessionId: string, history: Array<{ sessionUpdate: string; content: unknown }>) => void)\n | undefined;\n private readonly store: SessionPersistence | undefined;\n\n private initialized = false;\n private clientCapabilities: ClientCapabilities = {};\n private readonly sessions = new Map<string, SessionState>();\n private nextId = 1;\n\n // Outbound request correlation (server → client requests, e.g.\n // session/request_permission). Keyed by our own `srv_N` ids.\n private readonly pendingOut = new Map<\n string,\n { resolve: (v: unknown) => void; reject: (e: Error) => void; timer: ReturnType<typeof setTimeout> }\n >();\n private nextOutId = 1;\n\n constructor(opts: ProtocolHandlerOptions) {\n this.transport = opts.transport;\n this.defaultCwd = opts.defaultCwd;\n this.runTurn = opts.runTurn;\n this.onSessionNew = opts.onSessionNew ?? (() => {});\n this.modes = opts.modes ?? DEFAULT_MODES;\n this.configOptions = opts.configOptions ?? [];\n this.agentName = opts.agentName ?? 'wrongstack';\n this.replayFor = opts.replayFor;\n this.seedFor = opts.seedFor;\n this.store = opts.store;\n // Route inbound JSON-RPC responses (to our outbound requests)\n // independently of the server's read loop. StdioTransport fires\n // onMessage on the stdin 'data' event, so a pending request resolves\n // even while a session/prompt handler is parked awaiting it.\n // Guarded: minimal transports (and some test fakes) may omit onMessage;\n // without it, server→client requests simply aren't supported.\n if (typeof this.transport.onMessage === 'function') {\n this.transport.onMessage((m) => this.maybeResolvePending(m));\n }\n }\n\n /**\n * Send a request to the client and await its response. Used for\n * server-initiated calls like `session/request_permission`. Rejects on\n * timeout or transport error so the caller can pick a safe fallback.\n */\n private request(method: string, params: unknown, timeoutMs = 60_000): Promise<unknown> {\n const id = `srv_${this.nextOutId++}`;\n return new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingOut.delete(id);\n reject(new Error(`${method} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n this.pendingOut.set(id, { resolve, reject, timer });\n this.transport\n .send(toWire({ jsonrpc: '2.0', id, method, params }))\n .catch((e: unknown) => {\n clearTimeout(timer);\n this.pendingOut.delete(id);\n reject(e instanceof Error ? e : new Error(String(e)));\n });\n });\n }\n\n private maybeResolvePending(m: ACPMessage): void {\n const id = (m as { id?: unknown }).id;\n if (typeof id !== 'string') return;\n const pending = this.pendingOut.get(id);\n if (!pending) return;\n this.pendingOut.delete(id);\n clearTimeout(pending.timer);\n const err = (m as { error?: { message?: string } }).error;\n if (err) pending.reject(new Error(err.message ?? 'client request failed'));\n else pending.resolve((m as { result?: unknown }).result);\n }\n\n /**\n * Process one inbound message. Returns true if this was a terminal\n * message (rare; reserved for future use by the server's own\n * shutdown signal).\n */\n async handleMessage(msg: unknown): Promise<boolean> {\n if (typeof msg !== 'object' || msg === null) return false;\n const m = msg as { id?: unknown; method?: unknown; params?: unknown; result?: unknown; error?: unknown };\n\n // Response (we never initiate requests, but be defensive).\n if (m.id !== undefined && (m.result !== undefined || m.error !== undefined)) {\n return false;\n }\n\n // Request (has id, has method, no result/error)\n if (m.id !== undefined && typeof m.method === 'string') {\n return this.handleRequest(m.id as string | number, m.method, m.params);\n }\n\n // Notification (no id, has method)\n if (typeof m.method === 'string') {\n return this.handleNotification(m.method, m.params);\n }\n\n return false;\n }\n\n /** Abort all active turns and drop session state. */\n close(): void {\n for (const [, session] of this.sessions) {\n session.abort.abort();\n }\n this.sessions.clear();\n for (const [, p] of this.pendingOut) {\n clearTimeout(p.timer);\n p.reject(new Error('protocol handler closed'));\n }\n this.pendingOut.clear();\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Requests\n // ────────────────────────────────────────────────────────────────────\n\n private async handleRequest(\n id: string | number,\n method: string,\n params: unknown,\n ): Promise<boolean> {\n // The only method allowed before initialize is `initialize` itself.\n if (method !== 'initialize' && !this.initialized) {\n await this.sendError(id, -32000, 'Not initialized');\n return false;\n }\n\n try {\n switch (method) {\n case 'initialize':\n return await this.handleInitialize(id, params);\n case 'authenticate':\n return await this.handleAuthenticate(id, params);\n case 'logout':\n return await this.handleLogout(id, params);\n case 'session/new':\n return await this.handleSessionNew(id, params);\n case 'session/load':\n return await this.handleSessionLoad(id, params);\n case 'session/resume':\n return await this.handleSessionResume(id, params);\n case 'session/close':\n return await this.handleSessionClose(id, params);\n case 'session/delete':\n return await this.handleSessionDelete(id, params);\n case 'session/prompt':\n return await this.handleSessionPrompt(id, params);\n case 'session/set_mode':\n return await this.handleSetMode(id, params);\n case 'session/set_config_option':\n return await this.handleSetConfigOption(id, params);\n case 'session/list':\n return await this.handleSessionList(id);\n case 'session/fork':\n return await this.handleSessionFork(id, params);\n case 'providers/list':\n return await this.handleProvidersList(id, params);\n case 'providers/set':\n return await this.handleProvidersSet(id, params);\n case 'providers/disable':\n return await this.handleProvidersDisable(id, params);\n case 'mcp/message':\n return await this.handleMcpMessage(id, params);\n default:\n // Everything reaching handleRequest carries an id, so it's a\n // JSON-RPC *request* and MUST get a response — otherwise a\n // conformant client blocks forever awaiting it. Unimplemented\n // IDE features (document/*, nes/*, elicitation/*) and any other\n // unknown method get a standard method-not-found error.\n await this.sendError(id, -32601, `Unknown method: ${method}`);\n return false;\n }\n } catch (err) {\n const { code, message, data } = errorToJsonRpc(err);\n await this.sendError(id, code, message, data);\n return false;\n }\n }\n\n private async handleInitialize(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { protocolVersion?: unknown; clientCapabilities?: ClientCapabilities };\n if (p.clientCapabilities && typeof p.clientCapabilities === 'object') {\n this.clientCapabilities = p.clientCapabilities;\n }\n // Version negotiation per spec: the client advertises its latest\n // supported version; the agent replies with the version it will use —\n // the client's if supported, otherwise the agent's own latest. We must\n // NOT error on a mismatch (that breaks a forward-compatible client that\n // requested a newer protocol): we simply respond with the version we\n // speak and let the client decide whether to proceed. The client side\n // (`ACPSession.initialize`) already mirrors this lenient negotiation.\n this.initialized = true;\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {\n protocolVersion: ACP_PROTOCOL_VERSION,\n agentCapabilities: {\n loadSession: true,\n promptCapabilities: {\n // We route ACP image blocks into the core agent's multimodal\n // input (server-agent-turn.promptToAgentInput); whether the\n // model can see them is the configured provider's concern.\n image: true,\n audio: false,\n embeddedContext: true,\n },\n mcpCapabilities: {\n http: false,\n sse: false,\n },\n sessionCapabilities: {\n close: {},\n list: {},\n delete: {},\n resume: {},\n },\n auth: {\n logout: {},\n },\n },\n agentInfo: {\n name: this.agentName,\n title: 'WrongStack',\n version: WRONGSTACK_VERSION,\n },\n authMethods: WRONGSTACK_AUTH_METHODS,\n modes: this.modes,\n configOptions: this.configOptions,\n },\n }));\n return false;\n }\n\n private async handleAuthenticate(id: string | number, _params: unknown): Promise<boolean> {\n // WrongStack doesn't currently require auth.\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: { outcome: 'unauthenticated' },\n }));\n return false;\n }\n\n private async handleLogout(id: string | number, _params: unknown): Promise<boolean> {\n // WrongStack doesn't have persistent auth state, so logout is a no-op.\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {},\n }));\n return false;\n }\n\n private async handleSessionNew(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { cwd?: unknown; mcpServers?: unknown };\n const cwd = typeof p.cwd === 'string' ? p.cwd : this.defaultCwd;\n const sessionId = `sess_${this.allocId()}`;\n const now = new Date().toISOString();\n const state: SessionState = {\n id: sessionId,\n cwd,\n abort: new AbortController(),\n modeId: DEFAULT_MODE_ID,\n createdAt: now,\n updatedAt: now,\n };\n this.sessions.set(sessionId, state);\n this.onSessionNew(state);\n await this.persist(state);\n\n // Per spec, the server MAY emit current_mode_update /\n // config_option_update / available_commands_update notifications\n // immediately after session/new to populate the client UI. We do.\n await this.sendNotification({\n sessionId,\n update: {\n sessionUpdate: 'current_mode_update',\n modeId: this.modes[0]?.id ?? DEFAULT_MODE_ID,\n },\n });\n if (this.configOptions.length > 0) {\n await this.sendNotification({\n sessionId,\n update: {\n sessionUpdate: 'config_option_update',\n configOptions: [...this.configOptions],\n },\n });\n }\n\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {\n sessionId,\n modes: this.modes,\n configOptions: this.configOptions,\n },\n }));\n return false;\n }\n\n private async handleSessionLoad(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown; cwd?: unknown; mcpServers?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const loadCwd = typeof p.cwd === 'string' ? p.cwd : undefined;\n let existing = sessionId ? this.sessions.get(sessionId) : undefined;\n\n // Cold path: not in memory but persisted (server restarted). Restore the\n // session state + replay its stored history. The agent's own model\n // context starts fresh — the client UI is made whole via replay.\n if (!existing && sessionId && this.store) {\n const persisted = await this.store.load(sessionId);\n if (persisted) {\n const restored: SessionState = {\n id: sessionId,\n cwd: persisted.cwd ?? loadCwd ?? this.defaultCwd,\n abort: new AbortController(),\n modeId: persisted.modeId ?? DEFAULT_MODE_ID,\n createdAt: persisted.createdAt ?? new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n ...(persisted.title !== undefined ? { title: persisted.title } : {}),\n };\n this.sessions.set(sessionId, restored);\n // Prime the turn engine so the next prompt's Agent resumes the\n // model's context, not just the client UI.\n this.seedFor?.(sessionId, persisted.history ?? []);\n for (const update of persisted.history ?? []) {\n await this.sendNotification({ sessionId, update });\n }\n await this.sendNotification({\n sessionId,\n update: { sessionUpdate: 'current_mode_update', modeId: restored.modeId },\n });\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {\n initialMode: { currentModeId: restored.modeId, availableModes: this.modes },\n },\n }));\n return false;\n }\n }\n\n if (existing) {\n // Session exists in memory — restore it.\n existing.updatedAt = new Date().toISOString();\n // Replay the recorded conversation history (user/agent message\n // chunks) so the reconnecting client sees the prior turns.\n const replay = sessionId ? this.replayFor?.(sessionId) : undefined;\n if (replay) {\n for (const update of replay) {\n await this.sendNotification({ sessionId, update });\n }\n }\n await this.sendNotification({\n sessionId,\n update: {\n sessionUpdate: 'session_info_update',\n updatedAt: existing.updatedAt,\n },\n });\n await this.sendNotification({\n sessionId,\n update: {\n sessionUpdate: 'current_mode_update',\n modeId: existing.modeId,\n },\n });\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {\n initialMode: {\n currentModeId: existing.modeId,\n availableModes: this.modes,\n },\n },\n }));\n return false;\n }\n\n // Session not found — spec says to return an error.\n await this.sendError(id, -32000, `session not found: ${sessionId}`);\n return false;\n }\n\n private async handleSessionResume(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown; cwd?: unknown; mcpServers?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const existing = sessionId ? this.sessions.get(sessionId) : undefined;\n\n if (existing) {\n existing.updatedAt = new Date().toISOString();\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {\n initialMode: {\n currentModeId: existing.modeId,\n availableModes: this.modes,\n },\n },\n }));\n return false;\n }\n\n await this.sendError(id, -32000, `session not found: ${sessionId}`);\n return false;\n }\n\n private async handleSessionClose(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const session = sessionId ? this.sessions.get(sessionId) : undefined;\n\n if (!session) {\n await this.sendError(id, -32000, `session not found: ${sessionId}`);\n return false;\n }\n\n // Abort any in-flight turn and remove the session.\n session.abort.abort();\n if (sessionId) this.sessions.delete(sessionId);\n\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {},\n }));\n return false;\n }\n\n private async handleSessionDelete(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n\n if (!sessionId) {\n await this.sendError(id, -32000, `session not found: ${sessionId}`);\n return false;\n }\n\n if (!this.sessions.has(sessionId)) {\n await this.transport.send(toWire({ jsonrpc: '2.0', id, result: { configOptions: [...this.configOptions] } }));\n return false;\n }\n const session = this.sessions.get(sessionId)!;\n session.abort.abort();\n this.sessions.delete(sessionId);\n\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {},\n }));\n return false;\n }\n\n private async handleSessionFork(id: string | number, params: unknown): Promise<boolean> {\n // Fork creates a new session from an existing one.\n const p = (params ?? {}) as { sessionId?: unknown; cwd?: unknown; mcpServers?: unknown };\n const sourceId = typeof p.sessionId === 'string' ? p.sessionId : null;\n if (!sourceId || !this.sessions.has(sourceId)) {\n await this.sendError(id, -32000, `session not found: ${sourceId}`);\n return false;\n }\n // Create a new session based on the source\n const forkParams: Record<string, unknown> = params as Record<string, unknown>;\n return this.handleSessionNew(id, { ...forkParams, cwd: p.cwd ?? this.defaultCwd });\n }\n\n private async handleProvidersList(id: string | number, _params: unknown): Promise<boolean> {\n // Return the current provider configuration.\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {\n providers: [],\n currentProviderId: null,\n },\n }));\n return false;\n }\n\n private async handleProvidersSet(id: string | number, _params: unknown): Promise<boolean> {\n await this.sendError(id, -32000, 'provider configuration not available through ACP; use wstack auth');\n return false;\n }\n\n private async handleProvidersDisable(id: string | number, _params: unknown): Promise<boolean> {\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {},\n }));\n return false;\n }\n\n private async handleMcpMessage(id: string | number, _params: unknown): Promise<boolean> {\n await this.sendError(id, -32000, 'MCP message routing not available through ACP');\n return false;\n }\n\n private async handleSessionPrompt(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown; prompt?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n if (!sessionId || !this.sessions.has(sessionId)) {\n await this.sendError(id, -32000, 'unknown or missing sessionId');\n return false;\n }\n if (!Array.isArray(p.prompt)) {\n await this.sendError(id, -32602, 'prompt must be an array of content blocks');\n return false;\n }\n const session = this.sessions.get(sessionId)!;\n\n // If the previous turn was cancelled, recreate the AbortController\n // so a stale signal doesn't cancel the new turn.\n if (session.abort.signal.aborted) {\n session.abort = new AbortController();\n }\n\n const turnSignal = new AbortController();\n // Forward session/cancel notifications to the turn's signal.\n const onCancel = (): void => turnSignal.abort();\n session.abort.signal.addEventListener('abort', onCancel, { once: true });\n\n // Client-callback surface for this turn: lets the agent's tools ask\n // the connected client for permission, and use the client's filesystem\n // and terminal (when advertised) instead of the local ones.\n const api: RunTurnApi = {\n clientCapabilities: this.clientCapabilities,\n requestPermission: async (req) => {\n const res = await this.request('session/request_permission', {\n sessionId,\n toolCall: req.toolCall,\n options: req.options,\n });\n const outcome = (res as { outcome?: RequestPermissionOutcome } | undefined)?.outcome;\n return outcome ?? { outcome: 'cancelled' };\n },\n readTextFile: async (params) => {\n const res = await this.request('fs/read_text_file', { sessionId, ...params });\n return String((res as { content?: unknown })?.content ?? '');\n },\n writeTextFile: async (params) => {\n await this.request('fs/write_text_file', { sessionId, ...params });\n },\n runTerminal: async ({ command, args, cwd }) => {\n const created = (await this.request('terminal/create', {\n sessionId,\n command,\n ...(args ? { args } : {}),\n ...(cwd ? { cwd } : {}),\n })) as { terminalId?: string };\n const terminalId = created?.terminalId;\n if (!terminalId) return { output: '', exitCode: null };\n try {\n const exit = (await this.request('terminal/wait_for_exit', { sessionId, terminalId })) as {\n exitCode?: number | null;\n };\n const out = (await this.request('terminal/output', { sessionId, terminalId })) as {\n output?: unknown;\n };\n return {\n output: String(out?.output ?? ''),\n exitCode: typeof exit?.exitCode === 'number' ? exit.exitCode : null,\n };\n } finally {\n try {\n await this.request('terminal/release', { sessionId, terminalId });\n } catch {\n // best-effort release\n }\n }\n },\n };\n\n let result: RunTurnResult;\n try {\n result = await this.runTurn(\n { sessionId, prompt: p.prompt as ContentBlock[], signal: turnSignal.signal },\n (update) => this.sendNotification({ sessionId, update }),\n api,\n );\n } catch (err) {\n session.abort.signal.removeEventListener('abort', onCancel);\n const { code, message, data } = errorToJsonRpc(err);\n await this.sendError(id, code, message, data);\n return false;\n }\n session.abort.signal.removeEventListener('abort', onCancel);\n session.updatedAt = new Date().toISOString();\n await this.persist(session);\n\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: { stopReason: result.stopReason },\n }));\n return false;\n }\n\n private async handleSetMode(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown; modeId?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const modeId = typeof p.modeId === 'string' ? p.modeId : null;\n const session = sessionId ? this.sessions.get(sessionId) : undefined;\n if (!session || !modeId || !this.modes.some((m) => m.id === modeId)) {\n await this.sendError(id, -32602, 'invalid sessionId or modeId');\n return false;\n }\n session.modeId = modeId;\n session.updatedAt = new Date().toISOString();\n await this.sendNotification({\n sessionId,\n update: { sessionUpdate: 'current_mode_update', modeId },\n });\n await this.transport.send(toWire({ jsonrpc: '2.0', id, result: {} }));\n return false;\n }\n\n private async handleSetConfigOption(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown; configId?: unknown; value?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const optionId = typeof p.configId === 'string' ? p.configId : null;\n const value = typeof p.value === 'string' ? p.value : null;\n const session = sessionId ? this.sessions.get(sessionId) : undefined;\n const option = optionId ? this.configOptions.find((o) => o.id === optionId) : undefined;\n if (!session || !option || value === null || !option.options.some((o) => o.value === value)) {\n await this.sendError(id, -32602, 'invalid sessionId, configId, or value');\n return false;\n }\n option.currentValue = value;\n session.updatedAt = new Date().toISOString();\n await this.sendNotification({\n sessionId,\n update: {\n sessionUpdate: 'config_option_update',\n configOptions: [...this.configOptions],\n },\n });\n await this.transport.send(toWire({ jsonrpc: '2.0', id, result: { configOptions: [...this.configOptions] } }));\n return false;\n }\n\n private async handleSessionList(id: string | number): Promise<boolean> {\n const sessions = Array.from(this.sessions.values()).map((s) => {\n const out: { sessionId: string; cwd: string; updatedAt: string; title?: string } = {\n sessionId: s.id,\n cwd: s.cwd,\n updatedAt: s.updatedAt,\n };\n if (s.title !== undefined) out.title = s.title;\n return out;\n });\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: { sessions },\n }));\n return false;\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Notifications\n // ────────────────────────────────────────────────────────────────────\n\n private async handleNotification(method: string, params: unknown): Promise<boolean> {\n switch (method) {\n case 'session/cancel': {\n const p = (params ?? {}) as { sessionId?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const session = sessionId ? this.sessions.get(sessionId) : undefined;\n if (session) {\n session.abort.abort();\n }\n return false;\n }\n case '$/cancel_request': {\n // Protocol-level request cancellation — no-op for now.\n return false;\n }\n case 'exit':\n // Client is shutting down. Best-effort: abort all sessions.\n this.close();\n return true;\n default:\n // Unknown notification — log and ignore.\n return false;\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Wire helpers\n // ────────────────────────────────────────────────────────────────────\n\n private async sendNotification(params: unknown): Promise<void> {\n await this.transport.send(toWire({ jsonrpc: '2.0', method: 'session/update', params }));\n }\n\n /** Best-effort durable persistence of a session + its recorded history. */\n private async persist(state: SessionState): Promise<void> {\n if (!this.store) return;\n try {\n await this.store.save(state, this.replayFor?.(state.id));\n } catch {\n // persistence is best-effort — never fail a request because the disk hiccuped\n }\n }\n\n private async sendError(\n id: string | number,\n code: number,\n message: string,\n data?: unknown,\n ): Promise<void> {\n const error: { code: number; message: string; data?: unknown } = { code, message };\n if (data !== undefined) error.data = data;\n await this.transport.send(toWire({ jsonrpc: '2.0', id, error }));\n }\n\n private allocId(): number {\n return this.nextId++;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Error mapping\n// ─────────────────────────────────────────────────────────────────────────\n\nfunction errorToJsonRpc(err: unknown): { code: number; message: string; data?: unknown } {\n if (err && typeof err === 'object') {\n const e = err as { code?: unknown; message?: unknown; data?: unknown };\n if (typeof e.code === 'number' && typeof e.message === 'string') {\n const result: { code: number; message: string; data?: unknown } = {\n code: e.code,\n message: e.message,\n };\n if (e.data !== undefined) result.data = e.data;\n return result;\n }\n }\n const message = err instanceof Error ? err.message : String(err);\n return { code: -32603, message };\n}\n","/**\n * WrongStackACPServer — ACP v1 server-side entry point.\n *\n * Exposes WrongStack as an ACP-compatible agent. ACP clients (Zed, JetBrains\n * Junie, VS Code ACP extension) spawn this as a subprocess, send JSON-RPC\n * messages over stdio, and receive v1-protocol responses.\n *\n * Usage:\n * node dist/agent/wrongstack-acp-agent.js\n *\n * Or via the CLI:\n * wstack acp-server\n *\n * Wiring a real agent: this class is the surface; the bootstrap\n * binary uses a no-op echo by default so the binary is a useful\n * connectivity smoke test. For a real server, instantiate\n * `WrongStackACPServer` programmatically and pass a `runTurn`\n * produced by `makeACPServerAgentTurn({ agentFor: ... })` from\n * `./server-agent-turn.js`. The factory is responsible for building\n * a real core `Agent` (with the right provider, model, system prompt,\n * etc.) per session.\n *\n * Startup: stdout is JSON-RPC only by default. The legacy `[wstack-acp]\\n`\n * marker can be enabled for older internal harnesses with\n * `legacyStartupMarker`, but ACP clients should rely on v1 initialize.\n */\nimport { fileURLToPath } from 'node:url';\nimport { createServer, type Server } from 'node:http';\nimport { writeErr } from '@wrongstack/core';\nimport type { ACPMessage } from '../types/acp-messages.js';\nimport {\n ACPProtocolHandler,\n type RunTurn,\n type RunTurnResult,\n type SessionPersistence,\n} from './protocol-handler.js';\nimport { StdioTransport } from './stdio-transport.js';\n\nexport interface WrongStackACPServerOptions {\n runTurn?: RunTurn | undefined;\n defaultCwd?: string | undefined;\n agentName?: string | undefined;\n /**\n * Transport mode. 'stdio' (default) communicates over stdin/stdout.\n * When a number is provided, the server listens as an HTTP server on\n * that port, accepting Streamable HTTP (JSON-RPC over HTTP POST).\n */\n transport?: 'stdio' | number | undefined;\n /** Host for HTTP transport. Defaults to '127.0.0.1'. */\n host?: string | undefined;\n /** Emit the pre-v1 startup marker on stdio. Defaults to false. */\n legacyStartupMarker?: boolean | undefined;\n /**\n * Conversation-history source for `session/load` replay. Pass\n * `makeACPServerAgentTurn(...).replay` here so a reconnecting client\n * gets prior turns streamed back.\n */\n replayFor?: ((sessionId: string) => Array<{ sessionUpdate: string; content: unknown }>) | undefined;\n /**\n * Cold-load seed hook. Pass `makeACPServerAgentTurn(...).seed` so a\n * restored session's Agent resumes the model context, not just the UI.\n */\n seedFor?: ((sessionId: string, history: Array<{ sessionUpdate: string; content: unknown }>) => void) | undefined;\n /**\n * Durable session store. When set, sessions + history are persisted and\n * restored across restarts for `session/load`. Pass an `ACPSessionStore`.\n */\n store?: SessionPersistence | undefined;\n}\n\nexport class WrongStackACPServer {\n private readonly transport: StdioTransport;\n private readonly handler: ACPProtocolHandler;\n private readonly options: WrongStackACPServerOptions;\n /** HTTP server when transport mode is HTTP. */\n private httpServer: Server | null = null;\n private running = false;\n\n constructor(opts: WrongStackACPServerOptions = {}) {\n this.options = opts;\n this.transport = new StdioTransport();\n const runTurn: RunTurn = opts.runTurn ?? defaultEchoRunTurn;\n this.handler = new ACPProtocolHandler({\n transport: this.transport,\n defaultCwd: opts.defaultCwd ?? process.cwd(),\n runTurn,\n agentName: opts.agentName,\n ...(opts.replayFor ? { replayFor: opts.replayFor } : {}),\n ...(opts.seedFor ? { seedFor: opts.seedFor } : {}),\n ...(opts.store ? { store: opts.store } : {}),\n });\n }\n\n /**\n * Start the server. Mode depends on `options.transport`:\n * - 'stdio' (default): reads JSON-RPC from stdin, writes to stdout.\n * - number: listens as HTTP on the given port.\n */\n async start(): Promise<void> {\n const transportMode = this.options.transport;\n if (typeof transportMode === 'number') {\n await this.startHttp(transportMode);\n } else {\n await this.startStdio();\n }\n }\n\n private async startStdio(): Promise<void> {\n if (this.options.legacyStartupMarker) {\n this.transport.sendStartupMarker();\n }\n this.running = true;\n while (this.running) {\n const msg = await this.transport.read();\n if (!msg) break;\n const terminal = await this.handler.handleMessage(msg);\n if (terminal) break;\n }\n this.transport.close();\n }\n\n private async startHttp(port: number): Promise<void> {\n const host = this.options.host ?? '127.0.0.1';\n const handler = this.handler;\n\n this.httpServer = createServer(async (req, res) => {\n // Origin guard. Real ACP/MCP clients (Zed, JetBrains, curl, the MCP SDK)\n // are non-browser and send no `Origin` header, so they are unaffected. A\n // browser making a cross-origin request DOES send `Origin`; reject it so a\n // malicious web page the user visits cannot reach this loopback agent and\n // drive it (a real `runTurn` executes tools/commands — i.e. RCE). This\n // replaces the previous `Access-Control-Allow-Origin: *`, which let any\n // site read responses from, and POST to, this server.\n const selfOrigin = `http://${host}:${port}`;\n const reqOrigin = Array.isArray(req.headers.origin)\n ? req.headers.origin[0]\n : req.headers.origin;\n if (reqOrigin && reqOrigin !== selfOrigin) {\n res.writeHead(403);\n res.end(JSON.stringify({ error: 'cross-origin request forbidden' }));\n return;\n }\n // Never reflect a wildcard — only echo our own origin back (for same-origin\n // browser tooling). `Authorization` is intentionally omitted from the\n // allow-list: it is not enforced here, so advertising it would mislead.\n if (reqOrigin) res.setHeader('Access-Control-Allow-Origin', reqOrigin);\n res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Mcp-Session-Id');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n if (req.method !== 'POST') {\n res.writeHead(405);\n res.end(JSON.stringify({ error: 'method not allowed' }));\n return;\n }\n\n // Parse JSON body\n let body = '';\n for await (const chunk of req) {\n body += chunk;\n }\n\n let msg: unknown;\n try {\n msg = JSON.parse(body);\n } catch {\n res.writeHead(400);\n res.end(JSON.stringify({ error: { code: -32700, message: 'Parse error' } }));\n return;\n }\n\n // Process the message and return the response. For HTTP transport we\n // must NOT let the handler write to stdout — instead we intercept\n // `transport.send` and capture the JSON-RPC response + any buffered\n // notifications, then return them inline (Streamable HTTP pattern).\n const notifications: unknown[] = [];\n let response: ACPMessage | null = null;\n const originalSend = this.transport.send.bind(this.transport);\n this.transport.send = async (m: ACPMessage) => {\n if (m.id !== undefined && (m.result !== undefined || m.error !== undefined)) {\n // The JSON-RPC response to this request — capture, don't write\n // to stdout (which is meaningless over HTTP).\n response = m;\n } else if (m.method === 'session/update') {\n notifications.push(m.params);\n } else {\n // Any other server-initiated notification — buffer it too.\n notifications.push(m);\n }\n };\n\n try {\n await handler.handleMessage(msg);\n } finally {\n this.transport.send = originalSend;\n }\n\n res.writeHead(200, { 'Content-Type': 'application/json' });\n const responseBody =\n response !== null\n ? { ...(response as ACPMessage), notifications }\n : { notifications };\n res.end(JSON.stringify(responseBody));\n });\n\n return new Promise<void>((resolve) => {\n this.httpServer!.listen(port, host, () => {\n writeErr(`[wstack-acp] HTTP server listening on http://${host}:${port}\\n`);\n this.running = true;\n resolve();\n });\n });\n }\n\n /** Stop the server. */\n stop(): void {\n this.running = false;\n this.transport.close();\n if (this.httpServer) {\n this.httpServer.close();\n this.httpServer = null;\n }\n }\n}\n\n/**\n * Default per-turn implementation: a no-op that echoes nothing useful\n * and returns `end_turn`. Lets the server boot end-to-end without\n * needing the core Agent factory (which would couple this entrypoint\n * to a long-lived model provider). The real implementation is\n * `ACPServerAgentTurn` (follow-up PR) that wires a core `Agent`.\n */\nconst defaultEchoRunTurn: RunTurn = async (_input, _emit): Promise<RunTurnResult> => {\n return { stopReason: 'end_turn' };\n};\n\n/**\n * Bootstrap function for `node dist/agent/wrongstack-acp-agent.js`.\n * Instantiates the server with the default (no-op) runTurn so the\n * binary is useful as a connectivity smoke test.\n *\n * In practice the CLI will instantiate and run `WrongStackACPServer`\n * directly, passing a real `runTurn` wired to a core `Agent`.\n */\n/* v8 ignore start -- process entrypoint: bootstrap + auto-start only run when launched as `node wrongstack-acp-agent.js`, never on import (which the CLI does to reuse the class). */\nasync function main(): Promise<void> {\n const server = new WrongStackACPServer();\n await server.start();\n}\n\nconst isEntrypoint =\n process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1];\nif (isEntrypoint) {\n main().catch((err) => {\n writeErr(`[wstack-acp fatal] ${err}\\n`);\n process.exit(1);\n });\n}\n/* v8 ignore stop */\n","/**\n * WebSocketClientTransport — remote ACP transport for `ACPSession`.\n *\n * Connects to a remote ACP agent over a WebSocket (cloud-hosted agents,\n * separate-process agents reachable over the network). Each WebSocket\n * message carries exactly one JSON-RPC 2.0 object — message boundaries\n * are preserved by the WS framing, so (unlike stdio) no newline delimiter\n * is needed.\n *\n * Uses the Node ≥ 22 built-in global `WebSocket` (undici), so there is no\n * runtime dependency. Per-connection auth headers are not supported by the\n * WHATWG WebSocket client; authenticate over the protocol instead\n * (`ACPSession.authenticate`) or embed a token in the URL query string.\n *\n * Spec: https://agentclientprotocol.com/protocol/v1/overview (remote transport)\n */\n\nimport type { ACPClientTransport } from '../agent/stdio-transport.js';\nimport type { ACPMessage } from '../types/acp-messages.js';\n\nexport interface WebSocketClientTransportOptions {\n /** ws:// or wss:// URL of the remote ACP agent. */\n url: string;\n /** Optional WebSocket subprotocols. */\n protocols?: string | string[] | undefined;\n /** How long to wait for the socket to open. Default 30s. */\n handshakeTimeoutMs?: number | undefined;\n}\n\n/** Narrow view of the global WebSocket we rely on (avoids lib.dom typings). */\ninterface WSLike {\n send(data: string): void;\n close(): void;\n addEventListener(type: 'open', cb: () => void): void;\n addEventListener(type: 'error', cb: (ev: unknown) => void): void;\n addEventListener(type: 'close', cb: () => void): void;\n addEventListener(type: 'message', cb: (ev: { data: unknown }) => void): void;\n}\n\ntype WSConstructor = new (url: string, protocols?: string | string[]) => WSLike;\n\nexport class WebSocketClientTransport implements ACPClientTransport {\n private ws: WSLike | null = null;\n private readonly handlers = new Set<(msg: ACPMessage) => void>();\n private closed = false;\n private readonly opts: WebSocketClientTransportOptions;\n\n constructor(opts: WebSocketClientTransportOptions) {\n this.opts = opts;\n }\n\n start(): Promise<void> {\n const WS = (globalThis as { WebSocket?: WSConstructor }).WebSocket;\n if (!WS) {\n return Promise.reject(\n new Error(\n 'global WebSocket is not available — Node ≥ 22 is required for the remote ACP transport',\n ),\n );\n }\n const timeoutMs = this.opts.handshakeTimeoutMs ?? 30_000;\n return new Promise<void>((resolve, reject) => {\n let settled = false;\n const ws = new WS(this.opts.url, this.opts.protocols);\n this.ws = ws;\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n try {\n ws.close();\n } catch {\n // ignore\n }\n reject(new Error(`WebSocket failed to open within ${timeoutMs}ms`));\n }, timeoutMs);\n\n ws.addEventListener('open', () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve();\n });\n ws.addEventListener('error', (ev: unknown) => {\n if (settled) {\n // Post-open errors just tear the connection down.\n this.closed = true;\n return;\n }\n settled = true;\n clearTimeout(timer);\n const message =\n ev && typeof ev === 'object' && 'message' in ev\n ? String((ev as { message: unknown }).message)\n : 'WebSocket error';\n reject(new Error(message));\n });\n ws.addEventListener('close', () => {\n this.closed = true;\n });\n ws.addEventListener('message', (ev: { data: unknown }) => {\n this.onData(ev.data);\n });\n });\n }\n\n send(msg: ACPMessage): Promise<void> {\n if (this.closed || !this.ws) {\n return Promise.reject(new Error('WebSocket transport is not open'));\n }\n try {\n this.ws.send(JSON.stringify(msg));\n return Promise.resolve();\n } catch (err) {\n return Promise.reject(err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n onMessage(handler: (msg: ACPMessage) => void): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n stop(): void {\n this.closed = true;\n if (this.ws) {\n try {\n this.ws.close();\n } catch {\n // already closed\n }\n this.ws = null;\n }\n }\n\n private onData(data: unknown): void {\n const text =\n typeof data === 'string'\n ? data\n : data instanceof ArrayBuffer\n ? Buffer.from(data).toString('utf8')\n : Buffer.isBuffer(data)\n ? data.toString('utf8')\n : String(data);\n if (!text.trim()) return;\n let msg: ACPMessage;\n try {\n msg = JSON.parse(text) as ACPMessage;\n } catch {\n // A remote agent that frames multiple JSON objects per message is\n // non-conformant; try newline-splitting as a fallback before dropping.\n for (const line of text.split('\\n')) {\n if (!line.trim()) continue;\n try {\n this.dispatch(JSON.parse(line) as ACPMessage);\n } catch {\n // skip malformed fragment\n }\n }\n return;\n }\n this.dispatch(msg);\n }\n\n private dispatch(msg: ACPMessage): void {\n for (const handler of [...this.handlers]) {\n try {\n handler(msg);\n } catch {\n // a faulty consumer must not break the socket pump\n }\n }\n }\n}\n","import { expectDefined } from '@wrongstack/core';\n/**\n * ToolTranslator — bidirectional translation between WrongStack tools and\n * ACP tool representations.\n *\n * Used by DIR-1 (WrongStack as ACP client) to:\n * - Map WrongStack TaskSpec → ACP task payload\n * - Map ACP tool responses → TaskResult\n *\n * Used by DIR-2 (WrongStack as ACP server) to:\n * - Convert the WrongStack Tool.inputSchema → ACPToolDefinition.inputSchema\n * - (handled by tools-registry.ts — same logic lives there)\n *\n * For DIR-1 async tool calls: ACP agents send progress notifications while\n * a tool is running, then send a final result. The translator handles this\n * by polling for the final [result] notification on the transport.\n */\nimport type {ACPMessage, ACPToolDefinition, ACPToolCallResponse, ContentBlock} from '../types/acp-messages.js';\nimport type {TaskSpec, TaskResult} from '@wrongstack/core';\nexport interface ToolTranslatorOptions {\n /**\n * If true (default), wrap tool calls in an async poll loop that waits\n * for progress notifications until a final result arrives.\n */\n asyncTools?: boolean | undefined;\n pollIntervalMs?: number | undefined;\n totalTimeoutMs?: number | undefined;\n}\n\nconst DEFAULT_OPTIONS: Required<ToolTranslatorOptions> = {\n asyncTools: true,\n pollIntervalMs: 500,\n totalTimeoutMs: 120_000,\n};\n\n/** Convert an ACP ACPToolDefinition → a JSON schema object recognisable by WrongStack */\nexport function acpToolToSchema(def: ACPToolDefinition): Record<string, unknown> {\n if (!def.inputSchema) return {type: 'object', properties: {}};\n return def.inputSchema as Record<string, unknown>;\n}\n\n/** Extract tool result text from ACP ContentBlock[] */\nexport function extractTextFromContent(blocks: ContentBlock[]): string {\n const parts: string[] = [];\n for (const b of blocks) {\n if (b.type === 'text') parts.push(b.text);\n else if (b.type === 'resource') parts.push(`[resource: ${b.resource.uri}]`);\n else if (b.type === 'image') parts.push(`[image: ${b.data.slice(0, 20)}...]`);\n else if (b.type === 'progress') {\n if (b.messages?.length) parts.push(b.messages.join('\\n'));\n }\n }\n return parts.join('\\n');\n}\n\n/** Build a TaskSpec from an ACP task payload */\nexport function buildTaskSpec(payload: {\n taskId: string;\n task: string;\n subagentId?: string | undefined;\n}): TaskSpec {\n return {\n id: payload.taskId,\n description: payload.task,\n subagentId: payload.subagentId,\n };\n}\n\n/** Parse an ACP tools/call response → TaskResult */\nexport function parseToolResponse(\n taskId: string,\n subagentId: string,\n response: ACPToolCallResponse,\n): TaskResult {\n const blocks = response.result.content;\n const text = extractTextFromContent(blocks);\n\n // Detect error state from isError flag or error-like text\n const isError =\n response.result.isError || text.toLowerCase().includes('error') ||\n text.toLowerCase().includes('failed');\n\n return {\n taskId,\n subagentId,\n status: isError ? 'failed' : 'success',\n result: text,\n iterations: 1,\n toolCalls: 1,\n durationMs: 0,\n };\n}\n\n/** ToolTranslator for DIR-1 — wraps ACP client transport, adds task semantics */\nexport class ToolTranslator {\n private readonly opts: Required<ToolTranslatorOptions>;\n private readonly pending = new Map<string | number, {\n resolve: (v: ACPToolCallResponse) => void;\n reject: (e: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }>();\n\n constructor(opts: ToolTranslatorOptions = {}) {\n this.opts = {...DEFAULT_OPTIONS, ...opts};\n }\n\n /**\n * Start listening to a transport for tool responses and cancellations.\n * Call this once after constructing the translator and before sending tasks.\n */\n attachToTransport(\n transport: {onMessage: (h: (msg: ACPMessage) => void) => () => void; send: (msg: ACPMessage) => Promise<void>},\n ): void {\n transport.onMessage((msg) => {\n if (msg.method === 'tools/call' && msg.id !== undefined) {\n const pending = this.pending.get(msg.id);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pending.delete(expectDefined(msg.id));\n pending.resolve(msg as never as ACPToolCallResponse);\n }\n }\n\n // Handle cancellation notifications\n if (msg.method === 'cancel' && msg.id !== undefined) {\n const pending = this.pending.get(msg.id);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pending.delete(expectDefined(msg.id));\n pending.reject(new Error('Call cancelled by client'));\n }\n }\n });\n }\n\n /**\n * Send a tool call over the transport and wait for a response.\n * If asyncTools is true, polls for progress and resolves when the final\n * response arrives.\n */\n async callTool(\n transport: {send: (msg: ACPMessage) => Promise<void>},\n name: string,\n args: Record<string, unknown>,\n callId: string | number = crypto.randomUUID(),\n ): Promise<ACPToolCallResponse> {\n await transport.send({\n jsonrpc: '2.0',\n method: 'tools/call',\n id: callId,\n params: {name, arguments: args},\n } as never as ACPMessage);\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pending.delete(callId);\n reject(new Error(`Tool call ${name} timed out after ${this.opts.totalTimeoutMs}ms`));\n }, this.opts.totalTimeoutMs);\n\n this.pending.set(callId, {resolve, reject, timeout});\n });\n }\n\n cancelAll(): void {\n for (const [, p] of this.pending) {\n clearTimeout(p.timeout);\n }\n this.pending.clear();\n }\n}\n","/**\n * FileServer — answers `fs/read_text_file` and `fs/write_text_file`\n * from an ACP agent, scoped to a single project root.\n *\n * Per the spec, all file paths in ACP MUST be absolute. We additionally\n * require them to resolve under `projectRoot` after normalisation;\n * anything else is rejected with a JSON-RPC error so the agent can't\n * use us to read `/etc/passwd` or write to `~/.ssh/`.\n *\n * The server itself is transport-agnostic: the caller (ACPSession)\n * routes incoming fs/* requests to `handle()` and sends the result\n * back. Keeping the routing out of this class lets the file logic be\n * unit-tested in isolation.\n */\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface FileServerOptions {\n /** Absolute path; only files under this root are accessible. */\n projectRoot: string;\n /** Per-call timeout, default 30s. */\n timeoutMs?: number;\n}\n\nexport interface ReadFileParams {\n sessionId: string;\n path: string;\n}\n\nexport interface WriteFileParams {\n sessionId: string;\n path: string;\n content: string;\n}\n\nexport type FsErrorCode = 'ENOENT' | 'EACCES' | 'OUTSIDE_ROOT' | 'TIMEOUT' | 'INVALID_PATH';\n\n/**\n * Thrown for protocol-level rejections (path outside root, etc.).\n * The session converts these into JSON-RPC error responses.\n */\nexport class FsError extends Error {\n readonly code: FsErrorCode;\n readonly path: string;\n constructor(code: FsErrorCode, path: string, message: string) {\n super(message);\n this.name = 'FsError';\n this.code = code;\n this.path = path;\n }\n}\n\nexport class FileServer {\n private readonly root: string;\n private readonly timeoutMs: number;\n\n constructor(opts: FileServerOptions) {\n this.root = path.resolve(opts.projectRoot);\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n }\n\n /** Read a text file. Returns the content as a string. */\n async readTextFile(params: ReadFileParams): Promise<{ content: string }> {\n const safe = this.resolveInside(params.path);\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const content = await fsp.readFile(safe, {\n encoding: 'utf8',\n signal: controller.signal,\n });\n return { content };\n } catch (err) {\n if (controller.signal.aborted) {\n throw new FsError('TIMEOUT', safe, `readTextFile timed out after ${this.timeoutMs}ms`);\n }\n throw mapFsError(err, safe);\n } finally {\n clearTimeout(timer);\n }\n }\n\n /** Write a text file. Atomic via write-then-rename. */\n async writeTextFile(params: WriteFileParams): Promise<void> {\n const safe = this.resolveInside(params.path);\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n const tmp = `${safe}.${randomHex(4)}.tmp`;\n try {\n await fsp.writeFile(tmp, params.content, {\n encoding: 'utf8',\n signal: controller.signal,\n });\n await fsp.rename(tmp, safe);\n } catch (err) {\n // Best-effort cleanup of the tmp file\n try {\n await fsp.unlink(tmp);\n } catch {\n // tmp didn't exist; ignore\n }\n if (controller.signal.aborted) {\n throw new FsError('TIMEOUT', safe, `writeTextFile timed out after ${this.timeoutMs}ms`);\n }\n throw mapFsError(err, safe);\n } finally {\n clearTimeout(timer);\n }\n }\n\n /**\n * Resolve a path; throw `FsError('OUTSIDE_ROOT')` if the result is\n * not under the project root. Symlinks are not followed here — we\n * operate on the textual path. A future hardening pass can\n * `fs.realpath` each access to catch symlink escapes.\n */\n private resolveInside(p: string): string {\n if (typeof p !== 'string' || p.length === 0) {\n throw new FsError('INVALID_PATH', p, 'path is empty or not a string');\n }\n if (!path.isAbsolute(p)) {\n throw new FsError('INVALID_PATH', p, 'path must be absolute (ACP requirement)');\n }\n const resolved = path.resolve(p);\n // +path.sep prevents \"/project-evil\" matching \"/project\" as a prefix.\n const rootWithSep = this.root.endsWith(path.sep) ? this.root : this.root + path.sep;\n if (resolved !== this.root && !resolved.startsWith(rootWithSep)) {\n throw new FsError('OUTSIDE_ROOT', resolved, 'path is outside the project root');\n }\n return resolved;\n }\n}\n\nfunction mapFsError(err: unknown, p: string): FsError {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return new FsError('ENOENT', p, `no such file: ${p}`);\n if (code === 'EACCES' || code === 'EPERM') {\n return new FsError('EACCES', p, `permission denied: ${p}`);\n }\n const msg = err instanceof Error ? err.message : String(err);\n return new FsError('INVALID_PATH', p, msg);\n}\n\nfunction randomHex(bytes: number): string {\n // Avoid importing node:crypto for a 4-byte hex string — use Math.random\n // with a clear warning-free use case (temp file suffix only).\n let out = '';\n for (let i = 0; i < bytes * 2; i++) {\n out += Math.floor(Math.random() * 16).toString(16);\n }\n return out;\n}\n","/**\n * Permission policy for ACP v1 client sessions.\n *\n * ACP agents can call `session/request_permission` to ask the user\n * before executing a tool call. The client is expected to surface\n * the question, get a decision, and respond. This module is the seam\n * where WrongStack-specific permission UI can plug in; for v1 we ship\n * a minimal default that auto-approves the first `allow_once` option\n * (or `allow_always` if present) and rejects on abort.\n */\nimport type {\n PermissionOption,\n RequestPermissionOutcome,\n ToolCallUpdateNotification,\n} from '../types/acp-v1.js';\n\n/** A single permission decision request. */\nexport interface PermissionRequest {\n toolCall: ToolCallUpdateNotification;\n options: readonly PermissionOption[];\n signal: AbortSignal;\n}\n\n/** A permission policy decides how to respond to a request. */\nexport type PermissionPolicy = (\n req: PermissionRequest,\n) => Promise<RequestPermissionOutcome>;\n\n/**\n * Default policy: pick the safest-looking allow option if the signal\n * is not aborted, otherwise report cancelled. Order of preference:\n *\n * 1. `allow_always`\n * 2. `allow_once`\n * 3. anything else with `optionId` (last resort)\n *\n * Real WrongStack permission UIs replace this; the contract is the\n * `PermissionPolicy` function type, not the implementation.\n */\nfunction pickAllow(\n options: readonly PermissionOption[],\n): RequestPermissionOutcome {\n const ranked = [...options].sort((a, b) => {\n const score = (k: PermissionOption['kind']): number => {\n if (k === 'allow_once') return 0; // prefer once over always — least standing grant\n if (k === 'allow_always') return 1;\n if (k === 'reject_once') return 2;\n return 3;\n };\n return score(a.kind) - score(b.kind);\n });\n const chosen = ranked[0];\n if (!chosen || chosen.kind === 'reject_once' || chosen.kind === 'reject_always') {\n return { outcome: 'cancelled' };\n }\n return { outcome: 'selected', optionId: chosen.optionId };\n}\n\nfunction pickReject(\n options: readonly PermissionOption[],\n): RequestPermissionOutcome {\n const reject = options.find(\n (o) => o.kind === 'reject_once' || o.kind === 'reject_always',\n );\n return reject ? { outcome: 'selected', optionId: reject.optionId } : { outcome: 'cancelled' };\n}\n\n/**\n * Tool kinds considered side-effect-free (safe to auto-approve even in a\n * non-interactive run). Everything else (edit/delete/move/execute) mutates\n * the workspace or runs commands and should be gated by a real policy.\n */\nconst READ_ONLY_KINDS = new Set(['read', 'search', 'fetch', 'think']);\n\n/**\n * Default policy: auto-approve the least-standing allow option.\n *\n * ⚠️ This auto-approves EVERY tool call, including file writes and shell\n * commands. It exists so non-interactive contexts (CLI `acp spawn`,\n * the Director fan-out) work without a human in the loop. Interactive\n * surfaces (TUI/WebUI) MUST inject a policy that surfaces the request to\n * the user — pass `permissionPolicy` to `ACPSession` / the subagent runner.\n * For untrusted agents prefer {@link readOnlyPermissionPolicy}.\n */\nexport const defaultPermissionPolicy: PermissionPolicy = async (req) => {\n if (req.signal.aborted) return { outcome: 'cancelled' };\n return pickAllow(req.options);\n};\n\n/**\n * Safe-by-default policy: auto-approve only side-effect-free tool calls\n * (read/search/fetch/think); reject anything that would write files or\n * run commands. Use this when driving an untrusted external agent and no\n * interactive surface is available to ask the user.\n */\nexport const readOnlyPermissionPolicy: PermissionPolicy = async (req) => {\n if (req.signal.aborted) return { outcome: 'cancelled' };\n const kind = req.toolCall.kind;\n if (kind && READ_ONLY_KINDS.has(kind)) {\n return pickAllow(req.options);\n }\n return pickReject(req.options);\n};\n\n/**\n * Build a policy from a yes/no decision function. The decider receives the\n * tool call (title + kind + rawInput) and returns whether to allow it.\n * This is the seam an interactive host (TUI/WebUI confirm prompt, trust\n * store, exec-allowlist) plugs into.\n */\nexport function makePermissionPolicy(\n decide: (req: PermissionRequest) => boolean | Promise<boolean>,\n): PermissionPolicy {\n return async (req) => {\n if (req.signal.aborted) return { outcome: 'cancelled' };\n const allow = await decide(req);\n return allow ? pickAllow(req.options) : pickReject(req.options);\n };\n}\n","/**\n * TerminalServer — answers `terminal/*` methods from an ACP agent.\n *\n * The spec lets agents spawn shell commands inside the client's\n * environment and observe their output. We honour the protocol, but\n * every command runs under a per-process timeout and a byte limit on\n * retained output, both to keep runaway agents from filling memory\n * and to give the runner a clean signal when something is stuck.\n *\n * Scoping: commands run with `cwd` set to the agent's requested cwd\n * if it's inside `projectRoot`, else `projectRoot`. There is no\n * per-terminal `env` allowlist in v1; the agent's env is propagated\n * from the spawn options.\n */\nimport { spawn } from 'node:child_process';\nimport * as path from 'node:path';\n\nexport interface TerminalServerOptions {\n projectRoot: string;\n /** Hard cap on per-command wall-clock. Default 5 minutes. */\n commandTimeoutMs?: number;\n /** Bytes of output to retain per terminal. Default 1 MiB. */\n outputByteLimit?: number;\n /** Optional abort signal that kills ALL active terminals. */\n signal?: AbortSignal;\n}\n\ninterface TerminalState {\n proc: ReturnType<typeof spawn>;\n cwd: string;\n command: string;\n args: string[];\n /** Output buffer as a string; appended as bytes arrive. */\n output: string;\n /** Bytes currently retained (post-truncation). */\n retainedBytes: number;\n /** True once we've dropped output to fit under the per-call byte limit. */\n truncated: boolean;\n exitStatus?: { exitCode: number | null; signal: string | null } | undefined;\n /** Resolves when the process exits. */\n exitPromise: Promise<{ exitCode: number | null; signal: string | null }>;\n /** Per-terminal timeout handle. */\n timeoutHandle: ReturnType<typeof setTimeout> | null;\n}\n\nexport class TerminalServer {\n private readonly terminals = new Map<string, TerminalState>();\n private readonly projectRoot: string;\n private readonly commandTimeoutMs: number;\n private readonly outputByteLimit: number;\n private nextId = 1;\n\n constructor(opts: TerminalServerOptions) {\n this.projectRoot = path.resolve(opts.projectRoot);\n this.commandTimeoutMs = opts.commandTimeoutMs ?? 5 * 60_000;\n this.outputByteLimit = opts.outputByteLimit ?? 1024 * 1024;\n if (opts.signal) {\n opts.signal.addEventListener('abort', () => this.releaseAll());\n }\n }\n\n /** Spawn a new terminal. Returns the agent-facing id. */\n create(params: {\n sessionId: string;\n command: string;\n args?: string[];\n env?: { name: string; value: string }[];\n cwd?: string;\n outputByteLimit?: number;\n }): { terminalId: string } {\n const id = `term_${this.nextId++}`;\n const cwd = this.resolveCwd(params.cwd);\n const proc = spawn(params.command, params.args ?? [], {\n cwd,\n env: this.buildEnv(params.env),\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n // shell: false on purpose. The terminal server is invoked with\n // the agent's explicit argv; turning on shell-mode would make\n // the command a single shell-parsed string, which breaks\n // Windows cmd quoting for the common case of running node with\n // `-e \"<script>\"`. If a future feature needs shell features\n // (pipes, redirects), it should be opt-in per-call, not the\n // default.\n });\n\n const state: TerminalState = {\n proc,\n cwd,\n command: params.command,\n args: params.args ?? [],\n output: '',\n retainedBytes: 0,\n truncated: false,\n exitStatus: undefined,\n timeoutHandle: null,\n exitPromise: new Promise((resolve) => {\n proc.on('close', (code, signalName) => {\n if (state.timeoutHandle) {\n clearTimeout(state.timeoutHandle);\n state.timeoutHandle = null;\n }\n const exitStatus = {\n exitCode: typeof code === 'number' ? code : null,\n signal: typeof signalName === 'string' ? signalName : null,\n };\n state.exitStatus = exitStatus;\n resolve(exitStatus);\n });\n proc.on('error', (err) => {\n // Spawn-time errors (ENOENT etc.) — surface as a special\n // exit status with exitCode 127 (command not found).\n if (state.timeoutHandle) {\n clearTimeout(state.timeoutHandle);\n state.timeoutHandle = null;\n }\n const exitStatus = { exitCode: 127, signal: null };\n state.exitStatus = exitStatus;\n state.output += `[spawn error] ${err.message}\\n`;\n state.retainedBytes += Buffer.byteLength(state.output, 'utf8');\n resolve(exitStatus);\n });\n }),\n };\n\n const perCallByteLimit = params.outputByteLimit ?? this.outputByteLimit;\n proc.stdout?.setEncoding('utf8');\n proc.stderr?.setEncoding('utf8');\n const onData = (chunk: string): void => {\n state.output += chunk;\n state.retainedBytes = Buffer.byteLength(state.output, 'utf8');\n // Truncate from the start if we exceed the limit. Per spec, the\n // truncation MUST happen at a character boundary. UTF-8 slicing\n // a string can land mid-codepoint; we trim back to the last\n // complete code point to honour that.\n while (state.retainedBytes > perCallByteLimit) {\n const trimmed = state.output.slice(1);\n // Cheap boundary check: if dropping the first char doesn't\n // shrink us by at least one byte, we're slicing inside a\n // multi-byte sequence; keep dropping.\n state.output = trimmed;\n const newBytes = Buffer.byteLength(state.output, 'utf8');\n if (newBytes >= state.retainedBytes) {\n // give up — would loop forever\n break;\n }\n state.retainedBytes = newBytes;\n state.truncated = true;\n }\n };\n proc.stdout?.on('data', onData);\n proc.stderr?.on('data', onData);\n\n state.timeoutHandle = setTimeout(() => {\n // Best-effort kill; we don't have an exact \"TIMEOUT\" stop reason\n // so we just exit with -1.\n try {\n proc.kill('SIGTERM');\n } catch {\n // already dead\n }\n }, this.commandTimeoutMs);\n\n this.terminals.set(id, state);\n return { terminalId: id };\n }\n\n /** Return captured output and (if available) the exit status. */\n output(terminalId: string): { output: string; truncated: boolean; exitStatus?: { exitCode: number | null; signal: string | null } } {\n const state = this.terminals.get(terminalId);\n if (!state) throw new Error(`unknown terminal: ${terminalId}`);\n return {\n output: state.output,\n truncated: state.truncated,\n ...(state.exitStatus ? { exitStatus: state.exitStatus } : {}),\n };\n }\n\n /** Block until the process exits. Resolves with the exit status. */\n async waitForExit(terminalId: string): Promise<{ exitCode: number | null; signal: string | null }> {\n const state = this.terminals.get(terminalId);\n if (!state) throw new Error(`unknown terminal: ${terminalId}`);\n return state.exitPromise;\n }\n\n /** Kill the process but keep the terminal record (agent can still read output). */\n kill(terminalId: string): void {\n const state = this.terminals.get(terminalId);\n if (!state) throw new Error(`unknown terminal: ${terminalId}`);\n try {\n state.proc.kill('SIGTERM');\n } catch {\n // already dead\n }\n }\n\n /** Kill the process if alive and remove the record. */\n release(terminalId: string): void {\n const state = this.terminals.get(terminalId);\n if (!state) return;\n if (state.timeoutHandle) {\n clearTimeout(state.timeoutHandle);\n state.timeoutHandle = null;\n }\n try {\n state.proc.kill('SIGKILL');\n } catch {\n // already dead\n }\n this.terminals.delete(terminalId);\n }\n\n /** Kill all active terminals. Used on session close. */\n releaseAll(): void {\n for (const id of [...this.terminals.keys()]) {\n this.release(id);\n }\n }\n\n private resolveCwd(cwd: string | undefined): string {\n if (!cwd) return this.projectRoot;\n const resolved = path.resolve(cwd);\n const rootWithSep = this.projectRoot.endsWith(path.sep)\n ? this.projectRoot\n : this.projectRoot + path.sep;\n if (resolved !== this.projectRoot && !resolved.startsWith(rootWithSep)) {\n return this.projectRoot;\n }\n return resolved;\n }\n\n private buildEnv(\n agentEnv?: { name: string; value: string }[],\n ): NodeJS.ProcessEnv {\n // On Windows, `process.env` stores PATH as `Path` (the OS-native\n // case). Node's child_process.spawn looks up `env.PATH` (uppercase)\n // when resolving the binary. A plain `{ ...process.env }` spread\n // preserves `Path` but not `PATH`, which causes ENOENT for any\n // binary resolved via $PATH on Windows. Copy uppercase aliases so\n // spawn can find the binary.\n const env: NodeJS.ProcessEnv = { ...process.env };\n if (process.platform === 'win32') {\n if (env.Path !== undefined && env.PATH === undefined) env.PATH = env.Path;\n if (env.PATHEXT !== undefined && env.PATHEXT_CASE === undefined) {\n env.PATHEXT_CASE = env.PATHEXT;\n }\n }\n if (agentEnv) {\n for (const { name, value } of agentEnv) {\n env[name] = value;\n }\n }\n return env;\n }\n}\n","/**\n * ACPSession — v1-correct ACP client.\n *\n * Owns one child process running an ACP-supporting agent (Claude Code,\n * Gemini CLI, Codex CLI, etc.) and translates the wire protocol into\n * a `SubagentRunner`-shaped surface for the rest of WrongStack.\n *\n * Spec: https://agentclientprotocol.com/protocol/v1/overview\n * Design: see ./acp-session.design.md in this directory.\n */\nimport { ClientTransport, type ACPClientTransport } from '../agent/stdio-transport.js';\nimport type { ACPMessage } from '../types/acp-messages.js';\nimport {\n WebSocketClientTransport,\n type WebSocketClientTransportOptions,\n} from './websocket-transport.js';\nimport {\n ACP_PROTOCOL_VERSION,\n type AgentCapabilities,\n type AnySessionUpdate,\n type AuthMethod,\n type ContentBlock,\n type McpServer,\n type PlanEntry,\n type SessionId,\n type SessionInfo,\n type StopReason,\n type ToolCallContent,\n type ToolCallStatus,\n type ToolCallUpdateNotification,\n type ToolKind,\n type UsageCost,\n} from '../types/acp-v1.js';\nimport { FileServer, FsError } from './file-server.js';\nimport {\n defaultPermissionPolicy,\n type PermissionPolicy,\n} from './permission.js';\nimport { TerminalServer } from './terminal-server.js';\n\nexport interface ACPSessionOptions {\n command: string;\n args?: readonly string[] | undefined;\n env?: Record<string, string> | undefined;\n cwd?: string | undefined;\n role?: string | undefined;\n /** Sandbox root for fs/* and terminal/* methods. */\n projectRoot: string;\n /** Hard timeout for one prompt turn. Default 5 minutes. */\n timeoutMs?: number | undefined;\n /** Override the permission policy. */\n permissionPolicy?: PermissionPolicy | undefined;\n /** Per-fs-call timeout, default 30s. */\n fsTimeoutMs?: number | undefined;\n /** Per-terminal command timeout, default 5 minutes. */\n terminalTimeoutMs?: number | undefined;\n /** Per-terminal output byte cap, default 1 MiB. */\n terminalOutputByteLimit?: number | undefined;\n /**\n * MCP server configs to include in session/new, session/load, and\n * session/resume. The agent will connect to these servers to provide\n * additional tools.\n *\n * Stdio servers are always sent. HTTP/SSE servers are only sent if\n * the agent advertises the corresponding mcpCapabilities.\n */\n mcpServers?: McpServer[] | undefined;\n}\n\n/**\n * A captured file diff emitted by the agent during a turn (via a tool\n * call's `diff` content). `oldText: null` means the file was created.\n */\nexport interface ACPCapturedDiff {\n path: string;\n oldText: string | null;\n newText: string;\n}\n\n/**\n * A captured tool call the agent ran during a turn. We collapse the\n * `tool_call` + subsequent `tool_call_update` notifications for the same\n * `toolCallId` into one record carrying its latest status.\n */\nexport interface ACPCapturedToolCall {\n toolCallId: string;\n title: string;\n kind?: ToolKind | undefined;\n status: ToolCallStatus;\n /** Terminal/command output or text content surfaced by the tool, if any. */\n rawOutput?: Record<string, unknown> | undefined;\n rawInput?: Record<string, unknown> | undefined;\n}\n\nexport interface ACPSessionRunResult {\n text: string;\n stopReason: StopReason;\n hasText: boolean;\n usage?: { used: number; size: number; cost?: UsageCost | undefined } | undefined;\n plan?: PlanEntry[] | undefined;\n /** Tool calls the agent ran this turn (deduped by toolCallId). */\n toolCalls: ACPCapturedToolCall[];\n /** File diffs the agent produced this turn. */\n diffs: ACPCapturedDiff[];\n /** Agent \"thinking\" text emitted via thought_chunk, concatenated. */\n thoughts: string;\n}\n\n/**\n * Live progress callback. Invoked for every `session/update` notification\n * the agent streams during a `prompt()` turn, in arrival order, BEFORE the\n * turn resolves. Lets the host render tool activity / text deltas / diffs\n * as they happen instead of waiting for the buffered final result.\n *\n * The raw `update` (the discriminated `session/update` payload) is passed\n * through verbatim so callers can switch on `update.sessionUpdate`.\n */\nexport type ACPProgressHandler = (event: ACPProgressEvent) => void;\n\nexport type ACPProgressEvent =\n | { type: 'message'; text: string }\n | { type: 'thought'; text: string }\n | { type: 'tool_call'; toolCall: ACPCapturedToolCall }\n | { type: 'tool_call_update'; toolCall: ACPCapturedToolCall }\n | { type: 'diff'; diff: ACPCapturedDiff }\n | { type: 'plan'; entries: PlanEntry[] }\n | { type: 'usage'; usage: { used: number; size: number; cost?: UsageCost | undefined } }\n | { type: 'raw'; update: AnySessionUpdate };\n\nexport type ACPSessionErrorKind =\n | 'spawn_failed'\n | 'init_failed'\n | 'protocol_error'\n | 'session_create_failed'\n | 'prompt_failed'\n | 'auth_failed'\n | 'logout_failed'\n | 'aborted'\n | 'closed'\n | 'agent_died'\n | 'unsupported_capability';\n\nexport class ACPSessionError extends Error {\n readonly kind: ACPSessionErrorKind;\n override readonly cause: unknown;\n constructor(kind: ACPSessionErrorKind, message: string, cause?: unknown) {\n super(message);\n this.name = 'ACPSessionError';\n this.kind = kind;\n this.cause = cause;\n }\n}\n\ninterface PendingRequest {\n method: string;\n resolve: (v: unknown) => void;\n reject: (e: Error) => void;\n timeoutMs: number;\n timeoutHandle: ReturnType<typeof setTimeout>;\n}\n\ntype State = 'init' | 'ready' | 'authenticated' | 'sessioning' | 'prompting' | 'done' | 'closed';\n\ninterface JsonRpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\nfunction isJsonRpcError(v: unknown): v is JsonRpcError {\n return (\n typeof v === 'object' &&\n v !== null &&\n typeof (v as { code?: unknown }).code === 'number' &&\n typeof (v as { message?: unknown }).message === 'string'\n );\n}\n\nexport class ACPSession {\n private readonly transport: ACPClientTransport;\n private readonly fileServer: FileServer;\n private readonly terminalServer: TerminalServer;\n private readonly permissionPolicy: PermissionPolicy;\n private readonly timeoutMs: number;\n private readonly opts: ACPSessionOptions;\n\n private state: State = 'init';\n private sessionId: SessionId | null = null;\n /** Pending outbound requests (initialize, session/new, session/prompt, etc). */\n private readonly pending = new Map<string | number, PendingRequest>();\n private nextId = 1;\n /** True after close() has been called. */\n private closed = false;\n\n // Agent-provided info from the initialize handshake\n private agentCapabilities: AgentCapabilities = {};\n private agentInfo: { name: string; title?: string | undefined; version: string } | null = null;\n private authMethods: AuthMethod[] = [];\n /** Protocol version negotiated with the agent during initialize. */\n private negotiatedVersion: number = ACP_PROTOCOL_VERSION;\n\n private constructor(opts: ACPSessionOptions, transport: ACPClientTransport) {\n this.opts = opts;\n this.transport = transport;\n this.timeoutMs = opts.timeoutMs ?? 5 * 60_000;\n const fsOpts: ConstructorParameters<typeof FileServer>[0] = {\n projectRoot: opts.projectRoot,\n };\n if (opts.fsTimeoutMs !== undefined) fsOpts.timeoutMs = opts.fsTimeoutMs;\n this.fileServer = new FileServer(fsOpts);\n const termOpts: ConstructorParameters<typeof TerminalServer>[0] = {\n projectRoot: opts.projectRoot,\n };\n if (opts.terminalTimeoutMs !== undefined) {\n termOpts.commandTimeoutMs = opts.terminalTimeoutMs;\n }\n if (opts.terminalOutputByteLimit !== undefined) {\n termOpts.outputByteLimit = opts.terminalOutputByteLimit;\n }\n this.terminalServer = new TerminalServer(termOpts);\n this.permissionPolicy = opts.permissionPolicy ?? defaultPermissionPolicy;\n }\n\n // ──────────────────────────────────────────────────────────────────────\n // Public accessors\n // ──────────────────────────────────────────────────────────────────────\n\n /** Agent capabilities advertised during initialize. */\n getCapabilities(): AgentCapabilities {\n return { ...this.agentCapabilities };\n }\n\n /** Authentication methods advertised by the agent. */\n getAuthMethods(): AuthMethod[] {\n return [...this.authMethods];\n }\n\n /** Agent info (name, title, version) from initialize. */\n getAgentInfo(): { name: string; title?: string | undefined; version: string } | null {\n return this.agentInfo;\n }\n\n /** Whether the agent requires authentication (has auth methods). */\n requiresAuth(): boolean {\n return this.authMethods.length > 0;\n }\n\n /** Current session id, if one exists. */\n getSessionId(): SessionId | null {\n return this.sessionId;\n }\n\n /** Protocol version negotiated during initialize. */\n getNegotiatedVersion(): number {\n return this.negotiatedVersion;\n }\n\n // ──────────────────────────────────────────────────────────────────────\n // Lifecycle — start\n // ──────────────────────────────────────────────────────────────────────\n\n /**\n * Spawn the child, run the initialize handshake, install the\n * message dispatch, and return a ready session.\n */\n static async start(opts: ACPSessionOptions): Promise<ACPSession> {\n const transportOpts: ConstructorParameters<typeof ClientTransport>[0] = {\n command: opts.command,\n args: opts.args ? [...opts.args] : [],\n handshakeTimeoutMs: 30_000,\n skipHandshakeMarker: true,\n };\n if (opts.env !== undefined) transportOpts.env = opts.env;\n if (opts.cwd !== undefined) transportOpts.cwd = opts.cwd;\n const transport = new ClientTransport(transportOpts);\n return ACPSession.attach(opts, transport, `failed to spawn ${opts.command}`);\n }\n\n /**\n * Connect to a REMOTE ACP agent over a WebSocket instead of spawning a\n * local subprocess. `opts.command` is ignored for the wire (a label is\n * still useful for `role`); everything else (projectRoot sandbox for\n * fs/terminal, timeouts, permission policy, MCP servers) applies the same.\n */\n static async connectWebSocket(\n wsOpts: WebSocketClientTransportOptions,\n opts: ACPSessionOptions,\n ): Promise<ACPSession> {\n const transport = new WebSocketClientTransport(wsOpts);\n return ACPSession.attach(opts, transport, `failed to connect to ${wsOpts.url}`);\n }\n\n /**\n * Connect using a caller-supplied transport. Lets advanced callers plug\n * in their own wire (SDK streams, in-process pipes, test doubles).\n */\n static async connect(\n transport: ACPClientTransport,\n opts: ACPSessionOptions,\n ): Promise<ACPSession> {\n return ACPSession.attach(opts, transport, 'failed to connect transport');\n }\n\n /** Shared connect path: start the transport, install dispatch, handshake. */\n private static async attach(\n opts: ACPSessionOptions,\n transport: ACPClientTransport,\n spawnErrLabel: string,\n ): Promise<ACPSession> {\n try {\n await transport.start();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new ACPSessionError('spawn_failed', `${spawnErrLabel}: ${msg}`, err);\n }\n\n const session = new ACPSession(opts, transport);\n transport.onMessage((msg) => session.handleMessage(msg));\n\n try {\n await session.initialize();\n } catch (err) {\n try {\n transport.stop();\n } catch {\n // best effort\n }\n throw err;\n }\n return session;\n }\n\n // ──────────────────────────────────────────────────────────────────────\n // Initialization\n // ──────────────────────────────────────────────────────────────────────\n\n private async initialize(): Promise<void> {\n const id = this.allocId();\n const result = await this.sendRequest(id, 'initialize', {\n protocolVersion: ACP_PROTOCOL_VERSION,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n terminal: true,\n },\n clientInfo: { name: 'wrongstack', title: 'WrongStack', version: '0.263.0' },\n });\n if (isJsonRpcError(result)) {\n throw new ACPSessionError('init_failed', `initialize failed: ${result.message}`, result);\n }\n if (\n typeof result !== 'object' ||\n result === null ||\n typeof (result as { protocolVersion?: unknown }).protocolVersion !== 'number'\n ) {\n throw new ACPSessionError('protocol_error', 'initialize returned no protocolVersion');\n }\n const r = result as {\n protocolVersion: number;\n agentCapabilities?: AgentCapabilities;\n agentInfo?: { name: string; title?: string | undefined; version: string };\n authMethods?: AuthMethod[];\n };\n // Negotiation per spec: the client advertises its latest supported\n // version; the agent replies with the version both will use — the\n // client's if the agent supports it, otherwise the agent's own latest.\n // We therefore accept any version <= ours (we can speak it) and only\n // reject a version HIGHER than we support (the agent demands a protocol\n // we don't implement). Equal is the common path.\n if (r.protocolVersion > ACP_PROTOCOL_VERSION) {\n throw new ACPSessionError(\n 'unsupported_capability',\n `agent requires protocolVersion=${r.protocolVersion}, client supports up to ${ACP_PROTOCOL_VERSION}`,\n );\n }\n this.negotiatedVersion = r.protocolVersion;\n // Store agent metadata\n this.agentCapabilities = r.agentCapabilities ?? {};\n this.agentInfo = r.agentInfo ?? null;\n this.authMethods = r.authMethods ?? [];\n this.state = 'ready';\n }\n\n // ──────────────────────────────────────────────────────────────────────\n // Authentication\n // ──────────────────────────────────────────────────────────────────────\n\n /**\n * Authenticate with the agent using one of the advertised auth methods.\n * Call this AFTER start() and BEFORE any session/new call.\n *\n * Throws ACPSessionError('auth_failed') if the agent rejects the\n * authentication or if the methodId is not in the advertised list.\n */\n async authenticate(methodId: string): Promise<void> {\n if (this.state === 'closed') {\n throw new ACPSessionError('closed', 'session is closed');\n }\n if (this.state !== 'ready') {\n throw new ACPSessionError(\n 'protocol_error',\n `authenticate called in state=${this.state} (expected 'ready')`,\n );\n }\n if (!this.authMethods.some((m) => m.id === methodId)) {\n throw new ACPSessionError(\n 'auth_failed',\n `auth method \"${methodId}\" not in advertised methods: ${this.authMethods.map((m) => m.id).join(', ')}`,\n );\n }\n\n const id = this.allocId();\n const result = await this.sendRequest(id, 'authenticate', { methodId });\n if (isJsonRpcError(result)) {\n throw new ACPSessionError('auth_failed', `authenticate failed: ${result.message}`, result);\n }\n this.state = 'authenticated';\n }\n\n /**\n * Log out from the current authenticated session.\n * Only callable if the agent advertises `auth.logout` capability.\n */\n async logout(): Promise<void> {\n if (this.state === 'closed') {\n throw new ACPSessionError('closed', 'session is closed');\n }\n if (!this.agentCapabilities.auth?.logout) {\n throw new ACPSessionError(\n 'unsupported_capability',\n 'agent does not support logout (auth.logout capability not advertised)',\n );\n }\n\n const id = this.allocId();\n const result = await this.sendRequest(id, 'logout', {});\n if (isJsonRpcError(result)) {\n throw new ACPSessionError('logout_failed', `logout failed: ${result.message}`, result);\n }\n this.state = 'ready';\n }\n\n // ──────────────────────────────────────────────────────────────────────\n // Session management\n // ──────────────────────────────────────────────────────────────────────\n\n /**\n * Load an existing session. The agent replays the conversation history\n * via session/update notifications before responding.\n *\n * Only works if the agent advertises `loadSession` capability.\n *\n * @param sessionId - The session to load\n * @param mcpServers - Optional MCP servers (defaults to options.mcpServers)\n * @param cwd - Optional working directory (defaults to options.cwd or projectRoot)\n */\n async loadSession(\n sessionId: SessionId,\n mcpServers?: McpServer[],\n cwd?: string,\n ): Promise<void> {\n if (this.closed) {\n throw new ACPSessionError('closed', 'session is closed');\n }\n if (!this.agentCapabilities.loadSession) {\n throw new ACPSessionError(\n 'unsupported_capability',\n 'agent does not support session/load (loadSession capability not advertised)',\n );\n }\n if (this.sessionId) {\n // Close current session first\n await this.closeSession();\n }\n\n this.resetScratch();\n const servers = this.filterMcpServers(mcpServers ?? this.opts.mcpServers);\n const id = this.allocId();\n const result = await this.sendRequest(id, 'session/load', {\n sessionId,\n cwd: cwd ?? this.opts.cwd ?? this.opts.projectRoot,\n mcpServers: servers,\n });\n if (isJsonRpcError(result)) {\n throw new ACPSessionError('prompt_failed', `session/load failed: ${result.message}`, result);\n }\n this.sessionId = sessionId;\n }\n\n /**\n * Resume an existing session without replaying history.\n *\n * Only works if the agent advertises `sessionCapabilities.resume`.\n *\n * @param sessionId - The session to resume\n * @param mcpServers - Optional MCP servers (defaults to options.mcpServers)\n * @param cwd - Optional working directory (defaults to options.cwd or projectRoot)\n */\n async resumeSession(\n sessionId: SessionId,\n mcpServers?: McpServer[],\n cwd?: string,\n ): Promise<void> {\n if (this.closed) {\n throw new ACPSessionError('closed', 'session is closed');\n }\n if (!this.agentCapabilities.sessionCapabilities?.resume) {\n throw new ACPSessionError(\n 'unsupported_capability',\n 'agent does not support session/resume (sessionCapabilities.resume not advertised)',\n );\n }\n if (this.sessionId) {\n await this.closeSession();\n }\n\n const servers = this.filterMcpServers(mcpServers ?? this.opts.mcpServers);\n const id = this.allocId();\n const result = await this.sendRequest(id, 'session/resume', {\n sessionId,\n cwd: cwd ?? this.opts.cwd ?? this.opts.projectRoot,\n mcpServers: servers,\n });\n if (isJsonRpcError(result)) {\n throw new ACPSessionError('prompt_failed', `session/resume failed: ${result.message}`, result);\n }\n this.sessionId = sessionId;\n }\n\n /**\n * List existing sessions known to the agent.\n *\n * Only works if the agent advertises `sessionCapabilities.list`.\n */\n async listSessions(cursor?: string, cwd?: string): Promise<{ sessions: SessionInfo[]; nextCursor?: string | undefined }> {\n if (this.closed) {\n throw new ACPSessionError('closed', 'session is closed');\n }\n if (!this.agentCapabilities.sessionCapabilities?.list) {\n throw new ACPSessionError(\n 'unsupported_capability',\n 'agent does not support session/list (sessionCapabilities.list not advertised)',\n );\n }\n\n const id = this.allocId();\n const params: Record<string, unknown> = {};\n if (cursor !== undefined) params.cursor = cursor;\n if (cwd !== undefined) params.cwd = cwd;\n const result = await this.sendRequest(id, 'session/list', params);\n if (isJsonRpcError(result)) {\n throw new ACPSessionError('prompt_failed', `session/list failed: ${result.message}`, result);\n }\n const r = result as { sessions?: SessionInfo[]; nextCursor?: string };\n return {\n sessions: r.sessions ?? [],\n nextCursor: r.nextCursor,\n };\n }\n\n /**\n * Delete a session from the agent's session list.\n *\n * Only works if the agent advertises `sessionCapabilities.delete`.\n */\n async deleteSession(sessionId: SessionId): Promise<void> {\n if (this.closed) {\n throw new ACPSessionError('closed', 'session is closed');\n }\n if (!this.agentCapabilities.sessionCapabilities?.delete) {\n throw new ACPSessionError(\n 'unsupported_capability',\n 'agent does not support session/delete (sessionCapabilities.delete not advertised)',\n );\n }\n\n const id = this.allocId();\n const result = await this.sendRequest(id, 'session/delete', { sessionId });\n if (isJsonRpcError(result)) {\n throw new ACPSessionError('prompt_failed', `session/delete failed: ${result.message}`, result);\n }\n\n if (this.sessionId === sessionId) {\n this.sessionId = null;\n }\n }\n\n /**\n * Fork a session — create a new session from an existing one.\n */\n async forkSession(\n sourceSessionId: SessionId,\n cwd?: string,\n mcpServers?: McpServer[],\n ): Promise<SessionId> {\n if (this.closed) throw new ACPSessionError('closed', 'session is closed');\n\n const servers = this.filterMcpServers(mcpServers ?? this.opts.mcpServers);\n const id = this.allocId();\n const result = await this.sendRequest(id, 'session/fork', {\n sessionId: sourceSessionId,\n cwd: cwd ?? this.opts.cwd ?? this.opts.projectRoot,\n ...(servers.length > 0 ? { mcpServers: servers } : {}),\n });\n if (isJsonRpcError(result)) {\n throw new ACPSessionError('prompt_failed', `session/fork failed: ${result.message}`, result);\n }\n const newId = (result as { sessionId?: unknown }).sessionId;\n if (typeof newId !== 'string' || !newId) {\n throw new ACPSessionError('protocol_error', 'session/fork returned no sessionId', result);\n }\n return newId as SessionId;\n }\n\n /**\n * Set the active mode for a session.\n */\n async setMode(sessionId: SessionId, modeId: string): Promise<void> {\n if (this.closed) throw new ACPSessionError('closed', 'session is closed');\n const id = this.allocId();\n const result = await this.sendRequest(id, 'session/set_mode', { sessionId, modeId });\n if (isJsonRpcError(result)) {\n throw new ACPSessionError('prompt_failed', `session/set_mode failed: ${result.message}`, result);\n }\n }\n\n /**\n * Set a configuration option for a session.\n */\n async setConfigOption(sessionId: SessionId, configId: string, value: string): Promise<void> {\n if (this.closed) throw new ACPSessionError('closed', 'session is closed');\n const id = this.allocId();\n const result = await this.sendRequest(id, 'session/set_config_option', {\n sessionId, configId, value,\n });\n if (isJsonRpcError(result)) {\n throw new ACPSessionError('prompt_failed', `session/set_config_option failed: ${result.message}`, result);\n }\n }\n\n /**\n * List available providers and the current provider.\n */\n async listProviders(): Promise<{ providers: unknown[]; currentProviderId: string | null }> {\n if (this.closed) throw new ACPSessionError('closed', 'session is closed');\n const id = this.allocId();\n const result = await this.sendRequest(id, 'providers/list', {});\n if (isJsonRpcError(result)) {\n throw new ACPSessionError('prompt_failed', `providers/list failed: ${result.message}`, result);\n }\n const r = result as { providers?: unknown[]; currentProviderId?: string | null };\n return { providers: r.providers ?? [], currentProviderId: r.currentProviderId ?? null };\n }\n\n /**\n * Send an MCP message to the agent for routing.\n */\n async mcpMessage(connectionId: string, message: Record<string, unknown>): Promise<unknown> {\n if (this.closed) throw new ACPSessionError('closed', 'session is closed');\n const id = this.allocId();\n const result = await this.sendRequest(id, 'mcp/message', { connectionId, message });\n if (isJsonRpcError(result)) {\n throw new ACPSessionError('prompt_failed', `mcp/message failed: ${result.message}`, result);\n }\n return result;\n }\n\n /**\n * Set the active provider for the agent.\n */\n async setProvider(providerId: string, config?: Record<string, unknown>): Promise<void> {\n if (this.closed) throw new ACPSessionError('closed', 'session is closed');\n const id = this.allocId();\n const result = await this.sendRequest(id, 'providers/set', { providerId, ...(config ?? {}) });\n if (isJsonRpcError(result)) {\n throw new ACPSessionError('prompt_failed', `providers/set failed: ${result.message}`, result);\n }\n }\n\n /**\n * Disable the current provider.\n */\n async disableProvider(): Promise<void> {\n if (this.closed) throw new ACPSessionError('closed', 'session is closed');\n const id = this.allocId();\n const result = await this.sendRequest(id, 'providers/disable', {});\n if (isJsonRpcError(result)) {\n throw new ACPSessionError('prompt_failed', `providers/disable failed: ${result.message}`, result);\n }\n }\n\n // ──────────────────────────────────────────────────────────────────────\n // Prompt\n // ──────────────────────────────────────────────────────────────────────\n\n /**\n * Run one prompt turn. Creates a session if needed, sends the\n * prompt, streams session/update notifications, and resolves with\n * the agent's response.\n *\n * @param blocks - Content blocks to send. Use `textContent()` for plain\n * text, or include ImageContent/AudioContent if the agent's\n * `promptCapabilities` allow it.\n * @param signal - AbortSignal for cancellation.\n *\n * Cancellation: if `signal` aborts mid-prompt, we send\n * `session/cancel` (a notification per spec) and keep accepting\n * updates until the agent returns with `stopReason: 'cancelled'`.\n * The result is the same shape as a normal turn, with\n * `stopReason === 'cancelled'`.\n */\n async prompt(\n blocks: ContentBlock[],\n signal: AbortSignal,\n onProgress?: ACPProgressHandler,\n ): Promise<ACPSessionRunResult> {\n if (this.closed) {\n throw new ACPSessionError('closed', 'session is closed');\n }\n if (this.state !== 'ready' && this.state !== 'authenticated' && this.state !== 'done') {\n throw new ACPSessionError('protocol_error', `prompt called in state=${this.state}`);\n }\n\n // Pre-aborted signals short-circuit BEFORE we create a session\n // and before any wire activity.\n if (signal.aborted) {\n return emptyRunResult('cancelled');\n }\n\n if (!this.sessionId) {\n await this.createSession();\n }\n\n this.resetScratch();\n this.progressHandler = onProgress ?? null;\n\n const promptId = this.allocId();\n const turnPromise = this.sendRequest(\n promptId,\n 'session/prompt',\n {\n sessionId: this.sessionId,\n prompt: blocks,\n },\n this.timeoutMs,\n );\n\n let cancelled = false;\n const onAbort = (): void => {\n cancelled = true;\n this.transport\n .send({\n jsonrpc: '2.0',\n method: 'session/cancel',\n params: { sessionId: this.sessionId },\n } as never as ACPMessage)\n .catch(() => {\n // transport may already be torn down — ignore\n });\n };\n signal.addEventListener('abort', onAbort, { once: true });\n\n this.state = 'prompting';\n let response: unknown;\n try {\n response = await turnPromise;\n } catch (err) {\n this.state = 'done';\n signal.removeEventListener('abort', onAbort);\n if (cancelled || signal.aborted) {\n throw new ACPSessionError('aborted', 'prompt was aborted by the parent');\n }\n const msg = err instanceof Error ? err.message : String(err);\n throw new ACPSessionError('prompt_failed', `session/prompt failed: ${msg}`, err);\n } finally {\n signal.removeEventListener('abort', onAbort);\n this.progressHandler = null;\n }\n\n this.state = 'done';\n if (isJsonRpcError(response)) {\n throw new ACPSessionError('prompt_failed', `agent error: ${response.message}`, response);\n }\n const stopReason = (response as { stopReason?: StopReason }).stopReason ?? 'end_turn';\n const finalText = this.scratch.text;\n return {\n text: finalText,\n stopReason,\n hasText: finalText.length > 0,\n usage: this.scratch.usage,\n plan: this.scratch.plan,\n toolCalls: [...this.scratch.toolCalls.values()],\n diffs: this.scratch.diffs,\n thoughts: this.scratch.thoughts,\n };\n }\n\n private async createSession(): Promise<void> {\n const servers = this.filterMcpServers(this.opts.mcpServers);\n const id = this.allocId();\n const result = await this.sendRequest(id, 'session/new', {\n cwd: this.opts.cwd ?? this.opts.projectRoot,\n mcpServers: servers,\n });\n if (isJsonRpcError(result)) {\n throw new ACPSessionError(\n 'session_create_failed',\n `session/new failed: ${result.message}`,\n result,\n );\n }\n const sessionId = (result as { sessionId?: unknown }).sessionId;\n if (typeof sessionId !== 'string' || sessionId.length === 0) {\n throw new ACPSessionError(\n 'protocol_error',\n 'session/new returned no sessionId',\n result,\n );\n }\n this.sessionId = sessionId as SessionId;\n }\n\n /**\n * Close the current session gracefully (if the agent supports it).\n *\n * Sends `session/close` JSON-RPC request, then clears the local\n * session id. Best-effort — errors are swallowed so the caller can\n * always proceed to transport teardown.\n */\n private async closeSession(): Promise<void> {\n if (!this.sessionId) return;\n const sid = this.sessionId;\n this.sessionId = null;\n\n if (this.agentCapabilities.sessionCapabilities?.close) {\n const id = this.allocId();\n try {\n await this.sendRequest(id, 'session/close', { sessionId: sid }, 10_000);\n } catch {\n // Best-effort: if close fails, we still proceed with transport stop.\n }\n }\n }\n\n // ──────────────────────────────────────────────────────────────────────\n // Lifecycle — close\n // ──────────────────────────────────────────────────────────────────────\n\n /** Tear down the session and kill the child process. */\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.state = 'closed';\n this.terminalServer.releaseAll();\n\n // Graceful session close (if session is active and agent supports it)\n if (this.sessionId && this.agentCapabilities.sessionCapabilities?.close) {\n try {\n await this.closeSession();\n } catch {\n // best-effort\n }\n }\n\n // Reject any pending outbound requests so their awaits return.\n for (const [, p] of this.pending) {\n clearTimeout(p.timeoutHandle);\n p.reject(new ACPSessionError('closed', 'session was closed'));\n }\n this.pending.clear();\n try {\n this.transport.stop();\n } catch {\n // best effort\n }\n }\n\n // ──────────────────────────────────────────────────────────────────────\n // Helpers\n // ──────────────────────────────────────────────────────────────────────\n\n /**\n * Filter MCP servers according to agent capabilities.\n * - Stdio servers are always included.\n * - HTTP servers are only included if agent supports mcpCapabilities.http.\n * - SSE servers are only included if agent supports mcpCapabilities.sse.\n */\n private filterMcpServers(servers?: McpServer[]): McpServer[] {\n if (!servers || servers.length === 0) return [];\n const mcpCaps = this.agentCapabilities.mcpCapabilities ?? {};\n return servers.filter((s) => {\n if ('type' in s && s.type === 'http') return mcpCaps.http === true;\n if ('type' in s && s.type === 'sse') return mcpCaps.sse === true;\n return true; // stdio — always supported per spec\n });\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Wire layer\n // ────────────────────────────────────────────────────────────────────\n\n private allocId(): number {\n return this.nextId++;\n }\n\n private async sendRequest(\n id: number,\n method: string,\n params: unknown,\n timeoutMs?: number,\n ): Promise<unknown> {\n return new Promise<unknown>((resolve, reject) => {\n const effectiveTimeout = timeoutMs ?? this.timeoutMs;\n const handle = setTimeout(() => {\n this.pending.delete(id);\n reject(\n new ACPSessionError(\n 'protocol_error',\n `${method} timed out after ${effectiveTimeout}ms`,\n ),\n );\n }, effectiveTimeout);\n this.pending.set(id, {\n method,\n resolve: resolve as (v: unknown) => void,\n reject,\n timeoutMs: effectiveTimeout,\n timeoutHandle: handle,\n });\n this.transport\n .send({ jsonrpc: '2.0', id, method, params } as never as ACPMessage)\n .catch((err) => {\n clearTimeout(handle);\n this.pending.delete(id);\n const msg = err instanceof Error ? err.message : String(err);\n reject(new ACPSessionError('protocol_error', `send ${method} failed: ${msg}`, err));\n });\n });\n }\n\n /**\n * Send a JSON-RPC 2.0 success response to an agent-initiated request.\n *\n * Per JSON-RPC 2.0 (and the official ACP SDK's message router) a Response\n * object MUST carry `jsonrpc: \"2.0\"` and MUST NOT carry a `method` field —\n * the SDK classifies any object with a `method` key as a Request and drops\n * it as a response, so an agent's `fs/*`, `terminal/*`, or\n * `session/request_permission` callback would hang forever. The legacy\n * `ACPMessage` type predates v1 (requires `method`, lacks `jsonrpc`), so we\n * build the correct wire object and cast at the boundary.\n */\n private sendResult(id: string | number, result: unknown): Promise<void> {\n return this.transport.send({ jsonrpc: '2.0', id, result } as never as ACPMessage);\n }\n\n /** Send a JSON-RPC 2.0 error response (no `method` field, per spec). */\n private sendErrorResponse(\n id: string | number,\n code: number,\n message: string,\n ): Promise<void> {\n return this.transport.send({\n jsonrpc: '2.0',\n id,\n error: { code, message },\n } as never as ACPMessage);\n }\n\n private handleMessage(msg: ACPMessage): void {\n // Response to an outbound request (has id and either result or error)\n if (msg.id !== undefined && (msg.result !== undefined || msg.error !== undefined)) {\n const pending = this.pending.get(msg.id);\n if (!pending) return;\n clearTimeout(pending.timeoutHandle);\n this.pending.delete(msg.id);\n if (msg.error !== undefined) {\n pending.reject(new Error(msg.error.message ?? 'unknown JSON-RPC error'));\n } else {\n pending.resolve(msg.result);\n }\n return;\n }\n\n // session/update notification (no id)\n if (msg.method === 'session/update') {\n this.handleUpdate(msg);\n return;\n }\n\n // session/request_permission (has id, expected response: outcome)\n if (msg.method === 'session/request_permission') {\n void this.handlePermissionRequest(msg);\n return;\n }\n\n // fs/* requests\n if (msg.method === 'fs/read_text_file' || msg.method === 'fs/write_text_file') {\n void this.handleFsRequest(msg);\n return;\n }\n\n // terminal/* requests\n if (msg.method?.startsWith('terminal/')) {\n void this.handleTerminalRequest(msg);\n return;\n }\n\n // mcp/* requests from the agent\n if (msg.method === 'mcp/connect' || msg.method === 'mcp/message' || msg.method === 'mcp/disconnect') {\n // MCP channel management — best-effort acknowledge.\n if (msg.id !== undefined) {\n this.sendResult(msg.id, {}).catch(() => {});\n }\n return;\n }\n\n // elicitation/* requests from the agent\n if (msg.method === 'elicitation/create' || msg.method === 'elicitation/complete') {\n // Elicitation is a UI feedback mechanism — acknowledge and ignore.\n if (msg.id !== undefined) {\n this.sendResult(msg.id, {}).catch(() => {});\n }\n return;\n }\n\n // $/cancel_request protocol notification — no response expected.\n if (msg.method === '$/cancel_request') {\n return;\n }\n\n // Anything else: log to stderr and ignore. Don't crash.\n if (msg.method) {\n // eslint-disable-next-line no-console\n console.warn(`[acp-session] unhandled method: ${msg.method}`);\n }\n }\n\n private handleUpdate(msg: ACPMessage): void {\n const update = (msg as { params?: { update?: unknown } }).params?.update;\n if (typeof update !== 'object' || update === null) return;\n const u = update as { sessionUpdate?: string; [k: string]: unknown };\n // Always surface the raw update so callers that want full fidelity\n // (forwarding to an event bus, etc.) never lose a notification.\n this.emitProgress({ type: 'raw', update: u as AnySessionUpdate });\n switch (u.sessionUpdate) {\n case 'agent_message_chunk': {\n const text = extractText(u.content);\n if (text) {\n this.scratch.text += text;\n this.emitProgress({ type: 'message', text });\n }\n return;\n }\n case 'thought_chunk': {\n const text = extractText(u.content);\n if (text) {\n this.scratch.thoughts += text;\n this.emitProgress({ type: 'thought', text });\n }\n return;\n }\n case 'tool_call':\n case 'tool_call_update': {\n this.captureToolCall(u, u.sessionUpdate === 'tool_call');\n return;\n }\n case 'plan':\n if (Array.isArray(u.entries)) {\n this.scratch.plan = u.entries as PlanEntry[];\n this.emitProgress({ type: 'plan', entries: u.entries as PlanEntry[] });\n }\n return;\n case 'usage_update':\n if (typeof u.used === 'number' && typeof u.size === 'number') {\n const usage = {\n used: u.used,\n size: u.size,\n ...(typeof u.cost === 'object' && u.cost !== null\n ? { cost: u.cost as UsageCost }\n : {}),\n };\n this.scratch.usage = usage;\n this.emitProgress({ type: 'usage', usage });\n }\n return;\n case 'available_commands_update':\n case 'current_mode_update':\n case 'config_option_update':\n case 'session_info_update':\n case 'user_message_chunk':\n case 'next_edit_suggestions':\n case 'elicitation':\n return;\n default:\n return;\n }\n }\n\n /**\n * Fold a `tool_call` / `tool_call_update` notification into the scratch\n * tool-call map (deduped by toolCallId), extract any `diff` content into\n * the diffs list, and emit live progress.\n */\n private captureToolCall(\n u: { [k: string]: unknown },\n isNew: boolean,\n ): void {\n const toolCallId = typeof u.toolCallId === 'string' ? u.toolCallId : '';\n if (!toolCallId) return;\n const prev = this.scratch.toolCalls.get(toolCallId);\n const record: ACPCapturedToolCall = {\n toolCallId,\n title:\n typeof u.title === 'string'\n ? u.title\n : (prev?.title ?? toolCallId),\n kind: (typeof u.kind === 'string' ? (u.kind as ToolKind) : prev?.kind),\n status:\n typeof u.status === 'string'\n ? (u.status as ToolCallStatus)\n : (prev?.status ?? (isNew ? 'pending' : 'in_progress')),\n rawInput:\n isRecord(u.rawInput) ? u.rawInput : prev?.rawInput,\n rawOutput:\n isRecord(u.rawOutput) ? u.rawOutput : prev?.rawOutput,\n };\n this.scratch.toolCalls.set(toolCallId, record);\n\n // Pull any diff content out of the tool call so the host can show\n // what changed. The agent sends diffs as ToolCallContent of type 'diff'.\n if (Array.isArray(u.content)) {\n for (const c of u.content as ToolCallContent[]) {\n if (c && typeof c === 'object' && c.type === 'diff') {\n const diff: ACPCapturedDiff = {\n path: c.path,\n oldText: c.oldText,\n newText: c.newText,\n };\n this.scratch.diffs.push(diff);\n this.emitProgress({ type: 'diff', diff });\n }\n }\n }\n\n this.emitProgress({\n type: isNew ? 'tool_call' : 'tool_call_update',\n toolCall: record,\n });\n }\n\n private emitProgress(event: ACPProgressEvent): void {\n if (!this.progressHandler) return;\n try {\n this.progressHandler(event);\n } catch {\n // A faulty host handler must never break the wire pump.\n }\n }\n\n /** Live progress handler installed for the duration of a `prompt()` turn. */\n private progressHandler: ACPProgressHandler | null = null;\n\n // Per-prompt scratch state\n private scratch: {\n text: string;\n thoughts: string;\n plan?: PlanEntry[];\n usage?: { used: number; size: number; cost?: UsageCost | undefined };\n toolCalls: Map<string, ACPCapturedToolCall>;\n diffs: ACPCapturedDiff[];\n } = { text: '', thoughts: '', toolCalls: new Map(), diffs: [] };\n\n private resetScratch(): void {\n this.scratch = { text: '', thoughts: '', toolCalls: new Map(), diffs: [] };\n }\n\n private async handlePermissionRequest(msg: ACPMessage): Promise<void> {\n const id = msg.id;\n if (id === undefined) return;\n const params = (msg as { params?: { toolCall?: unknown; options?: unknown } }).params;\n const toolCall = params?.toolCall as ToolCallUpdateNotification | undefined;\n const options = Array.isArray(params?.options)\n ? (params.options as never as Parameters<PermissionPolicy>[0]['options'])\n : [];\n if (!toolCall) {\n await this.sendErrorResponse(id, -32602, 'toolCall is required');\n return;\n }\n const policyAbort = new AbortController();\n const outcome = await this.permissionPolicy({\n toolCall,\n options,\n signal: policyAbort.signal,\n });\n await this.sendResult(id, { outcome });\n }\n\n private async handleFsRequest(msg: ACPMessage): Promise<void> {\n const id = msg.id;\n if (id === undefined) return;\n const params = (msg as { params?: { sessionId?: string; path?: string; content?: string } }).params;\n if (!params?.path) {\n await this.sendErrorResponse(id, -32602, 'path is required');\n return;\n }\n try {\n if (msg.method === 'fs/read_text_file') {\n const result = await this.fileServer.readTextFile({\n sessionId: params.sessionId ?? '',\n path: params.path,\n });\n await this.sendResult(id, result);\n } else {\n await this.fileServer.writeTextFile({\n sessionId: params.sessionId ?? '',\n path: params.path,\n content: params.content ?? '',\n });\n await this.sendResult(id, {});\n }\n } catch (err) {\n const code = err instanceof FsError ? -32602 : -32603;\n const message = err instanceof Error ? err.message : String(err);\n await this.sendErrorResponse(id, code, message);\n }\n }\n\n private async handleTerminalRequest(msg: ACPMessage): Promise<void> {\n const id = msg.id;\n if (id === undefined) return;\n const params = (msg as { params?: Record<string, unknown> }).params ?? {};\n try {\n switch (msg.method) {\n case 'terminal/create': {\n const createOpts: Parameters<TerminalServer['create']>[0] = {\n sessionId: String(params.sessionId ?? ''),\n command: String(params.command ?? ''),\n args: Array.isArray(params.args) ? (params.args as string[]) : [],\n };\n if (Array.isArray(params.env)) {\n createOpts.env = params.env as { name: string; value: string }[];\n }\n if (typeof params.cwd === 'string') {\n createOpts.cwd = params.cwd;\n }\n if (typeof params.outputByteLimit === 'number') {\n createOpts.outputByteLimit = params.outputByteLimit;\n }\n const result = this.terminalServer.create(createOpts);\n await this.sendResult(id, result);\n return;\n }\n case 'terminal/output': {\n const terminalId = String(params.terminalId ?? '');\n const out = this.terminalServer.output(terminalId);\n await this.sendResult(id, out);\n return;\n }\n case 'terminal/wait_for_exit': {\n const terminalId = String(params.terminalId ?? '');\n const exit = await this.terminalServer.waitForExit(terminalId);\n await this.sendResult(id, exit);\n return;\n }\n case 'terminal/kill': {\n const terminalId = String(params.terminalId ?? '');\n this.terminalServer.kill(terminalId);\n await this.sendResult(id, {});\n return;\n }\n case 'terminal/release': {\n const terminalId = String(params.terminalId ?? '');\n this.terminalServer.release(terminalId);\n await this.sendResult(id, {});\n return;\n }\n default:\n await this.sendErrorResponse(id, -32601, `unknown method: ${msg.method}`);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await this.sendErrorResponse(id, -32603, message);\n }\n }\n}\n\n/**\n * Create a text ContentBlock. Convenience helper for callers of\n * `session.prompt()`.\n */\nexport function textContent(text: string): ContentBlock {\n return { type: 'text', text };\n}\n\n/**\n * Create an image ContentBlock. Only send this if the agent's\n * `promptCapabilities.image` is `true` (check via\n * `session.getCapabilities().promptCapabilities?.image`).\n */\nexport function imageContent(mimeType: string, data: string): ContentBlock {\n return { type: 'image', mimeType, data };\n}\n\n/**\n * Create an audio ContentBlock. Only send this if the agent's\n * `promptCapabilities.audio` is `true` (check via\n * `session.getCapabilities().promptCapabilities?.audio`).\n */\nexport function audioContent(mimeType: string, data: string): ContentBlock {\n return { type: 'audio', mimeType, data };\n}\n\nfunction extractText(block: unknown): string {\n if (typeof block !== 'object' || block === null) return '';\n const b = block as {\n type?: string;\n text?: unknown;\n resource?: { text?: unknown };\n };\n if (b.type === 'text' && typeof b.text === 'string') return b.text;\n // Embedded text resources carry their content under `resource.text`.\n if (\n b.type === 'resource' &&\n b.resource &&\n typeof b.resource === 'object' &&\n typeof b.resource.text === 'string'\n ) {\n return b.resource.text;\n }\n return '';\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\n/** A fully-populated empty run result (used for pre-aborted short-circuits). */\nfunction emptyRunResult(stopReason: StopReason): ACPSessionRunResult {\n return {\n text: '',\n stopReason,\n hasText: false,\n toolCalls: [],\n diffs: [],\n thoughts: '',\n };\n}\n","/**\n * Static catalog of ACP-supporting agents known to WrongStack.\n *\n * Scope: CLI-spawnable agents only (i.e. agents that can be run as a\n * subprocess with stdio JSON-RPC, per the ACP v1 spec's local-transport\n * model). IDE-only or SaaS-only entries from\n * https://agentclientprotocol.com/get-started/agents are deliberately\n * omitted — they can't be driven by a SubagentRunner.\n *\n * Maintenance\n * ───────────\n * This is the OFFLINE FALLBACK catalog. The official, hourly-updated registry\n * now lives at https://github.com/agentclientprotocol/registry (CDN snapshot\n * in `acp-registry-fetch.ts`). `wstack acp sync` / `/acp sync` fetch it into a\n * local cache that supersedes this file at resolution time — so this catalog\n * only needs to carry the most-used agents with invocations that work without\n * a network round-trip. Entries here are kept aligned to the registry's\n * authoritative ACP-entry commands; run `/acp probe` to confirm on a host.\n *\n * Each entry tags its `integration` mechanism:\n * - `native` — the agent ships with a documented ACP entry flag.\n * - `adapter` — runs through Zed's SDK adapter or similar wrapper.\n * - `community` — community-maintained wrapper (e.g. `@agentify/cline`,\n * `bub-acp-server`, `pi-acp`).\n * - `experimental` — listed by ACP but no public ACP entry yet;\n * entry may not work.\n *\n * When the maintainer verifies an entry works, flip `integration` from\n * `experimental` to `native`/`adapter`/`community` and remove the warning.\n *\n * Detection\n * ─────────\n * The `EnsembleRegistry` (sibling module) probes each entry's `probe`\n * argv in parallel via `Promise.allSettled`. A probe that exits 0 with\n * a non-empty stdout line is considered installed. Probes that time out\n * or print nothing are treated as not-installed.\n */\nimport type { ACPAgentDescriptor } from './ensemble-registry.js';\n\n/**\n * The catalog. Order is significant for the TUI render — most-requested\n * agents go first. Edit by re-ordering, not by alphabetising.\n */\nexport const AGENTS_CATALOG: readonly ACPAgentDescriptor[] = [\n // ── Anthropic ────────────────────────────────────────────────────────\n {\n id: 'claude-code',\n displayName: 'Claude Code',\n vendor: 'anthropic',\n probe: { command: 'claude', args: ['--version'] },\n // Claude Code does not speak stdio ACP from the bare `claude` binary —\n // it drops into its interactive TUI. The official ACP adapter\n // (`@agentclientprotocol/claude-agent-acp`, registry id `claude-acp`)\n // wraps the logged-in Claude Code CLI and translates ACP ↔ Claude Code.\n // Verify with `/acp probe claude-code`; override via `config.acp.agents`.\n acp: { command: 'npx', args: ['-y', '@agentclientprotocol/claude-agent-acp'] },\n supports: {\n loadSession: true,\n promptImages: true,\n terminal: true,\n fs: true,\n },\n integration: 'adapter',\n docs: 'https://docs.anthropic.com/en/docs/claude-code',\n },\n\n // ── Google ───────────────────────────────────────────────────────────\n {\n id: 'gemini-cli',\n displayName: 'Gemini CLI',\n vendor: 'google',\n probe: { command: 'gemini', args: ['--version'] },\n // Gemini CLI (the @google/gemini-cli package, registry id `gemini`)\n // speaks ACP behind `--acp`. We invoke the locally-installed binary so it\n // uses the user's existing login. Confirm with `/acp probe gemini-cli`.\n acp: { command: 'gemini', args: ['--acp'] },\n supports: {\n loadSession: true,\n promptImages: true,\n terminal: true,\n fs: true,\n },\n integration: 'native',\n docs: 'https://github.com/google-gemini/gemini-cli',\n },\n\n // ── OpenAI ───────────────────────────────────────────────────────────\n {\n id: 'codex-cli',\n displayName: 'Codex CLI',\n vendor: 'openai',\n probe: { command: 'codex', args: ['--version'] },\n // Bare `codex` has no stdio-ACP entry; the official adapter\n // (`@agentclientprotocol/codex-acp`, registry id `codex-acp`) wraps the\n // logged-in Codex CLI. Confirm with `/acp probe codex-cli`.\n acp: { command: 'npx', args: ['-y', '@agentclientprotocol/codex-acp'] },\n supports: {\n loadSession: false,\n promptImages: false,\n terminal: true,\n fs: true,\n },\n integration: 'adapter',\n docs: 'https://github.com/openai/codex',\n },\n\n // ── GitHub ───────────────────────────────────────────────────────────\n {\n id: 'copilot',\n displayName: 'GitHub Copilot CLI',\n vendor: 'github',\n probe: { command: 'gh', args: ['copilot', '--help'] },\n // ACP is in the standalone @github/copilot CLI (registry id\n // `github-copilot-cli`), not the `gh copilot` extension. Use the package.\n acp: { command: 'npx', args: ['-y', '@github/copilot', '--acp'] },\n supports: {\n loadSession: false,\n promptImages: false,\n terminal: true,\n fs: false,\n },\n integration: 'experimental',\n docs: 'https://github.com/features/copilot/cli',\n },\n\n // ── Community / wrappers ─────────────────────────────────────────────\n {\n id: 'cline',\n displayName: 'Cline',\n vendor: 'community',\n probe: { command: 'npx', args: ['--version'] },\n // Registry id `cline`: the `cline` npm package speaks ACP behind `--acp`.\n acp: {\n command: 'npx',\n args: ['-y', 'cline', '--acp'],\n },\n supports: {\n loadSession: true,\n promptImages: true,\n terminal: true,\n fs: true,\n },\n integration: 'community',\n docs: 'https://github.com/cline/cline',\n },\n {\n id: 'goose',\n displayName: 'Goose',\n vendor: 'community',\n probe: { command: 'goose', args: ['--version'] },\n acp: { command: 'goose', args: ['acp'] },\n supports: {\n loadSession: true,\n promptImages: true,\n terminal: true,\n fs: true,\n },\n integration: 'experimental',\n docs: 'https://github.com/block/goose',\n },\n {\n id: 'openhands',\n displayName: 'OpenHands',\n vendor: 'community',\n probe: { command: 'openhands', args: ['--version'] },\n acp: { command: 'openhands', args: [] },\n supports: {\n loadSession: false,\n promptImages: true,\n terminal: true,\n fs: true,\n },\n integration: 'experimental',\n // Canonical repo URL — the org renamed; All-Hands-AI/OpenHands 301-redirects here.\n docs: 'https://github.com/OpenHands/OpenHands',\n },\n\n // ── Vendor CLIs (native binaries) ───────────────────────────────────\n {\n id: 'qwen-code',\n displayName: 'Qwen Code',\n vendor: 'community',\n probe: { command: 'qwen', args: ['--version'] },\n // Qwen Code (the @qwen-code/qwen-code package) speaks ACP behind `--acp`.\n acp: { command: 'qwen', args: ['--acp'] },\n supports: {\n loadSession: false,\n promptImages: false,\n terminal: true,\n fs: false,\n },\n integration: 'experimental',\n docs: 'https://github.com/QwenLM/Qwen3-Coder',\n },\n {\n id: 'kiro-cli',\n displayName: 'Kiro CLI',\n vendor: 'community',\n probe: { command: 'kiro', args: ['--version'] },\n acp: { command: 'kiro', args: [] },\n supports: {\n loadSession: false,\n promptImages: false,\n terminal: true,\n fs: true,\n },\n integration: 'experimental',\n docs: 'https://kiro.dev',\n },\n {\n id: 'opencode',\n displayName: 'OpenCode',\n vendor: 'community',\n probe: { command: 'opencode', args: ['--version'] },\n // OpenCode speaks ACP via its `acp` subcommand (registry id `opencode`).\n acp: { command: 'opencode', args: ['acp'] },\n supports: {\n loadSession: true,\n promptImages: true,\n terminal: true,\n fs: true,\n },\n integration: 'native',\n docs: 'https://github.com/sst/opencode',\n },\n {\n id: 'mistral-vibe',\n displayName: 'Mistral Vibe',\n vendor: 'community',\n probe: { command: 'vibe', args: ['--version'] },\n acp: { command: 'vibe', args: [] },\n supports: {\n loadSession: false,\n promptImages: false,\n terminal: true,\n fs: false,\n },\n integration: 'experimental',\n docs: 'https://github.com/mistralai/mistral-vibe',\n },\n {\n id: 'cursor',\n displayName: 'Cursor',\n vendor: 'community',\n probe: { command: 'cursor', args: ['--version'] },\n // Cursor's ACP entry is the `cursor-agent acp` binary (registry id `cursor`).\n acp: { command: 'cursor-agent', args: ['acp'] },\n supports: {\n loadSession: true,\n promptImages: true,\n terminal: true,\n fs: true,\n },\n integration: 'experimental',\n docs: 'https://cursor.com',\n },\n] as const;\n\n/** O(1) lookup by id. Returns `undefined` for unknown ids. */\nexport function findAgentDescriptor(\n id: string,\n): ACPAgentDescriptor | undefined {\n return AGENTS_CATALOG.find((a) => a.id === id);\n}\n","/**\n * ACPSubagentRunner — `SubagentRunner` implementation for DIR-1.\n *\n * Wraps an external ACP-supporting agent (Claude Code, Gemini CLI, Codex\n * CLI, Cline, Goose, OpenHands, etc.) as a WrongStack subagent. The\n * external agent runs its own agent loop; we send it a task via the ACP\n * v1 protocol and return the result.\n *\n * v1 spec: https://agentclientprotocol.com/protocol/v1/overview\n *\n * Connected to the Director / MultiAgentCoordinator via the\n * `SubagentRunner` interface (same shape as `AgentSubagentRunner`).\n */\nimport type {\n SubagentError,\n SubagentErrorKind,\n SubagentRunContext,\n SubagentRunOutcome,\n SubagentRunner,\n TaskSpec,\n} from '@wrongstack/core';\nimport { SubagentBudget } from '@wrongstack/core/coordination';\nimport {\n ACPSession,\n ACPSessionError,\n textContent,\n type ACPProgressEvent,\n type ACPProgressHandler,\n} from '../client/acp-session.js';\nimport type { ACPSessionErrorKind } from '../client/acp-session.js';\nimport type { PermissionPolicy } from '../client/permission.js';\nimport { findAgentDescriptor } from '../registry/agents.catalog.js';\nimport type { McpServer } from '../types/acp-v1.js';\n\nexport interface ACPSubagentRunnerOptions {\n /** How to spawn the external agent. */\n command: string;\n args?: string[] | undefined;\n env?: Record<string, string> | undefined;\n cwd?: string | undefined;\n /** Subagent role label — surfaced in errors and used for logging. */\n role?: string | undefined;\n /**\n * Hard wall-clock cap for one prompt turn. Defaults to 5 minutes.\n * Overrides `SubagentRunContext.budget.limits.timeoutMs` if both are set.\n */\n timeoutMs?: number | undefined;\n /**\n * Filesystem sandbox root. Defaults to `options.cwd` (when set) or\n * the process's current working directory. All `fs/read_text_file` /\n * `fs/write_text_file` calls are bounded to this root.\n */\n projectRoot?: string | undefined;\n /**\n * Live progress callback. Forwarded to `ACPSession.prompt` so the host\n * can render the external agent's tool calls / diffs / text as they\n * stream, instead of waiting for the buffered final result.\n */\n onProgress?: ACPProgressHandler | undefined;\n /**\n * Permission policy for the external agent's `session/request_permission`\n * calls. Defaults to the session's own default. Inject the host's\n * confirm/trust UI here so an external agent's file writes / commands\n * are surfaced to a human instead of silently auto-approved.\n */\n permissionPolicy?: PermissionPolicy | undefined;\n /**\n * MCP servers to expose to the external agent (passed through\n * `session/new` / `session/load`). Stdio servers are always sent;\n * HTTP/SSE are filtered by the agent's advertised capabilities.\n */\n mcpServers?: McpServer[] | undefined;\n /**\n * When true, the underlying `ACPSession` is kept open across multiple\n * runner invocations (multi-turn conversation — the external agent\n * keeps its context). The caller MUST call `stop()` to tear it down.\n * Defaults to false (one process per task).\n */\n persistent?: boolean | undefined;\n}\n\n/**\n * Static catalog of agent ids → spawn options.\n *\n * The CLI and the host's `buildACPRunner` look up entries by id. The\n * canonical, multi-source catalog is `packages/acp/src/registry/agents.catalog.ts`\n * (the 12-entry static catalog introduced in commit 4ad287b4). This\n * map stays for backward compatibility with existing call sites that\n * import it directly; new code should prefer the registry.\n */\nexport const ACP_AGENT_COMMANDS: Record<string, ACPSubagentRunnerOptions> = {\n cline: {\n command: 'npx',\n args: ['-y', '@agentify/cline'],\n role: 'cline',\n },\n 'gemini-cli': {\n command: 'gemini',\n role: 'gemini-cli',\n },\n copilot: {\n command: 'gh',\n args: ['copilot', 'agent'],\n role: 'copilot',\n },\n openhands: {\n command: 'openhands',\n role: 'openhands',\n },\n goose: {\n command: 'goose',\n role: 'goose',\n },\n};\n\n/**\n * Build a one-shot `SubagentRunner` for a single agent invocation. Each\n * call to the returned function spawns a fresh child process, runs one\n * prompt turn, and tears everything down. The cost is ~1 second of\n * process-startup per call; for long-lived sessions (multi-turn\n * conversations), use `makeACPSubagentRunnerWithStop` and call `stop()`\n * explicitly.\n */\nexport async function makeACPSubagentRunner(\n options: ACPSubagentRunnerOptions,\n): Promise<SubagentRunner> {\n const { runner, stop } = await makeACPSubagentRunnerWithStop(options);\n // Wrap so we always tear down after the turn, even if the caller\n // forgot to call `stop()`. stop() is idempotent, so a double-call is\n // safe.\n const wrappedRunner: SubagentRunner = async (task, ctx) => {\n try {\n return await runner(task, ctx);\n } finally {\n stop();\n }\n };\n return wrappedRunner;\n}\n\n/**\n * Build a long-lived `SubagentRunner` plus an explicit `stop()` for\n * teardown. The caller is responsible for calling `stop()` when done\n * (or when the host's signal fires). Useful for the `wstack acp spawn`\n * CLI command, which holds the child open for the duration of a user\n * task and tears down on SIGINT.\n */\nexport async function makeACPSubagentRunnerWithStop(\n options: ACPSubagentRunnerOptions,\n): Promise<{ runner: SubagentRunner; stop: () => void | Promise<void> }> {\n const projectRoot = options.projectRoot ?? options.cwd ?? process.cwd();\n const timeoutMs = options.timeoutMs ?? 5 * 60_000;\n const persistent = options.persistent === true;\n\n // In persistent mode we keep a single session alive across runner calls\n // so the external agent retains its conversation context (multi-turn).\n let shared: ACPSession | null = null;\n\n const startSession = async (): Promise<ACPSession> => {\n return ACPSession.start({\n command: options.command,\n ...(options.args !== undefined ? { args: options.args } : {}),\n ...(options.env !== undefined ? { env: options.env } : {}),\n ...(options.cwd !== undefined ? { cwd: options.cwd } : {}),\n projectRoot,\n timeoutMs,\n role: options.role,\n ...(options.permissionPolicy !== undefined\n ? { permissionPolicy: options.permissionPolicy }\n : {}),\n ...(options.mcpServers !== undefined ? { mcpServers: options.mcpServers } : {}),\n });\n };\n\n const runner: SubagentRunner = async (\n task: TaskSpec,\n ctx: SubagentRunContext,\n ): Promise<SubagentRunOutcome> => {\n let session: ACPSession;\n const reuse = persistent && shared !== null;\n try {\n session = reuse ? (shared as ACPSession) : await startSession();\n if (persistent) shared = session;\n } catch (err) {\n // init / spawn failure. Throw a structured error so the host can\n // classify it (SubagentErrorKind).\n throw acpErrorToSubagentError(err, options.role ?? 'acp-subagent');\n }\n\n // Count real tool calls from the captured stream, and keep the\n // budget's idle clock fresh on every update so a long-but-working\n // external agent is never reaped by the watchdog as \"stalled\".\n const onProgress: ACPProgressHandler = (event: ACPProgressEvent) => {\n try {\n ctx.budget.markActivity();\n } catch {\n // markActivity never throws today; guard defensively anyway.\n }\n options.onProgress?.(event);\n };\n\n try {\n const result = await session.prompt(\n [textContent(task.description)],\n ctx.signal,\n onProgress,\n );\n // Surface the real tool-call count captured from the stream. A\n // text-less turn is a soft signal (an ACP agent may legitimately\n // end with no message), not an error.\n return {\n result: result.text,\n iterations: 1,\n toolCalls: result.toolCalls.length,\n };\n } catch (err) {\n throw acpErrorToSubagentError(err, options.role ?? 'acp-subagent');\n } finally {\n // One-shot mode closes after each turn. Persistent mode keeps the\n // session open; the caller tears it down via stop().\n if (!persistent) {\n try {\n await session.close();\n } catch {\n // best-effort cleanup\n }\n }\n }\n };\n\n // In persistent mode stop() closes the long-lived session; in one-shot\n // mode it's a no-op (each session is closed in the runner's finally).\n const stop = async (): Promise<void> => {\n if (shared) {\n const s = shared;\n shared = null;\n try {\n await s.close();\n } catch {\n // best-effort\n }\n }\n };\n\n return { runner, stop };\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Error mapping\n// ─────────────────────────────────────────────────────────────────────────\n\n/**\n * Map an ACPSessionError (or arbitrary Error from the session layer)\n * to a structured `SubagentError` that the existing coordinator can\n * classify and act on. Unknown error shapes get `kind: 'unknown'` —\n * they shouldn't crash the parent.\n */\nfunction acpErrorToSubagentError(\n err: unknown,\n subagentId: string,\n): SubagentError {\n if (err instanceof ACPSessionError) {\n const kind = mapACPKind(err.kind);\n return {\n kind,\n message: `${subagentId}: ${err.message}`,\n retryable: isRetryable(kind),\n cause: {\n name: err.name,\n message: err.message,\n ...(err.stack !== undefined ? { stack: err.stack } : {}),\n },\n };\n }\n const message = err instanceof Error ? err.message : String(err);\n return {\n kind: 'bridge_failed',\n message: `${subagentId}: ${message}`,\n retryable: false,\n cause: {\n name: err instanceof Error ? err.name : 'Error',\n message,\n ...(err instanceof Error && err.stack !== undefined ? { stack: err.stack } : {}),\n },\n };\n}\n\nfunction mapACPKind(acpKind: ACPSessionErrorKind): SubagentErrorKind {\n switch (acpKind) {\n case 'spawn_failed':\n case 'init_failed':\n case 'session_create_failed':\n case 'agent_died':\n case 'protocol_error':\n return 'bridge_failed';\n case 'prompt_failed':\n return 'tool_failed';\n case 'auth_failed':\n case 'logout_failed':\n return 'bridge_failed';\n case 'aborted':\n return 'aborted_by_parent';\n case 'closed':\n case 'unsupported_capability':\n return 'unknown';\n }\n}\n\nfunction isRetryable(kind: SubagentErrorKind): boolean {\n // Conservative: spawn / init / protocol / agent-died are NOT\n // retryable as-is (they need config or a re-install). Timeouts and\n // prompt failures might be — the parent's classifier will branch on\n // `kind` and decide.\n switch (kind) {\n case 'provider_5xx':\n case 'provider_rate_limit':\n case 'provider_timeout':\n case 'tool_threw':\n case 'budget_timeout':\n return true;\n default:\n return false;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Unused but exported for future use\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Re-export so the CLI handler can import the session type. */\nexport type { ACPSession };\n\n/** Exposed for the `wstack acp list` renderer. */\nexport function describeAgent(id: string): {\n command: string;\n args: readonly string[];\n role: string;\n} | null {\n const entry = ACP_AGENT_COMMANDS[id];\n if (!entry) return null;\n return {\n command: entry.command,\n args: entry.args ?? [],\n role: entry.role ?? id,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Shared command resolution + single-task run + handshake probe\n//\n// These are the building blocks both the `wstack acp` CLI handler and the\n// `/acp` slash command consume, so the two surfaces stay in lock-step.\n// ─────────────────────────────────────────────────────────────────────────\n\n/**\n * Per-agent ACP invocation overrides, sourced from the user's\n * `~/.wrongstack/config.json` (`config.acp.agents`). Lets a user point an\n * agent id at the correct ACP entry — e.g. the Zed Claude-Code adapter —\n * without a code change. NEVER honoured from in-project config (it is an\n * arbitrary-command exec surface); see `config-loader.ts`.\n */\nexport type AcpAgentCommandOverrides = Record<\n string,\n { command: string; args?: string[]; env?: Record<string, string> }\n>;\n\n/** A synced-registry catalog keyed by registry id (from `fetchAcpRegistry`). */\nexport type AcpLiveCatalog = Record<\n string,\n { command: string; args?: readonly string[]; env?: Record<string, string> }\n>;\n\n/**\n * Map our stable, human-friendly catalog ids to the official registry's ids,\n * so a live-synced registry (keyed by registry id) still resolves when the\n * user types our id. Our id is preferred in the UI; the alias is the bridge.\n */\nexport const REGISTRY_ID_ALIASES: Readonly<Record<string, string>> = {\n 'claude-code': 'claude-acp',\n 'gemini-cli': 'gemini',\n 'codex-cli': 'codex-acp',\n copilot: 'github-copilot-cli',\n};\n\n/**\n * Resolve an agent id to its spawn command. Precedence:\n * 1. user override (`config.acp.agents[id]`)\n * 2. the bundled static `AGENTS_CATALOG` (curated LOCAL-binary invocations)\n * 3. live synced registry (`fetchAcpRegistry` → cache), by id or alias\n * 4. legacy `ACP_AGENT_COMMANDS` map (last resort, kept for back-compat)\n * Returns `null` for an id present in none of them.\n *\n * Why catalog BEFORE the live registry: our goal is to drive the user's\n * already-installed, logged-in CLI. The catalog hand-curates the LOCAL-binary\n * ACP entry for each popular agent (`gemini --acp`, `opencode acp`, …), which\n * preserves the agent's own login and starts instantly. The official registry,\n * by contrast, encodes \"run a fresh copy\" invocations — pinned `npx <pkg>@ver`\n * downloads (no local login, slow first run) and platform binaries like\n * `opencode.exe` that may not match a shim on PATH. So the registry is the\n * source for the long tail of agents the catalog doesn't cover, NOT an\n * override of the curated 12. Users force a specific command via the override.\n */\nexport function resolveAcpAgentCommand(\n id: string,\n overrides?: AcpAgentCommandOverrides,\n live?: AcpLiveCatalog,\n): ACPSubagentRunnerOptions | null {\n const ov = overrides?.[id];\n if (ov && typeof ov.command === 'string' && ov.command.length > 0) {\n const out: ACPSubagentRunnerOptions = {\n command: ov.command,\n args: [...(ov.args ?? [])],\n role: id,\n };\n if (ov.env) out.env = ov.env;\n return out;\n }\n const desc = findAgentDescriptor(id);\n if (desc) {\n const out: ACPSubagentRunnerOptions = {\n command: desc.acp.command,\n args: [...(desc.acp.args ?? [])],\n role: id,\n };\n if (desc.acp.env) out.env = desc.acp.env;\n return out;\n }\n const liveEntry = live?.[id] ?? live?.[REGISTRY_ID_ALIASES[id] ?? ''];\n if (liveEntry && typeof liveEntry.command === 'string' && liveEntry.command.length > 0) {\n const out: ACPSubagentRunnerOptions = {\n command: liveEntry.command,\n args: [...(liveEntry.args ?? [])],\n role: id,\n };\n if (liveEntry.env) out.env = liveEntry.env;\n return out;\n }\n const fromMap = ACP_AGENT_COMMANDS[id];\n if (fromMap) return fromMap;\n return null;\n}\n\nexport interface RunOneAcpTaskOptions {\n command: string;\n args?: string[] | undefined;\n env?: Record<string, string> | undefined;\n /** Agent id / role label, surfaced in errors + the synthetic task id. */\n role?: string | undefined;\n /** The task description forwarded verbatim to the agent. */\n task: string;\n cwd?: string | undefined;\n projectRoot?: string | undefined;\n timeoutMs?: number | undefined;\n signal?: AbortSignal | undefined;\n onProgress?: ACPProgressHandler | undefined;\n permissionPolicy?: PermissionPolicy | undefined;\n}\n\nexport interface RunOneAcpTaskResult {\n result: string;\n iterations: number;\n toolCalls: number;\n}\n\n/**\n * Run a single task on one ACP agent and return its result. Spawns a fresh\n * process, runs one prompt turn, and tears everything down. Throws a\n * structured `SubagentError` on failure (spawn/init/prompt). This is the\n * shared engine behind `wstack acp spawn` and `/acp <id> <task>`.\n */\nexport async function runOneAcpTask(\n opts: RunOneAcpTaskOptions,\n): Promise<RunOneAcpTaskResult> {\n const role = opts.role ?? 'acp';\n const timeoutMs = opts.timeoutMs ?? 5 * 60_000;\n const { runner, stop } = await makeACPSubagentRunnerWithStop({\n command: opts.command,\n ...(opts.args !== undefined ? { args: opts.args } : {}),\n ...(opts.env !== undefined ? { env: opts.env } : {}),\n ...(opts.cwd !== undefined ? { cwd: opts.cwd } : {}),\n ...(opts.projectRoot !== undefined ? { projectRoot: opts.projectRoot } : {}),\n role,\n timeoutMs,\n ...(opts.onProgress !== undefined ? { onProgress: opts.onProgress } : {}),\n ...(opts.permissionPolicy !== undefined ? { permissionPolicy: opts.permissionPolicy } : {}),\n });\n try {\n const budget = new SubagentBudget({\n timeoutMs,\n maxIterations: 2000,\n maxToolCalls: 5000,\n });\n budget.start();\n const ctx: SubagentRunContext = {\n subagentId: role,\n config: { id: role, name: role, role, provider: 'acp', prompt: '' },\n budget,\n signal: opts.signal ?? new AbortController().signal,\n bridge: null,\n };\n const result = await runner({ id: `acp-${role}`, description: opts.task }, ctx);\n return {\n result: result.result == null ? '' : String(result.result),\n iterations: result.iterations,\n toolCalls: result.toolCalls,\n };\n } finally {\n try {\n await stop();\n } catch {\n // best-effort teardown\n }\n }\n}\n\nexport interface AcpProbeResult {\n id: string;\n ok: boolean;\n ms: number;\n agentInfo?: { name: string; title?: string | undefined; version: string } | undefined;\n error?: string | undefined;\n}\n\n/**\n * Empirically test whether an agent actually speaks ACP on this machine:\n * spawn it, run the `initialize` handshake, and close. `ok: true` means the\n * agent answered `initialize` within `timeoutMs` (default 8s) — the truth,\n * regardless of what the static catalog guesses. A bare CLI that drops into\n * an interactive prompt fails here (init times out) instead of hanging a\n * real turn.\n */\nexport async function probeAcpAgent(\n idOrCmd: string | ACPSubagentRunnerOptions,\n opts?: {\n timeoutMs?: number | undefined;\n projectRoot?: string | undefined;\n overrides?: AcpAgentCommandOverrides | undefined;\n live?: AcpLiveCatalog | undefined;\n },\n): Promise<AcpProbeResult> {\n const id =\n typeof idOrCmd === 'string' ? idOrCmd : (idOrCmd.role ?? idOrCmd.command);\n const cmd =\n typeof idOrCmd === 'string'\n ? resolveAcpAgentCommand(idOrCmd, opts?.overrides, opts?.live)\n : idOrCmd;\n if (!cmd) return { id, ok: false, ms: 0, error: 'unknown agent' };\n\n const timeoutMs = opts?.timeoutMs ?? 8_000;\n const startedAt = Date.now();\n let session: ACPSession | null = null;\n try {\n session = await ACPSession.start({\n command: cmd.command,\n ...(cmd.args !== undefined ? { args: cmd.args } : {}),\n ...(cmd.env !== undefined ? { env: cmd.env } : {}),\n projectRoot: opts?.projectRoot ?? process.cwd(),\n // Bounds the `initialize` request: a CLI that spawns but never answers\n // the handshake fails after this instead of blocking.\n timeoutMs,\n });\n const info = session.getAgentInfo();\n return {\n id,\n ok: true,\n ms: Date.now() - startedAt,\n ...(info ? { agentInfo: info } : {}),\n };\n } catch (err) {\n return {\n id,\n ok: false,\n ms: Date.now() - startedAt,\n error: err instanceof Error ? err.message : String(err),\n };\n } finally {\n if (session) {\n try {\n await session.close();\n } catch {\n // best-effort\n }\n }\n }\n}\n\nexport interface ProbeAcpAgentsOptions {\n agentIds: string[];\n resolveCmd: (id: string) => ACPSubagentRunnerOptions | null;\n projectRoot?: string | undefined;\n /** Max agents probed at once. Default 4. Keeps concurrent first-run `npx`\n * downloads from starving local agents' stdout past their timeout. */\n concurrency?: number | undefined;\n /** Per-agent handshake timeout for LOCAL binary commands. Default 20s. */\n timeoutMs?: number | undefined;\n /** Per-agent timeout for `npx`/`uvx` commands (first run downloads the\n * package, which is slow). Default 90s. */\n packageTimeoutMs?: number | undefined;\n signal?: AbortSignal | undefined;\n onProgress?: ((id: string, result: AcpProbeResult) => void) | undefined;\n}\n\n/**\n * Probe many agents with BOUNDED concurrency. Unbounded `Promise.all` over the\n * full set spawns every agent at once — and a few concurrent `npx` downloads\n * peg the machine hard enough that even already-installed local agents miss\n * their handshake window. Bounding the fan-out (and giving npx/uvx a longer\n * timeout) is what makes a mixed install probe reliably.\n */\nexport async function probeAcpAgents(\n opts: ProbeAcpAgentsOptions,\n): Promise<AcpProbeResult[]> {\n const localTimeout = opts.timeoutMs ?? 20_000;\n const pkgTimeout = opts.packageTimeoutMs ?? 90_000;\n const ids = opts.agentIds;\n const byId = new Map<string, AcpProbeResult>();\n\n // Partition: local binaries vs npx/uvx package launchers. A first-run `npx`\n // download is heavy enough to starve a LOCAL agent sharing the same batch\n // (its stdout 'data' misses the handshake window → false timeout). So probe\n // all locals first (clean resources, fast), THEN the package ones — which\n // are inherently slow on first run — at low concurrency.\n const local: string[] = [];\n const pkg: string[] = [];\n const cmds = new Map<string, ACPSubagentRunnerOptions | null>();\n for (const id of ids) {\n const cmd = opts.resolveCmd(id);\n cmds.set(id, cmd);\n if (!cmd) continue;\n if (cmd.command === 'npx' || cmd.command === 'uvx') pkg.push(id);\n else local.push(id);\n }\n\n const runPhase = async (phaseIds: string[], concurrency: number, timeoutMs: number): Promise<void> => {\n let next = 0;\n const workerCount = Math.min(Math.max(1, concurrency), Math.max(1, phaseIds.length));\n const workers: Promise<void>[] = [];\n for (let w = 0; w < workerCount; w++) {\n workers.push(\n (async () => {\n while (true) {\n const current = next++;\n if (current >= phaseIds.length) return;\n const id = phaseIds[current]!;\n if (opts.signal?.aborted) {\n byId.set(id, { id, ok: false, ms: 0, error: 'aborted' });\n continue;\n }\n const cmd = cmds.get(id)!;\n const r = await probeAcpAgent(cmd!, {\n timeoutMs,\n ...(opts.projectRoot !== undefined ? { projectRoot: opts.projectRoot } : {}),\n });\n r.id = id; // probeAcpAgent derives id from cmd.role; pin to our id.\n byId.set(id, r);\n opts.onProgress?.(id, r);\n }\n })(),\n );\n }\n await Promise.all(workers);\n };\n\n // Unknown ids resolve to null — record immediately.\n for (const id of ids) {\n if (cmds.get(id) === null) {\n const r: AcpProbeResult = { id, ok: false, ms: 0, error: 'unknown agent' };\n byId.set(id, r);\n opts.onProgress?.(id, r);\n }\n }\n\n await runPhase(local, opts.concurrency ?? 4, localTimeout);\n // Package launchers run AFTER locals (so npm downloads never starve a local\n // agent's handshake), at low concurrency with a long timeout — first-run\n // `npx`/`uvx` fetches are inherently slow.\n await runPhase(pkg, 2, pkgTimeout);\n\n // Preserve the caller's input order.\n return ids.map((id) => byId.get(id) ?? { id, ok: false, ms: 0, error: 'not probed' });\n}\n","/**\n * EnsembleRegistry — discovery layer for ACP-supporting agents.\n *\n * Combines the static catalog (`agents.catalog.ts`) with a runtime\n * `$PATH` probe to report which agents are installed on this machine.\n * The result feeds `wstack acp list`, the `/spawn` picker, and the\n * ensemble UI.\n *\n * Why probe on demand rather than cache at module load\n * ─────────────────────────────────────────────────────\n * The maintainer installs a new agent mid-session. Caching at module\n * load means the cache is stale for the rest of the run. A 5-second\n * per-process cache (`cachedAt`) keeps the common case cheap and the\n * fresh case correct.\n */\nimport { spawn } from 'node:child_process';\nimport type { ChildProcess } from 'node:child_process';\nimport { AGENTS_CATALOG } from './agents.catalog.js';\n\n/** Vendor classification — used to filter the catalog by family. */\nexport type ACPAgentVendor =\n | 'anthropic'\n | 'google'\n | 'openai'\n | 'github'\n | 'community';\n\n/** How the agent is integrated into ACP. */\nexport type ACPIntegration =\n /** Agent ships with a documented ACP entry flag. */\n | 'native'\n /** Runs through Zed's SDK adapter or similar wrapper. */\n | 'adapter'\n /** Community-maintained wrapper (e.g. @agentify/cline, bub-acp-server). */\n | 'community'\n /** Listed by ACP but no public ACP entry yet; may not work. */\n | 'experimental';\n\n/** Static metadata for a known agent. */\nexport interface ACPAgentDescriptor {\n /** Stable identifier used as the spawn key. Lowercase, hyphenated. */\n id: string;\n /** Display name shown in the TUI / WebUI / CLI. */\n displayName: string;\n vendor: ACPAgentVendor;\n /** argv to detect installation. Exits 0 with stdout on success. */\n probe: { command: string; args?: readonly string[] };\n /** argv to start the agent in ACP mode. */\n acp: { command: string; args?: readonly string[]; env?: Record<string, string> };\n /** Capability hints — used to fail fast when the binary predates ACP. */\n supports: {\n loadSession: boolean;\n promptImages: boolean;\n terminal: boolean;\n fs: boolean;\n };\n integration: ACPIntegration;\n /** Documentation URL — shown in `wstack acp list` and the ensemble UI. */\n docs: string;\n}\n\n/** A descriptor with its runtime detection result attached. */\nexport interface DetectedAgent extends ACPAgentDescriptor {\n installed: boolean;\n /** Absolute path to the binary, if discovered. */\n path?: string;\n /** Captured version string, if `probe` produced one. */\n version?: string;\n /**\n * When `installed: false`, a short reason — typically \"binary not\n * found\", \"binary predates ACP\", or \"probe timed out\".\n */\n reason?: string;\n}\n\n/** A single probe failure — never thrown, always returned. */\ninterface ProbeFailure {\n ok: false;\n reason: string;\n /** Wall-clock duration of the failed probe in ms. */\n durationMs: number;\n}\n\ninterface ProbeSuccess {\n ok: true;\n version: string;\n path?: string;\n durationMs: number;\n}\n\ntype ProbeResult = ProbeSuccess | ProbeFailure;\n\nconst PROBE_TIMEOUT_MS = 5_000;\nconst PROBE_CACHE_MS = 5_000;\n/**\n * Cap on simultaneous catalog probes. Each probe is an external\n * subprocess; an uncapped `Promise.all(catalog.map(probe))` scales\n * with catalog size and is the main cold-start cost when listing\n * available agents. 4 is enough to overlap I/O on a quiet box while\n * staying well under typical fd / process-table limits.\n */\nconst MAX_PARALLEL_PROBES = 4;\n\nexport interface EnsembleRegistryOptions {\n /** Override the catalog (mostly for tests). */\n catalog?: readonly ACPAgentDescriptor[];\n /** Override the probe timeout (ms). */\n probeTimeoutMs?: number;\n /** Inject a custom probe function (used by tests). */\n probeFn?: (descriptor: ACPAgentDescriptor) => Promise<ProbeResult>;\n}\n\n/**\n * Run `worker` against each item with at most `limit` in flight at a\n * time. Preserves input order in the output array — every output slot\n * corresponds to the input at the same index. Errors propagate through\n * `Promise.all` semantics (the first rejection rejects the whole call),\n * matching the original `Promise.all(map(worker))` contract that\n * `list()` previously had.\n */\nasync function probeWithBound<T, R>(\n items: readonly T[],\n worker: (item: T) => Promise<R>,\n limit: number,\n): Promise<R[]> {\n const safeLimit = Math.max(1, Math.min(limit, items.length));\n const results: R[] = new Array(items.length);\n let nextIndex = 0;\n const workerCount = Math.min(safeLimit, items.length);\n const runners: Promise<void>[] = [];\n for (let i = 0; i < workerCount; i++) {\n runners.push(\n (async () => {\n while (true) {\n const current = nextIndex++;\n if (current >= items.length) return;\n results[current] = await worker(items[current]!);\n }\n })(),\n );\n }\n await Promise.all(runners);\n return results;\n}\n\n/**\n * Probe a single descriptor by running its `probe` argv. Resolves with\n * a structured result rather than throwing — a failed probe is data, not\n * an error.\n */\nasync function defaultProbe(\n desc: ACPAgentDescriptor,\n timeoutMs: number,\n): Promise<ProbeResult> {\n const start = Date.now();\n return new Promise((resolve) => {\n let settled = false;\n let stdout = '';\n let stderr = '';\n\n const finish = (result: ProbeResult): void => {\n if (settled) return;\n settled = true;\n try {\n child.kill();\n } catch {\n // already dead\n }\n resolve(result);\n };\n\n let child: ChildProcess;\n try {\n child = spawn(desc.probe.command, [...(desc.probe.args ?? [])], {\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n // On Windows, `claude`, `gemini`, `npx`, etc. are typically\n // installed as `.cmd` shims under AppData\\Roaming\\npm\\. Node's\n // spawn() will not find them without shell-mode unless the\n // extension is present. `shell: true` resolves this for the\n // common case. The probe argv is always from our static\n // catalog, never user input, so shell-expansion is bounded.\n shell: process.platform === 'win32',\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n finish({ ok: false, reason: `spawn failed: ${msg}`, durationMs: 0 });\n return;\n }\n\n const timer = setTimeout(() => {\n finish({ ok: false, reason: 'probe timed out', durationMs: Date.now() - start });\n }, timeoutMs);\n\n child.stdout?.setEncoding('utf8');\n child.stdout?.on('data', (chunk: string) => {\n stdout += chunk;\n });\n child.stderr?.setEncoding('utf8');\n child.stderr?.on('data', (chunk: string) => {\n stderr += chunk;\n });\n\n child.on('error', (err) => {\n clearTimeout(timer);\n finish({\n ok: false,\n reason: `binary not found: ${err.message}`,\n durationMs: Date.now() - start,\n });\n });\n\n child.on('close', (code) => {\n clearTimeout(timer);\n const durationMs = Date.now() - start;\n const out = (stdout + stderr).trim();\n\n // With `shell: true` on Windows, spawn() never ENOENTs — the\n // cmd shell launches, prints \"<command> is not recognized\", and\n // exits non-zero. Detect that specific shape and treat the binary\n // as not-installed. The literal string is locale-stable for\n // Windows cmd.exe English (the only locale we ship in CI).\n const isWindowsShellMiss =\n process.platform === 'win32' &&\n out.toLowerCase().includes('is not recognized');\n\n if (isWindowsShellMiss) {\n finish({\n ok: false,\n reason: 'binary not found',\n durationMs,\n });\n return;\n }\n\n if (out.length > 0) {\n // The binary ran and produced output. We don't gate on exit\n // code: some agents print version info but exit non-zero; some\n // print to stderr. If we got here without a shell-miss, the\n // binary is installed.\n finish({\n ok: true,\n version: out.split('\\n')[0]?.trim() ?? '',\n path: desc.probe.command,\n durationMs,\n });\n return;\n }\n // Empty output: the binary didn't behave as a version probe.\n // Treat as not-installed with the exit code as the reason.\n finish({\n ok: false,\n reason: `exit code ${code ?? 'null'}; no output`,\n durationMs,\n });\n });\n });\n}\n\nexport class EnsembleRegistry {\n private readonly catalog: readonly ACPAgentDescriptor[];\n private readonly timeoutMs: number;\n private readonly probe: (d: ACPAgentDescriptor) => Promise<ProbeResult>;\n private cache: { at: number; result: readonly DetectedAgent[] } | null = null;\n\n constructor(options: EnsembleRegistryOptions = {}) {\n this.catalog = options.catalog ?? AGENTS_CATALOG;\n this.timeoutMs = options.probeTimeoutMs ?? PROBE_TIMEOUT_MS;\n this.probe = options.probeFn ?? ((d) => defaultProbe(d, this.timeoutMs));\n }\n\n /** Return the full catalog (no probe), in catalog order. */\n listAll(): readonly ACPAgentDescriptor[] {\n return this.catalog;\n }\n\n /**\n * Probe every catalog entry in parallel and return the detection\n * results. Results are cached for `PROBE_CACHE_MS`.\n *\n * Probes are dispatched with bounded concurrency (`MAX_PARALLEL_PROBES`)\n * so cold-start lists do not spawn `catalog.length` subprocesses at\n * once — which is especially wasteful on Windows shells and on hosts\n * with large agent catalogs. The output order still matches\n * `this.catalog` so callers can index by position.\n */\n async list(): Promise<readonly DetectedAgent[]> {\n if (this.cache && Date.now() - this.cache.at < PROBE_CACHE_MS) {\n return this.cache.result;\n }\n const result = await probeWithBound(\n this.catalog,\n (d) => this.detect(d),\n MAX_PARALLEL_PROBES,\n );\n this.cache = { at: Date.now(), result };\n return result;\n }\n\n /** Probe a single descriptor. Always returns a `DetectedAgent`. */\n async detect(desc: ACPAgentDescriptor): Promise<DetectedAgent> {\n const result = await this.probe(desc);\n if (result.ok) {\n const detected: DetectedAgent = {\n ...desc,\n installed: true,\n version: result.version,\n };\n if (result.path !== undefined) detected.path = result.path;\n return detected;\n }\n return { ...desc, installed: false, reason: result.reason };\n }\n\n /** Invalidate the per-process cache. */\n invalidate(): void {\n this.cache = null;\n }\n\n /** Convenience: just the installed agents. */\n async listInstalled(): Promise<readonly DetectedAgent[]> {\n const all = await this.list();\n return all.filter((a) => a.installed);\n }\n}\n","/**\n * Official ACP registry fetcher.\n *\n * The Agent Client Protocol maintains a canonical, hourly-updated registry of\n * ACP-supporting agents at https://github.com/agentclientprotocol/registry,\n * published as a single JSON document on a CDN. This module fetches that\n * document and maps each entry to our `ACPAgentDescriptor` shape so the live\n * list can supersede the bundled static `AGENTS_CATALOG` (which remains the\n * offline fallback).\n *\n * Distribution → spawn-command mapping (per the registry FORMAT.md):\n * - npx: { package, args } → `npx -y <package> <args>`\n * - uvx: { package, args } → `uvx <package> <args>`\n * - binary: { \"<os>-<arch>\": { cmd, args, env } }\n * → `<basename(cmd)> <args>` for THIS host\n *\n * Binary entries reference a downloadable archive we do NOT fetch; we map the\n * platform `cmd` to its basename so an already-installed on-PATH binary (the\n * common case for goose/opencode/cursor) still launches. Agents distributed\n * ONLY as a binary with no current-platform target are dropped (not runnable).\n *\n * Network is never required at runtime: this is invoked by an explicit\n * `wstack acp sync` / `/acp sync`, the result is cached, and resolution falls\n * back to the static catalog when no cache exists.\n */\nimport type {\n ACPAgentDescriptor,\n ACPAgentVendor,\n} from './ensemble-registry.js';\n\n/** Canonical CDN endpoint for the latest registry snapshot. */\nexport const ACP_REGISTRY_URL =\n 'https://cdn.agentclientprotocol.com/registry/v1/latest/registry.json';\n\n/** One raw entry from the registry JSON (only the fields we consume). */\nexport interface RegistryAgentEntry {\n id: string;\n name?: string;\n version?: string;\n description?: string;\n repository?: string;\n website?: string;\n authors?: string[];\n distribution?: {\n npx?: { package: string; args?: string[] };\n uvx?: { package: string; args?: string[] };\n binary?: Record<\n string,\n { archive?: string; cmd: string; args?: string[]; env?: Record<string, string> }\n >;\n };\n}\n\nexport interface FetchAcpRegistryResult {\n /** ISO timestamp the snapshot was fetched. */\n fetchedAt: string;\n /** Mapped, runnable descriptors (entries we could not map are dropped). */\n agents: ACPAgentDescriptor[];\n}\n\nexport interface FetchAcpRegistryOptions {\n /** Override the endpoint (tests / mirrors). */\n url?: string | undefined;\n /** Abort the fetch from the caller. */\n signal?: AbortSignal | undefined;\n /** Hard timeout in ms (default 15s). Layered under any caller signal. */\n timeoutMs?: number | undefined;\n /** ISO timestamp to stamp the result with (tests pass a fixed value). */\n now?: string | undefined;\n /** Platform key for binary selection (tests). Defaults to this host. */\n platformKey?: string | undefined;\n}\n\n/** Map Node's platform/arch to the registry's `<os>-<arch>` key form. */\nexport function currentPlatformKey(): string {\n const os =\n process.platform === 'win32'\n ? 'windows'\n : process.platform === 'darwin'\n ? 'darwin'\n : 'linux';\n const arch = process.arch === 'arm64' ? 'aarch64' : process.arch === 'x64' ? 'x86_64' : process.arch;\n return `${os}-${arch}`;\n}\n\n/** `./foo/bar` → `bar`; leaves bare names untouched. */\nfunction basename(cmd: string): string {\n const cleaned = cmd.replace(/^\\.\\//, '').replace(/\\\\/g, '/');\n const parts = cleaned.split('/');\n return parts[parts.length - 1] || cleaned;\n}\n\n/**\n * Map one registry entry to an `ACPAgentDescriptor`, or `null` if it carries\n * no distribution runnable on this host. Pure — no I/O.\n */\nexport function mapRegistryEntry(\n entry: RegistryAgentEntry,\n platformKey: string = currentPlatformKey(),\n): ACPAgentDescriptor | null {\n if (!entry || typeof entry.id !== 'string' || entry.id.length === 0) return null;\n const dist = entry.distribution;\n let acp: { command: string; args?: string[]; env?: Record<string, string> } | null = null;\n\n if (dist?.npx?.package) {\n acp = { command: 'npx', args: ['-y', dist.npx.package, ...(dist.npx.args ?? [])] };\n } else if (dist?.uvx?.package) {\n acp = { command: 'uvx', args: [dist.uvx.package, ...(dist.uvx.args ?? [])] };\n } else if (dist?.binary) {\n const target = dist.binary[platformKey];\n if (target?.cmd) {\n acp = {\n command: basename(target.cmd),\n args: [...(target.args ?? [])],\n ...(target.env ? { env: target.env } : {}),\n };\n }\n }\n if (!acp) return null;\n\n // The probe argv detects \"is something by this name on PATH\". For npx/uvx\n // the launcher itself is the probe; for a binary the agent's own name is.\n const probeCmd = acp.command === 'npx' ? 'npx' : acp.command === 'uvx' ? 'uvx' : acp.command;\n\n return {\n id: entry.id,\n displayName: entry.name ?? entry.id,\n vendor: inferVendor(entry),\n probe: { command: probeCmd, args: ['--version'] },\n acp,\n supports: { loadSession: true, promptImages: true, terminal: true, fs: true },\n integration: 'native',\n docs: entry.repository ?? entry.website ?? '',\n };\n}\n\nfunction inferVendor(entry: RegistryAgentEntry): ACPAgentVendor {\n const hay = `${entry.id} ${entry.name ?? ''} ${(entry.authors ?? []).join(' ')}`.toLowerCase();\n if (hay.includes('anthropic') || hay.includes('claude')) return 'anthropic';\n if (hay.includes('google') || hay.includes('gemini')) return 'google';\n if (hay.includes('openai') || hay.includes('codex')) return 'openai';\n if (hay.includes('github') || hay.includes('copilot')) return 'github';\n return 'community';\n}\n\n/**\n * Fetch the live registry and return mapped descriptors. Throws on network /\n * parse failure so the caller (`wstack acp sync`) can surface it; callers that\n * want graceful degradation use the cached/static fallback instead.\n */\nexport async function fetchAcpRegistry(\n opts: FetchAcpRegistryOptions = {},\n): Promise<FetchAcpRegistryResult> {\n const url = opts.url ?? ACP_REGISTRY_URL;\n const timeoutMs = opts.timeoutMs ?? 15_000;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n const onParentAbort = () => controller.abort();\n if (opts.signal) {\n if (opts.signal.aborted) controller.abort();\n else opts.signal.addEventListener('abort', onParentAbort, { once: true });\n }\n try {\n const res = await fetch(url, { signal: controller.signal });\n if (!res.ok) {\n throw new Error(`ACP registry fetch failed: HTTP ${res.status}`);\n }\n const body = (await res.json()) as { agents?: unknown };\n const rawAgents = Array.isArray(body) ? body : Array.isArray(body?.agents) ? body.agents : null;\n if (!rawAgents) {\n throw new Error('ACP registry response had no agents array');\n }\n const platformKey = opts.platformKey ?? currentPlatformKey();\n const agents: ACPAgentDescriptor[] = [];\n for (const raw of rawAgents) {\n const mapped = mapRegistryEntry(raw as RegistryAgentEntry, platformKey);\n if (mapped) agents.push(mapped);\n }\n return { fetchedAt: opts.now ?? new Date().toISOString(), agents };\n } finally {\n clearTimeout(timer);\n opts.signal?.removeEventListener('abort', onParentAbort);\n }\n}\n","/**\n * Ensemble runner — fan a single task out to multiple ACP agents in parallel.\n *\n * This is the engine behind both:\n * - `wstack acp parallel <csv> <task>` (CLI subcommand)\n * - `/ensemble <csv> <task>` (TUI slash command)\n *\n * The CLI wraps `runEnsemble` with a plain-text renderer. The TUI can\n * call it directly and format the result however it likes (text dump,\n * per-agent tabbed panels, etc.).\n *\n * Design notes\n * ────────────\n * - Skipping is up-front. We probe the registry once, then run only\n * the installed agents. This keeps the \"no installed agents\" path\n * cheap (no spawn attempts) and the error message clear.\n * - All agents run concurrently via `Promise.allSettled`. A single\n * failed agent doesn't kill the others; the call returns once every\n * agent has either completed or crashed.\n * - Per-agent errors are captured as structured `{kind, message}`\n * objects, not thrown. The aggregated result is one `EnsembleResult`\n * with per-agent outcomes. Callers can render it as they please.\n * - The `signal` option propagates as the parent AbortSignal for each\n * `SubagentRunner`. Aborting cancels all in-flight agents.\n * - Idempotent cleanup: each agent's `stop()` is called in a\n * `finally`, so a throw in the body still tears the child down.\n */\nimport { EnsembleRegistry, type DetectedAgent } from '../registry/ensemble-registry.js';\nimport { SubagentBudget } from '@wrongstack/core/coordination';\nimport {\n makeACPSubagentRunnerWithStop,\n resolveAcpAgentCommand,\n type ACPSubagentRunnerOptions,\n} from './acp-subagent-runner.js';\nimport type { ACPProgressEvent } from '../client/acp-session.js';\n\n/** Live per-agent progress callback for an ensemble run. */\nexport type EnsembleProgressHandler = (\n agentId: string,\n event: ACPProgressEvent,\n) => void;\n\n/**\n * Per-agent outcome from an ensemble run.\n * `status === 'skipped'` carries a `reason`; the other statuses carry\n * either a result or an error envelope.\n */\nexport interface EnsembleAgentResult {\n agentId: string;\n status: 'success' | 'failed' | 'skipped' | 'cancelled';\n /** The agent's text result. Present for `status === 'success'`. */\n result?: string | undefined;\n /** Structured error. Present for `status === 'failed' | 'cancelled'`. */\n error?: { kind: string; message: string } | undefined;\n /** Why the agent was skipped (not installed, unknown id, etc.). */\n reason?: string | undefined;\n /** Wall-clock time spent on this agent. 0 for skipped. */\n durationMs: number;\n /** Agent-reported iteration count (1 per ACP turn). */\n iterations: number;\n /** Agent-reported tool call count (currently 0 for ACP). */\n toolCalls: number;\n}\n\n/** Aggregate result of one ensemble run. */\nexport interface EnsembleResult {\n /** The task that was dispatched. */\n task: string;\n /** Agent ids as the user provided them, after dedup. */\n requested: string[];\n /** Per-agent outcomes, in the order they were requested. */\n results: EnsembleAgentResult[];\n /** Roll-up of the per-agent statuses. */\n summary: {\n succeeded: number;\n failed: number;\n skipped: number;\n cancelled: number;\n };\n /** Total wall-clock time of the run (longest agent). */\n totalDurationMs: number;\n}\n\n/** Sync command resolver: id → command, or null if unknown. */\nexport type EnsembleCmdResolver = (id: string) => ACPSubagentRunnerOptions | null;\n\nexport interface EnsembleRunnerOptions {\n /**\n * Comma-separated agent ids. Whitespace, empty entries, and\n * duplicates are filtered out. Order is preserved.\n */\n agentIds: string;\n /** The task description forwarded verbatim to each agent. */\n task: string;\n /**\n * Per-agent hard timeout in ms. Defaults to 5 minutes; the\n * `SubagentRunner` itself layers a turn-level timeout under this.\n */\n timeoutMs?: number;\n /**\n * Override the registry used for the install probe. Defaults to\n * `new EnsembleRegistry()`. Useful for tests.\n */\n registry?: EnsembleRegistry;\n /**\n * Override the command resolver. Defaults to\n * `defaultEnsembleCmdResolver` (legacy `ACP_AGENT_COMMANDS` map\n * with catalog fallback via `findAgentDescriptor`). Useful for\n * tests that don't want the real `makeACPSubagentRunnerWithStop`.\n */\n resolveCmd?: EnsembleCmdResolver;\n /**\n * Cancellation signal. Aborting stops all in-flight agents via the\n * `SubagentRunContext.signal` they receive.\n */\n signal?: AbortSignal | undefined;\n /**\n * Live progress callback. Invoked for every streamed update from every\n * agent, tagged with the agent id so the caller can render interleaved\n * progress (e.g. `[gemini-cli] edit foo.ts`).\n */\n onProgress?: EnsembleProgressHandler | undefined;\n /**\n * Maximum number of agents to launch concurrently. Defaults to\n * `DEFAULT_MAX_CONCURRENCY` (4). Set to 1 for serial execution;\n * values larger than the runnable count are clamped down. Bounded\n * fan-out keeps simultaneous ACP subprocess / WebSocket counts\n * manageable when an ensemble has many members.\n */\n maxConcurrency?: number | undefined;\n}\n\n/** Default cap on simultaneously-running agents in an ensemble. */\nconst DEFAULT_MAX_CONCURRENCY = 4;\n\n/**\n * Map each input through `worker` with at most `limit` tasks in flight.\n * The output array preserves input order. Each worker is expected to\n * resolve (not throw) — `runEnsemble`'s runnable workers wrap their\n * own logic so they never reject, matching the original\n * `Promise.allSettled` semantics where rejection was effectively\n * impossible. Bounded concurrency caps simultaneous ACP subprocess /\n * WebSocket counts in large ensembles.\n */\nasync function mapBound<T, R>(\n items: readonly T[],\n worker: (item: T, index: number) => Promise<R>,\n limit: number,\n): Promise<R[]> {\n const results: R[] = new Array(items.length);\n if (items.length === 0) return results;\n const safeLimit = Math.max(1, Math.min(limit, items.length));\n let nextIndex = 0;\n const workerCount = Math.min(safeLimit, items.length);\n const runners: Promise<void>[] = [];\n for (let w = 0; w < workerCount; w++) {\n runners.push(\n (async () => {\n while (true) {\n const current = nextIndex++;\n if (current >= items.length) return;\n results[current] = await worker(items[current]!, current);\n }\n })(),\n );\n }\n await Promise.all(runners);\n return results;\n}\n\n/**\n * Default command resolver — delegates to `resolveAcpAgentCommand`, so the\n * catalog's corrected invocations win over the stale legacy map (the legacy\n * map is now only a last-resort fallback). Returns `null` for unknown ids.\n */\nexport const defaultEnsembleCmdResolver: EnsembleCmdResolver = (id) =>\n resolveAcpAgentCommand(id);\n\n/**\n * Update one result in-place. Keeps the array order stable so callers\n * can render results in the same order they were requested.\n */\nfunction setResult(\n results: EnsembleAgentResult[],\n agentId: string,\n patch: Partial<EnsembleAgentResult>,\n): void {\n const i = results.findIndex((r) => r.agentId === agentId);\n if (i < 0) return;\n const current = results[i]!;\n results[i] = { ...current, ...patch };\n}\n\n/**\n * Run a single agent and return its structured outcome. Always\n * resolves (never throws) — errors are encoded in the returned\n * `EnsembleAgentResult.status`.\n */\nasync function runOne(\n agentId: string,\n cmd: ACPSubagentRunnerOptions,\n task: string,\n timeoutMs: number,\n signal: AbortSignal | undefined,\n onProgress: EnsembleProgressHandler | undefined,\n): Promise<Omit<EnsembleAgentResult, 'agentId'>> {\n const startedAt = Date.now();\n try {\n const { runner, stop } = await makeACPSubagentRunnerWithStop({\n ...cmd,\n timeoutMs,\n ...(onProgress ? { onProgress: (event) => onProgress(agentId, event) } : {}),\n });\n try {\n // SubagentRunner signature: (task, ctx) => Promise<{result, iterations, toolCalls}>.\n // The budget is required by the context type but the runner never\n // invokes it for a single ACP turn. We construct a real one so the\n // cast stays clean and the context satisfies the type system.\n const budget = new SubagentBudget({\n timeoutMs,\n maxIterations: 2000,\n maxToolCalls: 5000,\n });\n const result = await runner(\n { id: `ensemble-${agentId}`, description: task },\n {\n subagentId: agentId,\n config: {\n id: agentId,\n name: agentId,\n role: agentId,\n provider: 'acp',\n prompt: '',\n },\n budget,\n signal: signal ?? new AbortController().signal,\n bridge: null,\n },\n );\n return {\n status: 'success',\n result: result.result == null ? '' : String(result.result),\n durationMs: Date.now() - startedAt,\n iterations: result.iterations,\n toolCalls: result.toolCalls,\n };\n } finally {\n try {\n stop();\n } catch {\n /* best-effort */\n }\n }\n } catch (err) {\n const e = err as { kind?: string; message?: string; name?: string };\n const isAbort =\n e?.name === 'AbortError' ||\n e?.kind === 'aborted' ||\n e?.kind === 'aborted_by_parent' ||\n e?.message?.toLowerCase().includes('aborted');\n return {\n status: isAbort ? 'cancelled' : 'failed',\n error: {\n kind: e?.kind ?? (isAbort ? 'aborted' : 'unknown'),\n message:\n e?.message ?? (err instanceof Error ? err.message : String(err)),\n },\n durationMs: Date.now() - startedAt,\n iterations: 0,\n toolCalls: 0,\n };\n }\n}\n\n/**\n * Fan a task out to multiple ACP agents concurrently.\n *\n * Returns once every requested agent has either completed, failed, or\n * been cancelled. Skipped agents (not installed, unknown id) are\n * reported with `status: 'skipped'` and don't block the result.\n *\n * The function is a pure orchestrator — it does NOT render output. The\n * caller decides how to format the `EnsembleResult`.\n */\nexport async function runEnsemble(opts: EnsembleRunnerOptions): Promise<EnsembleResult> {\n const timeoutMs = opts.timeoutMs ?? 5 * 60_000;\n const registry = opts.registry ?? new EnsembleRegistry();\n const resolveCmd = opts.resolveCmd ?? defaultEnsembleCmdResolver;\n\n // 1. Parse + dedup the comma list, preserving order.\n const seen = new Set<string>();\n const requested: string[] = [];\n for (const raw of opts.agentIds.split(',')) {\n const id = raw.trim();\n if (!id || seen.has(id)) continue;\n seen.add(id);\n requested.push(id);\n }\n\n const results: EnsembleAgentResult[] = requested.map((agentId) => ({\n agentId,\n status: 'skipped',\n durationMs: 0,\n iterations: 0,\n toolCalls: 0,\n }));\n const startMs = Date.now();\n\n if (requested.length === 0) {\n return {\n task: opts.task,\n requested,\n results,\n summary: { succeeded: 0, failed: 0, skipped: 0, cancelled: 0 },\n totalDurationMs: 0,\n };\n }\n\n // 2. Probe the registry to classify each id as installed / not.\n const detected = await registry.list();\n const detectedById = new Map(detected.map((a: DetectedAgent) => [a.id, a]));\n\n // 3. Build the runnable set. Agents that aren't installed stay\n // 'skipped' in the result; agents with no command resolver get\n // 'failed' (unknown_agent).\n const runnable: { id: string; cmd: ACPSubagentRunnerOptions }[] = [];\n for (const id of requested) {\n const det = detectedById.get(id);\n if (!det?.installed) {\n setResult(results, id, {\n status: 'skipped',\n reason: det?.reason ?? 'not in catalog',\n });\n continue;\n }\n const cmd = resolveCmd(id);\n if (!cmd) {\n setResult(results, id, {\n status: 'failed',\n error: { kind: 'unknown_agent', message: `Unknown ACP agent: ${id}` },\n durationMs: 0,\n });\n continue;\n }\n runnable.push({ id, cmd });\n }\n\n // 4. Fan out the runnable set with bounded concurrency so a large\n // ensemble does not spawn `runnable.length` ACP subprocesses at\n // once. `runOne` already catches every error internally and\n // resolves, so `Promise.all` semantics are correct here —\n // identical to the original `Promise.allSettled` contract because\n // no worker ever rejects.\n const concurrency = Math.max(\n 1,\n opts.maxConcurrency ?? DEFAULT_MAX_CONCURRENCY,\n );\n await mapBound(\n runnable,\n async ({ id, cmd }) => {\n // Honor parent abort BEFORE doing anything expensive.\n if (opts.signal?.aborted) {\n setResult(results, id, {\n status: 'cancelled',\n error: { kind: 'aborted', message: 'aborted by parent' },\n durationMs: 0,\n });\n return;\n }\n const outcome = await runOne(id, cmd, opts.task, timeoutMs, opts.signal, opts.onProgress);\n setResult(results, id, outcome);\n },\n concurrency,\n );\n\n // 5. Build the summary.\n const summary = { succeeded: 0, failed: 0, skipped: 0, cancelled: 0 };\n for (const r of results) {\n if (r.status === 'success') summary.succeeded++;\n else if (r.status === 'failed') summary.failed++;\n else if (r.status === 'cancelled') summary.cancelled++;\n else summary.skipped++;\n }\n\n return {\n task: opts.task,\n requested,\n results,\n summary,\n totalDurationMs: Date.now() - startMs,\n };\n}\n\n/**\n * Render an `EnsembleResult` as a plain-text block. Useful as the\n * default for the CLI; the TUI can call this or build a richer view.\n *\n * The format mirrors the output the `wstack acp parallel` subcommand\n * emits, so existing scripts that parse the CLI's output keep working.\n */\nexport function renderEnsembleText(result: EnsembleResult): string {\n const lines: string[] = [];\n if (result.requested.length === 0) {\n lines.push('No agent ids provided.');\n return lines.join('\\n');\n }\n for (const r of result.results) {\n lines.push(`\\n=== ${r.agentId} ===`);\n switch (r.status) {\n case 'success':\n lines.push(r.result && r.result.length > 0 ? r.result : '(no result)');\n lines.push(\n `[${r.agentId}] success ${r.durationMs}ms iterations=${r.iterations} toolCalls=${r.toolCalls}`,\n );\n break;\n case 'failed':\n lines.push(\n `[${r.error?.kind ?? 'unknown'}] ${r.error?.message ?? 'failed'}`,\n );\n lines.push(`[${r.agentId}] failed ${r.durationMs}ms`);\n break;\n case 'cancelled':\n lines.push(\n `[${r.error?.kind ?? 'aborted'}] ${r.error?.message ?? 'cancelled'}`,\n );\n lines.push(`[${r.agentId}] cancelled ${r.durationMs}ms`);\n break;\n case 'skipped':\n lines.push(`(skipped — ${r.reason ?? 'not installed'})`);\n break;\n }\n }\n const { succeeded, failed, skipped, cancelled } = result.summary;\n lines.push(\n `\\nEnsemble summary: ${succeeded} succeeded, ${failed} failed, ${cancelled} cancelled, ${skipped} skipped. (${result.totalDurationMs}ms total)`,\n );\n return lines.join('\\n');\n}\n","/**\n * ACP client bench — end-to-end verification of installed ACP agents.\n *\n * Unlike `probeAcpAgent` (which only runs the `initialize` handshake), the\n * bench drives each agent through a real, deterministic turn and grades it:\n *\n * 1. handshake — spawn + `initialize` succeeds (captures agentInfo)\n * 2. prompt — `session/new` + `session/prompt` returns with text\n * 3. marker — the agent followed a trivial instruction (echo a token)\n * 4. fs (opt) — the agent read a file from the client's sandboxed FS,\n * exercising the `fs/read_text_file` callback channel\n *\n * Grade: pass (all required checks), partial (handshake ok but degraded),\n * fail (couldn't even handshake). Each result carries per-check detail and\n * timings so the report is actionable: \"claude-code: handshake ok but the\n * prompt timed out\" vs \"codex-cli: not installed\".\n *\n * Pure orchestrator — no renderer dependency; `renderAcpBenchText` is the\n * default formatter. The CLI/slash layer supplies the command resolver\n * (so user overrides + the synced registry apply) and the agent set.\n */\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { ACPSession, textContent } from '../client/acp-session.js';\nimport type { ACPSubagentRunnerOptions } from './acp-subagent-runner.js';\n\nexport type AcpBenchStatus = 'pass' | 'partial' | 'fail' | 'skipped';\n\nexport interface AcpBenchCheck {\n name: 'handshake' | 'prompt' | 'marker' | 'fs';\n ok: boolean;\n detail?: string | undefined;\n}\n\nexport interface AcpBenchAgentResult {\n agentId: string;\n status: AcpBenchStatus;\n checks: AcpBenchCheck[];\n /** Agent metadata from the initialize handshake. */\n agentInfo?: { name: string; title?: string | undefined; version: string } | undefined;\n handshakeMs?: number | undefined;\n promptMs?: number | undefined;\n /** First line of the agent's reply (trimmed), for the report. */\n sample?: string | undefined;\n /** Why the agent failed / was skipped. */\n reason?: string | undefined;\n durationMs: number;\n}\n\nexport interface AcpBenchResult {\n results: AcpBenchAgentResult[];\n summary: { pass: number; partial: number; fail: number; skipped: number };\n totalDurationMs: number;\n}\n\n/** Resolve an agent id to its spawn command (null = unknown). */\nexport type AcpBenchCmdResolver = (id: string) => ACPSubagentRunnerOptions | null;\n\nexport interface AcpBenchOptions {\n /** Agent ids to bench. */\n agentIds: string[];\n /** Resolve each id → spawn command (wire overrides + synced registry here). */\n resolveCmd: AcpBenchCmdResolver;\n /** FS sandbox + cwd for each agent. Defaults to `process.cwd()`. */\n projectRoot?: string | undefined;\n /** Per-agent hard timeout (handshake + each prompt). Default 60s. */\n timeoutMs?: number | undefined;\n /** Also verify the `fs/read_text_file` callback channel. Default false. */\n checkFs?: boolean | undefined;\n /** Max agents benched concurrently. Default 2 (each runs a real LLM turn). */\n concurrency?: number | undefined;\n /** Cancellation. Aborts the in-flight agent and skips the rest. */\n signal?: AbortSignal | undefined;\n /** Live per-agent status callback for the UI. */\n onProgress?: ((agentId: string, phase: 'start' | 'done', result?: AcpBenchAgentResult) => void) | undefined;\n /** Marker token override (tests). Default is a random per-run token. */\n marker?: string | undefined;\n /** Clock injection (tests). Defaults to `Date.now`. */\n now?: (() => number) | undefined;\n}\n\nfunction firstLine(s: string): string {\n const line = s.split('\\n').map((l) => l.trim()).find((l) => l.length > 0) ?? '';\n return line.length > 120 ? `${line.slice(0, 117)}…` : line;\n}\n\nfunction randomMarker(): string {\n // Unique-enough per run so an agent can't echo a cached reply.\n return `ACP_OK_${Math.random().toString(36).slice(2, 8).toUpperCase()}`;\n}\n\n/**\n * Bench one agent end-to-end. Always resolves (errors are encoded in the\n * returned result's status/checks), so the caller's fan-out never rejects.\n */\ninterface BenchOneCtx {\n projectRoot: string;\n timeoutMs: number;\n checkFs: boolean;\n marker: string;\n now: () => number;\n signal?: AbortSignal | undefined;\n}\n\nasync function benchOne(\n agentId: string,\n cmd: ACPSubagentRunnerOptions,\n opts: BenchOneCtx,\n): Promise<AcpBenchAgentResult> {\n const checks: AcpBenchCheck[] = [];\n const startedAt = opts.now();\n let session: ACPSession | null = null;\n const signal = opts.signal ?? new AbortController().signal;\n\n // 1. Handshake.\n const hsStart = opts.now();\n try {\n session = await ACPSession.start({\n command: cmd.command,\n ...(cmd.args !== undefined ? { args: [...cmd.args] } : {}),\n ...(cmd.env !== undefined ? { env: cmd.env } : {}),\n projectRoot: opts.projectRoot,\n timeoutMs: opts.timeoutMs,\n });\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n checks.push({ name: 'handshake', ok: false, detail: reason });\n return {\n agentId,\n status: 'fail',\n checks,\n reason,\n handshakeMs: opts.now() - hsStart,\n durationMs: opts.now() - startedAt,\n };\n }\n const handshakeMs = opts.now() - hsStart;\n const agentInfo = session.getAgentInfo() ?? undefined;\n checks.push({\n name: 'handshake',\n ok: true,\n detail: agentInfo ? `${agentInfo.name} ${agentInfo.version}` : undefined,\n });\n\n let promptMs: number | undefined;\n let sample: string | undefined;\n let reason: string | undefined;\n try {\n // 2 + 3. Prompt + marker echo.\n const pStart = opts.now();\n const res = await session.prompt(\n [textContent(`Reply with exactly this token and nothing else: ${opts.marker}`)],\n signal,\n );\n promptMs = opts.now() - pStart;\n sample = res.text ? firstLine(res.text) : undefined;\n const promptOk = res.hasText && res.stopReason !== 'refusal';\n checks.push({\n name: 'prompt',\n ok: promptOk,\n detail: `stopReason=${res.stopReason}${res.hasText ? '' : ', no text'}`,\n });\n const markerOk = res.text.includes(opts.marker);\n checks.push({\n name: 'marker',\n ok: markerOk,\n detail: markerOk ? undefined : 'reply did not contain the token',\n });\n\n // 4. Optional fs callback check.\n if (opts.checkFs) {\n const fileToken = `FILE_${opts.marker}`;\n const fileName = `acp-bench-${opts.marker}.txt`;\n const filePath = path.join(opts.projectRoot, fileName);\n let fsOk = false;\n let fsDetail: string | undefined;\n try {\n await fsp.writeFile(filePath, fileToken, 'utf8');\n const fsRes = await session.prompt(\n [\n textContent(\n `Read the file \"${fileName}\" in the current directory and reply with its exact contents.`,\n ),\n ],\n signal,\n );\n fsOk = fsRes.text.includes(fileToken);\n if (!fsOk) fsDetail = 'agent did not return the file contents (may not have used a read tool)';\n } catch (err) {\n fsDetail = err instanceof Error ? err.message : String(err);\n } finally {\n await fsp.rm(filePath, { force: true }).catch(() => {});\n }\n checks.push({ name: 'fs', ok: fsOk, detail: fsDetail });\n }\n } catch (err) {\n reason = err instanceof Error ? err.message : String(err);\n checks.push({ name: 'prompt', ok: false, detail: reason });\n } finally {\n try {\n await session.close();\n } catch {\n // best-effort\n }\n }\n\n // Grade: required = handshake + prompt + marker (+ fs when requested).\n const required = checks.filter((c) => c.name !== 'fs' || opts.checkFs);\n const allReq = required.every((c) => c.ok);\n const handshakeOk = checks.find((c) => c.name === 'handshake')?.ok === true;\n const status: AcpBenchStatus = allReq ? 'pass' : handshakeOk ? 'partial' : 'fail';\n\n return {\n agentId,\n status,\n checks,\n ...(agentInfo ? { agentInfo } : {}),\n handshakeMs,\n ...(promptMs !== undefined ? { promptMs } : {}),\n ...(sample ? { sample } : {}),\n ...(reason ? { reason } : {}),\n durationMs: opts.now() - startedAt,\n };\n}\n\n/**\n * Bench a set of ACP agents end-to-end and return a graded report. Unknown\n * ids are reported `skipped`. Bounded concurrency keeps the number of live\n * ACP subprocesses (each running a real model turn) manageable.\n */\nexport async function runAcpBench(opts: AcpBenchOptions): Promise<AcpBenchResult> {\n const now = opts.now ?? Date.now;\n const projectRoot = opts.projectRoot ?? process.cwd();\n const timeoutMs = opts.timeoutMs ?? 60_000;\n const checkFs = opts.checkFs ?? false;\n const marker = opts.marker ?? randomMarker();\n const concurrency = Math.max(1, opts.concurrency ?? 2);\n\n // Dedup, preserve order.\n const seen = new Set<string>();\n const ids: string[] = [];\n for (const raw of opts.agentIds) {\n const id = raw.trim();\n if (id && !seen.has(id)) {\n seen.add(id);\n ids.push(id);\n }\n }\n\n const results: AcpBenchAgentResult[] = ids.map((agentId) => ({\n agentId,\n status: 'skipped',\n checks: [],\n durationMs: 0,\n reason: 'unknown agent',\n }));\n const startMs = now();\n\n const runnable: { id: string; cmd: ACPSubagentRunnerOptions; index: number }[] = [];\n ids.forEach((id, index) => {\n const cmd = opts.resolveCmd(id);\n if (cmd) runnable.push({ id, cmd, index });\n });\n\n let next = 0;\n const workers: Promise<void>[] = [];\n const workerCount = Math.min(concurrency, runnable.length);\n for (let w = 0; w < workerCount; w++) {\n workers.push(\n (async () => {\n while (true) {\n const current = next++;\n if (current >= runnable.length) return;\n const { id, cmd, index } = runnable[current]!;\n if (opts.signal?.aborted) {\n results[index] = {\n agentId: id,\n status: 'skipped',\n checks: [],\n durationMs: 0,\n reason: 'aborted',\n };\n continue;\n }\n opts.onProgress?.(id, 'start');\n const r = await benchOne(id, cmd, {\n projectRoot,\n timeoutMs,\n checkFs,\n marker,\n now,\n ...(opts.signal ? { signal: opts.signal } : {}),\n });\n results[index] = r;\n opts.onProgress?.(id, 'done', r);\n }\n })(),\n );\n }\n await Promise.all(workers);\n\n const summary = { pass: 0, partial: 0, fail: 0, skipped: 0 };\n for (const r of results) summary[r.status]++;\n\n return { results, summary, totalDurationMs: now() - startMs };\n}\n\n/** Render an `AcpBenchResult` as a plain-text report. */\nexport function renderAcpBenchText(result: AcpBenchResult): string {\n const icon = (s: AcpBenchStatus): string =>\n s === 'pass' ? '✓' : s === 'partial' ? '◐' : s === 'skipped' ? '–' : '✗';\n const lines: string[] = ['ACP client bench:', ''];\n if (result.results.length === 0) {\n lines.push('No agents to bench.');\n return lines.join('\\n');\n }\n for (const r of result.results) {\n const checks = r.checks\n .map((c) => `${c.ok ? '✓' : '✗'}${c.name}`)\n .join(' ');\n const timing =\n r.handshakeMs !== undefined\n ? ` hs=${r.handshakeMs}ms${r.promptMs !== undefined ? ` prompt=${r.promptMs}ms` : ''}`\n : '';\n lines.push(` ${icon(r.status)} ${r.agentId.padEnd(16)} ${r.status.toUpperCase().padEnd(7)} ${checks}${timing}`);\n if (r.agentInfo) lines.push(` agent: ${r.agentInfo.name} ${r.agentInfo.version}`);\n if (r.sample) lines.push(` reply: ${r.sample}`);\n if (r.reason) lines.push(` reason: ${r.reason}`);\n }\n const { pass, partial, fail, skipped } = result.summary;\n lines.push('');\n lines.push(\n `Bench summary: ${pass} pass, ${partial} partial, ${fail} fail, ${skipped} skipped. (${result.totalDurationMs}ms total)`,\n );\n return lines.join('\\n');\n}\n"]}