@wrongstack/acp 0.274.0 → 0.275.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +376 -0
- package/dist/acp-subagent-runner-BAlo23L-.d.ts +644 -0
- package/dist/acp-v1-BxskPsdo.d.ts +520 -0
- package/dist/agent.d.ts +34 -61
- package/dist/agent.js +796 -32
- package/dist/agent.js.map +1 -1
- package/dist/client.d.ts +3 -2
- package/dist/client.js +779 -112
- package/dist/client.js.map +1 -1
- package/dist/index-DEEYyEpu.d.ts +54 -0
- package/dist/index.d.ts +186 -227
- package/dist/index.js +1881 -286
- package/dist/index.js.map +1 -1
- package/dist/sdk.d.ts +12 -0
- package/dist/sdk.js +3350 -0
- package/dist/sdk.js.map +1 -0
- package/dist/server-agent-turn-C3U0lhA-.d.ts +163 -0
- package/dist/terminal-server-P9KpMZTT.d.ts +99 -0
- package/dist/{tools-registry-BCf8evEG.d.ts → tools-registry-D2xdbzN7.d.ts} +1 -1
- package/dist/wrongstack-acp-agent-nzrqmJnc.d.ts +341 -0
- package/dist/wrongstack-acp-agent.d.ts +2 -2
- package/dist/wrongstack-acp-agent.js +426 -26
- package/dist/wrongstack-acp-agent.js.map +1 -1
- package/package.json +7 -2
- package/dist/index-BvPqJHhm.d.ts +0 -119
- package/dist/stdio-transport-CsFr8JzC.d.ts +0 -205
- package/dist/wrongstack-acp-agent-Dv-A0bEm.d.ts +0 -310
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agent/stdio-transport.ts","../src/agent/tools-registry.ts","../src/types/acp-v1.ts","../src/agent/protocol-handler.ts","../src/agent/wrongstack-acp-agent.ts","../src/agent/server-agent-turn.ts"],"names":["writeErr"],"mappings":"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","file":"agent.js","sourcesContent":["/**\n * StdioTransport — bidirectional stdin/stdout communication for ACP.\n *\n * ACP uses newline-delimited JSON-RPC 2.0 messages over stdio:\n * client → agent: JSON-RPC request/notification on stdin\n * agent → client: JSON-RPC response/notification on stdout\n *\n * Start message: clients look for the `[wstack-acp]` marker on stdout before\n * treating subsequent lines as protocol messages.\n */\nimport { expectDefined, writeErr } from '@wrongstack/core';\nimport type { ACPMessage } from '../types/acp-messages.js';\nexport interface AgentServerTransport {\n send(msg: ACPMessage): Promise<void>;\n sendRaw(chunk: string): void;\n read(): Promise<ACPMessage | null>;\n close(): void;\n onMessage(handler: (msg: ACPMessage) => void): () => void;\n}\n\nexport class StdioTransport implements AgentServerTransport {\n private readonly stdin = process.stdin;\n private readonly stdout = process.stdout;\n private readonly stderr = process.stderr;\n\n private buffer = '';\n private readonly handlers = new Set<(msg: ACPMessage) => void>();\n private closed = false;\n private resolveRead: ((msg: ACPMessage | null) => void) | null = null;\n private messageQueue: ACPMessage[] = [];\n\n constructor() {\n this.stdin.resume();\n this.stdin.setEncoding('utf8');\n this.stdin.on('data', (chunk: string) => this.onData(chunk));\n this.stdin.on('end', () => this.handleClose());\n this.stdin.on('error', (err: Error) => this.failAll(err));\n }\n\n sendStartupMarker(): void {\n this.stdout.write('[wstack-acp]\\n', 'utf8');\n }\n\n send(msg: ACPMessage): Promise<void> {\n if (this.closed) return Promise.resolve();\n return new Promise((resolve) => {\n const line = JSON.stringify(msg) + '\\n';\n this.stdout.write(line, 'utf8', () => resolve());\n });\n }\n\n sendRaw(chunk: string): void {\n this.stdout.write(chunk, 'utf8');\n }\n\n read(): Promise<ACPMessage | null> {\n if (this.messageQueue.length > 0) return Promise.resolve(expectDefined(this.messageQueue.shift()));\n if (this.closed) return Promise.resolve(null);\n return new Promise((resolve) => {\n this.resolveRead = resolve;\n });\n }\n\n onMessage(handler: (msg: ACPMessage) => void): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n close(): void {\n this.closed = true;\n this.stdin.pause();\n this.resolveRead?.(null);\n this.resolveRead = null;\n }\n\n private onData(chunk: string): void {\n this.buffer += chunk;\n const lines = this.buffer.split('\\n');\n /* v8 ignore next -- split() always yields ≥1 element, so pop() is never undefined; the ?? '' is defensive. */\n this.buffer = lines.pop() ?? '';\n\n for (const raw of lines) {\n if (!raw.trim()) continue;\n try {\n this.dispatch(JSON.parse(raw) as ACPMessage);\n } catch (err) {\n this.stderr.write(`[wstack-acp parse error] ${err}\\n`, 'utf8');\n }\n }\n }\n\n private dispatch(msg: ACPMessage): void {\n if (this.resolveRead) {\n const resolve = this.resolveRead;\n this.resolveRead = null;\n resolve(msg);\n } else {\n this.messageQueue.push(msg);\n }\n for (const handler of this.handlers) {\n try {\n handler(msg);\n } catch (err) {\n this.stderr.write(`[wstack-acp handler error] ${err}\\n`, 'utf8');\n }\n }\n }\n\n private handleClose(): void {\n this.closed = true;\n this.resolveRead?.(null);\n this.resolveRead = null;\n }\n\n private failAll(err: Error): void {\n this.stderr.write(`[wstack-acp stdin error] ${err.message}\\n`, 'utf8');\n this.close();\n }\n}\n\n// ---------------------------------------------------------------------------\n// ClientTransport — spawns a child ACP agent process (DIR-1)\n// ---------------------------------------------------------------------------\n\nimport type { EventEmitter } from 'node:events';\n\nexport interface ClientTransportOptions {\n command: string;\n args?: string[] | undefined;\n env?: Record<string, string>;\n cwd?: string | undefined;\n handshakeTimeoutMs?: number | undefined;\n /**\n * Set to true when the child is an external ACP agent (Claude Code,\n * Gemini CLI, Codex CLI, …) that does NOT emit a `[wstack-acp]\\n`\n * marker on startup. The v1 client (`ACPSession`) sets this; the\n * server-side transport (the default) keeps the marker check.\n */\n skipHandshakeMarker?: boolean | undefined;\n}\n\nexport interface ACPChildProcess extends EventEmitter {\n stdout: NodeJS.ReadableStream;\n stdin: NodeJS.WritableStream;\n stderr: NodeJS.ReadableStream;\n pid: number | undefined;\n kill(): void;\n}\n\nexport class ClientTransport {\n private child: ACPChildProcess | null = null;\n private buffer = '';\n private readonly handlers = new Set<(msg: ACPMessage) => void>();\n private closed = false;\n private resolveRead: ((msg: ACPMessage | null) => void) | null = null;\n private messageQueue: ACPMessage[] = [];\n private readonly opts: Required<Pick<ClientTransportOptions, 'handshakeTimeoutMs'>> &\n ClientTransportOptions;\n\n constructor(options: ClientTransportOptions) {\n this.opts = {\n handshakeTimeoutMs: 30_000,\n ...options,\n };\n }\n\n async start(): Promise<void> {\n if (this.child) return;\n const [{ spawn }, { buildChildEnv }] = await Promise.all([\n import('node:child_process'),\n import('@wrongstack/core'),\n ]);\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(\n new Error(`ACP child process failed to start within ${this.opts.handshakeTimeoutMs}ms`),\n );\n }, this.opts.handshakeTimeoutMs);\n\n try {\n this.child = spawn(this.opts.command, this.opts.args ?? [], {\n env: { ...buildChildEnv(), ...this.opts.env },\n cwd: this.opts.cwd,\n stdio: ['pipe', 'pipe', 'pipe'],\n windowsHide: true,\n // On Windows, most ACP-supporting tools (claude, gemini, codex,\n // qwen, copilot) are installed as `.cmd` shims under\n // AppData\\Roaming\\npm\\. Node's spawn won't find them via\n // `shell: false` because the .cmd extension is not in the\n // default PATHEXT lookup. The argv here is always from our\n // own static catalog or from a hardcoded spec, never from\n // user input, so shell-expansion is bounded.\n shell: process.platform === 'win32',\n }) as never as ACPChildProcess;\n /* v8 ignore start -- spawn() throwing synchronously is a defensive guard (e.g. argv0 type errors); the realistic async failure path is the child 'error' event, covered by tests. */\n } catch (err) {\n clearTimeout(timeout);\n reject(err);\n return;\n }\n /* v8 ignore stop */\n\n const child = this.child;\n\n child.stdout.setEncoding('utf8');\n\n const onReady = (): void => {\n child.stdout.on('data', (c: string) => this.onChildData(c));\n child.stderr.on('data', (c: string) => this.onChildError(c));\n child.on('close', (code: number | null) => this.onChildClose(code));\n clearTimeout(timeout);\n resolve();\n };\n\n if (this.opts.skipHandshakeMarker) {\n // External ACP agents don't emit a startup marker — they're\n // ready to accept JSON-RPC immediately. Resolve as soon as\n // the child process is spawned and stdout is flowing.\n onReady();\n return;\n }\n\n const waitForMarker = (chunk: string) => {\n this.buffer += chunk;\n const idx = this.buffer.indexOf('[wstack-acp]\\n');\n if (idx !== -1) {\n this.buffer = this.buffer.slice(idx + '[wstack-acp]\\n'.length);\n child.stdout.removeListener('data', waitForMarker);\n onReady();\n }\n };\n\n child.stdout.on('data', waitForMarker);\n child.stdout.on('error', (err: Error) => {\n clearTimeout(timeout);\n reject(err);\n });\n child.on('error', (err: Error) => {\n clearTimeout(timeout);\n reject(err);\n });\n });\n }\n\n send(msg: ACPMessage): Promise<void> {\n if (!this.child) return Promise.reject(new Error('ClientTransport not started'));\n return new Promise((resolve, reject) => {\n const line = JSON.stringify(msg) + '\\n';\n this.child?.stdin.write(line, 'utf8', (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n read(): Promise<ACPMessage | null> {\n if (this.messageQueue.length > 0) return Promise.resolve(expectDefined(this.messageQueue.shift()));\n if (this.closed) return Promise.resolve(null);\n return new Promise((resolve) => {\n this.resolveRead = resolve;\n });\n }\n\n onMessage(handler: (msg: ACPMessage) => void): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n stop(): void {\n if (!this.child) return;\n this.closed = true;\n try {\n this.child.kill();\n } catch {\n // already dead\n }\n this.child = null;\n }\n\n private onChildData(chunk: string): void {\n this.buffer += chunk;\n const lines = this.buffer.split('\\n');\n /* v8 ignore next -- split() always yields ≥1 element, so pop() is never undefined; the ?? '' is defensive. */\n this.buffer = lines.pop() ?? '';\n\n for (const raw of lines) {\n if (!raw.trim()) continue;\n try {\n this.dispatch(JSON.parse(raw) as ACPMessage);\n } catch {\n // skip malformed\n }\n }\n }\n\n private onChildError(chunk: string): void {\n writeErr(`[acp-child stderr] ${chunk}`);\n }\n\n private onChildClose(code: number | null): void {\n this.closed = true;\n this.resolveRead?.(null);\n this.resolveRead = null;\n if (code !== 0 && code !== null) {\n writeErr(`[acp-child exited with code ${code}]\\n`);\n }\n }\n\n private dispatch(msg: ACPMessage): void {\n if (this.resolveRead) {\n const resolve = this.resolveRead;\n this.resolveRead = null;\n resolve(msg);\n } else {\n this.messageQueue.push(msg);\n }\n for (const handler of this.handlers) {\n try {\n handler(msg);\n } catch {\n // non-fatal\n }\n }\n }\n}\n","/**\n * Tools registry for ACP agent-side.\n *\n * Translates WrongStack Tool definitions → ACP ACPToolDefinition format.\n * Provides tool lookup and result assembly for the ACP protocol handler.\n */\nimport type {Tool} from '@wrongstack/core';\nimport type {\n ACPToolDefinition,\n ACPToolList,\n ACPInputSchema,\n ACPToolResult,\n ContentBlock,\n} from '../types/acp-messages.js';\n\nexport class ACPToolsRegistry {\n private tools = new Map<string, Tool>();\n private readonly owner: string;\n\n constructor(owner = 'wrongstack') {\n this.owner = owner;\n }\n\n /**\n * Register one or more tools.\n * Throws on duplicate name unless force=true.\n */\n register(tools: Tool[]): void {\n for (const tool of tools) {\n this.tools.set(tool.name, tool);\n }\n }\n\n /**\n * Replace the current tool set.\n */\n setTools(tools: Tool[]): void {\n this.tools.clear();\n for (const tool of tools) this.tools.set(tool.name, tool);\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n list(): Tool[] {\n return Array.from(this.tools.values());\n }\n\n /** Build the ACP tools/list payload from registered tools. */\n buildToolList(): ACPToolList {\n return {\n tools: Array.from(this.tools.values()).map((t) =>\n toACPToolDefinition(t, this.owner),\n ),\n };\n }\n\n /**\n * Execute a tool by name and return ACP-formatted result.\n * Returns null if the tool is not found.\n */\n async execute(\n name: string,\n args: Record<string, unknown>,\n ctx: unknown,\n signal: AbortSignal,\n ): Promise<ACPToolResult | null> {\n const tool = this.tools.get(name);\n if (!tool) return null;\n\n try {\n const result = await tool.execute(args, ctx as Parameters<Tool['execute']>[1], {\n signal,\n });\n return toACPToolResult(result);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {content: [{type: 'text', text: msg}], isError: true} satisfies ACPToolResult;\n }\n }\n}\n\n/** Convert a WrongStack Tool → ACP ACPToolDefinition */\nfunction toACPToolDefinition(tool: Tool, _owner: string): ACPToolDefinition {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: toACPInputSchema(tool.inputSchema),\n annotations: {\n title: tool.name,\n description: tool.usageHint ?? tool.description,\n priority: toolToPriority(tool),\n alwaysAccept: tool.permission === 'auto',\n },\n };\n}\n\n/** Minimal JSON Schema → ACP input schema. ACP uses JSON Schema draft-07. */\nfunction toACPInputSchema(src: unknown): ACPInputSchema {\n if (!src || typeof src !== 'object') {\n return {};\n }\n const s = src as Record<string, unknown>;\n const out: ACPInputSchema = {};\n if (typeof s.type === 'string') out.type = s.type;\n if (Array.isArray(s.enum)) out.enum = s.enum;\n if (typeof s.description === 'string') out.description = s.description;\n if ('default' in s) out.default = s.default;\n if (typeof s.minimum === 'number') out.minimum = s.minimum;\n if (typeof s.maximum === 'number') out.maximum = s.maximum;\n if (s.items) out.items = toACPInputSchema(s.items);\n\n // Recursively convert properties\n if (s.properties && typeof s.properties === 'object') {\n const props: Record<string, ACPInputSchema> = {};\n for (const [k, v] of Object.entries(s.properties as Record<string, unknown>)) {\n props[k] = toACPInputSchema(v);\n }\n out.properties = props;\n if (Array.isArray(s.required)) out.required = s.required as string[];\n }\n\n return out;\n}\n\n/** Convert a WrongStack ToolResult → ACP ContentBlock[] */\nfunction toACPToolResult(result: unknown): ACPToolResult {\n const blocks: ContentBlock[] = [];\n\n if (result === undefined || result === null) {\n return {content: [{type: 'text', text: 'ok'}]};\n }\n\n if (typeof result === 'string') {\n blocks.push({type: 'text', text: result});\n } else if (typeof result === 'object') {\n blocks.push({type: 'text', text: JSON.stringify(result, null, 2)});\n } else {\n blocks.push({type: 'text', text: String(result)});\n }\n\n return {content: blocks};\n}\n\nfunction toolToPriority(tool: Tool): 'high' | 'medium' | 'low' {\n if (tool.riskTier === 'destructive') return 'high';\n if (tool.riskTier === 'standard' || tool.permission === 'confirm') return 'medium';\n return 'low';\n}\n","/**\n * ACP v1 type definitions — Agent Client Protocol, stable v1 spec.\n *\n * Scope: discriminated union for the `session/update` notification payload\n * (the `update` field of a `session/update` JSON-RPC notification), plus the\n * subset of supporting types it depends on.\n *\n * Spec: https://agentclientprotocol.com/protocol/v1/overview\n *\n * Design notes\n * ────────────\n * • The stable v1 spec defines 11 `sessionUpdate` discriminator values. We\n * type exactly those 11, plus an `_unstable_*` escape hatch for v2-RFD\n * kinds (e.g. `next_edit_suggestions`, `elicitation`) that real agents\n * may emit before the spec stabilises them, and an `unknown` fallback for\n * everything else. We do NOT synthesise 32 fake variants to match a\n * number cited in passing — the union is honest about the surface.\n *\n * • Per the spec's conventions, discriminator values use snake_case. The\n * property keys inside each variant are camelCase (the JSON-RPC envelope\n * is JSON-RPC 2.0, everything else is camelCase unless the spec says\n * otherwise).\n *\n * • Optional fields that the spec marks optional are marked `?:`. Required\n * fields have no `?`. We do not include spec fields the spec marks\n * \"SHOULD NOT\" or \"reserved\".\n *\n * • The existing `acp-messages.ts` types describe an older draft of the\n * protocol (string `protocolVersion: '2024-11'`, fake `tools/call`\n * method, etc.). Do NOT import from it here — `acp-v1.ts` is\n * self-contained so the new code path can be reviewed in isolation and\n * deleted wholesale if the rewrite is ever reverted.\n */\n\n// ────────────────────────────────────────────────────────────────────────────\n// Shared building blocks\n// ────────────────────────────────────────────────────────────────────────────\n\n/** Stable protocol version (integer per the spec, not a date-string). */\nexport const ACP_PROTOCOL_VERSION = 1 as const;\nexport type ACPProtocolVersion = typeof ACP_PROTOCOL_VERSION;\n\n/** Per the spec: opaque, unique id. We type as branded string. */\nexport type SessionId = string & { readonly __acpSessionId: unique symbol };\nexport type ToolCallId = string & { readonly __acpToolCallId: unique symbol };\nexport type MessageId = string & { readonly __acpMessageId: unique symbol };\nexport type TerminalId = string & { readonly __acpTerminalId: unique symbol };\nexport type PlanEntryId = string & { readonly __acpPlanEntryId: unique symbol };\n\n// ────────────────────────────────────────────────────────────────────────────\n// Content blocks — reused from MCP per the spec\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Annotations attached to a content block. Optional, agent-supplied hint\n * about audience/priority. Spec leaves shape open; we mirror the fields\n * the spec shows in its examples.\n */\nexport interface ContentAnnotations {\n audience?: ('user' | 'assistant')[] | undefined;\n priority?: number | undefined;\n [key: string]: unknown;\n}\n\nexport interface TextContent {\n type: 'text';\n text: string;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport interface ImageContent {\n type: 'image';\n mimeType: string;\n /** Base64-encoded image data. */\n data: string;\n uri?: string | undefined;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport interface AudioContent {\n type: 'audio';\n mimeType: string;\n /** Base64-encoded audio data. */\n data: string;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport interface TextResourceContents {\n uri: string;\n mimeType?: string | undefined;\n text: string;\n}\n\nexport interface BlobResourceContents {\n uri: string;\n mimeType?: string | undefined;\n /** Base64-encoded binary. */\n blob: string;\n}\n\nexport type EmbeddedResourceContents = TextResourceContents | BlobResourceContents;\n\nexport interface EmbeddedResourceContent {\n type: 'resource';\n resource: EmbeddedResourceContents;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport interface ResourceLinkContent {\n type: 'resource_link';\n uri: string;\n name: string;\n mimeType?: string | undefined;\n title?: string | undefined;\n description?: string | undefined;\n size?: number | undefined;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport type ContentBlock =\n | TextContent\n | ImageContent\n | AudioContent\n | EmbeddedResourceContent\n | ResourceLinkContent;\n\n// ────────────────────────────────────────────────────────────────────────────\n// Tool calls\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type ToolKind =\n | 'read'\n | 'edit'\n | 'delete'\n | 'move'\n | 'search'\n | 'execute'\n | 'think'\n | 'fetch'\n | 'switch_mode'\n | 'other';\n\nexport type ToolCallStatus = 'pending' | 'in_progress' | 'completed' | 'failed';\n\n/** A single concrete content payload attached to a tool call. */\nexport type ToolCallContent =\n | { type: 'content'; content: ContentBlock }\n | {\n type: 'diff';\n path: string;\n oldText: string | null;\n newText: string;\n }\n | { type: 'terminal'; terminalId: TerminalId };\n\nexport interface ToolCallLocation {\n path: string;\n /** 1-based per the spec's argument requirements. */\n line?: number | undefined;\n}\n\nexport interface ToolCall {\n toolCallId: ToolCallId;\n title: string;\n kind?: ToolKind | undefined;\n status?: ToolCallStatus | undefined;\n content?: ToolCallContent[] | undefined;\n locations?: ToolCallLocation[] | undefined;\n rawInput?: Record<string, unknown> | undefined;\n rawOutput?: Record<string, unknown> | undefined;\n}\n\n/**\n * Partial update of a previously-emitted tool call. All fields except\n * `toolCallId` are optional — only the changed fields are included.\n * Declared standalone (not `extends ToolCall`) because `title` is required\n * on `ToolCall` but optional here; the structural variance is the point.\n */\nexport interface ToolCallUpdateFields {\n toolCallId: ToolCallId;\n status?: ToolCallStatus | undefined;\n content?: ToolCallContent[] | undefined;\n title?: string | undefined;\n kind?: ToolKind | undefined;\n locations?: ToolCallLocation[] | undefined;\n rawInput?: Record<string, unknown> | undefined;\n rawOutput?: Record<string, unknown> | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Plan\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type PlanEntryPriority = 'high' | 'medium' | 'low';\nexport type PlanEntryStatus = 'pending' | 'in_progress' | 'completed';\n\nexport interface PlanEntry {\n /** Required by the spec for the array shape, but per-entry id is optional. */\n content: string;\n priority: PlanEntryPriority;\n status: PlanEntryStatus;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Slash commands\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface AvailableCommandInput {\n hint: string;\n}\n\nexport interface AvailableCommand {\n name: string;\n description: string;\n input?: AvailableCommandInput | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Session modes\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type SessionModeId = string & { readonly __acpModeId: unique symbol };\n\nexport interface SessionMode {\n id: SessionModeId;\n name: string;\n description?: string | undefined;\n}\n\nexport interface SessionModeState {\n currentModeId: SessionModeId;\n availableModes: SessionMode[];\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Config options\n// ────────────────────────────────────────────────────────────────────────────\n\n/** Reserved spec categories. Underscore-prefixed names are free for custom use. */\nexport type ConfigOptionCategory =\n | 'mode'\n | 'model'\n | 'thought_level'\n | `_${string}`;\n\nexport type ConfigOptionType = 'select' | string;\n\nexport interface ConfigOptionValue {\n value: string;\n name: string;\n description?: string | undefined;\n}\n\nexport interface ConfigOption {\n id: string;\n name: string;\n description?: string | undefined;\n category?: ConfigOptionCategory | undefined;\n type: ConfigOptionType;\n currentValue: string;\n options: ConfigOptionValue[];\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Session info\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface SessionInfo {\n sessionId: SessionId;\n cwd: string;\n title?: string | undefined;\n updatedAt?: string | undefined;\n /** Agent-supplied extension metadata; opaque to clients. */\n _meta?: Record<string, unknown> | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Usage (token / cost) updates\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface UsageCost {\n amount: number;\n /** ISO 4217 currency code, e.g. \"USD\". */\n currency: string;\n}\n\nexport interface UsageUpdate {\n /** Tokens used in the current session context. Required, non-null. */\n used: number;\n /** Total context window size in tokens. Required, non-null. */\n size: number;\n cost?: UsageCost | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Permission requests\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type PermissionOptionKind =\n | 'allow_once'\n | 'allow_always'\n | 'reject_once'\n | 'reject_always';\n\nexport interface PermissionOption {\n optionId: string;\n name: string;\n kind: PermissionOptionKind;\n}\n\nexport type RequestPermissionOutcome =\n | { outcome: 'cancelled' }\n | { outcome: 'selected'; optionId: string };\n\n// ────────────────────────────────────────────────────────────────────────────\n// Stop reasons\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type StopReason =\n | 'end_turn'\n | 'max_tokens'\n | 'max_turn_requests'\n | 'refusal'\n | 'cancelled'\n | string;\n\n// ────────────────────────────────────────────────────────────────────────────\n// SessionUpdate — the discriminated union\n// ────────────────────────────────────────────────────────────────────────────\n\n/** Stable v1 variants. The spec currently defines exactly 11. */\nexport type SessionUpdate =\n | UserMessageChunkUpdate\n | AgentMessageChunkUpdate\n | ThoughtChunkUpdate\n | ToolCallUpdateUpdate\n | ToolCallUpdateNotification\n | PlanUpdate\n | AvailableCommandsUpdate\n | CurrentModeUpdate\n | ConfigOptionUpdate\n | SessionInfoUpdate\n | UsageUpdateUpdate;\n\n// --- Streaming message chunks -----------------------------------------------\n\nexport interface UserMessageChunkUpdate {\n sessionUpdate: 'user_message_chunk';\n messageId?: MessageId | undefined;\n content: ContentBlock;\n}\n\nexport interface AgentMessageChunkUpdate {\n sessionUpdate: 'agent_message_chunk';\n messageId?: MessageId | undefined;\n content: ContentBlock;\n}\n\nexport interface ThoughtChunkUpdate {\n sessionUpdate: 'thought_chunk';\n messageId?: MessageId | undefined;\n content: ContentBlock;\n}\n\n// --- Tool calls ------------------------------------------------------------\n\n/** First notification for a new tool call. */\nexport interface ToolCallUpdateUpdate {\n sessionUpdate: 'tool_call';\n toolCallId: ToolCallId;\n title: string;\n kind?: ToolKind | undefined;\n status?: ToolCallStatus | undefined;\n content?: ToolCallContent[] | undefined;\n locations?: ToolCallLocation[] | undefined;\n rawInput?: Record<string, unknown> | undefined;\n}\n\n/** Subsequent updates to a previously-emitted tool call. */\nexport interface ToolCallUpdateNotification {\n sessionUpdate: 'tool_call_update';\n toolCallId: ToolCallId;\n status?: ToolCallStatus | undefined;\n content?: ToolCallContent[] | undefined;\n title?: string | undefined;\n kind?: ToolKind | undefined;\n locations?: ToolCallLocation[] | undefined;\n rawInput?: Record<string, unknown> | undefined;\n rawOutput?: Record<string, unknown> | undefined;\n}\n\n// --- Plan ------------------------------------------------------------------\n\nexport interface PlanUpdate {\n sessionUpdate: 'plan';\n entries: PlanEntry[];\n}\n\n// --- Commands / modes / config ---------------------------------------------\n\nexport interface AvailableCommandsUpdate {\n sessionUpdate: 'available_commands_update';\n availableCommands: AvailableCommand[];\n}\n\nexport interface CurrentModeUpdate {\n sessionUpdate: 'current_mode_update';\n modeId: SessionModeId;\n}\n\nexport interface ConfigOptionUpdate {\n sessionUpdate: 'config_option_update';\n configOptions: ConfigOption[];\n}\n\n// --- Session metadata ------------------------------------------------------\n\nexport interface SessionInfoUpdate {\n sessionUpdate: 'session_info_update';\n title?: string | null | undefined;\n updatedAt?: string | null | undefined;\n _meta?: Record<string, unknown> | undefined;\n}\n\n// --- Usage -----------------------------------------------------------------\n\nexport interface UsageUpdateUpdate {\n sessionUpdate: 'usage_update';\n used: number;\n size: number;\n cost?: UsageCost | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Escape hatches: unknown / unstable\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Escape hatch for v2-RFD `sessionUpdate` kinds that have been published\n * but are not yet stabilised in the v1 spec. Examples seen in the wild:\n * `next_edit_suggestions`, `elicitation`, `proxy_extension`. We surface\n * the raw payload so forward-compat code can switch on\n * `kind === 'next_edit_suggestions'` etc. without losing the data.\n */\nexport interface UnstableSessionUpdate {\n sessionUpdate: `_unstable_${string}`;\n [key: string]: unknown;\n}\n\n/**\n * Last-resort variant: the agent sent a discriminator string we don't\n * recognise at all. The full payload is preserved as a record so consumers\n * can still log/inspect it. Prefer matching the known variants first.\n */\nexport interface UnknownSessionUpdate {\n sessionUpdate: string;\n [key: string]: unknown;\n}\n\n/** The full union, including escape hatches. */\nexport type AnySessionUpdate = SessionUpdate | UnstableSessionUpdate | UnknownSessionUpdate;\n\n// ────────────────────────────────────────────────────────────────────────────\n// Top-level notification envelope\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface SessionUpdateNotification {\n jsonrpc?: '2.0' | undefined;\n method: 'session/update';\n params: {\n sessionId: SessionId;\n update: AnySessionUpdate;\n };\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Type guards\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Exhaustiveness helper. Call from the `default:` branch of a switch on\n * `sessionUpdate` to get a compile-time error when a new variant is added\n * without updating the consumer.\n */\nexport function assertNeverSessionUpdate(x: never): never {\n throw new Error(\n `Unhandled sessionUpdate: ${JSON.stringify(x)}`,\n );\n}\n","/**\n * ACP v1 server-side protocol handler.\n *\n * Receives JSON-RPC requests from an external ACP client (Zed, JetBrains\n * Junie, VS Code ACP extension, etc.) over stdio and answers them per the\n * v1 spec. See https://agentclientprotocol.com/protocol/v1/overview.\n *\n * Supported methods\n * ─────────────────\n * - initialize — handshake\n * - authenticate — optional, no-op when auth isn't required\n * - session/new — create a session\n * - session/load — restore a session by id\n * - session/prompt — run one turn, stream session/update\n * notifications, return stopReason\n * - session/cancel — notification (no response); cancels the\n * in-flight turn on the target session\n * - session/set_mode — change the active mode for a session\n * - session/set_config_option — change a config option value\n * - session/list — list known sessions\n *\n * Method execution\n * ────────────────\n * The handler is transport-agnostic; it sends responses via the\n * `AgentServerTransport` injected at construction. The actual\n * agent-loop work for a `session/prompt` turn is delegated to the\n * caller-provided `runTurn` callback, which receives the prompt\n * blocks and the per-turn AbortSignal and resolves with the final\n * stopReason. Updates are streamed via the `emit` callback passed\n * to `runTurn`; the handler wraps each as a `session/update`\n * notification.\n *\n * This separation keeps the handler unit-testable: tests can supply\n * a fake `runTurn` that yields a canned sequence of updates, and\n * assert on the JSON-RPC traffic the handler produces. A real\n * production caller wires `runTurn` to a core `Agent` instance.\n *\n * Concurrency\n * ───────────\n * Each session is single-threaded (one active turn at a time). The\n * handler keeps a per-session AbortController so a `session/cancel`\n * notification can stop the running turn mid-stream without tearing\n * down the session. Multiple sessions can be active concurrently.\n */\nimport { ACP_PROTOCOL_VERSION, type StopReason, type ContentBlock, type PlanEntry, type UsageCost } from '../types/acp-v1.js';\nimport type { AgentServerTransport } from './stdio-transport.js';\nimport type { ACPMessage } from '../types/acp-messages.js';\n\n// Transport's `send` is typed `ACPMessage` which predates v1 and\n// doesn't carry a `jsonrpc` field. The runtime is fine — the\n// transport just `JSON.stringify`s the message — so cast at the\n// boundary.\ntype WireMessage = { jsonrpc?: '2.0'; id?: string | number; method?: string; params?: unknown; result?: unknown; error?: unknown };\nfunction toWire(msg: WireMessage): ACPMessage {\n return msg as never as ACPMessage;\n}\n\nexport const WRONGSTACK_VERSION = '0.263.0';\n\n/** What kinds of content the agent accepts in a prompt. */\nexport interface PromptCapabilities {\n image: boolean;\n audio: boolean;\n embeddedContext: boolean;\n}\n\nexport interface AgentCapabilities {\n loadSession: boolean;\n promptCapabilities: PromptCapabilities;\n}\n\nexport interface RunTurnInput {\n sessionId: string;\n /** Content blocks the client sent. */\n prompt: readonly ContentBlock[];\n /** Cancelled when the client sends `session/cancel` for this session. */\n signal: AbortSignal;\n}\n\nexport interface RunTurnResult {\n stopReason: StopReason;\n /** Optional summary text the agent produced. */\n text?: string;\n plan?: PlanEntry[];\n usage?: { used: number; size: number; cost?: UsageCost | undefined };\n}\n\n/**\n * The agent's per-turn work. Streams `SessionUpdate` notifications to\n * `emit` and resolves with the final stopReason. Errors thrown from\n * this iterable are converted to a `prompt_failed` JSON-RPC error.\n */\nexport type RunTurn = (\n input: RunTurnInput,\n emit: (update: unknown) => void,\n) => Promise<RunTurnResult>;\n\nexport interface SessionState {\n id: string;\n cwd: string;\n /** Per-turn abort signal — aborted when the session is cancelled or closed. */\n abort: AbortController;\n /** Active mode, advertised to the client in current_mode_update. */\n modeId: string;\n /** Created at, for session/list ordering. */\n createdAt: string;\n /** Last activity timestamp, for session/info_update. */\n updatedAt: string;\n /** Optional human title. */\n title?: string;\n}\n\n/** MCP-style session mode advertised in current_mode_update. */\nexport interface SessionMode {\n id: string;\n name: string;\n description?: string | undefined;\n}\n\nexport interface SessionConfigOption {\n id: string;\n name: string;\n type: 'select' | string;\n currentValue: string;\n options: { value: string; name: string; description?: string | undefined }[];\n}\n\nexport interface ProtocolHandlerOptions {\n transport: AgentServerTransport;\n /** Where the server is running; used for new sessions' default cwd. */\n defaultCwd: string;\n /** Agent's per-turn implementation. */\n runTurn: RunTurn;\n /**\n * Optional callbacks for the lifecycle events the server should\n * surface to the client. All default to no-ops.\n */\n onSessionNew?: ((state: SessionState) => void) | undefined;\n /** Static list of available modes (advertised to clients). */\n modes?: readonly SessionMode[] | undefined;\n /** Static list of config options. */\n configOptions?: readonly SessionConfigOption[] | undefined;\n /** Agent name advertised in initialize. */\n agentName?: string | undefined;\n}\n\n/** Single global mode id, sufficient for v1. */\nconst DEFAULT_MODE_ID = 'code';\n\nconst DEFAULT_MODES: readonly SessionMode[] = [\n {\n id: DEFAULT_MODE_ID,\n name: 'Code',\n description: 'Default agent mode for code-generation tasks.',\n },\n];\n\nexport class ACPProtocolHandler {\n private readonly transport: AgentServerTransport;\n private readonly defaultCwd: string;\n private readonly runTurn: RunTurn;\n private readonly onSessionNew: (state: SessionState) => void;\n private readonly modes: readonly SessionMode[];\n private readonly configOptions: readonly SessionConfigOption[];\n private readonly agentName: string;\n\n private initialized = false;\n private readonly sessions = new Map<string, SessionState>();\n private nextId = 1;\n\n constructor(opts: ProtocolHandlerOptions) {\n this.transport = opts.transport;\n this.defaultCwd = opts.defaultCwd;\n this.runTurn = opts.runTurn;\n this.onSessionNew = opts.onSessionNew ?? (() => {});\n this.modes = opts.modes ?? DEFAULT_MODES;\n this.configOptions = opts.configOptions ?? [];\n this.agentName = opts.agentName ?? 'wrongstack';\n }\n\n /**\n * Process one inbound message. Returns true if this was a terminal\n * message (rare; reserved for future use by the server's own\n * shutdown signal).\n */\n async handleMessage(msg: unknown): Promise<boolean> {\n if (typeof msg !== 'object' || msg === null) return false;\n const m = msg as { id?: unknown; method?: unknown; params?: unknown; result?: unknown; error?: unknown };\n\n // Response (we never initiate requests, but be defensive).\n if (m.id !== undefined && (m.result !== undefined || m.error !== undefined)) {\n return false;\n }\n\n // Request (has id, has method, no result/error)\n if (m.id !== undefined && typeof m.method === 'string') {\n return this.handleRequest(m.id as string | number, m.method, m.params);\n }\n\n // Notification (no id, has method)\n if (typeof m.method === 'string') {\n return this.handleNotification(m.method, m.params);\n }\n\n return false;\n }\n\n /** Abort all active turns and drop session state. */\n close(): void {\n for (const [, session] of this.sessions) {\n session.abort.abort();\n }\n this.sessions.clear();\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Requests\n // ────────────────────────────────────────────────────────────────────\n\n private async handleRequest(\n id: string | number,\n method: string,\n params: unknown,\n ): Promise<boolean> {\n // The only method allowed before initialize is `initialize` itself.\n if (method !== 'initialize' && !this.initialized) {\n await this.sendError(id, -32000, 'Not initialized');\n return false;\n }\n\n try {\n switch (method) {\n case 'initialize':\n return await this.handleInitialize(id, params);\n case 'authenticate':\n return await this.handleAuthenticate(id, params);\n case 'session/new':\n return await this.handleSessionNew(id, params);\n case 'session/load':\n return await this.handleSessionLoad(id, params);\n case 'session/prompt':\n return await this.handleSessionPrompt(id, params);\n case 'session/set_mode':\n return await this.handleSetMode(id, params);\n case 'session/set_config_option':\n return await this.handleSetConfigOption(id, params);\n case 'session/list':\n return await this.handleSessionList(id);\n default:\n await this.sendError(id, -32601, `Unknown method: ${method}`);\n return false;\n }\n } catch (err) {\n const { code, message, data } = errorToJsonRpc(err);\n await this.sendError(id, code, message, data);\n return false;\n }\n }\n\n private async handleInitialize(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { protocolVersion?: unknown };\n const requested = typeof p.protocolVersion === 'number' ? p.protocolVersion : 1;\n if (requested !== ACP_PROTOCOL_VERSION) {\n // v1 spec: \"If the client requests a different protocol version, the\n // agent SHOULD respond with an error and the version it supports.\"\n await this.sendError(\n id,\n -32000,\n `server speaks protocolVersion=${ACP_PROTOCOL_VERSION}, client requested ${requested}`,\n );\n return false;\n }\n this.initialized = true;\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {\n protocolVersion: ACP_PROTOCOL_VERSION,\n agentCapabilities: {\n loadSession: true,\n promptCapabilities: {\n image: false,\n audio: false,\n embeddedContext: true,\n },\n },\n agentInfo: {\n name: this.agentName,\n title: 'WrongStack',\n version: WRONGSTACK_VERSION,\n },\n // Static options advertised at handshake. They are also\n // re-sent on every `current_mode_update` / `config_option_update`\n // notification so late-joining clients see them.\n authMethods: [],\n modes: this.modes,\n configOptions: this.configOptions,\n },\n }));\n return false;\n }\n\n private async handleAuthenticate(id: string | number, _params: unknown): Promise<boolean> {\n // WrongStack doesn't currently require auth. Per spec, a server\n // MAY respond with an unauthenticated outcome to tell the client\n // to proceed without credentials.\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: { outcome: 'unauthenticated' },\n }));\n return false;\n }\n\n private async handleSessionNew(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { cwd?: unknown; mcpServers?: unknown };\n const cwd = typeof p.cwd === 'string' ? p.cwd : this.defaultCwd;\n const sessionId = `sess_${this.allocId()}`;\n const now = new Date().toISOString();\n const state: SessionState = {\n id: sessionId,\n cwd,\n abort: new AbortController(),\n modeId: DEFAULT_MODE_ID,\n createdAt: now,\n updatedAt: now,\n };\n this.sessions.set(sessionId, state);\n this.onSessionNew(state);\n\n // Per spec, the server MAY emit current_mode_update /\n // config_option_update / available_commands_update notifications\n // immediately after session/new to populate the client UI. We do.\n await this.sendNotification({\n sessionId,\n update: {\n sessionUpdate: 'current_mode_update',\n modeId: this.modes[0]?.id ?? DEFAULT_MODE_ID,\n },\n });\n if (this.configOptions.length > 0) {\n await this.sendNotification({\n sessionId,\n update: {\n sessionUpdate: 'config_option_update',\n configOptions: [...this.configOptions],\n },\n });\n }\n\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {\n sessionId,\n modes: this.modes,\n configOptions: this.configOptions,\n },\n }));\n return false;\n }\n\n private async handleSessionLoad(id: string | number, params: unknown): Promise<boolean> {\n // v1 spec: \"If `loadSession: true` is not in the agent's\n // capabilities, the client SHOULD NOT call this method.\" We\n // declared loadSession: true in initialize, so we accept it.\n // We don't persist sessions across restarts yet — for now,\n // session/load is a no-op alias of session/new.\n return this.handleSessionNew(id, params);\n }\n\n private async handleSessionPrompt(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown; prompt?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n if (!sessionId || !this.sessions.has(sessionId)) {\n await this.sendError(id, -32000, 'unknown or missing sessionId');\n return false;\n }\n if (!Array.isArray(p.prompt)) {\n await this.sendError(id, -32602, 'prompt must be an array of content blocks');\n return false;\n }\n const session = this.sessions.get(sessionId)!;\n\n // If the previous turn was cancelled, recreate the AbortController\n // so a stale signal doesn't cancel the new turn.\n if (session.abort.signal.aborted) {\n session.abort = new AbortController();\n }\n\n const turnSignal = new AbortController();\n // Forward session/cancel notifications to the turn's signal.\n const onCancel = (): void => turnSignal.abort();\n session.abort.signal.addEventListener('abort', onCancel, { once: true });\n\n let result: RunTurnResult;\n try {\n result = await this.runTurn(\n { sessionId, prompt: p.prompt as ContentBlock[], signal: turnSignal.signal },\n (update) => this.sendNotification({ sessionId, update }),\n );\n } catch (err) {\n session.abort.signal.removeEventListener('abort', onCancel);\n const { code, message, data } = errorToJsonRpc(err);\n await this.sendError(id, code, message, data);\n return false;\n }\n session.abort.signal.removeEventListener('abort', onCancel);\n session.updatedAt = new Date().toISOString();\n\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: { stopReason: result.stopReason },\n }));\n return false;\n }\n\n private async handleSetMode(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown; modeId?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const modeId = typeof p.modeId === 'string' ? p.modeId : null;\n const session = sessionId ? this.sessions.get(sessionId) : undefined;\n if (!session || !modeId || !this.modes.some((m) => m.id === modeId)) {\n await this.sendError(id, -32602, 'invalid sessionId or modeId');\n return false;\n }\n session.modeId = modeId;\n session.updatedAt = new Date().toISOString();\n await this.sendNotification({\n sessionId,\n update: { sessionUpdate: 'current_mode_update', modeId },\n });\n await this.transport.send(toWire({ jsonrpc: '2.0', id, result: {} }));\n return false;\n }\n\n private async handleSetConfigOption(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown; configOptionId?: unknown; value?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const optionId = typeof p.configOptionId === 'string' ? p.configOptionId : null;\n const value = typeof p.value === 'string' ? p.value : null;\n const session = sessionId ? this.sessions.get(sessionId) : undefined;\n const option = optionId ? this.configOptions.find((o) => o.id === optionId) : undefined;\n if (!session || !option || value === null || !option.options.some((o) => o.value === value)) {\n await this.sendError(id, -32602, 'invalid sessionId, configOptionId, or value');\n return false;\n }\n option.currentValue = value;\n session.updatedAt = new Date().toISOString();\n await this.sendNotification({\n sessionId,\n update: {\n sessionUpdate: 'config_option_update',\n configOptions: [...this.configOptions],\n },\n });\n await this.transport.send(toWire({ jsonrpc: '2.0', id, result: {} }));\n return false;\n }\n\n private async handleSessionList(id: string | number): Promise<boolean> {\n const sessions = Array.from(this.sessions.values()).map((s) => {\n const out: { sessionId: string; cwd: string; updatedAt: string; title?: string } = {\n sessionId: s.id,\n cwd: s.cwd,\n updatedAt: s.updatedAt,\n };\n if (s.title !== undefined) out.title = s.title;\n return out;\n });\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: { sessions },\n }));\n return false;\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Notifications\n // ────────────────────────────────────────────────────────────────────\n\n private async handleNotification(method: string, params: unknown): Promise<boolean> {\n switch (method) {\n case 'session/cancel': {\n const p = (params ?? {}) as { sessionId?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const session = sessionId ? this.sessions.get(sessionId) : undefined;\n if (session) {\n session.abort.abort();\n }\n return false;\n }\n case 'exit':\n // Client is shutting down. Best-effort: abort all sessions.\n this.close();\n return true;\n default:\n // Unknown notification — log and ignore.\n return false;\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Wire helpers\n // ────────────────────────────────────────────────────────────────────\n\n private async sendNotification(params: unknown): Promise<void> {\n await this.transport.send(toWire({ jsonrpc: '2.0', method: 'session/update', params }));\n }\n\n private async sendError(\n id: string | number,\n code: number,\n message: string,\n data?: unknown,\n ): Promise<void> {\n const error: { code: number; message: string; data?: unknown } = { code, message };\n if (data !== undefined) error.data = data;\n await this.transport.send(toWire({ jsonrpc: '2.0', id, error }));\n }\n\n private allocId(): number {\n return this.nextId++;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Error mapping\n// ─────────────────────────────────────────────────────────────────────────\n\nfunction errorToJsonRpc(err: unknown): { code: number; message: string; data?: unknown } {\n if (err && typeof err === 'object') {\n const e = err as { code?: unknown; message?: unknown; data?: unknown };\n if (typeof e.code === 'number' && typeof e.message === 'string') {\n const result: { code: number; message: string; data?: unknown } = {\n code: e.code,\n message: e.message,\n };\n if (e.data !== undefined) result.data = e.data;\n return result;\n }\n }\n const message = err instanceof Error ? err.message : String(err);\n return { code: -32603, message };\n}\n","/**\n * WrongStackACPServer — ACP v1 server-side entry point.\n *\n * Exposes WrongStack as an ACP-compatible agent. ACP clients (Zed, JetBrains\n * Junie, VS Code ACP extension) spawn this as a subprocess, send JSON-RPC\n * messages over stdio, and receive v1-protocol responses.\n *\n * Usage:\n * node dist/agent/wrongstack-acp-agent.js\n *\n * Or via the CLI:\n * wstack acp-server\n *\n * Wiring a real agent: this class is the surface; the bootstrap\n * binary uses a no-op echo by default so the binary is a useful\n * connectivity smoke test. For a real server, instantiate\n * `WrongStackACPServer` programmatically and pass a `runTurn`\n * produced by `makeACPServerAgentTurn({ agentFor: ... })` from\n * `./server-agent-turn.js`. The factory is responsible for building\n * a real core `Agent` (with the right provider, model, system prompt,\n * etc.) per session.\n *\n * Startup: prints the legacy `[wstack-acp]\\n` marker (kept for backward\n * compatibility with the old `StdioTransport` handshake) so the client\n * knows the protocol boundary. v1 initialize is then sent by the client\n * and answered by `ACPProtocolHandler`.\n */\nimport { fileURLToPath } from 'node:url';\nimport { writeErr } from '@wrongstack/core';\nimport {\n ACPProtocolHandler,\n type RunTurn,\n type RunTurnResult,\n} from './protocol-handler.js';\nimport { StdioTransport } from './stdio-transport.js';\n\nexport interface WrongStackACPServerOptions {\n /**\n * Per-turn implementation. If omitted, the server runs a no-op turn\n * that just resolves with `end_turn`. The real production usage\n * passes the result of `makeACPServerAgentTurn({ agentFor: ... })`\n * from `./server-agent-turn.js` so each session gets a real\n * `Agent` instance.\n */\n runTurn?: RunTurn | undefined;\n /** Default cwd for new sessions. Defaults to the current process cwd. */\n defaultCwd?: string | undefined;\n /** Agent name advertised in initialize. */\n agentName?: string | undefined;\n}\n\nexport class WrongStackACPServer {\n private readonly transport: StdioTransport;\n private readonly handler: ACPProtocolHandler;\n private running = false;\n\n constructor(opts: WrongStackACPServerOptions = {}) {\n this.transport = new StdioTransport();\n const runTurn: RunTurn = opts.runTurn ?? defaultEchoRunTurn;\n this.handler = new ACPProtocolHandler({\n transport: this.transport,\n defaultCwd: opts.defaultCwd ?? process.cwd(),\n runTurn,\n agentName: opts.agentName,\n });\n }\n\n /**\n * Start the server. Blocks until the client disconnects.\n *\n * 1. Print the legacy `[wstack-acp]\\n` marker so the client knows the\n * process is the ACP server (the old `StdioTransport` handshake).\n * 2. Loop: read messages, dispatch to the handler, until EOF / error.\n */\n async start(): Promise<void> {\n this.transport.sendStartupMarker();\n this.running = true;\n while (this.running) {\n const msg = await this.transport.read();\n if (!msg) break; // EOF\n const terminal = await this.handler.handleMessage(msg);\n if (terminal) break;\n }\n this.transport.close();\n }\n\n /** Stop the server. */\n stop(): void {\n this.running = false;\n this.transport.close();\n }\n}\n\n/**\n * Default per-turn implementation: a no-op that echoes nothing useful\n * and returns `end_turn`. Lets the server boot end-to-end without\n * needing the core Agent factory (which would couple this entrypoint\n * to a long-lived model provider). The real implementation is\n * `ACPServerAgentTurn` (follow-up PR) that wires a core `Agent`.\n */\nconst defaultEchoRunTurn: RunTurn = async (_input, _emit): Promise<RunTurnResult> => {\n return { stopReason: 'end_turn' };\n};\n\n/**\n * Bootstrap function for `node dist/agent/wrongstack-acp-agent.js`.\n * Instantiates the server with the default (no-op) runTurn so the\n * binary is useful as a connectivity smoke test.\n *\n * In practice the CLI will instantiate and run `WrongStackACPServer`\n * directly, passing a real `runTurn` wired to a core `Agent`.\n */\n/* v8 ignore start -- process entrypoint: bootstrap + auto-start only run when launched as `node wrongstack-acp-agent.js`, never on import (which the CLI does to reuse the class). */\nasync function main(): Promise<void> {\n const server = new WrongStackACPServer();\n await server.start();\n}\n\nconst isEntrypoint =\n process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1];\nif (isEntrypoint) {\n main().catch((err) => {\n writeErr(`[wstack-acp fatal] ${err}\\n`);\n process.exit(1);\n });\n}\n/* v8 ignore stop */\n","/**\n * ACPServerAgentTurn — `RunTurn` adapter for the v1 server side.\n *\n * Wires the ACP v1 server (`ACPProtocolHandler`) to a core `Agent`.\n * Each session gets its own `Agent` instance (per spec: sessions are\n * isolated; sharing agents across sessions would defeat isolation).\n * The agent is created lazily on the first `session/prompt` and\n * torn down when the server is closed or the session is removed.\n *\n * The adapter:\n * - converts the ACP `ContentBlock[]` prompt into a single string\n * (concatenating text blocks; non-text blocks are recorded as a\n * note in the prompt — future work can route images / audio to\n * the appropriate provider)\n * - calls `agent.run(prompt, {signal})` to drive the core loop\n * - captures the agent's text result and emits it as one or more\n * `agent_message_chunk` notifications\n * - maps the agent's stop semantics to a v1 `StopReason`\n *\n * Streaming: the core `Agent` API is not currently token-streamed\n * through this surface (its `run()` returns a final `RunResult`).\n * v1 clients expect text deltas, but most implementations batch\n * them — a single chunk per turn is acceptable. A future\n * enhancement can use the Agent's `Renderer` interface to capture\n * deltas as they're written, then forward them as multiple chunks.\n *\n * Scope: the adapter is deliberately minimal. It does NOT:\n * - model the full conversation history across turns (the v1 spec\n * leaves this to the agent; on the next prompt we re-feed the\n * latest user message and the agent handles its own history)\n * - use the agent's tool registry, permission policy, or\n * extensions (this adapter is the lowest-fidelity integration;\n * a future PR can wire a richer session-aware agent)\n * - stream deltas token-by-token (see \"Streaming\" above)\n *\n * Cancellation: the parent `AbortSignal` propagates through\n * `agent.run({signal})` and the underlying provider call observes\n * it. On abort, the adapter maps the resulting `AbortError` to\n * `{stopReason: 'cancelled'}`.\n */\nimport type { Agent } from '@wrongstack/core';\nimport type {\n ContentBlock,\n StopReason,\n} from '../types/acp-v1.js';\nimport type {\n RunTurn,\n RunTurnResult,\n} from './protocol-handler.js';\n\nexport interface ACPServerAgentTurnOptions {\n /**\n * Factory that creates a fresh `Agent` for a given session.\n * Called once per session on the first `session/prompt` turn.\n * The factory must isolate each agent — sharing one agent\n * across sessions would defeat v1's session-isolation model.\n */\n agentFor: (sessionId: string, cwd: string) => Promise<Agent> | Agent;\n /**\n * Hard wall-clock cap for one turn. The agent's own provider\n * timeout is layered under this; this cap is a safety belt.\n * Default 5 minutes.\n */\n timeoutMs?: number | undefined;\n}\n\n/**\n * Build a `RunTurn` that owns per-session `Agent` instances and\n * delegates each turn to the appropriate agent. The returned\n * function is reusable across sessions — the agents are kept in a\n * Map keyed by `sessionId`.\n */\nexport function makeACPServerAgentTurn(\n opts: ACPServerAgentTurnOptions,\n): RunTurn {\n const agents = new Map<string, Agent>();\n const timeouts = new Map<string, ReturnType<typeof setTimeout>>();\n const timeoutMs = opts.timeoutMs ?? 5 * 60_000;\n\n return async (input, emit): Promise<RunTurnResult> => {\n // Lazily create an agent for this session on the first turn.\n let agent = agents.get(input.sessionId);\n if (!agent) {\n agent = await opts.agentFor(input.sessionId, process.cwd());\n agents.set(input.sessionId, agent);\n }\n\n // Per-turn safety belt: even if the agent ignores the parent\n // signal, the timer will fire and we'll surface a cancelled\n // result. The agent's actual run is called with the parent\n // signal so genuine cancellation propagates correctly.\n const timer = setTimeout(() => {\n timeouts.delete(input.sessionId);\n }, timeoutMs);\n timeouts.set(input.sessionId, timer);\n\n try {\n const userMessage = promptToText(input.prompt);\n // `agent.run` may take a while; we let the parent signal abort\n // it through the agent's own internals.\n const result = await agent.run(userMessage, { signal: input.signal });\n\n // Stream the agent's final text back as one or more\n // `agent_message_chunk` notifications. v1 spec doesn't\n // require multiple chunks; we emit a single chunk here\n // (the future Renderer-based streaming hook can chunk further).\n const text = extractText(result);\n if (text) {\n emit({\n sessionUpdate: 'agent_message_chunk',\n content: { type: 'text', text },\n });\n }\n\n const result_out: RunTurnResult = {\n stopReason: pickStopReason(result, input.signal),\n };\n if (text) result_out.text = text;\n return result_out;\n } finally {\n clearTimeout(timer);\n timeouts.delete(input.sessionId);\n }\n };\n}\n\n/**\n * Tear down the agents and timers held by a turn factory. The\n * server's `close()` should call this so child connections don't\n * outlive the server.\n */\nexport function disposeACPServerAgentTurn(\n opts: { agents: Map<string, Agent> },\n): Promise<void> {\n return Promise.allSettled(\n Array.from(opts.agents.values()).map((agent) => agent.teardown()),\n ).then(() => undefined);\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────\n\n/**\n * Convert an ACP `ContentBlock[]` prompt to a single user-message\n * string. Text blocks are concatenated; image / audio / resource\n * blocks are recorded as a bracketed placeholder (full multimodal\n * support is a future PR — the adapter is v1-text only for now).\n */\nfunction promptToText(blocks: readonly ContentBlock[]): string {\n const parts: string[] = [];\n for (const b of blocks) {\n if (b.type === 'text') {\n parts.push(b.text);\n } else if (b.type === 'image') {\n parts.push(`[image: ${b.mimeType}]`);\n } else if (b.type === 'audio') {\n parts.push(`[audio: ${b.mimeType}]`);\n } else if (b.type === 'resource') {\n parts.push(`[embedded resource: ${b.resource.uri}]`);\n } else if (b.type === 'resource_link') {\n parts.push(`[resource link: ${b.uri}]`);\n }\n }\n return parts.join('\\n').trim();\n}\n\n/**\n * Extract the agent's final text from a `RunResult`. The shape\n * varies across core versions, so we read the most common fields\n * defensively and concatenate whatever text we find.\n */\nfunction extractText(result: unknown): string {\n if (typeof result !== 'object' || result === null) return '';\n const r = result as Record<string, unknown>;\n // v1: result.text is the agent's final text (string).\n if (typeof r.text === 'string') return r.text;\n // Legacy: result.content is an array of blocks.\n if (Array.isArray(r.content)) {\n const parts: string[] = [];\n for (const c of r.content) {\n if (typeof c === 'object' && c !== null) {\n const cb = c as { type?: string; text?: unknown };\n if (cb.type === 'text' && typeof cb.text === 'string') parts.push(cb.text);\n }\n }\n return parts.join('');\n }\n return '';\n}\n\n/**\n * Map a `RunResult` (and the parent signal) to a v1 `StopReason`.\n *\n * If the parent signal was aborted, return `'cancelled'`. Otherwise\n * the agent completed normally — we treat any non-error result\n * as `'end_turn'`. The core `RunResult` doesn't currently surface\n * a per-turn stop reason, so v1's `'max_tokens'`, `'max_turn_requests'`,\n * and `'refusal'` discriminators can't be emitted precisely; we\n * log a warning if the result carries an error and return the\n * generic end_turn.\n */\nfunction pickStopReason(result: unknown, signal: AbortSignal): StopReason {\n if (signal.aborted) return 'cancelled';\n if (typeof result !== 'object' || result === null) return 'end_turn';\n const r = result as { error?: unknown; stopReason?: unknown };\n if (r.error) {\n // The agent run returned with an error. The wire layer will\n // surface this as a separate log; the v1 protocol expects\n // a stopReason of 'end_turn' or a specific reason.\n return 'end_turn';\n }\n if (typeof r.stopReason === 'string' && r.stopReason) {\n return r.stopReason as StopReason;\n }\n return 'end_turn';\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/agent/stdio-transport.ts","../src/agent/tools-registry.ts","../src/types/acp-v1.ts","../src/agent/protocol-handler.ts","../src/agent/session-store.ts","../src/agent/ws-bridge-transport.ts","../src/agent/wrongstack-acp-agent.ts","../src/agent/server-agent-turn.ts"],"names":["params","writeErr","path"],"mappings":"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","file":"agent.js","sourcesContent":["/**\n * StdioTransport — bidirectional stdin/stdout communication for ACP.\n *\n * ACP uses newline-delimited JSON-RPC 2.0 messages over stdio:\n * client → agent: JSON-RPC request/notification on stdin\n * agent → client: JSON-RPC response/notification on stdout\n *\n * Legacy startup marker support remains for older internal harnesses, but\n * standard ACP agents must not write non-JSON data to stdout.\n */\nimport { expectDefined, writeErr } from '@wrongstack/core';\nimport type { ACPMessage } from '../types/acp-messages.js';\nexport interface AgentServerTransport {\n send(msg: ACPMessage): Promise<void>;\n sendRaw(chunk: string): void;\n read(): Promise<ACPMessage | null>;\n close(): void;\n onMessage(handler: (msg: ACPMessage) => void): () => void;\n}\n\n/**\n * Minimal client-side transport contract `ACPSession` drives. `ClientTransport`\n * (stdio subprocess) and `WebSocketClientTransport` (remote) both implement it,\n * so the session is agnostic to how bytes reach the agent.\n */\nexport interface ACPClientTransport {\n start(): Promise<void>;\n send(msg: ACPMessage): Promise<void>;\n onMessage(handler: (msg: ACPMessage) => void): () => void;\n stop(): void;\n}\n\nexport class StdioTransport implements AgentServerTransport {\n private readonly stdin = process.stdin;\n private readonly stdout = process.stdout;\n private readonly stderr = process.stderr;\n\n private buffer = '';\n private readonly handlers = new Set<(msg: ACPMessage) => void>();\n private closed = false;\n private resolveRead: ((msg: ACPMessage | null) => void) | null = null;\n private messageQueue: ACPMessage[] = [];\n\n constructor() {\n this.stdin.resume();\n this.stdin.setEncoding('utf8');\n this.stdin.on('data', (chunk: string) => this.onData(chunk));\n this.stdin.on('end', () => this.handleClose());\n this.stdin.on('error', (err: Error) => this.failAll(err));\n }\n\n sendStartupMarker(): void {\n this.stdout.write('[wstack-acp]\\n', 'utf8');\n }\n\n send(msg: ACPMessage): Promise<void> {\n if (this.closed) return Promise.resolve();\n return new Promise((resolve) => {\n const line = JSON.stringify(msg) + '\\n';\n this.stdout.write(line, 'utf8', () => resolve());\n });\n }\n\n sendRaw(chunk: string): void {\n this.stdout.write(chunk, 'utf8');\n }\n\n read(): Promise<ACPMessage | null> {\n if (this.messageQueue.length > 0) return Promise.resolve(expectDefined(this.messageQueue.shift()));\n if (this.closed) return Promise.resolve(null);\n return new Promise((resolve) => {\n this.resolveRead = resolve;\n });\n }\n\n onMessage(handler: (msg: ACPMessage) => void): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n close(): void {\n this.closed = true;\n this.stdin.pause();\n this.resolveRead?.(null);\n this.resolveRead = null;\n }\n\n private onData(chunk: string): void {\n this.buffer += chunk;\n const lines = this.buffer.split('\\n');\n /* v8 ignore next -- split() always yields ≥1 element, so pop() is never undefined; the ?? '' is defensive. */\n this.buffer = lines.pop() ?? '';\n\n for (const raw of lines) {\n if (!raw.trim()) continue;\n try {\n this.dispatch(JSON.parse(raw) as ACPMessage);\n } catch (err) {\n this.stderr.write(`[wstack-acp parse error] ${err}\\n`, 'utf8');\n }\n }\n }\n\n private dispatch(msg: ACPMessage): void {\n if (this.resolveRead) {\n const resolve = this.resolveRead;\n this.resolveRead = null;\n resolve(msg);\n } else {\n this.messageQueue.push(msg);\n }\n for (const handler of this.handlers) {\n try {\n handler(msg);\n } catch (err) {\n this.stderr.write(`[wstack-acp handler error] ${err}\\n`, 'utf8');\n }\n }\n }\n\n private handleClose(): void {\n this.closed = true;\n this.resolveRead?.(null);\n this.resolveRead = null;\n }\n\n private failAll(err: Error): void {\n this.stderr.write(`[wstack-acp stdin error] ${err.message}\\n`, 'utf8');\n this.close();\n }\n}\n\n// ---------------------------------------------------------------------------\n// ClientTransport — spawns a child ACP agent process (DIR-1)\n// ---------------------------------------------------------------------------\n\nimport type { EventEmitter } from 'node:events';\n\nexport interface ClientTransportOptions {\n command: string;\n args?: string[] | undefined;\n env?: Record<string, string>;\n cwd?: string | undefined;\n handshakeTimeoutMs?: number | undefined;\n /**\n * Set to true when the child is an external ACP agent (Claude Code,\n * Gemini CLI, Codex CLI, …) that does NOT emit a `[wstack-acp]\\n`\n * marker on startup. The v1 client (`ACPSession`) sets this; the\n * server-side transport (the default) keeps the marker check.\n */\n skipHandshakeMarker?: boolean | undefined;\n}\n\nexport interface ACPChildProcess extends EventEmitter {\n stdout: NodeJS.ReadableStream;\n stdin: NodeJS.WritableStream;\n stderr: NodeJS.ReadableStream;\n pid: number | undefined;\n kill(): void;\n}\n\nexport class ClientTransport implements ACPClientTransport {\n private child: ACPChildProcess | null = null;\n private buffer = '';\n private readonly handlers = new Set<(msg: ACPMessage) => void>();\n private closed = false;\n private resolveRead: ((msg: ACPMessage | null) => void) | null = null;\n private messageQueue: ACPMessage[] = [];\n private readonly opts: Required<Pick<ClientTransportOptions, 'handshakeTimeoutMs'>> &\n ClientTransportOptions;\n\n constructor(options: ClientTransportOptions) {\n this.opts = {\n handshakeTimeoutMs: 30_000,\n ...options,\n };\n }\n\n async start(): Promise<void> {\n if (this.child) return;\n const [{ spawn }, { buildChildEnv }, os] = await Promise.all([\n import('node:child_process'),\n import('@wrongstack/core'),\n import('node:os'),\n ]);\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(\n new Error(`ACP child process failed to start within ${this.opts.handshakeTimeoutMs}ms`),\n );\n }, this.opts.handshakeTimeoutMs);\n\n // `npx`/`uvx` resolve+install the package using the npm/pip config of\n // the spawn cwd. Inside a repo with dependency `overrides` (WrongStack\n // pins undici/jsdom), that install fails with EOVERRIDE and the adapter\n // never starts → handshake timeout. Spawn package launchers from a\n // NEUTRAL dir (home) so they install cleanly; the agent still learns the\n // project directory via the ACP `session/new` `cwd` param, not this cwd.\n const isPkgLauncher = this.opts.command === 'npx' || this.opts.command === 'uvx';\n const spawnCwd = isPkgLauncher ? os.homedir() : this.opts.cwd;\n\n try {\n this.child = spawn(this.opts.command, this.opts.args ?? [], {\n env: { ...buildChildEnv(), ...this.opts.env },\n cwd: spawnCwd,\n stdio: ['pipe', 'pipe', 'pipe'],\n windowsHide: true,\n // On Windows, most ACP-supporting tools (claude, gemini, codex,\n // qwen, copilot) are installed as `.cmd` shims under\n // AppData\\Roaming\\npm\\. Node's spawn won't find them via\n // `shell: false` because the .cmd extension is not in the\n // default PATHEXT lookup. The argv here is always from our\n // own static catalog or from a hardcoded spec, never from\n // user input, so shell-expansion is bounded.\n shell: process.platform === 'win32',\n }) as never as ACPChildProcess;\n /* v8 ignore start -- spawn() throwing synchronously is a defensive guard (e.g. argv0 type errors); the realistic async failure path is the child 'error' event, covered by tests. */\n } catch (err) {\n clearTimeout(timeout);\n reject(err);\n return;\n }\n /* v8 ignore stop */\n\n const child = this.child;\n\n child.stdout.setEncoding('utf8');\n\n let settled = false;\n // Register failure handlers IMMEDIATELY, before either readiness path,\n // so a spawn failure (ENOENT / EACCES) rejects start() instead of\n // emitting an unhandled 'error' event that crashes the host process.\n // This is critical for the skip-marker path (external ACP agents),\n // which previously returned before any 'error' listener was attached.\n const onSpawnFailure = (err: Error): void => {\n if (settled) {\n // Post-ready error: just tear the connection down.\n this.closed = true;\n return;\n }\n settled = true;\n clearTimeout(timeout);\n reject(err);\n };\n child.on('error', onSpawnFailure);\n child.stdout.on('error', onSpawnFailure);\n\n if (this.opts.skipHandshakeMarker) {\n // External ACP agents don't emit a startup marker. Attach the data\n // pump right away so no early output is dropped, then resolve once\n // the OS confirms the process actually spawned (the 'spawn' event).\n // If the binary is missing, 'error' fires instead and rejects above.\n child.stdout.on('data', (c: string) => this.onChildData(c));\n child.stderr.on('data', (c: string) => this.onChildError(c));\n child.on('close', (code: number | null) => this.onChildClose(code));\n child.once('spawn', () => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n resolve();\n });\n return;\n }\n\n const onReady = (): void => {\n if (settled) return;\n settled = true;\n child.stdout.on('data', (c: string) => this.onChildData(c));\n child.stderr.on('data', (c: string) => this.onChildError(c));\n child.on('close', (code: number | null) => this.onChildClose(code));\n clearTimeout(timeout);\n resolve();\n };\n\n const waitForMarker = (chunk: string) => {\n this.buffer += chunk;\n const idx = this.buffer.indexOf('[wstack-acp]\\n');\n if (idx !== -1) {\n this.buffer = this.buffer.slice(idx + '[wstack-acp]\\n'.length);\n child.stdout.removeListener('data', waitForMarker);\n onReady();\n }\n };\n\n child.stdout.on('data', waitForMarker);\n });\n }\n\n send(msg: ACPMessage): Promise<void> {\n if (!this.child) return Promise.reject(new Error('ClientTransport not started'));\n return new Promise((resolve, reject) => {\n const line = JSON.stringify(msg) + '\\n';\n this.child?.stdin.write(line, 'utf8', (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n read(): Promise<ACPMessage | null> {\n if (this.messageQueue.length > 0) return Promise.resolve(expectDefined(this.messageQueue.shift()));\n if (this.closed) return Promise.resolve(null);\n return new Promise((resolve) => {\n this.resolveRead = resolve;\n });\n }\n\n onMessage(handler: (msg: ACPMessage) => void): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n stop(): void {\n if (!this.child) return;\n this.closed = true;\n try {\n this.child.kill();\n } catch {\n // already dead\n }\n this.child = null;\n }\n\n private onChildData(chunk: string): void {\n this.buffer += chunk;\n const lines = this.buffer.split('\\n');\n /* v8 ignore next -- split() always yields ≥1 element, so pop() is never undefined; the ?? '' is defensive. */\n this.buffer = lines.pop() ?? '';\n\n for (const raw of lines) {\n if (!raw.trim()) continue;\n try {\n this.dispatch(JSON.parse(raw) as ACPMessage);\n } catch {\n // skip malformed\n }\n }\n }\n\n private onChildError(chunk: string): void {\n writeErr(`[acp-child stderr] ${chunk}`);\n }\n\n private onChildClose(code: number | null): void {\n this.closed = true;\n this.resolveRead?.(null);\n this.resolveRead = null;\n if (code !== 0 && code !== null) {\n writeErr(`[acp-child exited with code ${code}]\\n`);\n }\n }\n\n private dispatch(msg: ACPMessage): void {\n if (this.resolveRead) {\n const resolve = this.resolveRead;\n this.resolveRead = null;\n resolve(msg);\n } else {\n this.messageQueue.push(msg);\n }\n for (const handler of this.handlers) {\n try {\n handler(msg);\n } catch {\n // non-fatal\n }\n }\n }\n}\n","/**\n * Tools registry for ACP agent-side.\n *\n * Translates WrongStack Tool definitions → ACP ACPToolDefinition format.\n * Provides tool lookup and result assembly for the ACP protocol handler.\n */\nimport type {Tool} from '@wrongstack/core';\nimport type {\n ACPToolDefinition,\n ACPToolList,\n ACPInputSchema,\n ACPToolResult,\n ContentBlock,\n} from '../types/acp-messages.js';\n\nexport class ACPToolsRegistry {\n private tools = new Map<string, Tool>();\n private readonly owner: string;\n\n constructor(owner = 'wrongstack') {\n this.owner = owner;\n }\n\n /**\n * Register one or more tools.\n * Throws on duplicate name unless force=true.\n */\n register(tools: Tool[]): void {\n for (const tool of tools) {\n this.tools.set(tool.name, tool);\n }\n }\n\n /**\n * Replace the current tool set.\n */\n setTools(tools: Tool[]): void {\n this.tools.clear();\n for (const tool of tools) this.tools.set(tool.name, tool);\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n list(): Tool[] {\n return Array.from(this.tools.values());\n }\n\n /** Build the ACP tools/list payload from registered tools. */\n buildToolList(): ACPToolList {\n return {\n tools: Array.from(this.tools.values()).map((t) =>\n toACPToolDefinition(t, this.owner),\n ),\n };\n }\n\n /**\n * Execute a tool by name and return ACP-formatted result.\n * Returns null if the tool is not found.\n */\n async execute(\n name: string,\n args: Record<string, unknown>,\n ctx: unknown,\n signal: AbortSignal,\n ): Promise<ACPToolResult | null> {\n const tool = this.tools.get(name);\n if (!tool) return null;\n\n try {\n const result = await tool.execute(args, ctx as Parameters<Tool['execute']>[1], {\n signal,\n });\n return toACPToolResult(result);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {content: [{type: 'text', text: msg}], isError: true} satisfies ACPToolResult;\n }\n }\n}\n\n/** Convert a WrongStack Tool → ACP ACPToolDefinition */\nfunction toACPToolDefinition(tool: Tool, _owner: string): ACPToolDefinition {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: toACPInputSchema(tool.inputSchema),\n annotations: {\n title: tool.name,\n description: tool.usageHint ?? tool.description,\n priority: toolToPriority(tool),\n alwaysAccept: tool.permission === 'auto',\n },\n };\n}\n\n/** Minimal JSON Schema → ACP input schema. ACP uses JSON Schema draft-07. */\nfunction toACPInputSchema(src: unknown): ACPInputSchema {\n if (!src || typeof src !== 'object') {\n return {};\n }\n const s = src as Record<string, unknown>;\n const out: ACPInputSchema = {};\n if (typeof s.type === 'string') out.type = s.type;\n if (Array.isArray(s.enum)) out.enum = s.enum;\n if (typeof s.description === 'string') out.description = s.description;\n if ('default' in s) out.default = s.default;\n if (typeof s.minimum === 'number') out.minimum = s.minimum;\n if (typeof s.maximum === 'number') out.maximum = s.maximum;\n if (s.items) out.items = toACPInputSchema(s.items);\n\n // Recursively convert properties\n if (s.properties && typeof s.properties === 'object') {\n const props: Record<string, ACPInputSchema> = {};\n for (const [k, v] of Object.entries(s.properties as Record<string, unknown>)) {\n props[k] = toACPInputSchema(v);\n }\n out.properties = props;\n if (Array.isArray(s.required)) out.required = s.required as string[];\n }\n\n return out;\n}\n\n/** Convert a WrongStack ToolResult → ACP ContentBlock[] */\nfunction toACPToolResult(result: unknown): ACPToolResult {\n const blocks: ContentBlock[] = [];\n\n if (result === undefined || result === null) {\n return {content: [{type: 'text', text: 'ok'}]};\n }\n\n if (typeof result === 'string') {\n blocks.push({type: 'text', text: result});\n } else if (typeof result === 'object') {\n blocks.push({type: 'text', text: JSON.stringify(result, null, 2)});\n } else {\n blocks.push({type: 'text', text: String(result)});\n }\n\n return {content: blocks};\n}\n\nfunction toolToPriority(tool: Tool): 'high' | 'medium' | 'low' {\n if (tool.riskTier === 'destructive') return 'high';\n if (tool.riskTier === 'standard' || tool.permission === 'confirm') return 'medium';\n return 'low';\n}\n","/**\n * ACP v1 type definitions — Agent Client Protocol, stable v1 spec.\n *\n * Scope: discriminated union for the `session/update` notification payload\n * (the `update` field of a `session/update` JSON-RPC notification), plus the\n * subset of supporting types it depends on.\n *\n * Spec: https://agentclientprotocol.com/protocol/v1/overview\n *\n * Design notes\n * ────────────\n * • The stable v1 spec defines 11 `sessionUpdate` discriminator values. We\n * type exactly those 11, plus an `_unstable_*` escape hatch for v2-RFD\n * kinds (e.g. `next_edit_suggestions`, `elicitation`) that real agents\n * may emit before the spec stabilises them, and an `unknown` fallback for\n * everything else. We do NOT synthesise 32 fake variants to match a\n * number cited in passing — the union is honest about the surface.\n *\n * • Per the spec's conventions, discriminator values use snake_case. The\n * property keys inside each variant are camelCase (the JSON-RPC envelope\n * is JSON-RPC 2.0, everything else is camelCase unless the spec says\n * otherwise).\n *\n * • Optional fields that the spec marks optional are marked `?:`. Required\n * fields have no `?`. We do not include spec fields the spec marks\n * \"SHOULD NOT\" or \"reserved\".\n *\n * • The existing `acp-messages.ts` types describe an older draft of the\n * protocol (string `protocolVersion: '2024-11'`, fake `tools/call`\n * method, etc.). Do NOT import from it here — `acp-v1.ts` is\n * self-contained so the new code path can be reviewed in isolation and\n * deleted wholesale if the rewrite is ever reverted.\n */\n\n// ────────────────────────────────────────────────────────────────────────────\n// Shared building blocks\n// ────────────────────────────────────────────────────────────────────────────\n\n/** Stable protocol version (integer per the spec, not a date-string). */\nexport const ACP_PROTOCOL_VERSION = 1 as const;\nexport type ACPProtocolVersion = typeof ACP_PROTOCOL_VERSION;\n\n/** Per the spec: opaque, unique id. We type as branded string. */\nexport type SessionId = string & { readonly __acpSessionId: unique symbol };\nexport type ToolCallId = string & { readonly __acpToolCallId: unique symbol };\nexport type MessageId = string & { readonly __acpMessageId: unique symbol };\nexport type TerminalId = string & { readonly __acpTerminalId: unique symbol };\nexport type PlanEntryId = string & { readonly __acpPlanEntryId: unique symbol };\n\n// ────────────────────────────────────────────────────────────────────────────\n// Implementation metadata\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface Implementation {\n /** Programmatic/logical name — also a display-name fallback if title is absent. */\n name: string;\n /** Human-readable display name for UI contexts. */\n title?: string | undefined;\n /** Version string (display/debug/metrics). */\n version: string;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Client capabilities — sent in the initialize request\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface ClientCapabilities {\n fs?: {\n readTextFile?: boolean | undefined;\n writeTextFile?: boolean | undefined;\n } | undefined;\n terminal?: boolean | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Agent capabilities — received in the initialize response\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface PromptCapabilities {\n image?: boolean | undefined;\n audio?: boolean | undefined;\n embeddedContext?: boolean | undefined;\n}\n\nexport interface McpCapabilities {\n http?: boolean | undefined;\n sse?: boolean | undefined;\n}\n\nexport interface SessionCapabilities {\n close?: Record<string, unknown> | undefined;\n list?: Record<string, unknown> | undefined;\n delete?: Record<string, unknown> | undefined;\n resume?: Record<string, unknown> | undefined;\n additionalDirectories?: Record<string, unknown> | undefined;\n}\n\nexport interface AuthCapabilities {\n logout?: Record<string, unknown> | undefined;\n}\n\nexport interface AgentCapabilities {\n loadSession?: boolean | undefined;\n promptCapabilities?: PromptCapabilities | undefined;\n mcpCapabilities?: McpCapabilities | undefined;\n sessionCapabilities?: SessionCapabilities | undefined;\n auth?: AuthCapabilities | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Authentication\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface AuthMethod {\n id: string;\n name: string;\n description?: string | undefined;\n type?: 'agent' | 'oauth' | 'http' | undefined;\n}\n\nexport interface AuthenticateRequest {\n methodId: string;\n}\n\nexport interface AuthenticateResponse {}\n\nexport interface LogoutRequest {}\n\nexport interface LogoutResponse {}\n\n// ────────────────────────────────────────────────────────────────────────────\n// MCP server configuration — sent in session lifecycle requests\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface StdioMcpServer {\n name: string;\n command: string;\n args?: string[] | undefined;\n env?: { name: string; value: string }[] | undefined;\n}\n\nexport interface HttpMcpServer {\n type: 'http';\n name: string;\n url: string;\n headers?: { name: string; value: string }[] | undefined;\n}\n\nexport interface SseMcpServer {\n type: 'sse';\n name: string;\n url: string;\n headers?: { name: string; value: string }[] | undefined;\n}\n\nexport type McpServer = StdioMcpServer | HttpMcpServer | SseMcpServer;\n\n// ────────────────────────────────────────────────────────────────────────────\n// Session lifecycle — request/response types\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface NewSessionRequest {\n cwd: string;\n mcpServers: McpServer[];\n additionalDirectories?: string[] | undefined;\n}\n\nexport interface NewSessionResponse {\n sessionId: SessionId;\n initialMode?: SessionModeState | null | undefined;\n configOptions?: SessionConfigOption[] | null | undefined;\n}\n\nexport interface LoadSessionRequest {\n sessionId: SessionId;\n cwd: string;\n mcpServers: McpServer[];\n additionalDirectories?: string[] | undefined;\n}\n\nexport interface LoadSessionResponse {\n initialMode?: SessionModeState | null | undefined;\n configOptions?: SessionConfigOption[] | null | undefined;\n}\n\nexport interface ResumeSessionRequest {\n sessionId: SessionId;\n cwd: string;\n mcpServers: McpServer[];\n additionalDirectories?: string[] | undefined;\n}\n\nexport interface ResumeSessionResponse {\n initialMode?: SessionModeState | null | undefined;\n configOptions?: SessionConfigOption[] | null | undefined;\n}\n\nexport interface CloseSessionRequest {\n sessionId: SessionId;\n}\n\nexport interface CloseSessionResponse {}\n\nexport interface ListSessionsRequest {\n cursor?: string | undefined;\n cwd?: string | undefined;\n}\n\nexport interface ListSessionsResponse {\n sessions: SessionInfo[];\n nextCursor?: string | undefined;\n}\n\nexport interface DeleteSessionRequest {\n sessionId: SessionId;\n}\n\nexport interface DeleteSessionResponse {}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Session config options\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface SessionConfigOption {\n id: string;\n name: string;\n description?: string | undefined;\n category?: ConfigOptionCategory | undefined;\n type: ConfigOptionType;\n defaultValue?: string | undefined;\n currentValue: string;\n options: ConfigOptionValue[];\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Content blocks — reused from MCP per the spec\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Annotations attached to a content block. Optional, agent-supplied hint\n * about audience/priority. Spec leaves shape open; we mirror the fields\n * the spec shows in its examples.\n */\nexport interface ContentAnnotations {\n audience?: ('user' | 'assistant')[] | undefined;\n priority?: number | undefined;\n [key: string]: unknown;\n}\n\nexport interface TextContent {\n type: 'text';\n text: string;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport interface ImageContent {\n type: 'image';\n mimeType: string;\n /** Base64-encoded image data. */\n data: string;\n uri?: string | undefined;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport interface AudioContent {\n type: 'audio';\n mimeType: string;\n /** Base64-encoded audio data. */\n data: string;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport interface TextResourceContents {\n uri: string;\n mimeType?: string | undefined;\n text: string;\n}\n\nexport interface BlobResourceContents {\n uri: string;\n mimeType?: string | undefined;\n /** Base64-encoded binary. */\n blob: string;\n}\n\nexport type EmbeddedResourceContents = TextResourceContents | BlobResourceContents;\n\nexport interface EmbeddedResourceContent {\n type: 'resource';\n resource: EmbeddedResourceContents;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport interface ResourceLinkContent {\n type: 'resource_link';\n uri: string;\n name: string;\n mimeType?: string | undefined;\n title?: string | undefined;\n description?: string | undefined;\n size?: number | undefined;\n annotations?: ContentAnnotations | undefined;\n}\n\nexport type ContentBlock =\n | TextContent\n | ImageContent\n | AudioContent\n | EmbeddedResourceContent\n | ResourceLinkContent;\n\n// ────────────────────────────────────────────────────────────────────────────\n// Tool calls\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type ToolKind =\n | 'read'\n | 'edit'\n | 'delete'\n | 'move'\n | 'search'\n | 'execute'\n | 'think'\n | 'fetch'\n | 'switch_mode'\n | 'other';\n\nexport type ToolCallStatus = 'pending' | 'in_progress' | 'completed' | 'failed';\n\n/** A single concrete content payload attached to a tool call. */\nexport type ToolCallContent =\n | { type: 'content'; content: ContentBlock }\n | {\n type: 'diff';\n path: string;\n oldText: string | null;\n newText: string;\n }\n | { type: 'terminal'; terminalId: TerminalId };\n\nexport interface ToolCallLocation {\n path: string;\n /** 1-based per the spec's argument requirements. */\n line?: number | undefined;\n}\n\nexport interface ToolCall {\n toolCallId: ToolCallId;\n title: string;\n kind?: ToolKind | undefined;\n status?: ToolCallStatus | undefined;\n content?: ToolCallContent[] | undefined;\n locations?: ToolCallLocation[] | undefined;\n rawInput?: Record<string, unknown> | undefined;\n rawOutput?: Record<string, unknown> | undefined;\n}\n\n/**\n * Partial update of a previously-emitted tool call. All fields except\n * `toolCallId` are optional — only the changed fields are included.\n * Declared standalone (not `extends ToolCall`) because `title` is required\n * on `ToolCall` but optional here; the structural variance is the point.\n */\nexport interface ToolCallUpdateFields {\n toolCallId: ToolCallId;\n status?: ToolCallStatus | undefined;\n content?: ToolCallContent[] | undefined;\n title?: string | undefined;\n kind?: ToolKind | undefined;\n locations?: ToolCallLocation[] | undefined;\n rawInput?: Record<string, unknown> | undefined;\n rawOutput?: Record<string, unknown> | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Plan\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type PlanEntryPriority = 'high' | 'medium' | 'low';\nexport type PlanEntryStatus = 'pending' | 'in_progress' | 'completed';\n\nexport interface PlanEntry {\n /** Required by the spec for the array shape, but per-entry id is optional. */\n content: string;\n priority: PlanEntryPriority;\n status: PlanEntryStatus;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Slash commands\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface AvailableCommandInput {\n hint: string;\n}\n\nexport interface AvailableCommand {\n name: string;\n description: string;\n input?: AvailableCommandInput | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Session modes\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type SessionModeId = string & { readonly __acpModeId: unique symbol };\n\nexport interface SessionMode {\n id: SessionModeId;\n name: string;\n description?: string | undefined;\n}\n\nexport interface SessionModeState {\n currentModeId: SessionModeId;\n availableModes: SessionMode[];\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Config options\n// ────────────────────────────────────────────────────────────────────────────\n\n/** Reserved spec categories. Underscore-prefixed names are free for custom use. */\nexport type ConfigOptionCategory =\n | 'mode'\n | 'model'\n | 'thought_level'\n | `_${string}`;\n\nexport type ConfigOptionType = 'select' | string;\n\nexport interface ConfigOptionValue {\n value: string;\n name: string;\n description?: string | undefined;\n}\n\nexport interface ConfigOption {\n id: string;\n name: string;\n description?: string | undefined;\n category?: ConfigOptionCategory | undefined;\n type: ConfigOptionType;\n currentValue: string;\n options: ConfigOptionValue[];\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Session info\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface SessionInfo {\n sessionId: SessionId;\n cwd: string;\n title?: string | undefined;\n updatedAt?: string | undefined;\n /** Agent-supplied extension metadata; opaque to clients. */\n _meta?: Record<string, unknown> | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Usage (token / cost) updates\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface UsageCost {\n amount: number;\n /** ISO 4217 currency code, e.g. \"USD\". */\n currency: string;\n}\n\nexport interface UsageUpdate {\n /** Tokens used in the current session context. Required, non-null. */\n used: number;\n /** Total context window size in tokens. Required, non-null. */\n size: number;\n cost?: UsageCost | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Permission requests\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type PermissionOptionKind =\n | 'allow_once'\n | 'allow_always'\n | 'reject_once'\n | 'reject_always';\n\nexport interface PermissionOption {\n optionId: string;\n name: string;\n kind: PermissionOptionKind;\n}\n\nexport type RequestPermissionOutcome =\n | { outcome: 'cancelled' }\n | { outcome: 'selected'; optionId: string };\n\n// ────────────────────────────────────────────────────────────────────────────\n// Stop reasons\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type StopReason =\n | 'end_turn'\n | 'max_tokens'\n | 'max_turn_requests'\n | 'refusal'\n | 'cancelled'\n | string;\n\n// ────────────────────────────────────────────────────────────────────────────\n// SessionUpdate — the discriminated union\n// ────────────────────────────────────────────────────────────────────────────\n\n/** Stable v1 variants. The spec currently defines exactly 11. */\nexport type SessionUpdate =\n | UserMessageChunkUpdate\n | AgentMessageChunkUpdate\n | ThoughtChunkUpdate\n | ToolCallUpdateUpdate\n | ToolCallUpdateNotification\n | PlanUpdate\n | AvailableCommandsUpdate\n | CurrentModeUpdate\n | ConfigOptionUpdate\n | SessionInfoUpdate\n | UsageUpdateUpdate;\n\n// --- Streaming message chunks -----------------------------------------------\n\nexport interface UserMessageChunkUpdate {\n sessionUpdate: 'user_message_chunk';\n messageId?: MessageId | undefined;\n content: ContentBlock;\n}\n\nexport interface AgentMessageChunkUpdate {\n sessionUpdate: 'agent_message_chunk';\n messageId?: MessageId | undefined;\n content: ContentBlock;\n}\n\nexport interface ThoughtChunkUpdate {\n sessionUpdate: 'thought_chunk';\n messageId?: MessageId | undefined;\n content: ContentBlock;\n}\n\n// --- Tool calls ------------------------------------------------------------\n\n/** First notification for a new tool call. */\nexport interface ToolCallUpdateUpdate {\n sessionUpdate: 'tool_call';\n toolCallId: ToolCallId;\n title: string;\n kind?: ToolKind | undefined;\n status?: ToolCallStatus | undefined;\n content?: ToolCallContent[] | undefined;\n locations?: ToolCallLocation[] | undefined;\n rawInput?: Record<string, unknown> | undefined;\n}\n\n/** Subsequent updates to a previously-emitted tool call. */\nexport interface ToolCallUpdateNotification {\n sessionUpdate: 'tool_call_update';\n toolCallId: ToolCallId;\n status?: ToolCallStatus | undefined;\n content?: ToolCallContent[] | undefined;\n title?: string | undefined;\n kind?: ToolKind | undefined;\n locations?: ToolCallLocation[] | undefined;\n rawInput?: Record<string, unknown> | undefined;\n rawOutput?: Record<string, unknown> | undefined;\n}\n\n// --- Plan ------------------------------------------------------------------\n\nexport interface PlanUpdate {\n sessionUpdate: 'plan';\n entries: PlanEntry[];\n}\n\n// --- Commands / modes / config ---------------------------------------------\n\nexport interface AvailableCommandsUpdate {\n sessionUpdate: 'available_commands_update';\n availableCommands: AvailableCommand[];\n}\n\nexport interface CurrentModeUpdate {\n sessionUpdate: 'current_mode_update';\n modeId: SessionModeId;\n}\n\nexport interface ConfigOptionUpdate {\n sessionUpdate: 'config_option_update';\n configOptions: ConfigOption[];\n}\n\n// --- Session metadata ------------------------------------------------------\n\nexport interface SessionInfoUpdate {\n sessionUpdate: 'session_info_update';\n title?: string | null | undefined;\n updatedAt?: string | null | undefined;\n _meta?: Record<string, unknown> | undefined;\n}\n\n// --- Usage -----------------------------------------------------------------\n\nexport interface UsageUpdateUpdate {\n sessionUpdate: 'usage_update';\n used: number;\n size: number;\n cost?: UsageCost | undefined;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Escape hatches: unknown / unstable\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Escape hatch for v2-RFD `sessionUpdate` kinds that have been published\n * but are not yet stabilised in the v1 spec. Examples seen in the wild:\n * `next_edit_suggestions`, `elicitation`, `proxy_extension`. We surface\n * the raw payload so forward-compat code can switch on\n * `kind === 'next_edit_suggestions'` etc. without losing the data.\n */\nexport interface UnstableSessionUpdate {\n sessionUpdate: `_unstable_${string}`;\n [key: string]: unknown;\n}\n\n/**\n * Last-resort variant: the agent sent a discriminator string we don't\n * recognise at all. The full payload is preserved as a record so consumers\n * can still log/inspect it. Prefer matching the known variants first.\n */\nexport interface UnknownSessionUpdate {\n sessionUpdate: string;\n [key: string]: unknown;\n}\n\n/** The full union, including escape hatches. */\nexport type AnySessionUpdate = SessionUpdate | UnstableSessionUpdate | UnknownSessionUpdate;\n\n// ────────────────────────────────────────────────────────────────────────────\n// Top-level notification envelope\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface SessionUpdateNotification {\n jsonrpc?: '2.0' | undefined;\n method: 'session/update';\n params: {\n sessionId: SessionId;\n update: AnySessionUpdate;\n };\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Type guards\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Exhaustiveness helper. Call from the `default:` branch of a switch on\n * `sessionUpdate` to get a compile-time error when a new variant is added\n * without updating the consumer.\n */\nexport function assertNeverSessionUpdate(x: never): never {\n throw new Error(\n `Unhandled sessionUpdate: ${JSON.stringify(x)}`,\n );\n}\n","/**\n * ACP v1 server-side protocol handler.\n *\n * Receives JSON-RPC requests from an external ACP client (Zed, JetBrains\n * Junie, VS Code ACP extension, etc.) over stdio and answers them per the\n * v1 spec. See https://agentclientprotocol.com/protocol/v1/overview.\n *\n * Supported methods\n * ─────────────────\n * - initialize — handshake\n * - authenticate — optional, no-op when auth isn't required\n * - session/new — create a session\n * - session/load — restore a session by id\n * - session/prompt — run one turn, stream session/update\n * notifications, return stopReason\n * - session/cancel — notification (no response); cancels the\n * in-flight turn on the target session\n * - session/set_mode — change the active mode for a session\n * - session/set_config_option — change a config option value\n * - session/list — list known sessions\n *\n * Method execution\n * ────────────────\n * The handler is transport-agnostic; it sends responses via the\n * `AgentServerTransport` injected at construction. The actual\n * agent-loop work for a `session/prompt` turn is delegated to the\n * caller-provided `runTurn` callback, which receives the prompt\n * blocks and the per-turn AbortSignal and resolves with the final\n * stopReason. Updates are streamed via the `emit` callback passed\n * to `runTurn`; the handler wraps each as a `session/update`\n * notification.\n *\n * This separation keeps the handler unit-testable: tests can supply\n * a fake `runTurn` that yields a canned sequence of updates, and\n * assert on the JSON-RPC traffic the handler produces. A real\n * production caller wires `runTurn` to a core `Agent` instance.\n *\n * Concurrency\n * ───────────\n * Each session is single-threaded (one active turn at a time). The\n * handler keeps a per-session AbortController so a `session/cancel`\n * notification can stop the running turn mid-stream without tearing\n * down the session. Multiple sessions can be active concurrently.\n */\nimport {\n ACP_PROTOCOL_VERSION,\n type StopReason,\n type ContentBlock,\n type PermissionOption,\n type PlanEntry,\n type RequestPermissionOutcome,\n type ToolKind,\n type UsageCost,\n} from '../types/acp-v1.js';\nimport type { AgentServerTransport } from './stdio-transport.js';\nimport type { ACPMessage } from '../types/acp-messages.js';\n\n// Transport's `send` is typed `ACPMessage` which predates v1 and\n// doesn't carry a `jsonrpc` field. The runtime is fine — the\n// transport just `JSON.stringify`s the message — so cast at the\n// boundary.\ntype WireMessage = { jsonrpc?: '2.0'; id?: string | number; method?: string; params?: unknown; result?: unknown; error?: unknown };\nfunction toWire(msg: WireMessage): ACPMessage {\n return msg as never as ACPMessage;\n}\n\nexport const WRONGSTACK_VERSION = '0.274.1';\nconst WRONGSTACK_AUTH_METHODS = [\n {\n id: 'wrongstack-auth',\n name: 'Run wstack auth',\n description: 'Configure a WrongStack model provider in an interactive terminal.',\n type: 'terminal',\n args: ['auth'],\n },\n];\n\n/** What kinds of content the agent accepts in a prompt. */\nexport interface PromptCapabilities {\n image: boolean;\n audio: boolean;\n embeddedContext: boolean;\n}\n\nexport interface AgentCapabilities {\n loadSession: boolean;\n promptCapabilities: PromptCapabilities;\n}\n\nexport interface RunTurnInput {\n sessionId: string;\n /** Content blocks the client sent. */\n prompt: readonly ContentBlock[];\n /** Cancelled when the client sends `session/cancel` for this session. */\n signal: AbortSignal;\n}\n\nexport interface RunTurnResult {\n stopReason: StopReason;\n /** Optional summary text the agent produced. */\n text?: string;\n plan?: PlanEntry[];\n usage?: { used: number; size: number; cost?: UsageCost | undefined };\n}\n\n/**\n * A tool-call permission request the agent surfaces to the client.\n */\nexport interface RunTurnPermissionRequest {\n toolCall: { toolCallId: string; title: string; kind?: ToolKind | undefined };\n options: PermissionOption[];\n}\n\n/** Client filesystem/terminal capabilities advertised at initialize. */\nexport interface ClientCapabilities {\n fs?: { readTextFile?: boolean | undefined; writeTextFile?: boolean | undefined } | undefined;\n terminal?: boolean | undefined;\n}\n\n/**\n * Client-callback API handed to `runTurn`. Lets the agent's tools call back\n * into the connected ACP client — ask for permission, and (when the client\n * advertises the capability) use the client's filesystem and terminal so the\n * editor's view (including unsaved buffers) is the source of truth.\n */\nexport interface RunTurnApi {\n /**\n * Ask the connected ACP client to approve/reject a tool call via the\n * `session/request_permission` method. Resolves with the client's\n * outcome. Rejects if no client channel is available or the request\n * times out — the caller decides the fallback.\n */\n requestPermission(req: RunTurnPermissionRequest): Promise<RequestPermissionOutcome>;\n /** Capabilities the client advertised at initialize — gate tool wiring on these. */\n clientCapabilities: ClientCapabilities;\n /** Read a text file from the client's filesystem (`fs/read_text_file`). */\n readTextFile(params: { path: string; line?: number; limit?: number }): Promise<string>;\n /** Write a text file in the client's filesystem (`fs/write_text_file`). */\n writeTextFile(params: { path: string; content: string }): Promise<void>;\n /**\n * Run a command in the client's terminal (`terminal/create` →\n * `wait_for_exit` → `output` → `release`) and resolve with the combined\n * output and exit code.\n */\n runTerminal(params: {\n command: string;\n args?: string[] | undefined;\n cwd?: string | undefined;\n }): Promise<{ output: string; exitCode: number | null }>;\n}\n\n/**\n * The agent's per-turn work. Streams `SessionUpdate` notifications to\n * `emit` and resolves with the final stopReason. Errors thrown from\n * this iterable are converted to a `prompt_failed` JSON-RPC error.\n *\n * `api` is an optional client-callback surface (permission requests).\n * Older runTurn implementations that ignore it keep working unchanged.\n */\nexport type RunTurn = (\n input: RunTurnInput,\n emit: (update: unknown) => void,\n api?: RunTurnApi,\n) => Promise<RunTurnResult>;\n\nexport interface SessionState {\n id: string;\n cwd: string;\n /** Per-turn abort signal — aborted when the session is cancelled or closed. */\n abort: AbortController;\n /** Active mode, advertised to the client in current_mode_update. */\n modeId: string;\n /** Created at, for session/list ordering. */\n createdAt: string;\n /** Last activity timestamp, for session/info_update. */\n updatedAt: string;\n /** Optional human title. */\n title?: string;\n}\n\n/** MCP-style session mode advertised in current_mode_update. */\nexport interface SessionMode {\n id: string;\n name: string;\n description?: string | undefined;\n}\n\nexport interface SessionConfigOption {\n id: string;\n name: string;\n type: 'select' | string;\n currentValue: string;\n options: { value: string; name: string; description?: string | undefined }[];\n}\n\nexport interface ProtocolHandlerOptions {\n transport: AgentServerTransport;\n /** Where the server is running; used for new sessions' default cwd. */\n defaultCwd: string;\n /** Agent's per-turn implementation. */\n runTurn: RunTurn;\n /**\n * Optional callbacks for the lifecycle events the server should\n * surface to the client. All default to no-ops.\n */\n onSessionNew?: ((state: SessionState) => void) | undefined;\n /** Static list of available modes (advertised to clients). */\n modes?: readonly SessionMode[] | undefined;\n /** Static list of config options. */\n configOptions?: readonly SessionConfigOption[] | undefined;\n /** Agent name advertised in initialize. */\n agentName?: string | undefined;\n /**\n * Optional source of replayable conversation history for `session/load`.\n * Returns the `session/update` payloads (user/agent message chunks) to\n * stream back to the client before the load response. Wired from\n * `makeACPServerAgentTurn(...).replay`.\n */\n replayFor?: ((sessionId: string) => Array<{ sessionUpdate: string; content: unknown }>) | undefined;\n /**\n * Optional hook to prime the turn engine's session history on cold\n * `session/load` (server restart). Wired from `makeACPServerAgentTurn(...).seed`\n * — it re-feeds the persisted conversation into the next-created Agent so\n * the model resumes, not just the client UI.\n */\n seedFor?: ((sessionId: string, history: Array<{ sessionUpdate: string; content: unknown }>) => void) | undefined;\n /**\n * Optional durable session store. When set, sessions + their recorded\n * history are persisted on create/prompt and restored on `session/load`,\n * so a reconnecting client can resume after a server restart.\n * (Structural type — `ACPSessionStore` satisfies it without a value import.)\n */\n store?: SessionPersistence | undefined;\n}\n\n/** Minimal durable-store contract the handler uses (ACPSessionStore satisfies it). */\nexport interface SessionPersistence {\n save(\n state: SessionState,\n history?: Array<{ sessionUpdate: string; content: unknown }>,\n ): Promise<unknown>;\n load(\n sessionId: string,\n ): Promise<\n | (Partial<SessionState> & { history?: Array<{ sessionUpdate: string; content: unknown }> | undefined })\n | null\n >;\n}\n\n/** Single global mode id, sufficient for v1. */\nconst DEFAULT_MODE_ID = 'code';\n\nconst DEFAULT_MODES: readonly SessionMode[] = [\n {\n id: DEFAULT_MODE_ID,\n name: 'Code',\n description: 'Default agent mode for code-generation tasks.',\n },\n];\n\nexport class ACPProtocolHandler {\n private readonly transport: AgentServerTransport;\n private readonly defaultCwd: string;\n private readonly runTurn: RunTurn;\n private readonly onSessionNew: (state: SessionState) => void;\n private readonly modes: readonly SessionMode[];\n private readonly configOptions: readonly SessionConfigOption[];\n private readonly agentName: string;\n private readonly replayFor:\n | ((sessionId: string) => Array<{ sessionUpdate: string; content: unknown }>)\n | undefined;\n private readonly seedFor:\n | ((sessionId: string, history: Array<{ sessionUpdate: string; content: unknown }>) => void)\n | undefined;\n private readonly store: SessionPersistence | undefined;\n\n private initialized = false;\n private clientCapabilities: ClientCapabilities = {};\n private readonly sessions = new Map<string, SessionState>();\n private nextId = 1;\n\n // Outbound request correlation (server → client requests, e.g.\n // session/request_permission). Keyed by our own `srv_N` ids.\n private readonly pendingOut = new Map<\n string,\n { resolve: (v: unknown) => void; reject: (e: Error) => void; timer: ReturnType<typeof setTimeout> }\n >();\n private nextOutId = 1;\n\n constructor(opts: ProtocolHandlerOptions) {\n this.transport = opts.transport;\n this.defaultCwd = opts.defaultCwd;\n this.runTurn = opts.runTurn;\n this.onSessionNew = opts.onSessionNew ?? (() => {});\n this.modes = opts.modes ?? DEFAULT_MODES;\n this.configOptions = opts.configOptions ?? [];\n this.agentName = opts.agentName ?? 'wrongstack';\n this.replayFor = opts.replayFor;\n this.seedFor = opts.seedFor;\n this.store = opts.store;\n // Route inbound JSON-RPC responses (to our outbound requests)\n // independently of the server's read loop. StdioTransport fires\n // onMessage on the stdin 'data' event, so a pending request resolves\n // even while a session/prompt handler is parked awaiting it.\n // Guarded: minimal transports (and some test fakes) may omit onMessage;\n // without it, server→client requests simply aren't supported.\n if (typeof this.transport.onMessage === 'function') {\n this.transport.onMessage((m) => this.maybeResolvePending(m));\n }\n }\n\n /**\n * Send a request to the client and await its response. Used for\n * server-initiated calls like `session/request_permission`. Rejects on\n * timeout or transport error so the caller can pick a safe fallback.\n */\n private request(method: string, params: unknown, timeoutMs = 60_000): Promise<unknown> {\n const id = `srv_${this.nextOutId++}`;\n return new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingOut.delete(id);\n reject(new Error(`${method} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n this.pendingOut.set(id, { resolve, reject, timer });\n this.transport\n .send(toWire({ jsonrpc: '2.0', id, method, params }))\n .catch((e: unknown) => {\n clearTimeout(timer);\n this.pendingOut.delete(id);\n reject(e instanceof Error ? e : new Error(String(e)));\n });\n });\n }\n\n private maybeResolvePending(m: ACPMessage): void {\n const id = (m as { id?: unknown }).id;\n if (typeof id !== 'string') return;\n const pending = this.pendingOut.get(id);\n if (!pending) return;\n this.pendingOut.delete(id);\n clearTimeout(pending.timer);\n const err = (m as { error?: { message?: string } }).error;\n if (err) pending.reject(new Error(err.message ?? 'client request failed'));\n else pending.resolve((m as { result?: unknown }).result);\n }\n\n /**\n * Process one inbound message. Returns true if this was a terminal\n * message (rare; reserved for future use by the server's own\n * shutdown signal).\n */\n async handleMessage(msg: unknown): Promise<boolean> {\n if (typeof msg !== 'object' || msg === null) return false;\n const m = msg as { id?: unknown; method?: unknown; params?: unknown; result?: unknown; error?: unknown };\n\n // Response (we never initiate requests, but be defensive).\n if (m.id !== undefined && (m.result !== undefined || m.error !== undefined)) {\n return false;\n }\n\n // Request (has id, has method, no result/error)\n if (m.id !== undefined && typeof m.method === 'string') {\n return this.handleRequest(m.id as string | number, m.method, m.params);\n }\n\n // Notification (no id, has method)\n if (typeof m.method === 'string') {\n return this.handleNotification(m.method, m.params);\n }\n\n return false;\n }\n\n /** Abort all active turns and drop session state. */\n close(): void {\n for (const [, session] of this.sessions) {\n session.abort.abort();\n }\n this.sessions.clear();\n for (const [, p] of this.pendingOut) {\n clearTimeout(p.timer);\n p.reject(new Error('protocol handler closed'));\n }\n this.pendingOut.clear();\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Requests\n // ────────────────────────────────────────────────────────────────────\n\n private async handleRequest(\n id: string | number,\n method: string,\n params: unknown,\n ): Promise<boolean> {\n // The only method allowed before initialize is `initialize` itself.\n if (method !== 'initialize' && !this.initialized) {\n await this.sendError(id, -32000, 'Not initialized');\n return false;\n }\n\n try {\n switch (method) {\n case 'initialize':\n return await this.handleInitialize(id, params);\n case 'authenticate':\n return await this.handleAuthenticate(id, params);\n case 'logout':\n return await this.handleLogout(id, params);\n case 'session/new':\n return await this.handleSessionNew(id, params);\n case 'session/load':\n return await this.handleSessionLoad(id, params);\n case 'session/resume':\n return await this.handleSessionResume(id, params);\n case 'session/close':\n return await this.handleSessionClose(id, params);\n case 'session/delete':\n return await this.handleSessionDelete(id, params);\n case 'session/prompt':\n return await this.handleSessionPrompt(id, params);\n case 'session/set_mode':\n return await this.handleSetMode(id, params);\n case 'session/set_config_option':\n return await this.handleSetConfigOption(id, params);\n case 'session/list':\n return await this.handleSessionList(id);\n case 'session/fork':\n return await this.handleSessionFork(id, params);\n case 'providers/list':\n return await this.handleProvidersList(id, params);\n case 'providers/set':\n return await this.handleProvidersSet(id, params);\n case 'providers/disable':\n return await this.handleProvidersDisable(id, params);\n case 'mcp/message':\n return await this.handleMcpMessage(id, params);\n default:\n // Everything reaching handleRequest carries an id, so it's a\n // JSON-RPC *request* and MUST get a response — otherwise a\n // conformant client blocks forever awaiting it. Unimplemented\n // IDE features (document/*, nes/*, elicitation/*) and any other\n // unknown method get a standard method-not-found error.\n await this.sendError(id, -32601, `Unknown method: ${method}`);\n return false;\n }\n } catch (err) {\n const { code, message, data } = errorToJsonRpc(err);\n await this.sendError(id, code, message, data);\n return false;\n }\n }\n\n private async handleInitialize(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { protocolVersion?: unknown; clientCapabilities?: ClientCapabilities };\n if (p.clientCapabilities && typeof p.clientCapabilities === 'object') {\n this.clientCapabilities = p.clientCapabilities;\n }\n // Version negotiation per spec: the client advertises its latest\n // supported version; the agent replies with the version it will use —\n // the client's if supported, otherwise the agent's own latest. We must\n // NOT error on a mismatch (that breaks a forward-compatible client that\n // requested a newer protocol): we simply respond with the version we\n // speak and let the client decide whether to proceed. The client side\n // (`ACPSession.initialize`) already mirrors this lenient negotiation.\n this.initialized = true;\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {\n protocolVersion: ACP_PROTOCOL_VERSION,\n agentCapabilities: {\n loadSession: true,\n promptCapabilities: {\n // We route ACP image blocks into the core agent's multimodal\n // input (server-agent-turn.promptToAgentInput); whether the\n // model can see them is the configured provider's concern.\n image: true,\n audio: false,\n embeddedContext: true,\n },\n mcpCapabilities: {\n http: false,\n sse: false,\n },\n sessionCapabilities: {\n close: {},\n list: {},\n delete: {},\n resume: {},\n },\n auth: {\n logout: {},\n },\n },\n agentInfo: {\n name: this.agentName,\n title: 'WrongStack',\n version: WRONGSTACK_VERSION,\n },\n authMethods: WRONGSTACK_AUTH_METHODS,\n modes: this.modes,\n configOptions: this.configOptions,\n },\n }));\n return false;\n }\n\n private async handleAuthenticate(id: string | number, _params: unknown): Promise<boolean> {\n // WrongStack doesn't currently require auth.\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: { outcome: 'unauthenticated' },\n }));\n return false;\n }\n\n private async handleLogout(id: string | number, _params: unknown): Promise<boolean> {\n // WrongStack doesn't have persistent auth state, so logout is a no-op.\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {},\n }));\n return false;\n }\n\n private async handleSessionNew(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { cwd?: unknown; mcpServers?: unknown };\n const cwd = typeof p.cwd === 'string' ? p.cwd : this.defaultCwd;\n const sessionId = `sess_${this.allocId()}`;\n const now = new Date().toISOString();\n const state: SessionState = {\n id: sessionId,\n cwd,\n abort: new AbortController(),\n modeId: DEFAULT_MODE_ID,\n createdAt: now,\n updatedAt: now,\n };\n this.sessions.set(sessionId, state);\n this.onSessionNew(state);\n await this.persist(state);\n\n // Per spec, the server MAY emit current_mode_update /\n // config_option_update / available_commands_update notifications\n // immediately after session/new to populate the client UI. We do.\n await this.sendNotification({\n sessionId,\n update: {\n sessionUpdate: 'current_mode_update',\n modeId: this.modes[0]?.id ?? DEFAULT_MODE_ID,\n },\n });\n if (this.configOptions.length > 0) {\n await this.sendNotification({\n sessionId,\n update: {\n sessionUpdate: 'config_option_update',\n configOptions: [...this.configOptions],\n },\n });\n }\n\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {\n sessionId,\n modes: this.modes,\n configOptions: this.configOptions,\n },\n }));\n return false;\n }\n\n private async handleSessionLoad(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown; cwd?: unknown; mcpServers?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const loadCwd = typeof p.cwd === 'string' ? p.cwd : undefined;\n let existing = sessionId ? this.sessions.get(sessionId) : undefined;\n\n // Cold path: not in memory but persisted (server restarted). Restore the\n // session state + replay its stored history. The agent's own model\n // context starts fresh — the client UI is made whole via replay.\n if (!existing && sessionId && this.store) {\n const persisted = await this.store.load(sessionId);\n if (persisted) {\n const restored: SessionState = {\n id: sessionId,\n cwd: persisted.cwd ?? loadCwd ?? this.defaultCwd,\n abort: new AbortController(),\n modeId: persisted.modeId ?? DEFAULT_MODE_ID,\n createdAt: persisted.createdAt ?? new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n ...(persisted.title !== undefined ? { title: persisted.title } : {}),\n };\n this.sessions.set(sessionId, restored);\n // Prime the turn engine so the next prompt's Agent resumes the\n // model's context, not just the client UI.\n this.seedFor?.(sessionId, persisted.history ?? []);\n for (const update of persisted.history ?? []) {\n await this.sendNotification({ sessionId, update });\n }\n await this.sendNotification({\n sessionId,\n update: { sessionUpdate: 'current_mode_update', modeId: restored.modeId },\n });\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {\n initialMode: { currentModeId: restored.modeId, availableModes: this.modes },\n },\n }));\n return false;\n }\n }\n\n if (existing) {\n // Session exists in memory — restore it.\n existing.updatedAt = new Date().toISOString();\n // Replay the recorded conversation history (user/agent message\n // chunks) so the reconnecting client sees the prior turns.\n const replay = sessionId ? this.replayFor?.(sessionId) : undefined;\n if (replay) {\n for (const update of replay) {\n await this.sendNotification({ sessionId, update });\n }\n }\n await this.sendNotification({\n sessionId,\n update: {\n sessionUpdate: 'session_info_update',\n updatedAt: existing.updatedAt,\n },\n });\n await this.sendNotification({\n sessionId,\n update: {\n sessionUpdate: 'current_mode_update',\n modeId: existing.modeId,\n },\n });\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {\n initialMode: {\n currentModeId: existing.modeId,\n availableModes: this.modes,\n },\n },\n }));\n return false;\n }\n\n // Session not found — spec says to return an error.\n await this.sendError(id, -32000, `session not found: ${sessionId}`);\n return false;\n }\n\n private async handleSessionResume(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown; cwd?: unknown; mcpServers?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const existing = sessionId ? this.sessions.get(sessionId) : undefined;\n\n if (existing) {\n existing.updatedAt = new Date().toISOString();\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {\n initialMode: {\n currentModeId: existing.modeId,\n availableModes: this.modes,\n },\n },\n }));\n return false;\n }\n\n await this.sendError(id, -32000, `session not found: ${sessionId}`);\n return false;\n }\n\n private async handleSessionClose(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const session = sessionId ? this.sessions.get(sessionId) : undefined;\n\n if (!session) {\n await this.sendError(id, -32000, `session not found: ${sessionId}`);\n return false;\n }\n\n // Abort any in-flight turn and remove the session.\n session.abort.abort();\n if (sessionId) this.sessions.delete(sessionId);\n\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {},\n }));\n return false;\n }\n\n private async handleSessionDelete(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n\n if (!sessionId) {\n await this.sendError(id, -32000, `session not found: ${sessionId}`);\n return false;\n }\n\n if (!this.sessions.has(sessionId)) {\n await this.transport.send(toWire({ jsonrpc: '2.0', id, result: { configOptions: [...this.configOptions] } }));\n return false;\n }\n const session = this.sessions.get(sessionId)!;\n session.abort.abort();\n this.sessions.delete(sessionId);\n\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {},\n }));\n return false;\n }\n\n private async handleSessionFork(id: string | number, params: unknown): Promise<boolean> {\n // Fork creates a new session from an existing one.\n const p = (params ?? {}) as { sessionId?: unknown; cwd?: unknown; mcpServers?: unknown };\n const sourceId = typeof p.sessionId === 'string' ? p.sessionId : null;\n if (!sourceId || !this.sessions.has(sourceId)) {\n await this.sendError(id, -32000, `session not found: ${sourceId}`);\n return false;\n }\n // Create a new session based on the source\n const forkParams: Record<string, unknown> = params as Record<string, unknown>;\n return this.handleSessionNew(id, { ...forkParams, cwd: p.cwd ?? this.defaultCwd });\n }\n\n private async handleProvidersList(id: string | number, _params: unknown): Promise<boolean> {\n // Return the current provider configuration.\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {\n providers: [],\n currentProviderId: null,\n },\n }));\n return false;\n }\n\n private async handleProvidersSet(id: string | number, _params: unknown): Promise<boolean> {\n await this.sendError(id, -32000, 'provider configuration not available through ACP; use wstack auth');\n return false;\n }\n\n private async handleProvidersDisable(id: string | number, _params: unknown): Promise<boolean> {\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: {},\n }));\n return false;\n }\n\n private async handleMcpMessage(id: string | number, _params: unknown): Promise<boolean> {\n await this.sendError(id, -32000, 'MCP message routing not available through ACP');\n return false;\n }\n\n private async handleSessionPrompt(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown; prompt?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n if (!sessionId || !this.sessions.has(sessionId)) {\n await this.sendError(id, -32000, 'unknown or missing sessionId');\n return false;\n }\n if (!Array.isArray(p.prompt)) {\n await this.sendError(id, -32602, 'prompt must be an array of content blocks');\n return false;\n }\n const session = this.sessions.get(sessionId)!;\n\n // If the previous turn was cancelled, recreate the AbortController\n // so a stale signal doesn't cancel the new turn.\n if (session.abort.signal.aborted) {\n session.abort = new AbortController();\n }\n\n const turnSignal = new AbortController();\n // Forward session/cancel notifications to the turn's signal.\n const onCancel = (): void => turnSignal.abort();\n session.abort.signal.addEventListener('abort', onCancel, { once: true });\n\n // Client-callback surface for this turn: lets the agent's tools ask\n // the connected client for permission, and use the client's filesystem\n // and terminal (when advertised) instead of the local ones.\n const api: RunTurnApi = {\n clientCapabilities: this.clientCapabilities,\n requestPermission: async (req) => {\n const res = await this.request('session/request_permission', {\n sessionId,\n toolCall: req.toolCall,\n options: req.options,\n });\n const outcome = (res as { outcome?: RequestPermissionOutcome } | undefined)?.outcome;\n return outcome ?? { outcome: 'cancelled' };\n },\n readTextFile: async (params) => {\n const res = await this.request('fs/read_text_file', { sessionId, ...params });\n return String((res as { content?: unknown })?.content ?? '');\n },\n writeTextFile: async (params) => {\n await this.request('fs/write_text_file', { sessionId, ...params });\n },\n runTerminal: async ({ command, args, cwd }) => {\n const created = (await this.request('terminal/create', {\n sessionId,\n command,\n ...(args ? { args } : {}),\n ...(cwd ? { cwd } : {}),\n })) as { terminalId?: string };\n const terminalId = created?.terminalId;\n if (!terminalId) return { output: '', exitCode: null };\n try {\n const exit = (await this.request('terminal/wait_for_exit', { sessionId, terminalId })) as {\n exitCode?: number | null;\n };\n const out = (await this.request('terminal/output', { sessionId, terminalId })) as {\n output?: unknown;\n };\n return {\n output: String(out?.output ?? ''),\n exitCode: typeof exit?.exitCode === 'number' ? exit.exitCode : null,\n };\n } finally {\n try {\n await this.request('terminal/release', { sessionId, terminalId });\n } catch {\n // best-effort release\n }\n }\n },\n };\n\n let result: RunTurnResult;\n try {\n result = await this.runTurn(\n { sessionId, prompt: p.prompt as ContentBlock[], signal: turnSignal.signal },\n (update) => this.sendNotification({ sessionId, update }),\n api,\n );\n } catch (err) {\n session.abort.signal.removeEventListener('abort', onCancel);\n const { code, message, data } = errorToJsonRpc(err);\n await this.sendError(id, code, message, data);\n return false;\n }\n session.abort.signal.removeEventListener('abort', onCancel);\n session.updatedAt = new Date().toISOString();\n await this.persist(session);\n\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: { stopReason: result.stopReason },\n }));\n return false;\n }\n\n private async handleSetMode(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown; modeId?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const modeId = typeof p.modeId === 'string' ? p.modeId : null;\n const session = sessionId ? this.sessions.get(sessionId) : undefined;\n if (!session || !modeId || !this.modes.some((m) => m.id === modeId)) {\n await this.sendError(id, -32602, 'invalid sessionId or modeId');\n return false;\n }\n session.modeId = modeId;\n session.updatedAt = new Date().toISOString();\n await this.sendNotification({\n sessionId,\n update: { sessionUpdate: 'current_mode_update', modeId },\n });\n await this.transport.send(toWire({ jsonrpc: '2.0', id, result: {} }));\n return false;\n }\n\n private async handleSetConfigOption(id: string | number, params: unknown): Promise<boolean> {\n const p = (params ?? {}) as { sessionId?: unknown; configId?: unknown; value?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const optionId = typeof p.configId === 'string' ? p.configId : null;\n const value = typeof p.value === 'string' ? p.value : null;\n const session = sessionId ? this.sessions.get(sessionId) : undefined;\n const option = optionId ? this.configOptions.find((o) => o.id === optionId) : undefined;\n if (!session || !option || value === null || !option.options.some((o) => o.value === value)) {\n await this.sendError(id, -32602, 'invalid sessionId, configId, or value');\n return false;\n }\n option.currentValue = value;\n session.updatedAt = new Date().toISOString();\n await this.sendNotification({\n sessionId,\n update: {\n sessionUpdate: 'config_option_update',\n configOptions: [...this.configOptions],\n },\n });\n await this.transport.send(toWire({ jsonrpc: '2.0', id, result: { configOptions: [...this.configOptions] } }));\n return false;\n }\n\n private async handleSessionList(id: string | number): Promise<boolean> {\n const sessions = Array.from(this.sessions.values()).map((s) => {\n const out: { sessionId: string; cwd: string; updatedAt: string; title?: string } = {\n sessionId: s.id,\n cwd: s.cwd,\n updatedAt: s.updatedAt,\n };\n if (s.title !== undefined) out.title = s.title;\n return out;\n });\n await this.transport.send(toWire({\n jsonrpc: '2.0',\n id,\n result: { sessions },\n }));\n return false;\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Notifications\n // ────────────────────────────────────────────────────────────────────\n\n private async handleNotification(method: string, params: unknown): Promise<boolean> {\n switch (method) {\n case 'session/cancel': {\n const p = (params ?? {}) as { sessionId?: unknown };\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : null;\n const session = sessionId ? this.sessions.get(sessionId) : undefined;\n if (session) {\n session.abort.abort();\n }\n return false;\n }\n case '$/cancel_request': {\n // Protocol-level request cancellation — no-op for now.\n return false;\n }\n case 'exit':\n // Client is shutting down. Best-effort: abort all sessions.\n this.close();\n return true;\n default:\n // Unknown notification — log and ignore.\n return false;\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Wire helpers\n // ────────────────────────────────────────────────────────────────────\n\n private async sendNotification(params: unknown): Promise<void> {\n await this.transport.send(toWire({ jsonrpc: '2.0', method: 'session/update', params }));\n }\n\n /** Best-effort durable persistence of a session + its recorded history. */\n private async persist(state: SessionState): Promise<void> {\n if (!this.store) return;\n try {\n await this.store.save(state, this.replayFor?.(state.id));\n } catch {\n // persistence is best-effort — never fail a request because the disk hiccuped\n }\n }\n\n private async sendError(\n id: string | number,\n code: number,\n message: string,\n data?: unknown,\n ): Promise<void> {\n const error: { code: number; message: string; data?: unknown } = { code, message };\n if (data !== undefined) error.data = data;\n await this.transport.send(toWire({ jsonrpc: '2.0', id, error }));\n }\n\n private allocId(): number {\n return this.nextId++;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Error mapping\n// ─────────────────────────────────────────────────────────────────────────\n\nfunction errorToJsonRpc(err: unknown): { code: number; message: string; data?: unknown } {\n if (err && typeof err === 'object') {\n const e = err as { code?: unknown; message?: unknown; data?: unknown };\n if (typeof e.code === 'number' && typeof e.message === 'string') {\n const result: { code: number; message: string; data?: unknown } = {\n code: e.code,\n message: e.message,\n };\n if (e.data !== undefined) result.data = e.data;\n return result;\n }\n }\n const message = err instanceof Error ? err.message : String(err);\n return { code: -32603, message };\n}\n","/**\n * ACPSessionStore — persistent session storage for the ACP server.\n *\n * Sessions are saved as JSON files in a configurable directory.\n * This enables session/load to work across server restarts.\n *\n * Format: one JSON file per session, named `<sessionId>.json`.\n */\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { SessionState } from './protocol-handler.js';\n\n/** A persisted conversation turn (user/agent message chunk) for replay. */\nexport interface PersistedHistoryUpdate {\n sessionUpdate: string;\n content: unknown;\n}\n\n/** A persisted session: metadata + replayable conversation history. */\nexport interface PersistedSession extends Partial<SessionState> {\n history?: PersistedHistoryUpdate[] | undefined;\n}\n\nexport interface SessionStoreOptions {\n /** Directory to store session files. Defaults to a temp dir. */\n dir?: string | undefined;\n}\n\nexport class ACPSessionStore {\n private readonly dir: string;\n /**\n * Memoized result of the first successful `init()`. Saved sessions\n * are the hot path — calling `mkdir(..., {recursive:true})` on every\n * turn adds an avoidable syscall to the per-prompt persistence flow.\n * Cleared automatically if the directory disappears between calls.\n */\n private initialized = false;\n\n constructor(opts: SessionStoreOptions = {}) {\n this.dir = opts.dir ?? path.join(process.cwd(), '.acp-sessions');\n }\n\n /** Ensure the store directory exists. Memoized — only mkdirs once. */\n async init(): Promise<void> {\n if (this.initialized) return;\n await fsp.mkdir(this.dir, { recursive: true });\n this.initialized = true;\n }\n\n /**\n * Persist a session state (and optionally its conversation history) to\n * disk. Returns the session id. `history` enables cross-restart\n * `session/load` replay.\n */\n async save(state: SessionState, history?: PersistedHistoryUpdate[]): Promise<string> {\n await this.init();\n await fsp.writeFile(\n path.join(this.dir, `${state.id}.json`),\n JSON.stringify({\n id: state.id,\n cwd: state.cwd,\n modeId: state.modeId,\n createdAt: state.createdAt,\n updatedAt: state.updatedAt,\n title: state.title,\n ...(history && history.length > 0 ? { history } : {}),\n }),\n 'utf8',\n );\n await this.updateIndex(state.id, state.updatedAt);\n return state.id;\n }\n\n /** Load a persisted session (metadata + history) from disk, or null. */\n async load(sessionId: string): Promise<PersistedSession | null> {\n try {\n const data = await fsp.readFile(path.join(this.dir, `${sessionId}.json`), 'utf8');\n return JSON.parse(data) as PersistedSession;\n } catch {\n return null;\n }\n }\n\n /** List all persisted sessions. */\n async list(): Promise<Array<{ id: string; updatedAt: string }>> {\n // Fast path: read the small sidecar index instead of every session\n // file. Rebuilds on first call if the index is missing or stale.\n const indexEntries = await this.readIndex();\n if (indexEntries !== null) {\n return indexEntries.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n }\n // Slow path fallback: scan the directory, parse each file, then\n // rebuild the index for next time. Same external contract as before.\n const files: string[] = [];\n try {\n const entries = await fsp.readdir(this.dir);\n for (const entry of entries) {\n if (entry.endsWith('.json') && entry !== 'index.json') {\n files.push(entry);\n }\n }\n } catch {\n return [];\n }\n\n const sessions: Array<{ id: string; updatedAt: string }> = [];\n for (const file of files) {\n try {\n const data = await fsp.readFile(path.join(this.dir, file), 'utf8');\n const parsed = JSON.parse(data) as { id?: string; updatedAt?: string };\n if (parsed.id) {\n sessions.push({ id: parsed.id, updatedAt: parsed.updatedAt ?? '' });\n }\n } catch {\n // Corrupted file — skip\n }\n }\n sessions.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n // Best-effort rebuild; failure to write the index does not affect\n // the returned list.\n void this.writeIndex(sessions).catch(() => undefined);\n return sessions;\n }\n\n /** Sidecar path that stores `{id, updatedAt}` for every saved session. */\n private indexPath(): string {\n return path.join(this.dir, 'index.json');\n }\n\n /** Read the sidecar index. Returns `null` when missing or unreadable. */\n private async readIndex(): Promise<Array<{ id: string; updatedAt: string }> | null> {\n try {\n const data = await fsp.readFile(this.indexPath(), 'utf8');\n const parsed = JSON.parse(data);\n if (!Array.isArray(parsed)) return null;\n const out: Array<{ id: string; updatedAt: string }> = [];\n for (const e of parsed) {\n if (\n e &&\n typeof (e as { id?: unknown }).id === 'string' &&\n typeof (e as { updatedAt?: unknown }).updatedAt === 'string'\n ) {\n out.push({\n id: (e as { id: string }).id,\n updatedAt: (e as { updatedAt: string }).updatedAt,\n });\n }\n }\n return out;\n } catch {\n return null;\n }\n }\n\n /** Atomically replace the sidecar index with the supplied entries. */\n private async writeIndex(entries: Array<{ id: string; updatedAt: string }>): Promise<void> {\n const target = this.indexPath();\n const tmp = `${target}.${process.pid}.${Date.now()}.tmp`;\n await fsp.writeFile(tmp, JSON.stringify(entries), 'utf8');\n await fsp.rename(tmp, target);\n }\n\n /** Update one entry in the index, adding it if missing. Best-effort. */\n private async updateIndex(id: string, updatedAt: string): Promise<void> {\n let entries = await this.readIndex();\n if (entries === null) {\n // No index yet — fall back to a full scan to populate it.\n await this.list();\n return;\n }\n const i = entries.findIndex((e) => e.id === id);\n if (i >= 0) entries[i] = { id, updatedAt };\n else entries.push({ id, updatedAt });\n try {\n await this.writeIndex(entries);\n } catch {\n // Index is best-effort; per-session file is the source of truth.\n }\n }\n\n /** Delete a session file. */\n async delete(sessionId: string): Promise<void> {\n try {\n await fsp.unlink(path.join(this.dir, `${sessionId}.json`));\n } catch {\n // File may not exist — ignore\n }\n // Best-effort: drop the entry from the sidecar index so future\n // `list()` calls don't return a stale row.\n const entries = await this.readIndex();\n if (entries === null) return;\n const next = entries.filter((e) => e.id !== sessionId);\n if (next.length !== entries.length) {\n try {\n await this.writeIndex(next);\n } catch {\n // Index is best-effort; next list() rebuild will fix it.\n }\n }\n }\n\n /** Get the store directory path. */\n getDirectory(): string {\n return this.dir;\n }\n}\n","/**\n * WsBridgeTransport — an `AgentServerTransport` backed by a single\n * bidirectional message channel (one WebSocket connection).\n *\n * Unlike stdio (a process-wide pipe driven by a read loop) or HTTP (one\n * request/response per POST, notifications buffered), a WebSocket is a live\n * full-duplex channel: the agent can stream `session/update` notifications\n * and make `session/request_permission` callbacks WHILE a turn runs. This\n * transport is the seam that lets `ACPProtocolHandler` drive one such\n * connection.\n *\n * It is dependency-free and structural: the caller (the CLI, which already\n * depends on `ws`) constructs it with a `send` sink and feeds inbound\n * messages via `receive(msg)`. One handler + one transport per connection.\n */\nimport type { ACPMessage } from '../types/acp-messages.js';\nimport type { AgentServerTransport } from './stdio-transport.js';\n\nexport class WsBridgeTransport implements AgentServerTransport {\n private readonly handlers = new Set<(msg: ACPMessage) => void>();\n private closed = false;\n\n /** @param sink Called with each outbound message to write to the socket. */\n constructor(private readonly sink: (msg: ACPMessage) => void) {}\n\n send(msg: ACPMessage): Promise<void> {\n if (this.closed) return Promise.resolve();\n try {\n this.sink(msg);\n } catch {\n // socket write failures tear the connection down elsewhere\n }\n return Promise.resolve();\n }\n\n sendRaw(): void {\n // Raw byte writes have no meaning over a JSON-message WebSocket.\n }\n\n read(): Promise<ACPMessage | null> {\n // The WS server drives the handler via handleMessage(receive); the\n // read-loop model isn't used for this transport.\n return Promise.resolve(null);\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.handlers.clear();\n }\n\n /**\n * Feed one inbound message from the socket. Fires the registered\n * `onMessage` handlers (which route JSON-RPC responses to pending\n * outbound requests inside the handler). Inbound *requests* are processed\n * by the caller via `handler.handleMessage(msg)` — call both per message.\n */\n receive(msg: ACPMessage): void {\n if (this.closed) return;\n for (const handler of [...this.handlers]) {\n try {\n handler(msg);\n } catch {\n // a faulty consumer must not break the socket pump\n }\n }\n }\n}\n","/**\n * WrongStackACPServer — ACP v1 server-side entry point.\n *\n * Exposes WrongStack as an ACP-compatible agent. ACP clients (Zed, JetBrains\n * Junie, VS Code ACP extension) spawn this as a subprocess, send JSON-RPC\n * messages over stdio, and receive v1-protocol responses.\n *\n * Usage:\n * node dist/agent/wrongstack-acp-agent.js\n *\n * Or via the CLI:\n * wstack acp-server\n *\n * Wiring a real agent: this class is the surface; the bootstrap\n * binary uses a no-op echo by default so the binary is a useful\n * connectivity smoke test. For a real server, instantiate\n * `WrongStackACPServer` programmatically and pass a `runTurn`\n * produced by `makeACPServerAgentTurn({ agentFor: ... })` from\n * `./server-agent-turn.js`. The factory is responsible for building\n * a real core `Agent` (with the right provider, model, system prompt,\n * etc.) per session.\n *\n * Startup: stdout is JSON-RPC only by default. The legacy `[wstack-acp]\\n`\n * marker can be enabled for older internal harnesses with\n * `legacyStartupMarker`, but ACP clients should rely on v1 initialize.\n */\nimport { fileURLToPath } from 'node:url';\nimport { createServer, type Server } from 'node:http';\nimport { writeErr } from '@wrongstack/core';\nimport type { ACPMessage } from '../types/acp-messages.js';\nimport {\n ACPProtocolHandler,\n type RunTurn,\n type RunTurnResult,\n type SessionPersistence,\n} from './protocol-handler.js';\nimport { StdioTransport } from './stdio-transport.js';\n\nexport interface WrongStackACPServerOptions {\n runTurn?: RunTurn | undefined;\n defaultCwd?: string | undefined;\n agentName?: string | undefined;\n /**\n * Transport mode. 'stdio' (default) communicates over stdin/stdout.\n * When a number is provided, the server listens as an HTTP server on\n * that port, accepting Streamable HTTP (JSON-RPC over HTTP POST).\n */\n transport?: 'stdio' | number | undefined;\n /** Host for HTTP transport. Defaults to '127.0.0.1'. */\n host?: string | undefined;\n /** Emit the pre-v1 startup marker on stdio. Defaults to false. */\n legacyStartupMarker?: boolean | undefined;\n /**\n * Conversation-history source for `session/load` replay. Pass\n * `makeACPServerAgentTurn(...).replay` here so a reconnecting client\n * gets prior turns streamed back.\n */\n replayFor?: ((sessionId: string) => Array<{ sessionUpdate: string; content: unknown }>) | undefined;\n /**\n * Cold-load seed hook. Pass `makeACPServerAgentTurn(...).seed` so a\n * restored session's Agent resumes the model context, not just the UI.\n */\n seedFor?: ((sessionId: string, history: Array<{ sessionUpdate: string; content: unknown }>) => void) | undefined;\n /**\n * Durable session store. When set, sessions + history are persisted and\n * restored across restarts for `session/load`. Pass an `ACPSessionStore`.\n */\n store?: SessionPersistence | undefined;\n}\n\nexport class WrongStackACPServer {\n private readonly transport: StdioTransport;\n private readonly handler: ACPProtocolHandler;\n private readonly options: WrongStackACPServerOptions;\n /** HTTP server when transport mode is HTTP. */\n private httpServer: Server | null = null;\n private running = false;\n\n constructor(opts: WrongStackACPServerOptions = {}) {\n this.options = opts;\n this.transport = new StdioTransport();\n const runTurn: RunTurn = opts.runTurn ?? defaultEchoRunTurn;\n this.handler = new ACPProtocolHandler({\n transport: this.transport,\n defaultCwd: opts.defaultCwd ?? process.cwd(),\n runTurn,\n agentName: opts.agentName,\n ...(opts.replayFor ? { replayFor: opts.replayFor } : {}),\n ...(opts.seedFor ? { seedFor: opts.seedFor } : {}),\n ...(opts.store ? { store: opts.store } : {}),\n });\n }\n\n /**\n * Start the server. Mode depends on `options.transport`:\n * - 'stdio' (default): reads JSON-RPC from stdin, writes to stdout.\n * - number: listens as HTTP on the given port.\n */\n async start(): Promise<void> {\n const transportMode = this.options.transport;\n if (typeof transportMode === 'number') {\n await this.startHttp(transportMode);\n } else {\n await this.startStdio();\n }\n }\n\n private async startStdio(): Promise<void> {\n if (this.options.legacyStartupMarker) {\n this.transport.sendStartupMarker();\n }\n this.running = true;\n while (this.running) {\n const msg = await this.transport.read();\n if (!msg) break;\n const terminal = await this.handler.handleMessage(msg);\n if (terminal) break;\n }\n this.transport.close();\n }\n\n private async startHttp(port: number): Promise<void> {\n const host = this.options.host ?? '127.0.0.1';\n const handler = this.handler;\n\n this.httpServer = createServer(async (req, res) => {\n // Origin guard. Real ACP/MCP clients (Zed, JetBrains, curl, the MCP SDK)\n // are non-browser and send no `Origin` header, so they are unaffected. A\n // browser making a cross-origin request DOES send `Origin`; reject it so a\n // malicious web page the user visits cannot reach this loopback agent and\n // drive it (a real `runTurn` executes tools/commands — i.e. RCE). This\n // replaces the previous `Access-Control-Allow-Origin: *`, which let any\n // site read responses from, and POST to, this server.\n const selfOrigin = `http://${host}:${port}`;\n const reqOrigin = Array.isArray(req.headers.origin)\n ? req.headers.origin[0]\n : req.headers.origin;\n if (reqOrigin && reqOrigin !== selfOrigin) {\n res.writeHead(403);\n res.end(JSON.stringify({ error: 'cross-origin request forbidden' }));\n return;\n }\n // Never reflect a wildcard — only echo our own origin back (for same-origin\n // browser tooling). `Authorization` is intentionally omitted from the\n // allow-list: it is not enforced here, so advertising it would mislead.\n if (reqOrigin) res.setHeader('Access-Control-Allow-Origin', reqOrigin);\n res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Mcp-Session-Id');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n if (req.method !== 'POST') {\n res.writeHead(405);\n res.end(JSON.stringify({ error: 'method not allowed' }));\n return;\n }\n\n // Parse JSON body\n let body = '';\n for await (const chunk of req) {\n body += chunk;\n }\n\n let msg: unknown;\n try {\n msg = JSON.parse(body);\n } catch {\n res.writeHead(400);\n res.end(JSON.stringify({ error: { code: -32700, message: 'Parse error' } }));\n return;\n }\n\n // Process the message and return the response. For HTTP transport we\n // must NOT let the handler write to stdout — instead we intercept\n // `transport.send` and capture the JSON-RPC response + any buffered\n // notifications, then return them inline (Streamable HTTP pattern).\n const notifications: unknown[] = [];\n let response: ACPMessage | null = null;\n const originalSend = this.transport.send.bind(this.transport);\n this.transport.send = async (m: ACPMessage) => {\n if (m.id !== undefined && (m.result !== undefined || m.error !== undefined)) {\n // The JSON-RPC response to this request — capture, don't write\n // to stdout (which is meaningless over HTTP).\n response = m;\n } else if (m.method === 'session/update') {\n notifications.push(m.params);\n } else {\n // Any other server-initiated notification — buffer it too.\n notifications.push(m);\n }\n };\n\n try {\n await handler.handleMessage(msg);\n } finally {\n this.transport.send = originalSend;\n }\n\n res.writeHead(200, { 'Content-Type': 'application/json' });\n const responseBody =\n response !== null\n ? { ...(response as ACPMessage), notifications }\n : { notifications };\n res.end(JSON.stringify(responseBody));\n });\n\n return new Promise<void>((resolve) => {\n this.httpServer!.listen(port, host, () => {\n writeErr(`[wstack-acp] HTTP server listening on http://${host}:${port}\\n`);\n this.running = true;\n resolve();\n });\n });\n }\n\n /** Stop the server. */\n stop(): void {\n this.running = false;\n this.transport.close();\n if (this.httpServer) {\n this.httpServer.close();\n this.httpServer = null;\n }\n }\n}\n\n/**\n * Default per-turn implementation: a no-op that echoes nothing useful\n * and returns `end_turn`. Lets the server boot end-to-end without\n * needing the core Agent factory (which would couple this entrypoint\n * to a long-lived model provider). The real implementation is\n * `ACPServerAgentTurn` (follow-up PR) that wires a core `Agent`.\n */\nconst defaultEchoRunTurn: RunTurn = async (_input, _emit): Promise<RunTurnResult> => {\n return { stopReason: 'end_turn' };\n};\n\n/**\n * Bootstrap function for `node dist/agent/wrongstack-acp-agent.js`.\n * Instantiates the server with the default (no-op) runTurn so the\n * binary is useful as a connectivity smoke test.\n *\n * In practice the CLI will instantiate and run `WrongStackACPServer`\n * directly, passing a real `runTurn` wired to a core `Agent`.\n */\n/* v8 ignore start -- process entrypoint: bootstrap + auto-start only run when launched as `node wrongstack-acp-agent.js`, never on import (which the CLI does to reuse the class). */\nasync function main(): Promise<void> {\n const server = new WrongStackACPServer();\n await server.start();\n}\n\nconst isEntrypoint =\n process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1];\nif (isEntrypoint) {\n main().catch((err) => {\n writeErr(`[wstack-acp fatal] ${err}\\n`);\n process.exit(1);\n });\n}\n/* v8 ignore stop */\n","/**\n * ACPServerAgentTurn — `RunTurn` adapter for the v1 server side.\n *\n * Wires the ACP v1 server (`ACPProtocolHandler`) to a core `Agent`.\n * Each session gets its own `Agent` instance (per spec: sessions are\n * isolated; sharing agents across sessions would defeat isolation).\n * The agent is created lazily on the first `session/prompt` and\n * torn down when the server is closed or the session is removed.\n *\n * The adapter:\n * - converts the ACP `ContentBlock[]` prompt into a single string\n * (concatenating text blocks; non-text blocks are recorded as a\n * note in the prompt — future work can route images / audio to\n * the appropriate provider)\n * - calls `agent.run(prompt, {signal})` to drive the core loop\n * - captures the agent's text result and emits it as one or more\n * `agent_message_chunk` notifications\n * - maps the agent's stop semantics to a v1 `StopReason`\n *\n * Streaming: the core `Agent` API is not currently token-streamed\n * through this surface (its `run()` returns a final `RunResult`).\n * v1 clients expect text deltas, but most implementations batch\n * them — a single chunk per turn is acceptable. A future\n * enhancement can use the Agent's `Renderer` interface to capture\n * deltas as they're written, then forward them as multiple chunks.\n *\n * Scope: the adapter is deliberately minimal. It does NOT:\n * - model the full conversation history across turns (the v1 spec\n * leaves this to the agent; on the next prompt we re-feed the\n * latest user message and the agent handles its own history)\n * - use the agent's tool registry, permission policy, or\n * extensions (this adapter is the lowest-fidelity integration;\n * a future PR can wire a richer session-aware agent)\n * - stream deltas token-by-token (see \"Streaming\" above)\n *\n * Cancellation: the parent `AbortSignal` propagates through\n * `agent.run({signal})` and the underlying provider call observes\n * it. On abort, the adapter maps the resulting `AbortError` to\n * `{stopReason: 'cancelled'}`.\n */\nimport type { Agent, AgentInput } from '@wrongstack/core';\nimport type {\n ContentBlock,\n PlanEntry,\n StopReason,\n ToolKind,\n UsageCost,\n} from '../types/acp-v1.js';\nimport type {\n RunTurn,\n RunTurnApi,\n RunTurnResult,\n} from './protocol-handler.js';\n\nexport interface ACPServerAgentTurnOptions {\n /**\n * Factory that creates a fresh `Agent` for a given session.\n * Called once per session on the first `session/prompt` turn.\n * The factory must isolate each agent — sharing one agent\n * across sessions would defeat v1's session-isolation model.\n *\n * `api` (when provided) is the client-callback surface: ask the client\n * for permission, and use the client's filesystem/terminal when it\n * advertises those capabilities. A factory that wires it builds a\n * client-backed permission policy and ACP-backed fs/terminal tools\n * instead of silently auto-approving against the local disk.\n */\n agentFor: (\n sessionId: string,\n cwd: string,\n api?: RunTurnApi,\n ) => Promise<Agent> | Agent;\n /**\n * Hard wall-clock cap for one turn. The agent's own provider\n * timeout is layered under this; this cap is a safety belt.\n * Default 5 minutes.\n */\n timeoutMs?: number | undefined;\n}\n\n/** A recorded conversation turn, replayable on `session/load`. */\nexport interface SessionReplayUpdate {\n sessionUpdate: 'user_message_chunk' | 'agent_message_chunk';\n content: { type: 'text'; text: string };\n}\n\n/**\n * A `RunTurn` that also exposes the recorded per-session history so the\n * server can replay it on `session/load`.\n */\nexport interface ACPServerAgentTurn {\n (input: Parameters<RunTurn>[0], emit: Parameters<RunTurn>[1], api?: Parameters<RunTurn>[2]): Promise<RunTurnResult>;\n /** Recorded user/agent text turns for a session, in order. */\n replay(sessionId: string): SessionReplayUpdate[];\n /**\n * Seed a session's history (from a durable store on cold `session/load`)\n * so `replay()` returns it AND the next-created `Agent` for the session is\n * primed with the prior conversation as model context — not just the\n * client UI. Call before the first post-load `session/prompt`.\n */\n seed(sessionId: string, history: ReadonlyArray<{ sessionUpdate: string; content: unknown }>): void;\n}\n\n/**\n * Build a `RunTurn` that owns per-session `Agent` instances and\n * delegates each turn to the appropriate agent. The returned\n * function is reusable across sessions — the agents are kept in a\n * Map keyed by `sessionId`. It also records each turn's user/agent\n * text so the server can replay history on `session/load` (see\n * `.replay(sessionId)`).\n */\nexport function makeACPServerAgentTurn(\n opts: ACPServerAgentTurnOptions,\n): ACPServerAgentTurn {\n const agents = new Map<string, Agent>();\n const timeouts = new Map<string, ReturnType<typeof setTimeout>>();\n const history = new Map<string, SessionReplayUpdate[]>();\n // Sessions restored from a durable store whose freshly-created Agent must\n // be primed with the prior conversation before its first turn runs.\n const pendingSeed = new Set<string>();\n const timeoutMs = opts.timeoutMs ?? 5 * 60_000;\n\n const turn = async (\n input: Parameters<RunTurn>[0],\n emit: Parameters<RunTurn>[1],\n api?: Parameters<RunTurn>[2],\n ): Promise<RunTurnResult> => {\n // Lazily create an agent for this session on the first turn.\n let agent = agents.get(input.sessionId);\n if (!agent) {\n agent = await opts.agentFor(input.sessionId, process.cwd(), api);\n agents.set(input.sessionId, agent);\n // Cold-load priming: re-feed the restored conversation into the new\n // agent's context so the MODEL resumes (not just the client UI).\n if (pendingSeed.has(input.sessionId)) {\n pendingSeed.delete(input.sessionId);\n seedAgentContext(agent, history.get(input.sessionId) ?? []);\n }\n }\n\n // Per-turn safety belt: a hard wall-clock cap that actually aborts the\n // run. We drive `agent.run` with a derived signal that fires when EITHER\n // the parent signal (client `session/cancel`) aborts OR the timer\n // elapses. Without this, a provider call that ignores the parent signal\n // would hang forever despite the documented `timeoutMs` cap.\n const turnAbort = new AbortController();\n const abortForTimeout = (): void => turnAbort.abort();\n const onParentAbort = (): void => turnAbort.abort();\n if (input.signal.aborted) {\n turnAbort.abort();\n } else {\n input.signal.addEventListener('abort', onParentAbort, { once: true });\n }\n const timer = setTimeout(() => {\n timeouts.delete(input.sessionId);\n abortForTimeout();\n }, timeoutMs);\n timeouts.set(input.sessionId, timer);\n\n // Stream the core agent's tool activity to the ACP client as\n // tool_call / tool_call_update notifications so editors (Zed,\n // JetBrains, …) render live tool cards + statuses instead of seeing\n // a silent gap until the final text. We subscribe for the duration\n // of this turn and detach in the finally block.\n const unsub: Array<() => void> = [];\n // Real `Agent` always exposes `.events`; guard for Agent-like fakes.\n const bus = (agent as { events?: { on?: typeof agent.events.on } }).events;\n if (bus?.on) {\n unsub.push(\n bus.on('tool.started', (e) => {\n emit({\n sessionUpdate: 'tool_call',\n toolCallId: e.id,\n title: toolTitle(e.name, e.input),\n kind: toolNameToKind(e.name),\n status: 'in_progress',\n ...(isRecord(e.input) ? { rawInput: e.input } : {}),\n });\n }),\n bus.on('tool.executed', (e) => {\n emit({\n sessionUpdate: 'tool_call_update',\n toolCallId: e.id ?? e.name,\n status: e.ok ? 'completed' : 'failed',\n ...(e.output !== undefined\n ? {\n content: [\n { type: 'content', content: { type: 'text', text: e.output } },\n ],\n }\n : {}),\n });\n }),\n );\n }\n\n try {\n const userInput = promptToAgentInput(input.prompt);\n const result = await agent.run(userInput, { signal: turnAbort.signal });\n\n // Stream the agent's final text back\n const text = extractText(result);\n if (text) {\n emit({\n sessionUpdate: 'agent_message_chunk',\n content: { type: 'text', text },\n });\n }\n\n // Record the turn so `session/load` can replay the conversation.\n const userText = promptToText(input.prompt);\n const hist = history.get(input.sessionId) ?? [];\n if (userText) {\n hist.push({ sessionUpdate: 'user_message_chunk', content: { type: 'text', text: userText } });\n }\n if (text) {\n hist.push({ sessionUpdate: 'agent_message_chunk', content: { type: 'text', text } });\n }\n if (hist.length > 0) history.set(input.sessionId, hist);\n\n // Emit plan if the agent provided one\n const plan = extractPlan(result);\n if (plan.length > 0) {\n emit({\n sessionUpdate: 'plan',\n entries: plan,\n });\n }\n\n // Emit usage if the agent provided one\n const usage = extractUsage(result);\n if (usage) {\n emit({\n sessionUpdate: 'usage_update',\n used: usage.used,\n size: usage.size,\n ...(usage.cost ? { cost: usage.cost } : {}),\n });\n }\n\n const result_out: RunTurnResult = {\n // `turnAbort.signal` covers both client cancellation and the\n // wall-clock timeout, so either maps to stopReason 'cancelled'.\n stopReason: pickStopReason(result, turnAbort.signal),\n };\n if (text) result_out.text = text;\n const runTurnPlan = extractPlan(result);\n if (runTurnPlan.length > 0) result_out.plan = runTurnPlan;\n if (usage) result_out.usage = usage;\n return result_out;\n } finally {\n clearTimeout(timer);\n timeouts.delete(input.sessionId);\n input.signal.removeEventListener('abort', onParentAbort);\n for (const u of unsub) u();\n }\n };\n\n const replay = (sessionId: string): SessionReplayUpdate[] =>\n history.get(sessionId) ?? [];\n\n const seed = (\n sessionId: string,\n incoming: ReadonlyArray<{ sessionUpdate: string; content: unknown }>,\n ): void => {\n if (incoming.length === 0) return;\n history.set(sessionId, [...incoming] as SessionReplayUpdate[]);\n pendingSeed.add(sessionId);\n };\n\n return Object.assign(turn, { replay, seed });\n}\n\n/**\n * Prime a freshly-created agent's conversation state with restored history.\n * Each recorded user/agent chunk becomes a `user`/`assistant` message so the\n * model continues the prior conversation instead of starting blank.\n */\nfunction seedAgentContext(\n agent: Agent,\n history: ReadonlyArray<{ sessionUpdate: string; content: unknown }>,\n): void {\n const state = (agent as { ctx?: { state?: { appendMessage?: (m: unknown) => void } } }).ctx?.state;\n if (!state?.appendMessage) return;\n for (const u of history) {\n const text = (u.content as { text?: unknown } | undefined)?.text;\n if (typeof text !== 'string' || text.length === 0) continue;\n const role = u.sessionUpdate === 'user_message_chunk' ? 'user' : 'assistant';\n state.appendMessage({ role, content: text });\n }\n}\n\n/** Map a WrongStack tool name to the closest ACP ToolKind for UI grouping. */\nfunction toolNameToKind(name: string): ToolKind {\n const n = name.toLowerCase();\n if (n.includes('read') || n.includes('cat')) return 'read';\n if (n.includes('write') || n.includes('edit') || n.includes('apply') || n.includes('patch')) return 'edit';\n if (n.includes('delete') || n.includes('rm')) return 'delete';\n if (n.includes('move') || n.includes('rename') || n.includes('mv')) return 'move';\n if (n.includes('grep') || n.includes('glob') || n.includes('search') || n.includes('find')) return 'search';\n if (n.includes('bash') || n.includes('shell') || n.includes('exec') || n.includes('run') || n.includes('terminal')) return 'execute';\n if (n.includes('fetch') || n.includes('http') || n.includes('web') || n.includes('url')) return 'fetch';\n if (n.includes('think') || n.includes('plan')) return 'think';\n return 'other';\n}\n\n/** A short, human-readable title for a tool call card. */\nfunction toolTitle(name: string, input: unknown): string {\n if (isRecord(input)) {\n const path = input.path ?? input.file ?? input.filePath ?? input.pattern ?? input.command;\n if (typeof path === 'string' && path.length > 0) {\n return `${name}: ${path.length > 80 ? `${path.slice(0, 77)}…` : path}`;\n }\n }\n return name;\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\n/**\n * Convert an ACP `ContentBlock[]` prompt into a core `AgentInput`.\n *\n * When the prompt is all text we return a plain string (the common,\n * cheapest path). When it carries images we build a multimodal\n * `ContentBlock[]` the provider can pass to a vision-capable model.\n * Audio and resource blocks have no core representation yet, so they're\n * recorded as bracketed text placeholders alongside the other content.\n */\nfunction promptToAgentInput(blocks: readonly ContentBlock[]): AgentInput {\n const hasImage = blocks.some((b) => b.type === 'image');\n if (!hasImage) {\n return promptToText(blocks);\n }\n const out: AgentInput = [];\n for (const b of blocks) {\n if (b.type === 'text') {\n out.push({ type: 'text', text: b.text });\n } else if (b.type === 'image') {\n out.push({\n type: 'image',\n source: { type: 'base64', media_type: b.mimeType, data: b.data },\n });\n } else if (b.type === 'audio') {\n out.push({ type: 'text', text: `[audio: ${b.mimeType}]` });\n } else if (b.type === 'resource') {\n const text =\n 'text' in b.resource && typeof b.resource.text === 'string'\n ? b.resource.text\n : `[embedded resource: ${b.resource.uri}]`;\n out.push({ type: 'text', text });\n } else if (b.type === 'resource_link') {\n out.push({ type: 'text', text: `[resource link: ${b.uri}]` });\n }\n }\n return out;\n}\n\n/**\n * Tear down the agents and timers held by a turn factory. The\n * server's `close()` should call this so child connections don't\n * outlive the server.\n */\nexport function disposeACPServerAgentTurn(\n opts: { agents: Map<string, Agent> },\n): Promise<void> {\n return Promise.allSettled(\n Array.from(opts.agents.values()).map((agent) => agent.teardown()),\n ).then(() => undefined);\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────\n\n/**\n * Convert an ACP `ContentBlock[]` prompt to a single user-message\n * string. Text blocks are concatenated; image / audio / resource\n * blocks are recorded as a bracketed placeholder (full multimodal\n * support is a future PR — the adapter is v1-text only for now).\n */\nfunction promptToText(blocks: readonly ContentBlock[]): string {\n const parts: string[] = [];\n for (const b of blocks) {\n if (b.type === 'text') {\n parts.push(b.text);\n } else if (b.type === 'image') {\n parts.push(`[image: ${b.mimeType}]`);\n } else if (b.type === 'audio') {\n parts.push(`[audio: ${b.mimeType}]`);\n } else if (b.type === 'resource') {\n parts.push(`[embedded resource: ${b.resource.uri}]`);\n } else if (b.type === 'resource_link') {\n parts.push(`[resource link: ${b.uri}]`);\n }\n }\n return parts.join('\\n').trim();\n}\n\n/**\n * Extract the agent's final text from a `RunResult`. The shape\n * varies across core versions, so we read the most common fields\n * defensively and concatenate whatever text we find.\n */\nfunction extractText(result: unknown): string {\n if (typeof result !== 'object' || result === null) return '';\n const r = result as Record<string, unknown>;\n // v1: result.text is the agent's final text (string).\n if (typeof r.text === 'string') return r.text;\n // Legacy: result.content is an array of blocks.\n if (Array.isArray(r.content)) {\n const parts: string[] = [];\n for (const c of r.content) {\n if (typeof c === 'object' && c !== null) {\n const cb = c as { type?: string; text?: unknown };\n if (cb.type === 'text' && typeof cb.text === 'string') parts.push(cb.text);\n }\n }\n return parts.join('');\n }\n return '';\n}\n\n/**\n * Map a `RunResult` (and the parent signal) to a v1 `StopReason`.\n *\n * If the parent signal was aborted, return `'cancelled'`. Otherwise\n * the agent completed normally — we treat any non-error result\n * as `'end_turn'`. The core `RunResult` doesn't currently surface\n * a per-turn stop reason, so v1's `'max_tokens'`, `'max_turn_requests'`,\n * and `'refusal'` discriminators can't be emitted precisely; we\n * log a warning if the result carries an error and return the\n * generic end_turn.\n */\nfunction pickStopReason(result: unknown, signal: AbortSignal): StopReason {\n if (signal.aborted) return 'cancelled';\n if (typeof result !== 'object' || result === null) return 'end_turn';\n const r = result as { error?: unknown; stopReason?: unknown };\n if (r.error) {\n return 'end_turn';\n }\n if (typeof r.stopReason === 'string' && r.stopReason) {\n return r.stopReason as StopReason;\n }\n return 'end_turn';\n}\n\n/**\n * Extract a plan from the agent's RunResult, if available.\n * The plan is an array of PlanEntry objects.\n */\nfunction extractPlan(result: unknown): PlanEntry[] {\n if (typeof result !== 'object' || result === null) return [];\n const r = result as Record<string, unknown>;\n if (Array.isArray(r.plan)) {\n // Agent provided a plan array\n return r.plan.filter(\n (e: unknown) =>\n typeof e === 'object' && e !== null && typeof (e as { content?: unknown }).content === 'string',\n ) as PlanEntry[];\n }\n return [];\n}\n\n/**\n * Extract usage/token info from the agent's RunResult, if available.\n */\nfunction extractUsage(\n result: unknown,\n): { used: number; size: number; cost?: UsageCost | undefined } | null {\n if (typeof result !== 'object' || result === null) return null;\n const r = result as Record<string, unknown>;\n if (typeof r.usage === 'object' && r.usage !== null) {\n const u = r.usage as { used?: unknown; size?: unknown; cost?: unknown };\n if (typeof u.used === 'number' && typeof u.size === 'number') {\n return {\n used: u.used,\n size: u.size,\n ...(typeof u.cost === 'object' && u.cost !== null ? { cost: u.cost as UsageCost } : {}),\n };\n }\n }\n return null;\n}\n"]}
|