acpx 0.6.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +8 -2
  2. package/dist/{cli-Ddxpnz9X.js → cli-BGYGVo3b.js} +35 -10
  3. package/dist/cli-BGYGVo3b.js.map +1 -0
  4. package/dist/cli.d.ts +1 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +204 -19
  7. package/dist/cli.js.map +1 -1
  8. package/dist/{client-2fTFutRH.d.ts → client-FzXPdgP7.d.ts} +10 -4
  9. package/dist/client-FzXPdgP7.d.ts.map +1 -0
  10. package/dist/{flags-yXzUm7Aq.js → flags-D706STfk.js} +46 -6
  11. package/dist/flags-D706STfk.js.map +1 -0
  12. package/dist/{flows-CDsfbaA2.js → flows-hcjHmU7P.js} +117 -11
  13. package/dist/flows-hcjHmU7P.js.map +1 -0
  14. package/dist/flows.d.ts +19 -3
  15. package/dist/flows.d.ts.map +1 -1
  16. package/dist/flows.js +2 -2
  17. package/dist/{prompt-turn-BY5SwU1F.js → live-checkpoint-B9ctAuqV.js} +1335 -82
  18. package/dist/live-checkpoint-B9ctAuqV.js.map +1 -0
  19. package/dist/output-BL9XRWzS.js +3712 -0
  20. package/dist/output-BL9XRWzS.js.map +1 -0
  21. package/dist/runtime.d.ts +32 -6
  22. package/dist/runtime.d.ts.map +1 -1
  23. package/dist/runtime.js +169 -32
  24. package/dist/runtime.js.map +1 -1
  25. package/dist/{types-CVBeQyi3.d.ts → session-options-BJyG6zEH.d.ts} +56 -3
  26. package/dist/session-options-BJyG6zEH.d.ts.map +1 -0
  27. package/package.json +27 -25
  28. package/skills/acpx/SKILL.md +200 -9
  29. package/dist/cli-Ddxpnz9X.js.map +0 -1
  30. package/dist/client-2fTFutRH.d.ts.map +0 -1
  31. package/dist/flags-yXzUm7Aq.js.map +0 -1
  32. package/dist/flows-CDsfbaA2.js.map +0 -1
  33. package/dist/ipc-BruTG5Fb.js +0 -1241
  34. package/dist/ipc-BruTG5Fb.js.map +0 -1
  35. package/dist/jsonrpc-DSxh2w5R.js +0 -68
  36. package/dist/jsonrpc-DSxh2w5R.js.map +0 -1
  37. package/dist/output-DmHvT8vm.js +0 -807
  38. package/dist/output-DmHvT8vm.js.map +0 -1
  39. package/dist/perf-metrics-C2pXfxvR.js +0 -598
  40. package/dist/perf-metrics-C2pXfxvR.js.map +0 -1
  41. package/dist/prompt-turn-BY5SwU1F.js.map +0 -1
  42. package/dist/render-yqwtaOX4.js +0 -172
  43. package/dist/render-yqwtaOX4.js.map +0 -1
  44. package/dist/rolldown-runtime-CiIaOW0V.js +0 -13
  45. package/dist/session-BwgaPK8-.js +0 -1526
  46. package/dist/session-BwgaPK8-.js.map +0 -1
  47. package/dist/session-options-pCbHn_n7.d.ts +0 -13
  48. package/dist/session-options-pCbHn_n7.d.ts.map +0 -1
  49. package/dist/types-CVBeQyi3.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","names":[],"sources":["../src/runtime/public/errors.ts","../src/runtime/public/shared.ts","../src/runtime/public/events.ts","../src/runtime/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":";;;;;;AAYA,IAAa,kBAAb,cAAqC,MAAM;CACzC;CACA;CAEA,YAAY,MAA2B,SAAiB,SAA+B;AACrF,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,OAAO;AACZ,OAAK,QAAQ,SAAS;;;AAI1B,SAAgB,kBAAkB,OAA0C;AAC1E,QAAO,iBAAiB;;;;ACf1B,SAAgB,SAAS,OAAkD;AACzE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAgB,gBAAgB,OAAwB;AACtD,QAAO,OAAO,UAAU,WAAW,MAAM,MAAM,GAAG;;AAGpD,SAAgB,SAAS,OAAoC;AAC3D,QAAO,OAAO,UAAU,WAAW,QAAQ,KAAA;;AAG7C,SAAgB,iBAAiB,OAAoC;AAEnE,QADa,gBAAgB,MAClB,IAAI,KAAA;;AAOjB,SAAgB,0BAA0B,YAAoB,eAA+B;CAC3F,MAAM,QAAQ,WAAW,MAAM,mBAAmB;AAElD,SADkB,QAAQ,KAAK,gBAAgB,MAAM,GAAG,GAAG,OACvC;;;;AC/BtB,SAAS,oBAAoB,MAA8C;AACzE,KAAI;EACF,MAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,SAAO,SAAS,OAAO,GAAG,SAAS;SAC7B;AACN,SAAO;;;AAIX,SAAS,uBAAuB,OAAoC;AAClE,QAAO,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM,GAAG,QAAQ,KAAA;;AAGvE,SAAS,+BAA+B,QAItC;AAEA,KADe,gBAAgB,OAAO,OAC5B,KAAK,kBAAkB;EAC/B,MAAM,SAAS,OAAO;AACtB,MAAI,SAAS,OAAO,IAAI,SAAS,OAAO,OAAO,EAAE;GAC/C,MAAM,SAAS,OAAO;GACtB,MAAM,MAAM,iBAAiB,OAAO,cAAc;AAClD,UAAO;IACL,MAAM,OAAO;IACb,SAAS;IACT,GAAI,MAAM,EAAE,KAAK,GAAG,EAAE;IACvB;;;CAIL,MAAM,gBAAgB,iBAAiB,OAAO,cAAc;AAC5D,KAAI,cACF,QAAO;EACL,MAAM;EACN,SAAS;EACT,KAAK;EACN;CAGH,MAAM,OAAO,gBAAgB,OAAO,KAAK;CACzC,MAAM,MAAM,iBAAiB,OAAO,IAAI;AACxC,QAAO;EACL;EACA,SAAS;EACT,GAAI,MAAM,EAAE,KAAK,GAAG,EAAE;EACvB;;AAGH,SAAS,wBAAwB,QAGf;CAChB,MAAM,EAAE,KAAK,YAAY;AACzB,KAAI,QAAQ,6BAA6B;EACvC,MAAM,WAAW,MAAM,QAAQ,QAAQ,kBAAkB,GAAG,QAAQ,oBAAoB,EAAE;AAC1F,SAAO,SAAS,SAAS,IACrB,+BAA+B,SAAS,OAAO,KAC/C;;AAEN,KAAI,QAAQ,uBAAuB;EACjC,MAAM,OACJ,gBAAgB,QAAQ,cAAc,IACtC,gBAAgB,QAAQ,OAAO,IAC/B,gBAAgB,QAAQ,KAAK;AAC/B,SAAO,OAAO,iBAAiB,SAAS;;AAE1C,KAAI,QAAQ,wBAAwB;EAClC,MAAM,KAAK,gBAAgB,QAAQ,GAAG,IAAI,gBAAgB,QAAQ,eAAe;EACjF,MAAM,QACJ,gBAAgB,QAAQ,aAAa,IACrC,gBAAgB,QAAQ,MAAM,IAC9B,gBAAgB,QAAQ,YAAY;AACtC,MAAI,MAAM,MACR,QAAO,mBAAmB,GAAG,GAAG;AAElC,MAAI,GACF,QAAO,mBAAmB;AAE5B,SAAO;;AAET,KAAI,QAAQ,sBACV,QACE,gBAAgB,QAAQ,QAAQ,IAAI,gBAAgB,QAAQ,QAAQ,IAAI;AAG5E,KAAI,QAAQ,QAAQ;EAGlB,MAAM,UAAU,iBAFA,MAAM,QAAQ,QAAQ,QAAQ,GAAG,QAAQ,UAAU,EAAE,EAC/C,MAAM,UAAU,SAAS,MAAM,CAChB,EAAE,QAAQ;AAC/C,SAAO,UAAU,SAAS,YAAY;;AAExC,QAAO;;AAGT,SAAS,iBAAiB,QAIC;CACzB,MAAM,aAAa,OAAO,QAAQ;AAClC,KAAI,SAAS,WAAW,EAAE;EACxB,MAAM,cAAc,gBAAgB,WAAW,KAAK;AACpD,MAAI,eAAe,gBAAgB,OACjC,QAAO;EAET,MAAM,OAAO,SAAS,WAAW,KAAK;AACtC,MAAI,QAAQ,KAAK,SAAS,EACxB,QAAO;GACL,MAAM;GACN;GACA,QAAQ,OAAO;GACf,KAAK,OAAO;GACb;;CAGL,MAAM,OAAO,SAAS,OAAO,QAAQ,KAAK;AAC1C,KAAI,CAAC,QAAQ,KAAK,WAAW,EAC3B,QAAO;AAET,QAAO;EACL,MAAM;EACN;EACA,QAAQ,OAAO;EACf,KAAK,OAAO;EACb;;AAGH,SAAS,qBAAqB,QAIH;AACzB,KAAI,OAAO,WAAW,QAAQ,OAAO,QAAQ,WAAW,EACtD,QAAO;AAET,QAAO;EACL,MAAM;EACN,MAAM,OAAO;EACb,QAAQ,OAAO;EACf,GAAI,OAAO,MAAM,EAAE,KAAK,OAAO,KAAK,GAAG,EAAE;EAC1C;;AAGH,SAAS,gBACP,QACA,MACoB;AACpB,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,QAAQ,iBAAiB,OAAO,KAAK;AAC3C,MAAI,MACF,QAAO;;;AAMb,SAAS,qBACP,QACA,MACsB;AACtB,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,MAAM,QAAQ,MAAM,CACvB;EAEF,MAAM,UAAU,MACb,KAAK,UAAU,iBAAiB,MAAM,CAAC,CACvC,QAAQ,UAA2B,UAAU,KAAA,EAAU;AAC1D,MAAI,QAAQ,SAAS,EACnB,QAAO;;;AAMb,SAAS,mBAAmB,UAAuC;AACjE,KAAI,YAAY,KACd;AAEF,KACE,OAAO,aAAa,YACpB,OAAO,aAAa,YACpB,OAAO,aAAa,UAEpB,QAAO,OAAO,SAAS;AAEzB,KAAI,CAAC,SAAS,SAAS,CACrB;CAGF,MAAM,UAAU,gBAAgB,UAAU;EAAC;EAAW;EAAO;EAAU,CAAC;CACxE,MAAM,OAAO,qBAAqB,UAAU,CAAC,QAAQ,YAAY,CAAC;AAClE,KAAI,QACF,QAAO,CAAC,SAAS,GAAI,QAAQ,EAAE,CAAE,CAAC,KAAK,IAAI;AAG7C,QAAO,gBAAgB,UAAU;EAC/B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;;AAGJ,SAAS,oBAAoB,QAGT;CAClB,MAAM,QAAQ,gBAAgB,OAAO,QAAQ,MAAM,IAAI;CACvD,MAAM,SAAS,gBAAgB,OAAO,QAAQ,OAAO;CACrD,MAAM,eAAe,mBAAmB,OAAO,QAAQ,SAAS;CAChE,MAAM,aAAa,iBAAiB,OAAO,QAAQ,WAAW;CAC9D,MAAM,cAAc,SAAS,GAAG,MAAM,IAAI,OAAO,KAAK;AACtD,QAAO;EACL,MAAM;EACN,MAAM,eAAe,GAAG,YAAY,IAAI,iBAAiB;EACzD,KAAK,OAAO;EACZ,GAAI,aAAa,EAAE,YAAY,GAAG,EAAE;EACpC,GAAI,SAAS,EAAE,QAAQ,GAAG,EAAE;EAC5B;EACD;;AAGH,SAAgB,qBAAqB,MAAsC;CACzE,MAAM,UAAU,KAAK,MAAM;AAC3B,KAAI,CAAC,QACH,QAAO;CAET,MAAM,SAAS,oBAAoB,QAAQ;AAC3C,KAAI,CAAC,OACH,QAAO;EACL,MAAM;EACN,MAAM;EACP;CAGH,MAAM,aAAa,+BAA+B,OAAO;CACzD,MAAM,OAAO,WAAW;CACxB,MAAM,UAAU,WAAW;CAC3B,MAAM,MAAM,WAAW;AAEvB,SAAQ,MAAR;EACE,KAAK,OACH,QAAO,qBAAqB;GAC1B,SAAS,SAAS,QAAQ,QAAQ;GAClC,QAAQ;GACR;GACD,CAAC;EACJ,KAAK,UACH,QAAO,qBAAqB;GAC1B,SAAS,SAAS,QAAQ,QAAQ;GAClC,QAAQ;GACR;GACD,CAAC;EACJ,KAAK,YACH,QAAO,oBAAoB;GACzB;GACA,KAAK,OAAO;GACb,CAAC;EACJ,KAAK,mBACH,QAAO,oBAAoB;GACzB;GACA,KAAK,OAAO;GACb,CAAC;EACJ,KAAK,sBACH,QAAO,iBAAiB;GACtB;GACA,QAAQ;GACR,KAAK;GACN,CAAC;EACJ,KAAK,sBACH,QAAO,iBAAiB;GACtB;GACA,QAAQ;GACR,KAAK;GACN,CAAC;EACJ,KAAK,gBAAgB;GACnB,MAAM,OAAO,uBAAuB,QAAQ,KAAK;GACjD,MAAM,OAAO,uBAAuB,QAAQ,KAAK;AAGjD,UAAO;IACL,MAAM;IACN,MAHA,QAAQ,QAAQ,QAAQ,OAAO,kBAAkB,KAAK,GAAG,SAAS;IAIlE,KAAK;IACL,GAAI,QAAQ,OAAO,EAAE,MAAM,GAAG,EAAE;IAChC,GAAI,QAAQ,OAAO,EAAE,MAAM,GAAG,EAAE;IACjC;;EAEH,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,QAAQ;GACX,MAAM,OAAO,wBAAwB;IACnC,KAAK;IACL;IACD,CAAC;AACF,OAAI,CAAC,KACH,QAAO;AAET,UAAO;IACL,MAAM;IACN;IACA,KAAK;IACN;;EAEH,KAAK,oBAAoB;GAIvB,MAAM,OAAO;IAHE,gBAAgB,QAAQ,OAAO,IAAI;IACnC,gBAAgB,QAAQ,OAEX;IADZ,gBAAgB,QAAQ,QACH;IAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;AAChE,OAAI,CAAC,KACH,QAAO;AAET,UAAO;IAAE,MAAM;IAAU;IAAM,GAAI,MAAM,EAAE,KAAK,GAAG,EAAE;IAAG;;EAE1D,KAAK,UAAU;GACb,MAAM,SAAS,gBAAgB,QAAQ,OAAO;AAC9C,OAAI,CAAC,OACH,QAAO;AAET,UAAO;IAAE,MAAM;IAAU,MAAM;IAAQ,GAAI,MAAM,EAAE,KAAK,GAAG,EAAE;IAAG;;EAElE,KAAK;EACL,KAAK,QACH,QAAO;EACT,QACE,QAAO;;;;;ACjVb,SAAgB,0BACd,QACA,QAKS;AACT,KAAI,OAAO,MAAM,yBAAyB,KACxC,QAAO;AAET,KAAI,KAAK,QAAQ,OAAO,IAAI,KAAK,KAAK,QAAQ,OAAO,IAAI,CACvD,QAAO;AAET,KAAI,OAAO,iBAAiB,OAAO,aACjC,QAAO;AAET,KAAI,OAAO,mBAAmB,OAAO,iBAAiB,OAAO,gBAC3D,QAAO;AAET,QAAO;;;;ACwCT,SAAS,iBAAiC;CACxC,IAAI;CACJ,IAAI;AAKJ,QAAO;EAAE,SAAA,IAJW,SAAY,KAAK,QAAQ;AAC3C,aAAU;AACV,YAAS;IAEK;EAAE;EAAS;EAAQ;;AAGrC,SAAS,2BACP,QACA,eACM;AACN,KAAI,CAAC,cACH;CAEF,MAAM,YAAY,sBAAsB,OAAO,KAAK,IAAI,EAAE;AAC1D,WAAU,iBAAiB,gBAAgB,cAAc;AACzD,QAAO,OAAO;;AAGhB,IAAM,kBAAN,MAAsB;CACpB,QAA4C,EAAE;CAC9C,QAA6D,EAAE;CAC/D,SAAiB;CAEjB,KAAK,MAA6B;AAChC,MAAI,KAAK,OACP;EAEF,MAAM,SAAS,KAAK,MAAM,OAAO;AACjC,MAAI,QAAQ;AACV,UAAO,QAAQ,KAAK;AACpB;;AAEF,OAAK,MAAM,KAAK,KAAK;;CAGvB,QAAc;AACZ,MAAI,KAAK,OACP;AAEF,OAAK,SAAS;AACd,OAAK,MAAM,UAAU,KAAK,MAAM,OAAO,EAAE,CACvC,QAAO,QAAQ,KAAK;;CAIxB,QAAc;AACZ,OAAK,MAAM,SAAS;;CAGtB,MAAM,OAAwC;AAC5C,MAAI,KAAK,MAAM,SAAS,EACtB,QAAO,KAAK,MAAM,OAAO,IAAI;AAE/B,MAAI,KAAK,OACP,QAAO;EAET,MAAM,SAAS,gBAAwC;AACvD,OAAK,MAAM,KAAK,OAAO;AACvB,SAAO,MAAM,OAAO;;CAGtB,OAAO,UAA0C;AAC/C,SAAO,MAAM;GACX,MAAM,OAAO,MAAM,KAAK,MAAM;AAC9B,OAAI,CAAC,KACH;AAEF,SAAM;;;;AAKZ,SAAS,SAAiB;AACxB,yBAAO,IAAI,MAAM,EAAC,aAAa;;AAGjC,SAAS,+BAA+B,OAAyB;CAC/D,MAAM,MAAM,gBAAgB,MAAM;AAClC,KAAI,CAAC,IACH,QAAO;AAET,KAAI,IAAI,SAAS,UAAU,IAAI,SAAS,OACtC,QAAO;AAET,KAAI,IAAI,SAAS,UAAU,CAAC,IAAI,QAAQ,OAAO,IAAI,SAAS,SAC1D,QAAO;CAET,MAAM,UAAW,IAAI,KAA+B;AACpD,QAAO,OAAO,YAAY,YAAY,QAAQ,aAAa,CAAC,SAAS,iBAAiB;;AAGxF,SAAS,cACP,MACA,aACsB;AACtB,KAAI,CAAC,eAAe,YAAY,WAAW,EACzC,QAAO;CAET,MAAM,SAEF,EAAE;AACN,KAAI,KACF,QAAO,KAAK;EAAE,MAAM;EAAQ;EAAM,CAAC;AAErC,MAAK,MAAM,cAAc,aAAa;AACpC,MAAI,CAAC,WAAW,UAAU,WAAW,SAAS,CAC5C,OAAM,IAAI,gBACR,mBACA,kDAAkD,WAAW,YAC9D;AAEH,SAAO,KAAK;GACV,MAAM;GACN,UAAU,WAAW;GACrB,MAAM,WAAW;GAClB,CAAC;;AAEJ,QAAO,OAAO,SAAS,IAAI,SAAS,WAAW,KAAK;;AAGtD,SAAS,oBAAoB,QAOX;CAChB,MAAM,MAAM,QAAQ;AACpB,QAAO;EACL,QAAQ;EACR,cAAc,OAAO;EACrB,cAAc,OAAO;EACrB,gBAAgB,OAAO;EACvB,cAAc,OAAO;EACrB,KAAK,OAAO;EACZ,MAAM,OAAO;EACb,WAAW;EACX,YAAY;EACZ,SAAS;EACT,UAAU,uBAAuB,OAAO,SAAS;EACjD,QAAQ;EACR,UAAU,KAAA;EACV,GAAG,0BAA0B,IAAI;EACjC,MAAM,EAAE;EACT;;AAGH,SAAS,eAAe,YAAoB,MAAwC;AAClF,KAAI,SAAS,aACX,QAAO;AAET,QAAO,GAAG,WAAW,WAAW,YAAY;;AAG9C,SAAS,2BAA2B,MAAqD;AACvF,QAAO,SAAS,eAAe,sBAAsB;;AAGvD,SAAS,kCAAkC,QAA+C;AACxF,KAAI,OAAO,WAAW,SACpB,QAAO;EACL,MAAM;EACN,SAAS,OAAO,MAAM;EACtB,GAAI,OAAO,MAAM,OAAO,EAAE,MAAM,OAAO,MAAM,MAAM,GAAG,EAAE;EACxD,GAAI,OAAO,MAAM,cAAc,KAAA,IAAY,EAAE,GAAG,EAAE,WAAW,OAAO,MAAM,WAAW;EACtF;AAEH,QAAO;EACL,MAAM;EACN,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,YAAY,GAAG,EAAE;EAC/D;;AAGH,SAAS,cAAc,QAA+B;AAQpD,QAPc;EACZ,WAAW,OAAO;EAClB,oBAAoB,OAAO;EAC3B,OAAO,iBAAiB,kBAAkB,OAAO,mBAAmB;EACpE,OAAO,OAAO,OAAO,OAAO,OAAO,QAAQ;EAC3C,OAAO,SAAS,WAAW;EAC5B,CAAC,OAAO,QACG,CAAC,KAAK,IAAI;;AAGxB,IAAa,oBAAb,MAA+B;CAC7B,oCAAqC,IAAI,KAAsC;CAC/E,2CAA4C,IAAI,KAAwB;CACxE,uCAAwC,IAAI,KAAa;CAEzD,YACE,SACA,OAA+C,EAAE,EACjD;AAFiB,OAAA,UAAA;AACA,OAAA,OAAA;;CAGnB,aAAqB,SAAgE;AACnF,SAAO,KAAK,KAAK,gBAAgB,QAAQ,IAAI,IAAI,UAAU,QAAQ;;CAGrE,MAAc,4BACZ,QACA,SACgC;EAChC,MAAM,gBAAgB,KAAK,yBAAyB,IAAI,OAAO,aAAa;AAC5E,MAAI,CAAC,cACH;AAEF,MAAI,CAAC,cAAc,mBAAmB,OAAO,aAAa,EAAE;AAC1D,QAAK,yBAAyB,OAAO,OAAO,aAAa;AACzD,SAAM,cAAc,OAAO,CAAC,YAAY,GAAG;AAC3C;;AAEF,MAAI,QAAQ,QACV,MAAK,yBAAyB,OAAO,OAAO,aAAa;AAE3D,SAAO;;CAGT,MAAc,6BAA6B,UAAiC;EAC1E,MAAM,gBAAgB,KAAK,yBAAyB,IAAI,SAAS;AACjE,MAAI,CAAC,cACH;AAEF,OAAK,yBAAyB,OAAO,SAAS;AAC9C,QAAM,cAAc,OAAO,CAAC,YAAY,GAAG;;CAG7C,MAAc,mBAAmB,QAAyC;AACxE,MAAI,CAAC,KAAK,qBAAqB,IAAI,OAAO,aAAa,CACrD,QAAO,OAAO,WAAW;EAE3B,MAAM,SAAS,MAAM,KAAK,QAAQ,aAAa,KAAK,OAAO,aAAa,CAAC,YAAY,KAAA,EAAU;AAC/F,SAAO,SAAS;AAChB,SAAO,WAAW,QAAQ,YAAY,OAAO,YAAY,QAAQ;AACjE,MAAI,QAAQ,KACV,QAAO,OAAO;GACZ,GAAG,OAAO;GACV,GAAG,OAAO;GACX;AAEH,SAAO;;CAGT,MAAc,gCAAgC,OAGzB;EACnB,MAAM,EAAE,QAAQ,WAAW;AAE3B,MAAI,CAAC,CADuB,OAAO,aAAa,SAAS,YAAY,IAC1C,OAAO,UAAU,CAAC,OAAO,mBAAmB,OAAO,aAAa,CACzF,QAAO;EAET,MAAM,iBAAiB,KAAK,yBAAyB,IAAI,OAAO,aAAa;AAC7E,OAAK,yBAAyB,IAAI,OAAO,cAAc,OAAO;AAC9D,MAAI,kBAAkB,mBAAmB,OACvC,OAAM,eAAe,OAAO,CAAC,YAAY,GAAG;AAE9C,SAAO;;CAGT,MAAc,0BACZ,QACA,aACA,KAC8C;EAC9C,MAAM,gBAAgB,MAAM,KAAK,4BAA4B,QAAQ,EAAE,SAAS,OAAO,CAAC;AACxF,MAAI,eAAe;GACjB,MAAM,QAAQ,MAAM,IAAI;IACtB,QAAQ;IACR,WAAW,OAAO;IAClB;IACD,CAAC;AACF,UAAO,aAAa,QAAQ;AAC5B,UAAO,SAAS;AAChB,UAAO,WAAW,KAAA;AAClB,UAAO,kBAAkB,cAAc,kBAAkB;AACzD,UAAO,oBAAoB,cAAc,kBAAkB;AAC3D,kCAA+B,QAAQ,cAAc,2BAA2B,CAAC;AACjF,UAAO;IAAE;IAAO;IAAQ;;EAG1B,MAAM,SAAS,MAAM,qBAAqB;GACxC,iBAAiB,OAAO;GACxB,YAAY,OAAO,oBAAoB,MAAM,KAAK,cAAc,gBAAgB;GAChF,YAAY,OAAO,oBAAoB,MAAM,KAAK,QAAQ,aAAa,KAAK,gBAAgB;GAC5F,eAAe,YAAY,KAAK,aAAa,QAAQ;GACrD,YAAY,CAAC,GAAI,KAAK,QAAQ,cAAc,EAAE,CAAE;GAChD,gBAAgB,KAAK,QAAQ;GAC7B,2BAA2B,KAAK,QAAQ;GACxC,SAAS,KAAK,QAAQ;GACtB,WAAW,KAAK,QAAQ;GACxB,cAAc,2BAA2B,YAAY;GACrD;GACD,CAAC;AACF,SAAO;GACL,OAAO,OAAO;GACd,QAAQ,OAAO;GAChB;;CAEH,MAAM,cAAc,OAMO;EACzB,MAAM,MAAM,KAAK,QAAQ,MAAM,KAAK,MAAM,IAAI,KAAK,QAAQ,IAAI;EAC/D,MAAM,eAAe,KAAK,QAAQ,cAAc,QAAQ,MAAM,MAAM;EACpE,MAAM,WAAW,MAAM,KAAK,QAAQ,aAAa,KAAK,MAAM,WAAW;AACvE,MACE,MAAM,SAAS,gBACf,YACA,0BAA0B,UAAU;GAClC;GACA;GACA,iBAAiB,MAAM;GACxB,CAAC,EACF;AACA,YAAS,SAAS;AAClB,YAAS,WAAW,KAAA;AACpB,QAAK,qBAAqB,OAAO,SAAS,aAAa;AACvD,SAAM,KAAK,QAAQ,aAAa,KAAK,SAAS;AAC9C,UAAO;;EAGT,MAAM,SAAS,KAAK,aAAa;GAC/B;GACA;GACA,YAAY,CAAC,GAAI,KAAK,QAAQ,cAAc,EAAE,CAAE;GAChD,gBAAgB,KAAK,QAAQ;GAC7B,2BAA2B,KAAK,QAAQ;GACxC,SAAS,KAAK,QAAQ;GACvB,CAAC;EACF,IAAI,iBAAiB;AAErB,MAAI;AACF,SAAM,OAAO,OAAO;GACpB,IAAI;GACJ,IAAI;AACJ,OAAI,MAAM,iBAAiB;IACzB,MAAM,SAAS,MAAM,OAAO,YAAY,MAAM,iBAAiB,IAAI;AACnE,gBAAY,MAAM;AAClB,qBAAiB,OAAO;UACnB;IACL,MAAM,UAAU,MAAM,OAAO,cAAc,IAAI;AAC/C,gBAAY,QAAQ;AACpB,qBAAiB,QAAQ;;GAE3B,MAAM,SAAS,oBAAoB;IACjC,UAAU,eAAe,MAAM,YAAY,MAAM,KAAK;IACtD,aAAa,MAAM;IACnB;IACA;IACA;IACA;IACD,CAAC;AACF,QAAK,qBAAqB,OAAO,OAAO,aAAa;AACrD,UAAO,kBAAkB,OAAO,kBAAkB;AAClD,UAAO,oBAAoB,OAAO,kBAAkB;AACpD,kCAA+B,QAAQ,OAAO,2BAA2B,CAAC;AAC1E,SAAM,KAAK,QAAQ,aAAa,KAAK,OAAO;AAC5C,OAAI,MAAM,SAAS,cAAc;IAC/B,MAAM,iBAAiB,KAAK,yBAAyB,IAAI,OAAO,aAAa;AAC7E,SAAK,yBAAyB,IAAI,OAAO,cAAc,OAAO;AAC9D,qBAAiB;AACjB,UAAM,gBAAgB,OAAO,CAAC,YAAY,GAAG;;AAE/C,UAAO;YACC;AACR,OAAI,CAAC,eACH,OAAM,OAAO,OAAO;;;CAK1B,UAAU,OASS;EACjB,MAAM,cAAc,cAAc,MAAM,MAAM,MAAM,YAAY;EAChE,MAAM,QAAQ,IAAI,iBAAiB;EACnC,MAAM,SAAS,gBAAsC;EACrD,MAAM,eAAe,gBAAsB;AACtC,eAAa,QAAQ,YAAY,GAAG;EACzC,IAAI,gBAAgB;EACpB,IAAI,gBAAgB;EACpB,IAAI,aAAa;EACjB,IAAI,eAAe;EACnB,IAAI,mBAAmD;EAEvD,MAAM,gBAAgB,SAAqC;AACzD,OAAI,cACF;AAEF,mBAAgB;AAChB,UAAO,QAAQ,KAAK;;EAGtB,MAAM,oBAA0B;AAC9B,OAAI,aACF;AAEF,kBAAe;AACf,SAAM,OAAO;AACb,SAAM,OAAO;;EAGf,MAAM,gBAAgB,YAA8B;AAClD,OAAI,iBACF,QAAO,MAAM,iBAAiB,2BAA2B;AAE3D,OAAI,CAAC,WACH,QAAO;AAET,mBAAgB;AAChB,UAAO;;EAGT,MAAM,qBAAqB;AACpB,kBAAe;;AAEtB,MAAI,MAAM,QAAQ;AAChB,OAAI,MAAM,OAAO,SAAS;AACxB,iBAAa;AACb,iBAAa;KACX,QAAQ;KACR,YAAY;KACb,CAAC;AACF,WAAO;KACL,WAAW,MAAM;KACjB,QAAQ,MAAM,SAAS;KACvB,QAAQ,OAAO;KACf,QAAQ,YAAY;KACpB,aAAa,YAAY;KAC1B;;AAEH,SAAM,OAAO,iBAAiB,SAAS,cAAc,EAAE,MAAM,MAAM,CAAC;;AAGtE,GAAM,YAAY;GAChB,IAAI,SAA+B;GACnC,IAAI,eAAmE;GACvE,IAAI;GACJ,IAAI,SAA2B;AAC/B,OAAI;AACF,aAAS,MAAM,KAAK,cAAc,MAAM,OAAO,gBAAgB,MAAM,OAAO,WAAW;AACvF,mBAAe,yBAAyB,OAAO;AAC/C,gBAAY,sBAAsB,OAAO,KAAK;IAC9C,MAAM,kBAAkB,QAAQ;IAChC,MAAM,kBAAkB,uBAAuB,cAAc,aAAa,gBAAgB;AAC1F,+BAA2B,aAAa;AACxC,WAAO,eAAe;AACtB,WAAO,aAAa;AACpB,WAAO,OAAO;AACd,sBAAkB,QAAQ,aAAa;AACvC,UAAM,KAAK,QAAQ,aAAa,KAAK,OAAO;IAE5C,MAAM,gBAAgB,MAAM,KAAK,4BAA4B,QAAQ,EAAE,SAAS,MAAM,CAAC;AACvF,aACE,iBACA,KAAK,aAAa;KAChB,cAAc,OAAO;KACrB,KAAK,OAAO;KACZ,YAAY,CAAC,GAAI,KAAK,QAAQ,cAAc,EAAE,CAAE;KAChD,gBAAgB,KAAK,QAAQ;KAC7B,2BAA2B,KAAK,QAAQ;KACxC,SAAS,KAAK,QAAQ;KACvB,CAAC;IACJ,MAAM,gBAAgB;IACtB,MAAM,sBAAsB;IAC5B,MAAM,gBAAgB;IACtB,IAAI,kBAAkB,OAAO;IAE7B,MAAM,qBAAqB,YAA8B;AACvD,SAAI,CAAC,iBAAiB,CAAC,cAAc,iBAAiB,CACpD,QAAO;KAET,MAAM,YAAY,MAAM,cAAc,2BAA2B;AACjE,SAAI,UACF,iBAAgB;AAElB,YAAO;;AAGT,uBAAmB;KACjB,uBAAuB,cAAc,iBAAiB;KACtD,2BAA2B,YAAY;AACrC,UAAI,cAAc,iBAAiB,CACjC,QAAO,MAAM,cAAc,2BAA2B;AAExD,UAAI,CAAC,WACH,QAAO;AAET,sBAAgB;AAChB,aAAO;;KAET,gBAAgB,OAAO,WAAmB;AACxC,UAAI,CAAC,cAAc,iBAAiB,CAClC,OAAM,aAAa;AAErB,YAAM,cAAc,eAAe,iBAAiB,OAAO;MAC3D,MAAM,YAAY,sBAAsB,UAAU,IAAI,EAAE;AACxD,gBAAU,kBAAkB;AAC5B,kBAAY;;KAEd,iBAAiB,OAAO,YAAoB;AAC1C,UAAI,CAAC,cAAc,iBAAiB,CAClC,OAAM,aAAa;AAErB,YAAM,cAAc,gBAAgB,iBAAiB,QAAQ;;KAE/D,wBAAwB,OAAO,UAAkB,UAAkB;AACjE,UAAI,CAAC,cAAc,iBAAiB,CAClC,OAAM,aAAa;MAErB,MAAM,WAAW,MAAM,cAAc,uBACnC,iBACA,UACA,MACD;AACD,UAAI,UAAU,eAAe;OAC3B,MAAM,YAAY,sBAAsB,UAAU,IAAI,EAAE;AACxD,iBAAU,iBAAiB,gBAAgB,SAAS,cAAc;AAClE,mBAAY;;AAEd,UAAI,aAAa,QAAQ;OACvB,MAAM,YAAY,sBAAsB,UAAU,IAAI,EAAE;AACxD,iBAAU,kBAAkB;AAC5B,mBAAY;iBACH,aAAa,SAAS;OAC/B,MAAM,YAAY,sBAAsB,UAAU,IAAI,EAAE;AACxD,iBAAU,yBAAyB;QACjC,GAAG,UAAU;SACZ,WAAW;QACb;AACD,mBAAY;;AAEd,aAAO;;KAEV;IAED,MAAM,cAAc,YAA2C;AAC7D,SAAI,aACF;KAEF,MAAM,SAAS,qBAAqB,KAAK,UAAU,QAAQ,CAAC;AAC5D,SAAI,CAAC,OACH;AAEF,WAAM,KAAK,OAAO;;AAGpB,SAAK,kBAAkB,IAAI,cAAc,cAAc,iBAAiB;AACxE,kBAAc,iBAAiB;KAC7B,kBAAkB,iBAAiB;AACjC,kBAAY,oBAAoB,qBAAqB,WAAW,aAAa;AAC7E,iCAA2B,oBAAoB;AAC/C,iBAAW;OACT,SAAS;OACT,QAAQ;OACR,QAAQ;OACT,CAAC;;KAEJ,oBAAoB,cAA+B;AACjD,kBAAY,sBAAsB,qBAAqB,WAAW,UAAU;AAC5E,iCAA2B,oBAAoB;AAC/C,iBAAW;OACT,MAAM;OACN,GAAG;OACJ,CAAC;;KAEL,CAAC;IAEF,MAAM,EAAE,WAAW,SAAS,cAAc,gBACtC;KACE,WAAW,OAAO;KAClB,SAAS;KACT,WAAW,KAAA;KACZ,GACD,MAAM,sBAAsB;KAC1B,QAAQ;KACR,QAAQ;KACR,cAAc,2BAA2B,MAAM,YAAY;KAC3D,WAAW,KAAK,QAAQ;KACxB;KACA,oBAAoB,eAAe;AACjC,yBAAmB;AACnB,WAAK,kBAAkB,IAAI,cAAc,cAAc,WAAW;;KAEpE,oBAAoB,oBAAoB;AACtC,sBAAgB,eAAe,QAAQ;;KAEzC,sBAAsB,mBAAmB;AACvC,wBAAkB;;KAErB,CAAC;AACN,iBAAa,SAAS;AAEtB,kBAAc,gBAAgB,MAAM;AACpC,kBAAc,eAAe,QAAQ;AACrC,kBAAc,SAAS;AACvB,kBAAc,WAAW,KAAA;AACzB,kBAAc,aAAa,QAAQ;AACnC,QAAI,WAAW,UACb,YAAW;KACT,MAAM;KACN,MAAM,YAAY,kBAAkB,cAAc;KACnD,CAAC;AAGJ,QAAI,iBAAiB,MAAM,QAAQ,SAAS;AAC1C,qBAAgB;AAChB,kBAAa;MACX,QAAQ;MACR,YAAY;MACb,CAAC;AACF;;AAGF,UAAM,oBAAoB;IAC1B,MAAM,WAAW,MAAM,cAAc;KACnC,QAAQ;KACR;KACA,QAAQ;KACR,WAAW,MAAM,aAAa,KAAK,QAAQ;KAC3C,cAAc;KACd;KACD,CAAC;AAEF,kBAAc,eAAe;AAC7B,4BAAwB,eAAe,cAAc,eAAe;AACpE,kBAAc,kBAAkB,cAAc,kBAAkB;AAChE,kBAAc,oBAAoB,cAAc,kBAAkB;AAClE,kBAAc,OAAO;AACrB,sBAAkB,eAAe,oBAAoB;AACrD,mCAA+B,eAAe,cAAc,2BAA2B,CAAC;AACxF,UAAM,KAAK,QAAQ,aAAa,KAAK,cAAc;AAEnD,iBAAa;KACX,QAAQ,SAAS,eAAe,cAAc,cAAc;KAC5D,GAAI,SAAS,aAAa,EAAE,YAAY,SAAS,YAAY,GAAG,EAAE;KACnE,CAAC;YACK,OAAO;AACd,iBAAa,OAAO,MAAM;IAC1B,MAAM,aAAa,qBAAqB,OAAO,EAAE,QAAQ,WAAW,CAAC;AACrE,iBAAa;KACX,QAAQ;KACR,OAAO;MACL,SAAS,WAAW;MACpB,GAAI,WAAW,OAAO,EAAE,MAAM,WAAW,MAAM,GAAG,EAAE;MACpD,GAAI,WAAW,cAAc,KAAA,IAAY,EAAE,WAAW,WAAW,WAAW,GAAG,EAAE;MAClF;KACF,CAAC;aACM;AACR,iBAAa;AACb,QAAI,MAAM,OACR,OAAM,OAAO,oBAAoB,SAAS,aAAa;AAEzD,YAAQ,oBAAoB;IAC5B,IAAI,SAAS;AACb,QAAI,UAAU,cAAc;AAC1B,oCACE,QACA,QAAQ,2BAA2B,IAAI,EAAE,SAAS,OAAO,CAC1D;AACD,YAAO,OAAO;AACd,uBAAkB,QAAQ,aAAa;AACvC,YAAO,aAAa,QAAQ;KAC5B,MAAM,SAAS,MAAM,KAAK,mBAAmB,OAAO;AACpD,WAAM,KAAK,QAAQ,aAAa,KAAK,OAAO,CAAC,YAAY,GAAG;AAC5D,SAAI,CAAC,UAAU,OACb,UAAS,MAAM,KAAK,gCAAgC;MAAE;MAAQ;MAAQ,CAAC;;AAG3E,QAAI,CAAC,OACH,OAAM,QAAQ,OAAO,CAAC,YAAY,GAAG;AAEvC,QAAI,QAAQ;AACV,UAAK,kBAAkB,OAAO,OAAO,aAAa;AAClD,UAAK,qBAAqB,OAAO,OAAO,aAAa;;AAEvD,UAAM,OAAO;;MAEb;AAEJ,SAAO;GACL,WAAW,MAAM;GACjB,QAAQ,MAAM,SAAS;GACvB,QAAQ,OAAO;GACf,QAAQ,YAAY;AAClB,UAAM,eAAe;;GAEvB,aAAa,YAAY;AACvB,iBAAa;;GAEhB;;CAGH,OAAO,QAAQ,OASoB;EACjC,MAAM,OAAO,KAAK,UAAU,MAAM;AAClC,SAAO,KAAK;AACZ,QAAM,kCAAkC,MAAM,KAAK,OAAO;;CAG5D,MAAM,UAAU,QAAqD;EACnE,MAAM,SAAS,MAAM,KAAK,cAAc,OAAO,gBAAgB,OAAO,WAAW;AACjF,SAAO;GACL,SAAS,cAAc,OAAO;GAC9B,cAAc,OAAO;GACrB,kBAAkB,OAAO;GACzB,gBAAgB,OAAO;GACvB,SAAS;IACP,KAAK,OAAO;IACZ,YAAY,OAAO;IACnB,QAAQ,OAAO,WAAW;IAC1B,GAAI,OAAO,MAAM,mBAAmB,KAAA,IAChC,EAAE,eAAe,gBAAgB,OAAO,KAAK,eAAe,EAAE,GAC9D,EAAE;IACP;GACF;;CAGH,MAAM,QACJ,QACA,MACA,cAAwC,cACzB;EACf,MAAM,SAAS,MAAM,KAAK,cAAc,OAAO,gBAAgB,OAAO,WAAW;EACjF,MAAM,aAAa,KAAK,kBAAkB,IAAI,OAAO,aAAa;EAClE,IAAI,eAAe;AACnB,MAAI,WACF,OAAM,WAAW,eAAe,KAAK;MASrC,iBAAe,MAPM,KAAK,0BACxB,QACA,aACA,OAAO,EAAE,QAAQ,gBAAgB;AAC/B,SAAM,OAAO,eAAe,WAAW,KAAK;IAE/C,EACqB;AAExB,mBAAiB,cAAc,KAAK;AACpC,QAAM,KAAK,QAAQ,aAAa,KAAK,aAAa;;CAGpD,MAAM,gBACJ,QACA,KACA,OACA,cAAwC,cACzB;EACf,MAAM,SAAS,MAAM,KAAK,cAAc,OAAO,gBAAgB,OAAO,WAAW;EACjF,MAAM,aAAa,KAAK,kBAAkB,IAAI,OAAO,aAAa;EAClE,IAAI,eAAe;AACnB,MAAI,YAAY;GACd,MAAM,WAAW,MAAM,WAAW,uBAAuB,KAAK,MAAM;AACpE,8BAA2B,cAAc,UAAU,cAAc;QAejE,iBAAe,MAbM,KAAK,0BACxB,QACA,aACA,OAAO,EAAE,QAAQ,WAAW,QAAQ,sBAAsB;AAExD,8BAA2B,kBAAiB,MADrB,OAAO,uBAAuB,WAAW,KAAK,MAAM,GACrB,cAAc;AACpE,OAAI,QAAQ,OACV,kBAAiB,iBAAiB,MAAM;OAExC,wBAAuB,iBAAiB,KAAK,MAAM;IAGxD,EACqB;AAExB,MAAI,QAAQ,OACV,kBAAiB,cAAc,MAAM;MAErC,wBAAuB,cAAc,KAAK,MAAM;AAElD,QAAM,KAAK,QAAQ,aAAa,KAAK,aAAa;;CAGpD,MAAM,OAAO,QAAyC;AAEpD,QADmB,KAAK,kBAAkB,IAAI,OAAO,gBAAgB,OAAO,WAC5D,EAAE,2BAA2B;;CAG/C,MAAM,MACJ,QACA,UAAgD,EAAE,EACnC;EACf,MAAM,SAAS,MAAM,KAAK,cAAc,OAAO,gBAAgB,OAAO,WAAW;AACjF,MAAI,KAAK,kBAAkB,IAAI,OAAO,aAAa,CACjD,MAAK,qBAAqB,IAAI,OAAO,aAAa;AAEpD,QAAM,KAAK,OAAO,OAAO;AACzB,MAAI,QAAQ,wBAAwB;AAClC,SAAM,KAAK,oBAAoB,OAAO;AACtC,UAAO,OAAO;IACZ,GAAG,OAAO;IACV,sBAAsB;IACvB;QAED,OAAM,KAAK,6BAA6B,OAAO,aAAa;AAE9D,SAAO,SAAS;AAChB,SAAO,WAAW,QAAQ;AAC1B,QAAM,KAAK,QAAQ,aAAa,KAAK,OAAO;;CAG9C,MAAc,oBAAoB,QAAsC;EACtE,MAAM,gBAAgB,MAAM,KAAK,4BAA4B,QAAQ,EAAE,SAAS,MAAM,CAAC;EAEvF,MAAM,SACJ,iBACA,KAAK,aAAa;GAChB,cAAc,OAAO;GACrB,KAAK,OAAO;GACZ,YAAY,CAAC,GAAI,KAAK,QAAQ,cAAc,EAAE,CAAE;GAChD,gBAAgB,KAAK,QAAQ;GAC7B,2BAA2B,KAAK,QAAQ;GACxC,SAAS,KAAK,QAAQ;GACvB,CAAC;AAEJ,MAAI;AACF,OAAI,CAAC,cACH,OAAM,YAAY,OAAO,OAAO,EAAE,KAAK,QAAQ,UAAU;AAE3D,OAAI,CAAC,OAAO,sBAAsB,CAChC,OAAM,IAAI,gBACR,mCACA,4CAA4C,OAAO,aAAa,GACjE;AAEH,SAAM,YAAY,OAAO,aAAa,OAAO,aAAa,EAAE,KAAK,QAAQ,UAAU;WAC5E,OAAO;AACd,OAAI,+BAA+B,MAAM,CACvC,OAAM,IAAI,gBACR,mCACA,4CAA4C,OAAO,aAAa,IAChE,EAAE,OAAO,OAAO,CACjB;AAEH,OAAI,2BAA2B,MAAM,CACnC;AAEF,SAAM;YACE;AACR,SAAM,OAAO,OAAO,CAAC,YAAY,GAAG;;;CAIxC,MAAc,cAAc,WAA2C;EACrE,MAAM,SAAS,MAAM,KAAK,QAAQ,aAAa,KAAK,UAAU;AAC9D,MAAI,CAAC,OACH,OAAM,IAAI,MAAM,0BAA0B,YAAY;AAExD,SAAO;;;;;ACp6BX,SAAS,cAAc,WAA2B;AAChD,QAAO,mBAAmB,UAAU;;AAGtC,IAAM,mBAAN,MAAkD;CAChD,YAAY,UAAmC;AAAlB,OAAA,WAAA;;CAE7B,IAAY,aAAqB;AAC/B,SAAO,KAAK,KAAK,KAAK,UAAU,WAAW;;CAG7C,SAAiB,WAA2B;AAC1C,SAAO,KAAK,KAAK,KAAK,YAAY,GAAG,cAAc,UAAU,CAAC,OAAO;;CAGvE,MAAc,YAA2B;AACvC,QAAM,GAAG,MAAM,KAAK,YAAY,EAAE,WAAW,MAAM,CAAC;;CAGtD,MAAM,KAAK,WAA0D;AACnE,QAAM,KAAK,WAAW;AACtB,MAAI;GACF,MAAM,UAAU,MAAM,GAAG,SAAS,KAAK,SAAS,UAAU,EAAE,OAAO;AACnE,UAAO,mBAAmB,KAAK,MAAM,QAAQ,CAAC,IAAI,KAAA;WAC3C,OAAO;AACd,OAAK,MAAgC,SAAS,SAC5C;AAEF,SAAM;;;CAIV,MAAM,KAAK,QAAyC;AAClD,QAAM,KAAK,WAAW;EACtB,MAAM,YAAY,8BAA8B,OAAO;AACvD,2BAAyB,UAAU;EAEnC,MAAM,OAAO,KAAK,SAAS,OAAO,aAAa;EAC/C,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,IAAI,GAAG,KAAK,KAAK,CAAC;EACtD,MAAM,UAAU,KAAK,UAAU,WAAW,MAAM,EAAE;AAClD,QAAM,GAAG,UAAU,UAAU,GAAG,QAAQ,KAAK,OAAO;AACpD,QAAM,GAAG,OAAO,UAAU,KAAK;;;AAInC,SAAgB,uBAAuB,SAAsD;AAC3F,QAAO,IAAI,iBAAiB,KAAK,QAAQ,QAAQ,SAAS,CAAC;;;;ACjD7D,MAAM,6BAA6B;AAEnC,SAAgB,6BAA6B,OAAgC;AAE3E,QAAO,GAAG,6BADM,OAAO,KAAK,KAAK,UAAU,MAAM,EAAE,OAAO,CAAC,SAAS,YACtB;;AAGhD,SAAgB,6BAA6B,oBAAoD;CAC/F,MAAM,UAAU,mBAAmB,MAAM;AACzC,KAAI,CAAC,QAAQ,WAAW,2BAA2B,CACjD,QAAO;AAET,KAAI;EACF,MAAM,MAAM,OAAO,KAAK,QAAQ,MAAM,EAAkC,EAAE,YAAY,CAAC,SACrF,OACD;EACD,MAAM,SAAS,KAAK,MAAM,IAAI;EAC9B,MAAM,OAAO,iBAAiB,OAAO,KAAK;EAC1C,MAAM,QAAQ,iBAAiB,OAAO,MAAM;EAC5C,MAAM,MAAM,iBAAiB,OAAO,IAAI;EACxC,MAAM,OAAO,iBAAiB,OAAO,KAAK;AAC1C,MAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAQ,SAAS,gBAAgB,SAAS,UAChE,QAAO;AAET,SAAO;GACL;GACA;GACA;GACA;GACA,cAAc,iBAAiB,OAAO,aAAa;GACnD,kBAAkB,iBAAiB,OAAO,iBAAiB;GAC3D,gBAAgB,iBAAiB,OAAO,eAAe;GACxD;SACK;AACN,SAAO;;;AAIX,SAAgB,iBAAiB,QAA0B,OAA8B;AACvF,QAAO,qBAAqB,6BAA6B,MAAM;AAC/D,QAAO,MAAM,MAAM;AACnB,QAAO,eAAe,MAAM;AAC5B,QAAO,mBAAmB,MAAM;AAChC,QAAO,iBAAiB,MAAM;;;;ACjChC,SAAgB,oBAAoB,OAAwB;AAC1D,KAAI,iBAAiB,MACnB,QAAO,MAAM,WAAW,MAAM;AAEhC,KAAI,OAAO,UAAU,SACnB,QAAO;AAET,KACE,SAAS,QACT,OAAO,UAAU,YACjB,OAAO,UAAU,aACjB,OAAO,UAAU,YACjB,OAAO,UAAU,SAEjB,QAAO,OAAO,MAAM;AAEtB,KAAI,OAAO,UAAU,WACnB,QAAO,MAAM,OAAO,aAAa,MAAM,KAAK,KAAK;CAGnD,MAAM,uBAAO,IAAI,SAAiB;AAClC,KAAI;AAaF,SAZmB,KAAK,UAAU,QAAQ,MAAM,WAAW;AACzD,OAAI,kBAAkB,MACpB,QAAO,OAAO,WAAW,OAAO;AAElC,OAAI,UAAU,OAAO,WAAW,UAAU;AACxC,QAAI,KAAK,IAAI,OAAO,CAClB,QAAO;AAET,SAAK,IAAI,OAAO;;AAElB,UAAO;IAEQ,IAAI;SACf;AACN,SAAO;;;AAIX,SAAgB,wBACd,SACsB;AACtB,QAAO,SAAS,KAAK,WAAW,oBAAoB,OAAO,CAAC;;AAG9D,eAAsB,aACpB,SACA,OAAyB,EAAE,EACG;CAC9B,MAAM,YAAY,QAAQ,YAAY,MAAM,IAAA;CAC5C,MAAM,eAAe,QAAQ,cAAc,QAAQ,UAAU;CAC7D,MAAM,SACJ,KAAK,gBAAgB;EACnB;EACA,KAAK,QAAQ;EACb,YAAY,CAAC,GAAI,QAAQ,cAAc,EAAE,CAAE;EAC3C,gBAAgB,QAAQ;EACxB,2BAA2B,QAAQ;EACnC,SAAS,QAAQ;EAClB,CAAC,IACF,IAAI,UAAU;EACZ;EACA,KAAK,QAAQ;EACb,YAAY,CAAC,GAAI,QAAQ,cAAc,EAAE,CAAE;EAC3C,gBAAgB,QAAQ;EACxB,2BAA2B,QAAQ;EACnC,SAAS,QAAQ;EAClB,CAAC;AAEJ,KAAI;AACF,QAAM,OAAO,OAAO;AACpB,SAAO;GACL,IAAI;GACJ,SAAS;GACT,SAAS;IACP,SAAS;IACT,WAAW;IACX,OAAO,QAAQ;IACf,GAAI,OAAO,kBAAkB,kBACzB,CAAC,mBAAmB,OAAO,iBAAiB,kBAAkB,GAC9D,EAAE;IACP;GACF;UACM,OAAO;AACd,SAAO;GACL,IAAI;GACJ,SAAS;GACT,SAAS;IACP,SAAS;IACT,WAAW;IACX,OAAO,QAAQ;IACf,oBAAoB,MAAM;IAC3B;GACF;WACO;AACR,QAAM,OAAO,OAAO,CAAC,YAAY,GAAG;;;;;AC3DxC,MAAa,kBAAkB;AAE/B,MAAM,oBAA4C,EAChD,UAAU;CAAC;CAAoB;CAA6B;CAAiB,EAC9E;AAQD,SAAgB,oBAAoB,QAEf;AACnB,QAAO;EACL,QAAQ,WAAmB;AACzB,UAAO,oBAAoB,WAAW,QAAQ,UAAU;;EAE1D,OAAO;AACL,UAAO,kBAAkB,QAAQ,UAAU;;EAE9C;;AAGH,IAAa,cAAb,MAAoD;CAClD,UAAkB;CAClB,UAA4C;CAC5C,iBAA4D;CAE5D,YACE,SACA,aAQA;AATiB,OAAA,UAAA;AACA,OAAA,cAAA;;CAUnB,YAAqB;AACnB,SAAO,KAAK;;CAGd,MAAM,oBAAmC;EACvC,MAAM,SAAS,MAAM,KAAK,UAAU;AACpC,OAAK,UAAU,OAAO;;CAGxB,MAAM,SAA0C;EAC9C,MAAM,SAAS,MAAM,KAAK,UAAU;AACpC,OAAK,UAAU,OAAO;AACtB,SAAO;GACL,IAAI,OAAO;GACX,MAAM,OAAO,KAAK,KAAA,IAAY;GAC9B,SAAS,OAAO;GAChB,SAAS,wBAAwB,OAAO,QAAQ;GACjD;;CAGH,MAAM,cAAc,OAAyD;EAC3E,MAAM,cAAc,MAAM,WAAW,MAAM;AAC3C,MAAI,CAAC,YACH,OAAM,IAAI,gBAAgB,2BAA2B,+BAA+B;EAEtF,MAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,MAAI,CAAC,MACH,OAAM,IAAI,gBAAgB,2BAA2B,4BAA4B;EAInF,MAAM,SAAS,OAAM,MADC,KAAK,YAAY,EACV,cAAc;GACzC,YAAY;GACZ;GACA,MAAM,MAAM;GACZ,KAAK,MAAM,OAAO,KAAK,QAAQ;GAC/B,iBAAiB,MAAM;GACxB,CAAC;EAEF,MAAM,SAA2B;GAC/B,YAAY,MAAM;GAClB,SAAS;GACT,oBAAoB;GACpB,KAAK,OAAO;GACZ,cAAc,OAAO;GACrB,kBAAkB,OAAO;GACzB,gBAAgB,OAAO;GACxB;AACD,mBAAiB,QAAQ;GACvB,MAAM;GACN;GACA,KAAK,OAAO;GACZ,MAAM,MAAM;GACZ,cAAc,OAAO;GACrB,kBAAkB,OAAO;GACzB,gBAAgB,OAAO;GACxB,CAAC;AACF,SAAO;;CAGT,UAAU,OAA4B;EACpC,MAAM,EAAE,QAAQ,UAAU,KAAK,qBAAqB,MAAM,OAAO;EAEjE,MAAM,cADiB,KAAK,YACM,CAAC,MAAM,YACvC,QAAQ,UAAU;GAChB;GACA,MAAM,MAAM;GACZ,aAAa,MAAM;GACnB,MAAM,MAAM;GACZ,aAAa,MAAM;GACnB,WAAW,MAAM;GACjB,WAAW,MAAM;GACjB,QAAQ,MAAM;GACf,CAAC,CACH;AACD,SAAO;GACL,WAAW,MAAM;GACjB,QAAQ,EACN,QAAQ,OAAO,iBAAiB;AAE9B,YAAO,MADY,aACP;MAEf;GACD,IAAI,SAAS;AACX,WAAO,YAAY,MAAM,SAAS,KAAK,OAAO;;GAEhD,OAAO,WAAiC;AACtC,WAAO,YAAY,MAAM,SAAS,KAAK,OAAO,UAAU,CAAC;;GAE3D,YAAY,WAAiC;AAC3C,WAAO,YAAY,MAAM,SAAS,KAAK,YAAY,UAAU,CAAC;;GAEjE;;CAGH,OAAO,QAAQ,OAA4D;EACzE,MAAM,EAAE,QAAQ,UAAU,KAAK,qBAAqB,MAAM,OAAO;AAEjE,UAAO,MADe,KAAK,YAAY,EACxB,QAAQ;GACrB;GACA,MAAM,MAAM;GACZ,aAAa,MAAM;GACnB,MAAM,MAAM;GACZ,aAAa,MAAM;GACnB,WAAW,MAAM;GACjB,WAAW,MAAM;GACjB,QAAQ,MAAM;GACf,CAAC;;CAGJ,gBAAgB,QAAgE;AAC9E,SAAO;;CAGT,MAAM,UAAU,OAGc;EAC5B,MAAM,EAAE,WAAW,KAAK,qBAAqB,MAAM,OAAO;AAE1D,SAAO,OAAM,MADS,KAAK,YAAY,EAClB,UAAU,OAAO;;CAGxC,MAAM,QAAQ,OAAkE;EAC9E,MAAM,EAAE,QAAQ,UAAU,KAAK,qBAAqB,MAAM,OAAO;AAEjE,SAAM,MADgB,KAAK,YAAY,EACzB,QAAQ,QAAQ,MAAM,MAAM,MAAM,KAAK;;CAGvD,MAAM,gBAAgB,OAIJ;EAChB,MAAM,EAAE,QAAQ,UAAU,KAAK,qBAAqB,MAAM,OAAO;AAEjE,SAAM,MADgB,KAAK,YAAY,EACzB,gBAAgB,QAAQ,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK;;CAG3E,MAAM,OAAO,OAAqE;EAChF,MAAM,EAAE,WAAW,KAAK,qBAAqB,MAAM,OAAO;AAE1D,SAAM,MADgB,KAAK,YAAY,EACzB,OAAO,OAAO;;CAG9B,MAAM,MAAM,OAIM;EAChB,MAAM,EAAE,WAAW,KAAK,qBAAqB,MAAM,OAAO;AAE1D,SAAM,MADgB,KAAK,YAAY,EACzB,MAAM,QAAQ,EAC1B,wBAAwB,MAAM,wBAC/B,CAAC;;CAGJ,MAAc,aAAyC;AACrD,MAAI,KAAK,QACP,QAAO,KAAK;AAEd,MAAI,CAAC,KAAK,eACR,MAAK,iBAAiB,QAAQ,QAC5B,KAAK,aAAa,iBAAiB,KAAK,QAAQ,IAAI,IAAI,kBAAkB,KAAK,QAAQ,CACxF,CAAC,MAAM,YAAY;AAClB,QAAK,UAAU;AACf,UAAO;IACP;AAEJ,SAAO,MAAM,KAAK;;CAGpB,MAAc,WAAW;AACvB,SAAO,OAAO,KAAK,aAAa,cAAc,KAAK,QAAQ,IAAI,aAAa,KAAK,QAAQ;;CAG3F,qBAA6B,QAG3B;EACA,MAAM,QAAQ,KAAK,mBAAmB,OAAO;AAC7C,SAAO;GACL,QAAQ;IACN,GAAG;IACH,cAAc,MAAM,gBAAgB,OAAO,gBAAgB,OAAO;IACnE;GACD;GACD;;CAGH,mBAA2B,QAA2C;EACpE,MAAM,UAAU,6BAA6B,OAAO,mBAAmB;AACvE,MAAI,QACF,QAAO;GACL,GAAG;GACH,cAAc,QAAQ,gBAAgB,OAAO;GAC7C,kBAAkB,QAAQ,oBAAoB,OAAO;GACrD,gBAAgB,QAAQ,kBAAkB,OAAO;GAClD;EAGH,MAAM,qBAAqB,OAAO,mBAAmB,MAAM;AAC3D,MAAI,CAAC,mBACH,OAAM,IAAI,gBACR,2BACA,sEACD;AAGH,SAAO;GACL,MAAM;GACN,OAAO,0BAA0B,OAAO,YAAY,mBAAmB;GACvE,KAAK,OAAO,OAAO,KAAK,QAAQ;GAChC,MAAM;GACN,cAAc,OAAO;GACrB,kBAAkB,OAAO;GACzB,gBAAgB,OAAO;GACxB;;;AAIL,SAAgB,iBAAiB,SAAyC;AACxE,QAAO,IAAI,YAAY,QAAQ;;AAGjC,SAAgB,mBAAmB,SAAgD;AACjF,QAAO,uBAAuB,QAAQ"}
