@theokit/acp 1.0.1 → 3.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.0.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+ - @theokit/sdk@4.0.0
9
+
10
+ ## 2.0.0
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies
15
+ - @theokit/sdk@3.0.0
16
+
3
17
  ## 1.0.1
4
18
 
5
19
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -383,7 +383,7 @@ async function askWithTimeout(args, toolName) {
383
383
  return void 0;
384
384
  }
385
385
  async function installPermissionPlugin(agent, args) {
386
- const plugin = sdk.definePlugin({
386
+ const plugin = sdk.Plugin.create({
387
387
  name: `acp-permission-${args.sessionId}`,
388
388
  version: "1.0.0",
389
389
  kind: "general",
@@ -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","definePlugin","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, definePlugin, 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 = definePlugin({\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/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"]}
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import * as acp2 from '@agentclientprotocol/sdk';
3
3
  import { randomUUID } from 'crypto';
4
4
  import { existsSync } from 'fs';
5
5
  import path from 'path';
6
- import { Agent, definePlugin, ConfigurationError } from '@theokit/sdk';
6
+ import { Agent, Plugin, ConfigurationError } from '@theokit/sdk';
7
7
 
8
8
  // src/serve.ts
9
9
 
@@ -358,7 +358,7 @@ async function askWithTimeout(args, toolName) {
358
358
  return void 0;
359
359
  }
360
360
  async function installPermissionPlugin(agent, args) {
361
- const plugin = definePlugin({
361
+ const plugin = Plugin.create({
362
362
  name: `acp-permission-${args.sessionId}`,
363
363
  version: "1.0.0",
364
364
  kind: "general",
package/dist/index.js.map CHANGED
@@ -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","randomUUID"],"mappings":"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","file":"index.js","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, definePlugin, 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 = definePlugin({\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/prompt-handler.ts","../src/session-store.ts","../src/serve.ts"],"names":["acp","randomUUID"],"mappings":"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","file":"index.js","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theokit/acp",
3
- "version": "1.0.1",
3
+ "version": "3.0.0",
4
4
  "description": "Agent Client Protocol (ACP) server adapter for @theokit/sdk. Exposes an SDKAgent over stdio JSON-RPC so Zed/Cursor/Claude Desktop can drive it. ADRs D349-D360.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -35,14 +35,14 @@
35
35
  ],
36
36
  "peerDependencies": {
37
37
  "@agentclientprotocol/sdk": "^0.22.1",
38
- "@theokit/sdk": "^2.19.0"
38
+ "@theokit/sdk": "^4.0.1"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@agentclientprotocol/sdk": "~0.22.1",
42
42
  "tsup": "^8.5.0",
43
43
  "typescript": "^5.8.0",
44
44
  "vitest": "^4.1.8",
45
- "@theokit/sdk": "2.19.0"
45
+ "@theokit/sdk": "4.0.1"
46
46
  },
47
47
  "publishConfig": {
48
48
  "access": "public"