@theokit/acp 1.0.0 → 2.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 +15 -0
- package/dist/index.cjs +26 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +27 -15
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.0.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies
|
|
8
|
+
- @theokit/sdk@3.0.0
|
|
9
|
+
|
|
10
|
+
## 1.0.1
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- 98ac0d0: Fix a live security defect: the ACP `pre_tool_call` permission veto was never enforced (#68). `installPermissionPlugin` tried to register its veto hook via `pluginManager.register(...)`, but `PluginManager` exposed no `register()` method — only a single-shot `initialize()` that throws when called twice. The call fell through to `void mgr.initialize([plugin])`, whose "called twice" rejection was swallowed, so the permission hook was never aggregated and guarded tools ran **without** the permission check even under `permissionMode: "deny"`/`"ask"`.
|
|
15
|
+
|
|
16
|
+
`PluginManager` now exposes `register(plugin)` — a post-init, `general`-only registration that REPLACES a same-named plugin's hooks (idempotent for the per-prompt ACP re-install) instead of appending duplicates. Additionally, `installPermissionPlugin` is now **fail-closed**: when the runtime has no plugin manager (e.g. a CloudAgent) and the mode is `deny`/`ask`, it throws a `ConfigurationError` (`code: "permission_enforcement_unavailable"`) and the ACP prompt is refused — rather than letting tools run ungated while the operator believes they are gated. It is also now `async` and awaits registration, so the veto hook is guaranteed aggregated before the first tool dispatch (no fire-and-forget window).
|
|
17
|
+
|
|
3
18
|
## 1.0.0
|
|
4
19
|
|
|
5
20
|
### Patch Changes
|
package/dist/index.cjs
CHANGED
|
@@ -382,8 +382,8 @@ async function askWithTimeout(args, toolName) {
|
|
|
382
382
|
}
|
|
383
383
|
return void 0;
|
|
384
384
|
}
|
|
385
|
-
function installPermissionPlugin(agent, args) {
|
|
386
|
-
const plugin = sdk.
|
|
385
|
+
async function installPermissionPlugin(agent, args) {
|
|
386
|
+
const plugin = sdk.Plugin.create({
|
|
387
387
|
name: `acp-permission-${args.sessionId}`,
|
|
388
388
|
version: "1.0.0",
|
|
389
389
|
kind: "general",
|
|
@@ -403,12 +403,15 @@ function installPermissionPlugin(agent, args) {
|
|
|
403
403
|
const agentLike = agent;
|
|
404
404
|
const mgr = agentLike.pluginManager?.();
|
|
405
405
|
if (mgr === void 0) {
|
|
406
|
-
|
|
406
|
+
throw new sdk.ConfigurationError(
|
|
407
|
+
`permission enforcement unavailable on this runtime (no plugin manager) \u2014 cannot honor permissionDefault="${args.mode}" for session "${args.sessionId}"`,
|
|
408
|
+
{ code: "permission_enforcement_unavailable" }
|
|
409
|
+
);
|
|
407
410
|
}
|
|
408
411
|
if (typeof mgr.register === "function") {
|
|
409
|
-
mgr.register(plugin);
|
|
412
|
+
await mgr.register(plugin);
|
|
410
413
|
} else if (typeof mgr.initialize === "function") {
|
|
411
|
-
|
|
414
|
+
await mgr.initialize([plugin]);
|
|
412
415
|
}
|
|
413
416
|
}
|
|
414
417
|
|
|
@@ -526,6 +529,22 @@ async function runPrompt(session, text, params, deps) {
|
|
|
526
529
|
const errorCode = result.status === "error" && result.error !== void 0 ? result.error.code ?? "" : "";
|
|
527
530
|
return mapStopReason(result.status, errorCode);
|
|
528
531
|
}
|
|
532
|
+
async function installPermissionOrError(session, params, deps) {
|
|
533
|
+
if (deps.permissionMode === "auto") return void 0;
|
|
534
|
+
try {
|
|
535
|
+
await installPermissionPlugin(session.agent, {
|
|
536
|
+
conn: deps.conn,
|
|
537
|
+
sessionId: params.sessionId,
|
|
538
|
+
mode: deps.permissionMode,
|
|
539
|
+
trustedTools: deps.trustedTools,
|
|
540
|
+
timeoutMs: deps.permissionTimeoutMs
|
|
541
|
+
});
|
|
542
|
+
return void 0;
|
|
543
|
+
} catch (err) {
|
|
544
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
545
|
+
return { code: ACP_ERR.INTERNAL_ERROR, message: msg };
|
|
546
|
+
}
|
|
547
|
+
}
|
|
529
548
|
async function handlePrompt(params, deps) {
|
|
530
549
|
const session = deps.store.get(params.sessionId);
|
|
531
550
|
if (session === void 0) {
|
|
@@ -536,15 +555,8 @@ async function handlePrompt(params, deps) {
|
|
|
536
555
|
session.lastUsedAt = Date.now();
|
|
537
556
|
const extracted = extractOrError(params, deps);
|
|
538
557
|
if (!extracted.ok) return { error: extracted.error };
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
conn: deps.conn,
|
|
542
|
-
sessionId: params.sessionId,
|
|
543
|
-
mode: deps.permissionMode,
|
|
544
|
-
trustedTools: deps.trustedTools,
|
|
545
|
-
timeoutMs: deps.permissionTimeoutMs
|
|
546
|
-
});
|
|
547
|
-
}
|
|
558
|
+
const permError = await installPermissionOrError(session, params, deps);
|
|
559
|
+
if (permError !== void 0) return { error: permError };
|
|
548
560
|
try {
|
|
549
561
|
const stopReason = await runPrompt(session, extracted.text, params, deps);
|
|
550
562
|
return { response: { stopReason } };
|
package/dist/index.cjs.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","path","existsSync","randomUUID","Agent","definePlugin","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 { 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 */\nexport function installPermissionPlugin(agent: SDKAgent, args: PermissionPluginArgs): 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) => void;\n initialize?: (plugins: unknown[]) => Promise<void>;\n };\n };\n const mgr = agentLike.pluginManager?.();\n if (mgr === undefined) {\n return; // CloudAgent — no plugin manager, no permission flow available\n }\n if (typeof mgr.register === \"function\") {\n mgr.register(plugin);\n } else if (typeof mgr.initialize === \"function\") {\n void 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\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 if (deps.permissionMode !== \"auto\") {\n 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 }\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,SAAS,kBAAkB,KAAA,EAAmC;AAC5D,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACV,OAAQ,KAAA,CAAgC,OAAA,KAAY,QAAA,IACpD,OAAQ,KAAA,CAA6B,IAAA,KAAS,UAAA;AAElD;AAEO,IAAM,iBAAA,GAAN,cAAgC,KAAA,CAAM;AAAA,EACzB,IAAA,GAAO,mBAAA;AAC3B,CAAA;AAMO,SAAS,mBAAA,CACd,KAAA,EACA,OAAA,GAA2B,EAAC,EACd;AACd,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,KAAQ,CAAC,QAAgB,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAG;AAAA,CAAI,CAAA,CAAA;AAE5E,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC5B,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,OAAO,CAAC,UAAA,KAAiC;AACvC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAA,GAAS,IAAA;AACT,QAAA,GAAA;AAAA,UACE;AAAA,SAEF;AAAA,MACF;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,iBAAA;AAAA,IACR;AAAA,GACF;AACF;AC7BO,SAAS,uBAAA,CACd,SACA,IAAA,EACwB;AACxB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,IAAgB,EAAC;AACvC,EAAA,OAAO;AAAA,IACL,eAAA,EAAqBA,eAAA,CAAA,gBAAA;AAAA,IACrB,iBAAA,EAAmB;AAAA,MACjB,WAAA,EAAa,SAAS,WAAA,IAAe,IAAA;AAAA,MACrC,kBAAA,EAAoB;AAAA,QAClB,KAAA,EAAO,QAAA,CAAS,MAAA,EAAQ,KAAA,IAAS,IAAA;AAAA,QACjC,KAAA,EAAO,QAAA,CAAS,MAAA,EAAQ,KAAA,IAAS,KAAA;AAAA,QACjC,eAAA,EAAiB,QAAA,CAAS,MAAA,EAAQ,eAAA,IAAmB;AAAA;AACvD,KACF;AAAA,IACA,aAAa;AAAC,GAChB;AACF;AAmBO,IAAM,OAAA,GAAU;AAAA,EACrB,eAAA,EAAiB,MAAA;AAAA,EACjB,cAAA,EAAgB,MAAA;AAAA,EAChB,eAAA,EAAiB,MAAA;AAAA,EACjB,aAAA,EAAe;AACjB,CAAA;AAMA,SAAS,kBAAkB,MAAA,EAA+C;AACxE,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,WAAW,CAAA,EAAG;AACrD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,OAAO,EAAE,IAAA,EAAM,OAAA,CAAQ,eAAA,EAAiB,SAAS,iBAAA;AAAkB,KACrE;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAWC,qBAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AACpC,EAAA,IAAI,CAACC,aAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,CAAQ,iBAAiB,OAAA,EAAS,CAAA,eAAA,EAAkB,QAAQ,CAAA,CAAA;AAAG,KAChF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,QAAA,EAAS;AACrC;AAEA,eAAsB,gBAAA,CACpB,QACA,IAAA,EACqE;AACrE,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAA,CAAO,GAAG,CAAA;AAC9C,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,SAAW,EAAE,KAAA,EAAO,UAAU,KAAA,EAAM;AAEnD,EAAA,MAAM,YAAYC,iBAAA,EAAW;AAC7B,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAAA,EACtC,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,iCAAA,EAAoC,GAAG,CAAA,CAAE,CAAA;AAClD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO;AAAA,QACL,MAAM,OAAA,CAAQ,cAAA;AAAA,QACd,OAAA,EAAS,wBAAwB,GAAG,CAAA;AAAA;AACtC,KACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAsB;AAAA,IAC1B,SAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,UAAA,EAAY,KAAK,GAAA,EAAI;AAAA,IACrB,eAAA,EAAiB,IAAI,eAAA,EAAgB;AAAA,IACrC,KAAK,SAAA,CAAU;AAAA,GACjB;AACA,EAAA,IAAA,CAAK,KAAA,CAAM,OAAO,OAAO,CAAA;AAEzB,EAAA,OAAO,EAAE,QAAA,EAAU,EAAE,SAAA,EAAU,EAAE;AACnC;AASA,IAAM,YAAA,GACJ,iJAAA;AAEF,eAAsB,iBAAA,CACpB,QACA,IAAA,EACsE;AACtE,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAA,CAAO,GAAG,CAAA;AAC9C,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,SAAW,EAAE,KAAA,EAAO,UAAU,KAAA,EAAM;AAEnD,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACpC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO;AAAA,QACL,MAAM,OAAA,CAAQ,eAAA;AAAA,QACd,OAAA,EAAS,CAAA,QAAA,EAAW,MAAA,CAAO,SAAS,CAAA,eAAA;AAAA;AACtC,KACF;AAAA,EACF;AAEA,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,MAAMC,SAAA,CAAM,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,EAAE,KAAA,EAAO,EAAE,GAAA,EAAK,SAAA,CAAU,KAAA,EAAM,EAAG,CAAA;AAAA,EAClF,SAAS,GAAA,EAAK;AAEZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,IAAA,CAAK,IAAI,CAAA,0CAAA,EAA6C,MAAA,CAAO,SAAS,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAChF,IAAA,OAAO;AAAA,MACL,KAAA,EAAO;AAAA,QACL,MAAM,OAAA,CAAQ,eAAA;AAAA,QACd,OAAA,EAAS,CAAA,mBAAA,EAAsB,MAAA,CAAO,SAAS,GAAG,YAAY,CAAA;AAAA;AAChE,KACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAsB;AAAA,IAC1B,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,KAAA;AAAA,IACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,UAAA,EAAY,KAAK,GAAA,EAAI;AAAA,IACrB,eAAA,EAAiB,IAAI,eAAA,EAAgB;AAAA,IACrC,KAAK,SAAA,CAAU;AAAA,GACjB;AACA,EAAA,IAAA,CAAK,KAAA,CAAM,OAAO,OAAO,CAAA;AAEzB,EAAA,OAAO,EAAE,QAAA,EAAU,EAAC,EAAE;AACxB;AASA,eAAsB,iBAAA,CACpB,QACA,IAAA,EACsE;AACtE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,SAAS,CAAA;AAC9C,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO;AAAA,QACL,MAAM,OAAA,CAAQ,eAAA;AAAA,QACd,OAAA,EAAS,CAAA,2BAAA,EAA8B,MAAA,CAAO,SAAS,CAAA;AAAA;AACzD,KACF;AAAA,EACF;AAGA,EAAkB,MAAA,CAAO;AACzB,EAAA,IAAI,OAAO,MAAA,CAAO,GAAA,KAAQ,YAAY,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,EAAG;AAC3D,IAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAA,CAAO,GAAG,CAAA;AAC9C,IAAA,IAAI,CAAC,SAAA,CAAU,EAAA,SAAW,EAAE,KAAA,EAAO,UAAU,KAAA,EAAM;AACnD,IAAc,SAAA,CAAU,KAAA;AAAA,EAC1B;AAYA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,MAAM,OAAA,CAAQ,eAAA;AAAA,MACd,OAAA,EACE;AAAA;AACJ,GACF;AACF;AAIO,SAAS,kBAAA,CACd,SACA,KAAA,EAC0B;AAC1B,EAAA,MAAM,WAAW,KAAA,CAAM,IAAA,EAAK,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACxC,WAAW,CAAA,CAAE,SAAA;AAAA,IACb,KAAK,CAAA,CAAE,GAAA;AAAA,IACP,KAAA,EAAO,EAAE,KAAA,CAAM,OAAA;AAAA,IACf,eAAe,IAAI,IAAA,CAAK,CAAA,CAAE,UAAU,EAAE,WAAA;AAAY,GACpD,CAAE,CAAA;AACF,EAAA,OAAO,EAAE,QAAA,EAAS;AACpB;AAQO,SAAS,YAAA,CAAa,QAAgC,IAAA,EAAwB;AACnF,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,SAAS,CAAA;AAC/C,EAAA,IAAI,YAAY,MAAA,EAAW;AAC3B,EAAA,OAAA,CAAQ,UAAA,GAAa,KAAK,GAAA,EAAI;AAC9B,EAAA,IAAI,CAAC,OAAA,CAAQ,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS;AAC3C,IAAA,OAAA,CAAQ,eAAA,CAAgB,MAAM,yBAAyB,CAAA;AAAA,EACzD;AACF;;;ACpPA,IAAM,6BAAA,GAAgC,EAAA;AAc/B,SAAS,SAAS,IAAA,EAA4B;AACnD,EAAA,MAAM,CAAA,GAAI,KAAK,WAAA,EAAY;AAC3B,EAAA,IAAI,MAAM,WAAA,IAAe,CAAA,KAAM,UAAA,IAAc,CAAA,KAAM,cAAc,CAAA,KAAM,aAAA;AACrE,IAAA,OAAO,MAAA;AACT,EAAA,IAAI,CAAA,KAAM,YAAA,IAAgB,CAAA,KAAM,aAAA,EAAe,OAAO,MAAA;AACtD,EAAA,IAAI,CAAA,KAAM,aAAA,IAAiB,CAAA,KAAM,YAAA,EAAc,OAAO,SAAA;AACtD,EAAA,IAAI,CAAA,KAAM,YAAA,IAAgB,CAAA,KAAM,WAAA,EAAa,OAAO,OAAA;AACpD,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,cAAc,SAAA,EAAkE;AACvF,EAAA,IAAI,SAAA,KAAc,aAAa,OAAO,WAAA;AACtC,EAAA,IAAI,SAAA,KAAc,SAAS,OAAO,QAAA;AAClC,EAAA,OAAO,aAAA;AACT;AAEA,SAAS,UAAU,IAAA,EAAgC;AACjD,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AAC9B;AAOA,eAAe,UAAA,CACb,IAAA,EACA,SAAA,EACA,MAAA,EACA,OACA,GAAA,EACe;AACf,EAAA,IAAI,MAAM,MAAA,EAAQ;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,CAAK,aAAA,CAAc,EAAE,SAAA,EAAW,QAAQ,CAAA;AAC9C,IAAA,KAAA,CAAM,mBAAA,GAAsB,CAAA;AAAA,EAC9B,SAAS,GAAA,EAAK;AACZ,IAAA,KAAA,CAAM,mBAAA,IAAuB,CAAA;AAC7B,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,GAAA;AAAA,MACE,+BAA+B,KAAA,CAAM,mBAAmB,CAAA,CAAA,EAAI,6BAA6B,MAAM,GAAG,CAAA;AAAA,KACpG;AACA,IAAA,IAAI,KAAA,CAAM,uBAAuB,6BAAA,EAA+B;AAC9D,MAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,MAAA,GAAA,CAAI,6EAAwE,CAAA;AAAA,IAC9E;AAAA,EACF;AACF;AAEA,eAAe,eAAA,CACb,GAAA,EACA,IAAA,EACA,KAAA,EACe;AACf,EAAA,KAAA,MAAW,OAAA,IAAW,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS;AACzC,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,MAAA,MAAM,UAAA;AAAA,QACJ,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK,SAAA;AAAA,QACL,EAAE,aAAA,EAAe,qBAAA,EAAuB,SAAS,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,EAAE;AAAA,QACzE,KAAA;AAAA,QACA,IAAA,CAAK;AAAA,OACP;AAAA,IACF,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,UAAA,EAAY;AACtC,MAAA,MAAM,UAAA;AAAA,QACJ,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK,SAAA;AAAA,QACL;AAAA,UACE,aAAA,EAAe,WAAA;AAAA,UACf,YAAY,OAAA,CAAQ,EAAA;AAAA,UACpB,OAAO,OAAA,CAAQ,IAAA;AAAA,UACf,IAAA,EAAM,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA;AAAA,UAC3B,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,KAAA;AAAA,QACA,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,cAAA,CACb,GAAA,EACA,IAAA,EACA,KAAA,EACe;AACf,EAAA,MAAM,UAAiC,EAAC;AACxC,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,MAAA,IAAa,GAAA,CAAI,WAAW,IAAA,EAAM;AACnD,IAAA,MAAM,IAAA,GAAO,OAAO,GAAA,CAAI,MAAA,KAAW,QAAA,GAAW,IAAI,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AACpF,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,SAAA,CAAU,IAAI,GAAG,CAAA;AAAA,EAC5D;AACA,EAAA,MAAM,UAAA;AAAA,IACJ,IAAA,CAAK,IAAA;AAAA,IACL,IAAA,CAAK,SAAA;AAAA,IACL;AAAA,MACE,aAAA,EAAe,kBAAA;AAAA,MACf,YAAY,GAAA,CAAI,OAAA;AAAA,MAChB,MAAA,EAAQ,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA;AAAA,MAChC,GAAI,OAAA,CAAQ,MAAA,GAAS,IAAI,EAAE,OAAA,KAAY;AAAC,KAC1C;AAAA,IACA,KAAA;AAAA,IACA,IAAA,CAAK;AAAA,GACP;AACF;AAEA,eAAe,cAAA,CACb,GAAA,EACA,IAAA,EACA,KAAA,EACe;AACf,EAAA,IAAI,IAAA,CAAK,qBAAqB,IAAA,EAAM;AACpC,EAAA,MAAM,UAAA;AAAA,IACJ,IAAA,CAAK,IAAA;AAAA,IACL,IAAA,CAAK,SAAA;AAAA,IACL,EAAE,aAAA,EAAe,qBAAA,EAAuB,SAAS,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAE;AAAA,IACrE,KAAA;AAAA,IACA,IAAA,CAAK;AAAA,GACP;AACF;AAMA,eAAsB,gBAAgB,IAAA,EAA0C;AAC9E,EAAA,MAAM,KAAA,GAAuB,EAAE,mBAAA,EAAqB,CAAA,EAAG,QAAQ,KAAA,EAAM;AACrE,EAAA,WAAA,MAAiB,GAAA,IAAO,KAAK,QAAA,EAAU;AACrC,IAAA,IAAI,IAAA,CAAK,OAAO,OAAA,EAAS;AACzB,IAAA,IAAI,MAAM,MAAA,EAAQ;AAClB,IAAA,MAAM,eAAA,CAAgB,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA;AAAA,EACxC;AACF;AAEA,eAAe,eAAA,CACb,GAAA,EACA,IAAA,EACA,KAAA,EACe;AACf,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,QAAA;AACH,MAAA;AAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA;AAAA;AAAA,IACF,KAAK,WAAA;AACH,MAAA,MAAM,eAAA,CAAgB,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,MAAM,cAAA,CAAe,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA;AACrC,MAAA;AAAA,IACF,KAAK,WAAA;AACH,MAAA,MAAM,cAAA,CAAe,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA;AACrC,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA;AAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA;AAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA;AAAA;AAAA,IACF,KAAK,cAAA;AACH,MAAA;AAAA;AAAA,IACF,SAAS;AACP,MAAA,MAAM,WAAA,GAAqB,GAAA;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,KAAK,SAAA,CAAU,WAAW,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7E;AAAA;AAEJ;;;AClKA,eAAe,cAAA,CACb,MACA,QAAA,EACmC;AACnC,EAAA,MAAM,UAAA,GAAa,CAAA,SAAA,EAAYD,iBAAAA,EAAY,CAAA,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB;AAAA,IAC7C,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,QAAA,EAAU;AAAA,MACR,UAAA;AAAA,MACA,KAAA,EAAO,QAAA;AAAA,MACP,IAAA,EAAM,SAAS,QAAQ,CAAA;AAAA,MACvB,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,OAAA,EAAS;AAAA,MACP,EAAE,QAAA,EAAU,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,MAAM,YAAA,EAAa;AAAA,MACvD,EAAE,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,MAAM,aAAA;AAAc;AACxD,GACD,CAAA;AAED,EAAA,IAAI,aAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AACvD,IAAA,aAAA,GAAgB,WAAW,MAAM;AAC/B,MAAA,MAAA,CAAO,IAAI,KAAA,CAAM,oBAAoB,CAAC,CAAA;AAAA,IACxC,CAAA,EAAG,KAAK,SAAS,CAAA;AAAA,EACnB,CAAC,CAAA;AAED,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAY,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,UAAA,EAAY,cAAc,CAAC,CAAA;AAAA,EAC7D,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,IAAI,QAAQ,oBAAA,EAAsB;AAChC,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,SAAS,CAAA,2BAAA,EAA8B,IAAA,CAAK,SAAS,CAAA,EAAA,CAAA,EAAK;AAAA,IAClF;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,CAAA,kDAAA,EAAqD,GAAG,CAAA,CAAA,EAAG;AAAA,EAC5F,CAAA,SAAE;AACA,IAAA,IAAI,aAAA,KAAkB,MAAA,EAAW,YAAA,CAAa,aAAa,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,EAAA,IAAI,OAAA,CAAQ,YAAY,WAAA,EAAa;AACnC,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,gCAAA,EAAiC;AAAA,EAClE;AACA,EAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,UAAA,IAAc,OAAA,CAAQ,aAAa,MAAA,EAAQ;AACjE,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,gBAAA,EAAiB;AAAA,EAClD;AACA,EAAA,OAAO,MAAA;AACT;AAaA,eAAsB,uBAAA,CACpB,OACA,IAAA,EACe;AACf,EAAA,MAAM,MAAA,GAASE,WAAO,MAAA,CAAO;AAAA,IAC3B,IAAA,EAAM,CAAA,eAAA,EAAkB,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,IACtC,OAAA,EAAS,OAAA;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,SAAS,GAAA,EAAK;AACZ,MAAA,GAAA,CAAI,EAAA,CAAG,eAAA,EAAiB,OAAO,MAAA,KAAW;AACxC,QAAA,MAAM,KAAA,GAAQ,MAAA;AACd,QAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,UAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,iCAAA,EAAkC;AAAA,QACnE;AACA,QAAA,IAAI,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AACrC,UAAA,OAAO,MAAA;AAAA,QACT;AAEA,QAAA,OAAO,cAAA,CAAe,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA;AAAA,MACxC,CAAC,CAAA;AAAA,IACH;AAAA,GACD,CAAA;AAKD,EAAA,MAAM,SAAA,GAAY,KAAA;AAMlB,EAAA,MAAM,GAAA,GAAM,UAAU,aAAA,IAAgB;AACtC,EAAA,IAAI,QAAQ,MAAA,EAAW;AAKrB,IAAA,MAAM,IAAIC,sBAAA;AAAA,MACR,CAAA,8GAAA,EACqC,IAAA,CAAK,IAAI,CAAA,eAAA,EAAkB,KAAK,SAAS,CAAA,CAAA,CAAA;AAAA,MAC9E,EAAE,MAAM,oCAAA;AAAqC,KAC/C;AAAA,EACF;AAIA,EAAA,IAAI,OAAO,GAAA,CAAI,QAAA,KAAa,UAAA,EAAY;AACtC,IAAA,MAAM,GAAA,CAAI,SAAS,MAAM,CAAA;AAAA,EAC3B,CAAA,MAAA,IAAW,OAAO,GAAA,CAAI,UAAA,KAAe,UAAA,EAAY;AAC/C,IAAA,MAAM,GAAA,CAAI,UAAA,CAAW,CAAC,MAAM,CAAC,CAAA;AAAA,EAC/B;AACF;;;AC/CO,IAAM,mBAAA,GAAN,cAAkC,KAAA,CAAM;AAAA,EAE7C,WAAA,CACW,MACA,KAAA,EACT;AACA,IAAA,KAAA,CAAM,CAAA,eAAA,EAAkB,KAAK,CAAA,YAAA,EAAe,IAAI,CAAA,CAAA,CAAG,CAAA;AAH1C,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAGX;AAAA,EAJW,IAAA;AAAA,EACA,KAAA;AAAA,EAHO,IAAA,GAAO,qBAAA;AAO3B;;;AClFA,SAAS,UAAU,CAAA,EAAmB;AACpC,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,CAAA,EAAG,MAAM,CAAA;AACpC;AAEA,SAAS,mBAAmB,GAAA,EAAqB;AAC/C,EAAA,OAAO,IAAA,CAAK,KAAA,CAAO,GAAA,CAAI,MAAA,GAAS,IAAK,CAAC,CAAA;AACxC;AASA,SAAS,WAAA,CAAY,OAAqB,KAAA,EAAqB;AAC7D,EAAA,KAAA,CAAM,UAAA,IAAc,KAAA;AACpB,EAAA,IAAI,KAAA,CAAM,UAAA,GAAa,KAAA,CAAM,QAAA,EAAU;AACrC,IAAA,MAAM,IAAI,mBAAA,CAAoB,KAAA,CAAM,UAAA,EAAY,MAAM,QAAQ,CAAA;AAAA,EAChE;AACF;AAEA,SAAS,YAAA,CAAa,OAAyB,KAAA,EAA2B;AACxE,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,MAAA;AACH,MAAA,WAAA,CAAY,KAAA,EAAO,SAAA,CAAU,KAAA,CAAM,IAAI,CAAC,CAAA;AACxC,MAAA,KAAA,CAAM,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC/B,MAAA;AAAA,IACF,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,EAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,mBAAmB,IAAI,CAAA;AACrC,MAAA,WAAA,CAAY,OAAO,KAAK,CAAA;AACxB,MAAA,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,UAAU,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,CAAA;AAC/E,MAAA;AAAA,IACF;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,EAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,mBAAmB,IAAI,CAAA;AACrC,MAAA,WAAA,CAAY,OAAO,KAAK,CAAA;AACxB,MAAA,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,UAAU,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,CAAA;AAC/E,MAAA;AAAA,IACF;AAAA,IACA,KAAK,eAAA,EAAiB;AACpB,MAAA,MAAM,GAAA,GAAM,MAAM,GAAA,IAAO,EAAA;AACzB,MAAA,MAAM,KAAA,GAAQ,UAAU,GAAG,CAAA;AAC3B,MAAA,WAAA,CAAY,OAAO,KAAK,CAAA;AACxB,MAAA,KAAA,CAAM,YAAY,IAAA,CAAK,EAAE,MAAM,eAAA,EAAiB,GAAA,EAAK,OAAO,CAAA;AAC5D,MAAA;AAAA,IACF;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAC7C,MAAA,WAAA,CAAY,OAAO,KAAK,CAAA;AACxB,MAAA,KAAA,CAAM,YAAY,IAAA,CAAK,EAAE,IAAA,EAAM,mBAAA,EAAqB,OAAO,CAAA;AAC3D,MAAA;AAAA,IACF;AAAA,IACA,SAAS;AACP,MAAA,MAAM,WAAA,GAAqB,KAAA;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,KAAK,SAAA,CAAU,WAAW,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7E;AAAA;AAEJ;AAEO,SAAS,aAAA,CACd,QACA,QAAA,EACwB;AACxB,EAAA,MAAM,KAAA,GAAsB,EAAE,SAAA,EAAW,EAAC,EAAG,aAAa,EAAC,EAAG,UAAA,EAAY,CAAA,EAAG,QAAA,EAAS;AACtF,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,EAAQ,YAAA,CAAa,KAAA,EAAO,KAAK,CAAA;AACrD,EAAA,OAAO,EAAE,MAAM,KAAA,CAAM,SAAA,CAAU,KAAK,IAAI,CAAA,EAAG,WAAA,EAAa,KAAA,CAAM,WAAA,EAAY;AAC5E;;;ACjEA,SAAS,aAAA,CAAc,WAAmB,SAAA,EAAoC;AAC5E,EAAA,IAAI,SAAA,KAAc,SAAA,IAAa,SAAA,KAAc,WAAA,EAAa,OAAO,WAAA;AACjE,EAAA,IAAI,SAAA,KAAc,kBAAkB,OAAO,SAAA;AAC3C,EAAA,IAAI,SAAA,KAAc,yBAAA,IAA6B,SAAA,KAAc,YAAA,EAAc,OAAO,YAAA;AAClF,EAAA,IAAI,SAAA,KAAc,kBAAkB,OAAO,mBAAA;AAC3C,EAAA,IAAI,SAAA,KAAc,YAAY,OAAO,UAAA;AACrC,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,aAAa,GAAA,EAAuB;AAC3C,EAAA,IAAI,EAAE,GAAA,YAAe,KAAA,CAAA,EAAQ,OAAO,KAAA;AACpC,EAAA,OAAO,IAAI,IAAA,KAAS,YAAA,IAAgB,GAAA,CAAI,OAAA,CAAQ,SAAS,SAAS,CAAA;AACpE;AAIA,SAAS,cAAA,CAAe,QAA2B,IAAA,EAAwC;AACzF,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,MAAA,CAAO,MAAA,EAAQ,KAAK,cAAc,CAAA;AAC/D,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC5B,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,MAAM,OAAA,CAAQ,eAAA,EAAiB,OAAA,EAAS,cAAA,EAAe,EAAE;AAAA,IACxF;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,EACvC,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,+BAAA,EAAkC,GAAG,CAAA,CAAE,CAAA;AAChD,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,MAAM,OAAA,CAAQ,eAAA,EAAiB,OAAA,EAAS,GAAA,EAAI,EAAE;AAAA,EAC7E;AACF;AAEA,eAAe,SAAA,CACb,OAAA,EACA,IAAA,EACA,MAAA,EACA,IAAA,EACyB;AACzB,EAAA,MAAM,GAAA,GAAW,MAAM,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAA,CAAQ,eAAA,CAAgB,MAAA,EAAQ,CAAA;AAC1F,EAAA,IAAI;AACF,IAAA,MAAM,eAAA,CAAgB;AAAA,MACpB,QAAA,EAAU,IAAI,MAAA,EAAO;AAAA,MACrB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,MAAA,EAAQ,QAAQ,eAAA,CAAgB,MAAA;AAAA,MAChC,KAAK,IAAA,CAAK;AAAA,KACX,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,mCAAA,EAAsC,GAAG,CAAA,CAAE,CAAA;AAAA,EACtD;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,EAAK;AAC9B,EAAA,MAAM,SAAA,GACJ,MAAA,CAAO,MAAA,KAAW,OAAA,IAAW,MAAA,CAAO,UAAU,MAAA,GAAa,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,EAAA,GAAM,EAAA;AACxF,EAAA,OAAO,aAAA,CAAc,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAA;AAC/C;AAOA,eAAe,wBAAA,CACb,OAAA,EACA,MAAA,EACA,IAAA,EAC+B;AAC/B,EAAA,IAAI,IAAA,CAAK,cAAA,KAAmB,MAAA,EAAQ,OAAO,MAAA;AAC3C,EAAA,IAAI;AACF,IAAA,MAAM,uBAAA,CAAwB,QAAQ,KAAA,EAAO;AAAA,MAC3C,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,MAAM,IAAA,CAAK,cAAA;AAAA,MACX,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AACD,IAAA,OAAO,KAAA,CAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,CAAQ,cAAA,EAAgB,SAAS,GAAA,EAAI;AAAA,EACtD;AACF;AAEA,eAAsB,YAAA,CACpB,QACA,IAAA,EACiE;AACjE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,SAAS,CAAA;AAC/C,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,CAAQ,iBAAiB,OAAA,EAAS,CAAA,iBAAA,EAAoB,MAAA,CAAO,SAAS,CAAA,CAAA;AAAG,KAC1F;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,UAAA,GAAa,KAAK,GAAA,EAAI;AAE9B,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,MAAA,EAAQ,IAAI,CAAA;AAC7C,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,SAAW,EAAE,KAAA,EAAO,UAAU,KAAA,EAAM;AAEnD,EAAA,MAAM,SAAA,GAAY,MAAM,wBAAA,CAAyB,OAAA,EAAS,QAAQ,IAAI,CAAA;AACtE,EAAA,IAAI,SAAA,KAAc,MAAA,EAAW,OAAO,EAAE,OAAO,SAAA,EAAU;AAEvD,EAAA,IAAI;AACF,IAAA,MAAM,aAAa,MAAM,SAAA,CAAU,SAAS,SAAA,CAAU,IAAA,EAAM,QAAQ,IAAI,CAAA;AACxE,IAAA,OAAO,EAAE,QAAA,EAAU,EAAE,UAAA,EAAW,EAAE;AAAA,EACpC,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,YAAA,CAAa,GAAG,CAAA,EAAG,OAAO,EAAE,QAAA,EAAU,EAAE,UAAA,EAAY,WAAA,EAAY,EAAE;AACtE,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,wBAAA,EAA2B,GAAG,CAAA,CAAE,CAAA;AACzC,IAAA,OAAO,EAAE,OAAO,EAAE,IAAA,EAAM,QAAQ,cAAA,EAAgB,OAAA,EAAS,KAAI,EAAE;AAAA,EACjE;AACF;;;ACnHO,IAAM,eAAN,MAAmB;AAAA,EACP,GAAA,uBAAU,GAAA,EAAwB;AAAA,EAEnD,OAAO,OAAA,EAA2B;AAChC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACnC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AAAA,IAC7D;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AAAA,EACzC;AAAA,EAEA,IAAI,SAAA,EAA2C;AAC7C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,SAAS,CAAA;AAAA,EAC/B;AAAA,EAEA,OAAO,SAAA,EAA4B;AACjC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA;AAAA,EAClC;AAAA,EAEA,IAAA,GAAqB;AACnB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA;AAAA,EAC9B;AAAA,EAEA,IAAA,GAAe;AACb,IAAA,OAAO,KAAK,GAAA,CAAI,IAAA;AAAA,EAClB;AAAA,EAEA,IAAI,SAAA,EAA4B;AAC9B,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,SAAS,CAAA;AAAA,EAC/B;AACF,CAAA;;;ACvBA,IAAM,wBAAA,GAA2B,IAAI,IAAA,GAAO,IAAA;AAC5C,IAAM,6BAAA,GAAgC,GAAA;AACtC,IAAM,uBAAA,GAA0C,KAAA;AAQhD,eAAsB,SAAS,OAAA,EAA0C;AACvE,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,KAAQ,CAAC,QAAgB,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAG;AAAA,CAAI,CAAA,CAAA;AAC5E,EAAA,MAAM,UAAU,mBAAA,CAAoB,OAAA,CAAQ,KAAA,EAAO,EAAE,KAAK,CAAA;AAC1D,EAAA,MAAM,KAAA,GAAQ,IAAI,YAAA,EAAa;AAC/B,EAAA,MAAM,cAAA,GAAiB,QAAQ,cAAA,IAAkB,wBAAA;AACjD,EAAA,MAAM,cAAA,GAAiB,QAAQ,iBAAA,IAAqB,uBAAA;AACpD,EAAA,MAAM,mBAAA,GAAsB,QAAQ,mBAAA,IAAuB,6BAAA;AAC3D,EAAA,MAAM,eAAe,IAAI,GAAA,CAAI,OAAA,CAAQ,YAAA,IAAgB,EAAE,CAAA;AAEvD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,KAAA;AACvC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA;AAKzC,EAAA,MAAM,QAAA,GAAWC,eAAA,CAAS,KAAA,CAAM,KAAiB,CAAA;AACjD,EAAA,MAAM,SAAA,GAAY,IAAI,cAAA,CAA2B;AAAA,IAC/C,MAAM,KAAA,EAAkC;AACtC,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,QAAA,MAAM,EAAA,GAAK,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,CAAC,QAAS,GAAA,GAAM,MAAA,CAAO,GAAG,CAAA,GAAI,MAAU,CAAA;AACvE,QAAA,IAAI,IAAI,OAAA,EAAQ;AAAA,aACX,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MACnC,CAAC,CAAA;AAAA,IACH;AAAA,GACD,CAAA;AACD,EAAA,MAAMC,QAAA,GAAaC,eAAA,CAAA,YAAA,CAAa,SAAA,EAAW,QAAQ,CAAA;AAEnD,EAAA,MAAM,aAAA,GAAgB,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACnD,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,MAAM,OAAA,EAAS,CAAA;AACjC,IAAA,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,MAAM,OAAA,EAAS,CAAA;AAAA,EACrC,CAAC,CAAA;AAID,EAAA,IAAQA,eAAA,CAAA,mBAAA,CAAoB,CAAC,IAAA,KAAS;AACpC,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,OAAO,MAAA,KACjB,uBAAA,CAAwB,QAAQ,EAAE,YAAA,EAAc,OAAA,CAAQ,YAAA,EAAc,CAAA;AAAA,MAExE,YAAA,EAAc,OAAO,OAAA,KAA+C;AAElE,QAAA,OAAO,EAAC;AAAA,MACV,CAAA;AAAA,MAEA,UAAA,EAAY,OAAO,MAAA,KAAW;AAC5B,QAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,MAAA,EAAQ,EAAE,OAAA,EAAS,KAAA,EAAO,KAAK,CAAA;AACrE,QAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,UAAA,MAAM,IAAQA,eAAA,CAAA,YAAA,CAAa,MAAA,CAAO,MAAM,IAAA,EAAM,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,QACpE;AACA,QAAA,OAAO,MAAA,CAAO,QAAA;AAAA,MAChB,CAAA;AAAA,MAEA,WAAA,EAAa,OAAO,MAAA,KAAW;AAC7B,QAAA,MAAM,SAAS,MAAM,iBAAA,CAAkB,QAAQ,EAAE,KAAA,EAAO,KAAK,CAAA;AAC7D,QAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,UAAA,MAAM,IAAQA,eAAA,CAAA,YAAA,CAAa,MAAA,CAAO,MAAM,IAAA,EAAM,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,QACpE;AACA,QAAA,OAAO,MAAA,CAAO,QAAA;AAAA,MAChB,CAAA;AAAA,MAEA,oBAAA,EAAsB,OAAO,MAAA,KAAW;AACtC,QAAA,MAAM,SAAS,MAAM,iBAAA,CAAkB,QAAQ,EAAE,KAAW,CAAC,CAAA;AAC7D,QAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,UAAA,MAAM,IAAQA,eAAA,CAAA,YAAA,CAAa,MAAA,CAAO,MAAM,IAAA,EAAM,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,QACpE;AACA,QAAA,OAAO,MAAA,CAAO,QAAA;AAAA,MAChB,CAAA;AAAA,MAEA,YAAA,EAAc,OAAO,MAAA,KAAW,kBAAA,CAAmB,QAAQ,KAAK,CAAA;AAAA,MAEhE,MAAA,EAAQ,OAAO,MAAA,KAAW;AACxB,QAAA,YAAA,CAAa,MAAA,EAAQ,EAAE,KAAA,EAAO,CAAA;AAAA,MAChC,CAAA;AAAA,MAEA,MAAA,EAAQ,OAAO,MAAA,KAAW;AACxB,QAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,MAAA,EAAQ;AAAA,UACxC,KAAA;AAAA,UACA,IAAA;AAAA,UACA,cAAA;AAAA,UACA,cAAA;AAAA,UACA,mBAAA;AAAA,UACA,YAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,UAAA,MAAM,IAAQA,eAAA,CAAA,YAAA,CAAa,MAAA,CAAO,MAAM,IAAA,EAAM,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,QACpE;AACA,QAAA,OAAO,MAAA,CAAO,QAAA;AAAA,MAChB;AAAA,KACF;AAAA,EACF,GAAGD,QAAM,CAAA;AAGT,EAAA,MAAM,aAAA;AACN,EAAA,MAAM,QAAA,GAAW,MAAM,IAAA,EAAK;AAC5B,EAAA,GAAA,CAAI,CAAA,8BAAA,EAAiC,QAAA,CAAS,MAAM,CAAA,WAAA,CAAa,CAAA;AACjE,EAAA,MAAM,OAAA,CAAQ,UAAA;AAAA,IACZ,QAAA,CAAS,GAAA,CAAI,OAAO,OAAA,KAAY;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,CAAQ,MAAM,OAAA,EAAQ;AAAA,MAC9B,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,QAAA,GAAA,CAAI,CAAA,iBAAA,EAAoB,OAAA,CAAQ,SAAS,CAAA,QAAA,EAAW,GAAG,CAAA,CAAE,CAAA;AAAA,MAC3D;AAAA,IACF,CAAC;AAAA,GACH;AACF","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,
|
|
6
|
+
import { Agent, Plugin, ConfigurationError } from '@theokit/sdk';
|
|
7
7
|
|
|
8
8
|
// src/serve.ts
|
|
9
9
|
|
|
@@ -357,8 +357,8 @@ async function askWithTimeout(args, toolName) {
|
|
|
357
357
|
}
|
|
358
358
|
return void 0;
|
|
359
359
|
}
|
|
360
|
-
function installPermissionPlugin(agent, args) {
|
|
361
|
-
const plugin =
|
|
360
|
+
async function installPermissionPlugin(agent, args) {
|
|
361
|
+
const plugin = Plugin.create({
|
|
362
362
|
name: `acp-permission-${args.sessionId}`,
|
|
363
363
|
version: "1.0.0",
|
|
364
364
|
kind: "general",
|
|
@@ -378,12 +378,15 @@ function installPermissionPlugin(agent, args) {
|
|
|
378
378
|
const agentLike = agent;
|
|
379
379
|
const mgr = agentLike.pluginManager?.();
|
|
380
380
|
if (mgr === void 0) {
|
|
381
|
-
|
|
381
|
+
throw new ConfigurationError(
|
|
382
|
+
`permission enforcement unavailable on this runtime (no plugin manager) \u2014 cannot honor permissionDefault="${args.mode}" for session "${args.sessionId}"`,
|
|
383
|
+
{ code: "permission_enforcement_unavailable" }
|
|
384
|
+
);
|
|
382
385
|
}
|
|
383
386
|
if (typeof mgr.register === "function") {
|
|
384
|
-
mgr.register(plugin);
|
|
387
|
+
await mgr.register(plugin);
|
|
385
388
|
} else if (typeof mgr.initialize === "function") {
|
|
386
|
-
|
|
389
|
+
await mgr.initialize([plugin]);
|
|
387
390
|
}
|
|
388
391
|
}
|
|
389
392
|
|
|
@@ -501,6 +504,22 @@ async function runPrompt(session, text, params, deps) {
|
|
|
501
504
|
const errorCode = result.status === "error" && result.error !== void 0 ? result.error.code ?? "" : "";
|
|
502
505
|
return mapStopReason(result.status, errorCode);
|
|
503
506
|
}
|
|
507
|
+
async function installPermissionOrError(session, params, deps) {
|
|
508
|
+
if (deps.permissionMode === "auto") return void 0;
|
|
509
|
+
try {
|
|
510
|
+
await installPermissionPlugin(session.agent, {
|
|
511
|
+
conn: deps.conn,
|
|
512
|
+
sessionId: params.sessionId,
|
|
513
|
+
mode: deps.permissionMode,
|
|
514
|
+
trustedTools: deps.trustedTools,
|
|
515
|
+
timeoutMs: deps.permissionTimeoutMs
|
|
516
|
+
});
|
|
517
|
+
return void 0;
|
|
518
|
+
} catch (err) {
|
|
519
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
520
|
+
return { code: ACP_ERR.INTERNAL_ERROR, message: msg };
|
|
521
|
+
}
|
|
522
|
+
}
|
|
504
523
|
async function handlePrompt(params, deps) {
|
|
505
524
|
const session = deps.store.get(params.sessionId);
|
|
506
525
|
if (session === void 0) {
|
|
@@ -511,15 +530,8 @@ async function handlePrompt(params, deps) {
|
|
|
511
530
|
session.lastUsedAt = Date.now();
|
|
512
531
|
const extracted = extractOrError(params, deps);
|
|
513
532
|
if (!extracted.ok) return { error: extracted.error };
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
conn: deps.conn,
|
|
517
|
-
sessionId: params.sessionId,
|
|
518
|
-
mode: deps.permissionMode,
|
|
519
|
-
trustedTools: deps.trustedTools,
|
|
520
|
-
timeoutMs: deps.permissionTimeoutMs
|
|
521
|
-
});
|
|
522
|
-
}
|
|
533
|
+
const permError = await installPermissionOrError(session, params, deps);
|
|
534
|
+
if (permError !== void 0) return { error: permError };
|
|
523
535
|
try {
|
|
524
536
|
const stopReason = await runPrompt(session, extracted.text, params, deps);
|
|
525
537
|
return { response: { stopReason } };
|
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 { 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 */\nexport function installPermissionPlugin(agent: SDKAgent, args: PermissionPluginArgs): 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) => void;\n initialize?: (plugins: unknown[]) => Promise<void>;\n };\n };\n const mgr = agentLike.pluginManager?.();\n if (mgr === undefined) {\n return; // CloudAgent — no plugin manager, no permission flow available\n }\n if (typeof mgr.register === \"function\") {\n mgr.register(plugin);\n } else if (typeof mgr.initialize === \"function\") {\n void 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\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 if (deps.permissionMode !== \"auto\") {\n 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 }\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": "
|
|
3
|
+
"version": "2.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": "^
|
|
38
|
+
"@theokit/sdk": "^3.0.0"
|
|
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": "
|
|
45
|
+
"@theokit/sdk": "3.0.0"
|
|
46
46
|
},
|
|
47
47
|
"publishConfig": {
|
|
48
48
|
"access": "public"
|