1
+ {"version":3,"file":"runtime.js","names":[],"sources":["../src/runtime/public/errors.ts","../src/runtime/public/shared.ts","../src/runtime/public/events.ts","../src/runtime/engine/reuse-policy.ts","../src/runtime/engine/manager.ts","../src/runtime/public/file-session-store.ts","../src/runtime/public/handle-state.ts","../src/runtime/public/probe.ts","../src/runtime.ts"],"sourcesContent":["export const ACP_ERROR_CODES = [\n \"ACP_BACKEND_MISSING\",\n \"ACP_BACKEND_UNAVAILABLE\",\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n \"ACP_DISPATCH_DISABLED\",\n \"ACP_INVALID_RUNTIME_OPTION\",\n \"ACP_SESSION_INIT_FAILED\",\n \"ACP_TURN_FAILED\",\n] as const;\n\nexport type AcpRuntimeErrorCode = (typeof ACP_ERROR_CODES)[number];\n\nexport class AcpRuntimeError extends Error {\n readonly code: AcpRuntimeErrorCode;\n override readonly cause?: unknown;\n\n constructor(code: AcpRuntimeErrorCode, message: string, options?: { cause?: unknown }) {\n super(message);\n this.name = \"AcpRuntimeError\";\n this.code = code;\n this.cause = options?.cause;\n }\n}\n\nexport function isAcpRuntimeError(value: unknown): value is AcpRuntimeError {\n return value instanceof AcpRuntimeError;\n}\n","export type AcpxHandleState = {\n name: string;\n agent: string;\n cwd: string;\n mode: \"persistent\" | \"oneshot\";\n acpxRecordId?: string;\n backendSessionId?: string;\n agentSessionId?: string;\n};\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function asTrimmedString(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nexport function asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function asOptionalString(value: unknown): string | undefined {\n const text = asTrimmedString(value);\n return text || undefined;\n}\n\nexport function asOptionalBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function deriveAgentFromSessionKey(sessionKey: string, fallbackAgent: string): string {\n const match = sessionKey.match(/^agent:([^:]+):/i);\n const candidate = match?.[1] ? asTrimmedString(match[1]) : \"\";\n return candidate || fallbackAgent;\n}\n","import type { ToolCallContent, ToolCallLocation, ToolKind } from \"@agentclientprotocol/sdk\";\nimport type { AcpRuntimeEvent, AcpSessionUpdateTag } from \"./contract.js\";\nimport { asOptionalString, asString, asTrimmedString, isRecord } from \"./shared.js\";\n\nconst TOOL_OUTPUT_SUMMARY_MAX_CHARS = 500;\n\nfunction safeParseJsonObject(line: string): Record<string, unknown> | null {\n try {\n const parsed = JSON.parse(line) as unknown;\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction asOptionalFiniteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction resolveStructuredPromptPayload(parsed: Record<string, unknown>): {\n type: string;\n payload: Record<string, unknown>;\n tag?: AcpSessionUpdateTag;\n} {\n const method = asTrimmedString(parsed.method);\n if (method === \"session/update\") {\n const params = parsed.params;\n if (isRecord(params) && isRecord(params.update)) {\n const update = params.update;\n const tag = asOptionalString(update.sessionUpdate) 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 truncateToolSummary(value: string): string {\n if (value.length <= TOOL_OUTPUT_SUMMARY_MAX_CHARS) {\n return value;\n }\n return `${value.slice(0, TOOL_OUTPUT_SUMMARY_MAX_CHARS - 1)}…`;\n}\n\nfunction readToolContentText(value: unknown): string | undefined {\n const record = isRecord(value) ? value : undefined;\n if (!record) {\n return undefined;\n }\n if (record.type === \"content\") {\n return readToolContentText(record.content);\n }\n if (record.type === \"text\") {\n return asString(record.text);\n }\n if (record.type === \"resource_link\") {\n return (\n asOptionalString(record.title) ||\n asOptionalString(record.name) ||\n asOptionalString(record.uri)\n );\n }\n if (record.type === \"resource\") {\n const resource = isRecord(record.resource) ? record.resource : undefined;\n return asString(resource?.text) || asOptionalString(resource?.uri);\n }\n if (record.type === \"diff\") {\n const path = asOptionalString(record.path) || \"file\";\n return `diff ${path}`;\n }\n if (record.type === \"terminal\") {\n const terminalId = asOptionalString(record.terminalId) || asOptionalString(record.id);\n return terminalId ? `[terminal] ${terminalId}` : \"[terminal]\";\n }\n return undefined;\n}\n\nfunction summarizeToolContent(content: unknown): string | undefined {\n if (!Array.isArray(content)) {\n return undefined;\n }\n const fragments = content\n .map((entry) => readToolContentText(entry)?.trim())\n .filter((entry): entry is string => Boolean(entry));\n if (fragments.length === 0) {\n return undefined;\n }\n return truncateToolSummary([...new Set(fragments)].join(\"\\n\"));\n}\n\nfunction summarizeToolOutput(rawOutput: unknown): string | undefined {\n if (rawOutput == null) {\n return undefined;\n }\n if (\n typeof rawOutput === \"string\" ||\n typeof rawOutput === \"number\" ||\n typeof rawOutput === \"boolean\"\n ) {\n return truncateToolSummary(String(rawOutput));\n }\n const record = isRecord(rawOutput) ? rawOutput : undefined;\n if (!record) {\n return undefined;\n }\n return (\n truncateToolSummary(\n readFirstString(record, [\"text\", \"message\", \"error\", \"stdout\", \"stderr\", \"content\"]) ?? \"\",\n ) || undefined\n );\n}\n\nfunction shouldForwardArray(value: unknown): boolean {\n return Array.isArray(value);\n}\n\nfunction readToolKind(value: unknown): ToolKind | undefined {\n const kind = asOptionalString(value);\n if (\n kind === \"read\" ||\n kind === \"edit\" ||\n kind === \"delete\" ||\n kind === \"move\" ||\n kind === \"search\" ||\n kind === \"execute\" ||\n kind === \"fetch\" ||\n kind === \"think\" ||\n kind === \"other\"\n ) {\n return kind;\n }\n return undefined;\n}\n\nfunction createToolCallEvent(params: {\n payload: Record<string, unknown>;\n tag: AcpSessionUpdateTag;\n}): AcpRuntimeEvent {\n const title = asTrimmedString(params.payload.title) || \"tool call\";\n const status = asTrimmedString(params.payload.status);\n const inputSummary = summarizeToolInput(params.payload.rawInput);\n const outputSummary =\n summarizeToolContent(params.payload.content) ?? summarizeToolOutput(params.payload.rawOutput);\n const toolCallId = asOptionalString(params.payload.toolCallId);\n const kind = readToolKind(params.payload.kind);\n const summaryText = status ? `${title} (${status})` : title;\n const detailSummary =\n params.tag === \"tool_call_update\"\n ? (outputSummary ?? inputSummary)\n : (inputSummary ?? outputSummary);\n return {\n type: \"tool_call\",\n text: detailSummary ? `${summaryText}: ${detailSummary}` : summaryText,\n tag: params.tag,\n ...(toolCallId ? { toolCallId } : {}),\n ...(status ? { status } : {}),\n ...(kind ? { kind } : {}),\n ...(shouldForwardArray(params.payload.locations)\n ? { locations: params.payload.locations as ToolCallLocation[] }\n : {}),\n ...(Object.prototype.hasOwnProperty.call(params.payload, \"rawInput\")\n ? { rawInput: params.payload.rawInput }\n : {}),\n ...(Object.prototype.hasOwnProperty.call(params.payload, \"rawOutput\")\n ? { rawOutput: params.payload.rawOutput }\n : {}),\n ...(shouldForwardArray(params.payload.content)\n ? { content: params.payload.content as ToolCallContent[] }\n : {}),\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 { LiveSessionCheckpoint } from \"../../session/live-checkpoint.js\";\nimport {\n setCurrentModelId,\n setDesiredConfigOption,\n setDesiredModeId,\n syncAdvertisedModelState,\n} from \"../../session/mode-preference.js\";\nimport { applyRequestedModelIfAdvertised } from \"../../session/model-application.js\";\nimport type { ClientOperation, SessionRecord, SessionResumePolicy } from \"../../types.js\";\nimport type {\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePromptMode,\n AcpRuntimeSessionModels,\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\";\nimport { persistSessionOptions, type SessionAgentOptions } from \"./session-options.js\";\n\nexport type AcpRuntimeManagerDeps = {\n clientFactory?: (options: ConstructorParameters<typeof AcpClient>[0]) => AcpClient;\n};\n\ntype ActiveSessionController = {\n hasActivePrompt: () => boolean;\n requestCancelActivePrompt: () => Promise<boolean>;\n setSessionMode: (modeId: string) => Promise<void>;\n setSessionModel: (modelId: string) => Promise<void>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n ) => ReturnType<AcpClient[\"setSessionConfigOption\"]>;\n setResolvedSessionConfigOption: (\n configId: string,\n value: string,\n ) => Promise<{\n configId: string;\n response: Awaited<ReturnType<AcpClient[\"setSessionConfigOption\"]>>;\n }>;\n};\n\ntype Deferred<T> = {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (error: unknown) => void;\n};\n\nfunction createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void;\n let reject!: (error: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nclass AsyncEventQueue {\n private readonly items: AcpRuntimeEvent[] = [];\n private readonly waits: Deferred<AcpRuntimeEvent | null>[] = [];\n private closed = false;\n\n push(item: AcpRuntimeEvent): void {\n if (this.closed) {\n return;\n }\n const waiter = this.waits.shift();\n if (waiter) {\n waiter.resolve(item);\n return;\n }\n this.items.push(item);\n }\n\n close(): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n for (const waiter of this.waits.splice(0)) {\n waiter.resolve(null);\n }\n }\n\n clear(): void {\n this.items.length = 0;\n }\n\n async next(): Promise<AcpRuntimeEvent | null> {\n if (this.items.length > 0) {\n return this.items.shift() ?? null;\n }\n if (this.closed) {\n return null;\n }\n const waiter = createDeferred<AcpRuntimeEvent | null>();\n this.waits.push(waiter);\n return await waiter.promise;\n }\n\n async *iterate(): AsyncIterable<AcpRuntimeEvent> {\n while (true) {\n const next = await this.next();\n if (!next) {\n return;\n }\n yield next;\n }\n }\n}\n\nfunction isoNow(): string {\n return new Date().toISOString();\n}\n\nfunction isUnsupportedSessionCloseError(error: unknown): boolean {\n const acp = extractAcpError(error);\n if (!acp) {\n return false;\n }\n if (acp.code === -32601 || acp.code === -32602) {\n return true;\n }\n if (acp.code !== -32603 || !acp.data || typeof acp.data !== \"object\") {\n return false;\n }\n const details = (acp.data as { details?: unknown }).details;\n return typeof details === \"string\" && details.toLowerCase().includes(\"invalid params\");\n}\n\nfunction toPromptInput(\n text: string,\n attachments?: AcpRuntimeTurnAttachment[],\n): PromptInput | string {\n if (!attachments || attachments.length === 0) {\n return text;\n }\n const blocks: 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\nfunction buildModelsField(record: SessionRecord): { models?: AcpRuntimeSessionModels } {\n const available = record.acpx?.available_models;\n const currentModelId = record.acpx?.current_model_id;\n if (!available || available.length === 0) {\n return currentModelId === undefined\n ? {}\n : { models: { currentModelId, availableModelIds: [] } };\n }\n return {\n models: {\n ...(currentModelId !== undefined ? { currentModelId } : {}),\n availableModelIds: [...available],\n },\n };\n}\n\nfunction advertisedConfigOptionIds(record: SessionRecord): Set<string> | undefined {\n const configOptions = record.acpx?.config_options;\n if (!configOptions) {\n return undefined;\n }\n\n return new Set(\n configOptions\n .map((option) => option.id)\n .filter((id): id is string => typeof id === \"string\" && id.trim().length > 0),\n );\n}\n\nfunction resolveSupportedConfigOptionId(record: SessionRecord, configId: string): string {\n const advertisedIds = advertisedConfigOptionIds(record);\n if (!advertisedIds) {\n return configId;\n }\n\n if (advertisedIds.has(configId)) {\n return configId;\n }\n\n if (configId === \"thinking\" && advertisedIds.has(\"effort\")) {\n return \"effort\";\n }\n\n const supported = [...advertisedIds].toSorted();\n const supportedText = supported.length > 0 ? supported.join(\", \") : \"none\";\n throw new AcpRuntimeError(\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n `ACP session ${record.acpxRecordId} does not advertise config option '${configId}'. Supported config options: ${supportedText}.`,\n );\n}\n\nexport class AcpRuntimeManager {\n private readonly activeControllers = new Map<string, ActiveSessionController>();\n private readonly pendingPersistentClients = new Map<string, AcpClient>();\n private readonly closingActiveRecords = new Set<string>();\n\n constructor(\n private readonly options: AcpRuntimeOptions,\n private readonly deps: AcpRuntimeManagerDeps = {},\n ) {}\n\n private createClient(options: ConstructorParameters<typeof AcpClient>[0]): AcpClient {\n return this.deps.clientFactory?.(options) ?? new AcpClient(options);\n }\n\n private async readPendingPersistentClient(\n record: SessionRecord,\n options: { consume: boolean },\n ): Promise<AcpClient | undefined> {\n const pendingClient = this.pendingPersistentClients.get(record.acpxRecordId);\n if (!pendingClient) {\n return undefined;\n }\n if (!pendingClient.hasReusableSession(record.acpSessionId)) {\n this.pendingPersistentClients.delete(record.acpxRecordId);\n await pendingClient.close().catch(() => {});\n return undefined;\n }\n if (options.consume) {\n this.pendingPersistentClients.delete(record.acpxRecordId);\n }\n return pendingClient;\n }\n\n private async closePendingPersistentClient(recordId: string): Promise<void> {\n const pendingClient = this.pendingPersistentClients.get(recordId);\n if (!pendingClient) {\n return;\n }\n this.pendingPersistentClients.delete(recordId);\n await pendingClient.close().catch(() => {});\n }\n\n private async refreshClosedState(record: SessionRecord): Promise<boolean> {\n if (!this.closingActiveRecords.has(record.acpxRecordId)) {\n return record.closed === true;\n }\n const latest = await this.options.sessionStore.load(record.acpxRecordId).catch(() => undefined);\n record.closed = true;\n record.closedAt = latest?.closedAt ?? record.closedAt ?? isoNow();\n if (latest?.acpx) {\n record.acpx = {\n ...record.acpx,\n ...latest.acpx,\n };\n }\n return true;\n }\n\n private async retainPersistentClientAfterTurn(input: {\n record: SessionRecord;\n client: AcpClient;\n }): Promise<boolean> {\n const { record, client } = input;\n const isPersistentRecord = !record.acpxRecordId.includes(\":oneshot:\");\n if (!isPersistentRecord || record.closed || !client.hasReusableSession(record.acpSessionId)) {\n return false;\n }\n const previousClient = this.pendingPersistentClients.get(record.acpxRecordId);\n this.pendingPersistentClients.set(record.acpxRecordId, client);\n if (previousClient && previousClient !== client) {\n await previousClient.close().catch(() => {});\n }\n return true;\n }\n\n private async withRuntimeControlSession<T>(\n record: SessionRecord,\n sessionMode: \"persistent\" | \"oneshot\",\n run: (context: { client: AcpClient; sessionId: string; record: SessionRecord }) => Promise<T>,\n ): Promise<{ value: T; record: SessionRecord }> {\n const pendingClient = await this.readPendingPersistentClient(record, { consume: false });\n if (pendingClient) {\n const value = await run({\n client: pendingClient,\n sessionId: record.acpSessionId,\n record,\n });\n record.lastUsedAt = isoNow();\n record.closed = false;\n record.closedAt = undefined;\n record.protocolVersion = pendingClient.initializeResult?.protocolVersion;\n record.agentCapabilities = pendingClient.initializeResult?.agentCapabilities;\n applyLifecycleSnapshotToRecord(record, pendingClient.getAgentLifecycleSnapshot());\n return { value, record };\n }\n\n const result = await withConnectedSession({\n sessionRecordId: record.acpxRecordId,\n loadRecord: async (sessionRecordId) => await this.requireRecord(sessionRecordId),\n saveRecord: async (connectedRecord) => await this.options.sessionStore.save(connectedRecord),\n createClient: (options) => this.createClient(options),\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n onPermissionRequest: this.options.onPermissionRequest,\n verbose: this.options.verbose,\n timeoutMs: this.options.timeoutMs,\n resumePolicy: resumePolicyForSessionMode(sessionMode),\n run,\n });\n return {\n value: result.value,\n record: result.record,\n };\n }\n async ensureSession(input: {\n sessionKey: string;\n agent: string;\n mode: \"persistent\" | \"oneshot\";\n cwd?: string;\n resumeSessionId?: string;\n sessionOptions?: SessionAgentOptions;\n }): Promise<SessionRecord> {\n const cwd = path.resolve(input.cwd?.trim() || this.options.cwd);\n const agentCommand = 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 // sessionOptions on a reused record are intentionally ignored: system\n // prompts are fixed at newSession time; callers who need a different\n // prompt must use a distinct sessionKey or close the prior record.\n existing.closed = false;\n existing.closedAt = undefined;\n this.closingActiveRecords.delete(existing.acpxRecordId);\n await this.options.sessionStore.save(existing);\n return existing;\n }\n\n const client = this.createClient({\n agentCommand,\n cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n onPermissionRequest: this.options.onPermissionRequest,\n verbose: this.options.verbose,\n sessionOptions: input.sessionOptions,\n });\n let keepClientOpen = false;\n\n try {\n await client.start();\n 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 const requestedModelApplied = await applyRequestedModelIfAdvertised({\n client,\n sessionId,\n requestedModel: input.sessionOptions?.model,\n models: sessionResult.models,\n agentCommand,\n timeoutMs: this.options.timeoutMs,\n });\n syncAdvertisedModelState(record, sessionResult.models);\n if (requestedModelApplied) {\n setCurrentModelId(record, input.sessionOptions?.model);\n }\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n persistSessionOptions(record, input.sessionOptions);\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 liveCheckpoint: LiveSessionCheckpoint | undefined;\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 onPermissionRequest: this.options.onPermissionRequest,\n verbose: this.options.verbose,\n });\n const runtimeClient = client;\n const runtimeConversation = conversation;\n const runtimeRecord = record;\n liveCheckpoint = new LiveSessionCheckpoint({\n save: async () => {\n runtimeRecord.lastUsedAt = isoNow();\n runtimeRecord.acpx = acpxState;\n applyConversation(runtimeRecord, runtimeConversation);\n await this.refreshClosedState(runtimeRecord);\n await this.options.sessionStore.save(runtimeRecord);\n },\n });\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 const result = await activeController!.setResolvedSessionConfigOption(configId, value);\n return result.response;\n },\n setResolvedSessionConfigOption: async (configId: string, value: string) => {\n if (!runtimeClient.hasActivePrompt()) {\n await sessionReady.promise;\n }\n const resolvedConfigId = resolveSupportedConfigOptionId(\n {\n ...runtimeRecord,\n acpx: acpxState ?? undefined,\n },\n configId,\n );\n const response = await runtimeClient.setSessionConfigOption(\n activeSessionId,\n resolvedConfigId,\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 (resolvedConfigId === \"mode\") {\n const nextState = cloneSessionAcpxState(acpxState) ?? {};\n nextState.desired_mode_id = value;\n acpxState = nextState;\n } else if (resolvedConfigId !== \"model\") {\n const nextState = cloneSessionAcpxState(acpxState) ?? {};\n nextState.desired_config_options = {\n ...nextState.desired_config_options,\n [resolvedConfigId]: value,\n };\n acpxState = nextState;\n }\n return { configId: resolvedConfigId, 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 liveCheckpoint?.request();\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 liveCheckpoint?.request();\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: () => {\n if (activeController) {\n this.activeControllers.set(runtimeRecord.acpxRecordId, activeController);\n }\n },\n onConnectedRecord: (connectedRecord) => {\n connectedRecord.lastPromptAt = isoNow();\n },\n onSessionIdResolved: (sessionIdValue) => {\n activeSessionId = sessionIdValue;\n },\n });\n acpxState = cloneSessionAcpxState(runtimeRecord.acpx);\n sessionReady.resolve();\n runtimeRecord.lastRequestId = input.requestId;\n runtimeRecord.lastPromptAt = isoNow();\n runtimeRecord.closed = false;\n runtimeRecord.closedAt = undefined;\n runtimeRecord.lastUsedAt = isoNow();\n await liveCheckpoint.checkpoint();\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 await liveCheckpoint?.flush().catch(() => {});\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 ...buildModelsField(record),\n details: {\n cwd: record.cwd,\n lastUsedAt: record.lastUsedAt,\n closed: record.closed === true,\n ...(record.acpx?.config_options !== undefined\n ? { configOptions: structuredClone(record.acpx.config_options) }\n : {}),\n },\n };\n }\n\n async setMode(\n handle: AcpRuntimeHandle,\n mode: string,\n sessionMode: \"persistent\" | \"oneshot\" = \"persistent\",\n ): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n const controller = this.activeControllers.get(record.acpxRecordId);\n let targetRecord = record;\n if (controller) {\n await controller.setSessionMode(mode);\n } else {\n const result = await this.withRuntimeControlSession(\n record,\n sessionMode,\n async ({ client, sessionId }) => {\n await client.setSessionMode(sessionId, mode);\n },\n );\n targetRecord = result.record;\n }\n setDesiredModeId(targetRecord, mode);\n await this.options.sessionStore.save(targetRecord);\n }\n\n async setConfigOption(\n handle: AcpRuntimeHandle,\n key: string,\n value: string,\n sessionMode: \"persistent\" | \"oneshot\" = \"persistent\",\n ): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n const controller = this.activeControllers.get(record.acpxRecordId);\n if (controller) {\n const { configId, response } = await controller.setResolvedSessionConfigOption(key, value);\n applyConfigOptionsToRecord(record, response);\n if (configId === \"mode\") {\n setDesiredModeId(record, value);\n } else {\n setDesiredConfigOption(record, configId, value);\n }\n await this.options.sessionStore.save(record);\n return;\n }\n\n const result = await this.withRuntimeControlSession(\n record,\n sessionMode,\n async ({ client, sessionId, record: connectedRecord }) => {\n const configId = resolveSupportedConfigOptionId(connectedRecord, key);\n const response = await client.setSessionConfigOption(sessionId, configId, value);\n applyConfigOptionsToRecord(connectedRecord, response);\n if (configId === \"mode\") {\n setDesiredModeId(connectedRecord, value);\n } else {\n setDesiredConfigOption(connectedRecord, configId, value);\n }\n },\n );\n await this.options.sessionStore.save(result.record);\n }\n\n async cancel(handle: AcpRuntimeHandle): Promise<void> {\n const controller = this.activeControllers.get(handle.acpxRecordId ?? handle.sessionKey);\n await controller?.requestCancelActivePrompt();\n }\n\n async close(\n handle: AcpRuntimeHandle,\n options: { discardPersistentState?: boolean } = {},\n ): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n if (this.activeControllers.has(record.acpxRecordId)) {\n this.closingActiveRecords.add(record.acpxRecordId);\n }\n await this.cancel(handle);\n if (options.discardPersistentState) {\n await this.closeBackendSession(record);\n record.acpx = {\n ...record.acpx,\n reset_on_next_ensure: true,\n };\n } else {\n await this.closePendingPersistentClient(record.acpxRecordId);\n }\n record.closed = true;\n record.closedAt = isoNow();\n await this.options.sessionStore.save(record);\n }\n\n private async closeBackendSession(record: SessionRecord): Promise<void> {\n const pendingClient = await this.readPendingPersistentClient(record, { consume: true });\n\n const client =\n pendingClient ??\n this.createClient({\n agentCommand: record.agentCommand,\n cwd: record.cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n onPermissionRequest: this.options.onPermissionRequest,\n verbose: this.options.verbose,\n });\n\n try {\n if (!pendingClient) {\n await withTimeout(client.start(), this.options.timeoutMs);\n }\n if (!client.supportsCloseSession()) {\n throw new AcpRuntimeError(\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n `Agent does not support session/close for ${record.acpxRecordId}.`,\n );\n }\n await withTimeout(client.closeSession(record.acpSessionId), this.options.timeoutMs);\n } catch (error) {\n if (isUnsupportedSessionCloseError(error)) {\n throw new AcpRuntimeError(\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n `Agent does not support session/close for ${record.acpxRecordId}.`,\n { cause: error },\n );\n }\n if (isAcpResourceNotFoundError(error)) {\n return;\n }\n throw error;\n } finally {\n await client.close().catch(() => {});\n }\n }\n\n private async requireRecord(sessionId: string): Promise<SessionRecord> {\n const record = await this.options.sessionStore.load(sessionId);\n if (!record) {\n throw new Error(`ACP session not found: ${sessionId}`);\n }\n return record;\n }\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { assertPersistedKeyPolicy } from \"../../persisted-key-policy.js\";\nimport { 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 AcpPermissionDecision,\n AcpPermissionRequest,\n AcpRuntime,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePromptMode,\n AcpRuntimeSessionMode,\n AcpRuntimeSessionModels,\n AcpRuntimeStatus,\n AcpRuntimeTurn,\n AcpRuntimeTurnAttachment,\n AcpRuntimeTurnInput,\n AcpRuntimeTurnResult,\n AcpRuntimeTurnResultError,\n AcpSessionRecord,\n AcpSessionStore,\n AcpSessionUpdateTag,\n SessionAgentOptions,\n SystemPromptOption,\n} from \"./runtime/public/contract.js\";\n\nexport const ACPX_BACKEND_ID = \"acpx\";\n\nconst ACPX_CAPABILITIES: AcpRuntimeCapabilities = {\n controls: [\"session/set_mode\", \"session/set_config_option\", \"session/status\"],\n};\n\ntype AcpxRuntimeLike = AcpRuntime & {\n probeAvailability(): Promise<void>;\n isHealthy(): boolean;\n doctor(): Promise<AcpRuntimeDoctorReport>;\n};\n\nexport function createAgentRegistry(params?: {\n overrides?: Record<string, string>;\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 sessionOptions: input.sessionOptions,\n });\n\n const handle: AcpRuntimeHandle = {\n sessionKey: input.sessionKey,\n backend: ACPX_BACKEND_ID,\n runtimeSessionName: \"\",\n cwd: record.cwd,\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n };\n writeHandleState(handle, {\n name: sessionName,\n agent,\n cwd: record.cwd,\n mode: input.mode,\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n });\n return handle;\n }\n\n startTurn(input: AcpRuntimeTurnInput) {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const managerPromise = this.getManager();\n const turnPromise = managerPromise.then((manager) =>\n manager.startTurn({\n handle,\n text: input.text,\n attachments: input.attachments,\n mode: input.mode,\n sessionMode: state.mode,\n requestId: input.requestId,\n timeoutMs: input.timeoutMs,\n signal: input.signal,\n }),\n );\n return {\n requestId: input.requestId,\n events: {\n async *[Symbol.asyncIterator]() {\n const turn = await turnPromise;\n yield* turn.events;\n },\n },\n get result() {\n return turnPromise.then((turn) => turn.result);\n },\n cancel(inputArgs?: { reason?: string }) {\n return turnPromise.then((turn) => turn.cancel(inputArgs));\n },\n closeStream(inputArgs?: { reason?: string }) {\n return turnPromise.then((turn) => turn.closeStream(inputArgs));\n },\n };\n }\n\n async *runTurn(input: AcpRuntimeTurnInput): AsyncIterable<AcpRuntimeEvent> {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n yield* manager.runTurn({\n handle,\n text: input.text,\n attachments: input.attachments,\n mode: input.mode,\n sessionMode: state.mode,\n requestId: input.requestId,\n timeoutMs: input.timeoutMs,\n signal: input.signal,\n });\n }\n\n async getCapabilities(input?: { handle?: AcpRuntimeHandle }): Promise<AcpRuntimeCapabilities> {\n if (!input?.handle) {\n return ACPX_CAPABILITIES;\n }\n\n const { handle } = this.resolveManagerHandle(input.handle);\n const record = await this.options.sessionStore.load(handle.acpxRecordId ?? handle.sessionKey);\n if (!record?.acpx?.config_options) {\n return ACPX_CAPABILITIES;\n }\n\n const configOptionKeys = Array.from(\n new Set(\n record.acpx.config_options\n .map((option) => option.id)\n .filter((id): id is string => typeof id === \"string\" && id.trim().length > 0),\n ),\n );\n\n return {\n ...ACPX_CAPABILITIES,\n ...(configOptionKeys.length > 0 ? { configOptionKeys } : {}),\n };\n }\n\n async getStatus(input: {\n handle: AcpRuntimeHandle;\n signal?: AbortSignal;\n }): Promise<AcpRuntimeStatus> {\n const { handle } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n return await manager.getStatus(handle);\n }\n\n async setMode(input: { handle: AcpRuntimeHandle; mode: string }): Promise<void> {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.setMode(handle, input.mode, state.mode);\n }\n\n async setConfigOption(input: {\n handle: AcpRuntimeHandle;\n key: string;\n value: string;\n }): Promise<void> {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.setConfigOption(handle, input.key, input.value, state.mode);\n }\n\n async cancel(input: { handle: AcpRuntimeHandle; reason?: string }): Promise<void> {\n const { handle } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.cancel(handle);\n }\n\n async close(input: {\n handle: AcpRuntimeHandle;\n reason: string;\n discardPersistentState?: boolean;\n }): Promise<void> {\n const { handle } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.close(handle, {\n discardPersistentState: input.discardPersistentState,\n });\n }\n\n private async getManager(): Promise<AcpRuntimeManager> {\n if (this.manager) {\n return this.manager;\n }\n if (!this.managerPromise) {\n this.managerPromise = Promise.resolve(\n this.testOptions?.managerFactory?.(this.options) ?? new AcpRuntimeManager(this.options),\n ).then((manager) => {\n this.manager = manager;\n return manager;\n });\n }\n return await this.managerPromise;\n }\n\n private async runProbe() {\n return await (this.testOptions?.probeRunner?.(this.options) ?? probeRuntime(this.options));\n }\n\n private resolveManagerHandle(handle: AcpRuntimeHandle): {\n handle: AcpRuntimeHandle;\n state: AcpxHandleState;\n } {\n const state = this.resolveHandleState(handle);\n return {\n handle: {\n ...handle,\n acpxRecordId: state.acpxRecordId ?? handle.acpxRecordId ?? handle.sessionKey,\n },\n state,\n };\n }\n\n private resolveHandleState(handle: AcpRuntimeHandle): AcpxHandleState {\n const decoded = decodeAcpxRuntimeHandleState(handle.runtimeSessionName);\n if (decoded) {\n return {\n ...decoded,\n acpxRecordId: decoded.acpxRecordId ?? handle.acpxRecordId,\n backendSessionId: decoded.backendSessionId ?? handle.backendSessionId,\n agentSessionId: decoded.agentSessionId ?? handle.agentSessionId,\n };\n }\n\n const runtimeSessionName = handle.runtimeSessionName.trim();\n if (!runtimeSessionName) {\n throw new AcpRuntimeError(\n \"ACP_SESSION_INIT_FAILED\",\n \"Invalid embedded ACP runtime handle: runtimeSessionName is missing.\",\n );\n }\n\n return {\n name: runtimeSessionName,\n agent: deriveAgentFromSessionKey(handle.sessionKey, DEFAULT_AGENT_NAME),\n cwd: handle.cwd ?? this.options.cwd,\n mode: \"persistent\",\n acpxRecordId: handle.acpxRecordId,\n backendSessionId: handle.backendSessionId,\n agentSessionId: handle.agentSessionId,\n };\n }\n}\n\nexport function createAcpRuntime(options: AcpRuntimeOptions): AcpxRuntime {\n return new AcpxRuntime(options);\n}\n\nexport function createRuntimeStore(options: { stateDir: string }): AcpSessionStore {\n return createFileSessionStore(options);\n}\n"],"mappings":"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"}
@@ -1,15 +1,52 @@
1
- import { AgentCapabilities, AnyMessage, ContentBlock, McpServer, McpServer as McpServer$1, SessionConfigOption, SessionNotification, SetSessionConfigOptionResponse } from "@agentclientprotocol/sdk";
1
+ import { AgentCapabilities, AnyMessage, ContentBlock, McpServer, McpServer as McpServer$1, RequestPermissionRequest, SessionConfigOption, SessionNotification, SetSessionConfigOptionResponse, ToolKind } from "@agentclientprotocol/sdk";
2
2
 
