acpx 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/{cli-rGyZlX2p.js → cli-T-Z-9x6a.js} +4 -4
- package/dist/{cli-rGyZlX2p.js.map → cli-T-Z-9x6a.js.map} +1 -1
- package/dist/cli.js +64 -68
- package/dist/cli.js.map +1 -1
- package/dist/{client-2fTFutRH.d.ts → client-COPilhO_.d.ts} +4 -2
- package/dist/client-COPilhO_.d.ts.map +1 -0
- package/dist/{flags-DG-3Vfgg.js → flags-Dj-IXgo9.js} +5 -5
- package/dist/flags-Dj-IXgo9.js.map +1 -0
- package/dist/{flows-gbxyIf6o.js → flows-CF8w1rPI.js} +113 -10
- package/dist/flows-CF8w1rPI.js.map +1 -0
- package/dist/flows.d.ts +16 -1
- package/dist/flows.d.ts.map +1 -1
- package/dist/flows.js +2 -2
- package/dist/{ipc-CkAW8Qvc.js → ipc-ABXlXzGP.js} +53 -15
- package/dist/ipc-ABXlXzGP.js.map +1 -0
- package/dist/{perf-metrics-DvT_gvUh.js → perf-metrics-C2pXfxvR.js} +2 -2
- package/dist/perf-metrics-C2pXfxvR.js.map +1 -0
- package/dist/{prompt-turn-BOoZaDEq.js → prompt-turn-CVPMWdj1.js} +72 -49
- package/dist/prompt-turn-CVPMWdj1.js.map +1 -0
- package/dist/{render-CyodRDtK.js → render-N5YwotCy.js} +3 -3
- package/dist/{render-CyodRDtK.js.map → render-N5YwotCy.js.map} +1 -1
- package/dist/runtime.d.ts +5 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +20 -12
- package/dist/runtime.js.map +1 -1
- package/dist/{session-DcIse8N0.js → session-CDaQe6BH.js} +77 -78
- package/dist/session-CDaQe6BH.js.map +1 -0
- package/package.json +11 -11
- package/skills/acpx/SKILL.md +3 -2
- package/dist/client-2fTFutRH.d.ts.map +0 -1
- package/dist/flags-DG-3Vfgg.js.map +0 -1
- package/dist/flows-gbxyIf6o.js.map +0 -1
- package/dist/ipc-CkAW8Qvc.js.map +0 -1
- package/dist/perf-metrics-DvT_gvUh.js.map +0 -1
- package/dist/prompt-turn-BOoZaDEq.js.map +0 -1
- package/dist/session-DcIse8N0.js.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 { AcpRuntimeEvent, AcpSessionUpdateTag } from \"./contract.js\";\nimport { asOptionalString, asString, asTrimmedString, isRecord } from \"./shared.js\";\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) as AcpSessionUpdateTag | undefined;\n return {\n type: tag ?? \"\",\n payload: update,\n ...(tag ? { tag } : {}),\n };\n }\n }\n\n const sessionUpdate = asOptionalString(parsed.sessionUpdate) as AcpSessionUpdateTag | undefined;\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) as AcpSessionUpdateTag | undefined;\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 { tag, payload } = params;\n if (tag === \"available_commands_update\") {\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 if (tag === \"current_mode_update\") {\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 if (tag === \"config_option_update\") {\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 if (id) {\n return `config updated: ${id}`;\n }\n return \"config updated\";\n }\n if (tag === \"session_info_update\") {\n return (\n asTrimmedString(payload.summary) || asTrimmedString(payload.message) || \"session updated\"\n );\n }\n if (tag === \"plan\") {\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 return 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 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 toolCallId = asOptionalString(params.payload.toolCallId);\n const summaryText = status ? `${title} (${status})` : title;\n return {\n type: \"tool_call\",\n text: inputSummary ? `${summaryText}: ${inputSummary}` : summaryText,\n tag: params.tag,\n ...(toolCallId ? { toolCallId } : {}),\n ...(status ? { status } : {}),\n title,\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\n switch (type) {\n case \"text\":\n return createTextDeltaEvent({\n content: asString(payload.content),\n stream: \"output\",\n tag,\n });\n case \"thought\":\n return createTextDeltaEvent({\n content: asString(payload.content),\n stream: \"thought\",\n tag,\n });\n case \"tool_call\":\n return createToolCallEvent({\n payload,\n tag: tag ?? \"tool_call\",\n });\n case \"tool_call_update\":\n return createToolCallEvent({\n payload,\n tag: tag ?? \"tool_call_update\",\n });\n case \"agent_message_chunk\":\n return resolveTextChunk({\n payload,\n stream: \"output\",\n tag: \"agent_message_chunk\",\n });\n case \"agent_thought_chunk\":\n return resolveTextChunk({\n payload,\n stream: \"thought\",\n tag: \"agent_thought_chunk\",\n });\n case \"usage_update\": {\n const used = asOptionalFiniteNumber(payload.used);\n const size = asOptionalFiniteNumber(payload.size);\n const text =\n 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 };\n }\n case \"available_commands_update\":\n case \"current_mode_update\":\n case \"config_option_update\":\n case \"session_info_update\":\n case \"plan\": {\n const text = resolveStatusTextForTag({\n tag: type as AcpSessionUpdateTag,\n payload,\n });\n if (!text) {\n return null;\n }\n return {\n type: \"status\",\n text,\n tag: type as AcpSessionUpdateTag,\n };\n }\n case \"client_operation\": {\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 if (!text) {\n return null;\n }\n return { type: \"status\", text, ...(tag ? { tag } : {}) };\n }\n case \"update\": {\n const update = asTrimmedString(payload.update);\n if (!update) {\n return null;\n }\n return { type: \"status\", text: update, ...(tag ? { tag } : {}) };\n }\n case \"done\":\n case \"error\":\n return null;\n default:\n return null;\n }\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 type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { AcpClient } from \"../../acp/client.js\";\nimport { normalizeOutputError } from \"../../acp/error-normalization.js\";\nimport { extractAcpError, isAcpResourceNotFoundError } from \"../../acp/error-shapes.js\";\nimport { withTimeout } from \"../../async-control.js\";\nimport { textPrompt, type PromptInput } from \"../../prompt-content.js\";\nimport {\n 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 { setDesiredConfigOption, setDesiredModeId } from \"../../session/mode-preference.js\";\nimport type { ClientOperation, SessionRecord, SessionResumePolicy } from \"../../types.js\";\nimport type {\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePromptMode,\n AcpRuntimeStatus,\n AcpRuntimeTurnAttachment,\n AcpRuntimeTurn,\n AcpRuntimeTurnResult,\n} from \"../public/contract.js\";\nimport { AcpRuntimeError } from \"../public/errors.js\";\nimport { parsePromptEventLine } from \"../public/events.js\";\nimport { withConnectedSession } from \"./connected-session.js\";\nimport {\n applyConversation,\n applyLifecycleSnapshotToRecord,\n reconcileAgentSessionId,\n} from \"./lifecycle.js\";\nimport { runPromptTurn } from \"./prompt-turn.js\";\nimport { connectAndLoadSession } from \"./reconnect.js\";\nimport { shouldReuseExistingRecord } from \"./reuse-policy.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) => Promise<void>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n ) => ReturnType<AcpClient[\"setSessionConfigOption\"]>;\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\nfunction applyConfigOptionsToRecord(\n record: SessionRecord,\n configOptions: SetSessionConfigOptionResponse[\"configOptions\"] | undefined,\n): void {\n if (!configOptions) {\n return;\n }\n const acpxState = cloneSessionAcpxState(record.acpx) ?? {};\n acpxState.config_options = structuredClone(configOptions);\n record.acpx = acpxState;\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: Array<\n { type: \"text\"; text: string } | { type: \"image\"; mimeType: string; data: string }\n > = [];\n if (text) {\n blocks.push({ type: \"text\", text });\n }\n for (const attachment of attachments) {\n if (!attachment.mediaType.startsWith(\"image/\")) {\n throw new AcpRuntimeError(\n \"ACP_TURN_FAILED\",\n `Unsupported ACP runtime attachment media type: ${attachment.mediaType}`,\n );\n }\n blocks.push({\n type: \"image\",\n mimeType: attachment.mediaType,\n data: attachment.data,\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 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 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.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\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 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 }): Promise<SessionRecord> {\n const cwd = path.resolve(input.cwd?.trim() || this.options.cwd);\n const agentCommand = this.options.agentRegistry.resolve(input.agent);\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 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 cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n });\n let keepClientOpen = false;\n\n try {\n await client.start();\n let sessionId: string;\n let agentSessionId: string | undefined;\n if (input.resumeSessionId) {\n const loaded = await client.loadSession(input.resumeSessionId, cwd);\n sessionId = input.resumeSessionId;\n agentSessionId = loaded.agentSessionId;\n } else {\n const created = await client.createSession(cwd);\n sessionId = created.sessionId;\n agentSessionId = created.agentSessionId;\n }\n const record = createInitialRecord({\n recordId: createRecordId(input.sessionKey, input.mode),\n sessionName: input.sessionKey,\n sessionId,\n agentCommand,\n cwd,\n agentSessionId,\n });\n this.closingActiveRecords.delete(record.acpxRecordId);\n record.protocolVersion = client.initializeResult?.protocolVersion;\n record.agentCapabilities = client.initializeResult?.agentCapabilities;\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n await this.options.sessionStore.save(record);\n if (input.mode === \"persistent\") {\n const previousClient = this.pendingPersistentClients.get(record.acpxRecordId);\n this.pendingPersistentClients.set(record.acpxRecordId, client);\n keepClientOpen = true;\n await previousClient?.close().catch(() => {});\n }\n return record;\n } finally {\n if (!keepClientOpen) {\n await client.close();\n }\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 }): 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 let pendingCancel = false;\n let turnActive = true;\n let streamClosed = false;\n let activeController: ActiveSessionController | null = null;\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 (activeController) {\n return await activeController.requestCancelActivePrompt();\n }\n if (!turnActive) {\n return false;\n }\n 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 (async () => {\n let record: SessionRecord | null = null;\n let conversation: ReturnType<typeof cloneSessionConversation> | null = null;\n let acpxState: ReturnType<typeof cloneSessionAcpxState>;\n let client: AcpClient | null = null;\n try {\n record = await this.requireRecord(input.handle.acpxRecordId ?? input.handle.sessionKey);\n conversation = cloneSessionConversation(record);\n acpxState = cloneSessionAcpxState(record.acpx);\n const promptStartedAt = isoNow();\n const promptMessageId = recordPromptSubmission(conversation, 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 client =\n pendingClient ??\n this.createClient({\n agentCommand: record.agentCommand,\n cwd: record.cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n });\n const runtimeClient = client;\n const runtimeConversation = conversation;\n const runtimeRecord = record;\n let activeSessionId = record.acpSessionId;\n\n const applyPendingCancel = async (): Promise<boolean> => {\n if (!pendingCancel || !runtimeClient.hasActivePrompt()) {\n return false;\n }\n const cancelled = await runtimeClient.requestCancelActivePrompt();\n if (cancelled) {\n pendingCancel = false;\n }\n return cancelled;\n };\n\n activeController = {\n hasActivePrompt: () => runtimeClient.hasActivePrompt(),\n requestCancelActivePrompt: async () => {\n if (runtimeClient.hasActivePrompt()) {\n return await runtimeClient.requestCancelActivePrompt();\n }\n if (!turnActive) {\n return false;\n }\n pendingCancel = true;\n return true;\n },\n setSessionMode: async (modeId: string) => {\n if (!runtimeClient.hasActivePrompt()) {\n await sessionReady.promise;\n }\n await runtimeClient.setSessionMode(activeSessionId, modeId);\n const nextState = cloneSessionAcpxState(acpxState) ?? {};\n nextState.desired_mode_id = modeId;\n acpxState = nextState;\n },\n setSessionModel: async (modelId: string) => {\n if (!runtimeClient.hasActivePrompt()) {\n await sessionReady.promise;\n }\n await runtimeClient.setSessionModel(activeSessionId, modelId);\n },\n setSessionConfigOption: async (configId: string, value: string) => {\n if (!runtimeClient.hasActivePrompt()) {\n await sessionReady.promise;\n }\n const response = await runtimeClient.setSessionConfigOption(\n activeSessionId,\n configId,\n value,\n );\n if (response?.configOptions) {\n const nextState = cloneSessionAcpxState(acpxState) ?? {};\n nextState.config_options = structuredClone(response.configOptions);\n acpxState = nextState;\n }\n if (configId === \"mode\") {\n const nextState = cloneSessionAcpxState(acpxState) ?? {};\n nextState.desired_mode_id = value;\n acpxState = nextState;\n } else if (configId !== \"model\") {\n const nextState = cloneSessionAcpxState(acpxState) ?? {};\n nextState.desired_config_options = {\n ...nextState.desired_config_options,\n [configId]: value,\n };\n acpxState = nextState;\n }\n return response;\n },\n };\n\n const emitParsed = (payload: Record<string, unknown>): void => {\n if (streamClosed) {\n return;\n }\n const parsed = parsePromptEventLine(JSON.stringify(payload));\n if (!parsed) {\n return;\n }\n queue.push(parsed);\n };\n\n this.activeControllers.set(runtimeRecord.acpxRecordId, activeController);\n runtimeClient.setEventHandlers({\n onSessionUpdate: (notification) => {\n acpxState = recordSessionUpdate(runtimeConversation, acpxState, notification);\n trimConversationForRuntime(runtimeConversation);\n emitParsed({\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: notification,\n });\n },\n onClientOperation: (operation: ClientOperation) => {\n acpxState = recordClientOperation(runtimeConversation, acpxState, operation);\n trimConversationForRuntime(runtimeConversation);\n emitParsed({\n type: \"client_operation\",\n ...operation,\n });\n },\n });\n\n const { sessionId, resumed, loadError } = pendingClient\n ? {\n sessionId: record.acpSessionId,\n resumed: false,\n loadError: undefined,\n }\n : await connectAndLoadSession({\n client: runtimeClient,\n record: runtimeRecord,\n resumePolicy: resumePolicyForSessionMode(input.sessionMode),\n timeoutMs: this.options.timeoutMs,\n activeController,\n onClientAvailable: (controller) => {\n activeController = controller;\n this.activeControllers.set(runtimeRecord.acpxRecordId, controller);\n },\n onConnectedRecord: (connectedRecord) => {\n connectedRecord.lastPromptAt = isoNow();\n },\n onSessionIdResolved: (sessionIdValue) => {\n activeSessionId = sessionIdValue;\n },\n });\n sessionReady.resolve();\n\n runtimeRecord.lastRequestId = input.requestId;\n runtimeRecord.lastPromptAt = isoNow();\n runtimeRecord.closed = false;\n runtimeRecord.closedAt = undefined;\n runtimeRecord.lastUsedAt = isoNow();\n if (resumed || loadError) {\n emitParsed({\n type: \"status\",\n text: loadError ? `load fallback: ${loadError}` : \"session resumed\",\n });\n }\n\n if (pendingCancel || input.signal?.aborted) {\n pendingCancel = false;\n settleResult({\n status: \"cancelled\",\n stopReason: \"cancelled\",\n });\n return;\n }\n\n await applyPendingCancel();\n const response = await runPromptTurn({\n client: runtimeClient,\n sessionId,\n prompt: promptInput,\n timeoutMs: input.timeoutMs ?? this.options.timeoutMs,\n conversation: runtimeConversation,\n promptMessageId,\n });\n\n runtimeRecord.acpSessionId = activeSessionId;\n reconcileAgentSessionId(runtimeRecord, runtimeRecord.agentSessionId);\n runtimeRecord.protocolVersion = runtimeClient.initializeResult?.protocolVersion;\n runtimeRecord.agentCapabilities = runtimeClient.initializeResult?.agentCapabilities;\n runtimeRecord.acpx = acpxState;\n applyConversation(runtimeRecord, runtimeConversation);\n applyLifecycleSnapshotToRecord(runtimeRecord, runtimeClient.getAgentLifecycleSnapshot());\n await this.options.sessionStore.save(runtimeRecord);\n\n settleResult({\n status: response.stopReason === \"cancelled\" ? \"cancelled\" : \"completed\",\n ...(response.stopReason ? { stopReason: response.stopReason } : {}),\n });\n } catch (error) {\n sessionReady.reject(error);\n const normalized = normalizeOutputError(error, { origin: \"runtime\" });\n settleResult({\n status: \"failed\",\n error: {\n message: normalized.message,\n ...(normalized.code ? { code: normalized.code } : {}),\n ...(normalized.retryable !== undefined ? { retryable: normalized.retryable } : {}),\n },\n });\n } finally {\n turnActive = false;\n if (input.signal) {\n input.signal.removeEventListener(\"abort\", abortHandler);\n }\n client?.clearEventHandlers();\n let pooled = false;\n if (record && conversation) {\n applyLifecycleSnapshotToRecord(\n record,\n client?.getAgentLifecycleSnapshot() ?? { running: false },\n );\n record.acpx = acpxState;\n applyConversation(record, conversation);\n record.lastUsedAt = isoNow();\n const closed = await this.refreshClosedState(record);\n await this.options.sessionStore.save(record).catch(() => {});\n if (!closed && client) {\n pooled = await this.retainPersistentClientAfterTurn({ record, client });\n }\n }\n if (!pooled) {\n await client?.close().catch(() => {});\n }\n if (record) {\n this.activeControllers.delete(record.acpxRecordId);\n this.closingActiveRecords.delete(record.acpxRecordId);\n }\n queue.close();\n }\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 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 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 let targetRecord = record;\n if (controller) {\n const response = await controller.setSessionConfigOption(key, value);\n applyConfigOptionsToRecord(targetRecord, response?.configOptions);\n } else {\n const result = await this.withRuntimeControlSession(\n record,\n sessionMode,\n async ({ client, sessionId, record: connectedRecord }) => {\n const response = await client.setSessionConfigOption(sessionId, key, value);\n applyConfigOptionsToRecord(connectedRecord, response?.configOptions);\n if (key === \"mode\") {\n setDesiredModeId(connectedRecord, value);\n } else {\n setDesiredConfigOption(connectedRecord, key, value);\n }\n },\n );\n targetRecord = result.record;\n }\n if (key === \"mode\") {\n setDesiredModeId(targetRecord, value);\n } else {\n setDesiredConfigOption(targetRecord, key, value);\n }\n await this.options.sessionStore.save(targetRecord);\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 cwd: record.cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\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 { 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 try {\n const payload = await fs.readFile(this.filePath(sessionId), \"utf8\");\n return parseSessionRecord(JSON.parse(payload)) ?? undefined;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\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 = `${file}.${process.pid}.${Date.now()}.tmp`;\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 { 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\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 (\n value == null ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\" ||\n typeof value === \"symbol\"\n ) {\n return String(value);\n }\n if (typeof value === \"function\") {\n return value.name ? `[Function ${value.name}]` : \"[Function]\";\n }\n\n const seen = new WeakSet<object>();\n try {\n const serialized = JSON.stringify(value, (_key, nested) => {\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 } 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 = options.agentRegistry.resolve(agentName);\n const client =\n deps.clientFactory?.({\n agentCommand,\n cwd: options.cwd,\n mcpServers: [...(options.mcpServers ?? [])],\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n verbose: options.verbose,\n }) ??\n new AcpClient({\n agentCommand,\n cwd: options.cwd,\n mcpServers: [...(options.mcpServers ?? [])],\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n verbose: options.verbose,\n });\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}`,\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}`,\n `cwd=${options.cwd}`,\n formatRuntimeDetail(error),\n ],\n };\n } finally {\n await client.close().catch(() => {});\n }\n}\n","import { DEFAULT_AGENT_NAME, listBuiltInAgents, resolveAgentCommand } 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 decodeAcpxRuntimeHandleState,\n encodeAcpxRuntimeHandleState,\n} from \"./runtime/public/handle-state.js\";\nexport type {\n AcpAgentRegistry,\n AcpFileSessionStoreOptions,\n AcpRuntime,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePromptMode,\n AcpRuntimeSessionMode,\n AcpRuntimeStatus,\n AcpRuntimeTurn,\n AcpRuntimeTurnAttachment,\n AcpRuntimeTurnInput,\n AcpRuntimeTurnResult,\n AcpRuntimeTurnResultError,\n AcpSessionRecord,\n AcpSessionStore,\n AcpSessionUpdateTag,\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>;\n}): AcpAgentRegistry {\n return {\n resolve(agentName: string) {\n return resolveAgentCommand(agentName, params?.overrides);\n },\n list() {\n return listBuiltInAgents(params?.overrides);\n },\n };\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 });\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 getCapabilities(_input?: { handle?: AcpRuntimeHandle }): AcpRuntimeCapabilities {\n return ACPX_CAPABILITIES;\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 { AcpRuntimeEvent, AcpSessionUpdateTag } from \"./contract.js\";\nimport { asOptionalString, asString, asTrimmedString, isRecord } from \"./shared.js\";\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) as AcpSessionUpdateTag | undefined;\n return {\n type: tag ?? \"\",\n payload: update,\n ...(tag ? { tag } : {}),\n };\n }\n }\n\n const sessionUpdate = asOptionalString(parsed.sessionUpdate) as AcpSessionUpdateTag | undefined;\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) as AcpSessionUpdateTag | undefined;\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 { tag, payload } = params;\n if (tag === \"available_commands_update\") {\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 if (tag === \"current_mode_update\") {\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 if (tag === \"config_option_update\") {\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 if (id) {\n return `config updated: ${id}`;\n }\n return \"config updated\";\n }\n if (tag === \"session_info_update\") {\n return (\n asTrimmedString(payload.summary) || asTrimmedString(payload.message) || \"session updated\"\n );\n }\n if (tag === \"plan\") {\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 return 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 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 toolCallId = asOptionalString(params.payload.toolCallId);\n const summaryText = status ? `${title} (${status})` : title;\n return {\n type: \"tool_call\",\n text: inputSummary ? `${summaryText}: ${inputSummary}` : summaryText,\n tag: params.tag,\n ...(toolCallId ? { toolCallId } : {}),\n ...(status ? { status } : {}),\n title,\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\n switch (type) {\n case \"text\":\n return createTextDeltaEvent({\n content: asString(payload.content),\n stream: \"output\",\n tag,\n });\n case \"thought\":\n return createTextDeltaEvent({\n content: asString(payload.content),\n stream: \"thought\",\n tag,\n });\n case \"tool_call\":\n return createToolCallEvent({\n payload,\n tag: tag ?? \"tool_call\",\n });\n case \"tool_call_update\":\n return createToolCallEvent({\n payload,\n tag: tag ?? \"tool_call_update\",\n });\n case \"agent_message_chunk\":\n return resolveTextChunk({\n payload,\n stream: \"output\",\n tag: \"agent_message_chunk\",\n });\n case \"agent_thought_chunk\":\n return resolveTextChunk({\n payload,\n stream: \"thought\",\n tag: \"agent_thought_chunk\",\n });\n case \"usage_update\": {\n const used = asOptionalFiniteNumber(payload.used);\n const size = asOptionalFiniteNumber(payload.size);\n const text =\n 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 };\n }\n case \"available_commands_update\":\n case \"current_mode_update\":\n case \"config_option_update\":\n case \"session_info_update\":\n case \"plan\": {\n const text = resolveStatusTextForTag({\n tag: type as AcpSessionUpdateTag,\n payload,\n });\n if (!text) {\n return null;\n }\n return {\n type: \"status\",\n text,\n tag: type as AcpSessionUpdateTag,\n };\n }\n case \"client_operation\": {\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 if (!text) {\n return null;\n }\n return { type: \"status\", text, ...(tag ? { tag } : {}) };\n }\n case \"update\": {\n const update = asTrimmedString(payload.update);\n if (!update) {\n return null;\n }\n return { type: \"status\", text: update, ...(tag ? { tag } : {}) };\n }\n case \"done\":\n case \"error\":\n return null;\n default:\n return null;\n }\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 { AcpClient } from \"../../acp/client.js\";\nimport { normalizeOutputError } from \"../../acp/error-normalization.js\";\nimport { extractAcpError, isAcpResourceNotFoundError } from \"../../acp/error-shapes.js\";\nimport { withTimeout } from \"../../async-control.js\";\nimport { textPrompt, type PromptInput } from \"../../prompt-content.js\";\nimport { applyConfigOptionsToRecord } 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 { setDesiredConfigOption, setDesiredModeId } from \"../../session/mode-preference.js\";\nimport type { ClientOperation, SessionRecord, SessionResumePolicy } from \"../../types.js\";\nimport type {\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePromptMode,\n AcpRuntimeStatus,\n AcpRuntimeTurnAttachment,\n AcpRuntimeTurn,\n AcpRuntimeTurnResult,\n} from \"../public/contract.js\";\nimport { AcpRuntimeError } from \"../public/errors.js\";\nimport { parsePromptEventLine } from \"../public/events.js\";\nimport { withConnectedSession } from \"./connected-session.js\";\nimport {\n applyConversation,\n applyLifecycleSnapshotToRecord,\n reconcileAgentSessionId,\n} from \"./lifecycle.js\";\nimport { runPromptTurn } from \"./prompt-turn.js\";\nimport { connectAndLoadSession } from \"./reconnect.js\";\nimport { shouldReuseExistingRecord } from \"./reuse-policy.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) => Promise<void>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n ) => ReturnType<AcpClient[\"setSessionConfigOption\"]>;\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: Array<\n { type: \"text\"; text: string } | { type: \"image\"; mimeType: string; data: string }\n > = [];\n if (text) {\n blocks.push({ type: \"text\", text });\n }\n for (const attachment of attachments) {\n if (!attachment.mediaType.startsWith(\"image/\")) {\n throw new AcpRuntimeError(\n \"ACP_TURN_FAILED\",\n `Unsupported ACP runtime attachment media type: ${attachment.mediaType}`,\n );\n }\n blocks.push({\n type: \"image\",\n mimeType: attachment.mediaType,\n data: attachment.data,\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 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 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\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 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 }): Promise<SessionRecord> {\n const cwd = path.resolve(input.cwd?.trim() || this.options.cwd);\n const agentCommand = this.options.agentRegistry.resolve(input.agent);\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 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 cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n });\n let keepClientOpen = false;\n\n try {\n await client.start();\n let sessionId: string;\n let agentSessionId: string | undefined;\n let sessionResult:\n | Awaited<ReturnType<AcpClient[\"createSession\"]>>\n | Awaited<ReturnType<AcpClient[\"loadSession\"]>>;\n if (input.resumeSessionId) {\n const loaded = await client.loadSession(input.resumeSessionId, cwd);\n sessionId = input.resumeSessionId;\n agentSessionId = loaded.agentSessionId;\n sessionResult = loaded;\n } else {\n const created = await client.createSession(cwd);\n sessionId = created.sessionId;\n agentSessionId = created.agentSessionId;\n sessionResult = created;\n }\n const record = createInitialRecord({\n recordId: createRecordId(input.sessionKey, input.mode),\n sessionName: input.sessionKey,\n sessionId,\n agentCommand,\n cwd,\n agentSessionId,\n });\n this.closingActiveRecords.delete(record.acpxRecordId);\n record.protocolVersion = client.initializeResult?.protocolVersion;\n record.agentCapabilities = client.initializeResult?.agentCapabilities;\n applyConfigOptionsToRecord(record, sessionResult);\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n await this.options.sessionStore.save(record);\n if (input.mode === \"persistent\") {\n const previousClient = this.pendingPersistentClients.get(record.acpxRecordId);\n this.pendingPersistentClients.set(record.acpxRecordId, client);\n keepClientOpen = true;\n await previousClient?.close().catch(() => {});\n }\n return record;\n } finally {\n if (!keepClientOpen) {\n await client.close();\n }\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 }): 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 let pendingCancel = false;\n let turnActive = true;\n let streamClosed = false;\n let activeController: ActiveSessionController | null = null;\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 (activeController) {\n return await activeController.requestCancelActivePrompt();\n }\n if (!turnActive) {\n return false;\n }\n 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 (async () => {\n let record: SessionRecord | null = null;\n let conversation: ReturnType<typeof cloneSessionConversation> | null = null;\n let acpxState: ReturnType<typeof cloneSessionAcpxState>;\n let client: AcpClient | null = null;\n try {\n record = await this.requireRecord(input.handle.acpxRecordId ?? input.handle.sessionKey);\n conversation = cloneSessionConversation(record);\n acpxState = cloneSessionAcpxState(record.acpx);\n const promptStartedAt = isoNow();\n const promptMessageId = recordPromptSubmission(conversation, 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 client =\n pendingClient ??\n this.createClient({\n agentCommand: record.agentCommand,\n cwd: record.cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n });\n const runtimeClient = client;\n const runtimeConversation = conversation;\n const runtimeRecord = record;\n let activeSessionId = record.acpSessionId;\n\n const applyPendingCancel = async (): Promise<boolean> => {\n if (!pendingCancel || !runtimeClient.hasActivePrompt()) {\n return false;\n }\n const cancelled = await runtimeClient.requestCancelActivePrompt();\n if (cancelled) {\n pendingCancel = false;\n }\n return cancelled;\n };\n\n activeController = {\n hasActivePrompt: () => runtimeClient.hasActivePrompt(),\n requestCancelActivePrompt: async () => {\n if (runtimeClient.hasActivePrompt()) {\n return await runtimeClient.requestCancelActivePrompt();\n }\n if (!turnActive) {\n return false;\n }\n pendingCancel = true;\n return true;\n },\n setSessionMode: async (modeId: string) => {\n if (!runtimeClient.hasActivePrompt()) {\n await sessionReady.promise;\n }\n await runtimeClient.setSessionMode(activeSessionId, modeId);\n const nextState = cloneSessionAcpxState(acpxState) ?? {};\n nextState.desired_mode_id = modeId;\n acpxState = nextState;\n },\n setSessionModel: async (modelId: string) => {\n if (!runtimeClient.hasActivePrompt()) {\n await sessionReady.promise;\n }\n await runtimeClient.setSessionModel(activeSessionId, modelId);\n },\n setSessionConfigOption: async (configId: string, value: string) => {\n if (!runtimeClient.hasActivePrompt()) {\n await sessionReady.promise;\n }\n const response = await runtimeClient.setSessionConfigOption(\n activeSessionId,\n configId,\n value,\n );\n if (response?.configOptions) {\n const nextState = cloneSessionAcpxState(acpxState) ?? {};\n nextState.config_options = structuredClone(response.configOptions);\n acpxState = nextState;\n }\n if (configId === \"mode\") {\n const nextState = cloneSessionAcpxState(acpxState) ?? {};\n nextState.desired_mode_id = value;\n acpxState = nextState;\n } else if (configId !== \"model\") {\n const nextState = cloneSessionAcpxState(acpxState) ?? {};\n nextState.desired_config_options = {\n ...nextState.desired_config_options,\n [configId]: value,\n };\n acpxState = nextState;\n }\n return response;\n },\n };\n\n const emitParsed = (payload: Record<string, unknown>): void => {\n if (streamClosed) {\n return;\n }\n const parsed = parsePromptEventLine(JSON.stringify(payload));\n if (!parsed) {\n return;\n }\n queue.push(parsed);\n };\n\n this.activeControllers.set(runtimeRecord.acpxRecordId, activeController);\n runtimeClient.setEventHandlers({\n onSessionUpdate: (notification) => {\n acpxState = recordSessionUpdate(runtimeConversation, acpxState, notification);\n trimConversationForRuntime(runtimeConversation);\n emitParsed({\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: notification,\n });\n },\n onClientOperation: (operation: ClientOperation) => {\n acpxState = recordClientOperation(runtimeConversation, acpxState, operation);\n trimConversationForRuntime(runtimeConversation);\n emitParsed({\n type: \"client_operation\",\n ...operation,\n });\n },\n });\n\n const { sessionId, resumed, loadError } = pendingClient\n ? {\n sessionId: record.acpSessionId,\n resumed: false,\n loadError: undefined,\n }\n : await connectAndLoadSession({\n client: runtimeClient,\n record: runtimeRecord,\n resumePolicy: resumePolicyForSessionMode(input.sessionMode),\n timeoutMs: this.options.timeoutMs,\n activeController,\n onClientAvailable: (controller) => {\n activeController = controller;\n this.activeControllers.set(runtimeRecord.acpxRecordId, controller);\n },\n onConnectedRecord: (connectedRecord) => {\n connectedRecord.lastPromptAt = isoNow();\n },\n onSessionIdResolved: (sessionIdValue) => {\n activeSessionId = sessionIdValue;\n },\n });\n sessionReady.resolve();\n\n runtimeRecord.lastRequestId = input.requestId;\n runtimeRecord.lastPromptAt = isoNow();\n runtimeRecord.closed = false;\n runtimeRecord.closedAt = undefined;\n runtimeRecord.lastUsedAt = isoNow();\n if (resumed || loadError) {\n emitParsed({\n type: \"status\",\n text: loadError ? `load fallback: ${loadError}` : \"session resumed\",\n });\n }\n\n if (pendingCancel || input.signal?.aborted) {\n pendingCancel = false;\n settleResult({\n status: \"cancelled\",\n stopReason: \"cancelled\",\n });\n return;\n }\n\n await applyPendingCancel();\n const response = await runPromptTurn({\n client: runtimeClient,\n sessionId,\n prompt: promptInput,\n timeoutMs: input.timeoutMs ?? this.options.timeoutMs,\n conversation: runtimeConversation,\n promptMessageId,\n });\n\n runtimeRecord.acpSessionId = activeSessionId;\n reconcileAgentSessionId(runtimeRecord, runtimeRecord.agentSessionId);\n runtimeRecord.protocolVersion = runtimeClient.initializeResult?.protocolVersion;\n runtimeRecord.agentCapabilities = runtimeClient.initializeResult?.agentCapabilities;\n runtimeRecord.acpx = acpxState;\n applyConversation(runtimeRecord, runtimeConversation);\n applyLifecycleSnapshotToRecord(runtimeRecord, runtimeClient.getAgentLifecycleSnapshot());\n await this.options.sessionStore.save(runtimeRecord);\n\n settleResult({\n status: response.stopReason === \"cancelled\" ? \"cancelled\" : \"completed\",\n ...(response.stopReason ? { stopReason: response.stopReason } : {}),\n });\n } catch (error) {\n sessionReady.reject(error);\n const normalized = normalizeOutputError(error, { origin: \"runtime\" });\n 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 } finally {\n turnActive = false;\n if (input.signal) {\n input.signal.removeEventListener(\"abort\", abortHandler);\n }\n client?.clearEventHandlers();\n let pooled = false;\n if (record && conversation) {\n applyLifecycleSnapshotToRecord(\n record,\n client?.getAgentLifecycleSnapshot() ?? { running: false },\n );\n record.acpx = acpxState;\n applyConversation(record, conversation);\n record.lastUsedAt = isoNow();\n const closed = await this.refreshClosedState(record);\n await this.options.sessionStore.save(record).catch(() => {});\n if (!closed && client) {\n pooled = await this.retainPersistentClientAfterTurn({ record, client });\n }\n }\n if (!pooled) {\n await client?.close().catch(() => {});\n }\n if (record) {\n this.activeControllers.delete(record.acpxRecordId);\n this.closingActiveRecords.delete(record.acpxRecordId);\n }\n queue.close();\n }\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 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 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 let targetRecord = record;\n if (controller) {\n const response = await controller.setSessionConfigOption(key, value);\n applyConfigOptionsToRecord(targetRecord, response);\n } else {\n const result = await this.withRuntimeControlSession(\n record,\n sessionMode,\n async ({ client, sessionId, record: connectedRecord }) => {\n const response = await client.setSessionConfigOption(sessionId, key, value);\n applyConfigOptionsToRecord(connectedRecord, response);\n if (key === \"mode\") {\n setDesiredModeId(connectedRecord, value);\n } else {\n setDesiredConfigOption(connectedRecord, key, value);\n }\n },\n );\n targetRecord = result.record;\n }\n if (key === \"mode\") {\n setDesiredModeId(targetRecord, value);\n } else {\n setDesiredConfigOption(targetRecord, key, value);\n }\n await this.options.sessionStore.save(targetRecord);\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 cwd: record.cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\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 { 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 try {\n const payload = await fs.readFile(this.filePath(sessionId), \"utf8\");\n return parseSessionRecord(JSON.parse(payload)) ?? undefined;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\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 = `${file}.${process.pid}.${Date.now()}.tmp`;\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 { 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\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 (\n value == null ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\" ||\n typeof value === \"symbol\"\n ) {\n return String(value);\n }\n if (typeof value === \"function\") {\n return value.name ? `[Function ${value.name}]` : \"[Function]\";\n }\n\n const seen = new WeakSet<object>();\n try {\n const serialized = JSON.stringify(value, (_key, nested) => {\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 } 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 = options.agentRegistry.resolve(agentName);\n const client =\n deps.clientFactory?.({\n agentCommand,\n cwd: options.cwd,\n mcpServers: [...(options.mcpServers ?? [])],\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n verbose: options.verbose,\n }) ??\n new AcpClient({\n agentCommand,\n cwd: options.cwd,\n mcpServers: [...(options.mcpServers ?? [])],\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n verbose: options.verbose,\n });\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}`,\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}`,\n `cwd=${options.cwd}`,\n formatRuntimeDetail(error),\n ],\n };\n } finally {\n await client.close().catch(() => {});\n }\n}\n","import { DEFAULT_AGENT_NAME, listBuiltInAgents, resolveAgentCommand } 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 decodeAcpxRuntimeHandleState,\n encodeAcpxRuntimeHandleState,\n} from \"./runtime/public/handle-state.js\";\nexport type {\n AcpAgentRegistry,\n AcpFileSessionStoreOptions,\n AcpRuntime,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePromptMode,\n AcpRuntimeSessionMode,\n AcpRuntimeStatus,\n AcpRuntimeTurn,\n AcpRuntimeTurnAttachment,\n AcpRuntimeTurnInput,\n AcpRuntimeTurnResult,\n AcpRuntimeTurnResultError,\n AcpSessionRecord,\n AcpSessionStore,\n AcpSessionUpdateTag,\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>;\n}): AcpAgentRegistry {\n return {\n resolve(agentName: string) {\n return resolveAgentCommand(agentName, params?.overrides);\n },\n list() {\n return listBuiltInAgents(params?.overrides);\n },\n };\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 });\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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"}
|