@theokit/acp 3.0.0 → 4.0.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/agent-resolver.ts","../src/lifecycle.ts","../src/translator.ts","../src/permission-plugin.ts","../src/types.ts","../src/prompt-extract.ts","../src/prompt-handler.ts","../src/session-store.ts","../src/serve.ts"],"names":["acp","path","existsSync","randomUUID","Agent","Plugin","ConfigurationError","Readable","stream","acp2"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Normalize `serveAcp({ agent })` into a uniform `AgentFactory` (D351).\n *\n * - Function input → passed through as-is.\n * - SDKAgent instance → wrapped in a memoized factory + one-time stderr warning\n * (single shared agent defeats per-session isolation).\n * - Anything else → ConfigurationError thrown synchronously.\n *\n * @internal\n */\n\nimport type { SDKAgent } from \"@theokit/sdk\";\nimport type { AgentFactory, AgentOrFactory } from \"./types.js\";\n\nfunction looksLikeSDKAgent(value: unknown): value is SDKAgent {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { agentId?: unknown }).agentId === \"string\" &&\n typeof (value as { send?: unknown }).send === \"function\"\n );\n}\n\nexport class InvalidAgentError extends Error {\n override readonly name = \"InvalidAgentError\";\n}\n\ninterface ResolverOptions {\n log?: (msg: string) => void;\n}\n\nexport function resolveAgentFactory(\n input: AgentOrFactory,\n options: ResolverOptions = {},\n): AgentFactory {\n const log = options.log ?? ((msg: string) => process.stderr.write(`${msg}\\n`));\n\n if (typeof input === \"function\") {\n return input as AgentFactory;\n }\n\n if (looksLikeSDKAgent(input)) {\n let warned = false;\n return (_sessionId: string): SDKAgent => {\n if (!warned) {\n warned = true;\n log(\n \"[acp] WARN: serveAcp received a single SDKAgent instance; sessions will share conversation state. \" +\n \"Pass a factory (sessionId) => Agent.create(...) for per-session isolation (D351).\",\n );\n }\n return input;\n };\n }\n\n throw new InvalidAgentError(\n \"serveAcp({ agent }) must receive an SDKAgent or a factory (sessionId) => SDKAgent | Promise<SDKAgent>\",\n );\n}\n","/**\n * ACP lifecycle handlers (D352, D354, EC-1/3/5/6).\n *\n * - handleInitialize: capability advertisement (D353)\n * - handleNewSession: Agent.create via factory (D351)\n * - handleLoadSession: Agent.resume({ agentId: sessionId }) (D352, EC-6)\n * - handleForkSession: agent.fork() (D352, EC-3)\n * - handleListSessions: snapshot of in-memory sessions\n * - handleCancel: fire lifecycle abort (D354)\n *\n * All handlers are pure functions over `(params, deps)`. `serve.ts` wires them.\n *\n * @internal\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport * as acp from \"@agentclientprotocol/sdk\";\nimport { Agent, type SDKAgent } from \"@theokit/sdk\";\nimport type { AcpSession, SessionStore } from \"./session-store.js\";\nimport type { AcpCapabilities, AgentFactory } from \"./types.js\";\n\n// ===== initialize =====\n\ninterface InitializeDeps {\n capabilities?: AcpCapabilities;\n}\n\nexport function buildInitializeResponse(\n _params: acp.InitializeRequest,\n deps: InitializeDeps,\n): acp.InitializeResponse {\n const userCaps = deps.capabilities ?? {};\n return {\n protocolVersion: acp.PROTOCOL_VERSION,\n agentCapabilities: {\n loadSession: userCaps.loadSession ?? true,\n promptCapabilities: {\n image: userCaps.prompt?.image ?? true,\n audio: userCaps.prompt?.audio ?? false,\n embeddedContext: userCaps.prompt?.embeddedContext ?? true,\n },\n },\n authMethods: [],\n };\n}\n\n// ===== newSession =====\n\ninterface NewSessionDeps {\n factory: AgentFactory;\n store: SessionStore;\n log: (msg: string) => void;\n}\n\ntype AcpResult<T> = { ok: true; value: T } | { ok: false; error: AcpError };\n\nexport interface AcpError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n/** JSON-RPC error codes per ACP spec. */\nexport const ACP_ERR = {\n INVALID_REQUEST: -32_602,\n INTERNAL_ERROR: -32_603,\n INVALID_SESSION: -32_001,\n AUTH_REQUIRED: -32_002,\n} as const;\n\n/**\n * Validate and resolve `params.cwd` to an absolute existing path (EC-5).\n * Returns `Result` so caller can map to ACP error.\n */\nfunction resolveCwdOrError(rawCwd: string | undefined): AcpResult<string> {\n if (typeof rawCwd !== \"string\" || rawCwd.length === 0) {\n return {\n ok: false,\n error: { code: ACP_ERR.INVALID_REQUEST, message: \"cwd is required\" },\n };\n }\n const resolved = path.resolve(rawCwd);\n if (!existsSync(resolved)) {\n return {\n ok: false,\n error: { code: ACP_ERR.INVALID_REQUEST, message: `cwd not found: ${resolved}` },\n };\n }\n return { ok: true, value: resolved };\n}\n\nexport async function handleNewSession(\n params: acp.NewSessionRequest,\n deps: NewSessionDeps,\n): Promise<{ response: acp.NewSessionResponse } | { error: AcpError }> {\n const cwdResult = resolveCwdOrError(params.cwd);\n if (!cwdResult.ok) return { error: cwdResult.error };\n\n const sessionId = randomUUID();\n let agent: SDKAgent;\n try {\n agent = await deps.factory(sessionId);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n deps.log(`[acp] new_session factory threw: ${msg}`);\n return {\n error: {\n code: ACP_ERR.INTERNAL_ERROR,\n message: `agent factory threw: ${msg}`,\n },\n };\n }\n\n const session: AcpSession = {\n sessionId,\n agent,\n createdAt: Date.now(),\n lastUsedAt: Date.now(),\n abortController: new AbortController(),\n cwd: cwdResult.value,\n };\n deps.store.create(session);\n\n return { response: { sessionId } };\n}\n\n// ===== loadSession =====\n\ninterface LoadSessionDeps {\n store: SessionStore;\n log: (msg: string) => void;\n}\n\nconst STORAGE_HINT =\n \" — if running on serverless/multi-host infra, pass conversationStorage to Agent.create (see docs/recipes/conversation-storage-postgres.md)\";\n\nexport async function handleLoadSession(\n params: acp.LoadSessionRequest,\n deps: LoadSessionDeps,\n): Promise<{ response: acp.LoadSessionResponse } | { error: AcpError }> {\n const cwdResult = resolveCwdOrError(params.cwd);\n if (!cwdResult.ok) return { error: cwdResult.error };\n\n if (deps.store.has(params.sessionId)) {\n return {\n error: {\n code: ACP_ERR.INVALID_REQUEST,\n message: `session ${params.sessionId} already loaded`,\n },\n };\n }\n\n let agent: SDKAgent;\n try {\n agent = await Agent.resume(params.sessionId, { local: { cwd: cwdResult.value } });\n } catch (err) {\n // EC-6: helpful hint for serverless users\n const msg = err instanceof Error ? err.message : String(err);\n deps.log(`[acp] load_session Agent.resume threw for ${params.sessionId}: ${msg}`);\n return {\n error: {\n code: ACP_ERR.INVALID_SESSION,\n message: `session not found: ${params.sessionId}${STORAGE_HINT}`,\n },\n };\n }\n\n const session: AcpSession = {\n sessionId: params.sessionId,\n agent,\n createdAt: Date.now(),\n lastUsedAt: Date.now(),\n abortController: new AbortController(),\n cwd: cwdResult.value,\n };\n deps.store.create(session);\n\n return { response: {} };\n}\n\n// ===== forkSession (unstable_forkSession) =====\n\ninterface ForkSessionDeps {\n store: SessionStore;\n log: (msg: string) => void;\n}\n\nexport async function handleForkSession(\n params: acp.ForkSessionRequest,\n deps: ForkSessionDeps,\n): Promise<{ response: acp.ForkSessionResponse } | { error: AcpError }> {\n const parent = deps.store.get(params.sessionId);\n if (parent === undefined) {\n return {\n error: {\n code: ACP_ERR.INVALID_SESSION,\n message: `parent session not loaded: ${params.sessionId}`,\n },\n };\n }\n\n // EC-5: resolve params.cwd if provided; else inherit parent.cwd\n let resolvedCwd = parent.cwd;\n if (typeof params.cwd === \"string\" && params.cwd.length > 0) {\n const cwdResult = resolveCwdOrError(params.cwd);\n if (!cwdResult.ok) return { error: cwdResult.error };\n resolvedCwd = cwdResult.value;\n }\n\n // V0.1: ACP `unstable_forkSession` is experimental upstream and our SDK's\n // `agent.fork()` is a one-shot ephemeral sub-run (D110-D114), not a\n // long-lived session split. Returning invalid_request prevents misuse\n // until v0.2 implements proper session forking via Agent.create() with\n // parent options inheritance.\n // (EC-3 still observed: any host that calls this on a CloudAgent gets a\n // clean invalid_request rather than UnsupportedRunOperationError.)\n void parent; // parent lookup kept for symmetry + parentId validation\n void resolvedCwd;\n void deps.log;\n return {\n error: {\n code: ACP_ERR.INVALID_REQUEST,\n message:\n \"session/fork is deferred to @theokit/acp v0.2 — current SDK fork is a one-shot sub-run, not a session split\",\n },\n };\n}\n\n// ===== listSessions =====\n\nexport function handleListSessions(\n _params: acp.ListSessionsRequest,\n store: SessionStore,\n): acp.ListSessionsResponse {\n const sessions = store.list().map((s) => ({\n sessionId: s.sessionId,\n cwd: s.cwd,\n title: s.agent.agentId,\n lastUpdatedAt: new Date(s.lastUsedAt).toISOString(),\n }));\n return { sessions };\n}\n\n// ===== cancel =====\n\ninterface CancelDeps {\n store: SessionStore;\n}\n\nexport function handleCancel(params: acp.CancelNotification, deps: CancelDeps): void {\n const session = deps.store.get(params.sessionId);\n if (session === undefined) return; // idempotent — silently succeed on unknown sessionId\n session.lastUsedAt = Date.now();\n if (!session.abortController.signal.aborted) {\n session.abortController.abort(\"cancelled by ACP client\");\n }\n}\n","/**\n * Stream translator: AsyncGenerator<SDKMessage> → ACP `sessionUpdate` notifications\n * (D353, T3.2).\n *\n * Exhaustive switch on `SDKMessage.type` with `never` check. AbortSignal honored\n * between yields. `sessionUpdate` errors are logged + counted; bail after\n * MAX_CONSECUTIVE_SEND_FAILURES (SHOULD-TEST EC-10).\n *\n * @internal\n */\n\nimport type * as acp from \"@agentclientprotocol/sdk\";\nimport type { SDKMessage } from \"@theokit/sdk\";\n\nconst MAX_CONSECUTIVE_SEND_FAILURES = 10;\n\ninterface TranslateStreamArgs {\n messages: AsyncGenerator<SDKMessage, void>;\n conn: acp.AgentSideConnection;\n sessionId: string;\n signal: AbortSignal;\n log: (msg: string) => void;\n suppressThinking?: boolean;\n}\n\n/**\n * Map known tool names to ACP `ToolKind` for nicer UI affordances.\n */\nexport function toolKind(name: string): acp.ToolKind {\n const n = name.toLowerCase();\n if (n === \"read_file\" || n === \"list_dir\" || n === \"git_diff\" || n === \"search_text\")\n return \"read\";\n if (n === \"write_file\" || n === \"apply_patch\") return \"edit\";\n if (n === \"run_command\" || n === \"run_vitest\") return \"execute\";\n if (n === \"web_search\" || n === \"fetch_url\") return \"fetch\";\n return \"other\";\n}\n\nfunction mapToolStatus(sdkStatus: \"running\" | \"completed\" | \"error\"): acp.ToolCallStatus {\n if (sdkStatus === \"completed\") return \"completed\";\n if (sdkStatus === \"error\") return \"failed\";\n return \"in_progress\";\n}\n\nfunction textChunk(text: string): acp.ContentBlock {\n return { type: \"text\", text };\n}\n\ninterface SafeSendState {\n consecutiveFailures: number;\n bailed: boolean;\n}\n\nasync function safeNotify(\n conn: acp.AgentSideConnection,\n sessionId: string,\n update: acp.SessionUpdate,\n state: SafeSendState,\n log: (msg: string) => void,\n): Promise<void> {\n if (state.bailed) return;\n try {\n await conn.sessionUpdate({ sessionId, update });\n state.consecutiveFailures = 0;\n } catch (err) {\n state.consecutiveFailures += 1;\n const msg = err instanceof Error ? err.message : String(err);\n log(\n `[acp] sessionUpdate failed (${state.consecutiveFailures}/${MAX_CONSECUTIVE_SEND_FAILURES}): ${msg}`,\n );\n if (state.consecutiveFailures >= MAX_CONSECUTIVE_SEND_FAILURES) {\n state.bailed = true;\n log(\"[acp] translator bailing — too many consecutive sessionUpdate failures\");\n }\n }\n}\n\nasync function handleAssistant(\n msg: Extract<SDKMessage, { type: \"assistant\" }>,\n args: TranslateStreamArgs,\n state: SafeSendState,\n): Promise<void> {\n for (const content of msg.message.content) {\n if (content.type === \"text\") {\n await safeNotify(\n args.conn,\n args.sessionId,\n { sessionUpdate: \"agent_message_chunk\", content: textChunk(content.text) },\n state,\n args.log,\n );\n } else if (content.type === \"tool_use\") {\n await safeNotify(\n args.conn,\n args.sessionId,\n {\n sessionUpdate: \"tool_call\",\n toolCallId: content.id,\n title: content.name,\n kind: toolKind(content.name),\n status: \"in_progress\",\n },\n state,\n args.log,\n );\n }\n }\n}\n\nasync function handleToolCall(\n msg: Extract<SDKMessage, { type: \"tool_call\" }>,\n args: TranslateStreamArgs,\n state: SafeSendState,\n): Promise<void> {\n const content: acp.ToolCallContent[] = [];\n if (msg.result !== undefined && msg.result !== null) {\n const text = typeof msg.result === \"string\" ? msg.result : JSON.stringify(msg.result);\n content.push({ type: \"content\", content: textChunk(text) });\n }\n await safeNotify(\n args.conn,\n args.sessionId,\n {\n sessionUpdate: \"tool_call_update\",\n toolCallId: msg.call_id,\n status: mapToolStatus(msg.status),\n ...(content.length > 0 ? { content } : {}),\n },\n state,\n args.log,\n );\n}\n\nasync function handleThinking(\n msg: Extract<SDKMessage, { type: \"thinking\" }>,\n args: TranslateStreamArgs,\n state: SafeSendState,\n): Promise<void> {\n if (args.suppressThinking === true) return;\n await safeNotify(\n args.conn,\n args.sessionId,\n { sessionUpdate: \"agent_thought_chunk\", content: textChunk(msg.text) },\n state,\n args.log,\n );\n}\n\n/**\n * Translate the SDK stream into ACP `sessionUpdate` notifications.\n * Exhaustive over `SDKMessage.type` — adding a new variant fails compile.\n */\nexport async function translateStream(args: TranslateStreamArgs): Promise<void> {\n const state: SafeSendState = { consecutiveFailures: 0, bailed: false };\n for await (const msg of args.messages) {\n if (args.signal.aborted) break;\n if (state.bailed) break;\n await dispatchMessage(msg, args, state);\n }\n}\n\nasync function dispatchMessage(\n msg: SDKMessage,\n args: TranslateStreamArgs,\n state: SafeSendState,\n): Promise<void> {\n switch (msg.type) {\n case \"system\":\n return; // no ACP equivalent\n case \"user\":\n return; // echo, no ACP equivalent\n case \"assistant\":\n await handleAssistant(msg, args, state);\n return;\n case \"thinking\":\n await handleThinking(msg, args, state);\n return;\n case \"tool_call\":\n await handleToolCall(msg, args, state);\n return;\n case \"status\":\n return; // cloud-only\n case \"task\":\n return; // milestones — skipped in v0.1\n case \"request\":\n return; // permission requests routed via plugin\n case \"object_delta\":\n return; // streamObject not used in plain prompt flow\n default: {\n const _exhaustive: never = msg;\n throw new Error(`unhandled SDKMessage type: ${JSON.stringify(_exhaustive)}`);\n }\n }\n}\n","/**\n * ACP tool permission plugin — bridges ACP `requestPermission` to our SDK\n * `pre_tool_call` veto hook (D101, D355, EC-2).\n *\n * Modes:\n * - `auto` — pass-through (plugin NOT installed in this mode)\n * - `deny` — block every tool call\n * - `ask` — round-trip via `conn.requestPermission` with timeout (EC-2)\n *\n * @internal\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport type * as acp from \"@agentclientprotocol/sdk\";\nimport { ConfigurationError, Plugin, type SDKAgent } from \"@theokit/sdk\";\nimport { toolKind } from \"./translator.js\";\nimport type { PermissionMode } from \"./types.js\";\n\ninterface PermissionPluginArgs {\n conn: acp.AgentSideConnection;\n sessionId: string;\n mode: PermissionMode;\n trustedTools: Set<string>;\n timeoutMs: number;\n}\n\ninterface VetoDecision {\n block: true;\n message: string;\n}\n\nasync function askWithTimeout(\n args: PermissionPluginArgs,\n toolName: string,\n): Promise<VetoDecision | undefined> {\n const toolCallId = `acp-perm-${randomUUID()}`;\n const reqPromise = args.conn.requestPermission({\n sessionId: args.sessionId,\n toolCall: {\n toolCallId,\n title: toolName,\n kind: toolKind(toolName),\n status: \"pending\",\n },\n options: [\n { optionId: \"allow\", name: \"Allow\", kind: \"allow_once\" },\n { optionId: \"deny\", name: \"Deny\", kind: \"reject_once\" },\n ],\n });\n\n let timeoutHandle: NodeJS.Timeout | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutHandle = setTimeout(() => {\n reject(new Error(\"permission_timeout\"));\n }, args.timeoutMs);\n });\n\n let response: acp.RequestPermissionResponse;\n try {\n response = (await Promise.race([reqPromise, timeoutPromise])) as acp.RequestPermissionResponse;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg === \"permission_timeout\") {\n return { block: true, message: `permission timed out after ${args.timeoutMs}ms` };\n }\n return { block: true, message: `permission request failed (client disconnected?): ${msg}` };\n } finally {\n if (timeoutHandle !== undefined) clearTimeout(timeoutHandle);\n }\n\n const outcome = response.outcome;\n if (outcome.outcome === \"cancelled\") {\n return { block: true, message: \"permission cancelled by client\" };\n }\n if (outcome.outcome === \"selected\" && outcome.optionId === \"deny\") {\n return { block: true, message: \"denied by user\" };\n }\n return undefined;\n}\n\n/**\n * Install the permission plugin on an SDK agent. Idempotent — calling on the\n * same agent twice replaces the prior listener (per the SDK's pre_tool_call\n * subscription contract).\n *\n * **Fail-closed (SEC-M0-03):** when `mode` is `deny`/`ask` but the runtime has\n * no plugin manager (e.g. a CloudAgent), enforcement is impossible — this\n * THROWS a `ConfigurationError` rather than letting tools run ungated. Awaiting\n * `register` (ARCH-08/SEC-M0-05) guarantees the veto hook is aggregated before\n * the first tool dispatch.\n */\nexport async function installPermissionPlugin(\n agent: SDKAgent,\n args: PermissionPluginArgs,\n): Promise<void> {\n const plugin = Plugin.create({\n name: `acp-permission-${args.sessionId}`,\n version: \"1.0.0\",\n kind: \"general\",\n register(ctx) {\n ctx.on(\"pre_tool_call\", async (rawCtx) => {\n const event = rawCtx as { name: string; args: Record<string, unknown> };\n if (args.mode === \"deny\") {\n return { block: true, message: \"denied (permissionDefault=deny)\" };\n }\n if (args.trustedTools.has(event.name)) {\n return undefined;\n }\n // mode === \"ask\"\n return askWithTimeout(args, event.name);\n });\n },\n });\n\n // The agent's plugin manager is exposed via `pluginManager()` on LocalAgent.\n // The plugin is registered for the lifetime of the session — adequate for\n // ACP's one-process-per-session model (D356).\n const agentLike = agent as SDKAgent & {\n pluginManager?: () => {\n register?: (p: unknown) => Promise<void> | void;\n initialize?: (plugins: unknown[]) => Promise<void>;\n };\n };\n const mgr = agentLike.pluginManager?.();\n if (mgr === undefined) {\n // SEC-M0-03 — FAIL CLOSED. If the operator asked for `deny`/`ask` but this\n // runtime (e.g. CloudAgent) has no plugin manager, tools would run UNGATED\n // while the operator believes they are gated. A security control must not\n // fail open: refuse the session instead of warning-and-continuing.\n throw new ConfigurationError(\n `permission enforcement unavailable on this runtime (no plugin manager) — ` +\n `cannot honor permissionDefault=\"${args.mode}\" for session \"${args.sessionId}\"`,\n { code: \"permission_enforcement_unavailable\" },\n );\n }\n // ARCH-08/SEC-M0-05 — await so the veto hook is aggregated before any tool\n // dispatch, and an async registration failure surfaces (not an unhandled\n // rejection).\n if (typeof mgr.register === \"function\") {\n await mgr.register(plugin);\n } else if (typeof mgr.initialize === \"function\") {\n await mgr.initialize([plugin]);\n }\n}\n","/**\n * Public types for `@theokit/acp` (ADRs D349-D360).\n *\n * @public\n */\n\nimport type { SDKAgent } from \"@theokit/sdk\";\n\n/**\n * Factory function shape: receives the ACP session id (UUID) and returns\n * a fresh `SDKAgent` for that session. Per D351, this enforces per-session\n * conversation isolation when consumers want it.\n *\n * @public\n */\nexport type AgentFactory = (sessionId: string) => SDKAgent | Promise<SDKAgent>;\n\n/**\n * Acceptable shapes for `serveAcp({ agent })`:\n * - `AgentFactory`: per-session isolation (recommended).\n * - `SDKAgent`: single shared agent — emits one-time stderr warning.\n *\n * @public\n */\nexport type AgentOrFactory = AgentFactory | SDKAgent;\n\n/**\n * Permission mode controlling how tool calls flow through ACP permission\n * round-trip (D355).\n *\n * @public\n */\nexport type PermissionMode = \"ask\" | \"auto\" | \"deny\";\n\n/**\n * Capabilities advertised in the ACP `initialize` handshake. Users may\n * override any subset; defaults are loaded internally.\n *\n * @public\n */\nexport interface AcpCapabilities {\n loadSession?: boolean;\n forkSession?: boolean;\n listSessions?: boolean;\n prompt?: {\n audio?: boolean;\n embeddedContext?: boolean;\n image?: boolean;\n };\n}\n\n/**\n * Display info for the agent in the ACP host UI.\n *\n * @public\n */\nexport interface AcpAgentInfo {\n name: string;\n title?: string;\n version: string;\n}\n\n/**\n * Options for `serveAcp()`.\n *\n * @public\n */\nexport interface AcpServerOptions {\n /** Single agent OR factory `(sessionId) => SDKAgent`. Required. */\n agent: AgentOrFactory;\n /** Display info advertised in `initialize`. Defaults to package metadata. */\n info?: AcpAgentInfo;\n /** Capability overrides for the `initialize` handshake. */\n capabilities?: AcpCapabilities;\n /** Permission mode (default `\"ask\"`). See D355. */\n permissionDefault?: PermissionMode;\n /** Timeout (ms) for `requestPermission` round-trip before vetoing (default 60_000). EC-2. */\n permissionTimeoutMs?: number;\n /** Tool names that bypass `ask` mode. */\n trustedTools?: ReadonlyArray<string>;\n /** Cap on total prompt bytes (default 2 MiB). D360. */\n maxPromptBytes?: number;\n /** Logger — defaults to `process.stderr.write` per D359. */\n log?: (msg: string) => void;\n /** Override stdin (test seam). */\n stdin?: NodeJS.ReadableStream;\n /** Override stdout (test seam). */\n stdout?: NodeJS.WritableStream;\n}\n\n/**\n * Thrown by `extractPrompt` when the decoded prompt exceeds `maxPromptBytes`.\n * Public so callers can `instanceof` it.\n *\n * @public\n */\nexport class PromptTooLargeError extends Error {\n override readonly name = \"PromptTooLargeError\";\n constructor(\n readonly size: number,\n readonly limit: number,\n ) {\n super(`prompt exceeds ${limit} bytes (got ${size})`);\n }\n}\n","/**\n * Extract user text + attachments from ACP `ContentBlock[]` with size cap (D360).\n *\n * @internal\n */\n\nimport type * as acp from \"@agentclientprotocol/sdk\";\nimport { PromptTooLargeError } from \"./types.js\";\n\ninterface PromptAttachment {\n type: \"image\" | \"audio\" | \"resource\" | \"resource_link\" | \"embedded_resource\";\n mimeType?: string;\n data?: string;\n uri?: string;\n bytes: number;\n}\n\ninterface PromptExtractionResult {\n text: string;\n attachments: PromptAttachment[];\n}\n\nfunction utf8Bytes(s: string): number {\n return Buffer.byteLength(s, \"utf8\");\n}\n\nfunction base64DecodedBytes(b64: string): number {\n return Math.floor((b64.length * 3) / 4);\n}\n\ninterface ExtractState {\n textParts: string[];\n attachments: PromptAttachment[];\n totalBytes: number;\n maxBytes: number;\n}\n\nfunction recordBytes(state: ExtractState, bytes: number): void {\n state.totalBytes += bytes;\n if (state.totalBytes > state.maxBytes) {\n throw new PromptTooLargeError(state.totalBytes, state.maxBytes);\n }\n}\n\nfunction processBlock(block: acp.ContentBlock, state: ExtractState): void {\n switch (block.type) {\n case \"text\":\n recordBytes(state, utf8Bytes(block.text));\n state.textParts.push(block.text);\n return;\n case \"image\": {\n const data = block.data ?? \"\";\n const bytes = base64DecodedBytes(data);\n recordBytes(state, bytes);\n state.attachments.push({ type: \"image\", mimeType: block.mimeType, data, bytes });\n return;\n }\n case \"audio\": {\n const data = block.data ?? \"\";\n const bytes = base64DecodedBytes(data);\n recordBytes(state, bytes);\n state.attachments.push({ type: \"audio\", mimeType: block.mimeType, data, bytes });\n return;\n }\n case \"resource_link\": {\n const uri = block.uri ?? \"\";\n const bytes = utf8Bytes(uri);\n recordBytes(state, bytes);\n state.attachments.push({ type: \"resource_link\", uri, bytes });\n return;\n }\n case \"resource\": {\n const bytes = utf8Bytes(JSON.stringify(block));\n recordBytes(state, bytes);\n state.attachments.push({ type: \"embedded_resource\", bytes });\n return;\n }\n default: {\n const _exhaustive: never = block;\n throw new Error(`unknown ContentBlock type: ${JSON.stringify(_exhaustive)}`);\n }\n }\n}\n\nexport function extractPrompt(\n blocks: ReadonlyArray<acp.ContentBlock>,\n maxBytes: number,\n): PromptExtractionResult {\n const state: ExtractState = { textParts: [], attachments: [], totalBytes: 0, maxBytes };\n for (const block of blocks) processBlock(block, state);\n return { text: state.textParts.join(\"\\n\"), attachments: state.attachments };\n}\n","/**\n * ACP prompt handler — extracts user text, drives `agent.send`, translates\n * stream via `translator.ts`, returns `PromptResponse` with stop reason.\n *\n * @internal\n */\n\nimport type * as acp from \"@agentclientprotocol/sdk\";\nimport type { Run } from \"@theokit/sdk\";\nimport { ACP_ERR, type AcpError } from \"./lifecycle.js\";\nimport { installPermissionPlugin } from \"./permission-plugin.js\";\nimport { extractPrompt } from \"./prompt-extract.js\";\nimport type { AcpSession, SessionStore } from \"./session-store.js\";\nimport { translateStream } from \"./translator.js\";\nimport type { PermissionMode } from \"./types.js\";\n\ninterface HandlePromptDeps {\n store: SessionStore;\n conn: acp.AgentSideConnection;\n maxPromptBytes: number;\n permissionMode: PermissionMode;\n permissionTimeoutMs: number;\n trustedTools: Set<string>;\n log: (msg: string) => void;\n}\n\nfunction mapStopReason(runStatus: string, errorCode?: string): acp.StopReason {\n if (errorCode === \"aborted\" || runStatus === \"cancelled\") return \"cancelled\";\n if (errorCode === \"safety_blocked\") return \"refusal\";\n if (errorCode === \"context_length_exceeded\" || errorCode === \"max_tokens\") return \"max_tokens\";\n if (errorCode === \"max_iterations\") return \"max_turn_requests\";\n if (runStatus === \"finished\") return \"end_turn\";\n return \"end_turn\";\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n return err.name === \"AbortError\" || err.message.includes(\"aborted\");\n}\n\ntype ExtractOutcome = { ok: true; text: string } | { ok: false; error: AcpError };\n\nfunction extractOrError(params: acp.PromptRequest, deps: HandlePromptDeps): ExtractOutcome {\n try {\n const result = extractPrompt(params.prompt, deps.maxPromptBytes);\n if (result.text.length === 0) {\n return { ok: false, error: { code: ACP_ERR.INVALID_REQUEST, message: \"empty prompt\" } };\n }\n return { ok: true, text: result.text };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n deps.log(`[acp] prompt extract rejected: ${msg}`);\n return { ok: false, error: { code: ACP_ERR.INVALID_REQUEST, message: msg } };\n }\n}\n\nasync function runPrompt(\n session: AcpSession,\n text: string,\n params: acp.PromptRequest,\n deps: HandlePromptDeps,\n): Promise<acp.StopReason> {\n const run: Run = await session.agent.send(text, { signal: session.abortController.signal });\n try {\n await translateStream({\n messages: run.stream(),\n conn: deps.conn,\n sessionId: params.sessionId,\n signal: session.abortController.signal,\n log: deps.log,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n deps.log(`[acp] translator threw mid-stream: ${msg}`);\n }\n const result = await run.wait();\n const errorCode =\n result.status === \"error\" && result.error !== undefined ? (result.error.code ?? \"\") : \"\";\n return mapStopReason(result.status, errorCode);\n}\n\n/**\n * SEC-M0-03 — install the permission veto (fail-closed). Returns an AcpError to\n * REFUSE the prompt when the requested mode cannot be enforced on this runtime,\n * or `undefined` when installation succeeded (or mode is `auto`).\n */\nasync function installPermissionOrError(\n session: AcpSession,\n params: acp.PromptRequest,\n deps: HandlePromptDeps,\n): Promise<AcpError | undefined> {\n if (deps.permissionMode === \"auto\") return undefined;\n try {\n await installPermissionPlugin(session.agent, {\n conn: deps.conn,\n sessionId: params.sessionId,\n mode: deps.permissionMode,\n trustedTools: deps.trustedTools,\n timeoutMs: deps.permissionTimeoutMs,\n });\n return undefined;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { code: ACP_ERR.INTERNAL_ERROR, message: msg };\n }\n}\n\nexport async function handlePrompt(\n params: acp.PromptRequest,\n deps: HandlePromptDeps,\n): Promise<{ response: acp.PromptResponse } | { error: AcpError }> {\n const session = deps.store.get(params.sessionId);\n if (session === undefined) {\n return {\n error: { code: ACP_ERR.INVALID_SESSION, message: `unknown session: ${params.sessionId}` },\n };\n }\n session.lastUsedAt = Date.now();\n\n const extracted = extractOrError(params, deps);\n if (!extracted.ok) return { error: extracted.error };\n\n const permError = await installPermissionOrError(session, params, deps);\n if (permError !== undefined) return { error: permError };\n\n try {\n const stopReason = await runPrompt(session, extracted.text, params, deps);\n return { response: { stopReason } };\n } catch (err) {\n if (isAbortError(err)) return { response: { stopReason: \"cancelled\" } };\n const msg = err instanceof Error ? err.message : String(err);\n deps.log(`[acp] agent.send threw: ${msg}`);\n return { error: { code: ACP_ERR.INTERNAL_ERROR, message: msg } };\n }\n}\n","/**\n * In-memory session store mapping ACP `sessionId` → `AcpSession` (D356).\n *\n * Per-`serveAcp()` invocation. No global state.\n *\n * @internal\n */\n\nimport type { SDKAgent } from \"@theokit/sdk\";\n\nexport interface AcpSession {\n readonly sessionId: string;\n readonly agent: SDKAgent;\n readonly createdAt: number;\n lastUsedAt: number;\n readonly abortController: AbortController;\n readonly cwd: string;\n}\n\nexport class SessionStore {\n private readonly map = new Map<string, AcpSession>();\n\n create(session: AcpSession): void {\n if (this.map.has(session.sessionId)) {\n throw new Error(`duplicate sessionId: ${session.sessionId}`);\n }\n this.map.set(session.sessionId, session);\n }\n\n get(sessionId: string): AcpSession | undefined {\n return this.map.get(sessionId);\n }\n\n delete(sessionId: string): boolean {\n return this.map.delete(sessionId);\n }\n\n list(): AcpSession[] {\n return [...this.map.values()];\n }\n\n size(): number {\n return this.map.size;\n }\n\n has(sessionId: string): boolean {\n return this.map.has(sessionId);\n }\n}\n","/**\n * `serveAcp({ agent })` — top-level entry that wires the ACP server.\n *\n * Constructs `AgentSideConnection` from `@agentclientprotocol/sdk@^0.22`,\n * delegates lifecycle methods to `lifecycle.ts`, and drives the prompt\n * translator from `translator.ts`. Per-invocation state (D356).\n *\n * @public\n */\n\nimport { Readable } from \"node:stream\";\nimport * as acp from \"@agentclientprotocol/sdk\";\nimport { resolveAgentFactory } from \"./agent-resolver.js\";\nimport {\n buildInitializeResponse,\n handleCancel,\n handleForkSession,\n handleListSessions,\n handleLoadSession,\n handleNewSession,\n} from \"./lifecycle.js\";\nimport { handlePrompt } from \"./prompt-handler.js\";\nimport { SessionStore } from \"./session-store.js\";\nimport type { AcpServerOptions, PermissionMode } from \"./types.js\";\n\nconst DEFAULT_MAX_PROMPT_BYTES = 2 * 1024 * 1024;\nconst DEFAULT_PERMISSION_TIMEOUT_MS = 60_000;\nconst DEFAULT_PERMISSION_MODE: PermissionMode = \"ask\";\n\n/**\n * Block on a stdio JSON-RPC ACP server until stdin closes. Returns ONLY\n * after every active session has been disposed (EC-1).\n *\n * @public\n */\nexport async function serveAcp(options: AcpServerOptions): Promise<void> {\n const log = options.log ?? ((msg: string) => process.stderr.write(`${msg}\\n`));\n const factory = resolveAgentFactory(options.agent, { log });\n const store = new SessionStore();\n const maxPromptBytes = options.maxPromptBytes ?? DEFAULT_MAX_PROMPT_BYTES;\n const permissionMode = options.permissionDefault ?? DEFAULT_PERMISSION_MODE;\n const permissionTimeoutMs = options.permissionTimeoutMs ?? DEFAULT_PERMISSION_TIMEOUT_MS;\n const trustedTools = new Set(options.trustedTools ?? []);\n\n const stdin = options.stdin ?? process.stdin;\n const stdout = options.stdout ?? process.stdout;\n\n // Convert Node streams ↔ Web streams for ndJsonStream. process.stdin is\n // a Node Readable; toWeb gives us the WHATWG ReadableStream.\n // For stdout we wrap into a Writable stream that flushes via the Node API.\n const inputWeb = Readable.toWeb(stdin as Readable) as ReadableStream<Uint8Array>;\n const outputWeb = new WritableStream<Uint8Array>({\n write(chunk: Uint8Array): Promise<void> {\n return new Promise((resolve, reject) => {\n const ok = stdout.write(chunk, (err) => (err ? reject(err) : undefined));\n if (ok) resolve();\n else stdout.once(\"drain\", resolve);\n });\n },\n });\n const stream = acp.ndJsonStream(outputWeb, inputWeb);\n\n const closedPromise = new Promise<void>((resolve) => {\n stdin.once(\"end\", () => resolve());\n stdin.once(\"close\", () => resolve());\n });\n\n // Construct connection. The agentBuilder is invoked synchronously by the SDK.\n // eslint-disable-next-line no-new\n new acp.AgentSideConnection((conn) => {\n return {\n initialize: async (params) =>\n buildInitializeResponse(params, { capabilities: options.capabilities }),\n\n authenticate: async (_params): Promise<acp.AuthenticateResponse> => {\n // D350 — auth deferred to v0.2; return empty success.\n return {};\n },\n\n newSession: async (params) => {\n const result = await handleNewSession(params, { factory, store, log });\n if (\"error\" in result) {\n throw new acp.RequestError(result.error.code, result.error.message);\n }\n return result.response;\n },\n\n loadSession: async (params) => {\n const result = await handleLoadSession(params, { store, log });\n if (\"error\" in result) {\n throw new acp.RequestError(result.error.code, result.error.message);\n }\n return result.response;\n },\n\n unstable_forkSession: async (params) => {\n const result = await handleForkSession(params, { store, log });\n if (\"error\" in result) {\n throw new acp.RequestError(result.error.code, result.error.message);\n }\n return result.response;\n },\n\n listSessions: async (params) => handleListSessions(params, store),\n\n cancel: async (params) => {\n handleCancel(params, { store });\n },\n\n prompt: async (params) => {\n const result = await handlePrompt(params, {\n store,\n conn,\n maxPromptBytes,\n permissionMode,\n permissionTimeoutMs,\n trustedTools,\n log,\n });\n if (\"error\" in result) {\n throw new acp.RequestError(result.error.code, result.error.message);\n }\n return result.response;\n },\n };\n }, stream);\n\n // EC-1: wait for stdin close, then dispose every live session before resolving.\n await closedPromise;\n const sessions = store.list();\n log(`[acp] stdin closed; disposing ${sessions.length} session(s)`);\n await Promise.allSettled(\n sessions.map(async (session) => {\n try {\n await session.agent.dispose();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n log(`[acp] dispose of ${session.sessionId} threw: ${msg}`);\n }\n }),\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/agent-resolver.ts","../src/lifecycle.ts","../src/translator.ts","../src/permission-plugin.ts","../src/types.ts","../src/prompt-extract.ts","../src/session-store.ts","../src/prompt-handler.ts","../src/serve.ts"],"names":["acp","path","existsSync","randomUUID","Agent","Plugin","ConfigurationError","Readable","stream","acp2"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Normalize `serveAcp({ agent })` into a uniform `AgentFactory` (D351).\n *\n * - Function input → passed through as-is. NOT duck-tested: any function is accepted, and a bad\n * return value only surfaces when the first session is created.\n * - SDKAgent-shaped object → wrapped in a factory that returns that same instance for every session,\n * plus a one-time warning through `log` (a shared agent defeats per-session isolation).\n * - Anything else → `InvalidAgentError` thrown synchronously.\n *\n * @internal\n */\n\nimport type { SDKAgent } from \"@theokit/sdk\";\nimport type { AgentFactory, AgentOrFactory } from \"./types.js\";\n\nfunction looksLikeSDKAgent(value: unknown): value is SDKAgent {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { agentId?: unknown }).agentId === \"string\" &&\n typeof (value as { send?: unknown }).send === \"function\"\n );\n}\n\n/** Thrown when `serveAcp({ agent })` is neither a function nor an object with `agentId` + `send`. */\nexport class InvalidAgentError extends Error {\n override readonly name = \"InvalidAgentError\";\n}\n\ninterface ResolverOptions {\n log?: (msg: string) => void;\n}\n\n/**\n * Normalize `agent` into a factory, or throw before any protocol runs.\n *\n * The warning for the shared-instance case fires once per resolver, on the FIRST session — so a\n * single session is enough to see it, and only a host that opens NO session never does. It is\n * emitted from the returned factory, not from this call: resolving is silent.\n *\n * @throws InvalidAgentError when `input` is neither a function nor SDKAgent-shaped.\n */\nexport function resolveAgentFactory(\n input: AgentOrFactory,\n options: ResolverOptions = {},\n): AgentFactory {\n const log = options.log ?? ((msg: string) => process.stderr.write(`${msg}\\n`));\n\n if (typeof input === \"function\") {\n return input as AgentFactory;\n }\n\n if (looksLikeSDKAgent(input)) {\n let warned = false;\n return (_sessionId: string): SDKAgent => {\n if (!warned) {\n warned = true;\n log(\n \"[acp] WARN: serveAcp received a single SDKAgent instance; sessions will share conversation state. \" +\n \"Pass a factory (sessionId) => Agent.create(...) for per-session isolation (D351).\",\n );\n }\n return input;\n };\n }\n\n throw new InvalidAgentError(\n \"serveAcp({ agent }) must receive an SDKAgent or a factory (sessionId) => SDKAgent | Promise<SDKAgent>\",\n );\n}\n","/**\n * ACP lifecycle handlers (D352, D354, EC-1/3/5/6).\n *\n * - `buildInitializeResponse` — capability advertisement (D353)\n * - `handleNewSession` — mint a UUID, build the agent through the factory (D351)\n * - `handleLoadSession` — `Agent.resume(sessionId, { local: { cwd } })` (D352, EC-6)\n * - `handleForkSession` — refuses every request; `INVALID_SESSION` when the parent is not in the\n * store, `INVALID_REQUEST` once it is; deferred to v0.2 (D352, EC-3)\n * - `handleListSessions` — snapshot of the in-memory store\n * - `handleCancel` — abort the session's `AbortController` (D354)\n *\n * Each takes `(params, deps)` and returns either `{ response }` or `{ error }` so `serve.ts` can map\n * the error onto `acp.RequestError` at one place. They are NOT pure: they mint ids, read the clock\n * and mutate the session store.\n *\n * @internal\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport * as acp from \"@agentclientprotocol/sdk\";\nimport { Agent, type SDKAgent } from \"@theokit/sdk\";\nimport type { AcpSession, SessionStore } from \"./session-store.js\";\nimport type { AcpAgentInfo, AcpCapabilities, AgentFactory } from \"./types.js\";\n\n// ===== initialize =====\n\ninterface InitializeDeps {\n capabilities?: AcpCapabilities;\n info?: AcpAgentInfo;\n}\n\n/**\n * Build the `initialize` reply. Ignores the request entirely — the negotiated protocol version is\n * always `acp.PROTOCOL_VERSION` from the installed `@agentclientprotocol/sdk`, never the client's.\n *\n * Advertises `loadSession` (default `true`), the three prompt flags (`image` and `embeddedContext`\n * default `true`, `audio` defaults `false`), and `AcpServerOptions.info` as `agentInfo` when the\n * caller supplied one (#350 — it was accepted and never read). `authMethods` is always empty.\n *\n * `agentInfo` is OMITTED rather than defaulted. Falling back to this package's own metadata would\n * label every agent as the adapter serving it, and a name that is confidently wrong is worse for a\n * host to display than one that is absent.\n */\nexport function buildInitializeResponse(\n _params: acp.InitializeRequest,\n deps: InitializeDeps,\n): acp.InitializeResponse {\n const userCaps = deps.capabilities ?? {};\n return {\n protocolVersion: acp.PROTOCOL_VERSION,\n agentCapabilities: {\n loadSession: userCaps.loadSession ?? true,\n promptCapabilities: {\n image: userCaps.prompt?.image ?? true,\n audio: userCaps.prompt?.audio ?? false,\n embeddedContext: userCaps.prompt?.embeddedContext ?? true,\n },\n },\n ...(deps.info !== undefined ? { agentInfo: { ...deps.info } } : {}),\n authMethods: [],\n };\n}\n\n// ===== newSession =====\n\ninterface NewSessionDeps {\n factory: AgentFactory;\n store: SessionStore;\n log: (msg: string) => void;\n}\n\ntype AcpResult<T> = { ok: true; value: T } | { ok: false; error: AcpError };\n\n/** A JSON-RPC error a handler wants `serve.ts` to raise. `data` is accepted but never sent today. */\nexport interface AcpError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n/**\n * The JSON-RPC codes this package names. Only THREE of the four are ever emitted:\n * `INVALID_REQUEST`, `INTERNAL_ERROR` and `INVALID_SESSION`.\n *\n * `AUTH_REQUIRED` has no producer anywhere in `packages/acp` — `serve.ts`'s `authenticate` answers an\n * empty success without checking anything (D350), so no path reaches `-32002`. It is a value reserved\n * for the deferred auth work, not a code a host can observe today.\n *\n * `INVALID_REQUEST` is `-32602` (JSON-RPC \"invalid params\"), not `-32600` — the name predates the\n * value and the value is what goes on the wire.\n */\nexport const ACP_ERR = {\n INVALID_REQUEST: -32_602,\n INTERNAL_ERROR: -32_603,\n INVALID_SESSION: -32_001,\n AUTH_REQUIRED: -32_002,\n} as const;\n\n/**\n * Validate and resolve `params.cwd` to an absolute existing path (EC-5).\n * Returns `Result` so caller can map to ACP error.\n */\nfunction resolveCwdOrError(rawCwd: string | undefined): AcpResult<string> {\n if (typeof rawCwd !== \"string\" || rawCwd.length === 0) {\n return {\n ok: false,\n error: { code: ACP_ERR.INVALID_REQUEST, message: \"cwd is required\" },\n };\n }\n const resolved = path.resolve(rawCwd);\n if (!existsSync(resolved)) {\n return {\n ok: false,\n error: { code: ACP_ERR.INVALID_REQUEST, message: `cwd not found: ${resolved}` },\n };\n }\n return { ok: true, value: resolved };\n}\n\n/**\n * Create a session: validate `params.cwd`, mint a UUID, await the factory, register the session.\n *\n * `cwd` is required and must already exist — it is resolved against the SERVER process's cwd when\n * relative, and never created. The generated id is what the host must quote in every later request.\n *\n * Errors: `INVALID_REQUEST` when `cwd` is missing/empty/absent from disk; `INTERNAL_ERROR` when the\n * factory throws. The store is left untouched on either.\n */\nexport async function handleNewSession(\n params: acp.NewSessionRequest,\n deps: NewSessionDeps,\n): Promise<{ response: acp.NewSessionResponse } | { error: AcpError }> {\n const cwdResult = resolveCwdOrError(params.cwd);\n if (!cwdResult.ok) return { error: cwdResult.error };\n\n const sessionId = randomUUID();\n let agent: SDKAgent;\n try {\n agent = await deps.factory(sessionId);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n deps.log(`[acp] new_session factory threw: ${msg}`);\n return {\n error: {\n code: ACP_ERR.INTERNAL_ERROR,\n message: `agent factory threw: ${msg}`,\n },\n };\n }\n\n const session: AcpSession = {\n sessionId,\n agent,\n createdAt: Date.now(),\n lastUsedAt: Date.now(),\n abortController: new AbortController(),\n cwd: cwdResult.value,\n };\n deps.store.create(session);\n\n return { response: { sessionId } };\n}\n\n// ===== loadSession =====\n\ninterface LoadSessionDeps {\n store: SessionStore;\n log: (msg: string) => void;\n}\n\nconst STORAGE_HINT =\n \" — if running on serverless/multi-host infra, pass conversationStorage to Agent.create (see docs/recipes/conversation-storage-postgres.md)\";\n\n/**\n * Re-attach to a conversation the SDK already persisted, keyed by `params.sessionId` as the agentId.\n *\n * Resolves it through `Agent.resume`, so it only succeeds where that agent's conversation storage is\n * reachable from THIS process — the default local store is per-host, which is why the failure\n * message carries a serverless hint.\n *\n * Errors: `INVALID_REQUEST` for a bad `cwd` or an id this process already holds (loading twice is\n * refused rather than replacing the live session); `INVALID_SESSION` when the resume fails, whatever\n * the underlying cause. Returns an EMPTY response on success — the id the host sent stays valid.\n */\nexport async function handleLoadSession(\n params: acp.LoadSessionRequest,\n deps: LoadSessionDeps,\n): Promise<{ response: acp.LoadSessionResponse } | { error: AcpError }> {\n const cwdResult = resolveCwdOrError(params.cwd);\n if (!cwdResult.ok) return { error: cwdResult.error };\n\n if (deps.store.has(params.sessionId)) {\n return {\n error: {\n code: ACP_ERR.INVALID_REQUEST,\n message: `session ${params.sessionId} already loaded`,\n },\n };\n }\n\n let agent: SDKAgent;\n try {\n agent = await Agent.resume(params.sessionId, { local: { cwd: cwdResult.value } });\n } catch (err) {\n // EC-6: helpful hint for serverless users\n const msg = err instanceof Error ? err.message : String(err);\n deps.log(`[acp] load_session Agent.resume threw for ${params.sessionId}: ${msg}`);\n return {\n error: {\n code: ACP_ERR.INVALID_SESSION,\n message: `session not found: ${params.sessionId}${STORAGE_HINT}`,\n },\n };\n }\n\n const session: AcpSession = {\n sessionId: params.sessionId,\n agent,\n createdAt: Date.now(),\n lastUsedAt: Date.now(),\n abortController: new AbortController(),\n cwd: cwdResult.value,\n };\n deps.store.create(session);\n\n return { response: {} };\n}\n\n// ===== forkSession (unstable_forkSession) =====\n\ninterface ForkSessionDeps {\n store: SessionStore;\n log: (msg: string) => void;\n}\n\n/**\n * Refuses every fork request. There is no success path in v0.1.\n *\n * It still validates first, so the code tells the host WHICH thing was wrong: `INVALID_SESSION` when\n * the parent is not loaded here, `INVALID_REQUEST` for an unusable `cwd`, and otherwise\n * `INVALID_REQUEST` with the \"deferred to v0.2\" message. The SDK's `agent.fork()` is a one-shot\n * ephemeral sub-run (D110-D114), not a session split, so wiring it here would give hosts a\n * session id that dies after one turn (EC-3).\n */\nexport async function handleForkSession(\n params: acp.ForkSessionRequest,\n deps: ForkSessionDeps,\n): Promise<{ response: acp.ForkSessionResponse } | { error: AcpError }> {\n const parent = deps.store.get(params.sessionId);\n if (parent === undefined) {\n return {\n error: {\n code: ACP_ERR.INVALID_SESSION,\n message: `parent session not loaded: ${params.sessionId}`,\n },\n };\n }\n\n // EC-5: resolve params.cwd if provided; else inherit parent.cwd\n let resolvedCwd = parent.cwd;\n if (typeof params.cwd === \"string\" && params.cwd.length > 0) {\n const cwdResult = resolveCwdOrError(params.cwd);\n if (!cwdResult.ok) return { error: cwdResult.error };\n resolvedCwd = cwdResult.value;\n }\n\n // V0.1: ACP `unstable_forkSession` is experimental upstream and our SDK's\n // `agent.fork()` is a one-shot ephemeral sub-run (D110-D114), not a\n // long-lived session split. Returning invalid_request prevents misuse\n // until v0.2 implements proper session forking via Agent.create() with\n // parent options inheritance.\n // (EC-3 still observed: any host that calls this on a CloudAgent gets a\n // clean invalid_request rather than UnsupportedRunOperationError.)\n void parent; // parent lookup kept for symmetry + parentId validation\n void resolvedCwd;\n void deps.log;\n return {\n error: {\n code: ACP_ERR.INVALID_REQUEST,\n message:\n \"session/fork is deferred to @theokit/acp v0.2 — current SDK fork is a one-shot sub-run, not a session split\",\n },\n };\n}\n\n// ===== listSessions =====\n\n/**\n * Snapshot the sessions THIS process is holding in memory. Never errors, ignores every filter on the\n * request, and does not read persisted conversations — a restart empties it.\n *\n * `title` is the agent's `agentId`, `lastUpdatedAt` is the last time a prompt or cancel touched the\n * session (not the last agent output).\n */\nexport function handleListSessions(\n _params: acp.ListSessionsRequest,\n store: SessionStore,\n): acp.ListSessionsResponse {\n const sessions = store.list().map((s) => ({\n sessionId: s.sessionId,\n cwd: s.cwd,\n title: s.agent.agentId,\n lastUpdatedAt: new Date(s.lastUsedAt).toISOString(),\n }));\n return { sessions };\n}\n\n// ===== cancel =====\n\ninterface CancelDeps {\n store: SessionStore;\n}\n\n/**\n * Abort the in-flight turn of a session. Idempotent, and silently succeeds for an unknown id —\n * `session/cancel` is a notification, so there is no channel to report one.\n *\n * Scoped to the turn, not to the session: `handlePrompt` arms a fresh `AbortController` before each\n * prompt (`armTurn`), so cancelling one answer leaves the session usable for the next. It used to\n * abort a controller created once at session creation and never replaced, which handed every later\n * prompt an already-aborted signal and killed the session while it still looked alive (#349).\n */\nexport function handleCancel(params: acp.CancelNotification, deps: CancelDeps): void {\n const session = deps.store.get(params.sessionId);\n if (session === undefined) return; // idempotent — silently succeed on unknown sessionId\n session.lastUsedAt = Date.now();\n if (!session.abortController.signal.aborted) {\n session.abortController.abort(\"cancelled by ACP client\");\n }\n}\n","/**\n * Stream translator: AsyncGenerator<SDKMessage> → ACP `sessionUpdate` notifications\n * (D353, T3.2).\n *\n * Exhaustive switch on `SDKMessage.type` with a `never` check, so a new SDK message variant fails\n * the build here rather than being dropped at runtime. Only `assistant`, `thinking` and `tool_call`\n * have an ACP equivalent; `system`, `user`, `status`, `task`, `request` and `object_delta` are\n * deliberate no-ops.\n *\n * The abort signal is checked BETWEEN messages, never mid-message: a cancel takes effect at the next\n * yield, so the update already being sent still goes out. `sessionUpdate` failures are logged and\n * counted, and the translator stops after MAX_CONSECUTIVE_SEND_FAILURES consecutive ones\n * (SHOULD-TEST EC-10) — a run of failures usually means the host is gone.\n *\n * @internal\n */\n\nimport type * as acp from \"@agentclientprotocol/sdk\";\nimport type { SDKMessage } from \"@theokit/sdk\";\n\nconst MAX_CONSECUTIVE_SEND_FAILURES = 10;\n\ninterface TranslateStreamArgs {\n messages: AsyncGenerator<SDKMessage, void>;\n conn: acp.AgentSideConnection;\n sessionId: string;\n signal: AbortSignal;\n log: (msg: string) => void;\n suppressThinking?: boolean;\n}\n\n/**\n * Map a tool name to the ACP `ToolKind` a host uses to pick an icon and an affordance.\n *\n * Case-insensitive exact match against a fixed list of names hard-coded here. Anything not on it —\n * including every custom tool a consumer registers — is `\"other\"`, which is cosmetic and never\n * affects whether the tool runs.\n */\nexport function toolKind(name: string): acp.ToolKind {\n const n = name.toLowerCase();\n if (n === \"read_file\" || n === \"list_dir\" || n === \"git_diff\" || n === \"search_text\")\n return \"read\";\n if (n === \"write_file\" || n === \"apply_patch\") return \"edit\";\n if (n === \"run_command\" || n === \"run_vitest\") return \"execute\";\n if (n === \"web_search\" || n === \"fetch_url\") return \"fetch\";\n return \"other\";\n}\n\nfunction mapToolStatus(sdkStatus: \"running\" | \"completed\" | \"error\"): acp.ToolCallStatus {\n if (sdkStatus === \"completed\") return \"completed\";\n if (sdkStatus === \"error\") return \"failed\";\n return \"in_progress\";\n}\n\nfunction textChunk(text: string): acp.ContentBlock {\n return { type: \"text\", text };\n}\n\ninterface SafeSendState {\n consecutiveFailures: number;\n bailed: boolean;\n}\n\nasync function safeNotify(\n conn: acp.AgentSideConnection,\n sessionId: string,\n update: acp.SessionUpdate,\n state: SafeSendState,\n log: (msg: string) => void,\n): Promise<void> {\n if (state.bailed) return;\n try {\n await conn.sessionUpdate({ sessionId, update });\n state.consecutiveFailures = 0;\n } catch (err) {\n state.consecutiveFailures += 1;\n const msg = err instanceof Error ? err.message : String(err);\n log(\n `[acp] sessionUpdate failed (${state.consecutiveFailures}/${MAX_CONSECUTIVE_SEND_FAILURES}): ${msg}`,\n );\n if (state.consecutiveFailures >= MAX_CONSECUTIVE_SEND_FAILURES) {\n state.bailed = true;\n log(\"[acp] translator bailing — too many consecutive sessionUpdate failures\");\n }\n }\n}\n\nasync function handleAssistant(\n msg: Extract<SDKMessage, { type: \"assistant\" }>,\n args: TranslateStreamArgs,\n state: SafeSendState,\n): Promise<void> {\n for (const content of msg.message.content) {\n if (content.type === \"text\") {\n await safeNotify(\n args.conn,\n args.sessionId,\n { sessionUpdate: \"agent_message_chunk\", content: textChunk(content.text) },\n state,\n args.log,\n );\n } else if (content.type === \"tool_use\") {\n await safeNotify(\n args.conn,\n args.sessionId,\n {\n sessionUpdate: \"tool_call\",\n toolCallId: content.id,\n title: content.name,\n kind: toolKind(content.name),\n status: \"in_progress\",\n },\n state,\n args.log,\n );\n }\n }\n}\n\nasync function handleToolCall(\n msg: Extract<SDKMessage, { type: \"tool_call\" }>,\n args: TranslateStreamArgs,\n state: SafeSendState,\n): Promise<void> {\n const content: acp.ToolCallContent[] = [];\n if (msg.result !== undefined && msg.result !== null) {\n const text = typeof msg.result === \"string\" ? msg.result : JSON.stringify(msg.result);\n content.push({ type: \"content\", content: textChunk(text) });\n }\n await safeNotify(\n args.conn,\n args.sessionId,\n {\n sessionUpdate: \"tool_call_update\",\n toolCallId: msg.call_id,\n status: mapToolStatus(msg.status),\n ...(content.length > 0 ? { content } : {}),\n },\n state,\n args.log,\n );\n}\n\nasync function handleThinking(\n msg: Extract<SDKMessage, { type: \"thinking\" }>,\n args: TranslateStreamArgs,\n state: SafeSendState,\n): Promise<void> {\n if (args.suppressThinking === true) return;\n await safeNotify(\n args.conn,\n args.sessionId,\n { sessionUpdate: \"agent_thought_chunk\", content: textChunk(msg.text) },\n state,\n args.log,\n );\n}\n\n/**\n * Drain `args.messages` and push each translatable message to the host as a `sessionUpdate`.\n *\n * Resolves when the generator is exhausted, when `args.signal` is already aborted at a message\n * boundary, or when the send-failure budget is spent. It swallows notification failures by design\n * (a dead host must not turn into an exception mid-run) and therefore does NOT report how much of\n * the stream actually reached the host — the caller's stop reason comes from the run, not from here.\n *\n * Set `suppressThinking` to keep reasoning chunks out of the host UI; it does not stop the agent\n * from producing them.\n */\nexport async function translateStream(args: TranslateStreamArgs): Promise<void> {\n const state: SafeSendState = { consecutiveFailures: 0, bailed: false };\n for await (const msg of args.messages) {\n if (args.signal.aborted) break;\n if (state.bailed) break;\n await dispatchMessage(msg, args, state);\n }\n}\n\nasync function dispatchMessage(\n msg: SDKMessage,\n args: TranslateStreamArgs,\n state: SafeSendState,\n): Promise<void> {\n switch (msg.type) {\n case \"system\":\n return; // no ACP equivalent\n case \"user\":\n return; // echo, no ACP equivalent\n case \"assistant\":\n await handleAssistant(msg, args, state);\n return;\n case \"thinking\":\n await handleThinking(msg, args, state);\n return;\n case \"tool_call\":\n await handleToolCall(msg, args, state);\n return;\n case \"status\":\n return; // cloud-only\n case \"task\":\n return; // milestones — skipped in v0.1\n case \"request\":\n return; // permission requests routed via plugin\n case \"object_delta\":\n return; // streamObject not used in plain prompt flow\n default: {\n const _exhaustive: never = msg;\n throw new Error(`unhandled SDKMessage type: ${JSON.stringify(_exhaustive)}`);\n }\n }\n}\n","/**\n * ACP tool permission plugin — bridges ACP `requestPermission` to our SDK\n * `pre_tool_call` veto hook (D101, D355, EC-2).\n *\n * Modes:\n * - `auto` — pass-through; `installPermissionPlugin` is never called, so `trustedTools` and\n * `timeoutMs` have no effect\n * - `deny` — block every tool call, INCLUDING the ones in `trustedTools` (the deny branch is\n * evaluated first)\n * - `ask` — round-trip via `conn.requestPermission`, with `trustedTools` skipping the round-trip\n * and `timeoutMs` bounding it (EC-2)\n *\n * Every failure of the round-trip blocks: timeout, host-side cancel, an explicit deny, and a\n * transport error are all vetoes. The tool never runs on ambiguity.\n *\n * @internal\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport type * as acp from \"@agentclientprotocol/sdk\";\nimport { ConfigurationError, Plugin, type SDKAgent } from \"@theokit/sdk\";\nimport { toolKind } from \"./translator.js\";\nimport type { PermissionMode } from \"./types.js\";\n\ninterface PermissionPluginArgs {\n conn: acp.AgentSideConnection;\n sessionId: string;\n mode: PermissionMode;\n trustedTools: Set<string>;\n timeoutMs: number;\n}\n\ninterface VetoDecision {\n block: true;\n message: string;\n}\n\nasync function askWithTimeout(\n args: PermissionPluginArgs,\n toolName: string,\n): Promise<VetoDecision | undefined> {\n const toolCallId = `acp-perm-${randomUUID()}`;\n const reqPromise = args.conn.requestPermission({\n sessionId: args.sessionId,\n toolCall: {\n toolCallId,\n title: toolName,\n kind: toolKind(toolName),\n status: \"pending\",\n },\n options: [\n { optionId: \"allow\", name: \"Allow\", kind: \"allow_once\" },\n { optionId: \"deny\", name: \"Deny\", kind: \"reject_once\" },\n ],\n });\n\n let timeoutHandle: NodeJS.Timeout | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutHandle = setTimeout(() => {\n reject(new Error(\"permission_timeout\"));\n }, args.timeoutMs);\n });\n\n let response: acp.RequestPermissionResponse;\n try {\n response = (await Promise.race([reqPromise, timeoutPromise])) as acp.RequestPermissionResponse;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg === \"permission_timeout\") {\n return { block: true, message: `permission timed out after ${args.timeoutMs}ms` };\n }\n return { block: true, message: `permission request failed (client disconnected?): ${msg}` };\n } finally {\n if (timeoutHandle !== undefined) clearTimeout(timeoutHandle);\n }\n\n const outcome = response.outcome;\n if (outcome.outcome === \"cancelled\") {\n return { block: true, message: \"permission cancelled by client\" };\n }\n if (outcome.outcome === \"selected\" && outcome.optionId === \"deny\") {\n return { block: true, message: \"denied by user\" };\n }\n return undefined;\n}\n\n/**\n * Install the tool-permission veto on an SDK agent, for one session.\n *\n * Call it once per prompt (the prompt handler does); the plugin name is derived from the session id,\n * and re-registering under the same name relies on the SDK's `pre_tool_call` subscription contract\n * rather than on bookkeeping here.\n *\n * **Fail-closed (SEC-M0-03):** when `mode` is `deny`/`ask` but the runtime has\n * no plugin manager (e.g. a CloudAgent), enforcement is impossible — this\n * THROWS a `ConfigurationError` rather than letting tools run ungated. Awaiting\n * `register` (ARCH-08/SEC-M0-05) guarantees the veto hook is aggregated before\n * the first tool dispatch.\n */\nexport async function installPermissionPlugin(\n agent: SDKAgent,\n args: PermissionPluginArgs,\n): Promise<void> {\n const plugin = Plugin.create({\n name: `acp-permission-${args.sessionId}`,\n version: \"1.0.0\",\n kind: \"general\",\n register(ctx) {\n ctx.on(\"pre_tool_call\", async (rawCtx) => {\n const event = rawCtx as { name: string; args: Record<string, unknown> };\n if (args.mode === \"deny\") {\n return { block: true, message: \"denied (permissionDefault=deny)\" };\n }\n if (args.trustedTools.has(event.name)) {\n return undefined;\n }\n // mode === \"ask\"\n return askWithTimeout(args, event.name);\n });\n },\n });\n\n // The agent's plugin manager is exposed via `pluginManager()` on LocalAgent.\n // The plugin is registered for the lifetime of the session — adequate for\n // ACP's one-process-per-session model (D356).\n const agentLike = agent as SDKAgent & {\n pluginManager?: () => {\n register?: (p: unknown) => Promise<void> | void;\n initialize?: (plugins: unknown[]) => Promise<void>;\n };\n };\n const mgr = agentLike.pluginManager?.();\n if (mgr === undefined) {\n // SEC-M0-03 — FAIL CLOSED. If the operator asked for `deny`/`ask` but this\n // runtime (e.g. CloudAgent) has no plugin manager, tools would run UNGATED\n // while the operator believes they are gated. A security control must not\n // fail open: refuse the session instead of warning-and-continuing.\n throw new ConfigurationError(\n `permission enforcement unavailable on this runtime (no plugin manager) — ` +\n `cannot honor permissionDefault=\"${args.mode}\" for session \"${args.sessionId}\"`,\n { code: \"permission_enforcement_unavailable\" },\n );\n }\n // ARCH-08/SEC-M0-05 — await so the veto hook is aggregated before any tool\n // dispatch, and an async registration failure surfaces (not an unhandled\n // rejection).\n if (typeof mgr.register === \"function\") {\n await mgr.register(plugin);\n } else if (typeof mgr.initialize === \"function\") {\n await mgr.initialize([plugin]);\n }\n}\n","/**\n * Public types for `@theokit/acp` (ADRs D349-D360).\n *\n * @public\n */\n\nimport type { SDKAgent } from \"@theokit/sdk\";\n\n/**\n * Builds the agent that will serve one ACP session.\n *\n * Called once per `session/new`, with a freshly generated UUID, and awaited. Returning a NEW agent\n * per call is what gives each session its own conversation state (D351); returning the same instance\n * every time is the shared-state shape described on {@link AgentOrFactory}.\n *\n * A throw or rejection here is reported to the host as JSON-RPC `-32603`, message\n * `agent factory threw: <your message>`, and no session is created.\n *\n * @public\n */\nexport type AgentFactory = (sessionId: string) => SDKAgent | Promise<SDKAgent>;\n\n/**\n * What `serveAcp({ agent })` accepts.\n *\n * - {@link AgentFactory} — one agent per session. Recommended.\n * - `SDKAgent` — one agent for the whole process. Legal, but every ACP session then appends to the\n * SAME conversation; `serveAcp` writes a one-time warning through its `log` and carries on.\n *\n * Anything else (a plain object, `null`, a string) makes `serveAcp` fail with an\n * `InvalidAgentError` before a single byte of protocol is read. `serveAcp` is `async`, so that\n * arrives as a REJECTED PROMISE, never as a synchronous throw — `try { serveAcp(...) } catch` around\n * the call alone catches nothing. The class is not exported either (see {@link serveAcp}); match on\n * `err.name`. The duck-test is narrow: an object qualifies only when it has a string `agentId` and a\n * callable `send`.\n *\n * @public\n */\nexport type AgentOrFactory = AgentFactory | SDKAgent;\n\n/**\n * How tool calls are gated before they execute (D355).\n *\n * - `\"ask\"` (default) — every tool call except the ones named in `trustedTools` round-trips through\n * the host's `session/request_permission`. A `deny` choice, a cancelled request, a transport\n * failure, or `permissionTimeoutMs` elapsing all BLOCK the call.\n * - `\"auto\"` — no gating whatsoever: the veto plugin is never installed, so `trustedTools` AND\n * `permissionTimeoutMs` are silently ignored in this mode.\n * - `\"deny\"` — blocks every tool call without asking the host. `trustedTools` does NOT exempt\n * anything here: the deny branch is evaluated before the trusted-tool check.\n *\n * `\"ask\"` and `\"deny\"` fail closed. When the runtime has no plugin manager to hang the veto on (a\n * cloud-backed agent, for instance), the prompt is refused with `-32603` rather than executed\n * ungated — a security control that cannot be installed must not silently degrade to `\"auto\"`.\n *\n * @public\n */\nexport type PermissionMode = \"ask\" | \"auto\" | \"deny\";\n\n/**\n * Overrides for the capabilities advertised in the ACP `initialize` handshake.\n *\n * `loadSession` and the three `prompt` flags reach the wire; they are the only session-shaped\n * capabilities `AgentCapabilities` has a slot for at `@agentclientprotocol/sdk@0.22.1`.\n *\n * `forkSession` and `listSessions` were removed in #350. The protocol has nowhere to advertise\n * them — neither name appears in its generated schema — and neither gated anything here:\n * `session/fork` is refused unconditionally and `session/list` is answered from the in-memory\n * store regardless. They were accepted, typed, documented, and inert.\n *\n * @public\n */\nexport interface AcpCapabilities {\n /** Advertise `session/load`. Default `true`. The handler needs the SDK to be able to resume that id. */\n loadSession?: boolean;\n /** Prompt content the host may send. Anything disabled here is a hint to the host, not a guard. */\n prompt?: {\n /** Default `false`. Audio blocks are still accepted and counted against `maxPromptBytes`. */\n audio?: boolean;\n /** Default `true`. */\n embeddedContext?: boolean;\n /** Default `true`. Images are accepted but only the TEXT blocks of a prompt reach the agent. */\n image?: boolean;\n };\n}\n\n/**\n * Display info for the agent in an ACP host UI.\n *\n * Sent as `InitializeResponse.agentInfo` when you supply it (#350 — it was accepted and read by\n * nothing). Omitted otherwise: defaulting to this package's own metadata would label every agent as\n * the adapter serving it, and a name that is confidently wrong is worse for a host to display than\n * one that is absent.\n *\n * @public\n */\nexport interface AcpAgentInfo {\n /** Machine-ish identifier, e.g. `\"my-bot\"`. */\n name: string;\n /** Human label preferred by a UI over `name`. */\n title?: string;\n /** Semver of the agent, not of this package. */\n version: string;\n}\n\n/**\n * Options for {@link serveAcp}. Every field but `agent` is optional and every default is listed\n * below — this object is the whole configuration surface, nothing is read from env or disk.\n *\n * @public\n */\nexport interface AcpServerOptions {\n /** The agent, or a per-session factory. Required; an unusable value throws before serving. */\n agent: AgentOrFactory;\n /** Name, title and version advertised as `agentInfo` in the `initialize` handshake. */\n info?: AcpAgentInfo;\n /** Handshake capability overrides. Only a subset is honoured — see {@link AcpCapabilities}. */\n capabilities?: AcpCapabilities;\n /** Default `\"ask\"`. Read {@link PermissionMode} before choosing: `\"auto\"` disables the two fields below. */\n permissionDefault?: PermissionMode;\n /**\n * How long to wait for the host to answer `session/request_permission` before BLOCKING the tool\n * call (fail-closed, EC-2). Default `60_000` ms. Ignored unless `permissionDefault` is `\"ask\"`.\n */\n permissionTimeoutMs?: number;\n /**\n * Tool names that skip the permission round-trip. Matched by exact tool name.\n *\n * Effective in `\"ask\"` mode ONLY: `\"auto\"` never installs the plugin, and `\"deny\"` blocks these\n * too.\n */\n trustedTools?: ReadonlyArray<string>;\n /**\n * Ceiling on the ACCUMULATED size of one prompt, in bytes. Default `2 * 1024 * 1024` (2 MiB), D360.\n *\n * Counted per block and summed: UTF-8 bytes for text, base64-DECODED bytes for image and audio,\n * the URI for a resource link, the JSON form for an embedded resource. Crossing it rejects the\n * whole prompt with `-32602` — see {@link PromptTooLargeError}.\n */\n maxPromptBytes?: number;\n /**\n * Sink for this package's diagnostics — one line per call, newline NOT included.\n *\n * Defaults to a write to `process.stderr` (D359). Never route this to stdout: stdout carries the\n * JSON-RPC frames.\n */\n log?: (msg: string) => void;\n /** Override the protocol input stream. Defaults to `process.stdin`. Test seam. */\n stdin?: NodeJS.ReadableStream;\n /** Override the protocol output stream. Defaults to `process.stdout`. Test seam. */\n stdout?: NodeJS.WritableStream;\n}\n\n/**\n * Raised when a prompt's accumulated size passes `maxPromptBytes` (D360).\n *\n * `size` is the running total AT the block that crossed the limit, not the size of the full prompt:\n * extraction stops at the first offending block, so blocks after it are never measured.\n *\n * Under {@link serveAcp} this never escapes to the caller — it is caught and returned to the ACP\n * host as JSON-RPC `-32602` carrying `message` verbatim (`prompt exceeds N bytes (got M)`). The\n * class is exported so that text has a named origin; the extractor that throws it is not part of the\n * public surface, so there is no supported call site where a consumer can `instanceof` it directly.\n *\n * @public\n */\nexport class PromptTooLargeError extends Error {\n override readonly name = \"PromptTooLargeError\";\n constructor(\n readonly size: number,\n readonly limit: number,\n ) {\n super(`prompt exceeds ${limit} bytes (got ${size})`);\n }\n}\n","/**\n * Extract user text + attachments from ACP `ContentBlock[]` with size cap (D360).\n *\n * The size cap is a RUNNING total over the blocks in order, checked after each one, so the first\n * block to cross it aborts the whole extraction and later blocks are never measured.\n *\n * @internal\n */\n\nimport type * as acp from \"@agentclientprotocol/sdk\";\nimport { PromptTooLargeError } from \"./types.js\";\n\ninterface PromptAttachment {\n type: \"image\" | \"audio\" | \"resource\" | \"resource_link\" | \"embedded_resource\";\n mimeType?: string;\n data?: string;\n uri?: string;\n bytes: number;\n}\n\ninterface PromptExtractionResult {\n text: string;\n attachments: PromptAttachment[];\n}\n\nfunction utf8Bytes(s: string): number {\n return Buffer.byteLength(s, \"utf8\");\n}\n\nfunction base64DecodedBytes(b64: string): number {\n return Math.floor((b64.length * 3) / 4);\n}\n\ninterface ExtractState {\n textParts: string[];\n attachments: PromptAttachment[];\n totalBytes: number;\n maxBytes: number;\n}\n\nfunction recordBytes(state: ExtractState, bytes: number): void {\n state.totalBytes += bytes;\n if (state.totalBytes > state.maxBytes) {\n throw new PromptTooLargeError(state.totalBytes, state.maxBytes);\n }\n}\n\nfunction processBlock(block: acp.ContentBlock, state: ExtractState): void {\n switch (block.type) {\n case \"text\":\n recordBytes(state, utf8Bytes(block.text));\n state.textParts.push(block.text);\n return;\n case \"image\": {\n const data = block.data ?? \"\";\n const bytes = base64DecodedBytes(data);\n recordBytes(state, bytes);\n state.attachments.push({ type: \"image\", mimeType: block.mimeType, data, bytes });\n return;\n }\n case \"audio\": {\n const data = block.data ?? \"\";\n const bytes = base64DecodedBytes(data);\n recordBytes(state, bytes);\n state.attachments.push({ type: \"audio\", mimeType: block.mimeType, data, bytes });\n return;\n }\n case \"resource_link\": {\n const uri = block.uri ?? \"\";\n const bytes = utf8Bytes(uri);\n recordBytes(state, bytes);\n state.attachments.push({ type: \"resource_link\", uri, bytes });\n return;\n }\n case \"resource\": {\n const bytes = utf8Bytes(JSON.stringify(block));\n recordBytes(state, bytes);\n state.attachments.push({ type: \"embedded_resource\", bytes });\n return;\n }\n default: {\n const _exhaustive: never = block;\n throw new Error(`unknown ContentBlock type: ${JSON.stringify(_exhaustive)}`);\n }\n }\n}\n\n/**\n * Flatten one ACP prompt into the text the agent will receive, plus a description of its attachments.\n *\n * Text blocks are joined with `\"\\n\"` in wire order. Attachments are only DESCRIBED here — the ACP\n * prompt handler forwards `text` and drops `attachments`, so an image-only prompt yields an empty\n * string and is rejected upstream as an empty prompt.\n *\n * Byte accounting per block: UTF-8 length for text, base64-decoded length for image/audio (computed\n * as `floor(len * 3 / 4)`, so padding makes it over-count by up to 2 bytes), UTF-8 length of the URI\n * for `resource_link`, and the UTF-8 length of the block's JSON form for an embedded `resource`.\n *\n * @throws PromptTooLargeError as soon as the running total exceeds `maxBytes`.\n * @throws Error on a `ContentBlock` variant this build does not know (compile-time exhaustive).\n */\nexport function extractPrompt(\n blocks: ReadonlyArray<acp.ContentBlock>,\n maxBytes: number,\n): PromptExtractionResult {\n const state: ExtractState = { textParts: [], attachments: [], totalBytes: 0, maxBytes };\n for (const block of blocks) processBlock(block, state);\n return { text: state.textParts.join(\"\\n\"), attachments: state.attachments };\n}\n","/**\n * In-memory session store mapping ACP `sessionId` → `AcpSession` (D356).\n *\n * Per-`serveAcp()` invocation. No global state.\n *\n * @internal\n */\n\nimport type { SDKAgent } from \"@theokit/sdk\";\n\n/** One live ACP session: the agent serving it, its cwd, its abort handle, and access timestamps. */\nexport interface AcpSession {\n readonly sessionId: string;\n readonly agent: SDKAgent;\n readonly createdAt: number;\n lastUsedAt: number;\n /**\n * The abort handle of the CURRENT turn, replaced by {@link armTurn} at the start of each one.\n *\n * It is per-turn rather than per-session because that is what `session/cancel` means: the host\n * stops the answer being written, not the conversation. It used to be created once at session\n * creation and never replaced, so one cancel handed every later prompt an already-aborted signal\n * and the session was dead while still looking alive (#349).\n */\n abortController: AbortController;\n readonly cwd: string;\n}\n\n/**\n * Give `session` a fresh abort scope for a turn that is about to start, and return its signal.\n *\n * Called at the top of every prompt. The previous controller is dropped: whatever it was cancelling\n * has already finished or been aborted, and a turn must never inherit a decision made about an\n * earlier one.\n */\nexport function armTurn(session: AcpSession): AbortSignal {\n session.abortController = new AbortController();\n return session.abortController.signal;\n}\n\n/**\n * Sessions held by one `serveAcp` call. In-memory only: a restart loses every entry, which is why\n * `session/load` goes back through the SDK's conversation storage instead of this map.\n *\n * Not thread-safe and does not need to be — one Node process, one event loop.\n */\nexport class SessionStore {\n private readonly map = new Map<string, AcpSession>();\n\n /** @throws Error on a duplicate id — the caller must have checked `has` first. */\n create(session: AcpSession): void {\n if (this.map.has(session.sessionId)) {\n throw new Error(`duplicate sessionId: ${session.sessionId}`);\n }\n this.map.set(session.sessionId, session);\n }\n\n get(sessionId: string): AcpSession | undefined {\n return this.map.get(sessionId);\n }\n\n /** `true` when an entry was removed. Does NOT dispose the agent or abort its controller. */\n delete(sessionId: string): boolean {\n return this.map.delete(sessionId);\n }\n\n /** A new array over the live session objects — the array is a copy, the sessions are not. */\n list(): AcpSession[] {\n return [...this.map.values()];\n }\n\n size(): number {\n return this.map.size;\n }\n\n has(sessionId: string): boolean {\n return this.map.has(sessionId);\n }\n}\n","/**\n * ACP prompt handler — extracts user text, installs the permission veto, drives `agent.send`,\n * translates the stream via `translator.ts`, and answers with a `PromptResponse` stop reason.\n *\n * Order matters and is load-bearing: the prompt is validated and the veto is installed BEFORE the\n * run starts, so a prompt that cannot be gated never reaches a tool.\n *\n * @internal\n */\n\nimport type * as acp from \"@agentclientprotocol/sdk\";\nimport type { Run } from \"@theokit/sdk\";\nimport { ACP_ERR, type AcpError } from \"./lifecycle.js\";\nimport { installPermissionPlugin } from \"./permission-plugin.js\";\nimport { extractPrompt } from \"./prompt-extract.js\";\nimport { type AcpSession, armTurn, type SessionStore } from \"./session-store.js\";\nimport { translateStream } from \"./translator.js\";\nimport type { PermissionMode } from \"./types.js\";\n\ninterface HandlePromptDeps {\n store: SessionStore;\n conn: acp.AgentSideConnection;\n maxPromptBytes: number;\n permissionMode: PermissionMode;\n permissionTimeoutMs: number;\n trustedTools: Set<string>;\n log: (msg: string) => void;\n}\n\n/**\n * B-125 — an unmapped error code used to fall through to `\"end_turn\"`, so an\n * errored run was reported to the ACP client as ordinary success. `undefined`\n * now means \"no mapping\" and MUST NOT be treated as `end_turn` by the caller —\n * `StopReason` has no \"error\" value, so an unmapped status has to surface\n * through the protocol's `{ error: AcpError }` channel instead (see\n * `runPrompt`).\n */\nfunction mapStopReason(runStatus: string, errorCode?: string): acp.StopReason | undefined {\n if (errorCode === \"aborted\" || runStatus === \"cancelled\") return \"cancelled\";\n if (errorCode === \"safety_blocked\") return \"refusal\";\n if (errorCode === \"context_length_exceeded\" || errorCode === \"max_tokens\") return \"max_tokens\";\n if (errorCode === \"max_iterations\") return \"max_turn_requests\";\n if (runStatus === \"finished\") return \"end_turn\";\n return undefined;\n}\n\n/** Thrown by `runPrompt` when a run ends in a status/error-code combination\n * `mapStopReason` cannot place. Caught by `handlePrompt`'s existing failure\n * path and turned into a JSON-RPC `{ error: AcpError }`, never into a\n * fabricated `end_turn`. */\nclass UnmappedRunStatusError extends Error {\n constructor(runStatus: string, errorCode: string, detail: string | undefined) {\n super(\n `run ended in status \"${runStatus}\" with unmapped error code \"${errorCode}\"${\n detail !== undefined ? `: ${detail}` : \"\"\n }`,\n );\n this.name = \"UnmappedRunStatusError\";\n }\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n return err.name === \"AbortError\" || err.message.includes(\"aborted\");\n}\n\ntype ExtractOutcome = { ok: true; text: string } | { ok: false; error: AcpError };\n\nfunction extractOrError(params: acp.PromptRequest, deps: HandlePromptDeps): ExtractOutcome {\n try {\n const result = extractPrompt(params.prompt, deps.maxPromptBytes);\n if (result.text.length === 0) {\n return { ok: false, error: { code: ACP_ERR.INVALID_REQUEST, message: \"empty prompt\" } };\n }\n return { ok: true, text: result.text };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n deps.log(`[acp] prompt extract rejected: ${msg}`);\n return { ok: false, error: { code: ACP_ERR.INVALID_REQUEST, message: msg } };\n }\n}\n\nasync function runPrompt(\n session: AcpSession,\n text: string,\n params: acp.PromptRequest,\n deps: HandlePromptDeps,\n): Promise<acp.StopReason> {\n // #349 — a fresh abort scope per turn. Both the send and the translator read THIS signal, so a\n // cancel of an earlier turn cannot reach into this one.\n const signal = armTurn(session);\n const run: Run = await session.agent.send(text, { signal });\n try {\n await translateStream({\n messages: run.stream(),\n conn: deps.conn,\n sessionId: params.sessionId,\n signal,\n log: deps.log,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n deps.log(`[acp] translator threw mid-stream: ${msg}`);\n }\n const result = await run.wait();\n const errorCode =\n result.status === \"error\" && result.error !== undefined ? (result.error.code ?? \"\") : \"\";\n const stopReason = mapStopReason(result.status, errorCode);\n if (stopReason === undefined) {\n throw new UnmappedRunStatusError(result.status, errorCode, result.error?.message);\n }\n return stopReason;\n}\n\n/**\n * SEC-M0-03 — install the permission veto (fail-closed). Returns an AcpError to\n * REFUSE the prompt when the requested mode cannot be enforced on this runtime,\n * or `undefined` when installation succeeded (or mode is `auto`).\n */\nasync function installPermissionOrError(\n session: AcpSession,\n params: acp.PromptRequest,\n deps: HandlePromptDeps,\n): Promise<AcpError | undefined> {\n if (deps.permissionMode === \"auto\") return undefined;\n try {\n await installPermissionPlugin(session.agent, {\n conn: deps.conn,\n sessionId: params.sessionId,\n mode: deps.permissionMode,\n trustedTools: deps.trustedTools,\n timeoutMs: deps.permissionTimeoutMs,\n });\n return undefined;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { code: ACP_ERR.INTERNAL_ERROR, message: msg };\n }\n}\n\n/**\n * Run one ACP `session/prompt` turn to completion and report why it stopped.\n *\n * Steps, each able to end the turn: look the session up, flatten the prompt to text, install the\n * permission plugin, `agent.send`, translate the stream, await the run, map its status.\n *\n * Errors returned (never thrown): `INVALID_SESSION` for an id this process has not loaded;\n * `INVALID_REQUEST` for a prompt with no text or one over `maxPromptBytes`; `INTERNAL_ERROR` when\n * the permission veto cannot be installed, when `agent.send` throws, or when the run ends in a\n * status/error-code pair ACP has no stop reason for.\n *\n * An abort — from `session/cancel` or from an already-aborted session — is NOT an error: it answers\n * `{ stopReason: \"cancelled\" }`. A mid-stream translator failure is logged and does not fail the\n * turn: the run is still awaited and its own status decides the stop reason.\n */\nexport async function handlePrompt(\n params: acp.PromptRequest,\n deps: HandlePromptDeps,\n): Promise<{ response: acp.PromptResponse } | { error: AcpError }> {\n const session = deps.store.get(params.sessionId);\n if (session === undefined) {\n return {\n error: { code: ACP_ERR.INVALID_SESSION, message: `unknown session: ${params.sessionId}` },\n };\n }\n session.lastUsedAt = Date.now();\n\n const extracted = extractOrError(params, deps);\n if (!extracted.ok) return { error: extracted.error };\n\n const permError = await installPermissionOrError(session, params, deps);\n if (permError !== undefined) return { error: permError };\n\n try {\n const stopReason = await runPrompt(session, extracted.text, params, deps);\n return { response: { stopReason } };\n } catch (err) {\n if (isAbortError(err)) return { response: { stopReason: \"cancelled\" } };\n const msg = err instanceof Error ? err.message : String(err);\n const label = err instanceof UnmappedRunStatusError ? \"run ended unmapped\" : \"agent.send threw\";\n deps.log(`[acp] ${label}: ${msg}`);\n return { error: { code: ACP_ERR.INTERNAL_ERROR, message: msg } };\n }\n}\n","/**\n * `serveAcp({ agent })` — top-level entry that wires the ACP server.\n *\n * Constructs `AgentSideConnection` from `@agentclientprotocol/sdk@^0.22`,\n * delegates lifecycle methods to `lifecycle.ts`, and drives the prompt\n * translator from `translator.ts`. All state (sessions, warnings, defaults) is\n * per invocation — nothing is module-global, so two `serveAcp` calls on\n * different stream pairs do not see each other (D356).\n *\n * @public\n */\n\nimport { Readable } from \"node:stream\";\nimport * as acp from \"@agentclientprotocol/sdk\";\nimport { resolveAgentFactory } from \"./agent-resolver.js\";\nimport {\n buildInitializeResponse,\n handleCancel,\n handleForkSession,\n handleListSessions,\n handleLoadSession,\n handleNewSession,\n} from \"./lifecycle.js\";\nimport { handlePrompt } from \"./prompt-handler.js\";\nimport { SessionStore } from \"./session-store.js\";\nimport type { AcpServerOptions, PermissionMode } from \"./types.js\";\n\nconst DEFAULT_MAX_PROMPT_BYTES = 2 * 1024 * 1024;\nconst DEFAULT_PERMISSION_TIMEOUT_MS = 60_000;\nconst DEFAULT_PERMISSION_MODE: PermissionMode = \"ask\";\n\n/**\n * Serve `options.agent` to an ACP host over JSON-RPC on stdio, blocking until the input stream ends.\n *\n * ```ts\n * await serveAcp({ agent: (sessionId) => Agent.create({ agentId: sessionId }) });\n * ```\n *\n * Needs `@agentclientprotocol/sdk` and `@theokit/sdk` installed (peer dependencies). It reads no\n * environment variable and no config file of its own; every knob is on {@link AcpServerOptions}.\n * **Do not write to stdout** from the agent or its tools — that stream carries the protocol frames.\n *\n * Resolves once `stdin` emits `end` or `close` AND `dispose()` has settled for every live session\n * (EC-1). A `dispose()` that throws is logged and swallowed, so a bad teardown cannot strand the\n * process.\n *\n * Rejects only when it cannot start: an `InvalidAgentError` when `agent` is neither a function nor\n * an object with a string `agentId` and a callable `send`. That class is exported, so branch on\n * `instanceof InvalidAgentError` rather than on `err.name` (#369). Nothing that happens afterwards\n * rejects this promise — per-request failures go back to\n * the host as JSON-RPC errors:\n *\n * | Condition | Code |\n * |---|---|\n * | `cwd` absent or not on disk (`session/new`, `session/load`, `session/fork`) | `-32602` |\n * | `session/load` for an id already loaded in this process | `-32602` |\n * | prompt with no text block, or over `maxPromptBytes` | `-32602` |\n * | `session/fork` whose parent IS loaded here — deferred to v0.2 | `-32602` |\n * | `session/prompt` or `session/fork` naming a session this process has not loaded | `-32001` |\n * | `session/load` the SDK cannot resume (wrong host, no shared storage) | `-32001` |\n * | agent factory threw | `-32603` |\n * | `permissionDefault` is `\"ask\"`/`\"deny\"` and the runtime cannot enforce it | `-32603` |\n * | run ended in a status ACP has no stop reason for | `-32603` |\n *\n * `session/fork` checks the parent BEFORE `cwd`, so a fork naming a parent this process does not\n * hold answers `-32001` and never reaches either `-32602` row above. Because the session store is\n * in-memory and per-process, that is the common case after a restart — `session/fork` is refused in\n * every case, but reading the refusal as \"always `-32602`\" is wrong.\n *\n * A prompt that completes maps the run onto an ACP stop reason: `end_turn`, `cancelled`, `refusal`\n * (safety), `max_tokens` (context or token cap), `max_turn_requests` (iteration cap).\n *\n * Traps worth knowing before you wire a host to this:\n * - `session/authenticate` always answers success without checking anything (D350) — do not read an\n * empty `authMethods` plus a successful authenticate as \"the agent authorised me\".\n * - Only the TEXT blocks of a prompt reach the agent. Images, audio and resources are counted\n * against `maxPromptBytes`, then dropped.\n * - `session/cancel` aborts the session's single `AbortController`, and nothing re-arms it. Every\n * later prompt on that session is issued with an already-aborted signal, so treat a cancelled\n * session as spent and open a new one.\n * - Of the SDK stream, only assistant text, thinking and tool calls are forwarded; `status`, `task`\n * and `object_delta` messages have no ACP equivalent and are dropped silently.\n * - `serveAcp` does not close `stdout` and does not call `process.exit` — the caller owns the exit.\n *\n * @public\n */\nexport async function serveAcp(options: AcpServerOptions): Promise<void> {\n const log = options.log ?? ((msg: string) => process.stderr.write(`${msg}\\n`));\n const factory = resolveAgentFactory(options.agent, { log });\n const store = new SessionStore();\n const maxPromptBytes = options.maxPromptBytes ?? DEFAULT_MAX_PROMPT_BYTES;\n const permissionMode = options.permissionDefault ?? DEFAULT_PERMISSION_MODE;\n const permissionTimeoutMs = options.permissionTimeoutMs ?? DEFAULT_PERMISSION_TIMEOUT_MS;\n const trustedTools = new Set(options.trustedTools ?? []);\n\n const stdin = options.stdin ?? process.stdin;\n const stdout = options.stdout ?? process.stdout;\n\n // Convert Node streams ↔ Web streams for ndJsonStream. process.stdin is\n // a Node Readable; toWeb gives us the WHATWG ReadableStream.\n // For stdout we wrap into a Writable stream that flushes via the Node API.\n const inputWeb = Readable.toWeb(stdin as Readable) as ReadableStream<Uint8Array>;\n const outputWeb = new WritableStream<Uint8Array>({\n write(chunk: Uint8Array): Promise<void> {\n return new Promise((resolve, reject) => {\n const ok = stdout.write(chunk, (err) => (err ? reject(err) : undefined));\n if (ok) resolve();\n else stdout.once(\"drain\", resolve);\n });\n },\n });\n const stream = acp.ndJsonStream(outputWeb, inputWeb);\n\n const closedPromise = new Promise<void>((resolve) => {\n stdin.once(\"end\", () => resolve());\n stdin.once(\"close\", () => resolve());\n });\n\n // Construct connection. The agentBuilder is invoked synchronously by the SDK.\n new acp.AgentSideConnection((conn) => {\n return {\n initialize: async (params) =>\n buildInitializeResponse(params, {\n capabilities: options.capabilities,\n ...(options.info !== undefined ? { info: options.info } : {}),\n }),\n\n authenticate: async (_params): Promise<acp.AuthenticateResponse> => {\n // D350 — auth deferred to v0.2; return empty success.\n return {};\n },\n\n newSession: async (params) => {\n const result = await handleNewSession(params, { factory, store, log });\n if (\"error\" in result) {\n throw new acp.RequestError(result.error.code, result.error.message);\n }\n return result.response;\n },\n\n loadSession: async (params) => {\n const result = await handleLoadSession(params, { store, log });\n if (\"error\" in result) {\n throw new acp.RequestError(result.error.code, result.error.message);\n }\n return result.response;\n },\n\n unstable_forkSession: async (params) => {\n const result = await handleForkSession(params, { store, log });\n if (\"error\" in result) {\n throw new acp.RequestError(result.error.code, result.error.message);\n }\n return result.response;\n },\n\n listSessions: async (params) => handleListSessions(params, store),\n\n cancel: async (params) => {\n handleCancel(params, { store });\n },\n\n prompt: async (params) => {\n const result = await handlePrompt(params, {\n store,\n conn,\n maxPromptBytes,\n permissionMode,\n permissionTimeoutMs,\n trustedTools,\n log,\n });\n if (\"error\" in result) {\n throw new acp.RequestError(result.error.code, result.error.message);\n }\n return result.response;\n },\n };\n }, stream);\n\n // EC-1: wait for stdin close, then dispose every live session before resolving.\n await closedPromise;\n const sessions = store.list();\n log(`[acp] stdin closed; disposing ${sessions.length} session(s)`);\n await Promise.allSettled(\n sessions.map(async (session) => {\n try {\n await session.agent.dispose();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n log(`[acp] dispose of ${session.sessionId} threw: ${msg}`);\n }\n }),\n );\n}\n"]}