3
3
  //#region src/prompt-content.d.ts
4
4
  type PromptInput = ContentBlock[];
5
5
  //#endregion
6
6
  //#region src/types.d.ts
7
+ type AcpPermissionRequest = {
8
+ sessionId: string;
9
+ raw: RequestPermissionRequest;
10
+ inferredKind: ToolKind | undefined;
11
+ };
12
+ type AcpPermissionDecision = {
13
+ outcome: "allow_once";
14
+ } | {
15
+ outcome: "allow_always";
16
+ } | {
17
+ outcome: "reject_once";
18
+ } | {
19
+ outcome: "reject_always";
20
+ } | {
21
+ outcome: "cancel";
22
+ };
7
23
  declare const PERMISSION_MODES: readonly ["approve-all", "approve-reads", "deny-all"];
8
24
  type PermissionMode = (typeof PERMISSION_MODES)[number];
9
25
  declare const AUTH_POLICIES: readonly ["skip", "fail"];
10
26
  type AuthPolicy = (typeof AUTH_POLICIES)[number];
11
27
  declare const NON_INTERACTIVE_PERMISSION_POLICIES: readonly ["deny", "fail"];
12
28
  type NonInteractivePermissionPolicy = (typeof NON_INTERACTIVE_PERMISSION_POLICIES)[number];
