acpx 0.16.0 → 0.17.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.
Files changed (36) hide show
  1. package/README.md +2 -0
  2. package/dist/{cli-BkYIxj_N.js → cli-CiyfEC7L.js} +5 -4
  3. package/dist/{cli-BkYIxj_N.js.map → cli-CiyfEC7L.js.map} +1 -1
  4. package/dist/cli.d.ts +1 -1
  5. package/dist/cli.js +33 -26
  6. package/dist/cli.js.map +1 -1
  7. package/dist/{client-5levcBIs.d.ts → client-C6NUFqr-.d.ts} +12 -6
  8. package/dist/client-C6NUFqr-.d.ts.map +1 -0
  9. package/dist/{flows-Bxs4udrs.js → flows-CTOdIk-m.js} +6 -5
  10. package/dist/{flows-Bxs4udrs.js.map → flows-CTOdIk-m.js.map} +1 -1
  11. package/dist/flows.d.ts +2 -2
  12. package/dist/flows.js +1 -1
  13. package/dist/{invocation-options-BY4lxkn3.js → invocation-options-DbCcOAzM.js} +4 -3
  14. package/dist/{invocation-options-BY4lxkn3.js.map → invocation-options-DbCcOAzM.js.map} +1 -1
  15. package/dist/ipc-D3akHMEq.js +3350 -0
  16. package/dist/ipc-D3akHMEq.js.map +1 -0
  17. package/dist/output-BPPjvJTI.js +980 -0
  18. package/dist/output-BPPjvJTI.js.map +1 -0
  19. package/dist/{live-checkpoint-BEfxBKCh.js → queue-owner-runtime--IbbndGz.js} +3052 -1852
  20. package/dist/queue-owner-runtime--IbbndGz.js.map +1 -0
  21. package/dist/runtime.d.ts +99 -12
  22. package/dist/runtime.d.ts.map +1 -1
  23. package/dist/runtime.js +308 -69
  24. package/dist/runtime.js.map +1 -1
  25. package/dist/{session-options-t3d-F4dn.d.ts → session-options-Dp6mzNSy.d.ts} +2 -2
  26. package/dist/{session-options-t3d-F4dn.d.ts.map → session-options-Dp6mzNSy.d.ts.map} +1 -1
  27. package/dist/session-watch--UX5dh00.js +76 -0
  28. package/dist/session-watch--UX5dh00.js.map +1 -0
  29. package/dist/watch-BbBxO-kb.js +32 -0
  30. package/dist/watch-BbBxO-kb.js.map +1 -0
  31. package/package.json +1 -1
  32. package/skills/acpx/SKILL.md +5 -2
  33. package/dist/client-5levcBIs.d.ts.map +0 -1
  34. package/dist/live-checkpoint-BEfxBKCh.js.map +0 -1
  35. package/dist/output-uo5a27KB.js +0 -4711
  36. package/dist/output-uo5a27KB.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","names":[],"sources":["../src/runtime/public/errors.ts","../src/runtime/public/shared.ts","../src/runtime/public/events.ts","../src/runtime/public/probe.ts","../src/runtime/engine/reuse-policy.ts","../src/runtime/engine/status.ts","../src/runtime/engine/manager.ts","../src/runtime/public/file-session-store.ts","../src/runtime/public/handle-state.ts","../src/runtime.ts"],"sourcesContent":["export const ACP_ERROR_CODES = [\n \"ACP_BACKEND_MISSING\",\n \"ACP_BACKEND_UNAVAILABLE\",\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n \"ACP_DISPATCH_DISABLED\",\n \"ACP_INVALID_RUNTIME_OPTION\",\n \"ACP_SESSION_INIT_FAILED\",\n \"ACP_TURN_FAILED\",\n] as const;\n\nexport type AcpRuntimeErrorCode = (typeof ACP_ERROR_CODES)[number];\n\nexport class AcpRuntimeError extends Error {\n readonly code: AcpRuntimeErrorCode;\n override readonly cause?: unknown;\n\n constructor(code: AcpRuntimeErrorCode, message: string, options?: { cause?: unknown }) {\n super(message);\n this.name = \"AcpRuntimeError\";\n this.code = code;\n this.cause = options?.cause;\n }\n}\n\nexport function isAcpRuntimeError(value: unknown): value is AcpRuntimeError {\n return value instanceof AcpRuntimeError;\n}\n","export type AcpxHandleState = {\n name: string;\n agent: string;\n cwd: string;\n mode: \"persistent\" | \"oneshot\";\n acpxRecordId?: string;\n backendSessionId?: string;\n agentSessionId?: string;\n};\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function asTrimmedString(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nexport function asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function asOptionalString(value: unknown): string | undefined {\n const text = asTrimmedString(value);\n return text || undefined;\n}\n\nexport function asOptionalBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function deriveAgentFromSessionKey(sessionKey: string, fallbackAgent: string): string {\n const match = sessionKey.match(/^agent:([^:]+):/i);\n const candidate = match?.[1] ? asTrimmedString(match[1]) : \"\";\n return candidate || fallbackAgent;\n}\n","import type { ToolCallContent, ToolCallLocation, ToolKind } from \"@agentclientprotocol/sdk\";\nimport type {\n AcpRuntimeAvailableCommand,\n AcpRuntimeEvent,\n AcpRuntimePlanEntry,\n AcpRuntimeUsageBreakdown,\n AcpRuntimeUsageCost,\n AcpSessionUpdateTag,\n AcpTextDeltaOriginMeta,\n} from \"./contract.js\";\nimport { asOptionalString, asString, asTrimmedString, isRecord } from \"./shared.js\";\n\nconst TOOL_OUTPUT_SUMMARY_MAX_CHARS = 500;\n\nfunction safeParseJsonObject(line: string): Record<string, unknown> | null {\n try {\n const parsed = JSON.parse(line) as unknown;\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction asOptionalFiniteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction resolveStructuredPromptPayload(parsed: Record<string, unknown>): {\n type: string;\n payload: Record<string, unknown>;\n tag?: AcpSessionUpdateTag;\n} {\n const method = asTrimmedString(parsed.method);\n if (method === \"session/update\") {\n const params = parsed.params;\n if (isRecord(params) && isRecord(params.update)) {\n const update = params.update;\n const tag = asOptionalString(update.sessionUpdate);\n return {\n type: tag ?? \"\",\n payload: update,\n ...(tag ? { tag } : {}),\n };\n }\n }\n\n const sessionUpdate = asOptionalString(parsed.sessionUpdate);\n if (sessionUpdate) {\n return {\n type: sessionUpdate,\n payload: parsed,\n tag: sessionUpdate,\n };\n }\n\n const type = asTrimmedString(parsed.type);\n const tag = asOptionalString(parsed.tag);\n return {\n type,\n payload: parsed,\n ...(tag ? { tag } : {}),\n };\n}\n\nfunction resolveStatusTextForTag(params: {\n tag: AcpSessionUpdateTag;\n payload: Record<string, unknown>;\n}): string | null {\n const resolver = STATUS_TEXT_RESOLVERS[params.tag];\n return resolver ? resolver(params.payload) : null;\n}\n\ntype StatusTextResolver = (payload: Record<string, unknown>) => string | null;\n\nconst STATUS_TEXT_RESOLVERS: Partial<Record<AcpSessionUpdateTag, StatusTextResolver>> = {\n available_commands_update: availableCommandsStatusText,\n current_mode_update: currentModeStatusText,\n config_option_update: configOptionStatusText,\n session_info_update: sessionInfoStatusText,\n};\n\nfunction availableCommandsStatusText(payload: Record<string, unknown>): string {\n const commands = Array.isArray(payload.availableCommands) ? payload.availableCommands : [];\n return commands.length > 0\n ? `available commands updated (${commands.length})`\n : \"available commands updated\";\n}\n\nfunction currentModeStatusText(payload: Record<string, unknown>): string {\n const mode =\n asTrimmedString(payload.currentModeId) ||\n asTrimmedString(payload.modeId) ||\n asTrimmedString(payload.mode);\n return mode ? `mode updated: ${mode}` : \"mode updated\";\n}\n\nfunction configOptionStatusText(payload: Record<string, unknown>): string {\n const id = asTrimmedString(payload.id) || asTrimmedString(payload.configOptionId);\n const value =\n asTrimmedString(payload.currentValue) ||\n asTrimmedString(payload.value) ||\n asTrimmedString(payload.optionValue);\n if (id && value) {\n return `config updated: ${id}=${value}`;\n }\n return id ? `config updated: ${id}` : \"config updated\";\n}\n\nfunction sessionInfoStatusText(payload: Record<string, unknown>): string {\n return asTrimmedString(payload.summary) || asTrimmedString(payload.message) || \"session updated\";\n}\n\nfunction planStatusText(payload: Record<string, unknown>): string | null {\n const entries = Array.isArray(payload.entries) ? payload.entries : [];\n const first = entries.find((entry) => isRecord(entry));\n const content = asTrimmedString(first?.content);\n return content ? `plan: ${content}` : null;\n}\n\nfunction isPlanEntryStatus(value: string): value is AcpRuntimePlanEntry[\"status\"] {\n return value === \"pending\" || value === \"in_progress\" || value === \"completed\";\n}\n\nfunction isPlanEntryPriority(value: string): value is NonNullable<AcpRuntimePlanEntry[\"priority\"]> {\n return value === \"high\" || value === \"medium\" || value === \"low\";\n}\n\nfunction planUpdateEvent(payload: Record<string, unknown>): AcpRuntimeEvent | null {\n const raw = payload.entries;\n const entries = normalizePlanEntries(raw);\n if (Array.isArray(raw) && raw.length === 0) {\n // An explicit empty snapshot clears the host's previous plan.\n return { type: \"status\", text: \"plan updated\", tag: \"plan\", entries: [] };\n }\n // Preserve legacy summaries, including entries without a valid status.\n const text =\n planStatusText(payload) ?? (entries.length > 0 ? `plan: ${entries[0]?.content}` : null);\n if (!text) {\n return null;\n }\n return {\n type: \"status\",\n text,\n tag: \"plan\",\n ...(entries.length > 0 ? { entries } : {}),\n };\n}\n\nfunction normalizePlanEntries(value: unknown): AcpRuntimePlanEntry[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const entries: AcpRuntimePlanEntry[] = [];\n for (const entry of value) {\n const normalized = normalizePlanEntry(entry);\n if (normalized) {\n entries.push(normalized);\n }\n }\n return entries;\n}\n\nfunction normalizePlanEntry(value: unknown): AcpRuntimePlanEntry | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const content = asTrimmedString(value.content);\n const status = asTrimmedString(value.status);\n if (!content || !isPlanEntryStatus(status)) {\n return undefined;\n }\n const priority = asTrimmedString(value.priority);\n return {\n content,\n status,\n ...(isPlanEntryPriority(priority) ? { priority } : {}),\n };\n}\n\n/**\n * Documented allowlist for text_delta.meta origin fields.\n * Only these keys may be copied from ACP update `_meta`.\n * Unknown keys (including secret-like producer-controlled names) are dropped.\n */\nconst ORIGIN_META_KEYS = [\n \"origin\",\n \"kind\",\n \"source\",\n] as const satisfies readonly (keyof AcpTextDeltaOriginMeta)[];\n\n/**\n * Preserve a fail-closed subset of ACP update origin fields for text_delta\n * consumers. Empty or unusable values are omitted rather than inferred.\n */\nfunction extractTextDeltaOrigin(payload: Record<string, unknown>): {\n messageId?: string;\n meta?: AcpTextDeltaOriginMeta;\n} {\n const messageId = asOptionalString(payload.messageId);\n const meta = sanitizeOriginMeta(payload._meta);\n return {\n ...(messageId ? { messageId } : {}),\n ...(meta ? { meta } : {}),\n };\n}\n\n/**\n * Copy only allowlisted string origin keys from wire `_meta`.\n * Nested objects, arrays, non-strings, and unknown keys are dropped.\n */\nfunction sanitizeOriginMeta(value: unknown): AcpTextDeltaOriginMeta | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const out: AcpTextDeltaOriginMeta = {};\n for (const key of ORIGIN_META_KEYS) {\n const entry = value[key];\n if (typeof entry !== \"string\") {\n continue;\n }\n const trimmed = entry.trim();\n if (!trimmed) {\n continue;\n }\n out[key] = trimmed;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction resolveTextChunk(params: {\n payload: Record<string, unknown>;\n stream: \"output\" | \"thought\";\n tag: AcpSessionUpdateTag;\n}): AcpRuntimeEvent | null {\n const origin = extractTextDeltaOrigin(params.payload);\n const contentRaw = params.payload.content;\n if (isRecord(contentRaw)) {\n const contentType = asTrimmedString(contentRaw.type);\n if (contentType && contentType !== \"text\") {\n return null;\n }\n const text = asString(contentRaw.text);\n if (text && text.length > 0) {\n return {\n type: \"text_delta\",\n text,\n stream: params.stream,\n tag: params.tag,\n ...origin,\n };\n }\n }\n const text = asString(params.payload.text);\n if (!text || text.length === 0) {\n return null;\n }\n return {\n type: \"text_delta\",\n text,\n stream: params.stream,\n tag: params.tag,\n ...origin,\n };\n}\n\nfunction createTextDeltaEvent(params: {\n content: string | null | undefined;\n stream: \"output\" | \"thought\";\n tag?: AcpSessionUpdateTag;\n}): AcpRuntimeEvent | null {\n if (params.content == null || params.content.length === 0) {\n return null;\n }\n return {\n type: \"text_delta\",\n text: params.content,\n stream: params.stream,\n ...(params.tag ? { tag: params.tag } : {}),\n };\n}\n\nfunction readFirstString(\n record: Record<string, unknown>,\n keys: readonly string[],\n): string | undefined {\n for (const key of keys) {\n const value = asOptionalString(record[key]);\n if (value) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction readFirstStringArray(\n record: Record<string, unknown>,\n keys: readonly string[],\n): string[] | undefined {\n for (const key of keys) {\n const value = record[key];\n if (!Array.isArray(value)) {\n continue;\n }\n const entries = value\n .map((entry) => asOptionalString(entry))\n .filter((entry): entry is string => entry !== undefined);\n if (entries.length > 0) {\n return entries;\n }\n }\n return undefined;\n}\n\nfunction summarizeToolInput(rawInput: unknown): string | undefined {\n if (rawInput == null) {\n return undefined;\n }\n if (\n typeof rawInput === \"string\" ||\n typeof rawInput === \"number\" ||\n typeof rawInput === \"boolean\"\n ) {\n return String(rawInput);\n }\n if (!isRecord(rawInput)) {\n return undefined;\n }\n\n const command = readFirstString(rawInput, [\"command\", \"cmd\", \"program\"]);\n const args = readFirstStringArray(rawInput, [\"args\", \"arguments\"]);\n if (command) {\n return [command, ...(args ?? [])].join(\" \");\n }\n\n return readFirstString(rawInput, [\n \"path\",\n \"file\",\n \"filePath\",\n \"filepath\",\n \"target\",\n \"uri\",\n \"url\",\n \"query\",\n \"pattern\",\n \"text\",\n \"search\",\n ]);\n}\n\nfunction truncateToolSummary(value: string): string {\n if (value.length <= TOOL_OUTPUT_SUMMARY_MAX_CHARS) {\n return value;\n }\n return `${value.slice(0, TOOL_OUTPUT_SUMMARY_MAX_CHARS - 1)}…`;\n}\n\nfunction readToolContentText(value: unknown): string | undefined {\n const record = isRecord(value) ? value : undefined;\n if (!record) {\n return undefined;\n }\n if (record.type === \"content\") {\n return readToolContentText(record.content);\n }\n const reader = toolContentTextReader(String(record.type));\n return reader?.(record);\n}\n\ntype ToolContentTextReader = (record: Record<string, unknown>) => string | undefined;\n\nconst TOOL_CONTENT_TEXT_READERS: Record<string, ToolContentTextReader> = {\n text: (record) => asString(record.text),\n audio: (record) => `[audio] ${asOptionalString(record.mimeType) || \"audio\"}`,\n resource_link: (record) =>\n asOptionalString(record.title) || asOptionalString(record.name) || asOptionalString(record.uri),\n resource: (record) => {\n const resource = isRecord(record.resource) ? record.resource : undefined;\n return asString(resource?.text) || asOptionalString(resource?.uri);\n },\n diff: (record) => `diff ${asOptionalString(record.path) || \"file\"}`,\n terminal: (record) => {\n const terminalId = asOptionalString(record.terminalId) || asOptionalString(record.id);\n return terminalId ? `[terminal] ${terminalId}` : \"[terminal]\";\n },\n};\n\nfunction toolContentTextReader(type: string): ToolContentTextReader | undefined {\n return Object.hasOwn(TOOL_CONTENT_TEXT_READERS, type)\n ? TOOL_CONTENT_TEXT_READERS[type]\n : undefined;\n}\n\nfunction summarizeToolContent(content: unknown): string | undefined {\n if (!Array.isArray(content)) {\n return undefined;\n }\n const fragments = content\n .map((entry) => readToolContentText(entry)?.trim())\n .filter((entry): entry is string => Boolean(entry));\n if (fragments.length === 0) {\n return undefined;\n }\n return truncateToolSummary([...new Set(fragments)].join(\"\\n\"));\n}\n\nfunction summarizeToolOutput(rawOutput: unknown): string | undefined {\n if (rawOutput == null) {\n return undefined;\n }\n if (isScalarToolOutput(rawOutput)) {\n return truncateToolSummary(String(rawOutput));\n }\n const record = isRecord(rawOutput) ? rawOutput : undefined;\n if (!record) {\n return undefined;\n }\n return (\n truncateToolSummary(\n readFirstString(record, [\"text\", \"message\", \"error\", \"stdout\", \"stderr\", \"content\"]) ?? \"\",\n ) || undefined\n );\n}\n\nfunction isScalarToolOutput(value: unknown): value is string | number | boolean {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n}\n\nfunction shouldForwardArray(value: unknown): boolean {\n return Array.isArray(value);\n}\n\nfunction readToolKind(value: unknown): ToolKind | undefined {\n const kind = asOptionalString(value);\n return kind && TOOL_KINDS.has(kind) ? (kind as ToolKind) : undefined;\n}\n\nconst TOOL_KINDS = new Set([\n \"read\",\n \"edit\",\n \"delete\",\n \"move\",\n \"search\",\n \"execute\",\n \"fetch\",\n \"think\",\n \"other\",\n]);\n\nfunction createToolCallEvent(params: {\n payload: Record<string, unknown>;\n tag: AcpSessionUpdateTag;\n}): AcpRuntimeEvent {\n const title = asTrimmedString(params.payload.title) || \"tool call\";\n const status = asTrimmedString(params.payload.status);\n const inputSummary = summarizeToolInput(params.payload.rawInput);\n const outputSummary =\n summarizeToolContent(params.payload.content) ?? summarizeToolOutput(params.payload.rawOutput);\n const toolCallId = asOptionalString(params.payload.toolCallId);\n const kind = readToolKind(params.payload.kind);\n const summaryText = status ? `${title} (${status})` : title;\n const detailSummary =\n params.tag === \"tool_call_update\"\n ? (outputSummary ?? inputSummary)\n : (inputSummary ?? outputSummary);\n const event: AcpRuntimeEvent = {\n type: \"tool_call\",\n text: detailSummary ? `${summaryText}: ${detailSummary}` : summaryText,\n tag: params.tag,\n title,\n };\n assignToolCallEventMetadata(event, params.payload, { toolCallId, status, kind });\n return event;\n}\n\nfunction assignToolCallEventMetadata(\n event: AcpRuntimeEvent,\n payload: Record<string, unknown>,\n values: { toolCallId?: string; status?: string; kind?: ToolKind },\n): void {\n if (event.type !== \"tool_call\") {\n return;\n }\n if (values.toolCallId) {\n event.toolCallId = values.toolCallId;\n }\n if (values.status) {\n event.status = values.status;\n }\n if (values.kind) {\n event.kind = values.kind;\n }\n assignForwardedToolPayload(event, payload);\n}\n\nfunction assignForwardedToolPayload(\n event: Extract<AcpRuntimeEvent, { type: \"tool_call\" }>,\n payload: Record<string, unknown>,\n): void {\n if (shouldForwardArray(payload.locations)) {\n event.locations = payload.locations as ToolCallLocation[];\n }\n if (Object.prototype.hasOwnProperty.call(payload, \"rawInput\")) {\n event.rawInput = payload.rawInput;\n }\n if (Object.prototype.hasOwnProperty.call(payload, \"rawOutput\")) {\n event.rawOutput = payload.rawOutput;\n }\n if (shouldForwardArray(payload.content)) {\n event.content = payload.content as ToolCallContent[];\n }\n}\n\nexport function parsePromptEventLine(line: string): AcpRuntimeEvent | null {\n const trimmed = line.trim();\n if (!trimmed) {\n return null;\n }\n const parsed = safeParseJsonObject(trimmed);\n if (!parsed) {\n return {\n type: \"status\",\n text: trimmed,\n };\n }\n\n const structured = resolveStructuredPromptPayload(parsed);\n const type = structured.type;\n const payload = structured.payload;\n const tag = structured.tag;\n const parser = promptEventParser(type);\n return parser ? parser(payload, tag) : null;\n}\n\ntype PromptEventParser = (\n payload: Record<string, unknown>,\n tag: AcpSessionUpdateTag | undefined,\n) => AcpRuntimeEvent | null;\n\nconst PROMPT_EVENT_PARSERS: Record<string, PromptEventParser> = {\n text: (payload, tag) =>\n createTextDeltaEvent({ content: asString(payload.content), stream: \"output\", tag }),\n thought: (payload, tag) =>\n createTextDeltaEvent({ content: asString(payload.content), stream: \"thought\", tag }),\n tool_call: (payload, tag) => createToolCallEvent({ payload, tag: tag ?? \"tool_call\" }),\n tool_call_update: (payload, tag) =>\n createToolCallEvent({ payload, tag: tag ?? \"tool_call_update\" }),\n agent_message_chunk: (payload) =>\n resolveTextChunk({ payload, stream: \"output\", tag: \"agent_message_chunk\" }),\n agent_thought_chunk: (payload) =>\n resolveTextChunk({ payload, stream: \"thought\", tag: \"agent_thought_chunk\" }),\n usage_update: usageUpdateEvent,\n available_commands_update: availableCommandsUpdateEvent,\n current_mode_update: (payload) => statusUpdateEvent(\"current_mode_update\", payload),\n config_option_update: (payload) => statusUpdateEvent(\"config_option_update\", payload),\n session_info_update: (payload) => statusUpdateEvent(\"session_info_update\", payload),\n plan: planUpdateEvent,\n client_operation: clientOperationEvent,\n update: updateStatusEvent,\n done: () => null,\n error: () => null,\n};\n\nfunction promptEventParser(type: string): PromptEventParser | undefined {\n return Object.hasOwn(PROMPT_EVENT_PARSERS, type) ? PROMPT_EVENT_PARSERS[type] : undefined;\n}\n\nfunction usageUpdateEvent(payload: Record<string, unknown>): AcpRuntimeEvent {\n const used = asOptionalFiniteNumber(payload.used);\n const size = asOptionalFiniteNumber(payload.size);\n const meta = isRecord(payload._meta) ? payload._meta : undefined;\n return buildUsageUpdateEvent({\n used,\n size,\n cost: normalizeUsageCost(payload.cost),\n breakdown: normalizeUsageBreakdown(meta?.usage),\n });\n}\n\nfunction buildUsageUpdateEvent(parts: {\n used: number | undefined;\n size: number | undefined;\n cost: AcpRuntimeUsageCost | undefined;\n breakdown: AcpRuntimeUsageBreakdown | undefined;\n}): AcpRuntimeEvent {\n const { used, size, cost, breakdown } = parts;\n const text = used != null && size != null ? `usage updated: ${used}/${size}` : \"usage updated\";\n return {\n type: \"status\",\n text,\n tag: \"usage_update\",\n ...(used != null ? { used } : {}),\n ...(size != null ? { size } : {}),\n ...(cost ? { cost } : {}),\n ...(breakdown ? { breakdown } : {}),\n };\n}\n\nfunction availableCommandsUpdateEvent(payload: Record<string, unknown>): AcpRuntimeEvent | null {\n const raw = Array.isArray(payload.availableCommands) ? payload.availableCommands : [];\n const availableCommands: AcpRuntimeAvailableCommand[] = [];\n for (const entry of raw) {\n if (!isRecord(entry)) {\n continue;\n }\n const name = asTrimmedString(entry.name);\n if (!name) {\n continue;\n }\n const description = asTrimmedString(entry.description);\n availableCommands.push({\n name,\n ...(description ? { description } : {}),\n hasInput: entry.input != null,\n });\n }\n const text =\n availableCommands.length > 0\n ? `available commands updated (${availableCommands.length})`\n : \"available commands updated\";\n return {\n type: \"status\",\n text,\n tag: \"available_commands_update\",\n availableCommands,\n };\n}\n\nfunction normalizeUsageCost(value: unknown): AcpRuntimeUsageCost | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const amount = asOptionalFiniteNumber(value.amount);\n const currency = asTrimmedString(value.currency);\n if (amount == null && !currency) {\n return undefined;\n }\n return {\n ...(amount != null ? { amount } : {}),\n ...(currency ? { currency } : {}),\n };\n}\n\nconst USAGE_BREAKDOWN_FIELDS: ReadonlyArray<readonly [keyof AcpRuntimeUsageBreakdown, string[]]> = [\n [\"inputTokens\", [\"inputTokens\", \"input_tokens\"]],\n [\"outputTokens\", [\"outputTokens\", \"output_tokens\"]],\n [\"cachedReadTokens\", [\"cachedReadTokens\", \"cacheReadInputTokens\", \"cache_read_input_tokens\"]],\n [\n \"cachedWriteTokens\",\n [\"cachedWriteTokens\", \"cacheCreationInputTokens\", \"cache_creation_input_tokens\"],\n ],\n [\"thoughtTokens\", [\"thoughtTokens\", \"thought_tokens\"]],\n [\"totalTokens\", [\"totalTokens\", \"total_tokens\"]],\n];\n\nfunction normalizeUsageBreakdown(value: unknown): AcpRuntimeUsageBreakdown | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const breakdown: AcpRuntimeUsageBreakdown = {};\n for (const [key, aliases] of USAGE_BREAKDOWN_FIELDS) {\n const v = firstFiniteNumber(value, aliases);\n if (v != null) {\n breakdown[key] = v;\n }\n }\n return Object.keys(breakdown).length > 0 ? breakdown : undefined;\n}\n\nfunction firstFiniteNumber(\n record: Record<string, unknown>,\n keys: readonly string[],\n): number | undefined {\n for (const key of keys) {\n const value = asOptionalFiniteNumber(record[key]);\n if (value != null) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction statusUpdateEvent(\n tag: AcpSessionUpdateTag,\n payload: Record<string, unknown>,\n): AcpRuntimeEvent | null {\n const text = resolveStatusTextForTag({ tag, payload });\n if (!text) {\n return null;\n }\n return { type: \"status\", text, tag };\n}\n\nfunction clientOperationEvent(\n payload: Record<string, unknown>,\n tag: AcpSessionUpdateTag | undefined,\n): AcpRuntimeEvent | null {\n const method = asTrimmedString(payload.method) || \"operation\";\n const status = asTrimmedString(payload.status);\n const summary = asTrimmedString(payload.summary);\n const text = [method, status, summary].filter(Boolean).join(\" \");\n return text ? { type: \"status\", text, ...(tag ? { tag } : {}) } : null;\n}\n\nfunction updateStatusEvent(\n payload: Record<string, unknown>,\n tag: AcpSessionUpdateTag | undefined,\n): AcpRuntimeEvent | null {\n const update = asTrimmedString(payload.update);\n return update ? { type: \"status\", text: update, ...(tag ? { tag } : {}) } : null;\n}\n","import { normalizeAgentCommandInput } from \"../../acp/client-process.js\";\nimport { AcpClient } from \"../../acp/client.js\";\nimport { DEFAULT_AGENT_NAME } from \"../../agent-registry.js\";\nimport type { AcpRuntimeOptions } from \"./contract.js\";\n\nexport type RuntimeHealthReport = {\n ok: boolean;\n message: string;\n details?: string[];\n};\n\nexport type ProbeRuntimeDeps = {\n clientFactory?: (options: ConstructorParameters<typeof AcpClient>[0]) => AcpClient;\n};\n\nfunction isPrimitiveDetail(value: unknown): boolean {\n return (\n value == null ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\" ||\n typeof value === \"symbol\"\n );\n}\n\nfunction formatFunctionDetail(value: Function): string {\n return value.name ? `[Function ${value.name}]` : \"[Function]\";\n}\n\nfunction serializeRuntimeDetail(value: unknown): string {\n const seen = new WeakSet<object>();\n const serialized = JSON.stringify(value, (_key: string, nested: unknown): unknown => {\n if (nested instanceof Error) {\n return nested.message || nested.name;\n }\n if (nested && typeof nested === \"object\") {\n if (seen.has(nested)) {\n return \"[Circular]\";\n }\n seen.add(nested);\n }\n return nested;\n });\n return serialized ?? \"undefined\";\n}\n\nexport function formatRuntimeDetail(value: unknown): string {\n if (value instanceof Error) {\n return value.message || value.name;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (isPrimitiveDetail(value)) {\n return String(value);\n }\n if (typeof value === \"function\") {\n return formatFunctionDetail(value);\n }\n\n try {\n return serializeRuntimeDetail(value);\n } catch {\n return \"unserializable object\";\n }\n}\n\nexport function normalizeRuntimeDetails(\n details: readonly unknown[] | undefined,\n): string[] | undefined {\n return details?.map((detail) => formatRuntimeDetail(detail));\n}\n\nexport async function probeRuntime(\n options: AcpRuntimeOptions,\n deps: ProbeRuntimeDeps = {},\n): Promise<RuntimeHealthReport> {\n const agentName = options.probeAgent?.trim() || DEFAULT_AGENT_NAME;\n const agentCommand = normalizeAgentCommandInput(options.agentRegistry.resolve(agentName));\n const client = createProbeClient(options, agentName, agentCommand, deps);\n\n try {\n await client.start();\n return {\n ok: true,\n message: \"embedded ACP runtime ready\",\n details: [\n `agent=${agentName}`,\n `command=${agentCommand.agentCommand}`,\n `cwd=${options.cwd}`,\n ...(client.initializeResult?.protocolVersion\n ? [`protocolVersion=${client.initializeResult.protocolVersion}`]\n : []),\n ],\n };\n } catch (error) {\n return {\n ok: false,\n message: \"embedded ACP runtime probe failed\",\n details: [\n `agent=${agentName}`,\n `command=${agentCommand.agentCommand}`,\n `cwd=${options.cwd}`,\n formatRuntimeDetail(error),\n ],\n };\n } finally {\n await client.close().catch(() => {});\n }\n}\n\nfunction createProbeClient(\n options: AcpRuntimeOptions,\n agentName: string,\n agentCommand: ReturnType<typeof normalizeAgentCommandInput>,\n deps: ProbeRuntimeDeps,\n): AcpClient {\n const clientOptions = {\n ...agentCommand,\n cwd: options.cwd,\n agentProcessEnv: options.agentProcessEnv,\n mcpServers: typeof options.mcpServers === \"function\" ? [] : [...(options.mcpServers ?? [])],\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n permissionPolicy: options.permissionPolicy,\n processLifecycle: options.processLifecycle,\n processLaunchScope: { kind: \"runtime-probe\" as const, agent: agentName },\n verbose: options.verbose,\n };\n return deps.clientFactory?.(clientOptions) ?? new AcpClient(clientOptions);\n}\n","import path from \"node:path\";\nimport type { SessionRecord } from \"../../types.js\";\n\nexport function shouldReuseExistingRecord(\n record: Pick<SessionRecord, \"cwd\" | \"agentCommand\" | \"agentArgv\" | \"acpSessionId\" | \"acpx\">,\n params: {\n cwd: string;\n agentCommand: string;\n agentArgv?: string[];\n resumeSessionId?: string;\n },\n): boolean {\n if (record.acpx?.reset_on_next_ensure === true) {\n return false;\n }\n if (path.resolve(record.cwd) !== path.resolve(params.cwd)) {\n return false;\n }\n if (record.agentCommand !== params.agentCommand) {\n return false;\n }\n if (!sameArgv(record.agentArgv, params.agentArgv)) {\n return false;\n }\n if (params.resumeSessionId && record.acpSessionId !== params.resumeSessionId) {\n return false;\n }\n return true;\n}\n\nfunction sameArgv(left: string[] | undefined, right: string[] | undefined): boolean {\n const leftValues = left ?? [];\n const rightValues = right ?? [];\n return (\n leftValues.length === rightValues.length &&\n leftValues.every((value, index) => value === rightValues[index])\n );\n}\n","import { advertisedModelState } from \"../../session/model-state.js\";\nimport type { SessionAcpxState, SessionRecord, SessionTokenUsage } from \"../../types.js\";\nimport type {\n AcpRuntimeAvailableCommand,\n AcpRuntimeSessionModels,\n AcpRuntimeSessionUsage,\n AcpRuntimeStatus,\n AcpRuntimeUsageBreakdown,\n} from \"../public/contract.js\";\nimport { asOptionalString } from \"../public/shared.js\";\n\nexport function runtimeStatusFromRecord(record: SessionRecord): AcpRuntimeStatus {\n return {\n ...(record.lastRequestId ? { lastRequestId: record.lastRequestId } : {}),\n summary: statusSummary(record),\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n ...buildModelsField(record),\n ...buildUsageField(record),\n ...buildAvailableCommandsField(record),\n details: {\n cwd: record.cwd,\n lastUsedAt: record.lastUsedAt,\n closed: record.closed === true,\n ...(record.acpx?.config_options !== undefined\n ? { configOptions: structuredClone(record.acpx.config_options) }\n : {}),\n },\n };\n}\n\nfunction statusSummary(record: SessionRecord): string {\n const parts = [\n `session=${record.acpxRecordId}`,\n `backendSessionId=${record.acpSessionId}`,\n record.agentSessionId ? `agentSessionId=${record.agentSessionId}` : null,\n record.pid != null ? `pid=${record.pid}` : null,\n record.closed ? \"closed\" : \"open\",\n ].filter(Boolean);\n return parts.join(\" \");\n}\n\nfunction buildModelsField(record: SessionRecord): { models?: AcpRuntimeSessionModels } {\n const { available_models: available = [], current_model_id: currentModelId } = record.acpx ?? {};\n if (available.length === 0 && currentModelId === undefined) {\n return {};\n }\n return {\n models: {\n ...(currentModelId !== undefined ? { currentModelId } : {}),\n availableModelIds: [...available],\n ...buildModelNamesField(record.acpx),\n },\n };\n}\n\nfunction buildModelNamesField(\n state: SessionAcpxState | undefined,\n): Pick<AcpRuntimeSessionModels, \"availableModels\"> {\n const models = advertisedModelState(state);\n return models && (models.configId || state?.available_model_names !== undefined)\n ? { availableModels: models.availableModels }\n : {};\n}\n\nfunction tokenUsageToBreakdown(\n usage: SessionTokenUsage | undefined,\n): AcpRuntimeUsageBreakdown | undefined {\n if (!usage) {\n return undefined;\n }\n const breakdown: AcpRuntimeUsageBreakdown = {};\n assignUsageBreakdownField(breakdown, \"inputTokens\", usage.input_tokens);\n assignUsageBreakdownField(breakdown, \"outputTokens\", usage.output_tokens);\n assignUsageBreakdownField(breakdown, \"cachedReadTokens\", usage.cache_read_input_tokens);\n assignUsageBreakdownField(breakdown, \"cachedWriteTokens\", usage.cache_creation_input_tokens);\n assignUsageBreakdownField(breakdown, \"thoughtTokens\", usage.thought_tokens);\n assignUsageBreakdownField(breakdown, \"totalTokens\", usage.total_tokens);\n return Object.keys(breakdown).length > 0 ? breakdown : undefined;\n}\n\nfunction assignUsageBreakdownField(\n breakdown: AcpRuntimeUsageBreakdown,\n key: keyof AcpRuntimeUsageBreakdown,\n value: number | undefined,\n): void {\n if (value !== undefined) {\n breakdown[key] = value;\n }\n}\n\nfunction buildUsageField(record: SessionRecord): { usage?: AcpRuntimeSessionUsage } {\n const cumulative = tokenUsageToBreakdown(record.cumulative_token_usage);\n const perRequestEntries = Object.entries(record.request_token_usage ?? {})\n .map(([id, value]) => [id, tokenUsageToBreakdown(value)] as const)\n .filter(\n (entry): entry is readonly [string, AcpRuntimeUsageBreakdown] => entry[1] !== undefined,\n );\n const perRequest =\n perRequestEntries.length > 0 ? Object.fromEntries(perRequestEntries) : undefined;\n const cost = record.cumulative_cost;\n const usage: AcpRuntimeSessionUsage = {\n ...(cumulative ? { cumulative } : {}),\n ...(cost ? { cost } : {}),\n ...(perRequest ? { perRequest } : {}),\n };\n return Object.keys(usage).length > 0 ? { usage } : {};\n}\n\nfunction buildAvailableCommandsField(record: SessionRecord): {\n availableCommands?: AcpRuntimeAvailableCommand[];\n} {\n const commands = record.acpx?.available_commands as readonly unknown[] | undefined;\n if (!commands || commands.length === 0) {\n return {};\n }\n const availableCommands = commands\n .map((command) => runtimeAvailableCommand(command))\n .filter((command): command is AcpRuntimeAvailableCommand => command !== undefined);\n return availableCommands.length > 0 ? { availableCommands } : {};\n}\n\nfunction runtimeAvailableCommand(command: unknown): AcpRuntimeAvailableCommand | undefined {\n if (typeof command === \"string\") {\n const name = command.trim();\n return name ? { name } : undefined;\n }\n const record = commandRecord(command);\n if (!record) {\n return undefined;\n }\n const name = asOptionalString(record.name);\n if (!name) {\n return undefined;\n }\n const runtimeCommand: AcpRuntimeAvailableCommand = { name };\n const description = asOptionalString(record.description);\n if (description) {\n runtimeCommand.description = description;\n }\n if (typeof record.has_input === \"boolean\") {\n runtimeCommand.hasInput = record.has_input;\n }\n return runtimeCommand;\n}\n\nfunction commandRecord(\n value: unknown,\n): { name?: unknown; description?: unknown; has_input?: unknown } | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value;\n}\n","import { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport type { SessionNotification, SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { normalizeAgentCommandInput } from \"../../acp/client-process.js\";\nimport { AcpClient } from \"../../acp/client.js\";\nimport { normalizeOutputError } from \"../../acp/error-normalization.js\";\nimport { extractAcpError, isAcpResourceNotFoundError } from \"../../acp/error-shapes.js\";\nimport { withTimeout } from \"../../async-control.js\";\nimport { textPrompt, type PromptInput } from \"../../prompt-content.js\";\nimport {\n applyConfigOptionsToRecord,\n applyConfigOptionSelection,\n applyModelSelection,\n applyInitialModelSelection,\n} from \"../../session/config-options.js\";\nimport {\n cloneSessionAcpxState,\n cloneSessionConversation,\n recordClientOperation,\n recordPromptSubmission,\n recordSessionUpdate,\n trimConversationForRuntime,\n} from \"../../session/conversation-model.js\";\nimport { LiveSessionCheckpoint } from \"../../session/live-checkpoint.js\";\nimport { setDesiredModeId } from \"../../session/mode-preference.js\";\nimport { applyRequestedModelIfAdvertised } from \"../../session/model-application.js\";\nimport { advertisedModelState } from \"../../session/model-state.js\";\nimport type { ClientOperation, SessionRecord, SessionResumePolicy } from \"../../types.js\";\nimport type {\n AcpElicitationHandler,\n AcpPermissionHandler,\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePromptMode,\n AcpRuntimeStatus,\n AcpRuntimeTurnAttachment,\n AcpRuntimeTurn,\n AcpRuntimeTurnResult,\n} from \"../public/contract.js\";\nimport { AcpRuntimeError } from \"../public/errors.js\";\nimport { parsePromptEventLine } from \"../public/events.js\";\nimport { probeRuntime, type RuntimeHealthReport } from \"../public/probe.js\";\nimport { withConnectedSession } from \"./connected-session.js\";\nimport {\n applyConversation,\n applyLifecycleSnapshotToRecord,\n createInitialSessionRecord,\n reconcileAgentSessionId,\n} from \"./lifecycle.js\";\nimport { runPromptTurn } from \"./prompt-turn.js\";\nimport {\n connectAndLoadSession,\n type ConnectAndLoadSessionOptions,\n type ConnectAndLoadSessionResult,\n} from \"./reconnect.js\";\nimport { shouldReuseExistingRecord } from \"./reuse-policy.js\";\nimport {\n persistSessionOptions,\n sessionOptionsFromRecord,\n type SessionAgentOptions,\n} from \"./session-options.js\";\nimport { runtimeStatusFromRecord } from \"./status.js\";\n\nexport type AcpRuntimeManagerDeps = {\n clientFactory?: (options: ConstructorParameters<typeof AcpClient>[0]) => AcpClient;\n};\n\ntype ActiveSessionController = {\n hasActivePrompt: () => boolean;\n requestCancelActivePrompt: () => Promise<boolean>;\n setSessionMode: (modeId: string) => Promise<void>;\n setSessionModel: (modelId: string) => ReturnType<AcpClient[\"setSessionModel\"]>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n ) => ReturnType<AcpClient[\"setSessionConfigOption\"]>;\n setResolvedSessionConfigOption: (\n configId: string,\n value: string,\n ) => Promise<{\n configId: string;\n response: Awaited<ReturnType<AcpClient[\"setSessionConfigOption\"]>>;\n }>;\n};\n\ntype Deferred<T> = {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (error: unknown) => void;\n};\n\ntype SettledAttempt<T> = { ok: true; value: T } | { ok: false; error: unknown };\ntype FailedAttempt = Extract<SettledAttempt<unknown>, { ok: false }>;\n\nfunction createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void;\n let reject!: (error: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nasync function settleAttempt<T>(run: () => T | Promise<T>): Promise<SettledAttempt<T>> {\n try {\n return { ok: true, value: await run() };\n } catch (error) {\n return { ok: false, error };\n }\n}\n\nfunction firstFailedAttempt(\n attempts: readonly SettledAttempt<unknown>[],\n): FailedAttempt | undefined {\n return attempts.find((attempt): attempt is FailedAttempt => !attempt.ok);\n}\n\nclass AsyncEventQueue {\n private readonly items: AcpRuntimeEvent[] = [];\n private readonly waits: Deferred<AcpRuntimeEvent | null>[] = [];\n private closed = false;\n\n push(item: AcpRuntimeEvent): void {\n if (this.closed) {\n return;\n }\n const waiter = this.waits.shift();\n if (waiter) {\n waiter.resolve(item);\n return;\n }\n this.items.push(item);\n }\n\n close(): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n for (const waiter of this.waits.splice(0)) {\n waiter.resolve(null);\n }\n }\n\n clear(): void {\n this.items.length = 0;\n }\n\n async next(): Promise<AcpRuntimeEvent | null> {\n if (this.items.length > 0) {\n return this.items.shift() ?? null;\n }\n if (this.closed) {\n return null;\n }\n const waiter = createDeferred<AcpRuntimeEvent | null>();\n this.waits.push(waiter);\n return await waiter.promise;\n }\n\n async *iterate(): AsyncIterable<AcpRuntimeEvent> {\n while (true) {\n const next = await this.next();\n if (!next) {\n return;\n }\n yield next;\n }\n }\n}\n\nfunction isoNow(): string {\n return new Date().toISOString();\n}\n\nfunction isUnsupportedSessionCloseError(error: unknown): boolean {\n const acp = extractAcpError(error);\n if (!acp) {\n return false;\n }\n if (acp.code === -32601 || acp.code === -32602) {\n return true;\n }\n if (acp.code !== -32603 || !acp.data || typeof acp.data !== \"object\") {\n return false;\n }\n const details = (acp.data as { details?: unknown }).details;\n return typeof details === \"string\" && details.toLowerCase().includes(\"invalid params\");\n}\n\nfunction toPromptInput(\n text: string,\n attachments?: AcpRuntimeTurnAttachment[],\n): PromptInput | string {\n if (!attachments || attachments.length === 0) {\n return text;\n }\n const blocks: PromptInput = [];\n if (text) {\n blocks.push({ type: \"text\", text });\n }\n for (const attachment of attachments) {\n if (attachment.mediaType.startsWith(\"image/\")) {\n blocks.push({\n type: \"image\",\n mimeType: attachment.mediaType,\n data: attachment.data,\n });\n continue;\n }\n if (attachment.mediaType.startsWith(\"audio/\")) {\n blocks.push({\n type: \"audio\",\n mimeType: attachment.mediaType,\n data: attachment.data,\n });\n continue;\n }\n throw new AcpRuntimeError(\n \"ACP_TURN_FAILED\",\n `Unsupported ACP runtime attachment media type: ${attachment.mediaType}`,\n );\n }\n return blocks.length > 0 ? blocks : textPrompt(text);\n}\n\nfunction createRecordId(sessionKey: string, mode: \"persistent\" | \"oneshot\"): string {\n if (mode === \"persistent\") {\n return sessionKey;\n }\n return `${sessionKey}:oneshot:${randomUUID()}`;\n}\n\nfunction resumePolicyForSessionMode(mode: \"persistent\" | \"oneshot\"): SessionResumePolicy {\n return mode === \"persistent\" ? \"same-session-only\" : \"allow-new\";\n}\n\nfunction legacyTerminalEventFromTurnResult(result: AcpRuntimeTurnResult): AcpRuntimeEvent {\n if (result.status === \"failed\") {\n return {\n type: \"error\",\n message: result.error.message,\n ...(result.error.code ? { code: result.error.code } : {}),\n ...(result.error.detailCode ? { detailCode: result.error.detailCode } : {}),\n ...(result.error.retryable === undefined ? {} : { retryable: result.error.retryable }),\n };\n }\n return {\n type: \"done\",\n ...(result.stopReason ? { stopReason: result.stopReason } : {}),\n ...(result._meta === undefined ? {} : { _meta: result._meta }),\n };\n}\n\nfunction advertisedConfigOptionIds(record: SessionRecord): Set<string> | undefined {\n const configOptions = record.acpx?.config_options;\n if (!configOptions) {\n return undefined;\n }\n\n return new Set(\n configOptions\n .map((option) => option.id)\n .filter((id): id is string => typeof id === \"string\" && id.trim().length > 0),\n );\n}\n\nfunction resolveSupportedConfigOptionId(record: SessionRecord, configId: string): string {\n const advertisedIds = advertisedConfigOptionIds(record);\n if (!advertisedIds) {\n return configId;\n }\n\n if (advertisedIds.has(configId)) {\n return configId;\n }\n\n if (configId === \"thinking\" && advertisedIds.has(\"effort\")) {\n return \"effort\";\n }\n\n const supported = [...advertisedIds].toSorted();\n const supportedText = supported.length > 0 ? supported.join(\", \") : \"none\";\n throw new AcpRuntimeError(\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n `ACP session ${record.acpxRecordId} does not advertise config option '${configId}'. Supported config options: ${supportedText}.`,\n );\n}\n\ntype CreatedRuntimeSession = {\n sessionId: string;\n agentSessionId: string | undefined;\n sessionResult:\n | Awaited<ReturnType<AcpClient[\"createSession\"]>>\n | Awaited<ReturnType<AcpClient[\"loadSession\"]>>;\n};\n\ntype RuntimeEnsureInput = {\n sessionKey: string;\n agent: string;\n mode: \"persistent\" | \"oneshot\";\n cwd?: string;\n resumeSessionId?: string;\n sessionOptions?: SessionAgentOptions;\n};\n\ntype ResolvedRuntimeAgent = {\n cwd: string;\n agentCommand: string;\n agentArgv?: string[];\n};\n\ntype ExistingRuntimeSession = {\n record: SessionRecord;\n owner?: RuntimeSessionOwner;\n};\n\ntype RuntimeTurnTaskState = {\n pendingCancel: boolean;\n turnActive: boolean;\n activeController: ActiveSessionController | null;\n};\n\ntype RuntimeSessionTask = {\n completion: Promise<void>;\n cancel?: () => Promise<boolean>;\n};\n\ntype RuntimeTurnTask = {\n input: {\n handle: AcpRuntimeHandle;\n text: string;\n attachments?: AcpRuntimeTurnAttachment[];\n mode: AcpRuntimePromptMode;\n sessionMode: \"persistent\" | \"oneshot\";\n requestId: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n onElicitation?: AcpElicitationHandler;\n onPermissionRequest?: AcpPermissionHandler;\n };\n promptInput: PromptInput | string;\n queue: AsyncEventQueue;\n promptStarted: Deferred<void>;\n sessionReady: Deferred<void>;\n state: RuntimeTurnTaskState;\n settleResult: (next: AcpRuntimeTurnResult) => void;\n abortHandler: () => void;\n};\n\ntype RunningRuntimeTurn = {\n record: SessionRecord;\n conversation: ReturnType<typeof cloneSessionConversation>;\n acpxState: ReturnType<typeof cloneSessionAcpxState>;\n liveCheckpoint: LiveSessionCheckpoint;\n client: AcpClient;\n owner: RuntimeSessionOwner;\n connected: boolean;\n promptMessageId: string | undefined;\n activeSessionId: string;\n};\n\ntype RuntimeSessionProjection = {\n record: SessionRecord;\n conversation: ReturnType<typeof cloneSessionConversation>;\n checkpoint: LiveSessionCheckpoint;\n};\n\ntype RuntimeSessionOwner = {\n client: AcpClient;\n retirement?: Promise<void>;\n sessionKey: string;\n mode: \"persistent\" | \"oneshot\";\n recordId?: string;\n projection?: RuntimeSessionProjection;\n activeTurn?: {\n task: RuntimeTurnTask;\n turn: RunningRuntimeTurn;\n };\n bufferSessionUpdates: boolean;\n pendingSessionUpdates: SessionNotification[];\n};\n\ntype PreparedRuntimeTurnState = {\n record: SessionRecord;\n retainedOwner?: RuntimeSessionOwner;\n conversation: ReturnType<typeof cloneSessionConversation>;\n acpxState: ReturnType<typeof cloneSessionAcpxState>;\n promptMessageId: string | undefined;\n};\n\nasync function createOrLoadRuntimeSession(\n client: AcpClient,\n resumeSessionId: string | undefined,\n cwd: string,\n): Promise<CreatedRuntimeSession> {\n if (resumeSessionId) {\n if (client.supportsResumeSession()) {\n const resumed = await client.resumeSession(resumeSessionId, cwd);\n return {\n sessionId: resumeSessionId,\n agentSessionId: resumed.agentSessionId,\n sessionResult: resumed,\n };\n }\n if (!client.supportsLoadSession()) {\n throw new Error(\n `Agent does not support session/resume or session/load; cannot resume session ${resumeSessionId}`,\n );\n }\n const loaded = await client.loadSession(resumeSessionId, cwd);\n return {\n sessionId: resumeSessionId,\n agentSessionId: loaded.agentSessionId,\n sessionResult: loaded,\n };\n }\n\n const created = await client.createSession(cwd);\n return {\n sessionId: created.sessionId,\n agentSessionId: created.agentSessionId,\n sessionResult: created,\n };\n}\n\nexport class AcpRuntimeManager {\n private readonly activeControllers = new Map<string, ActiveSessionController>();\n private readonly retainedSessionOwners = new Map<string, RuntimeSessionOwner>();\n private readonly retiringSessionOwners = new Set<RuntimeSessionOwner>();\n private readonly pendingOneShotRecordIds = new Map<string, string>();\n private readonly ensureSessionLocks = new Map<string, Promise<void>>();\n private readonly runtimeOperationLocks = new Map<string, Promise<void>>();\n private readonly sessionTasks = new Map<string, Set<RuntimeSessionTask>>();\n private readonly closingActiveRecords = new Set<string>();\n private readonly liveClients = new Set<AcpClient>();\n private readonly pendingTasks = new Set<Promise<unknown>>();\n private shuttingDown = false;\n private shutdownTask?: Promise<void>;\n\n constructor(\n private readonly options: AcpRuntimeOptions,\n private readonly deps: AcpRuntimeManagerDeps = {},\n ) {}\n\n private createClient(options: ConstructorParameters<typeof AcpClient>[0]): AcpClient {\n this.assertOpen();\n const clientOptions: ConstructorParameters<typeof AcpClient>[0] = {\n ...options,\n agentProcessEnv: this.options.agentProcessEnv,\n processLifecycle: {\n ...options.processLifecycle,\n onBeforeSpawn: async (launch) => {\n this.assertOpen();\n await options.processLifecycle?.onBeforeSpawn?.(launch);\n this.assertOpen();\n },\n onSpawned: async (process) => {\n this.assertOpen();\n await options.processLifecycle?.onSpawned?.(process);\n this.assertOpen();\n },\n },\n };\n const client = this.deps.clientFactory?.(clientOptions) ?? new AcpClient(clientOptions);\n this.liveClients.add(client);\n return client;\n }\n\n async probe(): Promise<RuntimeHealthReport> {\n let client: AcpClient | undefined;\n try {\n return await probeRuntime(this.options, {\n clientFactory: (options) => (client = this.createClient(options)),\n });\n } finally {\n if (client) {\n this.liveClients.delete(client);\n }\n }\n }\n\n private assertOpen(): void {\n if (this.shuttingDown) {\n throw new AcpRuntimeError(\"ACP_BACKEND_UNAVAILABLE\", \"ACP runtime is shut down.\");\n }\n }\n\n shutdown(): Promise<void> {\n if (!this.shutdownTask) {\n this.shuttingDown = true;\n this.shutdownTask = this.shutdownOwnedClients();\n }\n return this.shutdownTask;\n }\n\n private async shutdownOwnedClients(): Promise<void> {\n const closed = await Promise.allSettled(\n [...this.liveClients].map(async (client) => {\n void client.requestCancelActivePrompt().catch(() => {});\n await this.closeClient(client);\n }),\n );\n await Promise.allSettled([\n ...this.ensureSessionLocks.values(),\n ...this.runtimeOperationLocks.values(),\n ...this.pendingTasks,\n ]);\n await Promise.all(\n [...this.retainedSessionOwners.values()].map(async (owner) => {\n this.removeRetainedSessionOwner(owner);\n await this.stopSessionOwner(owner);\n }),\n );\n const errors: unknown[] = [];\n for (const result of closed) {\n if (result.status === \"rejected\") {\n errors.push(result.reason);\n }\n }\n if (errors.length) {\n throw new AggregateError(errors, \"ACP runtime shutdown failed.\");\n }\n this.retiringSessionOwners.clear();\n }\n\n private trackTask<T>(task: Promise<T>): Promise<T> {\n this.pendingTasks.add(task);\n const remove = () => {\n this.pendingTasks.delete(task);\n };\n void task.then(remove, remove);\n return task;\n }\n\n private queueSessionTask<T>(\n recordId: string,\n run: () => Promise<T>,\n cancel?: () => Promise<boolean>,\n ): Promise<T> {\n const tasks = this.sessionTasks.get(recordId) ?? new Set<RuntimeSessionTask>();\n this.sessionTasks.set(recordId, tasks);\n const previous = [...tasks].at(-1)?.completion;\n const result = (async () => {\n await previous?.catch(() => {});\n return await run();\n })();\n const task = { completion: result.then(() => {}), cancel };\n void task.completion.catch(() => {});\n tasks.add(task);\n const remove = () => {\n tasks.delete(task);\n if (tasks.size === 0) {\n this.sessionTasks.delete(recordId);\n }\n };\n void result.then(remove, remove);\n return this.trackTask(result);\n }\n\n private async cancelSessionTasks(recordId: string): Promise<RuntimeSessionTask[]> {\n const tasks = [...(this.sessionTasks.get(recordId) ?? [])];\n await Promise.all(tasks.flatMap((task) => (task.cancel ? [task.cancel()] : [])));\n return tasks;\n }\n\n private async closeClient(client: AcpClient): Promise<void> {\n await client.close();\n this.liveClients.delete(client);\n }\n\n private createSessionOwner(input: {\n client: AcpClient;\n sessionKey: string;\n mode: \"persistent\" | \"oneshot\";\n }): RuntimeSessionOwner {\n const owner: RuntimeSessionOwner = {\n ...input,\n bufferSessionUpdates: false,\n pendingSessionUpdates: [],\n };\n input.client.setEventHandlers({\n onSessionUpdate: (notification) => this.routeOwnedSessionUpdate(owner, notification),\n onClientOperation: (operation) => this.routeOwnedClientOperation(owner, operation),\n });\n return owner;\n }\n\n private routeOwnedSessionUpdate(\n owner: RuntimeSessionOwner,\n notification: SessionNotification,\n ): void {\n const active = owner.activeTurn;\n if (active) {\n const { task, turn } = active;\n if (turn.connected) {\n turn.acpxState = recordSessionUpdate(turn.conversation, turn.acpxState, notification);\n turn.liveCheckpoint.request();\n } else {\n // Reconnect setters and their notifications share the record so an older\n // notification cannot overwrite a later acknowledgement after replay.\n turn.record.acpx = recordSessionUpdate(turn.conversation, turn.record.acpx, notification);\n }\n trimConversationForRuntime(turn.conversation);\n this.emitRuntimeTurnEvent(task, {\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: notification,\n });\n return;\n }\n\n if (owner.bufferSessionUpdates) {\n owner.pendingSessionUpdates.push(notification);\n return;\n }\n\n const projection = owner.projection;\n if (!projection) {\n owner.pendingSessionUpdates.push(notification);\n return;\n }\n projection.record.acpx = recordSessionUpdate(\n projection.conversation,\n projection.record.acpx,\n notification,\n );\n trimConversationForRuntime(projection.conversation);\n projection.checkpoint.request();\n }\n\n private routeOwnedClientOperation(owner: RuntimeSessionOwner, operation: ClientOperation): void {\n const active = owner.activeTurn;\n if (!active) {\n return;\n }\n const { task, turn } = active;\n if (turn.connected) {\n turn.acpxState = recordClientOperation(turn.conversation, turn.acpxState, operation);\n turn.liveCheckpoint.request();\n } else {\n turn.record.acpx = recordClientOperation(turn.conversation, turn.record.acpx, operation);\n }\n trimConversationForRuntime(turn.conversation);\n this.emitRuntimeTurnEvent(task, {\n type: \"client_operation\",\n ...operation,\n });\n }\n\n private attachIdleProjection(\n owner: RuntimeSessionOwner,\n record: SessionRecord,\n conversation = cloneSessionConversation(record),\n acpxState = record.acpx,\n ): void {\n record.acpx = acpxState;\n const checkpoint = new LiveSessionCheckpoint({\n save: async () => {\n // Initialization owns publication; notifications before its model\n // selection succeeds must not create an incomplete session record.\n if (!owner.recordId) {\n return;\n }\n record.lastUsedAt = isoNow();\n applyConversation(record, conversation);\n applyLifecycleSnapshotToRecord(record, owner.client.getAgentLifecycleSnapshot());\n await this.refreshClosedState(record);\n await this.options.sessionStore.save(record);\n },\n });\n owner.projection = { record, conversation, checkpoint };\n owner.activeTurn = undefined;\n this.drainPendingSessionUpdates(owner);\n }\n\n private drainPendingSessionUpdates(owner: RuntimeSessionOwner): void {\n for (const notification of owner.pendingSessionUpdates.splice(0)) {\n this.routeOwnedSessionUpdate(owner, notification);\n }\n }\n\n private async flushSessionOwner(owner: RuntimeSessionOwner): Promise<void> {\n await owner.client.waitForSessionUpdatesIdle?.().catch(() => {});\n await owner.projection?.checkpoint.flush();\n }\n\n private removeRetainedSessionOwner(owner: RuntimeSessionOwner): void {\n if (owner.recordId && this.retainedSessionOwners.get(owner.recordId) === owner) {\n this.retainedSessionOwners.delete(owner.recordId);\n }\n if (\n owner.mode === \"oneshot\" &&\n owner.recordId &&\n this.pendingOneShotRecordIds.get(owner.sessionKey) === owner.recordId\n ) {\n this.pendingOneShotRecordIds.delete(owner.sessionKey);\n }\n }\n\n private async readRetainedSessionOwner(\n record: SessionRecord,\n options: { consume: boolean },\n ): Promise<RuntimeSessionOwner | undefined> {\n const owner = this.retainedSessionOwners.get(record.acpxRecordId);\n if (!owner) {\n return undefined;\n }\n await this.flushSessionOwner(owner);\n const projectedRecord = owner.projection?.record;\n if (projectedRecord && projectedRecord !== record) {\n Object.assign(record, structuredClone(projectedRecord));\n }\n if (!owner.client.hasReusableSession(record.acpSessionId)) {\n this.removeRetainedSessionOwner(owner);\n await this.stopSessionOwner(owner);\n return undefined;\n }\n if (options.consume) {\n this.removeRetainedSessionOwner(owner);\n }\n return owner;\n }\n\n private async closeRetainedSessionOwner(recordId: string): Promise<void> {\n const owner = this.retainedSessionOwners.get(recordId);\n if (!owner) {\n return;\n }\n this.removeRetainedSessionOwner(owner);\n await this.stopSessionOwner(owner);\n }\n\n private async stopSessionOwner(owner: RuntimeSessionOwner): Promise<void> {\n await this.flushSessionOwner(owner).catch(() => {});\n await this.closeClient(owner.client).catch(() => {\n this.retiringSessionOwners.add(owner);\n });\n await owner.projection?.checkpoint.flush().catch(() => {});\n try {\n owner.client.clearEventHandlers();\n } catch {}\n }\n\n private async retrySessionCleanup(recordId: string): Promise<void> {\n for (const owner of this.retiringSessionOwners) {\n if (owner.recordId === recordId) {\n owner.retirement ??= this.finalizeSessionConnection({ client: owner.client, owner })\n .then(() => {\n this.retiringSessionOwners.delete(owner);\n })\n .finally(() => {\n owner.retirement = undefined;\n });\n await owner.retirement;\n }\n }\n }\n\n private async refreshClosedState(record: SessionRecord): Promise<boolean> {\n if (!this.closingActiveRecords.has(record.acpxRecordId)) {\n return record.closed === true;\n }\n const latest = await this.options.sessionStore.load(record.acpxRecordId).catch(() => undefined);\n record.closed = true;\n record.closedAt = latest?.closedAt ?? record.closedAt ?? isoNow();\n if (latest?.acpx) {\n record.acpx = {\n ...record.acpx,\n ...latest.acpx,\n };\n }\n return true;\n }\n\n private async retainPersistentSessionOwnerAfterTurn(input: {\n record: SessionRecord;\n owner: RuntimeSessionOwner;\n conversation: ReturnType<typeof cloneSessionConversation>;\n acpxState: ReturnType<typeof cloneSessionAcpxState>;\n }): Promise<boolean> {\n const { record, owner, conversation, acpxState } = input;\n if (!this.canRetainPersistentSessionOwner(owner, record)) {\n owner.activeTurn = undefined;\n return false;\n }\n this.attachIdleProjection(owner, record, conversation, acpxState);\n const previousOwner = this.retainedSessionOwners.get(record.acpxRecordId);\n this.retainedSessionOwners.set(record.acpxRecordId, owner);\n if (previousOwner && previousOwner !== owner) {\n this.removeRetainedSessionOwner(previousOwner);\n await this.stopSessionOwner(previousOwner);\n }\n return true;\n }\n\n private canRetainPersistentSessionOwner(\n owner: RuntimeSessionOwner,\n record: SessionRecord,\n ): boolean {\n return (\n !this.shuttingDown &&\n owner.mode === \"persistent\" &&\n !record.closed &&\n !(owner.client.hasUnresolvedPrompt?.() ?? false) &&\n owner.client.hasReusableSession(record.acpSessionId)\n );\n }\n\n private resolveMcpServers(session: {\n sessionKey: string;\n cwd: string;\n agentCommand: string;\n agentArgv?: string[];\n }) {\n const servers = this.options.mcpServers;\n const { sessionKey, cwd, agentCommand, agentArgv } = session;\n return [\n ...(typeof servers === \"function\"\n ? servers({\n sessionKey,\n cwd,\n agentCommand,\n agentArgv: agentArgv ? [...agentArgv] : undefined,\n })\n : (servers ?? [])),\n ];\n }\n\n private async withRuntimeControlSession<T>(\n record: SessionRecord,\n sessionMode: \"persistent\" | \"oneshot\",\n run: (context: { client: AcpClient; sessionId: string; record: SessionRecord }) => Promise<T>,\n replacingConfigOption?: ConnectAndLoadSessionOptions[\"replacingConfigOption\"],\n ): Promise<{ value: T; record: SessionRecord }> {\n await this.retrySessionCleanup(record.acpxRecordId);\n const owner = await this.readRetainedSessionOwner(record, { consume: false });\n if (owner) {\n const ownedRecord = owner.projection?.record ?? record;\n try {\n const value = await run({\n client: owner.client,\n sessionId: ownedRecord.acpSessionId,\n record: ownedRecord,\n });\n this.refreshOwnedRecordLifecycle(owner, ownedRecord);\n return { value, record: ownedRecord };\n } finally {\n await this.flushSessionOwner(owner);\n }\n }\n\n let controlClient: AcpClient | undefined;\n try {\n const result = await withConnectedSession({\n sessionRecordId: record.acpxRecordId,\n loadRecord: async (sessionRecordId) => await this.requireRecord(sessionRecordId),\n saveRecord: async (connectedRecord) =>\n await this.options.sessionStore.save(connectedRecord),\n createClient: (options) =>\n (controlClient = this.createClient({\n ...options,\n processLifecycle: this.options.processLifecycle,\n processLaunchScope: {\n kind: \"runtime-session\",\n sessionKey: record.name ?? record.acpxRecordId,\n },\n })),\n mcpServers: this.resolveMcpServers({\n ...record,\n sessionKey: record.name ?? record.acpxRecordId,\n }),\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n permissionPolicy: this.options.permissionPolicy,\n onPermissionRequest: this.options.onPermissionRequest,\n elicitationModes: this.options.elicitationModes,\n verbose: this.options.verbose,\n timeoutMs: this.options.timeoutMs,\n resumePolicy: resumePolicyForSessionMode(sessionMode),\n replacingConfigOption,\n run,\n });\n return {\n value: result.value,\n record: result.record,\n };\n } finally {\n if (controlClient) {\n this.liveClients.delete(controlClient);\n }\n }\n }\n\n private refreshOwnedRecordLifecycle(owner: RuntimeSessionOwner, record: SessionRecord): void {\n record.lastUsedAt = isoNow();\n record.closed = false;\n record.closedAt = undefined;\n record.protocolVersion = owner.client.initializeResult?.protocolVersion;\n record.agentCapabilities = owner.client.initializeResult?.agentCapabilities;\n applyLifecycleSnapshotToRecord(record, owner.client.getAgentLifecycleSnapshot());\n }\n\n async ensureSession(input: RuntimeEnsureInput): Promise<SessionRecord> {\n return await this.withEnsureSessionLock(input, async () =>\n this.ensureSessionWithOwnership(input),\n );\n }\n\n private async withEnsureSessionLock<T>(\n input: RuntimeEnsureInput,\n run: () => Promise<T>,\n ): Promise<T> {\n const key = `${input.mode}\\0${input.sessionKey}`;\n return await this.withManagerLock(this.ensureSessionLocks, key, run);\n }\n\n private async withManagerLock<T>(\n locks: Map<string, Promise<void>>,\n key: string,\n run: () => Promise<T>,\n ): Promise<T> {\n this.assertOpen();\n const previous = locks.get(key) ?? Promise.resolve();\n let release!: () => void;\n const gate = new Promise<void>((resolve) => {\n release = resolve;\n });\n const tail = previous.then(() => gate);\n locks.set(key, tail);\n await previous;\n try {\n this.assertOpen();\n return await run();\n } finally {\n release();\n if (locks.get(key) === tail) {\n locks.delete(key);\n }\n }\n }\n\n private async ensureSessionWithOwnership(input: RuntimeEnsureInput): Promise<SessionRecord> {\n const cwd = path.resolve(input.cwd?.trim() || this.options.cwd);\n const { agentCommand, agentArgv } = normalizeAgentCommandInput(\n this.options.agentRegistry.resolve(input.agent),\n );\n const agent = { cwd, agentCommand, agentArgv };\n const existing = await this.loadExistingRuntimeSession(input);\n if (existing && this.canReuseRuntimeSession(input, agent, existing)) {\n return await this.reuseRuntimeSession(existing.record);\n }\n await this.closeConflictingPersistentSession(input, existing?.owner);\n return await this.createOwnedRuntimeSession(input, agent);\n }\n\n private async loadExistingRuntimeSession(\n input: RuntimeEnsureInput,\n ): Promise<ExistingRuntimeSession | undefined> {\n const existingRecordId =\n input.mode === \"persistent\"\n ? input.sessionKey\n : this.pendingOneShotRecordIds.get(input.sessionKey);\n if (!existingRecordId) {\n return undefined;\n }\n await this.retrySessionCleanup(existingRecordId);\n let record = await this.findSession(existingRecordId);\n if (!record) {\n return undefined;\n }\n const owner = this.retainedSessionOwners.get(record.acpxRecordId);\n if (owner) {\n await this.flushSessionOwner(owner);\n record = owner.projection?.record ?? record;\n }\n return { record, owner };\n }\n\n async findSession(sessionKey: string): Promise<SessionRecord | undefined> {\n return await this.options.sessionStore.load(sessionKey);\n }\n\n private canReuseRuntimeSession(\n input: RuntimeEnsureInput,\n agent: ResolvedRuntimeAgent,\n existing: ExistingRuntimeSession,\n ): boolean {\n if (\n !shouldReuseExistingRecord(existing.record, {\n cwd: agent.cwd,\n agentCommand: agent.agentCommand,\n agentArgv: agent.agentArgv,\n resumeSessionId: input.resumeSessionId,\n })\n ) {\n return false;\n }\n if (input.mode === \"persistent\") {\n return true;\n }\n return Boolean(\n existing.owner &&\n isDeepStrictEqual(sessionOptionsFromRecord(existing.record), input.sessionOptions),\n );\n }\n\n private async reuseRuntimeSession(record: SessionRecord): Promise<SessionRecord> {\n // sessionOptions on a reused persistent record are intentionally ignored:\n // system prompts are fixed at newSession time. Pending one-shot records are\n // reused only when their options still match.\n record.closed = false;\n record.closedAt = undefined;\n this.closingActiveRecords.delete(record.acpxRecordId);\n await this.options.sessionStore.save(record);\n return record;\n }\n\n private async closeConflictingPersistentSession(\n input: RuntimeEnsureInput,\n owner: RuntimeSessionOwner | undefined,\n ): Promise<void> {\n if (input.mode === \"persistent\" && owner?.recordId) {\n await this.closeRetainedSessionOwner(owner.recordId);\n }\n }\n\n private async createOwnedRuntimeSession(\n input: RuntimeEnsureInput,\n agent: ResolvedRuntimeAgent,\n ): Promise<SessionRecord> {\n const { cwd, agentCommand, agentArgv } = agent;\n const client = this.createClient({\n agentCommand,\n agentArgv,\n cwd,\n mcpServers: this.resolveMcpServers({ ...agent, sessionKey: input.sessionKey }),\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n permissionPolicy: this.options.permissionPolicy,\n onPermissionRequest: this.options.onPermissionRequest,\n elicitationModes: this.options.elicitationModes,\n processLifecycle: this.options.processLifecycle,\n processLaunchScope: { kind: \"runtime-session\", sessionKey: input.sessionKey },\n verbose: this.options.verbose,\n sessionOptions: input.sessionOptions,\n });\n const owner = this.createSessionOwner({\n client,\n sessionKey: input.sessionKey,\n mode: input.mode,\n });\n let retained = false;\n\n try {\n await client.start();\n this.assertOpen();\n const session = await createOrLoadRuntimeSession(client, input.resumeSessionId, cwd);\n const record = await this.prepareInitialRuntimeRecord({\n input,\n client,\n owner,\n agentCommand,\n agentArgv,\n cwd,\n session,\n });\n await this.retainInitializedSessionOwner(owner, record);\n retained = true;\n return record;\n } finally {\n if (!retained) {\n owner.recordId = undefined;\n client.clearEventHandlers();\n await this.closeClient(client);\n }\n }\n }\n\n private async prepareInitialRuntimeRecord(params: {\n input: {\n sessionKey: string;\n mode: \"persistent\" | \"oneshot\";\n sessionOptions?: SessionAgentOptions;\n };\n client: AcpClient;\n owner: RuntimeSessionOwner;\n agentCommand: string;\n agentArgv?: string[];\n cwd: string;\n session: CreatedRuntimeSession;\n }): Promise<SessionRecord> {\n const { input, client, owner, agentCommand, agentArgv, cwd, session } = params;\n const record = createInitialSessionRecord({\n recordId: createRecordId(input.sessionKey, input.mode),\n name: input.sessionKey,\n sessionId: session.sessionId,\n agentCommand,\n agentArgv,\n cwd,\n agentSessionId: session.agentSessionId,\n });\n this.closingActiveRecords.delete(record.acpxRecordId);\n record.protocolVersion = client.initializeResult?.protocolVersion;\n record.agentCapabilities = client.initializeResult?.agentCapabilities;\n // Fold pre-response notifications first; later controls and their updates\n // then share this record and retain wire order through acknowledgement.\n this.attachIdleProjection(owner, record);\n applyConfigOptionsToRecord(record, session.sessionResult);\n const modelApplication = await applyRequestedModelIfAdvertised({\n client,\n sessionId: session.sessionId,\n requestedModel: input.sessionOptions?.model,\n models: session.sessionResult.models,\n agentCommand,\n timeoutMs: this.options.timeoutMs,\n });\n applyInitialModelSelection(\n record,\n session.sessionResult.models,\n input.sessionOptions?.model,\n modelApplication,\n );\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n persistSessionOptions(record, input.sessionOptions);\n return record;\n }\n\n private async retainInitializedSessionOwner(\n owner: RuntimeSessionOwner,\n record: SessionRecord,\n ): Promise<void> {\n owner.recordId = record.acpxRecordId;\n // The checkpoint loop also persists notifications arriving during the\n // initial async save before this owner becomes available for reuse.\n await owner.projection?.checkpoint.checkpoint();\n this.assertOpen();\n const previousOwner = this.retainedSessionOwners.get(record.acpxRecordId);\n this.retainedSessionOwners.set(record.acpxRecordId, owner);\n if (owner.mode === \"oneshot\") {\n this.pendingOneShotRecordIds.set(owner.sessionKey, record.acpxRecordId);\n }\n if (previousOwner && previousOwner !== owner) {\n this.removeRetainedSessionOwner(previousOwner);\n await this.stopSessionOwner(previousOwner);\n }\n }\n\n startTurn(input: {\n handle: AcpRuntimeHandle;\n text: string;\n attachments?: AcpRuntimeTurnAttachment[];\n mode: AcpRuntimePromptMode;\n sessionMode: \"persistent\" | \"oneshot\";\n requestId: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n onElicitation?: AcpElicitationHandler;\n onPermissionRequest?: AcpPermissionHandler;\n }): AcpRuntimeTurn {\n this.assertOpen();\n let promptInput: PromptInput | string;\n try {\n promptInput = toPromptInput(input.text, input.attachments);\n } catch (error) {\n void this.trackTask(this.closeRetainedOneShotHandle(input.handle).catch(() => {}));\n throw error;\n }\n const queue = new AsyncEventQueue();\n const result = createDeferred<AcpRuntimeTurnResult>();\n const promptStarted = createDeferred<void>();\n void promptStarted.promise.catch(() => {});\n const sessionReady = createDeferred<void>();\n void sessionReady.promise.catch(() => {});\n let resultSettled = false;\n const state: RuntimeTurnTaskState = {\n pendingCancel: false,\n turnActive: true,\n activeController: null,\n };\n let streamClosed = false;\n\n const settleResult = (next: AcpRuntimeTurnResult): void => {\n if (resultSettled) {\n return;\n }\n resultSettled = true;\n result.resolve(next);\n };\n\n const closeStream = (): void => {\n if (streamClosed) {\n return;\n }\n streamClosed = true;\n queue.clear();\n queue.close();\n };\n\n const requestCancel = async (): Promise<boolean> => {\n if (state.activeController) {\n return await state.activeController.requestCancelActivePrompt();\n }\n if (!state.turnActive) {\n return false;\n }\n state.pendingCancel = true;\n return true;\n };\n\n const abortHandler = () => {\n void requestCancel();\n };\n if (input.signal && !input.signal.aborted) {\n input.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n void this.queueSessionTask(\n input.handle.acpxRecordId ?? input.handle.sessionKey,\n async () =>\n this.runRuntimeTurnTask({\n input,\n promptInput,\n queue,\n promptStarted,\n sessionReady,\n state,\n settleResult,\n abortHandler,\n }),\n requestCancel,\n );\n\n return {\n requestId: input.requestId,\n promptStarted: promptStarted.promise,\n events: queue.iterate(),\n result: result.promise,\n cancel: async () => {\n await requestCancel();\n },\n closeStream: async () => {\n closeStream();\n },\n };\n }\n\n private async closeRetainedOneShotHandle(handle: AcpRuntimeHandle): Promise<void> {\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n const owner = this.retainedSessionOwners.get(recordId);\n if (owner?.mode === \"oneshot\") {\n await this.closeRetainedSessionOwner(recordId);\n }\n }\n\n private async runRuntimeTurnTask(task: RuntimeTurnTask): Promise<void> {\n let turn: RunningRuntimeTurn | undefined;\n let terminalResult: AcpRuntimeTurnResult;\n try {\n if (this.cancelRuntimeTurnBeforePrompt(task)) {\n await this.closeRetainedOneShotHandle(task.input.handle);\n terminalResult = {\n status: \"cancelled\",\n stopReason: \"cancelled\",\n };\n } else {\n turn = await this.prepareRuntimeTurn(task);\n const { sessionId } = await this.connectRuntimeTurn(task, turn);\n this.assertOpen();\n await this.resolveRuntimeTurnReady(task, turn);\n if (this.cancelRuntimeTurnBeforePrompt(task)) {\n terminalResult = { status: \"cancelled\", stopReason: \"cancelled\" };\n } else {\n await this.applyPendingRuntimeTurnCancel(task, turn);\n const response = await this.runRuntimePrompt(task, turn, sessionId);\n await this.saveCompletedRuntimeTurn(turn);\n terminalResult = {\n status: response.stopReason === \"cancelled\" ? \"cancelled\" : \"completed\",\n ...(response.stopReason ? { stopReason: response.stopReason } : {}),\n ...(response._meta === undefined ? {} : { _meta: response._meta }),\n };\n }\n }\n } catch (error) {\n terminalResult = this.failRuntimeTurn(task, error);\n }\n const finalization = await settleAttempt(async () => this.finalizeRuntimeTurn(task, turn));\n if (!finalization.ok) {\n task.settleResult(this.failRuntimeTurn(task, finalization.error));\n throw finalization.error;\n }\n task.settleResult(terminalResult);\n }\n\n private async runRuntimePrompt(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n sessionId: string,\n ): ReturnType<typeof runPromptTurn> {\n try {\n return await runPromptTurn({\n client: turn.client,\n sessionId,\n prompt: task.promptInput,\n timeoutMs: task.input.timeoutMs ?? this.options.timeoutMs,\n conversation: turn.conversation,\n promptMessageId: turn.promptMessageId,\n onPromptRequestWritten: () => task.promptStarted.resolve(),\n onElicitation: task.input.onElicitation,\n onPermissionRequest: task.input.onPermissionRequest,\n });\n } finally {\n turn.client.endPromptElicitation?.(sessionId);\n }\n }\n\n private async prepareRuntimeTurn(task: RuntimeTurnTask): Promise<RunningRuntimeTurn> {\n const recordId = task.input.handle.acpxRecordId ?? task.input.handle.sessionKey;\n return await this.withManagerLock(this.runtimeOperationLocks, recordId, async () => {\n await this.retrySessionCleanup(recordId);\n return await this.prepareRuntimeTurnWithOwnership(task);\n });\n }\n\n private async prepareRuntimeTurnWithOwnership(\n task: RuntimeTurnTask,\n ): Promise<RunningRuntimeTurn> {\n const prepared = await this.prepareRuntimeTurnState(task);\n const { record, retainedOwner, conversation, acpxState, promptMessageId } = prepared;\n try {\n const client = retainedOwner?.client ?? this.createTurnClient(record);\n const owner = this.resolveRuntimeTurnOwner(task, record, client, retainedOwner);\n const turn = this.createRunningRuntimeTurn({\n record,\n conversation,\n acpxState,\n client,\n owner,\n connected: retainedOwner !== undefined,\n promptMessageId,\n });\n this.activateRuntimeTurn(task, turn);\n return turn;\n } catch (error) {\n this.restoreBufferedSessionOwner(retainedOwner);\n throw error;\n }\n }\n\n private async prepareRuntimeTurnState(task: RuntimeTurnTask): Promise<PreparedRuntimeTurnState> {\n const acquired = await this.acquireRuntimeTurnState(task);\n const { record, retainedOwner } = acquired;\n const conversation = cloneSessionConversation(record);\n const acpxState = cloneSessionAcpxState(record.acpx);\n try {\n const promptStartedAt = isoNow();\n const promptMessageId = recordPromptSubmission(\n conversation,\n task.promptInput,\n promptStartedAt,\n );\n trimConversationForRuntime(conversation);\n record.lastPromptAt = promptStartedAt;\n record.lastUsedAt = promptStartedAt;\n record.acpx = acpxState;\n applyConversation(record, conversation);\n await this.options.sessionStore.save(record);\n return { record, retainedOwner, conversation, acpxState, promptMessageId };\n } catch (error) {\n this.restoreBufferedSessionOwner(retainedOwner);\n throw error;\n }\n }\n\n private async acquireRuntimeTurnState(task: RuntimeTurnTask): Promise<{\n record: SessionRecord;\n retainedOwner?: RuntimeSessionOwner;\n }> {\n const recordId = task.input.handle.acpxRecordId ?? task.input.handle.sessionKey;\n let record = await this.requireRecord(recordId);\n const retainedOwner = await this.readRetainedSessionOwner(record, { consume: false });\n if (!retainedOwner) {\n return { record };\n }\n const projection = retainedOwner.projection;\n if (projection) {\n record = structuredClone(projection.record);\n }\n retainedOwner.bufferSessionUpdates = true;\n return { record, retainedOwner };\n }\n\n private restoreBufferedSessionOwner(owner: RuntimeSessionOwner | undefined): void {\n if (!owner) {\n return;\n }\n owner.bufferSessionUpdates = false;\n this.drainPendingSessionUpdates(owner);\n }\n\n private resolveRuntimeTurnOwner(\n task: RuntimeTurnTask,\n record: SessionRecord,\n client: AcpClient,\n retainedOwner: RuntimeSessionOwner | undefined,\n ): RuntimeSessionOwner {\n return (\n retainedOwner ??\n this.createSessionOwner({\n client,\n sessionKey: record.name ?? task.input.handle.sessionKey,\n mode: task.input.sessionMode,\n })\n );\n }\n\n private createRunningRuntimeTurn(input: {\n record: SessionRecord;\n conversation: ReturnType<typeof cloneSessionConversation>;\n acpxState: ReturnType<typeof cloneSessionAcpxState>;\n client: AcpClient;\n owner: RuntimeSessionOwner;\n connected: boolean;\n promptMessageId: string | undefined;\n }): RunningRuntimeTurn {\n const { record, conversation, acpxState, client, owner, connected, promptMessageId } = input;\n const turn: RunningRuntimeTurn = {\n record,\n conversation,\n acpxState,\n liveCheckpoint: this.createRuntimeTurnCheckpoint(record, conversation, () => turn.acpxState),\n client,\n owner,\n connected,\n promptMessageId,\n activeSessionId: record.acpSessionId,\n };\n return turn;\n }\n\n private activateRuntimeTurn(task: RuntimeTurnTask, turn: RunningRuntimeTurn): void {\n const { owner, record } = turn;\n this.removeRetainedSessionOwner(owner);\n owner.recordId = record.acpxRecordId;\n task.state.activeController = this.buildRuntimeTurnController(task, turn);\n this.activeControllers.set(record.acpxRecordId, task.state.activeController);\n owner.projection = undefined;\n owner.activeTurn = { task, turn };\n owner.bufferSessionUpdates = false;\n this.drainPendingSessionUpdates(owner);\n }\n\n private createTurnClient(record: SessionRecord): AcpClient {\n return this.createClient({\n agentCommand: record.agentCommand,\n agentArgv: record.agentArgv,\n cwd: record.cwd,\n mcpServers: this.resolveMcpServers({\n ...record,\n sessionKey: record.name ?? record.acpxRecordId,\n }),\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n permissionPolicy: this.options.permissionPolicy,\n onPermissionRequest: this.options.onPermissionRequest,\n elicitationModes: this.options.elicitationModes,\n processLifecycle: this.options.processLifecycle,\n processLaunchScope: {\n kind: \"runtime-session\",\n sessionKey: record.name ?? record.acpxRecordId,\n },\n verbose: this.options.verbose,\n sessionOptions: sessionOptionsFromRecord(record),\n });\n }\n\n private createRuntimeTurnCheckpoint(\n record: SessionRecord,\n conversation: ReturnType<typeof cloneSessionConversation>,\n readAcpxState: () => ReturnType<typeof cloneSessionAcpxState>,\n ): LiveSessionCheckpoint {\n return new LiveSessionCheckpoint({\n save: async () => {\n record.lastUsedAt = isoNow();\n record.acpx = readAcpxState();\n applyConversation(record, conversation);\n await this.refreshClosedState(record);\n await this.options.sessionStore.save(record);\n },\n });\n }\n\n private buildRuntimeTurnController(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): ActiveSessionController {\n return {\n hasActivePrompt: () => turn.client.hasActivePrompt(),\n requestCancelActivePrompt: async () => await this.requestRuntimeTurnCancel(task, turn),\n setSessionMode: async (modeId: string) => {\n await this.waitForRuntimeControlSession(task, turn);\n await turn.client.setSessionMode(turn.activeSessionId, modeId);\n const nextState = cloneSessionAcpxState(turn.acpxState) ?? {};\n nextState.desired_mode_id = modeId;\n turn.acpxState = nextState;\n },\n setSessionModel: async (modelId: string) => {\n await this.waitForRuntimeControlSession(task, turn);\n const models = advertisedModelState(turn.acpxState);\n const response = await turn.client.setSessionModel(turn.activeSessionId, modelId, models);\n turn.acpxState = applyModelSelection(turn.acpxState, modelId, response);\n return response;\n },\n setSessionConfigOption: async (configId: string, value: string) => {\n const result = await task.state.activeController!.setResolvedSessionConfigOption(\n configId,\n value,\n );\n return result.response;\n },\n setResolvedSessionConfigOption: async (configId: string, value: string) =>\n await this.setRuntimeResolvedSessionConfigOption(task, turn, configId, value),\n };\n }\n\n private async waitForRuntimeControlSession(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<void> {\n if (turn.client.hasActivePrompt()) {\n return;\n }\n await task.sessionReady.promise;\n }\n\n private async requestRuntimeTurnCancel(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<boolean> {\n if (turn.client.hasActivePrompt()) {\n return await turn.client.requestCancelActivePrompt();\n }\n if (!task.state.turnActive) {\n return false;\n }\n task.state.pendingCancel = true;\n return true;\n }\n\n private async setRuntimeResolvedSessionConfigOption(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n configId: string,\n value: string,\n ): Promise<{\n configId: string;\n response: Awaited<ReturnType<AcpClient[\"setSessionConfigOption\"]>>;\n }> {\n await this.waitForRuntimeControlSession(task, turn);\n const resolvedConfigId = resolveSupportedConfigOptionId(\n {\n ...turn.record,\n acpx: turn.acpxState ?? undefined,\n },\n configId,\n );\n // Notifications can remove the model control before the setter resolves.\n const modelConfigId = advertisedModelState(turn.acpxState)?.configId;\n const response = await turn.client.setSessionConfigOption(\n turn.activeSessionId,\n resolvedConfigId,\n value,\n );\n turn.acpxState = applyConfigOptionSelection(\n turn.acpxState,\n resolvedConfigId,\n value,\n response,\n modelConfigId,\n );\n return { configId: resolvedConfigId, response };\n }\n\n private emitRuntimeTurnEvent(task: RuntimeTurnTask, payload: Record<string, unknown>): void {\n const parsed = parsePromptEventLine(JSON.stringify(payload));\n if (!parsed) {\n return;\n }\n task.queue.push(parsed);\n }\n\n private async connectRuntimeTurn(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<ConnectAndLoadSessionResult> {\n if (turn.connected) {\n return { sessionId: turn.record.acpSessionId, resumed: false, loadError: undefined };\n }\n const loaded = await this.connectRuntimeTurnClient(task, turn);\n turn.acpxState = cloneSessionAcpxState(turn.record.acpx);\n turn.connected = true;\n return loaded;\n }\n\n private async connectRuntimeTurnClient(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<ConnectAndLoadSessionResult> {\n return await connectAndLoadSession({\n client: turn.client,\n record: turn.record,\n resumePolicy: resumePolicyForSessionMode(task.input.sessionMode),\n timeoutMs: this.options.timeoutMs,\n activeController: task.state.activeController!,\n onClientAvailable: () => this.publishRuntimeTurnController(task, turn),\n onConnectedRecord: (connectedRecord) => {\n connectedRecord.lastPromptAt = isoNow();\n },\n onSessionIdResolved: (sessionIdValue) => {\n turn.activeSessionId = sessionIdValue;\n },\n });\n }\n\n private publishRuntimeTurnController(task: RuntimeTurnTask, turn: RunningRuntimeTurn): void {\n const controller = task.state.activeController;\n if (controller) {\n this.activeControllers.set(turn.record.acpxRecordId, controller);\n }\n }\n\n private async resolveRuntimeTurnReady(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<void> {\n task.sessionReady.resolve();\n turn.record.lastRequestId = task.input.requestId;\n turn.record.lastPromptAt = isoNow();\n turn.record.closed = false;\n turn.record.closedAt = undefined;\n turn.record.lastUsedAt = isoNow();\n await turn.liveCheckpoint.checkpoint();\n }\n\n private cancelRuntimeTurnBeforePrompt(task: RuntimeTurnTask): boolean {\n if (!task.state.pendingCancel && !task.input.signal?.aborted) {\n return false;\n }\n task.state.pendingCancel = false;\n task.promptStarted.reject(new Error(\"ACP turn cancelled before prompt submission.\"));\n return true;\n }\n\n private async applyPendingRuntimeTurnCancel(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<boolean> {\n if (!task.state.pendingCancel || !turn.client.hasActivePrompt()) {\n return false;\n }\n const cancelled = await turn.client.requestCancelActivePrompt();\n if (cancelled) {\n task.state.pendingCancel = false;\n }\n return cancelled;\n }\n\n private async saveCompletedRuntimeTurn(turn: RunningRuntimeTurn): Promise<void> {\n turn.record.acpSessionId = turn.activeSessionId;\n reconcileAgentSessionId(turn.record, turn.record.agentSessionId);\n turn.record.protocolVersion = turn.client.initializeResult?.protocolVersion;\n turn.record.agentCapabilities = turn.client.initializeResult?.agentCapabilities;\n turn.record.acpx = turn.acpxState;\n applyConversation(turn.record, turn.conversation);\n applyLifecycleSnapshotToRecord(turn.record, turn.client.getAgentLifecycleSnapshot());\n await this.options.sessionStore.save(turn.record);\n }\n\n private failRuntimeTurn(task: RuntimeTurnTask, error: unknown): AcpRuntimeTurnResult {\n task.promptStarted.reject(error);\n task.sessionReady.reject(error);\n const normalized = normalizeOutputError(error, { origin: \"runtime\" });\n return {\n status: \"failed\",\n error: {\n message: normalized.message,\n ...(normalized.code ? { code: normalized.code } : {}),\n ...(normalized.detailCode ? { detailCode: normalized.detailCode } : {}),\n ...(normalized.retryable !== undefined ? { retryable: normalized.retryable } : {}),\n },\n };\n }\n\n private async finalizeRuntimeTurn(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn | undefined,\n ): Promise<void> {\n task.state.turnActive = false;\n const abortHandlerAttempt = await settleAttempt(() =>\n task.input.signal?.removeEventListener(\"abort\", task.abortHandler),\n );\n const recordAttempt = await settleAttempt(async () =>\n turn ? await this.finalizeRuntimeTurnRecord(turn) : false,\n );\n let failure = firstFailedAttempt([abortHandlerAttempt, recordAttempt]);\n let pooled = recordAttempt.ok ? recordAttempt.value : false;\n if (failure) {\n this.discardRetainedRuntimeTurnOwner(turn);\n pooled = false;\n }\n const closeAttempt = await settleAttempt(async () => this.closeRuntimeTurnClient(turn, pooled));\n this.cleanupRuntimeTurn(task, turn);\n failure ??= firstFailedAttempt([closeAttempt]);\n if (failure) {\n throw failure.error;\n }\n }\n\n private discardRetainedRuntimeTurnOwner(turn: RunningRuntimeTurn | undefined): void {\n if (turn) {\n this.removeRetainedSessionOwner(turn.owner);\n turn.owner.activeTurn = undefined;\n }\n }\n\n private async closeRuntimeTurnClient(\n turn: RunningRuntimeTurn | undefined,\n pooled: boolean,\n ): Promise<void> {\n if (!turn || pooled) {\n return;\n }\n turn.owner.activeTurn = undefined;\n const clearAttempt = await settleAttempt(() => turn.client.clearEventHandlers());\n const closeAttempt = await settleAttempt(async () => this.closeClient(turn.client));\n const failure = firstFailedAttempt([clearAttempt, closeAttempt]);\n if (failure) {\n this.retiringSessionOwners.add(turn.owner);\n throw failure.error;\n }\n }\n\n private cleanupRuntimeTurn(task: RuntimeTurnTask, turn: RunningRuntimeTurn | undefined): void {\n if (turn) {\n this.activeControllers.delete(turn.record.acpxRecordId);\n this.closingActiveRecords.delete(turn.record.acpxRecordId);\n }\n task.queue.close();\n }\n\n private async finalizeRuntimeTurnRecord(turn: RunningRuntimeTurn): Promise<boolean> {\n if (!turn.connected) {\n turn.acpxState = cloneSessionAcpxState(turn.record.acpx);\n }\n applyLifecycleSnapshotToRecord(turn.record, turn.client.getAgentLifecycleSnapshot());\n turn.record.acpx = turn.acpxState;\n applyConversation(turn.record, turn.conversation);\n turn.record.lastUsedAt = isoNow();\n await turn.liveCheckpoint.flush();\n const closed = await this.refreshClosedState(turn.record);\n await this.options.sessionStore.save(turn.record);\n // A loaded transport is not reusable until preference reconciliation succeeds.\n if (closed || !turn.connected) {\n return false;\n }\n return await this.retainPersistentSessionOwnerAfterTurn({\n record: turn.record,\n owner: turn.owner,\n conversation: turn.conversation,\n acpxState: turn.acpxState,\n });\n }\n\n async *runTurn(input: {\n handle: AcpRuntimeHandle;\n text: string;\n attachments?: AcpRuntimeTurnAttachment[];\n mode: AcpRuntimePromptMode;\n sessionMode: \"persistent\" | \"oneshot\";\n requestId: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n onElicitation?: AcpElicitationHandler;\n onPermissionRequest?: AcpPermissionHandler;\n }): AsyncIterable<AcpRuntimeEvent> {\n const turn = this.startTurn(input);\n yield* turn.events;\n yield legacyTerminalEventFromTurnResult(await turn.result);\n }\n\n getStatus(handle: AcpRuntimeHandle): Promise<AcpRuntimeStatus> {\n this.assertOpen();\n return this.trackTask(this.readStatus(handle));\n }\n\n private async readStatus(handle: AcpRuntimeHandle): Promise<AcpRuntimeStatus> {\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n const owner = this.retainedSessionOwners.get(recordId);\n if (owner) {\n await this.flushSessionOwner(owner);\n }\n const record = await this.requireRecord(recordId);\n return runtimeStatusFromRecord(record);\n }\n\n async setMode(\n handle: AcpRuntimeHandle,\n mode: string,\n sessionMode: \"persistent\" | \"oneshot\" = \"persistent\",\n ): Promise<void> {\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n await this.withManagerLock(this.runtimeOperationLocks, recordId, async () =>\n this.setModeWithOwnership(handle, mode, sessionMode),\n );\n }\n\n private async setModeWithOwnership(\n handle: AcpRuntimeHandle,\n mode: string,\n sessionMode: \"persistent\" | \"oneshot\",\n ): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n const controller = this.activeControllers.get(record.acpxRecordId);\n let targetRecord = record;\n if (controller) {\n await controller.setSessionMode(mode);\n } else {\n const result = await this.withRuntimeControlSession(\n record,\n sessionMode,\n async ({ client, sessionId }) => {\n await client.setSessionMode(sessionId, mode);\n },\n );\n targetRecord = result.record;\n }\n setDesiredModeId(targetRecord, mode);\n await this.options.sessionStore.save(targetRecord);\n }\n\n async setModel(\n handle: AcpRuntimeHandle,\n model: string,\n sessionMode: \"persistent\" | \"oneshot\" = \"persistent\",\n ): Promise<void> {\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n await this.withManagerLock(this.runtimeOperationLocks, recordId, async () =>\n this.setModelWithOwnership(handle, model, sessionMode),\n );\n }\n\n private async setModelWithOwnership(\n handle: AcpRuntimeHandle,\n model: string,\n sessionMode: \"persistent\" | \"oneshot\",\n ): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n const controller = this.activeControllers.get(record.acpxRecordId);\n if (controller) {\n const response = await controller.setSessionModel(model);\n record.acpx = applyModelSelection(record.acpx, model, response);\n await this.options.sessionStore.save(record);\n return;\n }\n const result = await this.withRuntimeControlSession(\n record,\n sessionMode,\n async ({ client, sessionId, record: connectedRecord }) => {\n const response = await client.setSessionModel(\n sessionId,\n model,\n advertisedModelState(connectedRecord.acpx),\n );\n connectedRecord.acpx = applyModelSelection(connectedRecord.acpx, model, response);\n },\n { key: \"model\" },\n );\n await this.options.sessionStore.save(result.record);\n }\n\n async setConfigOption(\n handle: AcpRuntimeHandle,\n key: string,\n value: string,\n sessionMode: \"persistent\" | \"oneshot\" = \"persistent\",\n ): Promise<SetSessionConfigOptionResponse> {\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n return await this.withManagerLock(this.runtimeOperationLocks, recordId, async () =>\n this.setConfigOptionWithOwnership(handle, key, value, sessionMode),\n );\n }\n\n private async setConfigOptionWithOwnership(\n handle: AcpRuntimeHandle,\n key: string,\n value: string,\n sessionMode: \"persistent\" | \"oneshot\",\n ): Promise<SetSessionConfigOptionResponse> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n const controller = this.activeControllers.get(record.acpxRecordId);\n if (controller) {\n const { configId, response } = await controller.setResolvedSessionConfigOption(key, value);\n record.acpx = applyConfigOptionSelection(record.acpx, configId, value, response);\n await this.options.sessionStore.save(record);\n return response;\n }\n\n const result = await this.withRuntimeControlSession(\n record,\n sessionMode,\n async ({ client, sessionId, record: connectedRecord }) => {\n const configId = resolveSupportedConfigOptionId(connectedRecord, key);\n const modelConfigId = advertisedModelState(connectedRecord.acpx)?.configId;\n const response = await client.setSessionConfigOption(sessionId, configId, value);\n connectedRecord.acpx = applyConfigOptionSelection(\n connectedRecord.acpx,\n configId,\n value,\n response,\n modelConfigId,\n );\n return response;\n },\n { key, resolve: (connectedRecord) => resolveSupportedConfigOptionId(connectedRecord, key) },\n );\n await this.options.sessionStore.save(result.record);\n return result.value;\n }\n\n async cancel(handle: AcpRuntimeHandle): Promise<void> {\n const controller = this.activeControllers.get(handle.acpxRecordId ?? handle.sessionKey);\n await controller?.requestCancelActivePrompt();\n }\n\n prepareFreshSession(handle: AcpRuntimeHandle): Promise<void> {\n this.assertOpen();\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n const cancelled = this.cancelSessionTasks(recordId);\n void cancelled.catch(() => {});\n return this.queueSessionTask(recordId, async () => {\n const tasks = await cancelled;\n await Promise.all(tasks.map((task) => task.completion));\n return await this.withManagerLock(this.runtimeOperationLocks, recordId, async () =>\n this.closeRuntimeSession(handle, \"prepare-fresh\"),\n );\n });\n }\n\n close(\n handle: AcpRuntimeHandle,\n options: { discardPersistentState?: boolean } = {},\n ): Promise<void> {\n this.assertOpen();\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n return this.trackTask(\n this.withManagerLock(this.runtimeOperationLocks, recordId, async () => {\n return await this.closeRuntimeSession(\n handle,\n options.discardPersistentState === true ? \"discard\" : \"release\",\n );\n }),\n );\n }\n\n private async closeRuntimeSession(\n handle: AcpRuntimeHandle,\n intent: \"release\" | \"prepare-fresh\" | \"discard\",\n ): Promise<void> {\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n await this.retrySessionCleanup(recordId);\n const record = await this.resolveRuntimeRecordForClose(recordId);\n this.markActiveRuntimeRecordClosing(record);\n if (intent !== \"prepare-fresh\") {\n await this.cancelSessionTasks(recordId);\n }\n await this.closeRuntimeRecordOwnership(record, intent);\n record.closed = true;\n record.closedAt = isoNow();\n await this.options.sessionStore.save(record);\n }\n\n private async resolveRuntimeRecordForClose(recordId: string): Promise<SessionRecord> {\n const retainedOwner = this.retainedSessionOwners.get(recordId);\n if (retainedOwner) {\n await this.flushSessionOwner(retainedOwner);\n }\n return retainedOwner?.projection?.record ?? (await this.requireRecord(recordId));\n }\n\n private markActiveRuntimeRecordClosing(record: SessionRecord): void {\n if (this.activeControllers.has(record.acpxRecordId)) {\n this.closingActiveRecords.add(record.acpxRecordId);\n }\n }\n\n private async closeRuntimeRecordOwnership(\n record: SessionRecord,\n intent: \"release\" | \"prepare-fresh\" | \"discard\",\n ): Promise<void> {\n if (intent === \"discard\") {\n await this.closeBackendSession(record);\n } else if (intent === \"prepare-fresh\") {\n const owner = this.retainedSessionOwners.get(record.acpxRecordId);\n if (owner) {\n this.removeRetainedSessionOwner(owner);\n this.retiringSessionOwners.add(owner);\n }\n await this.retrySessionCleanup(record.acpxRecordId);\n } else {\n await this.closeRetainedSessionOwner(record.acpxRecordId);\n }\n if (intent !== \"release\") {\n record.acpx = {\n ...record.acpx,\n reset_on_next_ensure: true,\n };\n }\n }\n\n private async closeBackendSession(record: SessionRecord): Promise<void> {\n const connection = await this.acquireBackendCloseConnection(record);\n\n try {\n await this.requestBackendSessionClose(record, connection);\n } catch (error) {\n this.handleBackendSessionCloseError(record, error);\n } finally {\n await this.finalizeSessionConnection(connection);\n }\n }\n\n private async finalizeSessionConnection(connection: {\n client: AcpClient;\n owner?: RuntimeSessionOwner;\n }): Promise<void> {\n const flushAttempt = await settleAttempt(async () => {\n if (connection.owner) {\n await this.flushSessionOwner(connection.owner);\n }\n });\n const clearAttempt = await settleAttempt(() => connection.owner?.client.clearEventHandlers());\n const closeAttempt = await settleAttempt(async () => this.closeClient(connection.client));\n const failure = firstFailedAttempt([flushAttempt, clearAttempt, closeAttempt]);\n if (failure) {\n throw failure.error;\n }\n }\n\n private async acquireBackendCloseConnection(record: SessionRecord): Promise<{\n client: AcpClient;\n owner?: RuntimeSessionOwner;\n }> {\n const owner = await this.readRetainedSessionOwner(record, { consume: true });\n if (owner) {\n return { client: owner.client, owner };\n }\n return {\n client: this.createTurnClient(record),\n };\n }\n\n private async requestBackendSessionClose(\n record: SessionRecord,\n connection: { client: AcpClient; owner?: RuntimeSessionOwner },\n ): Promise<void> {\n if (!connection.owner) {\n await withTimeout(connection.client.start(), this.options.timeoutMs);\n }\n if (!connection.client.supportsCloseSession()) {\n throw new AcpRuntimeError(\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n `Agent does not support session/close for ${record.acpxRecordId}.`,\n );\n }\n await withTimeout(connection.client.closeSession(record.acpSessionId), this.options.timeoutMs);\n }\n\n private handleBackendSessionCloseError(record: SessionRecord, error: unknown): void {\n if (isAcpResourceNotFoundError(error)) {\n return;\n }\n if (isUnsupportedSessionCloseError(error)) {\n throw new AcpRuntimeError(\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n `Agent does not support session/close for ${record.acpxRecordId}.`,\n { cause: error },\n );\n }\n throw error;\n }\n\n private async requireRecord(sessionId: string): Promise<SessionRecord> {\n const record = await this.options.sessionStore.load(sessionId);\n if (!record) {\n throw new Error(`ACP session not found: ${sessionId}`);\n }\n return record;\n }\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { assertPersistedKeyPolicy } from \"../../persisted-key-policy.js\";\nimport { parseSessionRecord } from \"../../session/persistence/parse.js\";\nimport { serializeSessionRecordForDisk } from \"../../session/persistence/serialize.js\";\nimport { writePrivateJsonFile } from \"../../state-files.js\";\nimport type { AcpFileSessionStoreOptions, AcpSessionRecord, AcpSessionStore } from \"./contract.js\";\n\nfunction safeSessionId(sessionId: string): string {\n return encodeURIComponent(sessionId);\n}\n\nclass FileSessionStore implements AcpSessionStore {\n constructor(private readonly stateDir: string) {}\n\n private get sessionDir(): string {\n return path.join(this.stateDir, \"sessions\");\n }\n\n private filePath(sessionId: string): string {\n return path.join(this.sessionDir, `${safeSessionId(sessionId)}.json`);\n }\n\n private async ensureDir(): Promise<void> {\n await fs.mkdir(this.sessionDir, { recursive: true, mode: 0o700 });\n }\n\n async load(sessionId: string): Promise<AcpSessionRecord | undefined> {\n await this.ensureDir();\n let payload: string;\n try {\n payload = await fs.readFile(this.filePath(sessionId), \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(payload);\n } catch {\n return undefined;\n }\n return parseSessionRecord(parsed) ?? undefined;\n }\n\n async save(record: AcpSessionRecord): Promise<void> {\n const persisted = serializeSessionRecordForDisk(record);\n assertPersistedKeyPolicy(persisted);\n\n await writePrivateJsonFile(this.filePath(record.acpxRecordId), persisted);\n }\n}\n\nexport function createFileSessionStore(options: AcpFileSessionStoreOptions): AcpSessionStore {\n return new FileSessionStore(path.resolve(options.stateDir));\n}\n","import type { AcpRuntimeHandle } from \"./contract.js\";\nimport type { AcpxHandleState } from \"./shared.js\";\nimport { asOptionalString } from \"./shared.js\";\n\nconst ACPX_RUNTIME_HANDLE_PREFIX = \"acpx:v2:\";\n\nexport function encodeAcpxRuntimeHandleState(state: AcpxHandleState): string {\n const payload = Buffer.from(JSON.stringify(state), \"utf8\").toString(\"base64url\");\n return `${ACPX_RUNTIME_HANDLE_PREFIX}${payload}`;\n}\n\nexport function decodeAcpxRuntimeHandleState(runtimeSessionName: string): AcpxHandleState | null {\n const trimmed = runtimeSessionName.trim();\n if (!trimmed.startsWith(ACPX_RUNTIME_HANDLE_PREFIX)) {\n return null;\n }\n try {\n const raw = Buffer.from(trimmed.slice(ACPX_RUNTIME_HANDLE_PREFIX.length), \"base64url\").toString(\n \"utf8\",\n );\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const name = asOptionalString(parsed.name);\n const agent = asOptionalString(parsed.agent);\n const cwd = asOptionalString(parsed.cwd);\n const mode = asOptionalString(parsed.mode);\n if (!name || !agent || !cwd || (mode !== \"persistent\" && mode !== \"oneshot\")) {\n return null;\n }\n return {\n name,\n agent,\n cwd,\n mode,\n acpxRecordId: asOptionalString(parsed.acpxRecordId),\n backendSessionId: asOptionalString(parsed.backendSessionId),\n agentSessionId: asOptionalString(parsed.agentSessionId),\n };\n } catch {\n return null;\n }\n}\n\nexport function writeHandleState(handle: AcpRuntimeHandle, state: AcpxHandleState): void {\n handle.runtimeSessionName = encodeAcpxRuntimeHandleState(state);\n handle.cwd = state.cwd;\n handle.acpxRecordId = state.acpxRecordId;\n handle.backendSessionId = state.backendSessionId;\n handle.agentSessionId = state.agentSessionId;\n}\n","import type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { DEFAULT_AGENT_NAME } from \"./agent-registry.js\";\nimport { AcpRuntimeManager } from \"./runtime/engine/manager.js\";\nimport type {\n AcpRuntime,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimeStatus,\n AcpRuntimeTurnInput,\n AcpSessionStore,\n AcpSessionRecord,\n} from \"./runtime/public/contract.js\";\nimport { AcpRuntimeError } from \"./runtime/public/errors.js\";\nimport { createFileSessionStore } from \"./runtime/public/file-session-store.js\";\nimport { decodeAcpxRuntimeHandleState, writeHandleState } from \"./runtime/public/handle-state.js\";\nimport { normalizeRuntimeDetails } from \"./runtime/public/probe.js\";\nimport { deriveAgentFromSessionKey, type AcpxHandleState } from \"./runtime/public/shared.js\";\n\nexport { DEFAULT_AGENT_NAME, createFileSessionStore };\nexport { createAgentRegistry } from \"./agent-registry.js\";\nexport type {\n AcpAgentInspection,\n AcpAgentInspectionOptions,\n AcpInspectableAgentRegistry,\n} from \"./agent-registry.js\";\nexport { AcpRuntimeError, isAcpRuntimeError } from \"./runtime/public/errors.js\";\nexport type { AcpRuntimeErrorCode } from \"./runtime/public/errors.js\";\nexport {\n REQUESTED_MODEL_UNSUPPORTED_ERROR_CODE,\n REQUESTED_MODEL_UNSUPPORTED_REASONS,\n isRequestedModelUnsupportedError,\n RequestedModelUnsupportedError,\n} from \"./acp/model-support.js\";\nexport type {\n RequestedModelUnsupportedErrorCode,\n RequestedModelUnsupportedReason,\n} from \"./acp/model-support.js\";\nexport {\n decodeAcpxRuntimeHandleState,\n encodeAcpxRuntimeHandleState,\n} from \"./runtime/public/handle-state.js\";\nexport type {\n AcpAgentRegistry,\n AcpElicitationContext,\n AcpElicitationHandler,\n AcpElicitationMode,\n AcpElicitationRequest,\n AcpElicitationResponse,\n AcpFileSessionStoreOptions,\n AcpPermissionDecision,\n AcpPermissionHandler,\n AcpPermissionRequest,\n AcpProcessExit,\n AcpProcessLaunch,\n AcpProcessLaunchScope,\n AcpProcessLifecycle,\n AcpProcessSpawnFailure,\n AcpProcessStarted,\n AcpRuntime,\n AcpRuntimeAvailableCommand,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeEvent,\n AcpTextDeltaOriginMeta,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePlanEntry,\n AcpRuntimePromptMode,\n AcpRuntimeSessionMode,\n AcpRuntimeSessionModels,\n AcpRuntimeSessionUsage,\n AcpRuntimeStatus,\n AcpRuntimeTurn,\n AcpRuntimeTurnAttachment,\n AcpRuntimeTurnInput,\n AcpRuntimeTurnResult,\n AcpRuntimeTurnResultError,\n AcpRuntimeUsageBreakdown,\n AcpRuntimeUsageCost,\n AcpSessionRecord,\n AcpSessionStore,\n AcpSessionUpdateTag,\n PermissionPolicy,\n SessionAgentOptions,\n SystemPromptOption,\n} from \"./runtime/public/contract.js\";\n\nexport const ACPX_BACKEND_ID = \"acpx\";\n\nconst ACPX_CAPABILITIES: AcpRuntimeCapabilities = {\n controls: [\n \"session/set_mode\",\n \"session/set_model\",\n \"session/set_config_option\",\n \"session/status\",\n ],\n};\n\ntype AcpxRuntimeLike = AcpRuntime & {\n probeAvailability(): Promise<void>;\n isHealthy(): boolean;\n doctor(): Promise<AcpRuntimeDoctorReport>;\n};\n\nexport class AcpxRuntime implements AcpxRuntimeLike {\n private healthy = false;\n private shutdownTask?: Promise<void>;\n private readonly probeTasks = new Set<Promise<unknown>>();\n private manager: AcpRuntimeManager | null = null;\n private managerPromise: Promise<AcpRuntimeManager> | null = null;\n\n constructor(\n private readonly options: AcpRuntimeOptions,\n private readonly testOptions?: {\n managerFactory?: (options: AcpRuntimeOptions) => AcpRuntimeManager;\n probeRunner?: (options: AcpRuntimeOptions) => Promise<{\n ok: boolean;\n message: string;\n details?: unknown[];\n }>;\n },\n ) {\n if (options.agentProcessEnv) {\n this.options = { ...options, agentProcessEnv: { ...options.agentProcessEnv } };\n }\n }\n\n isHealthy(): boolean {\n return this.healthy;\n }\n\n async probeAvailability(): Promise<void> {\n const report = await this.runProbe();\n this.healthy = report.ok;\n }\n\n async doctor(): Promise<AcpRuntimeDoctorReport> {\n const report = await this.runProbe();\n this.healthy = report.ok;\n return {\n ok: report.ok,\n code: report.ok ? undefined : \"ACP_BACKEND_UNAVAILABLE\",\n message: report.message,\n details: normalizeRuntimeDetails(report.details),\n };\n }\n\n private resolveSessionIdentity(input: { sessionKey: string; agent: string }) {\n const sessionName = input.sessionKey.trim();\n if (!sessionName) {\n throw new AcpRuntimeError(\"ACP_SESSION_INIT_FAILED\", \"ACP session key is required.\");\n }\n const agent = input.agent.trim();\n if (!agent) {\n throw new AcpRuntimeError(\"ACP_SESSION_INIT_FAILED\", \"ACP agent id is required.\");\n }\n\n return { sessionName, agent };\n }\n\n async findSession(input: {\n sessionKey: string;\n agent: string;\n }): Promise<AcpRuntimeHandle | undefined> {\n const { sessionName, agent } = this.resolveSessionIdentity(input);\n const record = await (await this.getManager()).findSession(sessionName);\n return record\n ? this.createSessionHandle(\n { sessionKey: input.sessionKey, agent, mode: \"persistent\" },\n record,\n )\n : undefined;\n }\n\n async ensureSession(input: AcpRuntimeEnsureInput): Promise<AcpRuntimeHandle> {\n const { sessionName, agent } = this.resolveSessionIdentity(input);\n const manager = await this.getManager();\n const record = await manager.ensureSession({\n sessionKey: sessionName,\n agent,\n mode: input.mode,\n cwd: input.cwd ?? this.options.cwd,\n resumeSessionId: input.resumeSessionId,\n sessionOptions: input.sessionOptions,\n });\n\n return this.createSessionHandle({ ...input, agent }, record);\n }\n\n private createSessionHandle(\n input: Pick<AcpRuntimeEnsureInput, \"sessionKey\" | \"agent\" | \"mode\">,\n record: AcpSessionRecord,\n ): AcpRuntimeHandle {\n const handle: AcpRuntimeHandle = {\n sessionKey: input.sessionKey,\n backend: ACPX_BACKEND_ID,\n runtimeSessionName: \"\",\n cwd: record.cwd,\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n };\n writeHandleState(handle, {\n name: input.sessionKey.trim(),\n agent: input.agent,\n cwd: record.cwd,\n mode: input.mode,\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n });\n return handle;\n }\n\n startTurn(input: AcpRuntimeTurnInput) {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const managerPromise = this.getManager();\n const turnPromise = managerPromise.then((manager) =>\n manager.startTurn({\n handle,\n text: input.text,\n attachments: input.attachments,\n mode: input.mode,\n sessionMode: state.mode,\n requestId: input.requestId,\n timeoutMs: input.timeoutMs,\n signal: input.signal,\n onElicitation: input.onElicitation,\n onPermissionRequest: input.onPermissionRequest,\n }),\n );\n return {\n requestId: input.requestId,\n get promptStarted() {\n return turnPromise.then((turn) => turn.promptStarted);\n },\n events: {\n async *[Symbol.asyncIterator]() {\n const turn = await turnPromise;\n yield* turn.events;\n },\n },\n get result() {\n return turnPromise.then((turn) => turn.result);\n },\n cancel(inputArgs?: { reason?: string }) {\n return turnPromise.then((turn) => turn.cancel(inputArgs));\n },\n closeStream(inputArgs?: { reason?: string }) {\n return turnPromise.then((turn) => turn.closeStream(inputArgs));\n },\n };\n }\n\n async *runTurn(input: AcpRuntimeTurnInput): AsyncIterable<AcpRuntimeEvent> {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n yield* manager.runTurn({\n handle,\n text: input.text,\n attachments: input.attachments,\n mode: input.mode,\n sessionMode: state.mode,\n requestId: input.requestId,\n timeoutMs: input.timeoutMs,\n signal: input.signal,\n onElicitation: input.onElicitation,\n onPermissionRequest: input.onPermissionRequest,\n });\n }\n\n async getCapabilities(input?: { handle?: AcpRuntimeHandle }): Promise<AcpRuntimeCapabilities> {\n if (!input?.handle) {\n return ACPX_CAPABILITIES;\n }\n\n const { handle } = this.resolveManagerHandle(input.handle);\n const record = await this.options.sessionStore.load(handle.acpxRecordId ?? handle.sessionKey);\n if (!record?.acpx?.config_options) {\n return ACPX_CAPABILITIES;\n }\n\n const configOptionKeys = Array.from(\n new Set(\n record.acpx.config_options\n .map((option) => option.id)\n .filter((id): id is string => typeof id === \"string\" && id.trim().length > 0),\n ),\n );\n\n return {\n ...ACPX_CAPABILITIES,\n ...(configOptionKeys.length > 0 ? { configOptionKeys } : {}),\n };\n }\n\n async getStatus(input: {\n handle: AcpRuntimeHandle;\n signal?: AbortSignal;\n }): Promise<AcpRuntimeStatus> {\n const { handle } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n return await manager.getStatus(handle);\n }\n\n async setMode(input: { handle: AcpRuntimeHandle; mode: string }): Promise<void> {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.setMode(handle, input.mode, state.mode);\n }\n\n async setModel(input: { handle: AcpRuntimeHandle; model: string }): Promise<void> {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.setModel(handle, input.model, state.mode);\n }\n\n async setConfigOption(input: {\n handle: AcpRuntimeHandle;\n key: string;\n value: string;\n }): Promise<SetSessionConfigOptionResponse> {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n return await manager.setConfigOption(handle, input.key, input.value, state.mode);\n }\n\n async cancel(input: { handle: AcpRuntimeHandle; reason?: string }): Promise<void> {\n const { handle } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.cancel(handle);\n }\n\n async prepareFreshSession(input: { handle: AcpRuntimeHandle }): Promise<void> {\n const { handle } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.prepareFreshSession(handle);\n }\n\n async close(input: {\n handle: AcpRuntimeHandle;\n reason: string;\n discardPersistentState?: boolean;\n }): Promise<void> {\n const { handle } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.close(handle, {\n discardPersistentState: input.discardPersistentState,\n });\n }\n\n shutdown(): Promise<void> {\n if (!this.shutdownTask) {\n this.healthy = false;\n const managerShutdown = this.managerPromise?.then((manager) => manager.shutdown());\n this.shutdownTask = Promise.allSettled([managerShutdown, ...this.probeTasks]).then(\n ([manager]) => {\n if (manager.status === \"rejected\") {\n throw manager.reason;\n }\n },\n );\n }\n return this.shutdownTask;\n }\n\n private async getManager(): Promise<AcpRuntimeManager> {\n if (this.shutdownTask) {\n throw new AcpRuntimeError(\"ACP_BACKEND_UNAVAILABLE\", \"ACP runtime is shut down.\");\n }\n if (this.manager) {\n return this.manager;\n }\n if (!this.managerPromise) {\n this.managerPromise = Promise.resolve(\n this.testOptions?.managerFactory?.(this.options) ?? new AcpRuntimeManager(this.options),\n ).then((manager) => {\n this.manager = manager;\n return manager;\n });\n }\n return await this.managerPromise;\n }\n\n private async runProbe() {\n if (this.shutdownTask) {\n throw new AcpRuntimeError(\"ACP_BACKEND_UNAVAILABLE\", \"ACP runtime is shut down.\");\n }\n const probe =\n this.testOptions?.probeRunner?.(this.options) ??\n this.getManager().then((manager) => manager.probe());\n this.probeTasks.add(probe);\n try {\n const report = await probe;\n if (this.shutdownTask) {\n throw new AcpRuntimeError(\"ACP_BACKEND_UNAVAILABLE\", \"ACP runtime is shut down.\");\n }\n return report;\n } finally {\n this.probeTasks.delete(probe);\n }\n }\n\n private resolveManagerHandle(handle: AcpRuntimeHandle): {\n handle: AcpRuntimeHandle;\n state: AcpxHandleState;\n } {\n const state = this.resolveHandleState(handle);\n return {\n handle: {\n ...handle,\n acpxRecordId: state.acpxRecordId ?? handle.acpxRecordId ?? handle.sessionKey,\n },\n state,\n };\n }\n\n private resolveHandleState(handle: AcpRuntimeHandle): AcpxHandleState {\n const decoded = decodeAcpxRuntimeHandleState(handle.runtimeSessionName);\n if (decoded) {\n return {\n ...decoded,\n acpxRecordId: decoded.acpxRecordId ?? handle.acpxRecordId,\n backendSessionId: decoded.backendSessionId ?? handle.backendSessionId,\n agentSessionId: decoded.agentSessionId ?? handle.agentSessionId,\n };\n }\n\n const runtimeSessionName = handle.runtimeSessionName.trim();\n if (!runtimeSessionName) {\n throw new AcpRuntimeError(\n \"ACP_SESSION_INIT_FAILED\",\n \"Invalid embedded ACP runtime handle: runtimeSessionName is missing.\",\n );\n }\n\n return {\n name: runtimeSessionName,\n agent: deriveAgentFromSessionKey(handle.sessionKey, DEFAULT_AGENT_NAME),\n cwd: handle.cwd ?? this.options.cwd,\n mode: \"persistent\",\n acpxRecordId: handle.acpxRecordId,\n backendSessionId: handle.backendSessionId,\n agentSessionId: handle.agentSessionId,\n };\n }\n}\n\nexport function createAcpRuntime(options: AcpRuntimeOptions): AcpxRuntime {\n return new AcpxRuntime(options);\n}\n\nexport function createRuntimeStore(options: { stateDir: string }): AcpSessionStore {\n return createFileSessionStore(options);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","names":[],"sources":["../src/runtime/public/errors.ts","../src/runtime/public/shared.ts","../src/runtime/public/events.ts","../src/runtime/public/probe.ts","../src/runtime/engine/reuse-policy.ts","../src/runtime/engine/status.ts","../src/runtime/engine/turn.ts","../src/runtime/engine/manager.ts","../src/runtime/public/file-session-store.ts","../src/runtime/public/handle-state.ts","../src/runtime/shared.ts","../src/runtime.ts"],"sourcesContent":["export const ACP_ERROR_CODES = [\n \"ACP_BACKEND_MISSING\",\n \"ACP_BACKEND_UNAVAILABLE\",\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n \"ACP_DISPATCH_DISABLED\",\n \"ACP_INVALID_RUNTIME_OPTION\",\n \"ACP_SESSION_INIT_FAILED\",\n \"ACP_TURN_FAILED\",\n] as const;\n\nexport type AcpRuntimeErrorCode = (typeof ACP_ERROR_CODES)[number];\n\nexport class AcpRuntimeError extends Error {\n readonly code: AcpRuntimeErrorCode;\n override readonly cause?: unknown;\n\n constructor(code: AcpRuntimeErrorCode, message: string, options?: { cause?: unknown }) {\n super(message);\n this.name = \"AcpRuntimeError\";\n this.code = code;\n this.cause = options?.cause;\n }\n}\n\nexport function isAcpRuntimeError(value: unknown): value is AcpRuntimeError {\n return value instanceof AcpRuntimeError;\n}\n","export type AcpxHandleState = {\n name: string;\n agent: string;\n cwd: string;\n mode: \"persistent\" | \"oneshot\";\n acpxRecordId?: string;\n backendSessionId?: string;\n agentSessionId?: string;\n};\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function asTrimmedString(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nexport function asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function asOptionalString(value: unknown): string | undefined {\n const text = asTrimmedString(value);\n return text || undefined;\n}\n\nexport function asOptionalBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function deriveAgentFromSessionKey(sessionKey: string, fallbackAgent: string): string {\n const match = sessionKey.match(/^agent:([^:]+):/i);\n const candidate = match?.[1] ? asTrimmedString(match[1]) : \"\";\n return candidate || fallbackAgent;\n}\n","import type { ToolCallContent, ToolCallLocation, ToolKind } from \"@agentclientprotocol/sdk\";\nimport type {\n AcpRuntimeAvailableCommand,\n AcpRuntimeEvent,\n AcpRuntimePlanEntry,\n AcpRuntimeUsageBreakdown,\n AcpRuntimeUsageCost,\n AcpSessionUpdateTag,\n AcpTextDeltaOriginMeta,\n} from \"./contract.js\";\nimport { asOptionalString, asString, asTrimmedString, isRecord } from \"./shared.js\";\n\nconst TOOL_OUTPUT_SUMMARY_MAX_CHARS = 500;\n\nfunction safeParseJsonObject(line: string): Record<string, unknown> | null {\n try {\n const parsed = JSON.parse(line) as unknown;\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction asOptionalFiniteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction resolveStructuredPromptPayload(parsed: Record<string, unknown>): {\n type: string;\n payload: Record<string, unknown>;\n tag?: AcpSessionUpdateTag;\n} {\n const method = asTrimmedString(parsed.method);\n if (method === \"session/update\") {\n const params = parsed.params;\n if (isRecord(params) && isRecord(params.update)) {\n const update = params.update;\n const tag = asOptionalString(update.sessionUpdate);\n return {\n type: tag ?? \"\",\n payload: update,\n ...(tag ? { tag } : {}),\n };\n }\n }\n\n const sessionUpdate = asOptionalString(parsed.sessionUpdate);\n if (sessionUpdate) {\n return {\n type: sessionUpdate,\n payload: parsed,\n tag: sessionUpdate,\n };\n }\n\n const type = asTrimmedString(parsed.type);\n const tag = asOptionalString(parsed.tag);\n return {\n type,\n payload: parsed,\n ...(tag ? { tag } : {}),\n };\n}\n\nfunction resolveStatusTextForTag(params: {\n tag: AcpSessionUpdateTag;\n payload: Record<string, unknown>;\n}): string | null {\n const resolver = STATUS_TEXT_RESOLVERS[params.tag];\n return resolver ? resolver(params.payload) : null;\n}\n\ntype StatusTextResolver = (payload: Record<string, unknown>) => string | null;\n\nconst STATUS_TEXT_RESOLVERS: Partial<Record<AcpSessionUpdateTag, StatusTextResolver>> = {\n available_commands_update: availableCommandsStatusText,\n current_mode_update: currentModeStatusText,\n config_option_update: configOptionStatusText,\n session_info_update: sessionInfoStatusText,\n};\n\nfunction availableCommandsStatusText(payload: Record<string, unknown>): string {\n const commands = Array.isArray(payload.availableCommands) ? payload.availableCommands : [];\n return commands.length > 0\n ? `available commands updated (${commands.length})`\n : \"available commands updated\";\n}\n\nfunction currentModeStatusText(payload: Record<string, unknown>): string {\n const mode =\n asTrimmedString(payload.currentModeId) ||\n asTrimmedString(payload.modeId) ||\n asTrimmedString(payload.mode);\n return mode ? `mode updated: ${mode}` : \"mode updated\";\n}\n\nfunction configOptionStatusText(payload: Record<string, unknown>): string {\n const id = asTrimmedString(payload.id) || asTrimmedString(payload.configOptionId);\n const value =\n asTrimmedString(payload.currentValue) ||\n asTrimmedString(payload.value) ||\n asTrimmedString(payload.optionValue);\n if (id && value) {\n return `config updated: ${id}=${value}`;\n }\n return id ? `config updated: ${id}` : \"config updated\";\n}\n\nfunction sessionInfoStatusText(payload: Record<string, unknown>): string {\n return asTrimmedString(payload.summary) || asTrimmedString(payload.message) || \"session updated\";\n}\n\nfunction planStatusText(payload: Record<string, unknown>): string | null {\n const entries = Array.isArray(payload.entries) ? payload.entries : [];\n const first = entries.find((entry) => isRecord(entry));\n const content = asTrimmedString(first?.content);\n return content ? `plan: ${content}` : null;\n}\n\nfunction isPlanEntryStatus(value: string): value is AcpRuntimePlanEntry[\"status\"] {\n return value === \"pending\" || value === \"in_progress\" || value === \"completed\";\n}\n\nfunction isPlanEntryPriority(value: string): value is NonNullable<AcpRuntimePlanEntry[\"priority\"]> {\n return value === \"high\" || value === \"medium\" || value === \"low\";\n}\n\nfunction planUpdateEvent(payload: Record<string, unknown>): AcpRuntimeEvent | null {\n const raw = payload.entries;\n const entries = normalizePlanEntries(raw);\n if (Array.isArray(raw) && raw.length === 0) {\n // An explicit empty snapshot clears the host's previous plan.\n return { type: \"status\", text: \"plan updated\", tag: \"plan\", entries: [] };\n }\n // Preserve legacy summaries, including entries without a valid status.\n const text =\n planStatusText(payload) ?? (entries.length > 0 ? `plan: ${entries[0]?.content}` : null);\n if (!text) {\n return null;\n }\n return {\n type: \"status\",\n text,\n tag: \"plan\",\n ...(entries.length > 0 ? { entries } : {}),\n };\n}\n\nfunction normalizePlanEntries(value: unknown): AcpRuntimePlanEntry[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const entries: AcpRuntimePlanEntry[] = [];\n for (const entry of value) {\n const normalized = normalizePlanEntry(entry);\n if (normalized) {\n entries.push(normalized);\n }\n }\n return entries;\n}\n\nfunction normalizePlanEntry(value: unknown): AcpRuntimePlanEntry | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const content = asTrimmedString(value.content);\n const status = asTrimmedString(value.status);\n if (!content || !isPlanEntryStatus(status)) {\n return undefined;\n }\n const priority = asTrimmedString(value.priority);\n return {\n content,\n status,\n ...(isPlanEntryPriority(priority) ? { priority } : {}),\n };\n}\n\n/**\n * Documented allowlist for text_delta.meta origin fields.\n * Only these keys may be copied from ACP update `_meta`.\n * Unknown keys (including secret-like producer-controlled names) are dropped.\n */\nconst ORIGIN_META_KEYS = [\n \"origin\",\n \"kind\",\n \"source\",\n] as const satisfies readonly (keyof AcpTextDeltaOriginMeta)[];\n\n/**\n * Preserve a fail-closed subset of ACP update origin fields for text_delta\n * consumers. Empty or unusable values are omitted rather than inferred.\n */\nfunction extractTextDeltaOrigin(payload: Record<string, unknown>): {\n messageId?: string;\n meta?: AcpTextDeltaOriginMeta;\n} {\n const messageId = asOptionalString(payload.messageId);\n const meta = sanitizeOriginMeta(payload._meta);\n return {\n ...(messageId ? { messageId } : {}),\n ...(meta ? { meta } : {}),\n };\n}\n\n/**\n * Copy only allowlisted string origin keys from wire `_meta`.\n * Nested objects, arrays, non-strings, and unknown keys are dropped.\n */\nfunction sanitizeOriginMeta(value: unknown): AcpTextDeltaOriginMeta | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const out: AcpTextDeltaOriginMeta = {};\n for (const key of ORIGIN_META_KEYS) {\n const entry = value[key];\n if (typeof entry !== \"string\") {\n continue;\n }\n const trimmed = entry.trim();\n if (!trimmed) {\n continue;\n }\n out[key] = trimmed;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction resolveTextChunk(params: {\n payload: Record<string, unknown>;\n stream: \"output\" | \"thought\";\n tag: AcpSessionUpdateTag;\n}): AcpRuntimeEvent | null {\n const origin = extractTextDeltaOrigin(params.payload);\n const contentRaw = params.payload.content;\n if (isRecord(contentRaw)) {\n const contentType = asTrimmedString(contentRaw.type);\n if (contentType && contentType !== \"text\") {\n return null;\n }\n const text = asString(contentRaw.text);\n if (text && text.length > 0) {\n return {\n type: \"text_delta\",\n text,\n stream: params.stream,\n tag: params.tag,\n ...origin,\n };\n }\n }\n const text = asString(params.payload.text);\n if (!text || text.length === 0) {\n return null;\n }\n return {\n type: \"text_delta\",\n text,\n stream: params.stream,\n tag: params.tag,\n ...origin,\n };\n}\n\nfunction createTextDeltaEvent(params: {\n content: string | null | undefined;\n stream: \"output\" | \"thought\";\n tag?: AcpSessionUpdateTag;\n}): AcpRuntimeEvent | null {\n if (params.content == null || params.content.length === 0) {\n return null;\n }\n return {\n type: \"text_delta\",\n text: params.content,\n stream: params.stream,\n ...(params.tag ? { tag: params.tag } : {}),\n };\n}\n\nfunction readFirstString(\n record: Record<string, unknown>,\n keys: readonly string[],\n): string | undefined {\n for (const key of keys) {\n const value = asOptionalString(record[key]);\n if (value) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction readFirstStringArray(\n record: Record<string, unknown>,\n keys: readonly string[],\n): string[] | undefined {\n for (const key of keys) {\n const value = record[key];\n if (!Array.isArray(value)) {\n continue;\n }\n const entries = value\n .map((entry) => asOptionalString(entry))\n .filter((entry): entry is string => entry !== undefined);\n if (entries.length > 0) {\n return entries;\n }\n }\n return undefined;\n}\n\nfunction summarizeToolInput(rawInput: unknown): string | undefined {\n if (rawInput == null) {\n return undefined;\n }\n if (\n typeof rawInput === \"string\" ||\n typeof rawInput === \"number\" ||\n typeof rawInput === \"boolean\"\n ) {\n return String(rawInput);\n }\n if (!isRecord(rawInput)) {\n return undefined;\n }\n\n const command = readFirstString(rawInput, [\"command\", \"cmd\", \"program\"]);\n const args = readFirstStringArray(rawInput, [\"args\", \"arguments\"]);\n if (command) {\n return [command, ...(args ?? [])].join(\" \");\n }\n\n return readFirstString(rawInput, [\n \"path\",\n \"file\",\n \"filePath\",\n \"filepath\",\n \"target\",\n \"uri\",\n \"url\",\n \"query\",\n \"pattern\",\n \"text\",\n \"search\",\n ]);\n}\n\nfunction truncateToolSummary(value: string): string {\n if (value.length <= TOOL_OUTPUT_SUMMARY_MAX_CHARS) {\n return value;\n }\n return `${value.slice(0, TOOL_OUTPUT_SUMMARY_MAX_CHARS - 1)}…`;\n}\n\nfunction readToolContentText(value: unknown): string | undefined {\n const record = isRecord(value) ? value : undefined;\n if (!record) {\n return undefined;\n }\n if (record.type === \"content\") {\n return readToolContentText(record.content);\n }\n const reader = toolContentTextReader(String(record.type));\n return reader?.(record);\n}\n\ntype ToolContentTextReader = (record: Record<string, unknown>) => string | undefined;\n\nconst TOOL_CONTENT_TEXT_READERS: Record<string, ToolContentTextReader> = {\n text: (record) => asString(record.text),\n audio: (record) => `[audio] ${asOptionalString(record.mimeType) || \"audio\"}`,\n resource_link: (record) =>\n asOptionalString(record.title) || asOptionalString(record.name) || asOptionalString(record.uri),\n resource: (record) => {\n const resource = isRecord(record.resource) ? record.resource : undefined;\n return asString(resource?.text) || asOptionalString(resource?.uri);\n },\n diff: (record) => `diff ${asOptionalString(record.path) || \"file\"}`,\n terminal: (record) => {\n const terminalId = asOptionalString(record.terminalId) || asOptionalString(record.id);\n return terminalId ? `[terminal] ${terminalId}` : \"[terminal]\";\n },\n};\n\nfunction toolContentTextReader(type: string): ToolContentTextReader | undefined {\n return Object.hasOwn(TOOL_CONTENT_TEXT_READERS, type)\n ? TOOL_CONTENT_TEXT_READERS[type]\n : undefined;\n}\n\nfunction summarizeToolContent(content: unknown): string | undefined {\n if (!Array.isArray(content)) {\n return undefined;\n }\n const fragments = content\n .map((entry) => readToolContentText(entry)?.trim())\n .filter((entry): entry is string => Boolean(entry));\n if (fragments.length === 0) {\n return undefined;\n }\n return truncateToolSummary([...new Set(fragments)].join(\"\\n\"));\n}\n\nfunction summarizeToolOutput(rawOutput: unknown): string | undefined {\n if (rawOutput == null) {\n return undefined;\n }\n if (isScalarToolOutput(rawOutput)) {\n return truncateToolSummary(String(rawOutput));\n }\n const record = isRecord(rawOutput) ? rawOutput : undefined;\n if (!record) {\n return undefined;\n }\n return (\n truncateToolSummary(\n readFirstString(record, [\"text\", \"message\", \"error\", \"stdout\", \"stderr\", \"content\"]) ?? \"\",\n ) || undefined\n );\n}\n\nfunction isScalarToolOutput(value: unknown): value is string | number | boolean {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n}\n\nfunction shouldForwardArray(value: unknown): boolean {\n return Array.isArray(value);\n}\n\nfunction readToolKind(value: unknown): ToolKind | undefined {\n const kind = asOptionalString(value);\n return kind && TOOL_KINDS.has(kind) ? (kind as ToolKind) : undefined;\n}\n\nconst TOOL_KINDS = new Set([\n \"read\",\n \"edit\",\n \"delete\",\n \"move\",\n \"search\",\n \"execute\",\n \"fetch\",\n \"think\",\n \"other\",\n]);\n\nfunction createToolCallEvent(params: {\n payload: Record<string, unknown>;\n tag: AcpSessionUpdateTag;\n}): AcpRuntimeEvent {\n const title = asTrimmedString(params.payload.title) || \"tool call\";\n const status = asTrimmedString(params.payload.status);\n const inputSummary = summarizeToolInput(params.payload.rawInput);\n const outputSummary =\n summarizeToolContent(params.payload.content) ?? summarizeToolOutput(params.payload.rawOutput);\n const toolCallId = asOptionalString(params.payload.toolCallId);\n const kind = readToolKind(params.payload.kind);\n const summaryText = status ? `${title} (${status})` : title;\n const detailSummary =\n params.tag === \"tool_call_update\"\n ? (outputSummary ?? inputSummary)\n : (inputSummary ?? outputSummary);\n const event: AcpRuntimeEvent = {\n type: \"tool_call\",\n text: detailSummary ? `${summaryText}: ${detailSummary}` : summaryText,\n tag: params.tag,\n title,\n };\n assignToolCallEventMetadata(event, params.payload, { toolCallId, status, kind });\n return event;\n}\n\nfunction assignToolCallEventMetadata(\n event: AcpRuntimeEvent,\n payload: Record<string, unknown>,\n values: { toolCallId?: string; status?: string; kind?: ToolKind },\n): void {\n if (event.type !== \"tool_call\") {\n return;\n }\n if (values.toolCallId) {\n event.toolCallId = values.toolCallId;\n }\n if (values.status) {\n event.status = values.status;\n }\n if (values.kind) {\n event.kind = values.kind;\n }\n assignForwardedToolPayload(event, payload);\n}\n\nfunction assignForwardedToolPayload(\n event: Extract<AcpRuntimeEvent, { type: \"tool_call\" }>,\n payload: Record<string, unknown>,\n): void {\n if (shouldForwardArray(payload.locations)) {\n event.locations = payload.locations as ToolCallLocation[];\n }\n if (Object.prototype.hasOwnProperty.call(payload, \"rawInput\")) {\n event.rawInput = payload.rawInput;\n }\n if (Object.prototype.hasOwnProperty.call(payload, \"rawOutput\")) {\n event.rawOutput = payload.rawOutput;\n }\n if (shouldForwardArray(payload.content)) {\n event.content = payload.content as ToolCallContent[];\n }\n}\n\nexport function parsePromptEventLine(line: string): AcpRuntimeEvent | null {\n const trimmed = line.trim();\n if (!trimmed) {\n return null;\n }\n const parsed = safeParseJsonObject(trimmed);\n if (!parsed) {\n return {\n type: \"status\",\n text: trimmed,\n };\n }\n\n const structured = resolveStructuredPromptPayload(parsed);\n const type = structured.type;\n const payload = structured.payload;\n const tag = structured.tag;\n const parser = promptEventParser(type);\n return parser ? parser(payload, tag) : null;\n}\n\ntype PromptEventParser = (\n payload: Record<string, unknown>,\n tag: AcpSessionUpdateTag | undefined,\n) => AcpRuntimeEvent | null;\n\nconst PROMPT_EVENT_PARSERS: Record<string, PromptEventParser> = {\n text: (payload, tag) =>\n createTextDeltaEvent({ content: asString(payload.content), stream: \"output\", tag }),\n thought: (payload, tag) =>\n createTextDeltaEvent({ content: asString(payload.content), stream: \"thought\", tag }),\n tool_call: (payload, tag) => createToolCallEvent({ payload, tag: tag ?? \"tool_call\" }),\n tool_call_update: (payload, tag) =>\n createToolCallEvent({ payload, tag: tag ?? \"tool_call_update\" }),\n agent_message_chunk: (payload) =>\n resolveTextChunk({ payload, stream: \"output\", tag: \"agent_message_chunk\" }),\n agent_thought_chunk: (payload) =>\n resolveTextChunk({ payload, stream: \"thought\", tag: \"agent_thought_chunk\" }),\n usage_update: usageUpdateEvent,\n available_commands_update: availableCommandsUpdateEvent,\n current_mode_update: (payload) => statusUpdateEvent(\"current_mode_update\", payload),\n config_option_update: (payload) => statusUpdateEvent(\"config_option_update\", payload),\n session_info_update: (payload) => statusUpdateEvent(\"session_info_update\", payload),\n plan: planUpdateEvent,\n client_operation: clientOperationEvent,\n update: updateStatusEvent,\n done: () => null,\n error: () => null,\n};\n\nfunction promptEventParser(type: string): PromptEventParser | undefined {\n return Object.hasOwn(PROMPT_EVENT_PARSERS, type) ? PROMPT_EVENT_PARSERS[type] : undefined;\n}\n\nfunction usageUpdateEvent(payload: Record<string, unknown>): AcpRuntimeEvent {\n const used = asOptionalFiniteNumber(payload.used);\n const size = asOptionalFiniteNumber(payload.size);\n const meta = isRecord(payload._meta) ? payload._meta : undefined;\n return buildUsageUpdateEvent({\n used,\n size,\n cost: normalizeUsageCost(payload.cost),\n breakdown: normalizeUsageBreakdown(meta?.usage),\n });\n}\n\nfunction buildUsageUpdateEvent(parts: {\n used: number | undefined;\n size: number | undefined;\n cost: AcpRuntimeUsageCost | undefined;\n breakdown: AcpRuntimeUsageBreakdown | undefined;\n}): AcpRuntimeEvent {\n const { used, size, cost, breakdown } = parts;\n const text = used != null && size != null ? `usage updated: ${used}/${size}` : \"usage updated\";\n return {\n type: \"status\",\n text,\n tag: \"usage_update\",\n ...(used != null ? { used } : {}),\n ...(size != null ? { size } : {}),\n ...(cost ? { cost } : {}),\n ...(breakdown ? { breakdown } : {}),\n };\n}\n\nfunction availableCommandsUpdateEvent(payload: Record<string, unknown>): AcpRuntimeEvent | null {\n const raw = Array.isArray(payload.availableCommands) ? payload.availableCommands : [];\n const availableCommands: AcpRuntimeAvailableCommand[] = [];\n for (const entry of raw) {\n if (!isRecord(entry)) {\n continue;\n }\n const name = asTrimmedString(entry.name);\n if (!name) {\n continue;\n }\n const description = asTrimmedString(entry.description);\n availableCommands.push({\n name,\n ...(description ? { description } : {}),\n hasInput: entry.input != null,\n });\n }\n const text =\n availableCommands.length > 0\n ? `available commands updated (${availableCommands.length})`\n : \"available commands updated\";\n return {\n type: \"status\",\n text,\n tag: \"available_commands_update\",\n availableCommands,\n };\n}\n\nfunction normalizeUsageCost(value: unknown): AcpRuntimeUsageCost | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const amount = asOptionalFiniteNumber(value.amount);\n const currency = asTrimmedString(value.currency);\n if (amount == null && !currency) {\n return undefined;\n }\n return {\n ...(amount != null ? { amount } : {}),\n ...(currency ? { currency } : {}),\n };\n}\n\nconst USAGE_BREAKDOWN_FIELDS: ReadonlyArray<readonly [keyof AcpRuntimeUsageBreakdown, string[]]> = [\n [\"inputTokens\", [\"inputTokens\", \"input_tokens\"]],\n [\"outputTokens\", [\"outputTokens\", \"output_tokens\"]],\n [\"cachedReadTokens\", [\"cachedReadTokens\", \"cacheReadInputTokens\", \"cache_read_input_tokens\"]],\n [\n \"cachedWriteTokens\",\n [\"cachedWriteTokens\", \"cacheCreationInputTokens\", \"cache_creation_input_tokens\"],\n ],\n [\"thoughtTokens\", [\"thoughtTokens\", \"thought_tokens\"]],\n [\"totalTokens\", [\"totalTokens\", \"total_tokens\"]],\n];\n\nfunction normalizeUsageBreakdown(value: unknown): AcpRuntimeUsageBreakdown | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const breakdown: AcpRuntimeUsageBreakdown = {};\n for (const [key, aliases] of USAGE_BREAKDOWN_FIELDS) {\n const v = firstFiniteNumber(value, aliases);\n if (v != null) {\n breakdown[key] = v;\n }\n }\n return Object.keys(breakdown).length > 0 ? breakdown : undefined;\n}\n\nfunction firstFiniteNumber(\n record: Record<string, unknown>,\n keys: readonly string[],\n): number | undefined {\n for (const key of keys) {\n const value = asOptionalFiniteNumber(record[key]);\n if (value != null) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction statusUpdateEvent(\n tag: AcpSessionUpdateTag,\n payload: Record<string, unknown>,\n): AcpRuntimeEvent | null {\n const text = resolveStatusTextForTag({ tag, payload });\n if (!text) {\n return null;\n }\n return { type: \"status\", text, tag };\n}\n\nfunction clientOperationEvent(\n payload: Record<string, unknown>,\n tag: AcpSessionUpdateTag | undefined,\n): AcpRuntimeEvent | null {\n const method = asTrimmedString(payload.method) || \"operation\";\n const status = asTrimmedString(payload.status);\n const summary = asTrimmedString(payload.summary);\n const text = [method, status, summary].filter(Boolean).join(\" \");\n return text ? { type: \"status\", text, ...(tag ? { tag } : {}) } : null;\n}\n\nfunction updateStatusEvent(\n payload: Record<string, unknown>,\n tag: AcpSessionUpdateTag | undefined,\n): AcpRuntimeEvent | null {\n const update = asTrimmedString(payload.update);\n return update ? { type: \"status\", text: update, ...(tag ? { tag } : {}) } : null;\n}\n","import { normalizeAgentCommandInput } from \"../../acp/client-process.js\";\nimport { AcpClient } from \"../../acp/client.js\";\nimport { DEFAULT_AGENT_NAME } from \"../../agent-registry.js\";\nimport type { AcpRuntimeOptions } from \"./contract.js\";\n\nexport type RuntimeHealthReport = {\n ok: boolean;\n message: string;\n details?: string[];\n};\n\nexport type ProbeRuntimeDeps = {\n clientFactory?: (options: ConstructorParameters<typeof AcpClient>[0]) => AcpClient;\n};\n\nfunction isPrimitiveDetail(value: unknown): boolean {\n return (\n value == null ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\" ||\n typeof value === \"symbol\"\n );\n}\n\nfunction formatFunctionDetail(value: Function): string {\n return value.name ? `[Function ${value.name}]` : \"[Function]\";\n}\n\nfunction serializeRuntimeDetail(value: unknown): string {\n const seen = new WeakSet<object>();\n const serialized = JSON.stringify(value, (_key: string, nested: unknown): unknown => {\n if (nested instanceof Error) {\n return nested.message || nested.name;\n }\n if (nested && typeof nested === \"object\") {\n if (seen.has(nested)) {\n return \"[Circular]\";\n }\n seen.add(nested);\n }\n return nested;\n });\n return serialized ?? \"undefined\";\n}\n\nexport function formatRuntimeDetail(value: unknown): string {\n if (value instanceof Error) {\n return value.message || value.name;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (isPrimitiveDetail(value)) {\n return String(value);\n }\n if (typeof value === \"function\") {\n return formatFunctionDetail(value);\n }\n\n try {\n return serializeRuntimeDetail(value);\n } catch {\n return \"unserializable object\";\n }\n}\n\nexport function normalizeRuntimeDetails(\n details: readonly unknown[] | undefined,\n): string[] | undefined {\n return details?.map((detail) => formatRuntimeDetail(detail));\n}\n\nexport async function probeRuntime(\n options: AcpRuntimeOptions,\n deps: ProbeRuntimeDeps = {},\n): Promise<RuntimeHealthReport> {\n const agentName = options.probeAgent?.trim() || DEFAULT_AGENT_NAME;\n const agentCommand = normalizeAgentCommandInput(options.agentRegistry.resolve(agentName));\n const client = createProbeClient(options, agentName, agentCommand, deps);\n\n try {\n await client.start();\n return {\n ok: true,\n message: \"embedded ACP runtime ready\",\n details: [\n `agent=${agentName}`,\n `command=${agentCommand.agentCommand}`,\n `cwd=${options.cwd}`,\n ...(client.initializeResult?.protocolVersion\n ? [`protocolVersion=${client.initializeResult.protocolVersion}`]\n : []),\n ],\n };\n } catch (error) {\n return {\n ok: false,\n message: \"embedded ACP runtime probe failed\",\n details: [\n `agent=${agentName}`,\n `command=${agentCommand.agentCommand}`,\n `cwd=${options.cwd}`,\n formatRuntimeDetail(error),\n ],\n };\n } finally {\n await client.close().catch(() => {});\n }\n}\n\nfunction createProbeClient(\n options: AcpRuntimeOptions,\n agentName: string,\n agentCommand: ReturnType<typeof normalizeAgentCommandInput>,\n deps: ProbeRuntimeDeps,\n): AcpClient {\n const clientOptions = {\n ...agentCommand,\n cwd: options.cwd,\n agentProcessEnv: options.agentProcessEnv,\n mcpServers: typeof options.mcpServers === \"function\" ? [] : [...(options.mcpServers ?? [])],\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n permissionPolicy: options.permissionPolicy,\n processLifecycle: options.processLifecycle,\n processLaunchScope: { kind: \"runtime-probe\" as const, agent: agentName },\n verbose: options.verbose,\n };\n return deps.clientFactory?.(clientOptions) ?? new AcpClient(clientOptions);\n}\n","import path from \"node:path\";\nimport type { SessionRecord } from \"../../types.js\";\n\nexport function shouldReuseExistingRecord(\n record: Pick<SessionRecord, \"cwd\" | \"agentCommand\" | \"agentArgv\" | \"acpSessionId\" | \"acpx\">,\n params: {\n cwd: string;\n agentCommand: string;\n agentArgv?: string[];\n resumeSessionId?: string;\n },\n): boolean {\n if (record.acpx?.reset_on_next_ensure === true) {\n return false;\n }\n if (path.resolve(record.cwd) !== path.resolve(params.cwd)) {\n return false;\n }\n if (record.agentCommand !== params.agentCommand) {\n return false;\n }\n if (!sameArgv(record.agentArgv, params.agentArgv)) {\n return false;\n }\n if (params.resumeSessionId && record.acpSessionId !== params.resumeSessionId) {\n return false;\n }\n return true;\n}\n\nfunction sameArgv(left: string[] | undefined, right: string[] | undefined): boolean {\n const leftValues = left ?? [];\n const rightValues = right ?? [];\n return (\n leftValues.length === rightValues.length &&\n leftValues.every((value, index) => value === rightValues[index])\n );\n}\n","import { advertisedModelState } from \"../../session/model-state.js\";\nimport type { SessionAcpxState, SessionRecord, SessionTokenUsage } from \"../../types.js\";\nimport type {\n AcpRuntimeAvailableCommand,\n AcpRuntimeSessionModels,\n AcpRuntimeSessionUsage,\n AcpRuntimeStatus,\n AcpRuntimeUsageBreakdown,\n} from \"../public/contract.js\";\nimport { asOptionalString } from \"../public/shared.js\";\n\nexport function runtimeStatusFromRecord(record: SessionRecord): AcpRuntimeStatus {\n return {\n ...(record.lastRequestId ? { lastRequestId: record.lastRequestId } : {}),\n summary: statusSummary(record),\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n ...buildModelsField(record),\n ...buildUsageField(record),\n ...buildAvailableCommandsField(record),\n details: {\n cwd: record.cwd,\n lastUsedAt: record.lastUsedAt,\n closed: record.closed === true,\n ...(record.acpx?.config_options !== undefined\n ? { configOptions: structuredClone(record.acpx.config_options) }\n : {}),\n },\n };\n}\n\nfunction statusSummary(record: SessionRecord): string {\n const parts = [\n `session=${record.acpxRecordId}`,\n `backendSessionId=${record.acpSessionId}`,\n record.agentSessionId ? `agentSessionId=${record.agentSessionId}` : null,\n record.pid != null ? `pid=${record.pid}` : null,\n record.closed ? \"closed\" : \"open\",\n ].filter(Boolean);\n return parts.join(\" \");\n}\n\nfunction buildModelsField(record: SessionRecord): { models?: AcpRuntimeSessionModels } {\n const { available_models: available = [], current_model_id: currentModelId } = record.acpx ?? {};\n if (available.length === 0 && currentModelId === undefined) {\n return {};\n }\n return {\n models: {\n ...(currentModelId !== undefined ? { currentModelId } : {}),\n availableModelIds: [...available],\n ...buildModelNamesField(record.acpx),\n },\n };\n}\n\nfunction buildModelNamesField(\n state: SessionAcpxState | undefined,\n): Pick<AcpRuntimeSessionModels, \"availableModels\"> {\n const models = advertisedModelState(state);\n return models && (models.configId || state?.available_model_names !== undefined)\n ? { availableModels: models.availableModels }\n : {};\n}\n\nfunction tokenUsageToBreakdown(\n usage: SessionTokenUsage | undefined,\n): AcpRuntimeUsageBreakdown | undefined {\n if (!usage) {\n return undefined;\n }\n const breakdown: AcpRuntimeUsageBreakdown = {};\n assignUsageBreakdownField(breakdown, \"inputTokens\", usage.input_tokens);\n assignUsageBreakdownField(breakdown, \"outputTokens\", usage.output_tokens);\n assignUsageBreakdownField(breakdown, \"cachedReadTokens\", usage.cache_read_input_tokens);\n assignUsageBreakdownField(breakdown, \"cachedWriteTokens\", usage.cache_creation_input_tokens);\n assignUsageBreakdownField(breakdown, \"thoughtTokens\", usage.thought_tokens);\n assignUsageBreakdownField(breakdown, \"totalTokens\", usage.total_tokens);\n return Object.keys(breakdown).length > 0 ? breakdown : undefined;\n}\n\nfunction assignUsageBreakdownField(\n breakdown: AcpRuntimeUsageBreakdown,\n key: keyof AcpRuntimeUsageBreakdown,\n value: number | undefined,\n): void {\n if (value !== undefined) {\n breakdown[key] = value;\n }\n}\n\nfunction buildUsageField(record: SessionRecord): { usage?: AcpRuntimeSessionUsage } {\n const cumulative = tokenUsageToBreakdown(record.cumulative_token_usage);\n const perRequestEntries = Object.entries(record.request_token_usage ?? {})\n .map(([id, value]) => [id, tokenUsageToBreakdown(value)] as const)\n .filter(\n (entry): entry is readonly [string, AcpRuntimeUsageBreakdown] => entry[1] !== undefined,\n );\n const perRequest =\n perRequestEntries.length > 0 ? Object.fromEntries(perRequestEntries) : undefined;\n const cost = record.cumulative_cost;\n const usage: AcpRuntimeSessionUsage = {\n ...(cumulative ? { cumulative } : {}),\n ...(cost ? { cost } : {}),\n ...(perRequest ? { perRequest } : {}),\n };\n return Object.keys(usage).length > 0 ? { usage } : {};\n}\n\nfunction buildAvailableCommandsField(record: SessionRecord): {\n availableCommands?: AcpRuntimeAvailableCommand[];\n} {\n const commands = record.acpx?.available_commands as readonly unknown[] | undefined;\n if (!commands || commands.length === 0) {\n return {};\n }\n const availableCommands = commands\n .map((command) => runtimeAvailableCommand(command))\n .filter((command): command is AcpRuntimeAvailableCommand => command !== undefined);\n return availableCommands.length > 0 ? { availableCommands } : {};\n}\n\nfunction runtimeAvailableCommand(command: unknown): AcpRuntimeAvailableCommand | undefined {\n if (typeof command === \"string\") {\n const name = command.trim();\n return name ? { name } : undefined;\n }\n const record = commandRecord(command);\n if (!record) {\n return undefined;\n }\n const name = asOptionalString(record.name);\n if (!name) {\n return undefined;\n }\n const runtimeCommand: AcpRuntimeAvailableCommand = { name };\n const description = asOptionalString(record.description);\n if (description) {\n runtimeCommand.description = description;\n }\n if (typeof record.has_input === \"boolean\") {\n runtimeCommand.hasInput = record.has_input;\n }\n return runtimeCommand;\n}\n\nfunction commandRecord(\n value: unknown,\n): { name?: unknown; description?: unknown; has_input?: unknown } | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value;\n}\n","import { textPrompt, type PromptInput } from \"../../prompt-content.js\";\nimport type {\n AcpRuntimeEvent,\n AcpRuntimeTurnAttachment,\n AcpRuntimeTurnResult,\n} from \"../public/contract.js\";\nimport { AcpRuntimeError } from \"../public/errors.js\";\n\nexport type Deferred<T> = {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (error: unknown) => void;\n};\n\nexport function createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void;\n let reject!: (error: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nexport class AsyncEventQueue {\n private readonly items: AcpRuntimeEvent[] = [];\n private readonly waits: Deferred<AcpRuntimeEvent | null>[] = [];\n private closed = false;\n\n push(item: AcpRuntimeEvent): void {\n if (this.closed) {\n return;\n }\n const waiter = this.waits.shift();\n if (waiter) {\n waiter.resolve(item);\n return;\n }\n this.items.push(item);\n }\n\n close(): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n for (const waiter of this.waits.splice(0)) {\n waiter.resolve(null);\n }\n }\n\n clear(): void {\n this.items.length = 0;\n }\n\n async next(): Promise<AcpRuntimeEvent | null> {\n if (this.items.length > 0) {\n return this.items.shift() ?? null;\n }\n if (this.closed) {\n return null;\n }\n const waiter = createDeferred<AcpRuntimeEvent | null>();\n this.waits.push(waiter);\n return await waiter.promise;\n }\n\n async *iterate(): AsyncIterable<AcpRuntimeEvent> {\n while (true) {\n const next = await this.next();\n if (!next) {\n return;\n }\n yield next;\n }\n }\n}\n\nexport function toPromptInput(\n text: string,\n attachments?: AcpRuntimeTurnAttachment[],\n): PromptInput | string {\n if (!attachments || attachments.length === 0) {\n return text;\n }\n const blocks: PromptInput = [];\n if (text) {\n blocks.push({ type: \"text\", text });\n }\n for (const attachment of attachments) {\n if (attachment.mediaType.startsWith(\"image/\")) {\n blocks.push({\n type: \"image\",\n mimeType: attachment.mediaType,\n data: attachment.data,\n });\n continue;\n }\n if (attachment.mediaType.startsWith(\"audio/\")) {\n blocks.push({\n type: \"audio\",\n mimeType: attachment.mediaType,\n data: attachment.data,\n });\n continue;\n }\n throw new AcpRuntimeError(\n \"ACP_TURN_FAILED\",\n `Unsupported ACP runtime attachment media type: ${attachment.mediaType}`,\n );\n }\n return blocks.length > 0 ? blocks : textPrompt(text);\n}\n\nexport function legacyTerminalEventFromTurnResult(result: AcpRuntimeTurnResult): AcpRuntimeEvent {\n if (result.status === \"failed\") {\n return {\n type: \"error\",\n message: result.error.message,\n ...(result.error.code ? { code: result.error.code } : {}),\n ...(result.error.detailCode ? { detailCode: result.error.detailCode } : {}),\n ...(result.error.retryable === undefined ? {} : { retryable: result.error.retryable }),\n };\n }\n return {\n type: \"done\",\n ...(result.stopReason ? { stopReason: result.stopReason } : {}),\n ...(result._meta === undefined ? {} : { _meta: result._meta }),\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport type { SessionNotification, SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { normalizeAgentCommandInput } from \"../../acp/client-process.js\";\nimport { AcpClient } from \"../../acp/client.js\";\nimport { normalizeOutputError } from \"../../acp/error-normalization.js\";\nimport { extractAcpError, isAcpResourceNotFoundError } from \"../../acp/error-shapes.js\";\nimport {\n assertControlAuthority,\n withTimeout,\n type AcpControlAuthority,\n} from \"../../async-control.js\";\nimport type { PromptInput } from \"../../prompt-content.js\";\nimport {\n applyConfigOptionsToRecord,\n applyConfigOptionSelection,\n applyModelSelection,\n applyInitialModelSelection,\n} from \"../../session/config-options.js\";\nimport {\n cloneSessionAcpxState,\n cloneSessionConversation,\n recordClientOperation,\n recordPromptSubmission,\n recordSessionUpdate,\n trimConversationForRuntime,\n} from \"../../session/conversation-model.js\";\nimport { LiveSessionCheckpoint } from \"../../session/live-checkpoint.js\";\nimport { setDesiredModeId } from \"../../session/mode-preference.js\";\nimport { applyRequestedModelIfAdvertised } from \"../../session/model-application.js\";\nimport { advertisedModelState } from \"../../session/model-state.js\";\nimport type { ClientOperation, SessionRecord, SessionResumePolicy } from \"../../types.js\";\nimport type {\n AcpElicitationHandler,\n AcpPermissionHandler,\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePromptMode,\n AcpRuntimeStatus,\n AcpRuntimeTurnAttachment,\n AcpRuntimeTurn,\n AcpRuntimeTurnResult,\n} from \"../public/contract.js\";\nimport { AcpRuntimeError } from \"../public/errors.js\";\nimport { parsePromptEventLine } from \"../public/events.js\";\nimport { probeRuntime, type RuntimeHealthReport } from \"../public/probe.js\";\nimport { withConnectedSession } from \"./connected-session.js\";\nimport {\n applyConversation,\n applyLifecycleSnapshotToRecord,\n createInitialSessionRecord,\n reconcileAgentSessionId,\n} from \"./lifecycle.js\";\nimport { runPromptTurn } from \"./prompt-turn.js\";\nimport {\n connectAndLoadSession,\n type ConnectAndLoadSessionOptions,\n type ConnectAndLoadSessionResult,\n} from \"./reconnect.js\";\nimport { shouldReuseExistingRecord } from \"./reuse-policy.js\";\nimport {\n persistSessionOptions,\n sessionOptionsFromRecord,\n type SessionAgentOptions,\n} from \"./session-options.js\";\nimport { runtimeStatusFromRecord } from \"./status.js\";\nimport {\n AsyncEventQueue,\n createDeferred,\n toPromptInput,\n legacyTerminalEventFromTurnResult,\n type Deferred,\n} from \"./turn.js\";\n\nexport type AcpRuntimeManagerDeps = {\n clientFactory?: (options: ConstructorParameters<typeof AcpClient>[0]) => AcpClient;\n};\n\ntype ActiveSessionController = {\n hasActivePrompt: () => boolean;\n requestCancelActivePrompt: () => Promise<boolean>;\n setSessionMode: (modeId: string, authority?: AcpControlAuthority) => Promise<void>;\n setSessionModel: (\n modelId: string,\n authority?: AcpControlAuthority,\n ) => ReturnType<AcpClient[\"setSessionModel\"]>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n authority?: AcpControlAuthority,\n ) => ReturnType<AcpClient[\"setSessionConfigOption\"]>;\n setResolvedSessionConfigOption: (\n configId: string,\n value: string,\n authority?: AcpControlAuthority,\n ) => Promise<{\n configId: string;\n response: Awaited<ReturnType<AcpClient[\"setSessionConfigOption\"]>>;\n }>;\n};\n\ntype SettledAttempt<T> = { ok: true; value: T } | { ok: false; error: unknown };\ntype FailedAttempt = Extract<SettledAttempt<unknown>, { ok: false }>;\n\nasync function settleAttempt<T>(run: () => T | Promise<T>): Promise<SettledAttempt<T>> {\n try {\n return { ok: true, value: await run() };\n } catch (error) {\n return { ok: false, error };\n }\n}\n\nfunction firstFailedAttempt(\n attempts: readonly SettledAttempt<unknown>[],\n): FailedAttempt | undefined {\n return attempts.find((attempt): attempt is FailedAttempt => !attempt.ok);\n}\n\nfunction isoNow(): string {\n return new Date().toISOString();\n}\n\nfunction isUnsupportedSessionCloseError(error: unknown): boolean {\n const acp = extractAcpError(error);\n if (!acp) {\n return false;\n }\n if (acp.code === -32601 || acp.code === -32602) {\n return true;\n }\n if (acp.code !== -32603 || !acp.data || typeof acp.data !== \"object\") {\n return false;\n }\n const details = (acp.data as { details?: unknown }).details;\n return typeof details === \"string\" && details.toLowerCase().includes(\"invalid params\");\n}\n\nfunction createRecordId(sessionKey: string, mode: \"persistent\" | \"oneshot\"): string {\n if (mode === \"persistent\") {\n return sessionKey;\n }\n return `${sessionKey}:oneshot:${randomUUID()}`;\n}\n\nfunction resumePolicyForSessionMode(mode: \"persistent\" | \"oneshot\"): SessionResumePolicy {\n return mode === \"persistent\" ? \"same-session-only\" : \"allow-new\";\n}\n\nfunction advertisedConfigOptionIds(record: SessionRecord): Set<string> | undefined {\n const configOptions = record.acpx?.config_options;\n if (!configOptions) {\n return undefined;\n }\n\n return new Set(\n configOptions\n .map((option) => option.id)\n .filter((id): id is string => typeof id === \"string\" && id.trim().length > 0),\n );\n}\n\nfunction resolveSupportedConfigOptionId(record: SessionRecord, configId: string): string {\n const advertisedIds = advertisedConfigOptionIds(record);\n if (!advertisedIds) {\n return configId;\n }\n\n if (advertisedIds.has(configId)) {\n return configId;\n }\n\n if (configId === \"thinking\" && advertisedIds.has(\"effort\")) {\n return \"effort\";\n }\n\n const supported = [...advertisedIds].toSorted();\n const supportedText = supported.length > 0 ? supported.join(\", \") : \"none\";\n throw new AcpRuntimeError(\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n `ACP session ${record.acpxRecordId} does not advertise config option '${configId}'. Supported config options: ${supportedText}.`,\n );\n}\n\ntype CreatedRuntimeSession = {\n sessionId: string;\n agentSessionId: string | undefined;\n sessionResult:\n | Awaited<ReturnType<AcpClient[\"createSession\"]>>\n | Awaited<ReturnType<AcpClient[\"loadSession\"]>>;\n};\n\ntype RuntimeEnsureInput = {\n sessionKey: string;\n agent: string;\n mode: \"persistent\" | \"oneshot\";\n cwd?: string;\n resumeSessionId?: string;\n sessionOptions?: SessionAgentOptions;\n};\n\ntype ResolvedRuntimeAgent = {\n cwd: string;\n agentCommand: string;\n agentArgv?: string[];\n};\n\ntype ExistingRuntimeSession = {\n record: SessionRecord;\n owner?: RuntimeSessionOwner;\n};\n\ntype RuntimeTurnTaskState = {\n pendingCancel: boolean;\n turnActive: boolean;\n activeController: ActiveSessionController | null;\n};\n\ntype RuntimeSessionTask = {\n completion: Promise<void>;\n cancel?: () => Promise<boolean>;\n};\n\ntype RuntimeTurnTask = {\n input: {\n handle: AcpRuntimeHandle;\n text: string;\n attachments?: AcpRuntimeTurnAttachment[];\n mode: AcpRuntimePromptMode;\n sessionMode: \"persistent\" | \"oneshot\";\n requestId: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n onElicitation?: AcpElicitationHandler;\n onPermissionRequest?: AcpPermissionHandler;\n };\n promptInput: PromptInput | string;\n queue: AsyncEventQueue;\n promptStarted: Deferred<void>;\n sessionReady: Deferred<void>;\n state: RuntimeTurnTaskState;\n settleResult: (next: AcpRuntimeTurnResult) => void;\n abortHandler: () => void;\n};\n\ntype RunningRuntimeTurn = {\n record: SessionRecord;\n conversation: ReturnType<typeof cloneSessionConversation>;\n acpxState: ReturnType<typeof cloneSessionAcpxState>;\n liveCheckpoint: LiveSessionCheckpoint;\n client: AcpClient;\n owner: RuntimeSessionOwner;\n connected: boolean;\n promptMessageId: string | undefined;\n activeSessionId: string;\n};\n\ntype RuntimeSessionProjection = {\n record: SessionRecord;\n conversation: ReturnType<typeof cloneSessionConversation>;\n checkpoint: LiveSessionCheckpoint;\n};\n\ntype RuntimeSessionOwner = {\n client: AcpClient;\n retirement?: Promise<void>;\n sessionKey: string;\n mode: \"persistent\" | \"oneshot\";\n recordId?: string;\n projection?: RuntimeSessionProjection;\n activeTurn?: {\n task: RuntimeTurnTask;\n turn: RunningRuntimeTurn;\n };\n bufferSessionUpdates: boolean;\n pendingSessionUpdates: SessionNotification[];\n};\n\ntype PreparedRuntimeTurnState = {\n record: SessionRecord;\n retainedOwner?: RuntimeSessionOwner;\n conversation: ReturnType<typeof cloneSessionConversation>;\n acpxState: ReturnType<typeof cloneSessionAcpxState>;\n promptMessageId: string | undefined;\n};\n\nasync function createOrLoadRuntimeSession(\n client: AcpClient,\n resumeSessionId: string | undefined,\n cwd: string,\n): Promise<CreatedRuntimeSession> {\n if (resumeSessionId) {\n if (client.supportsResumeSession()) {\n const resumed = await client.resumeSession(resumeSessionId, cwd);\n return {\n sessionId: resumeSessionId,\n agentSessionId: resumed.agentSessionId,\n sessionResult: resumed,\n };\n }\n if (!client.supportsLoadSession()) {\n throw new Error(\n `Agent does not support session/resume or session/load; cannot resume session ${resumeSessionId}`,\n );\n }\n const loaded = await client.loadSession(resumeSessionId, cwd);\n return {\n sessionId: resumeSessionId,\n agentSessionId: loaded.agentSessionId,\n sessionResult: loaded,\n };\n }\n\n const created = await client.createSession(cwd);\n return {\n sessionId: created.sessionId,\n agentSessionId: created.agentSessionId,\n sessionResult: created,\n };\n}\n\nexport class AcpRuntimeManager {\n private readonly activeControllers = new Map<string, ActiveSessionController>();\n private readonly retainedSessionOwners = new Map<string, RuntimeSessionOwner>();\n private readonly retiringSessionOwners = new Set<RuntimeSessionOwner>();\n private readonly pendingOneShotRecordIds = new Map<string, string>();\n private readonly ensureSessionLocks = new Map<string, Promise<void>>();\n private readonly runtimeOperationLocks = new Map<string, Promise<void>>();\n private readonly sessionTasks = new Map<string, Set<RuntimeSessionTask>>();\n private readonly closingActiveRecords = new Set<string>();\n private readonly liveClients = new Set<AcpClient>();\n private readonly pendingTasks = new Set<Promise<unknown>>();\n private shuttingDown = false;\n private shutdownTask?: Promise<void>;\n\n constructor(\n private readonly options: AcpRuntimeOptions,\n private readonly deps: AcpRuntimeManagerDeps = {},\n ) {}\n\n private createClient(options: ConstructorParameters<typeof AcpClient>[0]): AcpClient {\n this.assertOpen();\n const clientOptions: ConstructorParameters<typeof AcpClient>[0] = {\n ...options,\n agentProcessEnv: this.options.agentProcessEnv,\n processLifecycle: {\n ...options.processLifecycle,\n onBeforeSpawn: async (launch) => {\n this.assertOpen();\n await options.processLifecycle?.onBeforeSpawn?.(launch);\n this.assertOpen();\n },\n onSpawned: async (process) => {\n this.assertOpen();\n await options.processLifecycle?.onSpawned?.(process);\n this.assertOpen();\n },\n },\n };\n const client = this.deps.clientFactory?.(clientOptions) ?? new AcpClient(clientOptions);\n this.liveClients.add(client);\n return client;\n }\n\n async probe(): Promise<RuntimeHealthReport> {\n let client: AcpClient | undefined;\n try {\n return await probeRuntime(this.options, {\n clientFactory: (options) => (client = this.createClient(options)),\n });\n } finally {\n if (client) {\n this.liveClients.delete(client);\n }\n }\n }\n\n private assertOpen(): void {\n if (this.shuttingDown) {\n throw new AcpRuntimeError(\"ACP_BACKEND_UNAVAILABLE\", \"ACP runtime is shut down.\");\n }\n }\n\n shutdown(): Promise<void> {\n if (!this.shutdownTask) {\n this.shuttingDown = true;\n this.shutdownTask = this.shutdownOwnedClients();\n }\n return this.shutdownTask;\n }\n\n private async shutdownOwnedClients(): Promise<void> {\n const closed = await Promise.allSettled(\n [...this.liveClients].map(async (client) => {\n void client.requestCancelActivePrompt().catch(() => {});\n await this.closeClient(client);\n }),\n );\n await Promise.allSettled([\n ...this.ensureSessionLocks.values(),\n ...this.runtimeOperationLocks.values(),\n ...this.pendingTasks,\n ]);\n await Promise.all(\n [...this.retainedSessionOwners.values()].map(async (owner) => {\n this.removeRetainedSessionOwner(owner);\n await this.stopSessionOwner(owner);\n }),\n );\n const errors: unknown[] = [];\n for (const result of closed) {\n if (result.status === \"rejected\") {\n errors.push(result.reason);\n }\n }\n if (errors.length) {\n throw new AggregateError(errors, \"ACP runtime shutdown failed.\");\n }\n this.retiringSessionOwners.clear();\n }\n\n private trackTask<T>(task: Promise<T>): Promise<T> {\n this.pendingTasks.add(task);\n const remove = () => {\n this.pendingTasks.delete(task);\n };\n void task.then(remove, remove);\n return task;\n }\n\n private queueSessionTask<T>(\n recordId: string,\n run: () => Promise<T>,\n cancel?: () => Promise<boolean>,\n ): Promise<T> {\n const tasks = this.sessionTasks.get(recordId) ?? new Set<RuntimeSessionTask>();\n this.sessionTasks.set(recordId, tasks);\n const previous = [...tasks].at(-1)?.completion;\n const result = (async () => {\n await previous?.catch(() => {});\n return await run();\n })();\n const task = { completion: result.then(() => {}), cancel };\n void task.completion.catch(() => {});\n tasks.add(task);\n const remove = () => {\n tasks.delete(task);\n if (tasks.size === 0) {\n this.sessionTasks.delete(recordId);\n }\n };\n void result.then(remove, remove);\n return this.trackTask(result);\n }\n\n private async cancelSessionTasks(recordId: string): Promise<RuntimeSessionTask[]> {\n const tasks = [...(this.sessionTasks.get(recordId) ?? [])];\n await Promise.all(tasks.flatMap((task) => (task.cancel ? [task.cancel()] : [])));\n return tasks;\n }\n\n private async closeClient(client: AcpClient): Promise<void> {\n await client.close();\n this.liveClients.delete(client);\n }\n\n private createSessionOwner(input: {\n client: AcpClient;\n sessionKey: string;\n mode: \"persistent\" | \"oneshot\";\n }): RuntimeSessionOwner {\n const owner: RuntimeSessionOwner = {\n ...input,\n bufferSessionUpdates: false,\n pendingSessionUpdates: [],\n };\n input.client.setEventHandlers({\n onSessionUpdate: (notification) => this.routeOwnedSessionUpdate(owner, notification),\n onClientOperation: (operation) => this.routeOwnedClientOperation(owner, operation),\n });\n return owner;\n }\n\n private routeOwnedSessionUpdate(\n owner: RuntimeSessionOwner,\n notification: SessionNotification,\n ): void {\n const active = owner.activeTurn;\n if (active) {\n const { task, turn } = active;\n if (turn.connected) {\n turn.acpxState = recordSessionUpdate(turn.conversation, turn.acpxState, notification);\n turn.liveCheckpoint.request();\n } else {\n // Reconnect setters and their notifications share the record so an older\n // notification cannot overwrite a later acknowledgement after replay.\n turn.record.acpx = recordSessionUpdate(turn.conversation, turn.record.acpx, notification);\n }\n trimConversationForRuntime(turn.conversation);\n this.emitRuntimeTurnEvent(task, {\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: notification,\n });\n return;\n }\n\n if (owner.bufferSessionUpdates) {\n owner.pendingSessionUpdates.push(notification);\n return;\n }\n\n const projection = owner.projection;\n if (!projection) {\n owner.pendingSessionUpdates.push(notification);\n return;\n }\n projection.record.acpx = recordSessionUpdate(\n projection.conversation,\n projection.record.acpx,\n notification,\n );\n trimConversationForRuntime(projection.conversation);\n projection.checkpoint.request();\n }\n\n private routeOwnedClientOperation(owner: RuntimeSessionOwner, operation: ClientOperation): void {\n const active = owner.activeTurn;\n if (!active) {\n return;\n }\n const { task, turn } = active;\n if (turn.connected) {\n turn.acpxState = recordClientOperation(turn.conversation, turn.acpxState, operation);\n turn.liveCheckpoint.request();\n } else {\n turn.record.acpx = recordClientOperation(turn.conversation, turn.record.acpx, operation);\n }\n trimConversationForRuntime(turn.conversation);\n this.emitRuntimeTurnEvent(task, {\n type: \"client_operation\",\n ...operation,\n });\n }\n\n private attachIdleProjection(\n owner: RuntimeSessionOwner,\n record: SessionRecord,\n conversation = cloneSessionConversation(record),\n acpxState = record.acpx,\n ): void {\n record.acpx = acpxState;\n const checkpoint = new LiveSessionCheckpoint({\n save: async () => {\n // Initialization owns publication; notifications before its model\n // selection succeeds must not create an incomplete session record.\n if (!owner.recordId) {\n return;\n }\n record.lastUsedAt = isoNow();\n applyConversation(record, conversation);\n applyLifecycleSnapshotToRecord(record, owner.client.getAgentLifecycleSnapshot());\n await this.refreshClosedState(record);\n await this.options.sessionStore.save(record);\n },\n });\n owner.projection = { record, conversation, checkpoint };\n owner.activeTurn = undefined;\n this.drainPendingSessionUpdates(owner);\n }\n\n private drainPendingSessionUpdates(owner: RuntimeSessionOwner): void {\n for (const notification of owner.pendingSessionUpdates.splice(0)) {\n this.routeOwnedSessionUpdate(owner, notification);\n }\n }\n\n private async flushSessionOwner(owner: RuntimeSessionOwner): Promise<void> {\n await owner.client.waitForSessionUpdatesIdle?.().catch(() => {});\n await owner.projection?.checkpoint.flush();\n }\n\n private removeRetainedSessionOwner(owner: RuntimeSessionOwner): void {\n if (owner.recordId && this.retainedSessionOwners.get(owner.recordId) === owner) {\n this.retainedSessionOwners.delete(owner.recordId);\n }\n if (\n owner.mode === \"oneshot\" &&\n owner.recordId &&\n this.pendingOneShotRecordIds.get(owner.sessionKey) === owner.recordId\n ) {\n this.pendingOneShotRecordIds.delete(owner.sessionKey);\n }\n }\n\n private async readRetainedSessionOwner(\n record: SessionRecord,\n options: { consume: boolean },\n ): Promise<RuntimeSessionOwner | undefined> {\n const owner = this.retainedSessionOwners.get(record.acpxRecordId);\n if (!owner) {\n return undefined;\n }\n await this.flushSessionOwner(owner);\n const projectedRecord = owner.projection?.record;\n if (projectedRecord && projectedRecord !== record) {\n Object.assign(record, structuredClone(projectedRecord));\n }\n if (!owner.client.hasReusableSession(record.acpSessionId)) {\n this.removeRetainedSessionOwner(owner);\n await this.stopSessionOwner(owner);\n return undefined;\n }\n if (options.consume) {\n this.removeRetainedSessionOwner(owner);\n }\n return owner;\n }\n\n private async closeRetainedSessionOwner(recordId: string): Promise<void> {\n const owner = this.retainedSessionOwners.get(recordId);\n if (!owner) {\n return;\n }\n this.removeRetainedSessionOwner(owner);\n await this.stopSessionOwner(owner);\n }\n\n private async stopSessionOwner(owner: RuntimeSessionOwner): Promise<void> {\n await this.flushSessionOwner(owner).catch(() => {});\n await this.closeClient(owner.client).catch(() => {\n this.retiringSessionOwners.add(owner);\n });\n await owner.projection?.checkpoint.flush().catch(() => {});\n try {\n owner.client.clearEventHandlers();\n } catch {}\n }\n\n private async retrySessionCleanup(recordId: string): Promise<void> {\n for (const owner of this.retiringSessionOwners) {\n if (owner.recordId === recordId) {\n owner.retirement ??= this.finalizeSessionConnection({ client: owner.client, owner })\n .then(() => {\n this.retiringSessionOwners.delete(owner);\n })\n .finally(() => {\n owner.retirement = undefined;\n });\n await owner.retirement;\n }\n }\n }\n\n private async refreshClosedState(record: SessionRecord): Promise<boolean> {\n if (!this.closingActiveRecords.has(record.acpxRecordId)) {\n return record.closed === true;\n }\n const latest = await this.options.sessionStore.load(record.acpxRecordId).catch(() => undefined);\n record.closed = true;\n record.closedAt = latest?.closedAt ?? record.closedAt ?? isoNow();\n if (latest?.acpx) {\n record.acpx = {\n ...record.acpx,\n ...latest.acpx,\n };\n }\n return true;\n }\n\n private async retainPersistentSessionOwnerAfterTurn(input: {\n record: SessionRecord;\n owner: RuntimeSessionOwner;\n conversation: ReturnType<typeof cloneSessionConversation>;\n acpxState: ReturnType<typeof cloneSessionAcpxState>;\n }): Promise<boolean> {\n const { record, owner, conversation, acpxState } = input;\n if (!this.canRetainPersistentSessionOwner(owner, record)) {\n owner.activeTurn = undefined;\n return false;\n }\n this.attachIdleProjection(owner, record, conversation, acpxState);\n const previousOwner = this.retainedSessionOwners.get(record.acpxRecordId);\n this.retainedSessionOwners.set(record.acpxRecordId, owner);\n if (previousOwner && previousOwner !== owner) {\n this.removeRetainedSessionOwner(previousOwner);\n await this.stopSessionOwner(previousOwner);\n }\n return true;\n }\n\n private canRetainPersistentSessionOwner(\n owner: RuntimeSessionOwner,\n record: SessionRecord,\n ): boolean {\n return (\n !this.shuttingDown &&\n owner.mode === \"persistent\" &&\n !record.closed &&\n !(owner.client.hasUnresolvedPrompt?.() ?? false) &&\n owner.client.hasReusableSession(record.acpSessionId)\n );\n }\n\n private resolveMcpServers(session: {\n sessionKey: string;\n cwd: string;\n agentCommand: string;\n agentArgv?: string[];\n }) {\n const servers = this.options.mcpServers;\n const { sessionKey, cwd, agentCommand, agentArgv } = session;\n return [\n ...(typeof servers === \"function\"\n ? servers({\n sessionKey,\n cwd,\n agentCommand,\n agentArgv: agentArgv ? [...agentArgv] : undefined,\n })\n : (servers ?? [])),\n ];\n }\n\n private async withRuntimeControlSession<T>(\n record: SessionRecord,\n sessionMode: \"persistent\" | \"oneshot\",\n run: (context: { client: AcpClient; sessionId: string; record: SessionRecord }) => Promise<T>,\n replacingConfigOption?: ConnectAndLoadSessionOptions[\"replacingConfigOption\"],\n authority?: AcpControlAuthority,\n ): Promise<{ value: T; record: SessionRecord }> {\n await this.retrySessionCleanup(record.acpxRecordId);\n assertControlAuthority(authority);\n const owner = await this.readRetainedSessionOwner(record, { consume: false });\n assertControlAuthority(authority);\n if (owner) {\n const ownedRecord = owner.projection?.record ?? record;\n try {\n const value = await run({\n client: owner.client,\n sessionId: ownedRecord.acpSessionId,\n record: ownedRecord,\n });\n this.refreshOwnedRecordLifecycle(owner, ownedRecord);\n return { value, record: ownedRecord };\n } finally {\n await this.flushSessionOwner(owner);\n }\n }\n\n let controlClient: AcpClient | undefined;\n try {\n const result = await withConnectedSession({\n sessionRecordId: record.acpxRecordId,\n loadRecord: async (sessionRecordId) => await this.requireRecord(sessionRecordId),\n saveRecord: async (connectedRecord) =>\n await this.options.sessionStore.save(connectedRecord),\n createClient: (options) =>\n (controlClient = this.createClient({\n ...options,\n processLifecycle: this.options.processLifecycle,\n processLaunchScope: {\n kind: \"runtime-session\",\n sessionKey: record.name ?? record.acpxRecordId,\n },\n })),\n mcpServers: this.resolveMcpServers({\n ...record,\n sessionKey: record.name ?? record.acpxRecordId,\n }),\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n permissionPolicy: this.options.permissionPolicy,\n onPermissionRequest: this.options.onPermissionRequest,\n elicitationModes: this.options.elicitationModes,\n verbose: this.options.verbose,\n timeoutMs: this.options.timeoutMs,\n resumePolicy: resumePolicyForSessionMode(sessionMode),\n replacingConfigOption,\n authority,\n run,\n });\n return {\n value: result.value,\n record: result.record,\n };\n } finally {\n if (controlClient) {\n this.liveClients.delete(controlClient);\n }\n }\n }\n\n private refreshOwnedRecordLifecycle(owner: RuntimeSessionOwner, record: SessionRecord): void {\n record.lastUsedAt = isoNow();\n record.closed = false;\n record.closedAt = undefined;\n record.protocolVersion = owner.client.initializeResult?.protocolVersion;\n record.agentCapabilities = owner.client.initializeResult?.agentCapabilities;\n applyLifecycleSnapshotToRecord(record, owner.client.getAgentLifecycleSnapshot());\n }\n\n async ensureSession(input: RuntimeEnsureInput): Promise<SessionRecord> {\n return await this.withEnsureSessionLock(input, async () =>\n this.ensureSessionWithOwnership(input),\n );\n }\n\n private async withEnsureSessionLock<T>(\n input: RuntimeEnsureInput,\n run: () => Promise<T>,\n ): Promise<T> {\n const key = `${input.mode}\\0${input.sessionKey}`;\n return await this.withManagerLock(this.ensureSessionLocks, key, run);\n }\n\n private async withManagerLock<T>(\n locks: Map<string, Promise<void>>,\n key: string,\n run: () => Promise<T>,\n authority?: AcpControlAuthority,\n ): Promise<T> {\n this.assertOpen();\n assertControlAuthority(authority);\n const previous = locks.get(key) ?? Promise.resolve();\n let release!: () => void;\n const gate = new Promise<void>((resolve) => {\n release = resolve;\n });\n const tail = previous.then(() => gate);\n locks.set(key, tail);\n await previous;\n try {\n this.assertOpen();\n assertControlAuthority(authority);\n return await run();\n } finally {\n release();\n if (locks.get(key) === tail) {\n locks.delete(key);\n }\n }\n }\n\n private async ensureSessionWithOwnership(input: RuntimeEnsureInput): Promise<SessionRecord> {\n const cwd = path.resolve(input.cwd?.trim() || this.options.cwd);\n const { agentCommand, agentArgv } = normalizeAgentCommandInput(\n this.options.agentRegistry.resolve(input.agent),\n );\n const agent = { cwd, agentCommand, agentArgv };\n const existing = await this.loadExistingRuntimeSession(input);\n if (existing && this.canReuseRuntimeSession(input, agent, existing)) {\n return await this.reuseRuntimeSession(existing.record);\n }\n await this.closeConflictingPersistentSession(input, existing?.owner);\n return await this.createOwnedRuntimeSession(input, agent);\n }\n\n private async loadExistingRuntimeSession(\n input: RuntimeEnsureInput,\n ): Promise<ExistingRuntimeSession | undefined> {\n const existingRecordId =\n input.mode === \"persistent\"\n ? input.sessionKey\n : this.pendingOneShotRecordIds.get(input.sessionKey);\n if (!existingRecordId) {\n return undefined;\n }\n await this.retrySessionCleanup(existingRecordId);\n let record = await this.findSession(existingRecordId);\n if (!record) {\n return undefined;\n }\n const owner = this.retainedSessionOwners.get(record.acpxRecordId);\n if (owner) {\n await this.flushSessionOwner(owner);\n record = owner.projection?.record ?? record;\n }\n return { record, owner };\n }\n\n async findSession(sessionKey: string): Promise<SessionRecord | undefined> {\n return await this.options.sessionStore.load(sessionKey);\n }\n\n private canReuseRuntimeSession(\n input: RuntimeEnsureInput,\n agent: ResolvedRuntimeAgent,\n existing: ExistingRuntimeSession,\n ): boolean {\n if (\n !shouldReuseExistingRecord(existing.record, {\n cwd: agent.cwd,\n agentCommand: agent.agentCommand,\n agentArgv: agent.agentArgv,\n resumeSessionId: input.resumeSessionId,\n })\n ) {\n return false;\n }\n if (input.mode === \"persistent\") {\n return true;\n }\n return Boolean(\n existing.owner &&\n isDeepStrictEqual(sessionOptionsFromRecord(existing.record), input.sessionOptions),\n );\n }\n\n private async reuseRuntimeSession(record: SessionRecord): Promise<SessionRecord> {\n // sessionOptions on a reused persistent record are intentionally ignored:\n // system prompts are fixed at newSession time. Pending one-shot records are\n // reused only when their options still match.\n record.closed = false;\n record.closedAt = undefined;\n this.closingActiveRecords.delete(record.acpxRecordId);\n await this.options.sessionStore.save(record);\n return record;\n }\n\n private async closeConflictingPersistentSession(\n input: RuntimeEnsureInput,\n owner: RuntimeSessionOwner | undefined,\n ): Promise<void> {\n if (input.mode === \"persistent\" && owner?.recordId) {\n await this.closeRetainedSessionOwner(owner.recordId);\n }\n }\n\n private async createOwnedRuntimeSession(\n input: RuntimeEnsureInput,\n agent: ResolvedRuntimeAgent,\n ): Promise<SessionRecord> {\n const { cwd, agentCommand, agentArgv } = agent;\n const client = this.createClient({\n agentCommand,\n agentArgv,\n cwd,\n mcpServers: this.resolveMcpServers({ ...agent, sessionKey: input.sessionKey }),\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n permissionPolicy: this.options.permissionPolicy,\n onPermissionRequest: this.options.onPermissionRequest,\n elicitationModes: this.options.elicitationModes,\n processLifecycle: this.options.processLifecycle,\n processLaunchScope: { kind: \"runtime-session\", sessionKey: input.sessionKey },\n verbose: this.options.verbose,\n sessionOptions: input.sessionOptions,\n });\n const owner = this.createSessionOwner({\n client,\n sessionKey: input.sessionKey,\n mode: input.mode,\n });\n let retained = false;\n\n try {\n await client.start();\n this.assertOpen();\n const session = await createOrLoadRuntimeSession(client, input.resumeSessionId, cwd);\n const record = await this.prepareInitialRuntimeRecord({\n input,\n client,\n owner,\n agentCommand,\n agentArgv,\n cwd,\n session,\n });\n await this.retainInitializedSessionOwner(owner, record);\n retained = true;\n return record;\n } finally {\n if (!retained) {\n owner.recordId = undefined;\n client.clearEventHandlers();\n await this.closeClient(client);\n }\n }\n }\n\n private async prepareInitialRuntimeRecord(params: {\n input: {\n sessionKey: string;\n mode: \"persistent\" | \"oneshot\";\n sessionOptions?: SessionAgentOptions;\n };\n client: AcpClient;\n owner: RuntimeSessionOwner;\n agentCommand: string;\n agentArgv?: string[];\n cwd: string;\n session: CreatedRuntimeSession;\n }): Promise<SessionRecord> {\n const { input, client, owner, agentCommand, agentArgv, cwd, session } = params;\n const record = createInitialSessionRecord({\n recordId: createRecordId(input.sessionKey, input.mode),\n name: input.sessionKey,\n sessionId: session.sessionId,\n agentCommand,\n agentArgv,\n cwd,\n agentSessionId: session.agentSessionId,\n });\n this.closingActiveRecords.delete(record.acpxRecordId);\n record.protocolVersion = client.initializeResult?.protocolVersion;\n record.agentCapabilities = client.initializeResult?.agentCapabilities;\n // Fold pre-response notifications first; later controls and their updates\n // then share this record and retain wire order through acknowledgement.\n this.attachIdleProjection(owner, record);\n applyConfigOptionsToRecord(record, session.sessionResult);\n const modelApplication = await applyRequestedModelIfAdvertised({\n client,\n sessionId: session.sessionId,\n requestedModel: input.sessionOptions?.model,\n models: session.sessionResult.models,\n agentCommand,\n timeoutMs: this.options.timeoutMs,\n });\n applyInitialModelSelection(\n record,\n session.sessionResult.models,\n input.sessionOptions?.model,\n modelApplication,\n );\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n persistSessionOptions(record, input.sessionOptions);\n return record;\n }\n\n private async retainInitializedSessionOwner(\n owner: RuntimeSessionOwner,\n record: SessionRecord,\n ): Promise<void> {\n owner.recordId = record.acpxRecordId;\n // The checkpoint loop also persists notifications arriving during the\n // initial async save before this owner becomes available for reuse.\n await owner.projection?.checkpoint.checkpoint();\n this.assertOpen();\n const previousOwner = this.retainedSessionOwners.get(record.acpxRecordId);\n this.retainedSessionOwners.set(record.acpxRecordId, owner);\n if (owner.mode === \"oneshot\") {\n this.pendingOneShotRecordIds.set(owner.sessionKey, record.acpxRecordId);\n }\n if (previousOwner && previousOwner !== owner) {\n this.removeRetainedSessionOwner(previousOwner);\n await this.stopSessionOwner(previousOwner);\n }\n }\n\n startTurn(input: {\n handle: AcpRuntimeHandle;\n text: string;\n attachments?: AcpRuntimeTurnAttachment[];\n mode: AcpRuntimePromptMode;\n sessionMode: \"persistent\" | \"oneshot\";\n requestId: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n onElicitation?: AcpElicitationHandler;\n onPermissionRequest?: AcpPermissionHandler;\n }): AcpRuntimeTurn {\n this.assertOpen();\n let promptInput: PromptInput | string;\n try {\n promptInput = toPromptInput(input.text, input.attachments);\n } catch (error) {\n void this.trackTask(this.closeRetainedOneShotHandle(input.handle).catch(() => {}));\n throw error;\n }\n const queue = new AsyncEventQueue();\n const result = createDeferred<AcpRuntimeTurnResult>();\n const promptStarted = createDeferred<void>();\n void promptStarted.promise.catch(() => {});\n const sessionReady = createDeferred<void>();\n void sessionReady.promise.catch(() => {});\n let resultSettled = false;\n const state: RuntimeTurnTaskState = {\n pendingCancel: false,\n turnActive: true,\n activeController: null,\n };\n let streamClosed = false;\n\n const settleResult = (next: AcpRuntimeTurnResult): void => {\n if (resultSettled) {\n return;\n }\n resultSettled = true;\n result.resolve(next);\n };\n\n const closeStream = (): void => {\n if (streamClosed) {\n return;\n }\n streamClosed = true;\n queue.clear();\n queue.close();\n };\n\n const requestCancel = async (): Promise<boolean> => {\n if (state.activeController) {\n return await state.activeController.requestCancelActivePrompt();\n }\n if (!state.turnActive) {\n return false;\n }\n state.pendingCancel = true;\n return true;\n };\n\n const abortHandler = () => {\n void requestCancel();\n };\n if (input.signal && !input.signal.aborted) {\n input.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n void this.queueSessionTask(\n input.handle.acpxRecordId ?? input.handle.sessionKey,\n async () =>\n this.runRuntimeTurnTask({\n input,\n promptInput,\n queue,\n promptStarted,\n sessionReady,\n state,\n settleResult,\n abortHandler,\n }),\n requestCancel,\n );\n\n return {\n requestId: input.requestId,\n promptStarted: promptStarted.promise,\n events: queue.iterate(),\n result: result.promise,\n cancel: async () => {\n await requestCancel();\n },\n closeStream: async () => {\n closeStream();\n },\n };\n }\n\n private async closeRetainedOneShotHandle(handle: AcpRuntimeHandle): Promise<void> {\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n const owner = this.retainedSessionOwners.get(recordId);\n if (owner?.mode === \"oneshot\") {\n await this.closeRetainedSessionOwner(recordId);\n }\n }\n\n private async runRuntimeTurnTask(task: RuntimeTurnTask): Promise<void> {\n let turn: RunningRuntimeTurn | undefined;\n let terminalResult: AcpRuntimeTurnResult;\n try {\n if (this.cancelRuntimeTurnBeforePrompt(task)) {\n await this.closeRetainedOneShotHandle(task.input.handle);\n terminalResult = {\n status: \"cancelled\",\n stopReason: \"cancelled\",\n };\n } else {\n turn = await this.prepareRuntimeTurn(task);\n const { sessionId } = await this.connectRuntimeTurn(task, turn);\n this.assertOpen();\n await this.resolveRuntimeTurnReady(task, turn);\n if (this.cancelRuntimeTurnBeforePrompt(task)) {\n terminalResult = { status: \"cancelled\", stopReason: \"cancelled\" };\n } else {\n await this.applyPendingRuntimeTurnCancel(task, turn);\n const response = await this.runRuntimePrompt(task, turn, sessionId);\n await this.saveCompletedRuntimeTurn(turn);\n terminalResult = {\n status: response.stopReason === \"cancelled\" ? \"cancelled\" : \"completed\",\n ...(response.stopReason ? { stopReason: response.stopReason } : {}),\n ...(response._meta === undefined ? {} : { _meta: response._meta }),\n };\n }\n }\n } catch (error) {\n terminalResult = this.failRuntimeTurn(task, error);\n }\n const finalization = await settleAttempt(async () => this.finalizeRuntimeTurn(task, turn));\n if (!finalization.ok) {\n task.settleResult(this.failRuntimeTurn(task, finalization.error));\n throw finalization.error;\n }\n task.settleResult(terminalResult);\n }\n\n private async runRuntimePrompt(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n sessionId: string,\n ): ReturnType<typeof runPromptTurn> {\n try {\n return await runPromptTurn({\n client: turn.client,\n sessionId,\n prompt: task.promptInput,\n timeoutMs: task.input.timeoutMs ?? this.options.timeoutMs,\n conversation: turn.conversation,\n promptMessageId: turn.promptMessageId,\n onPromptRequestWritten: () => task.promptStarted.resolve(),\n onElicitation: task.input.onElicitation,\n onPermissionRequest: task.input.onPermissionRequest,\n });\n } finally {\n turn.client.endPromptElicitation?.(sessionId);\n }\n }\n\n private async prepareRuntimeTurn(task: RuntimeTurnTask): Promise<RunningRuntimeTurn> {\n const recordId = task.input.handle.acpxRecordId ?? task.input.handle.sessionKey;\n return await this.withManagerLock(this.runtimeOperationLocks, recordId, async () => {\n await this.retrySessionCleanup(recordId);\n return await this.prepareRuntimeTurnWithOwnership(task);\n });\n }\n\n private async prepareRuntimeTurnWithOwnership(\n task: RuntimeTurnTask,\n ): Promise<RunningRuntimeTurn> {\n const prepared = await this.prepareRuntimeTurnState(task);\n const { record, retainedOwner, conversation, acpxState, promptMessageId } = prepared;\n try {\n const client = retainedOwner?.client ?? this.createTurnClient(record);\n const owner = this.resolveRuntimeTurnOwner(task, record, client, retainedOwner);\n const turn = this.createRunningRuntimeTurn({\n record,\n conversation,\n acpxState,\n client,\n owner,\n connected: retainedOwner !== undefined,\n promptMessageId,\n });\n this.activateRuntimeTurn(task, turn);\n return turn;\n } catch (error) {\n this.restoreBufferedSessionOwner(retainedOwner);\n throw error;\n }\n }\n\n private async prepareRuntimeTurnState(task: RuntimeTurnTask): Promise<PreparedRuntimeTurnState> {\n const acquired = await this.acquireRuntimeTurnState(task);\n const { record, retainedOwner } = acquired;\n const conversation = cloneSessionConversation(record);\n const acpxState = cloneSessionAcpxState(record.acpx);\n try {\n const promptStartedAt = isoNow();\n const promptMessageId = recordPromptSubmission(\n conversation,\n task.promptInput,\n promptStartedAt,\n );\n trimConversationForRuntime(conversation);\n record.lastPromptAt = promptStartedAt;\n record.lastUsedAt = promptStartedAt;\n record.acpx = acpxState;\n applyConversation(record, conversation);\n await this.options.sessionStore.save(record);\n return { record, retainedOwner, conversation, acpxState, promptMessageId };\n } catch (error) {\n this.restoreBufferedSessionOwner(retainedOwner);\n throw error;\n }\n }\n\n private async acquireRuntimeTurnState(task: RuntimeTurnTask): Promise<{\n record: SessionRecord;\n retainedOwner?: RuntimeSessionOwner;\n }> {\n const recordId = task.input.handle.acpxRecordId ?? task.input.handle.sessionKey;\n let record = await this.requireRecord(recordId);\n const retainedOwner = await this.readRetainedSessionOwner(record, { consume: false });\n if (!retainedOwner) {\n return { record };\n }\n const projection = retainedOwner.projection;\n if (projection) {\n record = structuredClone(projection.record);\n }\n retainedOwner.bufferSessionUpdates = true;\n return { record, retainedOwner };\n }\n\n private restoreBufferedSessionOwner(owner: RuntimeSessionOwner | undefined): void {\n if (!owner) {\n return;\n }\n owner.bufferSessionUpdates = false;\n this.drainPendingSessionUpdates(owner);\n }\n\n private resolveRuntimeTurnOwner(\n task: RuntimeTurnTask,\n record: SessionRecord,\n client: AcpClient,\n retainedOwner: RuntimeSessionOwner | undefined,\n ): RuntimeSessionOwner {\n return (\n retainedOwner ??\n this.createSessionOwner({\n client,\n sessionKey: record.name ?? task.input.handle.sessionKey,\n mode: task.input.sessionMode,\n })\n );\n }\n\n private createRunningRuntimeTurn(input: {\n record: SessionRecord;\n conversation: ReturnType<typeof cloneSessionConversation>;\n acpxState: ReturnType<typeof cloneSessionAcpxState>;\n client: AcpClient;\n owner: RuntimeSessionOwner;\n connected: boolean;\n promptMessageId: string | undefined;\n }): RunningRuntimeTurn {\n const { record, conversation, acpxState, client, owner, connected, promptMessageId } = input;\n const turn: RunningRuntimeTurn = {\n record,\n conversation,\n acpxState,\n liveCheckpoint: this.createRuntimeTurnCheckpoint(record, conversation, () => turn.acpxState),\n client,\n owner,\n connected,\n promptMessageId,\n activeSessionId: record.acpSessionId,\n };\n return turn;\n }\n\n private activateRuntimeTurn(task: RuntimeTurnTask, turn: RunningRuntimeTurn): void {\n const { owner, record } = turn;\n this.removeRetainedSessionOwner(owner);\n owner.recordId = record.acpxRecordId;\n task.state.activeController = this.buildRuntimeTurnController(task, turn);\n this.activeControllers.set(record.acpxRecordId, task.state.activeController);\n owner.projection = undefined;\n owner.activeTurn = { task, turn };\n owner.bufferSessionUpdates = false;\n this.drainPendingSessionUpdates(owner);\n }\n\n private createTurnClient(record: SessionRecord): AcpClient {\n return this.createClient({\n agentCommand: record.agentCommand,\n agentArgv: record.agentArgv,\n cwd: record.cwd,\n mcpServers: this.resolveMcpServers({\n ...record,\n sessionKey: record.name ?? record.acpxRecordId,\n }),\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n permissionPolicy: this.options.permissionPolicy,\n onPermissionRequest: this.options.onPermissionRequest,\n elicitationModes: this.options.elicitationModes,\n processLifecycle: this.options.processLifecycle,\n processLaunchScope: {\n kind: \"runtime-session\",\n sessionKey: record.name ?? record.acpxRecordId,\n },\n verbose: this.options.verbose,\n sessionOptions: sessionOptionsFromRecord(record),\n });\n }\n\n private createRuntimeTurnCheckpoint(\n record: SessionRecord,\n conversation: ReturnType<typeof cloneSessionConversation>,\n readAcpxState: () => ReturnType<typeof cloneSessionAcpxState>,\n ): LiveSessionCheckpoint {\n return new LiveSessionCheckpoint({\n save: async () => {\n record.lastUsedAt = isoNow();\n record.acpx = readAcpxState();\n applyConversation(record, conversation);\n await this.refreshClosedState(record);\n await this.options.sessionStore.save(record);\n },\n });\n }\n\n private buildRuntimeTurnController(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): ActiveSessionController {\n return {\n hasActivePrompt: () => turn.client.hasActivePrompt(),\n requestCancelActivePrompt: async () => await this.requestRuntimeTurnCancel(task, turn),\n setSessionMode: async (modeId: string, authority) => {\n await this.waitForRuntimeControlSession(task, turn);\n await turn.client.setSessionMode(turn.activeSessionId, modeId, authority);\n const nextState = cloneSessionAcpxState(turn.acpxState) ?? {};\n nextState.desired_mode_id = modeId;\n turn.acpxState = nextState;\n },\n setSessionModel: async (modelId: string, authority) => {\n await this.waitForRuntimeControlSession(task, turn);\n const models = advertisedModelState(turn.acpxState);\n const response = await turn.client.setSessionModel(\n turn.activeSessionId,\n modelId,\n models,\n authority,\n );\n turn.acpxState = applyModelSelection(turn.acpxState, modelId, response);\n return response;\n },\n setSessionConfigOption: async (configId: string, value: string, authority) => {\n const result = await task.state.activeController!.setResolvedSessionConfigOption(\n configId,\n value,\n authority,\n );\n return result.response;\n },\n setResolvedSessionConfigOption: async (configId: string, value: string, authority) =>\n await this.setRuntimeResolvedSessionConfigOption(task, turn, configId, value, authority),\n };\n }\n\n private async waitForRuntimeControlSession(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<void> {\n if (turn.client.hasActivePrompt()) {\n return;\n }\n await task.sessionReady.promise;\n }\n\n private async requestRuntimeTurnCancel(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<boolean> {\n if (turn.client.hasActivePrompt()) {\n return await turn.client.requestCancelActivePrompt();\n }\n if (!task.state.turnActive) {\n return false;\n }\n task.state.pendingCancel = true;\n return true;\n }\n\n private async setRuntimeResolvedSessionConfigOption(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n configId: string,\n value: string,\n authority?: AcpControlAuthority,\n ): Promise<{\n configId: string;\n response: Awaited<ReturnType<AcpClient[\"setSessionConfigOption\"]>>;\n }> {\n await this.waitForRuntimeControlSession(task, turn);\n const resolvedConfigId = resolveSupportedConfigOptionId(\n {\n ...turn.record,\n acpx: turn.acpxState ?? undefined,\n },\n configId,\n );\n // Notifications can remove the model control before the setter resolves.\n const modelConfigId = advertisedModelState(turn.acpxState)?.configId;\n const response = await turn.client.setSessionConfigOption(\n turn.activeSessionId,\n resolvedConfigId,\n value,\n authority,\n );\n turn.acpxState = applyConfigOptionSelection(\n turn.acpxState,\n resolvedConfigId,\n value,\n response,\n modelConfigId,\n );\n return { configId: resolvedConfigId, response };\n }\n\n private emitRuntimeTurnEvent(task: RuntimeTurnTask, payload: Record<string, unknown>): void {\n const parsed = parsePromptEventLine(JSON.stringify(payload));\n if (!parsed) {\n return;\n }\n task.queue.push(parsed);\n }\n\n private async connectRuntimeTurn(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<ConnectAndLoadSessionResult> {\n if (turn.connected) {\n return { sessionId: turn.record.acpSessionId, resumed: false, loadError: undefined };\n }\n const loaded = await this.connectRuntimeTurnClient(task, turn);\n turn.acpxState = cloneSessionAcpxState(turn.record.acpx);\n turn.connected = true;\n return loaded;\n }\n\n private async connectRuntimeTurnClient(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<ConnectAndLoadSessionResult> {\n return await connectAndLoadSession({\n client: turn.client,\n record: turn.record,\n resumePolicy: resumePolicyForSessionMode(task.input.sessionMode),\n timeoutMs: this.options.timeoutMs,\n activeController: task.state.activeController!,\n onClientAvailable: () => this.publishRuntimeTurnController(task, turn),\n onConnectedRecord: (connectedRecord) => {\n connectedRecord.lastPromptAt = isoNow();\n },\n onSessionIdResolved: (sessionIdValue) => {\n turn.activeSessionId = sessionIdValue;\n },\n });\n }\n\n private publishRuntimeTurnController(task: RuntimeTurnTask, turn: RunningRuntimeTurn): void {\n const controller = task.state.activeController;\n if (controller) {\n this.activeControllers.set(turn.record.acpxRecordId, controller);\n }\n }\n\n private async resolveRuntimeTurnReady(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<void> {\n task.sessionReady.resolve();\n turn.record.lastRequestId = task.input.requestId;\n turn.record.lastPromptAt = isoNow();\n turn.record.closed = false;\n turn.record.closedAt = undefined;\n turn.record.lastUsedAt = isoNow();\n await turn.liveCheckpoint.checkpoint();\n }\n\n private cancelRuntimeTurnBeforePrompt(task: RuntimeTurnTask): boolean {\n if (!task.state.pendingCancel && !task.input.signal?.aborted) {\n return false;\n }\n task.state.pendingCancel = false;\n task.promptStarted.reject(new Error(\"ACP turn cancelled before prompt submission.\"));\n return true;\n }\n\n private async applyPendingRuntimeTurnCancel(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<boolean> {\n if (!task.state.pendingCancel || !turn.client.hasActivePrompt()) {\n return false;\n }\n const cancelled = await turn.client.requestCancelActivePrompt();\n if (cancelled) {\n task.state.pendingCancel = false;\n }\n return cancelled;\n }\n\n private async saveCompletedRuntimeTurn(turn: RunningRuntimeTurn): Promise<void> {\n turn.record.acpSessionId = turn.activeSessionId;\n reconcileAgentSessionId(turn.record, turn.record.agentSessionId);\n turn.record.protocolVersion = turn.client.initializeResult?.protocolVersion;\n turn.record.agentCapabilities = turn.client.initializeResult?.agentCapabilities;\n turn.record.acpx = turn.acpxState;\n applyConversation(turn.record, turn.conversation);\n applyLifecycleSnapshotToRecord(turn.record, turn.client.getAgentLifecycleSnapshot());\n await this.options.sessionStore.save(turn.record);\n }\n\n private failRuntimeTurn(task: RuntimeTurnTask, error: unknown): AcpRuntimeTurnResult {\n task.promptStarted.reject(error);\n task.sessionReady.reject(error);\n const normalized = normalizeOutputError(error, { origin: \"runtime\" });\n return {\n status: \"failed\",\n error: {\n message: normalized.message,\n ...(normalized.code ? { code: normalized.code } : {}),\n ...(normalized.detailCode ? { detailCode: normalized.detailCode } : {}),\n ...(normalized.retryable !== undefined ? { retryable: normalized.retryable } : {}),\n },\n };\n }\n\n private async finalizeRuntimeTurn(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn | undefined,\n ): Promise<void> {\n task.state.turnActive = false;\n const abortHandlerAttempt = await settleAttempt(() =>\n task.input.signal?.removeEventListener(\"abort\", task.abortHandler),\n );\n const recordAttempt = await settleAttempt(async () =>\n turn ? await this.finalizeRuntimeTurnRecord(turn) : false,\n );\n let failure = firstFailedAttempt([abortHandlerAttempt, recordAttempt]);\n let pooled = recordAttempt.ok ? recordAttempt.value : false;\n if (failure) {\n this.discardRetainedRuntimeTurnOwner(turn);\n pooled = false;\n }\n const closeAttempt = await settleAttempt(async () => this.closeRuntimeTurnClient(turn, pooled));\n this.cleanupRuntimeTurn(task, turn);\n failure ??= firstFailedAttempt([closeAttempt]);\n if (failure) {\n throw failure.error;\n }\n }\n\n private discardRetainedRuntimeTurnOwner(turn: RunningRuntimeTurn | undefined): void {\n if (turn) {\n this.removeRetainedSessionOwner(turn.owner);\n turn.owner.activeTurn = undefined;\n }\n }\n\n private async closeRuntimeTurnClient(\n turn: RunningRuntimeTurn | undefined,\n pooled: boolean,\n ): Promise<void> {\n if (!turn || pooled) {\n return;\n }\n turn.owner.activeTurn = undefined;\n const clearAttempt = await settleAttempt(() => turn.client.clearEventHandlers());\n const closeAttempt = await settleAttempt(async () => this.closeClient(turn.client));\n const failure = firstFailedAttempt([clearAttempt, closeAttempt]);\n if (failure) {\n this.retiringSessionOwners.add(turn.owner);\n throw failure.error;\n }\n }\n\n private cleanupRuntimeTurn(task: RuntimeTurnTask, turn: RunningRuntimeTurn | undefined): void {\n if (turn) {\n this.activeControllers.delete(turn.record.acpxRecordId);\n this.closingActiveRecords.delete(turn.record.acpxRecordId);\n }\n task.queue.close();\n }\n\n private async finalizeRuntimeTurnRecord(turn: RunningRuntimeTurn): Promise<boolean> {\n if (!turn.connected) {\n turn.acpxState = cloneSessionAcpxState(turn.record.acpx);\n }\n applyLifecycleSnapshotToRecord(turn.record, turn.client.getAgentLifecycleSnapshot());\n turn.record.acpx = turn.acpxState;\n applyConversation(turn.record, turn.conversation);\n turn.record.lastUsedAt = isoNow();\n await turn.liveCheckpoint.flush();\n const closed = await this.refreshClosedState(turn.record);\n await this.options.sessionStore.save(turn.record);\n // A loaded transport is not reusable until preference reconciliation succeeds.\n if (closed || !turn.connected) {\n return false;\n }\n return await this.retainPersistentSessionOwnerAfterTurn({\n record: turn.record,\n owner: turn.owner,\n conversation: turn.conversation,\n acpxState: turn.acpxState,\n });\n }\n\n async *runTurn(input: {\n handle: AcpRuntimeHandle;\n text: string;\n attachments?: AcpRuntimeTurnAttachment[];\n mode: AcpRuntimePromptMode;\n sessionMode: \"persistent\" | \"oneshot\";\n requestId: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n onElicitation?: AcpElicitationHandler;\n onPermissionRequest?: AcpPermissionHandler;\n }): AsyncIterable<AcpRuntimeEvent> {\n const turn = this.startTurn(input);\n yield* turn.events;\n yield legacyTerminalEventFromTurnResult(await turn.result);\n }\n\n getStatus(handle: AcpRuntimeHandle): Promise<AcpRuntimeStatus> {\n this.assertOpen();\n return this.trackTask(this.readStatus(handle));\n }\n\n private async readStatus(handle: AcpRuntimeHandle): Promise<AcpRuntimeStatus> {\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n const owner = this.retainedSessionOwners.get(recordId);\n if (owner) {\n await this.flushSessionOwner(owner);\n }\n const record = await this.requireRecord(recordId);\n return runtimeStatusFromRecord(record);\n }\n\n async setMode(\n handle: AcpRuntimeHandle,\n mode: string,\n sessionMode: \"persistent\" | \"oneshot\" = \"persistent\",\n authority?: AcpControlAuthority,\n ): Promise<void> {\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n await this.withManagerLock(\n this.runtimeOperationLocks,\n recordId,\n async () => this.setModeWithOwnership(handle, mode, sessionMode, authority),\n authority,\n );\n }\n\n private async setModeWithOwnership(\n handle: AcpRuntimeHandle,\n mode: string,\n sessionMode: \"persistent\" | \"oneshot\",\n authority?: AcpControlAuthority,\n ): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n assertControlAuthority(authority);\n const controller = this.activeControllers.get(record.acpxRecordId);\n let targetRecord = record;\n if (controller) {\n await controller.setSessionMode(mode, authority);\n } else {\n const result = await this.withRuntimeControlSession(\n record,\n sessionMode,\n async ({ client, sessionId }) => {\n await client.setSessionMode(sessionId, mode, authority);\n },\n undefined,\n authority,\n );\n targetRecord = result.record;\n }\n setDesiredModeId(targetRecord, mode);\n await this.options.sessionStore.save(targetRecord);\n }\n\n async setModel(\n handle: AcpRuntimeHandle,\n model: string,\n sessionMode: \"persistent\" | \"oneshot\" = \"persistent\",\n authority?: AcpControlAuthority,\n ): Promise<void> {\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n await this.withManagerLock(\n this.runtimeOperationLocks,\n recordId,\n async () => this.setModelWithOwnership(handle, model, sessionMode, authority),\n authority,\n );\n }\n\n private async setModelWithOwnership(\n handle: AcpRuntimeHandle,\n model: string,\n sessionMode: \"persistent\" | \"oneshot\",\n authority?: AcpControlAuthority,\n ): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n assertControlAuthority(authority);\n const controller = this.activeControllers.get(record.acpxRecordId);\n if (controller) {\n const response = await controller.setSessionModel(model, authority);\n record.acpx = applyModelSelection(record.acpx, model, response);\n await this.options.sessionStore.save(record);\n return;\n }\n const result = await this.withRuntimeControlSession(\n record,\n sessionMode,\n async ({ client, sessionId, record: connectedRecord }) => {\n const response = await client.setSessionModel(\n sessionId,\n model,\n advertisedModelState(connectedRecord.acpx),\n authority,\n );\n connectedRecord.acpx = applyModelSelection(connectedRecord.acpx, model, response);\n },\n { key: \"model\" },\n authority,\n );\n await this.options.sessionStore.save(result.record);\n }\n\n async setConfigOption(\n handle: AcpRuntimeHandle,\n key: string,\n value: string,\n sessionMode: \"persistent\" | \"oneshot\" = \"persistent\",\n authority?: AcpControlAuthority,\n ): Promise<SetSessionConfigOptionResponse> {\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n return await this.withManagerLock(\n this.runtimeOperationLocks,\n recordId,\n async () => this.setConfigOptionWithOwnership(handle, key, value, sessionMode, authority),\n authority,\n );\n }\n\n private async setConfigOptionWithOwnership(\n handle: AcpRuntimeHandle,\n key: string,\n value: string,\n sessionMode: \"persistent\" | \"oneshot\",\n authority?: AcpControlAuthority,\n ): Promise<SetSessionConfigOptionResponse> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n assertControlAuthority(authority);\n const controller = this.activeControllers.get(record.acpxRecordId);\n if (controller) {\n const { configId, response } = await controller.setResolvedSessionConfigOption(\n key,\n value,\n authority,\n );\n record.acpx = applyConfigOptionSelection(record.acpx, configId, value, response);\n await this.options.sessionStore.save(record);\n return response;\n }\n\n const result = await this.withRuntimeControlSession(\n record,\n sessionMode,\n async ({ client, sessionId, record: connectedRecord }) => {\n const configId = resolveSupportedConfigOptionId(connectedRecord, key);\n const modelConfigId = advertisedModelState(connectedRecord.acpx)?.configId;\n const response = await client.setSessionConfigOption(sessionId, configId, value, authority);\n connectedRecord.acpx = applyConfigOptionSelection(\n connectedRecord.acpx,\n configId,\n value,\n response,\n modelConfigId,\n );\n return response;\n },\n { key, resolve: (connectedRecord) => resolveSupportedConfigOptionId(connectedRecord, key) },\n authority,\n );\n await this.options.sessionStore.save(result.record);\n return result.value;\n }\n\n async cancel(handle: AcpRuntimeHandle): Promise<void> {\n const controller = this.activeControllers.get(handle.acpxRecordId ?? handle.sessionKey);\n await controller?.requestCancelActivePrompt();\n }\n\n prepareFreshSession(handle: AcpRuntimeHandle): Promise<void> {\n this.assertOpen();\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n const cancelled = this.cancelSessionTasks(recordId);\n void cancelled.catch(() => {});\n return this.queueSessionTask(recordId, async () => {\n const tasks = await cancelled;\n await Promise.all(tasks.map((task) => task.completion));\n return await this.withManagerLock(this.runtimeOperationLocks, recordId, async () =>\n this.closeRuntimeSession(handle, \"prepare-fresh\"),\n );\n });\n }\n\n close(\n handle: AcpRuntimeHandle,\n options: { discardPersistentState?: boolean } = {},\n ): Promise<void> {\n this.assertOpen();\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n return this.trackTask(\n this.withManagerLock(this.runtimeOperationLocks, recordId, async () => {\n return await this.closeRuntimeSession(\n handle,\n options.discardPersistentState === true ? \"discard\" : \"release\",\n );\n }),\n );\n }\n\n private async closeRuntimeSession(\n handle: AcpRuntimeHandle,\n intent: \"release\" | \"prepare-fresh\" | \"discard\",\n ): Promise<void> {\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n await this.retrySessionCleanup(recordId);\n const record = await this.resolveRuntimeRecordForClose(recordId);\n this.markActiveRuntimeRecordClosing(record);\n if (intent !== \"prepare-fresh\") {\n await this.cancelSessionTasks(recordId);\n }\n await this.closeRuntimeRecordOwnership(record, intent);\n record.closed = true;\n record.closedAt = isoNow();\n await this.options.sessionStore.save(record);\n }\n\n private async resolveRuntimeRecordForClose(recordId: string): Promise<SessionRecord> {\n const retainedOwner = this.retainedSessionOwners.get(recordId);\n if (retainedOwner) {\n await this.flushSessionOwner(retainedOwner);\n }\n return retainedOwner?.projection?.record ?? (await this.requireRecord(recordId));\n }\n\n private markActiveRuntimeRecordClosing(record: SessionRecord): void {\n if (this.activeControllers.has(record.acpxRecordId)) {\n this.closingActiveRecords.add(record.acpxRecordId);\n }\n }\n\n private async closeRuntimeRecordOwnership(\n record: SessionRecord,\n intent: \"release\" | \"prepare-fresh\" | \"discard\",\n ): Promise<void> {\n if (intent === \"discard\") {\n await this.closeBackendSession(record);\n } else if (intent === \"prepare-fresh\") {\n const owner = this.retainedSessionOwners.get(record.acpxRecordId);\n if (owner) {\n this.removeRetainedSessionOwner(owner);\n this.retiringSessionOwners.add(owner);\n }\n await this.retrySessionCleanup(record.acpxRecordId);\n } else {\n await this.closeRetainedSessionOwner(record.acpxRecordId);\n }\n if (intent !== \"release\") {\n record.acpx = {\n ...record.acpx,\n reset_on_next_ensure: true,\n };\n }\n }\n\n private async closeBackendSession(record: SessionRecord): Promise<void> {\n const connection = await this.acquireBackendCloseConnection(record);\n\n try {\n await this.requestBackendSessionClose(record, connection);\n } catch (error) {\n this.handleBackendSessionCloseError(record, error);\n } finally {\n await this.finalizeSessionConnection(connection);\n }\n }\n\n private async finalizeSessionConnection(connection: {\n client: AcpClient;\n owner?: RuntimeSessionOwner;\n }): Promise<void> {\n const flushAttempt = await settleAttempt(async () => {\n if (connection.owner) {\n await this.flushSessionOwner(connection.owner);\n }\n });\n const clearAttempt = await settleAttempt(() => connection.owner?.client.clearEventHandlers());\n const closeAttempt = await settleAttempt(async () => this.closeClient(connection.client));\n const failure = firstFailedAttempt([flushAttempt, clearAttempt, closeAttempt]);\n if (failure) {\n throw failure.error;\n }\n }\n\n private async acquireBackendCloseConnection(record: SessionRecord): Promise<{\n client: AcpClient;\n owner?: RuntimeSessionOwner;\n }> {\n const owner = await this.readRetainedSessionOwner(record, { consume: true });\n if (owner) {\n return { client: owner.client, owner };\n }\n return {\n client: this.createTurnClient(record),\n };\n }\n\n private async requestBackendSessionClose(\n record: SessionRecord,\n connection: { client: AcpClient; owner?: RuntimeSessionOwner },\n ): Promise<void> {\n if (!connection.owner) {\n await withTimeout(connection.client.start(), this.options.timeoutMs);\n }\n if (!connection.client.supportsCloseSession()) {\n throw new AcpRuntimeError(\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n `Agent does not support session/close for ${record.acpxRecordId}.`,\n );\n }\n await withTimeout(connection.client.closeSession(record.acpSessionId), this.options.timeoutMs);\n }\n\n private handleBackendSessionCloseError(record: SessionRecord, error: unknown): void {\n if (isAcpResourceNotFoundError(error)) {\n return;\n }\n if (isUnsupportedSessionCloseError(error)) {\n throw new AcpRuntimeError(\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n `Agent does not support session/close for ${record.acpxRecordId}.`,\n { cause: error },\n );\n }\n throw error;\n }\n\n private async requireRecord(sessionId: string): Promise<SessionRecord> {\n const record = await this.options.sessionStore.load(sessionId);\n if (!record) {\n throw new Error(`ACP session not found: ${sessionId}`);\n }\n return record;\n }\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { assertPersistedKeyPolicy } from \"../../persisted-key-policy.js\";\nimport { parseSessionRecord } from \"../../session/persistence/parse.js\";\nimport { serializeSessionRecordForDisk } from \"../../session/persistence/serialize.js\";\nimport { writePrivateJsonFile } from \"../../state-files.js\";\nimport type { AcpFileSessionStoreOptions, AcpSessionRecord, AcpSessionStore } from \"./contract.js\";\n\nfunction safeSessionId(sessionId: string): string {\n return encodeURIComponent(sessionId);\n}\n\nclass FileSessionStore implements AcpSessionStore {\n constructor(private readonly stateDir: string) {}\n\n private get sessionDir(): string {\n return path.join(this.stateDir, \"sessions\");\n }\n\n private filePath(sessionId: string): string {\n return path.join(this.sessionDir, `${safeSessionId(sessionId)}.json`);\n }\n\n private async ensureDir(): Promise<void> {\n await fs.mkdir(this.sessionDir, { recursive: true, mode: 0o700 });\n }\n\n async load(sessionId: string): Promise<AcpSessionRecord | undefined> {\n await this.ensureDir();\n let payload: string;\n try {\n payload = await fs.readFile(this.filePath(sessionId), \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(payload);\n } catch {\n return undefined;\n }\n return parseSessionRecord(parsed) ?? undefined;\n }\n\n async save(record: AcpSessionRecord): Promise<void> {\n const persisted = serializeSessionRecordForDisk(record);\n assertPersistedKeyPolicy(persisted);\n\n await writePrivateJsonFile(this.filePath(record.acpxRecordId), persisted);\n }\n}\n\nexport function createFileSessionStore(options: AcpFileSessionStoreOptions): AcpSessionStore {\n return new FileSessionStore(path.resolve(options.stateDir));\n}\n","import type { AcpRuntimeHandle } from \"./contract.js\";\nimport type { AcpxHandleState } from \"./shared.js\";\nimport { asOptionalString } from \"./shared.js\";\n\nconst ACPX_RUNTIME_HANDLE_PREFIX = \"acpx:v2:\";\n\nexport function encodeAcpxRuntimeHandleState(state: AcpxHandleState): string {\n const payload = Buffer.from(JSON.stringify(state), \"utf8\").toString(\"base64url\");\n return `${ACPX_RUNTIME_HANDLE_PREFIX}${payload}`;\n}\n\nexport function decodeAcpxRuntimeHandleState(runtimeSessionName: string): AcpxHandleState | null {\n const trimmed = runtimeSessionName.trim();\n if (!trimmed.startsWith(ACPX_RUNTIME_HANDLE_PREFIX)) {\n return null;\n }\n try {\n const raw = Buffer.from(trimmed.slice(ACPX_RUNTIME_HANDLE_PREFIX.length), \"base64url\").toString(\n \"utf8\",\n );\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const name = asOptionalString(parsed.name);\n const agent = asOptionalString(parsed.agent);\n const cwd = asOptionalString(parsed.cwd);\n const mode = asOptionalString(parsed.mode);\n if (!name || !agent || !cwd || (mode !== \"persistent\" && mode !== \"oneshot\")) {\n return null;\n }\n return {\n name,\n agent,\n cwd,\n mode,\n acpxRecordId: asOptionalString(parsed.acpxRecordId),\n backendSessionId: asOptionalString(parsed.backendSessionId),\n agentSessionId: asOptionalString(parsed.agentSessionId),\n };\n } catch {\n return null;\n }\n}\n\nexport function writeHandleState(handle: AcpRuntimeHandle, state: AcpxHandleState): void {\n handle.runtimeSessionName = encodeAcpxRuntimeHandleState(state);\n handle.cwd = state.cwd;\n handle.acpxRecordId = state.acpxRecordId;\n handle.backendSessionId = state.backendSessionId;\n handle.agentSessionId = state.agentSessionId;\n}\n","import path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { normalizeAgentCommandInput } from \"../acp/client-process.js\";\nimport { normalizeOutputError } from \"../acp/error-normalization.js\";\nimport { createAgentRegistry, type AcpAgentRegistry } from \"../agent-registry.js\";\nimport { textPrompt } from \"../prompt-content.js\";\nimport { DISCARD_OUTPUT_FORMATTER } from \"../session/execution/discard-output.js\";\nimport { sendSession } from \"../session/execution/queue-owner-runtime.js\";\nimport { closeSession, cancelSessionPrompt } from \"../session/execution/session-control.js\";\nimport { ensureSession } from \"../session/execution/session-management.js\";\nimport { findSession, readSessionRecord, resolveSessionRecord } from \"../session/persistence.js\";\nimport { tryCancelOnRunningOwner } from \"../session/queue/ipc.js\";\nimport { watchSession } from \"../session/watch.js\";\nimport type {\n AuthPolicy,\n NonInteractivePermissionPolicy,\n PermissionMode,\n PermissionPolicy,\n SessionRecord,\n} from \"../types.js\";\nimport { runtimeStatusFromRecord } from \"./engine/status.js\";\nimport {\n AsyncEventQueue,\n createDeferred,\n legacyTerminalEventFromTurnResult,\n toPromptInput,\n} from \"./engine/turn.js\";\nimport type {\n AcpRuntimeEnsureInput,\n AcpRuntimeHandle,\n AcpRuntimeTurn,\n AcpRuntimeTurnInput,\n AcpRuntimeTurnResult,\n} from \"./public/contract.js\";\nimport { AcpRuntimeError } from \"./public/errors.js\";\nimport { parsePromptEventLine } from \"./public/events.js\";\n\nexport type SharedAcpRuntimeOptions = {\n cwd: string;\n agentRegistry?: AcpAgentRegistry;\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n permissionPolicy?: PermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n timeoutMs?: number;\n ttlMs?: number;\n};\n\nconst SHARED_BACKEND = \"acpx-shared\";\n\nfunction invalidOption(message: string): never {\n throw new AcpRuntimeError(\"ACP_INVALID_RUNTIME_OPTION\", message);\n}\n\nfunction sharedHandle(record: SessionRecord): AcpRuntimeHandle {\n return {\n backend: SHARED_BACKEND,\n sessionKey: record.name ?? \"\",\n runtimeSessionName: record.acpxRecordId,\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n cwd: record.cwd,\n };\n}\n\nfunction sharedRecordId(handle: AcpRuntimeHandle): string {\n if (handle.backend !== SHARED_BACKEND || !handle.acpxRecordId) {\n return invalidOption(\"A shared runtime requires a handle from a shared session.\");\n }\n return handle.acpxRecordId;\n}\n\nfunction turnFailure(error: unknown): AcpRuntimeTurnResult {\n const normalized = normalizeOutputError(error, { defaultCode: \"RUNTIME\", origin: \"queue\" });\n if (normalized.detailCode === \"QUEUE_REQUEST_CANCELLED\") {\n return { status: \"cancelled\", stopReason: \"cancelled\" };\n }\n return {\n status: \"failed\",\n error: {\n message: normalized.message,\n code: normalized.code,\n detailCode: normalized.detailCode,\n retryable: normalized.retryable,\n },\n };\n}\n\n/** A client of the CLI's local session owner. Shutdown detaches this client. */\nexport class SharedAcpRuntime {\n private readonly registry: AcpAgentRegistry;\n private readonly options: SharedAcpRuntimeOptions;\n private readonly disconnect = new AbortController();\n private readonly pending = new Set<Promise<unknown>>();\n\n constructor(options: SharedAcpRuntimeOptions) {\n for (const name of [\n \"sessionStore\",\n \"agentProcessEnv\",\n \"mcpServers\",\n \"processLifecycle\",\n \"onPermissionRequest\",\n \"elicitationModes\",\n ]) {\n if (Object.hasOwn(options, name)) {\n invalidOption(\n `${name} belongs to the in-process runtime and is not supported by shared sessions.`,\n );\n }\n }\n this.options = {\n ...options,\n cwd: path.resolve(options.cwd),\n authCredentials: options.authCredentials ? { ...options.authCredentials } : undefined,\n };\n this.registry = options.agentRegistry ?? createAgentRegistry();\n }\n\n private assertOpen(): void {\n if (this.disconnect.signal.aborted) {\n throw new AcpRuntimeError(\"ACP_BACKEND_UNAVAILABLE\", \"Shared ACP runtime is shut down.\");\n }\n }\n\n private track<T>(task: Promise<T>): Promise<T> {\n this.pending.add(task);\n void task.then(\n () => this.pending.delete(task),\n () => this.pending.delete(task),\n );\n return task;\n }\n\n private sessionOptions(input: { sessionKey: string; agent: string; cwd?: string }) {\n if (!input.agent.trim()) {\n invalidOption(\"ACP agent id is required.\");\n }\n return {\n ...normalizeAgentCommandInput(this.registry.resolve(input.agent)),\n cwd: path.resolve(input.cwd ?? this.options.cwd),\n name: input.sessionKey.trim() || undefined,\n };\n }\n\n async findSession(input: {\n sessionKey: string;\n agent: string;\n cwd?: string;\n }): Promise<AcpRuntimeHandle | undefined> {\n this.assertOpen();\n const record = await findSession(this.sessionOptions(input));\n return record ? sharedHandle(record) : undefined;\n }\n\n ensureSession(input: AcpRuntimeEnsureInput): Promise<AcpRuntimeHandle> {\n this.assertOpen();\n if (input.mode !== \"persistent\") {\n invalidOption(\n \"Shared sessions require persistent mode; use the in-process runtime for oneshot sessions.\",\n );\n }\n const session = this.sessionOptions(input);\n return this.track(\n ensureSession({\n ...this.options,\n ...session,\n walkBoundary: session.cwd,\n sessionOptions: input.sessionOptions,\n resumeSessionId: input.resumeSessionId,\n handleProcessInterrupts: false,\n signal: this.disconnect.signal,\n }).then(({ record }) => {\n this.assertOpen();\n return sharedHandle(record);\n }),\n );\n }\n\n startTurn(input: AcpRuntimeTurnInput): AcpRuntimeTurn {\n this.assertOpen();\n if (input.mode !== \"prompt\" || input.onPermissionRequest || input.onElicitation) {\n invalidOption(\n \"Shared turns support prompt mode and the client's static permission policy; in-process callbacks and steering are unsupported.\",\n );\n }\n if (!input.requestId.trim()) {\n invalidOption(\"A shared turn requires a requestId.\");\n }\n const sessionId = sharedRecordId(input.handle);\n const prompt = toPromptInput(input.text, input.attachments);\n const events = new AsyncEventQueue();\n const promptStarted = createDeferred<void>();\n void promptStarted.promise.catch(() => {});\n let accepted = false;\n let settled = false;\n let cancelRequested = input.signal?.aborted === true;\n let cancellation: Promise<void> | undefined;\n const cancel = async (): Promise<void> => {\n cancelRequested = true;\n if (!accepted || settled) {\n return;\n }\n cancellation ??= tryCancelOnRunningOwner({\n sessionId,\n targetRequestId: input.requestId,\n }).then(() => {});\n await cancellation;\n };\n const onAbort = () => {\n void cancel().catch(() => {});\n };\n input.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n const run = async (): Promise<AcpRuntimeTurnResult> => {\n if (cancelRequested) {\n return { status: \"cancelled\", stopReason: \"cancelled\" };\n }\n const record = await resolveSessionRecord(sessionId);\n if (record.closed) {\n throw new AcpRuntimeError(\n \"ACP_SESSION_INIT_FAILED\",\n \"Shared session is closed; ensure it again before submitting a turn.\",\n );\n }\n if (cancelRequested) {\n return { status: \"cancelled\", stopReason: \"cancelled\" };\n }\n const result = await sendSession({\n ...this.options,\n sessionId,\n requestId: input.requestId,\n prompt: typeof prompt === \"string\" ? textPrompt(prompt) : prompt,\n resumePolicy: \"same-session-only\",\n requireSharedRuntime: true,\n signal: this.disconnect.signal,\n timeoutMs: input.timeoutMs ?? this.options.timeoutMs,\n queueOwnerArgs: [fileURLToPath(import.meta.resolve(\"acpx/dist/cli.js\")), \"__queue-owner\"],\n onQueueAccepted: () => {\n accepted = true;\n if (cancelRequested) {\n void cancel().catch(() => {});\n }\n },\n onPromptStarted: () => promptStarted.resolve(),\n outputFormatter: {\n ...DISCARD_OUTPUT_FORMATTER,\n onAcpMessage: (message) => {\n const event = parsePromptEventLine(JSON.stringify(message));\n if (event) {\n events.push(event);\n }\n },\n },\n errorEmissionPolicy: { queueErrorAlreadyEmitted: false },\n waitForCompletion: true,\n });\n if (\"queued\" in result) {\n throw new AcpRuntimeError(\n \"ACP_TURN_FAILED\",\n \"Shared turn ended without a completion result.\",\n );\n }\n return {\n status: result.stopReason === \"cancelled\" ? \"cancelled\" : \"completed\",\n stopReason: result.stopReason,\n _meta: result._meta,\n };\n };\n const result = this.track(\n run()\n .catch(turnFailure)\n .finally(() => {\n settled = true;\n promptStarted.reject(\n new AcpRuntimeError(\"ACP_TURN_FAILED\", \"Turn settled before its prompt was written.\"),\n );\n input.signal?.removeEventListener(\"abort\", onAbort);\n events.close();\n }),\n );\n return {\n requestId: input.requestId,\n promptStarted: promptStarted.promise,\n events: events.iterate(),\n result,\n cancel,\n closeStream: async () => {\n events.clear();\n events.close();\n },\n };\n }\n\n async *runTurn(input: AcpRuntimeTurnInput) {\n const turn = this.startTurn(input);\n yield* turn.events;\n yield legacyTerminalEventFromTurnResult(await turn.result);\n }\n\n async getStatus(input: { handle: AcpRuntimeHandle }) {\n this.assertOpen();\n return runtimeStatusFromRecord(await resolveSessionRecord(sharedRecordId(input.handle)));\n }\n\n watchSession(input: { handle: AcpRuntimeHandle; cursor?: string; signal?: AbortSignal }) {\n this.assertOpen();\n const signal = input.signal\n ? AbortSignal.any([input.signal, this.disconnect.signal])\n : this.disconnect.signal;\n const recordId = sharedRecordId(input.handle);\n const record = readSessionRecord(recordId).then((value) => {\n if (!value || value.acpxRecordId !== recordId) {\n throw new AcpRuntimeError(\n \"ACP_SESSION_INIT_FAILED\",\n \"Shared session record is unavailable.\",\n );\n }\n return value;\n });\n void record.catch(() => {});\n return watchSession({ record, cursor: input.cursor, signal });\n }\n\n async cancel(input: { handle: AcpRuntimeHandle; reason?: string }): Promise<void> {\n this.assertOpen();\n await this.track(cancelSessionPrompt({ sessionId: sharedRecordId(input.handle) }));\n }\n\n async close(input: { handle: AcpRuntimeHandle; reason: string }): Promise<void> {\n this.assertOpen();\n await this.track(closeSession(sharedRecordId(input.handle)));\n }\n\n async shutdown(): Promise<void> {\n this.disconnect.abort(\n new AcpRuntimeError(\n \"ACP_BACKEND_UNAVAILABLE\",\n \"Shared client detached; submitted work may still be running.\",\n ),\n );\n await Promise.allSettled(this.pending);\n }\n}\n\nexport function createSharedAcpRuntime(options: SharedAcpRuntimeOptions): SharedAcpRuntime {\n return new SharedAcpRuntime(options);\n}\n","import type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { DEFAULT_AGENT_NAME } from \"./agent-registry.js\";\nimport type { AcpControlAuthority } from \"./async-control.js\";\nimport { AcpRuntimeManager } from \"./runtime/engine/manager.js\";\nimport type {\n AcpRuntime,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimeStatus,\n AcpRuntimeTurnInput,\n AcpSessionStore,\n AcpSessionRecord,\n} from \"./runtime/public/contract.js\";\nimport { AcpRuntimeError } from \"./runtime/public/errors.js\";\nimport { createFileSessionStore } from \"./runtime/public/file-session-store.js\";\nimport { decodeAcpxRuntimeHandleState, writeHandleState } from \"./runtime/public/handle-state.js\";\nimport { normalizeRuntimeDetails } from \"./runtime/public/probe.js\";\nimport { deriveAgentFromSessionKey, type AcpxHandleState } from \"./runtime/public/shared.js\";\n\nexport { DEFAULT_AGENT_NAME, createFileSessionStore };\nexport { createAgentRegistry } from \"./agent-registry.js\";\nexport type {\n AcpAgentInspection,\n AcpAgentInspectionOptions,\n AcpInspectableAgentRegistry,\n} from \"./agent-registry.js\";\nexport { AcpRuntimeError, isAcpRuntimeError } from \"./runtime/public/errors.js\";\nexport type { AcpRuntimeErrorCode } from \"./runtime/public/errors.js\";\nexport {\n REQUESTED_MODEL_UNSUPPORTED_ERROR_CODE,\n REQUESTED_MODEL_UNSUPPORTED_REASONS,\n isRequestedModelUnsupportedError,\n RequestedModelUnsupportedError,\n} from \"./acp/model-support.js\";\nexport type {\n RequestedModelUnsupportedErrorCode,\n RequestedModelUnsupportedReason,\n} from \"./acp/model-support.js\";\nexport {\n decodeAcpxRuntimeHandleState,\n encodeAcpxRuntimeHandleState,\n} from \"./runtime/public/handle-state.js\";\nexport type {\n AcpAgentRegistry,\n AcpElicitationContext,\n AcpElicitationHandler,\n AcpElicitationMode,\n AcpElicitationRequest,\n AcpElicitationResponse,\n AcpFileSessionStoreOptions,\n AcpPermissionDecision,\n AcpPermissionHandler,\n AcpPermissionRequest,\n AcpProcessExit,\n AcpProcessLaunch,\n AcpProcessLaunchScope,\n AcpProcessLifecycle,\n AcpProcessSpawnFailure,\n AcpProcessStarted,\n AcpRuntime,\n AcpRuntimeAvailableCommand,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeEvent,\n AcpTextDeltaOriginMeta,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePlanEntry,\n AcpRuntimePromptMode,\n AcpRuntimeSessionMode,\n AcpRuntimeSessionModels,\n AcpRuntimeSessionUsage,\n AcpRuntimeStatus,\n AcpRuntimeTurn,\n AcpRuntimeTurnAttachment,\n AcpRuntimeTurnInput,\n AcpRuntimeTurnResult,\n AcpRuntimeTurnResultError,\n AcpRuntimeUsageBreakdown,\n AcpRuntimeUsageCost,\n AcpSessionRecord,\n AcpSessionStore,\n AcpSessionUpdateTag,\n PermissionPolicy,\n SessionAgentOptions,\n SystemPromptOption,\n} from \"./runtime/public/contract.js\";\n\nexport const ACPX_BACKEND_ID = \"acpx\";\n\nexport { createSharedAcpRuntime, SharedAcpRuntime } from \"./runtime/shared.js\";\nexport type { SharedAcpRuntimeOptions } from \"./runtime/shared.js\";\nexport type { SessionWatchEvent, SessionWatchResult } from \"./session/journal.js\";\n\nconst ACPX_CAPABILITIES: AcpRuntimeCapabilities = {\n controls: [\n \"session/set_mode\",\n \"session/set_model\",\n \"session/set_config_option\",\n \"session/status\",\n ],\n};\n\ntype AcpxRuntimeLike = AcpRuntime & {\n probeAvailability(): Promise<void>;\n isHealthy(): boolean;\n doctor(): Promise<AcpRuntimeDoctorReport>;\n};\n\nexport class AcpxRuntime implements AcpxRuntimeLike {\n private healthy = false;\n private shutdownTask?: Promise<void>;\n private readonly probeTasks = new Set<Promise<unknown>>();\n private manager: AcpRuntimeManager | null = null;\n private managerPromise: Promise<AcpRuntimeManager> | null = null;\n\n constructor(\n private readonly options: AcpRuntimeOptions,\n private readonly testOptions?: {\n managerFactory?: (options: AcpRuntimeOptions) => AcpRuntimeManager;\n probeRunner?: (options: AcpRuntimeOptions) => Promise<{\n ok: boolean;\n message: string;\n details?: unknown[];\n }>;\n },\n ) {\n if (options.agentProcessEnv) {\n this.options = { ...options, agentProcessEnv: { ...options.agentProcessEnv } };\n }\n }\n\n isHealthy(): boolean {\n return this.healthy;\n }\n\n async probeAvailability(): Promise<void> {\n const report = await this.runProbe();\n this.healthy = report.ok;\n }\n\n async doctor(): Promise<AcpRuntimeDoctorReport> {\n const report = await this.runProbe();\n this.healthy = report.ok;\n return {\n ok: report.ok,\n code: report.ok ? undefined : \"ACP_BACKEND_UNAVAILABLE\",\n message: report.message,\n details: normalizeRuntimeDetails(report.details),\n };\n }\n\n private resolveSessionIdentity(input: { sessionKey: string; agent: string }) {\n const sessionName = input.sessionKey.trim();\n if (!sessionName) {\n throw new AcpRuntimeError(\"ACP_SESSION_INIT_FAILED\", \"ACP session key is required.\");\n }\n const agent = input.agent.trim();\n if (!agent) {\n throw new AcpRuntimeError(\"ACP_SESSION_INIT_FAILED\", \"ACP agent id is required.\");\n }\n\n return { sessionName, agent };\n }\n\n async findSession(input: {\n sessionKey: string;\n agent: string;\n }): Promise<AcpRuntimeHandle | undefined> {\n const { sessionName, agent } = this.resolveSessionIdentity(input);\n const record = await (await this.getManager()).findSession(sessionName);\n return record\n ? this.createSessionHandle(\n { sessionKey: input.sessionKey, agent, mode: \"persistent\" },\n record,\n )\n : undefined;\n }\n\n async ensureSession(input: AcpRuntimeEnsureInput): Promise<AcpRuntimeHandle> {\n const { sessionName, agent } = this.resolveSessionIdentity(input);\n const manager = await this.getManager();\n const record = await manager.ensureSession({\n sessionKey: sessionName,\n agent,\n mode: input.mode,\n cwd: input.cwd ?? this.options.cwd,\n resumeSessionId: input.resumeSessionId,\n sessionOptions: input.sessionOptions,\n });\n\n return this.createSessionHandle({ ...input, agent }, record);\n }\n\n private createSessionHandle(\n input: Pick<AcpRuntimeEnsureInput, \"sessionKey\" | \"agent\" | \"mode\">,\n record: AcpSessionRecord,\n ): AcpRuntimeHandle {\n const handle: AcpRuntimeHandle = {\n sessionKey: input.sessionKey,\n backend: ACPX_BACKEND_ID,\n runtimeSessionName: \"\",\n cwd: record.cwd,\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n };\n writeHandleState(handle, {\n name: input.sessionKey.trim(),\n agent: input.agent,\n cwd: record.cwd,\n mode: input.mode,\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n });\n return handle;\n }\n\n startTurn(input: AcpRuntimeTurnInput) {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const managerPromise = this.getManager();\n const turnPromise = managerPromise.then((manager) =>\n manager.startTurn({\n handle,\n text: input.text,\n attachments: input.attachments,\n mode: input.mode,\n sessionMode: state.mode,\n requestId: input.requestId,\n timeoutMs: input.timeoutMs,\n signal: input.signal,\n onElicitation: input.onElicitation,\n onPermissionRequest: input.onPermissionRequest,\n }),\n );\n return {\n requestId: input.requestId,\n get promptStarted() {\n return turnPromise.then((turn) => turn.promptStarted);\n },\n events: {\n async *[Symbol.asyncIterator]() {\n const turn = await turnPromise;\n yield* turn.events;\n },\n },\n get result() {\n return turnPromise.then((turn) => turn.result);\n },\n cancel(inputArgs?: { reason?: string }) {\n return turnPromise.then((turn) => turn.cancel(inputArgs));\n },\n closeStream(inputArgs?: { reason?: string }) {\n return turnPromise.then((turn) => turn.closeStream(inputArgs));\n },\n };\n }\n\n async *runTurn(input: AcpRuntimeTurnInput): AsyncIterable<AcpRuntimeEvent> {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n yield* manager.runTurn({\n handle,\n text: input.text,\n attachments: input.attachments,\n mode: input.mode,\n sessionMode: state.mode,\n requestId: input.requestId,\n timeoutMs: input.timeoutMs,\n signal: input.signal,\n onElicitation: input.onElicitation,\n onPermissionRequest: input.onPermissionRequest,\n });\n }\n\n async getCapabilities(input?: { handle?: AcpRuntimeHandle }): Promise<AcpRuntimeCapabilities> {\n if (!input?.handle) {\n return ACPX_CAPABILITIES;\n }\n\n const { handle } = this.resolveManagerHandle(input.handle);\n const record = await this.options.sessionStore.load(handle.acpxRecordId ?? handle.sessionKey);\n if (!record?.acpx?.config_options) {\n return ACPX_CAPABILITIES;\n }\n\n const configOptionKeys = Array.from(\n new Set(\n record.acpx.config_options\n .map((option) => option.id)\n .filter((id): id is string => typeof id === \"string\" && id.trim().length > 0),\n ),\n );\n\n return {\n ...ACPX_CAPABILITIES,\n ...(configOptionKeys.length > 0 ? { configOptionKeys } : {}),\n };\n }\n\n async getStatus(input: {\n handle: AcpRuntimeHandle;\n signal?: AbortSignal;\n }): Promise<AcpRuntimeStatus> {\n const { handle } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n return await manager.getStatus(handle);\n }\n\n async setMode(\n input: AcpControlAuthority & { handle: AcpRuntimeHandle; mode: string },\n ): Promise<void> {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.setMode(handle, input.mode, state.mode, input);\n }\n\n async setModel(\n input: AcpControlAuthority & { handle: AcpRuntimeHandle; model: string },\n ): Promise<void> {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.setModel(handle, input.model, state.mode, input);\n }\n\n async setConfigOption(\n input: AcpControlAuthority & {\n handle: AcpRuntimeHandle;\n key: string;\n value: string;\n },\n ): Promise<SetSessionConfigOptionResponse> {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n return await manager.setConfigOption(handle, input.key, input.value, state.mode, input);\n }\n\n async cancel(input: { handle: AcpRuntimeHandle; reason?: string }): Promise<void> {\n const { handle } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.cancel(handle);\n }\n\n async prepareFreshSession(input: { handle: AcpRuntimeHandle }): Promise<void> {\n const { handle } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.prepareFreshSession(handle);\n }\n\n async close(input: {\n handle: AcpRuntimeHandle;\n reason: string;\n discardPersistentState?: boolean;\n }): Promise<void> {\n const { handle } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.close(handle, {\n discardPersistentState: input.discardPersistentState,\n });\n }\n\n shutdown(): Promise<void> {\n if (!this.shutdownTask) {\n this.healthy = false;\n const managerShutdown = this.managerPromise?.then((manager) => manager.shutdown());\n this.shutdownTask = Promise.allSettled([managerShutdown, ...this.probeTasks]).then(\n ([manager]) => {\n if (manager.status === \"rejected\") {\n throw manager.reason;\n }\n },\n );\n }\n return this.shutdownTask;\n }\n\n private async getManager(): Promise<AcpRuntimeManager> {\n if (this.shutdownTask) {\n throw new AcpRuntimeError(\"ACP_BACKEND_UNAVAILABLE\", \"ACP runtime is shut down.\");\n }\n if (this.manager) {\n return this.manager;\n }\n if (!this.managerPromise) {\n this.managerPromise = Promise.resolve(\n this.testOptions?.managerFactory?.(this.options) ?? new AcpRuntimeManager(this.options),\n ).then((manager) => {\n this.manager = manager;\n return manager;\n });\n }\n return await this.managerPromise;\n }\n\n private async runProbe() {\n if (this.shutdownTask) {\n throw new AcpRuntimeError(\"ACP_BACKEND_UNAVAILABLE\", \"ACP runtime is shut down.\");\n }\n const probe =\n this.testOptions?.probeRunner?.(this.options) ??\n this.getManager().then((manager) => manager.probe());\n this.probeTasks.add(probe);\n try {\n const report = await probe;\n if (this.shutdownTask) {\n throw new AcpRuntimeError(\"ACP_BACKEND_UNAVAILABLE\", \"ACP runtime is shut down.\");\n }\n return report;\n } finally {\n this.probeTasks.delete(probe);\n }\n }\n\n private resolveManagerHandle(handle: AcpRuntimeHandle): {\n handle: AcpRuntimeHandle;\n state: AcpxHandleState;\n } {\n const state = this.resolveHandleState(handle);\n return {\n handle: {\n ...handle,\n acpxRecordId: state.acpxRecordId ?? handle.acpxRecordId ?? handle.sessionKey,\n },\n state,\n };\n }\n\n private resolveHandleState(handle: AcpRuntimeHandle): AcpxHandleState {\n const decoded = decodeAcpxRuntimeHandleState(handle.runtimeSessionName);\n if (decoded) {\n return {\n ...decoded,\n acpxRecordId: decoded.acpxRecordId ?? handle.acpxRecordId,\n backendSessionId: decoded.backendSessionId ?? handle.backendSessionId,\n agentSessionId: decoded.agentSessionId ?? handle.agentSessionId,\n };\n }\n\n const runtimeSessionName = handle.runtimeSessionName.trim();\n if (!runtimeSessionName) {\n throw new AcpRuntimeError(\n \"ACP_SESSION_INIT_FAILED\",\n \"Invalid embedded ACP runtime handle: runtimeSessionName is missing.\",\n );\n }\n\n return {\n name: runtimeSessionName,\n agent: deriveAgentFromSessionKey(handle.sessionKey, DEFAULT_AGENT_NAME),\n cwd: handle.cwd ?? this.options.cwd,\n mode: \"persistent\",\n acpxRecordId: handle.acpxRecordId,\n backendSessionId: handle.backendSessionId,\n agentSessionId: handle.agentSessionId,\n };\n }\n}\n\nexport function createAcpRuntime(options: AcpRuntimeOptions): AcpxRuntime {\n return new AcpxRuntime(options);\n}\n\nexport function createRuntimeStore(options: { stateDir: string }): AcpSessionStore {\n return createFileSessionStore(options);\n}\n"],"mappings":"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"}