acpx 0.13.0 → 0.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -382
- package/dist/{cli-D52eGvxU.js → cli-DJT3MRRI.js} +6 -5
- package/dist/{cli-D52eGvxU.js.map → cli-DJT3MRRI.js.map} +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +20 -13
- package/dist/cli.js.map +1 -1
- package/dist/{client-BeKvumq9.d.ts → client-CxNllqui.d.ts} +15 -3
- package/dist/client-CxNllqui.d.ts.map +1 -0
- package/dist/{flags---9OR06b.js → flags-CM2rAdBo.js} +3 -3
- package/dist/{flags---9OR06b.js.map → flags-CM2rAdBo.js.map} +1 -1
- package/dist/{flows-CYfjwbn2.js → flows-BiRKgCnW.js} +4 -4
- package/dist/{flows-CYfjwbn2.js.map → flows-BiRKgCnW.js.map} +1 -1
- package/dist/flows.d.ts +2 -2
- package/dist/flows.js +1 -1
- package/dist/{live-checkpoint-CBecfnSH.js → live-checkpoint-Gw2oGjhe.js} +445 -252
- package/dist/live-checkpoint-Gw2oGjhe.js.map +1 -0
- package/dist/{output-CzN8vLdE.js → output-DiPPprGk.js} +40 -84
- package/dist/output-DiPPprGk.js.map +1 -0
- package/dist/runtime.d.ts +107 -23
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +600 -202
- package/dist/runtime.js.map +1 -1
- package/dist/{session-options-CTdZvr68.d.ts → session-options-DwRDODlr.d.ts} +25 -3
- package/dist/session-options-DwRDODlr.d.ts.map +1 -0
- package/package.json +15 -15
- package/skills/acpx/SKILL.md +5 -1
- package/dist/client-BeKvumq9.d.ts.map +0 -1
- package/dist/live-checkpoint-CBecfnSH.js.map +0 -1
- package/dist/output-CzN8vLdE.js.map +0 -1
- package/dist/session-options-CTdZvr68.d.ts.map +0 -1
package/dist/runtime.js.map
CHANGED
|
@@ -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/engine/reuse-policy.ts","../src/runtime/engine/manager.ts","../src/runtime/public/file-session-store.ts","../src/runtime/public/handle-state.ts","../src/runtime/public/probe.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 AcpRuntimeUsageBreakdown,\n AcpRuntimeUsageCost,\n AcpSessionUpdateTag,\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 plan: planStatusText,\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 resolveTextChunk(params: {\n payload: Record<string, unknown>;\n stream: \"output\" | \"thought\";\n tag: AcpSessionUpdateTag;\n}): AcpRuntimeEvent | null {\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 };\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 };\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: (payload) => statusUpdateEvent(\"plan\", payload),\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 path from \"node:path\";\nimport type { SessionRecord } from \"../../types.js\";\n\nexport function shouldReuseExistingRecord(\n record: Pick<SessionRecord, \"cwd\" | \"agentCommand\" | \"acpSessionId\" | \"acpx\">,\n params: {\n cwd: string;\n agentCommand: 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 (params.resumeSessionId && record.acpSessionId !== params.resumeSessionId) {\n return false;\n }\n return true;\n}\n","import { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\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 { modelStateFromConfigOptions } from \"../../acp/model-support.js\";\nimport { withTimeout } from \"../../async-control.js\";\nimport { textPrompt, type PromptInput } from \"../../prompt-content.js\";\nimport {\n applyConfigOptionsToRecord,\n applyConfigOptionsToState,\n} from \"../../session/config-options.js\";\nimport {\n cloneSessionAcpxState,\n cloneSessionConversation,\n createSessionConversation,\n recordClientOperation,\n recordPromptSubmission,\n recordSessionUpdate,\n trimConversationForRuntime,\n} from \"../../session/conversation-model.js\";\nimport { defaultSessionEventLog } from \"../../session/event-log.js\";\nimport { LiveSessionCheckpoint } from \"../../session/live-checkpoint.js\";\nimport {\n clearDesiredConfigOption,\n setCurrentModelId,\n setDesiredConfigOption,\n setDesiredModelId,\n setDesiredModeId,\n syncAdvertisedModelState,\n} from \"../../session/mode-preference.js\";\nimport {\n applyRequestedModelIfAdvertised,\n currentModelIdFromSetModelResponse,\n} from \"../../session/model-application.js\";\nimport { advertisedModelState } from \"../../session/model-state.js\";\nimport type {\n ClientOperation,\n SessionRecord,\n SessionResumePolicy,\n SessionTokenUsage,\n} from \"../../types.js\";\nimport type {\n AcpRuntimeAvailableCommand,\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePromptMode,\n AcpRuntimeSessionModels,\n AcpRuntimeSessionUsage,\n AcpRuntimeStatus,\n AcpRuntimeTurnAttachment,\n AcpRuntimeTurn,\n AcpRuntimeTurnResult,\n AcpRuntimeUsageBreakdown,\n} from \"../public/contract.js\";\nimport { AcpRuntimeError } from \"../public/errors.js\";\nimport { parsePromptEventLine } from \"../public/events.js\";\nimport { withConnectedSession } from \"./connected-session.js\";\nimport {\n applyConversation,\n applyLifecycleSnapshotToRecord,\n reconcileAgentSessionId,\n} from \"./lifecycle.js\";\nimport { runPromptTurn } from \"./prompt-turn.js\";\nimport { connectAndLoadSession, type ConnectAndLoadSessionResult } from \"./reconnect.js\";\nimport { shouldReuseExistingRecord } from \"./reuse-policy.js\";\nimport {\n persistSessionOptions,\n sessionOptionsFromRecord,\n type SessionAgentOptions,\n} from \"./session-options.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\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\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 createInitialRecord(params: {\n recordId: string;\n sessionName: string;\n sessionId: string;\n agentCommand: string;\n agentArgv?: string[];\n cwd: string;\n agentSessionId?: string;\n}): SessionRecord {\n const now = isoNow();\n return {\n schema: \"acpx.session.v1\",\n acpxRecordId: params.recordId,\n acpSessionId: params.sessionId,\n agentSessionId: params.agentSessionId,\n agentCommand: params.agentCommand,\n agentArgv: params.agentArgv,\n cwd: params.cwd,\n name: params.sessionName,\n createdAt: now,\n lastUsedAt: now,\n lastSeq: 0,\n eventLog: defaultSessionEventLog(params.recordId),\n closed: false,\n closedAt: undefined,\n ...createSessionConversation(now),\n acpx: {},\n };\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 };\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 = record.acpx?.available_models;\n const currentModelId = record.acpx?.current_model_id;\n if (!available || available.length === 0) {\n return currentModelId === undefined\n ? {}\n : { models: { currentModelId, availableModelIds: [] } };\n }\n return {\n models: {\n ...(currentModelId !== undefined ? { currentModelId } : {}),\n availableModelIds: [...available],\n },\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 = trimmedField(record.name);\n if (!name) {\n return undefined;\n }\n const runtimeCommand: AcpRuntimeAvailableCommand = { name };\n const description = trimmedField(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\nfunction trimmedField(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\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 RuntimeTurnTaskState = {\n pendingCancel: boolean;\n turnActive: boolean;\n activeController: ActiveSessionController | null;\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 };\n promptInput: PromptInput | string;\n queue: AsyncEventQueue;\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 pendingClient: AcpClient | undefined;\n promptMessageId: string | undefined;\n activeSessionId: string;\n};\n\nfunction applyConfigOptionResponseToTurn(\n turn: RunningRuntimeTurn,\n response:\n | Awaited<ReturnType<AcpClient[\"setSessionConfigOption\"]>>\n | Awaited<ReturnType<AcpClient[\"setSessionModel\"]>>,\n): void {\n if (!response?.configOptions) {\n return;\n }\n turn.acpxState = applyConfigOptionsToState(turn.acpxState, response.configOptions);\n}\n\nfunction applyDesiredConfigOptionToTurn(\n turn: RunningRuntimeTurn,\n configId: string,\n value: string,\n): void {\n const nextState = cloneSessionAcpxState(turn.acpxState) ?? {};\n const modelConfigId = modelStateFromConfigOptions(nextState.config_options)?.configId;\n if (configId === modelConfigId) {\n nextState.session_options = { ...nextState.session_options, model: value };\n clearDesiredConfigOption(nextState, configId);\n } else if (configId === \"mode\") {\n nextState.desired_mode_id = value;\n } else {\n nextState.desired_config_options = {\n ...nextState.desired_config_options,\n [configId]: value,\n };\n }\n turn.acpxState = nextState;\n}\n\nfunction applyDesiredConfigOptionToRecord(\n record: SessionRecord,\n configId: string,\n value: string,\n): void {\n const modelConfigId = modelStateFromConfigOptions(record.acpx?.config_options)?.configId;\n if (configId === modelConfigId) {\n setDesiredModelId(record, value, configId);\n } else if (configId === \"mode\") {\n setDesiredModeId(record, value);\n } else {\n setDesiredConfigOption(record, configId, value);\n }\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 pendingPersistentClients = new Map<string, AcpClient>();\n private readonly closingActiveRecords = new Set<string>();\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 return this.deps.clientFactory?.(options) ?? new AcpClient(options);\n }\n\n private async readPendingPersistentClient(\n record: SessionRecord,\n options: { consume: boolean },\n ): Promise<AcpClient | undefined> {\n const pendingClient = this.pendingPersistentClients.get(record.acpxRecordId);\n if (!pendingClient) {\n return undefined;\n }\n if (!pendingClient.hasReusableSession(record.acpSessionId)) {\n this.pendingPersistentClients.delete(record.acpxRecordId);\n await pendingClient.close().catch(() => {});\n return undefined;\n }\n if (options.consume) {\n this.pendingPersistentClients.delete(record.acpxRecordId);\n }\n return pendingClient;\n }\n\n private async closePendingPersistentClient(recordId: string): Promise<void> {\n const pendingClient = this.pendingPersistentClients.get(recordId);\n if (!pendingClient) {\n return;\n }\n this.pendingPersistentClients.delete(recordId);\n await pendingClient.close().catch(() => {});\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 retainPersistentClientAfterTurn(input: {\n record: SessionRecord;\n client: AcpClient;\n }): Promise<boolean> {\n const { record, client } = input;\n const isPersistentRecord = !record.acpxRecordId.includes(\":oneshot:\");\n if (!isPersistentRecord || record.closed || !client.hasReusableSession(record.acpSessionId)) {\n return false;\n }\n const previousClient = this.pendingPersistentClients.get(record.acpxRecordId);\n this.pendingPersistentClients.set(record.acpxRecordId, client);\n if (previousClient && previousClient !== client) {\n await previousClient.close().catch(() => {});\n }\n return true;\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 ): Promise<{ value: T; record: SessionRecord }> {\n const pendingClient = await this.readPendingPersistentClient(record, { consume: false });\n if (pendingClient) {\n const value = await run({\n client: pendingClient,\n sessionId: record.acpSessionId,\n record,\n });\n record.lastUsedAt = isoNow();\n record.closed = false;\n record.closedAt = undefined;\n record.protocolVersion = pendingClient.initializeResult?.protocolVersion;\n record.agentCapabilities = pendingClient.initializeResult?.agentCapabilities;\n applyLifecycleSnapshotToRecord(record, pendingClient.getAgentLifecycleSnapshot());\n return { value, record };\n }\n\n const result = await withConnectedSession({\n sessionRecordId: record.acpxRecordId,\n loadRecord: async (sessionRecordId) => await this.requireRecord(sessionRecordId),\n saveRecord: async (connectedRecord) => await this.options.sessionStore.save(connectedRecord),\n createClient: (options) => this.createClient(options),\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n onPermissionRequest: this.options.onPermissionRequest,\n verbose: this.options.verbose,\n timeoutMs: this.options.timeoutMs,\n resumePolicy: resumePolicyForSessionMode(sessionMode),\n run,\n });\n return {\n value: result.value,\n record: result.record,\n };\n }\n async ensureSession(input: {\n sessionKey: string;\n agent: string;\n mode: \"persistent\" | \"oneshot\";\n cwd?: string;\n resumeSessionId?: string;\n sessionOptions?: SessionAgentOptions;\n }): 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 existing = await this.options.sessionStore.load(input.sessionKey);\n if (\n input.mode === \"persistent\" &&\n existing &&\n shouldReuseExistingRecord(existing, {\n cwd,\n agentCommand,\n resumeSessionId: input.resumeSessionId,\n })\n ) {\n // sessionOptions on a reused record are intentionally ignored: system\n // prompts are fixed at newSession time; callers who need a different\n // prompt must use a distinct sessionKey or close the prior record.\n existing.closed = false;\n existing.closedAt = undefined;\n this.closingActiveRecords.delete(existing.acpxRecordId);\n await this.options.sessionStore.save(existing);\n return existing;\n }\n\n const client = this.createClient({\n agentCommand,\n agentArgv,\n cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n onPermissionRequest: this.options.onPermissionRequest,\n verbose: this.options.verbose,\n sessionOptions: input.sessionOptions,\n });\n let keepClientOpen = false;\n\n try {\n await client.start();\n const session = await createOrLoadRuntimeSession(client, input.resumeSessionId, cwd);\n const record = await this.createAndSaveRuntimeRecord({\n input,\n client,\n agentCommand,\n agentArgv,\n cwd,\n session,\n });\n keepClientOpen = await this.keepPersistentClient(input.mode, record.acpxRecordId, client);\n return record;\n } finally {\n if (!keepClientOpen) {\n await client.close();\n }\n }\n }\n\n private async createAndSaveRuntimeRecord(params: {\n input: {\n sessionKey: string;\n mode: \"persistent\" | \"oneshot\";\n sessionOptions?: SessionAgentOptions;\n };\n client: AcpClient;\n agentCommand: string;\n agentArgv?: string[];\n cwd: string;\n session: CreatedRuntimeSession;\n }): Promise<SessionRecord> {\n const { input, client, agentCommand, agentArgv, cwd, session } = params;\n const record = createInitialRecord({\n recordId: createRecordId(input.sessionKey, input.mode),\n sessionName: 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 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 applyConfigOptionsToRecord(record, modelApplication.response);\n syncAdvertisedModelState(\n record,\n modelApplication.response\n ? modelStateFromConfigOptions(modelApplication.response.configOptions)\n : session.sessionResult.models,\n );\n if (modelApplication.applied) {\n setCurrentModelId(\n record,\n currentModelIdFromSetModelResponse(modelApplication.response, input.sessionOptions?.model),\n );\n }\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n persistSessionOptions(record, input.sessionOptions);\n await this.options.sessionStore.save(record);\n return record;\n }\n\n private async keepPersistentClient(\n mode: \"persistent\" | \"oneshot\",\n recordId: string,\n client: AcpClient,\n ): Promise<boolean> {\n if (mode !== \"persistent\") {\n return false;\n }\n const previousClient = this.pendingPersistentClients.get(recordId);\n this.pendingPersistentClients.set(recordId, client);\n await previousClient?.close().catch(() => {});\n return true;\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 }): AcpRuntimeTurn {\n const promptInput = toPromptInput(input.text, input.attachments);\n const queue = new AsyncEventQueue();\n const result = createDeferred<AcpRuntimeTurnResult>();\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) {\n if (input.signal.aborted) {\n closeStream();\n settleResult({\n status: \"cancelled\",\n stopReason: \"cancelled\",\n });\n return {\n requestId: input.requestId,\n events: queue.iterate(),\n result: result.promise,\n cancel: async () => {},\n closeStream: async () => {},\n };\n }\n input.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n void this.runRuntimeTurnTask({\n input,\n promptInput,\n queue,\n sessionReady,\n state,\n settleResult,\n abortHandler,\n });\n\n return {\n requestId: input.requestId,\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 runRuntimeTurnTask(task: RuntimeTurnTask): Promise<void> {\n let turn: RunningRuntimeTurn | undefined;\n try {\n turn = await this.prepareRuntimeTurn(task);\n const { sessionId, resumed, loadError } = await this.connectRuntimeTurn(task, turn);\n await this.resolveRuntimeTurnReady(task, turn, resumed, loadError);\n if (this.cancelRuntimeTurnBeforePrompt(task)) {\n return;\n }\n await this.applyPendingRuntimeTurnCancel(task, turn);\n const response = 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 });\n await this.saveCompletedRuntimeTurn(turn, response.stopReason);\n task.settleResult({\n status: response.stopReason === \"cancelled\" ? \"cancelled\" : \"completed\",\n ...(response.stopReason ? { stopReason: response.stopReason } : {}),\n });\n } catch (error) {\n this.failRuntimeTurn(task, error);\n } finally {\n await this.finalizeRuntimeTurn(task, turn);\n }\n }\n\n private async prepareRuntimeTurn(task: RuntimeTurnTask): Promise<RunningRuntimeTurn> {\n const record = await this.requireRecord(\n task.input.handle.acpxRecordId ?? task.input.handle.sessionKey,\n );\n const conversation = cloneSessionConversation(record);\n let acpxState = cloneSessionAcpxState(record.acpx);\n const promptStartedAt = isoNow();\n const promptMessageId = recordPromptSubmission(conversation, task.promptInput, promptStartedAt);\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\n const pendingClient = await this.readPendingPersistentClient(record, { consume: true });\n const client = pendingClient ?? this.createTurnClient(record);\n const turn: RunningRuntimeTurn = {\n record,\n conversation,\n acpxState,\n liveCheckpoint: this.createRuntimeTurnCheckpoint(record, conversation, () => turn.acpxState),\n client,\n pendingClient,\n promptMessageId,\n activeSessionId: record.acpSessionId,\n };\n task.state.activeController = this.buildRuntimeTurnController(task, turn);\n this.activeControllers.set(record.acpxRecordId, task.state.activeController);\n this.installRuntimeTurnEventHandlers(task, turn);\n return turn;\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.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n onPermissionRequest: this.options.onPermissionRequest,\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 applyConfigOptionResponseToTurn(turn, response);\n const nextState = cloneSessionAcpxState(turn.acpxState) ?? {};\n nextState.session_options = { ...nextState.session_options, model: modelId };\n nextState.current_model_id = currentModelIdFromSetModelResponse(response, modelId);\n clearDesiredConfigOption(nextState, models?.configId);\n turn.acpxState = nextState;\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 const response = await turn.client.setSessionConfigOption(\n turn.activeSessionId,\n resolvedConfigId,\n value,\n );\n this.applyRuntimeConfigOptionState(turn, resolvedConfigId, value, response);\n return { configId: resolvedConfigId, response };\n }\n\n private applyRuntimeConfigOptionState(\n turn: RunningRuntimeTurn,\n configId: string,\n value: string,\n response: Awaited<ReturnType<AcpClient[\"setSessionConfigOption\"]>>,\n ): void {\n applyConfigOptionResponseToTurn(turn, response);\n applyDesiredConfigOptionToTurn(turn, configId, value);\n }\n\n private installRuntimeTurnEventHandlers(task: RuntimeTurnTask, turn: RunningRuntimeTurn): void {\n turn.client.setEventHandlers({\n onSessionUpdate: (notification) => {\n turn.acpxState = recordSessionUpdate(turn.conversation, turn.acpxState, notification);\n trimConversationForRuntime(turn.conversation);\n turn.liveCheckpoint.request();\n this.emitRuntimeTurnEvent(task, {\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: notification,\n });\n },\n onClientOperation: (operation: ClientOperation) => {\n turn.acpxState = recordClientOperation(turn.conversation, turn.acpxState, operation);\n trimConversationForRuntime(turn.conversation);\n turn.liveCheckpoint.request();\n this.emitRuntimeTurnEvent(task, {\n type: \"client_operation\",\n ...operation,\n });\n },\n });\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 const loaded = turn.pendingClient\n ? { sessionId: turn.record.acpSessionId, resumed: false, loadError: undefined }\n : await this.connectRuntimeTurnClient(task, turn);\n turn.acpxState = cloneSessionAcpxState(turn.record.acpx);\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 resumed: boolean,\n loadError: string | undefined,\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 this.emitRuntimeTurnLoadStatus(task, resumed, loadError);\n }\n\n private emitRuntimeTurnLoadStatus(\n task: RuntimeTurnTask,\n resumed: boolean,\n loadError: string | undefined,\n ): void {\n if (!resumed && !loadError) {\n return;\n }\n this.emitRuntimeTurnEvent(task, {\n type: \"status\",\n text: loadError ? `session reconnect fallback: ${loadError}` : \"session resumed\",\n });\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.settleResult({\n status: \"cancelled\",\n stopReason: \"cancelled\",\n });\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(\n turn: RunningRuntimeTurn,\n _stopReason: string | undefined,\n ): 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): void {\n task.sessionReady.reject(error);\n const normalized = normalizeOutputError(error, { origin: \"runtime\" });\n task.settleResult({\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 task.input.signal?.removeEventListener(\"abort\", task.abortHandler);\n turn?.client.clearEventHandlers();\n const pooled = turn ? await this.finalizeRuntimeTurnRecord(turn) : false;\n if (!pooled) {\n await turn?.client.close().catch(() => {});\n }\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 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().catch(() => {});\n const closed = await this.refreshClosedState(turn.record);\n await this.options.sessionStore.save(turn.record).catch(() => {});\n if (closed) {\n return false;\n }\n return await this.retainPersistentClientAfterTurn({\n record: turn.record,\n client: turn.client,\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 }): AsyncIterable<AcpRuntimeEvent> {\n const turn = this.startTurn(input);\n yield* turn.events;\n yield legacyTerminalEventFromTurnResult(await turn.result);\n }\n\n async getStatus(handle: AcpRuntimeHandle): Promise<AcpRuntimeStatus> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n return {\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\n async setMode(\n handle: AcpRuntimeHandle,\n mode: string,\n sessionMode: \"persistent\" | \"oneshot\" = \"persistent\",\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 setConfigOption(\n handle: AcpRuntimeHandle,\n key: string,\n value: string,\n sessionMode: \"persistent\" | \"oneshot\" = \"persistent\",\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 { configId, response } = await controller.setResolvedSessionConfigOption(key, value);\n applyConfigOptionsToRecord(record, response);\n applyDesiredConfigOptionToRecord(record, configId, value);\n await this.options.sessionStore.save(record);\n return;\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 response = await client.setSessionConfigOption(sessionId, configId, value);\n applyConfigOptionsToRecord(connectedRecord, response);\n applyDesiredConfigOptionToRecord(connectedRecord, configId, value);\n },\n );\n await this.options.sessionStore.save(result.record);\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 async close(\n handle: AcpRuntimeHandle,\n options: { discardPersistentState?: boolean } = {},\n ): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n if (this.activeControllers.has(record.acpxRecordId)) {\n this.closingActiveRecords.add(record.acpxRecordId);\n }\n await this.cancel(handle);\n if (options.discardPersistentState) {\n await this.closeBackendSession(record);\n record.acpx = {\n ...record.acpx,\n reset_on_next_ensure: true,\n };\n } else {\n await this.closePendingPersistentClient(record.acpxRecordId);\n }\n record.closed = true;\n record.closedAt = isoNow();\n await this.options.sessionStore.save(record);\n }\n\n private async closeBackendSession(record: SessionRecord): Promise<void> {\n const pendingClient = await this.readPendingPersistentClient(record, { consume: true });\n\n const client =\n pendingClient ??\n this.createClient({\n agentCommand: record.agentCommand,\n agentArgv: record.agentArgv,\n cwd: record.cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n onPermissionRequest: this.options.onPermissionRequest,\n verbose: this.options.verbose,\n });\n\n try {\n if (!pendingClient) {\n await withTimeout(client.start(), this.options.timeoutMs);\n }\n if (!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(client.closeSession(record.acpSessionId), this.options.timeoutMs);\n } catch (error) {\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 if (isAcpResourceNotFoundError(error)) {\n return;\n }\n throw error;\n } finally {\n await client.close().catch(() => {});\n }\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 { createAtomicWriteTempPath } from \"../../session/persistence/atomic-write.js\";\nimport { parseSessionRecord } from \"../../session/persistence/parse.js\";\nimport { serializeSessionRecordForDisk } from \"../../session/persistence/serialize.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 });\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 await this.ensureDir();\n const persisted = serializeSessionRecordForDisk(record);\n assertPersistedKeyPolicy(persisted);\n\n const file = this.filePath(record.acpxRecordId);\n const tempFile = createAtomicWriteTempPath(file);\n const payload = JSON.stringify(persisted, null, 2);\n await fs.writeFile(tempFile, `${payload}\\n`, \"utf8\");\n await fs.rename(tempFile, file);\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 { 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, 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 agentCommand: ReturnType<typeof normalizeAgentCommandInput>,\n deps: ProbeRuntimeDeps,\n): AcpClient {\n const clientOptions = {\n ...agentCommand,\n cwd: options.cwd,\n mcpServers: [...(options.mcpServers ?? [])],\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n verbose: options.verbose,\n };\n return deps.clientFactory?.(clientOptions) ?? new AcpClient(clientOptions);\n}\n","import {\n DEFAULT_AGENT_NAME,\n listBuiltInAgents,\n normalizeAgentName,\n resolveCanonicalAgentName,\n resolveAgentArgv,\n resolveAgentCommand,\n} from \"./agent-registry.js\";\nimport { AcpRuntimeManager } from \"./runtime/engine/manager.js\";\nimport type {\n AcpAgentRegistry,\n AcpRuntime,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimeStatus,\n AcpRuntimeTurnInput,\n AcpSessionStore,\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, probeRuntime } from \"./runtime/public/probe.js\";\nimport { deriveAgentFromSessionKey, type AcpxHandleState } from \"./runtime/public/shared.js\";\n\nexport { DEFAULT_AGENT_NAME, createFileSessionStore };\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 AcpFileSessionStoreOptions,\n AcpPermissionDecision,\n AcpPermissionRequest,\n AcpRuntime,\n AcpRuntimeAvailableCommand,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\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 SessionAgentOptions,\n SystemPromptOption,\n} from \"./runtime/public/contract.js\";\n\nexport const ACPX_BACKEND_ID = \"acpx\";\n\nconst ACPX_CAPABILITIES: AcpRuntimeCapabilities = {\n controls: [\"session/set_mode\", \"session/set_config_option\", \"session/status\"],\n};\n\ntype AcpxRuntimeLike = AcpRuntime & {\n probeAvailability(): Promise<void>;\n isHealthy(): boolean;\n doctor(): Promise<AcpRuntimeDoctorReport>;\n};\n\nexport function createAgentRegistry(params?: {\n overrides?: Record<string, string | string[]>;\n}): AcpAgentRegistry {\n const overrides = normalizeRegistryOverrides(params?.overrides);\n return {\n resolve(agentName: string) {\n const normalizedAgentName = normalizeAgentName(agentName);\n const override =\n overrides[normalizedAgentName] ?? overrides[resolveCanonicalAgentName(agentName)];\n return override ?? resolveAgentArgv(agentName) ?? resolveAgentCommand(agentName);\n },\n list() {\n return listBuiltInAgents(overrides);\n },\n };\n}\n\nfunction normalizeRegistryOverrides(\n values: Record<string, string | string[]> | undefined,\n): Record<string, string | string[]> {\n const normalized: Record<string, string | string[]> = {};\n for (const [name, value] of Object.entries(values ?? {})) {\n const normalizedName = normalizeAgentName(name);\n if (!normalizedName) {\n continue;\n }\n const normalizedValue = normalizeRegistryOverride(value);\n if (normalizedValue) {\n normalized[normalizedName] = normalizedValue;\n }\n }\n return normalized;\n}\n\nfunction normalizeRegistryOverride(value: string | string[]): string | string[] | undefined {\n if (typeof value === \"string\") {\n return value.trim() || undefined;\n }\n return value.length > 0 && value[0]?.length ? [...value] : undefined;\n}\n\nexport class AcpxRuntime implements AcpxRuntimeLike {\n private healthy = false;\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\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 async ensureSession(input: AcpRuntimeEnsureInput): Promise<AcpRuntimeHandle> {\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 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 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: sessionName,\n 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 }),\n );\n return {\n requestId: input.requestId,\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 });\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 setConfigOption(input: {\n handle: AcpRuntimeHandle;\n key: string;\n value: string;\n }): Promise<void> {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n 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 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 private async getManager(): Promise<AcpRuntimeManager> {\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 return await (this.testOptions?.probeRunner?.(this.options) ?? probeRuntime(this.options));\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/engine/reuse-policy.ts","../src/runtime/engine/manager.ts","../src/runtime/public/file-session-store.ts","../src/runtime/public/handle-state.ts","../src/runtime/public/probe.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 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 plan: planStatusText,\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\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: (payload) => statusUpdateEvent(\"plan\", payload),\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 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 { 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 { modelStateFromConfigOptions } from \"../../acp/model-support.js\";\nimport { withTimeout } from \"../../async-control.js\";\nimport { textPrompt, type PromptInput } from \"../../prompt-content.js\";\nimport {\n applyConfigOptionsToRecord,\n applyConfigOptionSelection,\n applyModelSelection,\n} from \"../../session/config-options.js\";\nimport {\n cloneSessionAcpxState,\n cloneSessionConversation,\n createSessionConversation,\n recordClientOperation,\n recordPromptSubmission,\n recordSessionUpdate,\n trimConversationForRuntime,\n} from \"../../session/conversation-model.js\";\nimport { defaultSessionEventLog } from \"../../session/event-log.js\";\nimport { LiveSessionCheckpoint } from \"../../session/live-checkpoint.js\";\nimport {\n setCurrentModelId,\n setDesiredModeId,\n syncAdvertisedModelState,\n} from \"../../session/mode-preference.js\";\nimport {\n applyRequestedModelIfAdvertised,\n currentModelIdFromSetModelResponse,\n} from \"../../session/model-application.js\";\nimport { advertisedModelState } from \"../../session/model-state.js\";\nimport type {\n ClientOperation,\n SessionRecord,\n SessionResumePolicy,\n SessionTokenUsage,\n} from \"../../types.js\";\nimport type {\n AcpElicitationHandler,\n AcpRuntimeAvailableCommand,\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePromptMode,\n AcpRuntimeSessionModels,\n AcpRuntimeSessionUsage,\n AcpRuntimeStatus,\n AcpRuntimeTurnAttachment,\n AcpRuntimeTurn,\n AcpRuntimeTurnResult,\n AcpRuntimeUsageBreakdown,\n} from \"../public/contract.js\";\nimport { AcpRuntimeError } from \"../public/errors.js\";\nimport { parsePromptEventLine } from \"../public/events.js\";\nimport { withConnectedSession } from \"./connected-session.js\";\nimport {\n applyConversation,\n applyLifecycleSnapshotToRecord,\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\";\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 createInitialRecord(params: {\n recordId: string;\n sessionName: string;\n sessionId: string;\n agentCommand: string;\n agentArgv?: string[];\n cwd: string;\n agentSessionId?: string;\n}): SessionRecord {\n const now = isoNow();\n return {\n schema: \"acpx.session.v1\",\n acpxRecordId: params.recordId,\n acpSessionId: params.sessionId,\n agentSessionId: params.agentSessionId,\n agentCommand: params.agentCommand,\n agentArgv: params.agentArgv,\n cwd: params.cwd,\n name: params.sessionName,\n createdAt: now,\n lastUsedAt: now,\n lastSeq: 0,\n eventLog: defaultSessionEventLog(params.recordId),\n closed: false,\n closedAt: undefined,\n ...createSessionConversation(now),\n acpx: {},\n };\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 };\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 = record.acpx?.available_models;\n const currentModelId = record.acpx?.current_model_id;\n if (!available || available.length === 0) {\n return currentModelId === undefined\n ? {}\n : { models: { currentModelId, availableModelIds: [] } };\n }\n return {\n models: {\n ...(currentModelId !== undefined ? { currentModelId } : {}),\n availableModelIds: [...available],\n },\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 = trimmedField(record.name);\n if (!name) {\n return undefined;\n }\n const runtimeCommand: AcpRuntimeAvailableCommand = { name };\n const description = trimmedField(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\nfunction trimmedField(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\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 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 };\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 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 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 closingActiveRecords = new Set<string>();\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 return this.deps.clientFactory?.(options) ?? new AcpClient(options);\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 owner.client.close().catch(() => {});\n await owner.projection?.checkpoint.flush().catch(() => {});\n try {\n owner.client.clearEventHandlers();\n } catch {}\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 owner.mode === \"persistent\" &&\n !record.closed &&\n !(owner.client.hasUnresolvedPrompt?.() ?? false) &&\n owner.client.hasReusableSession(record.acpSessionId)\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 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 const result = await withConnectedSession({\n sessionRecordId: record.acpxRecordId,\n loadRecord: async (sessionRecordId) => await this.requireRecord(sessionRecordId),\n saveRecord: async (connectedRecord) => await this.options.sessionStore.save(connectedRecord),\n createClient: (options) => this.createClient(options),\n mcpServers: [...(this.options.mcpServers ?? [])],\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 }\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 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 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 let record = await this.options.sessionStore.load(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 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.options.mcpServers ?? [])],\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 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 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 client.close();\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 = createInitialRecord({\n recordId: createRecordId(input.sessionKey, input.mode),\n sessionName: 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 applyConfigOptionsToRecord(record, modelApplication.response);\n syncAdvertisedModelState(\n record,\n modelApplication.response\n ? modelStateFromConfigOptions(modelApplication.response.configOptions)\n : session.sessionResult.models,\n );\n if (modelApplication.applied) {\n setCurrentModelId(\n record,\n currentModelIdFromSetModelResponse(modelApplication.response, input.sessionOptions?.model),\n );\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 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 }): AcpRuntimeTurn {\n let promptInput: PromptInput | string;\n try {\n promptInput = toPromptInput(input.text, input.attachments);\n } catch (error) {\n void 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) {\n if (input.signal.aborted) {\n promptStarted.reject(new Error(\"ACP turn cancelled before prompt submission.\"));\n closeStream();\n void this.closeRetainedOneShotHandle(input.handle)\n .catch(() => {})\n .then(() => {\n settleResult({\n status: \"cancelled\",\n stopReason: \"cancelled\",\n });\n });\n return {\n requestId: input.requestId,\n promptStarted: promptStarted.promise,\n events: queue.iterate(),\n result: result.promise,\n cancel: async () => {},\n closeStream: async () => {},\n };\n }\n input.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n void this.runRuntimeTurnTask({\n input,\n promptInput,\n queue,\n promptStarted,\n sessionReady,\n state,\n settleResult,\n abortHandler,\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 turn = await this.prepareRuntimeTurn(task);\n const { sessionId, resumed, loadError } = await this.connectRuntimeTurn(task, turn);\n await this.resolveRuntimeTurnReady(task, turn, resumed, loadError);\n if (this.cancelRuntimeTurnBeforePrompt(task)) {\n terminalResult = {\n status: \"cancelled\",\n stopReason: \"cancelled\",\n };\n } else {\n await this.applyPendingRuntimeTurnCancel(task, turn);\n const response = await this.runRuntimePrompt(task, turn, sessionId);\n await this.saveCompletedRuntimeTurn(turn, response.stopReason);\n terminalResult = {\n status: response.stopReason === \"cancelled\" ? \"cancelled\" : \"completed\",\n ...(response.stopReason ? { stopReason: response.stopReason } : {}),\n };\n }\n } catch (error) {\n terminalResult = this.failRuntimeTurn(task, error);\n }\n try {\n await this.finalizeRuntimeTurn(task, turn);\n } catch (error) {\n terminalResult = this.failRuntimeTurn(task, 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 onPromptRequestStarted: () => task.promptStarted.resolve(),\n onElicitation: task.input.onElicitation,\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 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.options.mcpServers ?? [])],\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 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 resumed: boolean,\n loadError: string | undefined,\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 this.emitRuntimeTurnLoadStatus(task, resumed, loadError);\n }\n\n private emitRuntimeTurnLoadStatus(\n task: RuntimeTurnTask,\n resumed: boolean,\n loadError: string | undefined,\n ): void {\n if (!resumed && !loadError) {\n return;\n }\n this.emitRuntimeTurnEvent(task, {\n type: \"status\",\n text: loadError ? `session reconnect fallback: ${loadError}` : \"session resumed\",\n });\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(\n turn: RunningRuntimeTurn,\n _stopReason: string | undefined,\n ): 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 () => turn.client.close());\n const failure = firstFailedAttempt([clearAttempt, closeAttempt]);\n if (failure) {\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 }): AsyncIterable<AcpRuntimeEvent> {\n const turn = this.startTurn(input);\n yield* turn.events;\n yield legacyTerminalEventFromTurnResult(await turn.result);\n }\n\n async getStatus(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 {\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\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 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 async close(\n handle: AcpRuntimeHandle,\n options: { discardPersistentState?: boolean } = {},\n ): Promise<void> {\n const recordId = handle.acpxRecordId ?? handle.sessionKey;\n const record = await this.resolveRuntimeRecordForClose(recordId);\n this.markActiveRuntimeRecordClosing(record);\n await this.cancel(handle);\n await this.closeRuntimeRecordOwnership(record, options.discardPersistentState === true);\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 discardPersistentState: boolean,\n ): Promise<void> {\n if (discardPersistentState) {\n await this.closeBackendSession(record);\n record.acpx = {\n ...record.acpx,\n reset_on_next_ensure: true,\n };\n } else {\n await this.closeRetainedSessionOwner(record.acpxRecordId);\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.finalizeBackendCloseConnection(connection);\n }\n }\n\n private async finalizeBackendCloseConnection(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 () => connection.client.close());\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.createClient({\n agentCommand: record.agentCommand,\n agentArgv: record.agentArgv,\n cwd: record.cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\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 }),\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 { createAtomicWriteTempPath } from \"../../session/persistence/atomic-write.js\";\nimport { parseSessionRecord } from \"../../session/persistence/parse.js\";\nimport { serializeSessionRecordForDisk } from \"../../session/persistence/serialize.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 });\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 await this.ensureDir();\n const persisted = serializeSessionRecordForDisk(record);\n assertPersistedKeyPolicy(persisted);\n\n const file = this.filePath(record.acpxRecordId);\n const tempFile = createAtomicWriteTempPath(file);\n const payload = JSON.stringify(persisted, null, 2);\n await fs.writeFile(tempFile, `${payload}\\n`, \"utf8\");\n await fs.rename(tempFile, file);\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 { 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, 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 agentCommand: ReturnType<typeof normalizeAgentCommandInput>,\n deps: ProbeRuntimeDeps,\n): AcpClient {\n const clientOptions = {\n ...agentCommand,\n cwd: options.cwd,\n mcpServers: [...(options.mcpServers ?? [])],\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n permissionPolicy: options.permissionPolicy,\n verbose: options.verbose,\n };\n return deps.clientFactory?.(clientOptions) ?? new AcpClient(clientOptions);\n}\n","import type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport {\n DEFAULT_AGENT_NAME,\n listBuiltInAgents,\n normalizeAgentName,\n resolveCanonicalAgentName,\n resolveAgentArgv,\n resolveAgentCommand,\n} from \"./agent-registry.js\";\nimport { AcpRuntimeManager } from \"./runtime/engine/manager.js\";\nimport type {\n AcpAgentRegistry,\n AcpRuntime,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimeStatus,\n AcpRuntimeTurnInput,\n AcpSessionStore,\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, probeRuntime } from \"./runtime/public/probe.js\";\nimport { deriveAgentFromSessionKey, type AcpxHandleState } from \"./runtime/public/shared.js\";\n\nexport { DEFAULT_AGENT_NAME, createFileSessionStore };\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 AcpPermissionRequest,\n AcpRuntime,\n AcpRuntimeAvailableCommand,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeEvent,\n AcpTextDeltaOriginMeta,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\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: [\"session/set_mode\", \"session/set_config_option\", \"session/status\"],\n};\n\ntype AcpxRuntimeLike = AcpRuntime & {\n probeAvailability(): Promise<void>;\n isHealthy(): boolean;\n doctor(): Promise<AcpRuntimeDoctorReport>;\n};\n\nexport function createAgentRegistry(params?: {\n overrides?: Record<string, string | string[]>;\n}): AcpAgentRegistry {\n const overrides = normalizeRegistryOverrides(params?.overrides);\n return {\n resolve(agentName: string) {\n const normalizedAgentName = normalizeAgentName(agentName);\n const override =\n overrides[normalizedAgentName] ?? overrides[resolveCanonicalAgentName(agentName)];\n return override ?? resolveAgentArgv(agentName) ?? resolveAgentCommand(agentName);\n },\n list() {\n return listBuiltInAgents(overrides);\n },\n };\n}\n\nfunction normalizeRegistryOverrides(\n values: Record<string, string | string[]> | undefined,\n): Record<string, string | string[]> {\n const normalized: Record<string, string | string[]> = {};\n for (const [name, value] of Object.entries(values ?? {})) {\n const normalizedName = normalizeAgentName(name);\n if (!normalizedName) {\n continue;\n }\n const normalizedValue = normalizeRegistryOverride(value);\n if (normalizedValue) {\n normalized[normalizedName] = normalizedValue;\n }\n }\n return normalized;\n}\n\nfunction normalizeRegistryOverride(value: string | string[]): string | string[] | undefined {\n if (typeof value === \"string\") {\n return value.trim() || undefined;\n }\n return value.length > 0 && value[0]?.length ? [...value] : undefined;\n}\n\nexport class AcpxRuntime implements AcpxRuntimeLike {\n private healthy = false;\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\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 async ensureSession(input: AcpRuntimeEnsureInput): Promise<AcpRuntimeHandle> {\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 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 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: sessionName,\n 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 }),\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 });\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 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 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 private async getManager(): Promise<AcpRuntimeManager> {\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 return await (this.testOptions?.probeRunner?.(this.options) ?? probeRuntime(this.options));\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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"}
|