29
+ declare const PERMISSION_POLICY_ACTIONS: readonly ["approve", "deny", "escalate"];
30
+ type PermissionPolicyAction = (typeof PERMISSION_POLICY_ACTIONS)[number];
31
+ type PermissionPolicy = {
32
+ autoApprove?: string[];
33
+ autoDeny?: string[];
34
+ escalate?: string[];
35
+ defaultAction?: PermissionPolicyAction;
36
+ };
37
+ type PermissionEscalationEvent = {
38
+ type: "permission_escalation";
39
+ sessionId: string;
40
+ toolCallId: string;
41
+ toolName?: string;
42
+ toolTitle: string;
43
+ toolInput?: unknown;
44
+ toolKind?: ToolKind;
45
+ action: "escalate";
46
+ matchedRule?: string;
47
+ message: string;
48
+ timestamp: string;
49
+ };
13
50
  type AcpJsonRpcMessage = AnyMessage;
14
51
  type AcpMessageDirection = "outbound" | "inbound";
15
52
  type PermissionStats = {
@@ -41,6 +78,7 @@ type AcpClientOptions = {
41
78
  mcpServers?: McpServer[];
42
79
  permissionMode: PermissionMode;
43
80
  nonInteractivePermissions?: NonInteractivePermissionPolicy;
81
+ permissionPolicy?: PermissionPolicy;
44
82
  authCredentials?: Record<string, string>;
45
83
  authPolicy?: AuthPolicy;
46
84
  terminal?: boolean;
@@ -58,6 +96,10 @@ type AcpClientOptions = {
58
96
  onAcpOutputMessage?: (direction: AcpMessageDirection, message: AcpJsonRpcMessage) => void;
59
97
  onSessionUpdate?: (notification: SessionNotification) => void;
60
98
  onClientOperation?: (operation: ClientOperation) => void;
99
+ onPermissionEscalation?: (event: PermissionEscalationEvent) => void;
100
+ onPermissionRequest?: (req: AcpPermissionRequest, ctx: {
101
+ signal: AbortSignal;
102
+ }) => Promise<AcpPermissionDecision | undefined>;
61
103
  };
62
104
  declare const SESSION_RECORD_SCHEMA: "acpx.session.v1";
63
105
  type SessionMessageImage = {
@@ -179,5 +221,16 @@ type SessionRecord = {
179
221
  acpx?: SessionAcpxState;
180
222
  };
181
223
  //#endregion
182
- export { PermissionMode as a, PromptInput as c, NonInteractivePermissionPolicy as i, AuthPolicy as n, PermissionStats as o, McpServer$1 as r, SessionRecord as s, AcpClientOptions as t };
183
- //# sourceMappingURL=types-CVBeQyi3.d.ts.map
224
+ //#region src/runtime/engine/session-options.d.ts
225
+ type SystemPromptOption = string | {
226
+ append: string;
227
+ };
228
+ type SessionAgentOptions = {
229
+ model?: string;
230
+ allowedTools?: string[];
231
+ maxTurns?: number;
232
+ systemPrompt?: SystemPromptOption;
233
+ };
234
+ //#endregion
235
+ export { AcpPermissionRequest as a, NonInteractivePermissionPolicy as c, PermissionStats as d, SessionRecord as f, AcpPermissionDecision as i, PermissionMode as l, SystemPromptOption as n, AuthPolicy as o, PromptInput as p, AcpClientOptions as r, McpServer$1 as s, SessionAgentOptions as t, PermissionPolicy as u };
236
+ //# sourceMappingURL=session-options-BJyG6zEH.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-options-BJyG6zEH.d.ts","names":[],"sources":["../src/prompt-content.ts","../src/types.ts","../src/runtime/engine/session-options.ts"],"mappings":"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"}