@wrongstack/acp 0.260.0 → 0.265.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/agent/stdio-transport.ts","../src/client/tool-translator.ts","../src/integration/acp-subagent-runner.ts"],"names":["expectDefined"],"mappings":"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","file":"client.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 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\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 }) as unknown as ACPChildProcess;\n } catch (err) {\n clearTimeout(timeout);\n reject(err);\n return;\n }\n\n const child = this.child;\n\n child.stdout.setEncoding('utf8');\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 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\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 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","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 unknown 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 * ACPSubagentRunner — SubagentRunner implementation for DIR-1.\n *\n * Wraps an external ACP agent (Cline, Gemini CLI, Codex CLI, Copilot, etc.)\n * as a WrongStack subagent. The external agent runs its own agent loop;\n * we send it a task via ACP and return the result.\n *\n * Connected to Director / MultiAgentCoordinator via the SubagentRunner\n * interface (same as AgentSubagentRunner).\n */\nimport type {SubagentRunContext, SubagentRunner, TaskSpec} from '@wrongstack/core';\nimport {ClientTransport} from '../agent/stdio-transport.js';\nimport type {ACPToolCallResponse} from '../types/acp-messages.js';\nimport {ToolTranslator, parseToolResponse} from '../client/tool-translator.js';\nimport type {ToolTranslatorOptions} from '../client/tool-translator.js';\n\nexport interface ACPSubagentRunnerOptions {\n /** ACP agent command or npm package (e.g. 'npx', 'gemini', 'gh') */\n command: string;\n args?: string[] | undefined;\n env?: Record<string, string>;\n cwd?: string | undefined;\n /** Subagent role — used for protocol negotiation and prompt overrides */\n role?: string | undefined;\n toolTranslatorOpts?: ToolTranslatorOptions | undefined;\n}\n\n/** Map WrongStack ACP agent role → how to spawn it. */\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 an ACPSubagentRunner for a given role, or a generic one from explicit options.\n */\nexport async function makeACPSubagentRunner(\n options: ACPSubagentRunnerOptions,\n): Promise<SubagentRunner> {\n const transport = new ClientTransport(clientTransportOptions(options));\n\n const translator = new ToolTranslator(options.toolTranslatorOpts);\n const activeAbort = new AbortController();\n\n let sessionStarted = false;\n\n const startSession = async (): Promise<void> => {\n if (sessionStarted) return;\n await transport.start();\n\n await transport.send({\n method: 'initialize',\n id: '1',\n params: {\n capabilities: ['code-generation', 'async-tools', 'streaming', 'progress'],\n protocolVersion: '2024-11',\n sessionId: options.role ?? 'wrongstack-subagent',\n },\n });\n\n const initResp = await transport.read();\n if (!initResp || initResp.error) {\n throw new Error(`ACP initialize failed: ${initResp?.error?.message ?? 'no response'}`);\n }\n\n translator.attachToTransport({\n onMessage: (h) => transport.onMessage(h),\n send: (m) => transport.send(m),\n });\n\n sessionStarted = true;\n };\n\n const runner: SubagentRunner = async (\n task: TaskSpec,\n ctx: SubagentRunContext,\n ): Promise<{result?: unknown | undefined; iterations: number; toolCalls: number}> => {\n ctx.signal.addEventListener('abort', () => {\n activeAbort.abort();\n transport.stop();\n });\n\n await startSession();\n\n const callId = crypto.randomUUID();\n let toolResult: ACPToolCallResponse | null = null;\n\n const resultPromise = new Promise<ACPToolCallResponse>((resolve, reject) => {\n const budgetMs = ctx.budget.limits.timeoutMs ?? 300_000;\n\n const timeout = setTimeout(() => {\n reject(new Error(`ACP task timed out for subagent ${ctx.subagentId} (${budgetMs}ms budget)`));\n }, budgetMs);\n\n transport.onMessage((msg) => {\n if (msg.method === 'tools/call' && msg.id !== undefined) {\n clearTimeout(timeout);\n resolve(msg as unknown as ACPToolCallResponse);\n }\n });\n\n ctx.signal.addEventListener('abort', () => {\n clearTimeout(timeout);\n reject(new Error('Task aborted by parent'));\n });\n });\n\n try {\n // Most ACP agents accept a free-form task string as their primary input.\n // Use the tools/call protocol with a special 'task' pseudo-tool if the\n // agent advertises it; otherwise send it as an initialize session detail\n // or a custom agent/run message. The agent will respond on stdout.\n await transport.send({\n method: 'agent/run',\n id: callId,\n params: {\n task: task.description,\n sessionId: ctx.subagentId,\n },\n });\n\n toolResult = await resultPromise;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n result: `ACP subagent error: ${msg}`,\n iterations: 0,\n toolCalls: 0,\n };\n }\n\n if (!toolResult) {\n return {result: 'ACP subagent returned no result', iterations: 1, toolCalls: 1};\n }\n\n const parsed = parseToolResponse(task.id, ctx.subagentId, toolResult);\n return {\n result: parsed.result ?? parsed.error,\n iterations: parsed.iterations,\n toolCalls: parsed.toolCalls,\n };\n };\n\n return runner;\n}\n\n/** Returns the runner and a stop function to clean up the transport. */\nexport async function makeACPSubagentRunnerWithStop(\n options: ACPSubagentRunnerOptions,\n): Promise<{runner: SubagentRunner; stop: () => void}> {\n const transport = new ClientTransport(clientTransportOptions(options));\n\n const translator = new ToolTranslator(options.toolTranslatorOpts);\n const activeAbort = new AbortController();\n\n let sessionStarted = false;\n\n const startSession = async (): Promise<void> => {\n if (sessionStarted) return;\n await transport.start();\n\n await transport.send({\n method: 'initialize',\n id: '1',\n params: {\n capabilities: ['code-generation', 'async-tools', 'streaming', 'progress'],\n protocolVersion: '2024-11',\n sessionId: options.role ?? 'wrongstack-subagent',\n },\n });\n\n const initResp = await transport.read();\n if (!initResp || initResp.error) {\n throw new Error(`ACP initialize failed: ${initResp?.error?.message ?? 'no response'}`);\n }\n\n translator.attachToTransport({\n onMessage: (h) => transport.onMessage(h),\n send: (m) => transport.send(m),\n });\n\n sessionStarted = true;\n };\n\n const stop = () => {\n activeAbort.abort();\n transport.stop();\n };\n\n const runner: SubagentRunner = async (\n task: TaskSpec,\n ctx: SubagentRunContext,\n ): Promise<{result?: unknown | undefined; iterations: number; toolCalls: number}> => {\n ctx.signal.addEventListener('abort', () => {\n activeAbort.abort();\n transport.stop();\n });\n\n await startSession();\n\n const callId = crypto.randomUUID();\n let toolResult: ACPToolCallResponse | null = null;\n\n const resultPromise = new Promise<ACPToolCallResponse>((resolve, reject) => {\n const budgetMs = ctx.budget.limits.timeoutMs ?? 300_000;\n\n const timeout = setTimeout(() => {\n reject(new Error(`ACP task timed out for subagent ${ctx.subagentId} (${budgetMs}ms budget)`));\n }, budgetMs);\n\n transport.onMessage((msg) => {\n if (msg.method === 'tools/call' && msg.id !== undefined) {\n clearTimeout(timeout);\n resolve(msg as unknown as ACPToolCallResponse);\n }\n });\n\n ctx.signal.addEventListener('abort', () => {\n clearTimeout(timeout);\n reject(new Error('Task aborted by parent'));\n });\n });\n\n try {\n await transport.send({\n method: 'agent/run',\n id: callId,\n params: {\n task: task.description,\n sessionId: ctx.subagentId,\n },\n });\n\n toolResult = await resultPromise;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n result: `ACP subagent error: ${msg}`,\n iterations: 0,\n toolCalls: 0,\n };\n }\n\n if (!toolResult) {\n return {result: 'ACP subagent returned no result', iterations: 1, toolCalls: 1};\n }\n\n const parsed = parseToolResponse(task.id, ctx.subagentId, toolResult);\n return {\n result: parsed.result ?? parsed.error,\n iterations: parsed.iterations,\n toolCalls: parsed.toolCalls,\n };\n };\n\n return {runner, stop};\n}\n\nfunction clientTransportOptions(options: ACPSubagentRunnerOptions): ConstructorParameters<typeof ClientTransport>[0] {\n const out: ConstructorParameters<typeof ClientTransport>[0] = {\n command: options.command,\n handshakeTimeoutMs: 30_000,\n };\n if (options.args !== undefined) out.args = options.args;\n if (options.env !== undefined) out.env = options.env;\n if (options.cwd !== undefined) out.cwd = options.cwd;\n return out;\n}\n"]}
1
+ {"version":3,"sources":["../src/agent/stdio-transport.ts","../src/client/tool-translator.ts","../src/types/acp-v1.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"],"names":["spawn","resolve","expectDefined","path","path2"],"mappings":"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","file":"client.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 unknown 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","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 unknown 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 * 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 * 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 unknown 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 && 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 unknown 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"]}
@@ -1,4 +1,4 @@
1
- import { g as ACPMessage, s as ACPToolCallResponse } from './stdio-transport-DoKRVjHz.js';
1
+ import { j as ACPMessage, v as ACPToolCallResponse } from './stdio-transport-CsFr8JzC.js';
2
2
  import { SubagentRunner } from '@wrongstack/core';
3
3
 
4
4
  /**
@@ -52,33 +52,65 @@ declare class ToolTranslator {
52
52
  }
53
53
 
54
54
  /**
55
- * ACPSubagentRunner — SubagentRunner implementation for DIR-1.
55
+ * ACPSubagentRunner — `SubagentRunner` implementation for DIR-1.
56
56
  *
57
- * Wraps an external ACP agent (Cline, Gemini CLI, Codex CLI, Copilot, etc.)
58
- * as a WrongStack subagent. The external agent runs its own agent loop;
59
- * we send it a task via ACP and return the result.
57
+ * Wraps an external ACP-supporting agent (Claude Code, Gemini CLI, Codex
58
+ * CLI, Cline, Goose, OpenHands, etc.) as a WrongStack subagent. The
59
+ * external agent runs its own agent loop; we send it a task via the ACP
60
+ * v1 protocol and return the result.
60
61
  *
61
- * Connected to Director / MultiAgentCoordinator via the SubagentRunner
62
- * interface (same as AgentSubagentRunner).
62
+ * v1 spec: https://agentclientprotocol.com/protocol/v1/overview
63
+ *
64
+ * Connected to the Director / MultiAgentCoordinator via the
65
+ * `SubagentRunner` interface (same shape as `AgentSubagentRunner`).
63
66
  */
64
67
 
65
68
  interface ACPSubagentRunnerOptions {
66
- /** ACP agent command or npm package (e.g. 'npx', 'gemini', 'gh') */
69
+ /** How to spawn the external agent. */
67
70
  command: string;
68
71
  args?: string[] | undefined;
69
- env?: Record<string, string>;
72
+ env?: Record<string, string> | undefined;
70
73
  cwd?: string | undefined;
71
- /** Subagent role — used for protocol negotiation and prompt overrides */
74
+ /** Subagent role label surfaced in errors and used for logging. */
72
75
  role?: string | undefined;
73
- toolTranslatorOpts?: ToolTranslatorOptions | undefined;
76
+ /**
77
+ * Hard wall-clock cap for one prompt turn. Defaults to 5 minutes.
78
+ * Overrides `SubagentRunContext.budget.limits.timeoutMs` if both are set.
79
+ */
80
+ timeoutMs?: number | undefined;
81
+ /**
82
+ * Filesystem sandbox root. Defaults to `options.cwd` (when set) or
83
+ * the process's current working directory. All `fs/read_text_file` /
84
+ * `fs/write_text_file` calls are bounded to this root.
85
+ */
86
+ projectRoot?: string | undefined;
74
87
  }
75
- /** Map WrongStack ACP agent role → how to spawn it. */
88
+ /**
89
+ * Static catalog of agent ids → spawn options.
90
+ *
91
+ * The CLI and the host's `buildACPRunner` look up entries by id. The
92
+ * canonical, multi-source catalog is `packages/acp/src/registry/agents.catalog.ts`
93
+ * (the 12-entry static catalog introduced in commit 4ad287b4). This
94
+ * map stays for backward compatibility with existing call sites that
95
+ * import it directly; new code should prefer the registry.
96
+ */
76
97
  declare const ACP_AGENT_COMMANDS: Record<string, ACPSubagentRunnerOptions>;
77
98
  /**
78
- * Build an ACPSubagentRunner for a given role, or a generic one from explicit options.
99
+ * Build a one-shot `SubagentRunner` for a single agent invocation. Each
100
+ * call to the returned function spawns a fresh child process, runs one
101
+ * prompt turn, and tears everything down. The cost is ~1 second of
102
+ * process-startup per call; for long-lived sessions (multi-turn
103
+ * conversations), use `makeACPSubagentRunnerWithStop` and call `stop()`
104
+ * explicitly.
79
105
  */
80
106
  declare function makeACPSubagentRunner(options: ACPSubagentRunnerOptions): Promise<SubagentRunner>;
81
- /** Returns the runner and a stop function to clean up the transport. */
107
+ /**
108
+ * Build a long-lived `SubagentRunner` plus an explicit `stop()` for
109
+ * teardown. The caller is responsible for calling `stop()` when done
110
+ * (or when the host's signal fires). Useful for the `wstack acp spawn`
111
+ * CLI command, which holds the child open for the duration of a user
112
+ * task and tears down on SIGINT.
113
+ */
82
114
  declare function makeACPSubagentRunnerWithStop(options: ACPSubagentRunnerOptions): Promise<{
83
115
  runner: SubagentRunner;
84
116
  stop: () => void;