acpx 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -6
- package/dist/{cli-T-Z-9x6a.js → cli-Bf3yjqzE.js} +35 -10
- package/dist/cli-Bf3yjqzE.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +724 -241
- package/dist/cli.js.map +1 -1
- package/dist/{client-COPilhO_.d.ts → client-BssohYqM.d.ts} +35 -4
- package/dist/client-BssohYqM.d.ts.map +1 -0
- package/dist/flags-C-rwARqg.js +260 -0
- package/dist/flags-C-rwARqg.js.map +1 -0
- package/dist/{flows-CF8w1rPI.js → flows-WLs26_5Y.js} +405 -337
- package/dist/flows-WLs26_5Y.js.map +1 -0
- package/dist/flows.d.ts +23 -2
- package/dist/flows.d.ts.map +1 -1
- package/dist/flows.js +1 -1
- package/dist/{prompt-turn-CVPMWdj1.js → live-checkpoint-D5d-K9s1.js} +2487 -609
- package/dist/live-checkpoint-D5d-K9s1.js.map +1 -0
- package/dist/output-DPg20dvn.js +4146 -0
- package/dist/output-DPg20dvn.js.map +1 -0
- package/dist/runtime.d.ts +56 -4
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +676 -393
- package/dist/runtime.js.map +1 -1
- package/dist/{types-CVBeQyi3.d.ts → session-options-CFudjdkU.d.ts} +62 -3
- package/dist/session-options-CFudjdkU.d.ts.map +1 -0
- package/package.json +30 -25
- package/skills/acpx/SKILL.md +211 -13
- package/dist/cli-T-Z-9x6a.js.map +0 -1
- package/dist/client-COPilhO_.d.ts.map +0 -1
- package/dist/flags-Dj-IXgo9.js +0 -163
- package/dist/flags-Dj-IXgo9.js.map +0 -1
- package/dist/flows-CF8w1rPI.js.map +0 -1
- package/dist/ipc-ABXlXzGP.js +0 -1290
- package/dist/ipc-ABXlXzGP.js.map +0 -1
- package/dist/jsonrpc-DSxh2w5R.js +0 -68
- package/dist/jsonrpc-DSxh2w5R.js.map +0 -1
- package/dist/output-DmHvT8vm.js +0 -807
- package/dist/output-DmHvT8vm.js.map +0 -1
- package/dist/perf-metrics-C2pXfxvR.js +0 -598
- package/dist/perf-metrics-C2pXfxvR.js.map +0 -1
- package/dist/prompt-turn-CVPMWdj1.js.map +0 -1
- package/dist/render-N5YwotCy.js +0 -172
- package/dist/render-N5YwotCy.js.map +0 -1
- package/dist/rolldown-runtime-CiIaOW0V.js +0 -13
- package/dist/session-CDaQe6BH.js +0 -1538
- package/dist/session-CDaQe6BH.js.map +0 -1
- package/dist/session-options-pCbHn_n7.d.ts +0 -13
- package/dist/session-options-pCbHn_n7.d.ts.map +0 -1
- package/dist/types-CVBeQyi3.d.ts.map +0 -1
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","names":[],"sources":["../src/runtime/public/errors.ts","../src/runtime/public/shared.ts","../src/runtime/public/events.ts","../src/runtime/engine/reuse-policy.ts","../src/runtime/engine/manager.ts","../src/runtime/public/file-session-store.ts","../src/runtime/public/handle-state.ts","../src/runtime/public/probe.ts","../src/runtime.ts"],"sourcesContent":["export const ACP_ERROR_CODES = [\n \"ACP_BACKEND_MISSING\",\n \"ACP_BACKEND_UNAVAILABLE\",\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n \"ACP_DISPATCH_DISABLED\",\n \"ACP_INVALID_RUNTIME_OPTION\",\n \"ACP_SESSION_INIT_FAILED\",\n \"ACP_TURN_FAILED\",\n] as const;\n\nexport type AcpRuntimeErrorCode = (typeof ACP_ERROR_CODES)[number];\n\nexport class AcpRuntimeError extends Error {\n readonly code: AcpRuntimeErrorCode;\n override readonly cause?: unknown;\n\n constructor(code: AcpRuntimeErrorCode, message: string, options?: { cause?: unknown }) {\n super(message);\n this.name = \"AcpRuntimeError\";\n this.code = code;\n this.cause = options?.cause;\n }\n}\n\nexport function isAcpRuntimeError(value: unknown): value is AcpRuntimeError {\n return value instanceof AcpRuntimeError;\n}\n","export type AcpxHandleState = {\n name: string;\n agent: string;\n cwd: string;\n mode: \"persistent\" | \"oneshot\";\n acpxRecordId?: string;\n backendSessionId?: string;\n agentSessionId?: string;\n};\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function asTrimmedString(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nexport function asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function asOptionalString(value: unknown): string | undefined {\n const text = asTrimmedString(value);\n return text || undefined;\n}\n\nexport function asOptionalBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function deriveAgentFromSessionKey(sessionKey: string, fallbackAgent: string): string {\n const match = sessionKey.match(/^agent:([^:]+):/i);\n const candidate = match?.[1] ? asTrimmedString(match[1]) : \"\";\n return candidate || fallbackAgent;\n}\n","import type { AcpRuntimeEvent, AcpSessionUpdateTag } from \"./contract.js\";\nimport { asOptionalString, asString, asTrimmedString, isRecord } from \"./shared.js\";\n\nfunction safeParseJsonObject(line: string): Record<string, unknown> | null {\n try {\n const parsed = JSON.parse(line) as unknown;\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction asOptionalFiniteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction resolveStructuredPromptPayload(parsed: Record<string, unknown>): {\n type: string;\n payload: Record<string, unknown>;\n tag?: AcpSessionUpdateTag;\n} {\n const method = asTrimmedString(parsed.method);\n if (method === \"session/update\") {\n const params = parsed.params;\n if (isRecord(params) && isRecord(params.update)) {\n const update = params.update;\n const tag = asOptionalString(update.sessionUpdate) as AcpSessionUpdateTag | undefined;\n return {\n type: tag ?? \"\",\n payload: update,\n ...(tag ? { tag } : {}),\n };\n }\n }\n\n const sessionUpdate = asOptionalString(parsed.sessionUpdate) as AcpSessionUpdateTag | undefined;\n if (sessionUpdate) {\n return {\n type: sessionUpdate,\n payload: parsed,\n tag: sessionUpdate,\n };\n }\n\n const type = asTrimmedString(parsed.type);\n const tag = asOptionalString(parsed.tag) as AcpSessionUpdateTag | undefined;\n return {\n type,\n payload: parsed,\n ...(tag ? { tag } : {}),\n };\n}\n\nfunction resolveStatusTextForTag(params: {\n tag: AcpSessionUpdateTag;\n payload: Record<string, unknown>;\n}): string | null {\n const { tag, payload } = params;\n if (tag === \"available_commands_update\") {\n const commands = Array.isArray(payload.availableCommands) ? payload.availableCommands : [];\n return commands.length > 0\n ? `available commands updated (${commands.length})`\n : \"available commands updated\";\n }\n if (tag === \"current_mode_update\") {\n const mode =\n asTrimmedString(payload.currentModeId) ||\n asTrimmedString(payload.modeId) ||\n asTrimmedString(payload.mode);\n return mode ? `mode updated: ${mode}` : \"mode updated\";\n }\n if (tag === \"config_option_update\") {\n const id = asTrimmedString(payload.id) || asTrimmedString(payload.configOptionId);\n const value =\n asTrimmedString(payload.currentValue) ||\n asTrimmedString(payload.value) ||\n asTrimmedString(payload.optionValue);\n if (id && value) {\n return `config updated: ${id}=${value}`;\n }\n if (id) {\n return `config updated: ${id}`;\n }\n return \"config updated\";\n }\n if (tag === \"session_info_update\") {\n return (\n asTrimmedString(payload.summary) || asTrimmedString(payload.message) || \"session updated\"\n );\n }\n if (tag === \"plan\") {\n const entries = Array.isArray(payload.entries) ? payload.entries : [];\n const first = entries.find((entry) => isRecord(entry));\n const content = asTrimmedString(first?.content);\n return content ? `plan: ${content}` : null;\n }\n return null;\n}\n\nfunction resolveTextChunk(params: {\n payload: Record<string, unknown>;\n stream: \"output\" | \"thought\";\n tag: AcpSessionUpdateTag;\n}): AcpRuntimeEvent | null {\n const contentRaw = params.payload.content;\n if (isRecord(contentRaw)) {\n const contentType = asTrimmedString(contentRaw.type);\n if (contentType && contentType !== \"text\") {\n return null;\n }\n const text = asString(contentRaw.text);\n if (text && text.length > 0) {\n return {\n type: \"text_delta\",\n text,\n stream: params.stream,\n tag: params.tag,\n };\n }\n }\n const text = asString(params.payload.text);\n if (!text || text.length === 0) {\n return null;\n }\n return {\n type: \"text_delta\",\n text,\n stream: params.stream,\n tag: params.tag,\n };\n}\n\nfunction createTextDeltaEvent(params: {\n content: string | null | undefined;\n stream: \"output\" | \"thought\";\n tag?: AcpSessionUpdateTag;\n}): AcpRuntimeEvent | null {\n if (params.content == null || params.content.length === 0) {\n return null;\n }\n return {\n type: \"text_delta\",\n text: params.content,\n stream: params.stream,\n ...(params.tag ? { tag: params.tag } : {}),\n };\n}\n\nfunction readFirstString(\n record: Record<string, unknown>,\n keys: readonly string[],\n): string | undefined {\n for (const key of keys) {\n const value = asOptionalString(record[key]);\n if (value) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction readFirstStringArray(\n record: Record<string, unknown>,\n keys: readonly string[],\n): string[] | undefined {\n for (const key of keys) {\n const value = record[key];\n if (!Array.isArray(value)) {\n continue;\n }\n const entries = value\n .map((entry) => asOptionalString(entry))\n .filter((entry): entry is string => entry !== undefined);\n if (entries.length > 0) {\n return entries;\n }\n }\n return undefined;\n}\n\nfunction summarizeToolInput(rawInput: unknown): string | undefined {\n if (rawInput == null) {\n return undefined;\n }\n if (\n typeof rawInput === \"string\" ||\n typeof rawInput === \"number\" ||\n typeof rawInput === \"boolean\"\n ) {\n return String(rawInput);\n }\n if (!isRecord(rawInput)) {\n return undefined;\n }\n\n const command = readFirstString(rawInput, [\"command\", \"cmd\", \"program\"]);\n const args = readFirstStringArray(rawInput, [\"args\", \"arguments\"]);\n if (command) {\n return [command, ...(args ?? [])].join(\" \");\n }\n\n return readFirstString(rawInput, [\n \"path\",\n \"file\",\n \"filePath\",\n \"filepath\",\n \"target\",\n \"uri\",\n \"url\",\n \"query\",\n \"pattern\",\n \"text\",\n \"search\",\n ]);\n}\n\nfunction createToolCallEvent(params: {\n payload: Record<string, unknown>;\n tag: AcpSessionUpdateTag;\n}): AcpRuntimeEvent {\n const title = asTrimmedString(params.payload.title) || \"tool call\";\n const status = asTrimmedString(params.payload.status);\n const inputSummary = summarizeToolInput(params.payload.rawInput);\n const toolCallId = asOptionalString(params.payload.toolCallId);\n const summaryText = status ? `${title} (${status})` : title;\n return {\n type: \"tool_call\",\n text: inputSummary ? `${summaryText}: ${inputSummary}` : summaryText,\n tag: params.tag,\n ...(toolCallId ? { toolCallId } : {}),\n ...(status ? { status } : {}),\n title,\n };\n}\n\nexport function parsePromptEventLine(line: string): AcpRuntimeEvent | null {\n const trimmed = line.trim();\n if (!trimmed) {\n return null;\n }\n const parsed = safeParseJsonObject(trimmed);\n if (!parsed) {\n return {\n type: \"status\",\n text: trimmed,\n };\n }\n\n const structured = resolveStructuredPromptPayload(parsed);\n const type = structured.type;\n const payload = structured.payload;\n const tag = structured.tag;\n\n switch (type) {\n case \"text\":\n return createTextDeltaEvent({\n content: asString(payload.content),\n stream: \"output\",\n tag,\n });\n case \"thought\":\n return createTextDeltaEvent({\n content: asString(payload.content),\n stream: \"thought\",\n tag,\n });\n case \"tool_call\":\n return createToolCallEvent({\n payload,\n tag: tag ?? \"tool_call\",\n });\n case \"tool_call_update\":\n return createToolCallEvent({\n payload,\n tag: tag ?? \"tool_call_update\",\n });\n case \"agent_message_chunk\":\n return resolveTextChunk({\n payload,\n stream: \"output\",\n tag: \"agent_message_chunk\",\n });\n case \"agent_thought_chunk\":\n return resolveTextChunk({\n payload,\n stream: \"thought\",\n tag: \"agent_thought_chunk\",\n });\n case \"usage_update\": {\n const used = asOptionalFiniteNumber(payload.used);\n const size = asOptionalFiniteNumber(payload.size);\n const text =\n used != null && size != null ? `usage updated: ${used}/${size}` : \"usage updated\";\n return {\n type: \"status\",\n text,\n tag: \"usage_update\",\n ...(used != null ? { used } : {}),\n ...(size != null ? { size } : {}),\n };\n }\n case \"available_commands_update\":\n case \"current_mode_update\":\n case \"config_option_update\":\n case \"session_info_update\":\n case \"plan\": {\n const text = resolveStatusTextForTag({\n tag: type as AcpSessionUpdateTag,\n payload,\n });\n if (!text) {\n return null;\n }\n return {\n type: \"status\",\n text,\n tag: type as AcpSessionUpdateTag,\n };\n }\n case \"client_operation\": {\n const method = asTrimmedString(payload.method) || \"operation\";\n const status = asTrimmedString(payload.status);\n const summary = asTrimmedString(payload.summary);\n const text = [method, status, summary].filter(Boolean).join(\" \");\n if (!text) {\n return null;\n }\n return { type: \"status\", text, ...(tag ? { tag } : {}) };\n }\n case \"update\": {\n const update = asTrimmedString(payload.update);\n if (!update) {\n return null;\n }\n return { type: \"status\", text: update, ...(tag ? { tag } : {}) };\n }\n case \"done\":\n case \"error\":\n return null;\n default:\n return null;\n }\n}\n","import path from \"node:path\";\nimport type { SessionRecord } from \"../../types.js\";\n\nexport function shouldReuseExistingRecord(\n record: Pick<SessionRecord, \"cwd\" | \"agentCommand\" | \"acpSessionId\" | \"acpx\">,\n params: {\n cwd: string;\n agentCommand: string;\n resumeSessionId?: string;\n },\n): boolean {\n if (record.acpx?.reset_on_next_ensure === true) {\n return false;\n }\n if (path.resolve(record.cwd) !== path.resolve(params.cwd)) {\n return false;\n }\n if (record.agentCommand !== params.agentCommand) {\n return false;\n }\n if (params.resumeSessionId && record.acpSessionId !== params.resumeSessionId) {\n return false;\n }\n return true;\n}\n","import { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { AcpClient } from \"../../acp/client.js\";\nimport { normalizeOutputError } from \"../../acp/error-normalization.js\";\nimport { extractAcpError, isAcpResourceNotFoundError } from \"../../acp/error-shapes.js\";\nimport { withTimeout } from \"../../async-control.js\";\nimport { textPrompt, type PromptInput } from \"../../prompt-content.js\";\nimport { applyConfigOptionsToRecord } from \"../../session/config-options.js\";\nimport {\n cloneSessionAcpxState,\n cloneSessionConversation,\n createSessionConversation,\n recordClientOperation,\n recordPromptSubmission,\n recordSessionUpdate,\n trimConversationForRuntime,\n} from \"../../session/conversation-model.js\";\nimport { defaultSessionEventLog } from \"../../session/event-log.js\";\nimport { setDesiredConfigOption, setDesiredModeId } from \"../../session/mode-preference.js\";\nimport type { ClientOperation, SessionRecord, SessionResumePolicy } from \"../../types.js\";\nimport type {\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePromptMode,\n AcpRuntimeStatus,\n AcpRuntimeTurnAttachment,\n AcpRuntimeTurn,\n AcpRuntimeTurnResult,\n} from \"../public/contract.js\";\nimport { AcpRuntimeError } from \"../public/errors.js\";\nimport { parsePromptEventLine } from \"../public/events.js\";\nimport { withConnectedSession } from \"./connected-session.js\";\nimport {\n applyConversation,\n applyLifecycleSnapshotToRecord,\n reconcileAgentSessionId,\n} from \"./lifecycle.js\";\nimport { runPromptTurn } from \"./prompt-turn.js\";\nimport { connectAndLoadSession } from \"./reconnect.js\";\nimport { shouldReuseExistingRecord } from \"./reuse-policy.js\";\n\nexport type AcpRuntimeManagerDeps = {\n clientFactory?: (options: ConstructorParameters<typeof AcpClient>[0]) => AcpClient;\n};\n\ntype ActiveSessionController = {\n hasActivePrompt: () => boolean;\n requestCancelActivePrompt: () => Promise<boolean>;\n setSessionMode: (modeId: string) => Promise<void>;\n setSessionModel: (modelId: string) => Promise<void>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n ) => ReturnType<AcpClient[\"setSessionConfigOption\"]>;\n};\n\ntype Deferred<T> = {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (error: unknown) => void;\n};\n\nfunction createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void;\n let reject!: (error: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nclass AsyncEventQueue {\n private readonly items: AcpRuntimeEvent[] = [];\n private readonly waits: Deferred<AcpRuntimeEvent | null>[] = [];\n private closed = false;\n\n push(item: AcpRuntimeEvent): void {\n if (this.closed) {\n return;\n }\n const waiter = this.waits.shift();\n if (waiter) {\n waiter.resolve(item);\n return;\n }\n this.items.push(item);\n }\n\n close(): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n for (const waiter of this.waits.splice(0)) {\n waiter.resolve(null);\n }\n }\n\n clear(): void {\n this.items.length = 0;\n }\n\n async next(): Promise<AcpRuntimeEvent | null> {\n if (this.items.length > 0) {\n return this.items.shift() ?? null;\n }\n if (this.closed) {\n return null;\n }\n const waiter = createDeferred<AcpRuntimeEvent | null>();\n this.waits.push(waiter);\n return await waiter.promise;\n }\n\n async *iterate(): AsyncIterable<AcpRuntimeEvent> {\n while (true) {\n const next = await this.next();\n if (!next) {\n return;\n }\n yield next;\n }\n }\n}\n\nfunction isoNow(): string {\n return new Date().toISOString();\n}\n\nfunction isUnsupportedSessionCloseError(error: unknown): boolean {\n const acp = extractAcpError(error);\n if (!acp) {\n return false;\n }\n if (acp.code === -32601 || acp.code === -32602) {\n return true;\n }\n if (acp.code !== -32603 || !acp.data || typeof acp.data !== \"object\") {\n return false;\n }\n const details = (acp.data as { details?: unknown }).details;\n return typeof details === \"string\" && details.toLowerCase().includes(\"invalid params\");\n}\n\nfunction toPromptInput(\n text: string,\n attachments?: AcpRuntimeTurnAttachment[],\n): PromptInput | string {\n if (!attachments || attachments.length === 0) {\n return text;\n }\n const blocks: Array<\n { type: \"text\"; text: string } | { type: \"image\"; mimeType: string; data: string }\n > = [];\n if (text) {\n blocks.push({ type: \"text\", text });\n }\n for (const attachment of attachments) {\n if (!attachment.mediaType.startsWith(\"image/\")) {\n throw new AcpRuntimeError(\n \"ACP_TURN_FAILED\",\n `Unsupported ACP runtime attachment media type: ${attachment.mediaType}`,\n );\n }\n blocks.push({\n type: \"image\",\n mimeType: attachment.mediaType,\n data: attachment.data,\n });\n }\n return blocks.length > 0 ? blocks : textPrompt(text);\n}\n\nfunction createInitialRecord(params: {\n recordId: string;\n sessionName: string;\n sessionId: string;\n agentCommand: string;\n cwd: string;\n agentSessionId?: string;\n}): SessionRecord {\n const now = isoNow();\n return {\n schema: \"acpx.session.v1\",\n acpxRecordId: params.recordId,\n acpSessionId: params.sessionId,\n agentSessionId: params.agentSessionId,\n agentCommand: params.agentCommand,\n cwd: params.cwd,\n name: params.sessionName,\n createdAt: now,\n lastUsedAt: now,\n lastSeq: 0,\n eventLog: defaultSessionEventLog(params.recordId),\n closed: false,\n closedAt: undefined,\n ...createSessionConversation(now),\n acpx: {},\n };\n}\n\nfunction createRecordId(sessionKey: string, mode: \"persistent\" | \"oneshot\"): string {\n if (mode === \"persistent\") {\n return sessionKey;\n }\n return `${sessionKey}:oneshot:${randomUUID()}`;\n}\n\nfunction resumePolicyForSessionMode(mode: \"persistent\" | \"oneshot\"): SessionResumePolicy {\n return mode === \"persistent\" ? \"same-session-only\" : \"allow-new\";\n}\n\nfunction legacyTerminalEventFromTurnResult(result: AcpRuntimeTurnResult): AcpRuntimeEvent {\n if (result.status === \"failed\") {\n return {\n type: \"error\",\n message: result.error.message,\n ...(result.error.code ? { code: result.error.code } : {}),\n ...(result.error.detailCode ? { detailCode: result.error.detailCode } : {}),\n ...(result.error.retryable === undefined ? {} : { retryable: result.error.retryable }),\n };\n }\n return {\n type: \"done\",\n ...(result.stopReason ? { stopReason: result.stopReason } : {}),\n };\n}\n\nfunction statusSummary(record: SessionRecord): string {\n const parts = [\n `session=${record.acpxRecordId}`,\n `backendSessionId=${record.acpSessionId}`,\n record.agentSessionId ? `agentSessionId=${record.agentSessionId}` : null,\n record.pid != null ? `pid=${record.pid}` : null,\n record.closed ? \"closed\" : \"open\",\n ].filter(Boolean);\n return parts.join(\" \");\n}\n\nexport class AcpRuntimeManager {\n private readonly activeControllers = new Map<string, ActiveSessionController>();\n private readonly pendingPersistentClients = new Map<string, AcpClient>();\n private readonly closingActiveRecords = new Set<string>();\n\n constructor(\n private readonly options: AcpRuntimeOptions,\n private readonly deps: AcpRuntimeManagerDeps = {},\n ) {}\n\n private createClient(options: ConstructorParameters<typeof AcpClient>[0]): AcpClient {\n return this.deps.clientFactory?.(options) ?? new AcpClient(options);\n }\n\n private async readPendingPersistentClient(\n record: SessionRecord,\n options: { consume: boolean },\n ): Promise<AcpClient | undefined> {\n const pendingClient = this.pendingPersistentClients.get(record.acpxRecordId);\n if (!pendingClient) {\n return undefined;\n }\n if (!pendingClient.hasReusableSession(record.acpSessionId)) {\n this.pendingPersistentClients.delete(record.acpxRecordId);\n await pendingClient.close().catch(() => {});\n return undefined;\n }\n if (options.consume) {\n this.pendingPersistentClients.delete(record.acpxRecordId);\n }\n return pendingClient;\n }\n\n private async closePendingPersistentClient(recordId: string): Promise<void> {\n const pendingClient = this.pendingPersistentClients.get(recordId);\n if (!pendingClient) {\n return;\n }\n this.pendingPersistentClients.delete(recordId);\n await pendingClient.close().catch(() => {});\n }\n\n private async refreshClosedState(record: SessionRecord): Promise<boolean> {\n if (!this.closingActiveRecords.has(record.acpxRecordId)) {\n return record.closed === true;\n }\n const latest = await this.options.sessionStore.load(record.acpxRecordId).catch(() => undefined);\n record.closed = true;\n record.closedAt = latest?.closedAt ?? record.closedAt ?? isoNow();\n if (latest?.acpx) {\n record.acpx = {\n ...record.acpx,\n ...latest.acpx,\n };\n }\n return true;\n }\n\n private async retainPersistentClientAfterTurn(input: {\n record: SessionRecord;\n client: AcpClient;\n }): Promise<boolean> {\n const { record, client } = input;\n const isPersistentRecord = !record.acpxRecordId.includes(\":oneshot:\");\n if (!isPersistentRecord || record.closed || !client.hasReusableSession(record.acpSessionId)) {\n return false;\n }\n const previousClient = this.pendingPersistentClients.get(record.acpxRecordId);\n this.pendingPersistentClients.set(record.acpxRecordId, client);\n if (previousClient && previousClient !== client) {\n await previousClient.close().catch(() => {});\n }\n return true;\n }\n\n private async withRuntimeControlSession<T>(\n record: SessionRecord,\n sessionMode: \"persistent\" | \"oneshot\",\n run: (context: { client: AcpClient; sessionId: string; record: SessionRecord }) => Promise<T>,\n ): Promise<{ value: T; record: SessionRecord }> {\n const pendingClient = await this.readPendingPersistentClient(record, { consume: false });\n if (pendingClient) {\n const value = await run({\n client: pendingClient,\n sessionId: record.acpSessionId,\n record,\n });\n record.lastUsedAt = isoNow();\n record.closed = false;\n record.closedAt = undefined;\n record.protocolVersion = pendingClient.initializeResult?.protocolVersion;\n record.agentCapabilities = pendingClient.initializeResult?.agentCapabilities;\n applyLifecycleSnapshotToRecord(record, pendingClient.getAgentLifecycleSnapshot());\n return { value, record };\n }\n\n const result = await withConnectedSession({\n sessionRecordId: record.acpxRecordId,\n loadRecord: async (sessionRecordId) => await this.requireRecord(sessionRecordId),\n saveRecord: async (connectedRecord) => await this.options.sessionStore.save(connectedRecord),\n createClient: (options) => this.createClient(options),\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n timeoutMs: this.options.timeoutMs,\n resumePolicy: resumePolicyForSessionMode(sessionMode),\n run,\n });\n return {\n value: result.value,\n record: result.record,\n };\n }\n async ensureSession(input: {\n sessionKey: string;\n agent: string;\n mode: \"persistent\" | \"oneshot\";\n cwd?: string;\n resumeSessionId?: string;\n }): Promise<SessionRecord> {\n const cwd = path.resolve(input.cwd?.trim() || this.options.cwd);\n const agentCommand = this.options.agentRegistry.resolve(input.agent);\n const existing = await this.options.sessionStore.load(input.sessionKey);\n if (\n input.mode === \"persistent\" &&\n existing &&\n shouldReuseExistingRecord(existing, {\n cwd,\n agentCommand,\n resumeSessionId: input.resumeSessionId,\n })\n ) {\n existing.closed = false;\n existing.closedAt = undefined;\n this.closingActiveRecords.delete(existing.acpxRecordId);\n await this.options.sessionStore.save(existing);\n return existing;\n }\n\n const client = this.createClient({\n agentCommand,\n cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n });\n let keepClientOpen = false;\n\n try {\n await client.start();\n let sessionId: string;\n let agentSessionId: string | undefined;\n let sessionResult:\n | Awaited<ReturnType<AcpClient[\"createSession\"]>>\n | Awaited<ReturnType<AcpClient[\"loadSession\"]>>;\n if (input.resumeSessionId) {\n const loaded = await client.loadSession(input.resumeSessionId, cwd);\n sessionId = input.resumeSessionId;\n agentSessionId = loaded.agentSessionId;\n sessionResult = loaded;\n } else {\n const created = await client.createSession(cwd);\n sessionId = created.sessionId;\n agentSessionId = created.agentSessionId;\n sessionResult = created;\n }\n const record = createInitialRecord({\n recordId: createRecordId(input.sessionKey, input.mode),\n sessionName: input.sessionKey,\n sessionId,\n agentCommand,\n cwd,\n agentSessionId,\n });\n this.closingActiveRecords.delete(record.acpxRecordId);\n record.protocolVersion = client.initializeResult?.protocolVersion;\n record.agentCapabilities = client.initializeResult?.agentCapabilities;\n applyConfigOptionsToRecord(record, sessionResult);\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n await this.options.sessionStore.save(record);\n if (input.mode === \"persistent\") {\n const previousClient = this.pendingPersistentClients.get(record.acpxRecordId);\n this.pendingPersistentClients.set(record.acpxRecordId, client);\n keepClientOpen = true;\n await previousClient?.close().catch(() => {});\n }\n return record;\n } finally {\n if (!keepClientOpen) {\n await client.close();\n }\n }\n }\n\n startTurn(input: {\n handle: AcpRuntimeHandle;\n text: string;\n attachments?: AcpRuntimeTurnAttachment[];\n mode: AcpRuntimePromptMode;\n sessionMode: \"persistent\" | \"oneshot\";\n requestId: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n }): AcpRuntimeTurn {\n const promptInput = toPromptInput(input.text, input.attachments);\n const queue = new AsyncEventQueue();\n const result = createDeferred<AcpRuntimeTurnResult>();\n const sessionReady = createDeferred<void>();\n void sessionReady.promise.catch(() => {});\n let resultSettled = false;\n let pendingCancel = false;\n let turnActive = true;\n let streamClosed = false;\n let activeController: ActiveSessionController | null = null;\n\n const settleResult = (next: AcpRuntimeTurnResult): void => {\n if (resultSettled) {\n return;\n }\n resultSettled = true;\n result.resolve(next);\n };\n\n const closeStream = (): void => {\n if (streamClosed) {\n return;\n }\n streamClosed = true;\n queue.clear();\n queue.close();\n };\n\n const requestCancel = async (): Promise<boolean> => {\n if (activeController) {\n return await activeController.requestCancelActivePrompt();\n }\n if (!turnActive) {\n return false;\n }\n pendingCancel = true;\n return true;\n };\n\n const abortHandler = () => {\n void requestCancel();\n };\n if (input.signal) {\n if (input.signal.aborted) {\n closeStream();\n settleResult({\n status: \"cancelled\",\n stopReason: \"cancelled\",\n });\n return {\n requestId: input.requestId,\n events: queue.iterate(),\n result: result.promise,\n cancel: async () => {},\n closeStream: async () => {},\n };\n }\n input.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n void (async () => {\n let record: SessionRecord | null = null;\n let conversation: ReturnType<typeof cloneSessionConversation> | null = null;\n let acpxState: ReturnType<typeof cloneSessionAcpxState>;\n let client: AcpClient | null = null;\n try {\n record = await this.requireRecord(input.handle.acpxRecordId ?? input.handle.sessionKey);\n conversation = cloneSessionConversation(record);\n acpxState = cloneSessionAcpxState(record.acpx);\n const promptStartedAt = isoNow();\n const promptMessageId = recordPromptSubmission(conversation, promptInput, promptStartedAt);\n trimConversationForRuntime(conversation);\n record.lastPromptAt = promptStartedAt;\n record.lastUsedAt = promptStartedAt;\n record.acpx = acpxState;\n applyConversation(record, conversation);\n await this.options.sessionStore.save(record);\n\n const pendingClient = await this.readPendingPersistentClient(record, { consume: true });\n client =\n pendingClient ??\n this.createClient({\n agentCommand: record.agentCommand,\n cwd: record.cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n });\n const runtimeClient = client;\n const runtimeConversation = conversation;\n const runtimeRecord = record;\n let activeSessionId = record.acpSessionId;\n\n const applyPendingCancel = async (): Promise<boolean> => {\n if (!pendingCancel || !runtimeClient.hasActivePrompt()) {\n return false;\n }\n const cancelled = await runtimeClient.requestCancelActivePrompt();\n if (cancelled) {\n pendingCancel = false;\n }\n return cancelled;\n };\n\n activeController = {\n hasActivePrompt: () => runtimeClient.hasActivePrompt(),\n requestCancelActivePrompt: async () => {\n if (runtimeClient.hasActivePrompt()) {\n return await runtimeClient.requestCancelActivePrompt();\n }\n if (!turnActive) {\n return false;\n }\n pendingCancel = true;\n return true;\n },\n setSessionMode: async (modeId: string) => {\n if (!runtimeClient.hasActivePrompt()) {\n await sessionReady.promise;\n }\n await runtimeClient.setSessionMode(activeSessionId, modeId);\n const nextState = cloneSessionAcpxState(acpxState) ?? {};\n nextState.desired_mode_id = modeId;\n acpxState = nextState;\n },\n setSessionModel: async (modelId: string) => {\n if (!runtimeClient.hasActivePrompt()) {\n await sessionReady.promise;\n }\n await runtimeClient.setSessionModel(activeSessionId, modelId);\n },\n setSessionConfigOption: async (configId: string, value: string) => {\n if (!runtimeClient.hasActivePrompt()) {\n await sessionReady.promise;\n }\n const response = await runtimeClient.setSessionConfigOption(\n activeSessionId,\n configId,\n value,\n );\n if (response?.configOptions) {\n const nextState = cloneSessionAcpxState(acpxState) ?? {};\n nextState.config_options = structuredClone(response.configOptions);\n acpxState = nextState;\n }\n if (configId === \"mode\") {\n const nextState = cloneSessionAcpxState(acpxState) ?? {};\n nextState.desired_mode_id = value;\n acpxState = nextState;\n } else if (configId !== \"model\") {\n const nextState = cloneSessionAcpxState(acpxState) ?? {};\n nextState.desired_config_options = {\n ...nextState.desired_config_options,\n [configId]: value,\n };\n acpxState = nextState;\n }\n return response;\n },\n };\n\n const emitParsed = (payload: Record<string, unknown>): void => {\n if (streamClosed) {\n return;\n }\n const parsed = parsePromptEventLine(JSON.stringify(payload));\n if (!parsed) {\n return;\n }\n queue.push(parsed);\n };\n\n this.activeControllers.set(runtimeRecord.acpxRecordId, activeController);\n runtimeClient.setEventHandlers({\n onSessionUpdate: (notification) => {\n acpxState = recordSessionUpdate(runtimeConversation, acpxState, notification);\n trimConversationForRuntime(runtimeConversation);\n emitParsed({\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: notification,\n });\n },\n onClientOperation: (operation: ClientOperation) => {\n acpxState = recordClientOperation(runtimeConversation, acpxState, operation);\n trimConversationForRuntime(runtimeConversation);\n emitParsed({\n type: \"client_operation\",\n ...operation,\n });\n },\n });\n\n const { sessionId, resumed, loadError } = pendingClient\n ? {\n sessionId: record.acpSessionId,\n resumed: false,\n loadError: undefined,\n }\n : await connectAndLoadSession({\n client: runtimeClient,\n record: runtimeRecord,\n resumePolicy: resumePolicyForSessionMode(input.sessionMode),\n timeoutMs: this.options.timeoutMs,\n activeController,\n onClientAvailable: (controller) => {\n activeController = controller;\n this.activeControllers.set(runtimeRecord.acpxRecordId, controller);\n },\n onConnectedRecord: (connectedRecord) => {\n connectedRecord.lastPromptAt = isoNow();\n },\n onSessionIdResolved: (sessionIdValue) => {\n activeSessionId = sessionIdValue;\n },\n });\n sessionReady.resolve();\n\n runtimeRecord.lastRequestId = input.requestId;\n runtimeRecord.lastPromptAt = isoNow();\n runtimeRecord.closed = false;\n runtimeRecord.closedAt = undefined;\n runtimeRecord.lastUsedAt = isoNow();\n if (resumed || loadError) {\n emitParsed({\n type: \"status\",\n text: loadError ? `load fallback: ${loadError}` : \"session resumed\",\n });\n }\n\n if (pendingCancel || input.signal?.aborted) {\n pendingCancel = false;\n settleResult({\n status: \"cancelled\",\n stopReason: \"cancelled\",\n });\n return;\n }\n\n await applyPendingCancel();\n const response = await runPromptTurn({\n client: runtimeClient,\n sessionId,\n prompt: promptInput,\n timeoutMs: input.timeoutMs ?? this.options.timeoutMs,\n conversation: runtimeConversation,\n promptMessageId,\n });\n\n runtimeRecord.acpSessionId = activeSessionId;\n reconcileAgentSessionId(runtimeRecord, runtimeRecord.agentSessionId);\n runtimeRecord.protocolVersion = runtimeClient.initializeResult?.protocolVersion;\n runtimeRecord.agentCapabilities = runtimeClient.initializeResult?.agentCapabilities;\n runtimeRecord.acpx = acpxState;\n applyConversation(runtimeRecord, runtimeConversation);\n applyLifecycleSnapshotToRecord(runtimeRecord, runtimeClient.getAgentLifecycleSnapshot());\n await this.options.sessionStore.save(runtimeRecord);\n\n settleResult({\n status: response.stopReason === \"cancelled\" ? \"cancelled\" : \"completed\",\n ...(response.stopReason ? { stopReason: response.stopReason } : {}),\n });\n } catch (error) {\n sessionReady.reject(error);\n const normalized = normalizeOutputError(error, { origin: \"runtime\" });\n settleResult({\n status: \"failed\",\n error: {\n message: normalized.message,\n ...(normalized.code ? { code: normalized.code } : {}),\n ...(normalized.detailCode ? { detailCode: normalized.detailCode } : {}),\n ...(normalized.retryable !== undefined ? { retryable: normalized.retryable } : {}),\n },\n });\n } finally {\n turnActive = false;\n if (input.signal) {\n input.signal.removeEventListener(\"abort\", abortHandler);\n }\n client?.clearEventHandlers();\n let pooled = false;\n if (record && conversation) {\n applyLifecycleSnapshotToRecord(\n record,\n client?.getAgentLifecycleSnapshot() ?? { running: false },\n );\n record.acpx = acpxState;\n applyConversation(record, conversation);\n record.lastUsedAt = isoNow();\n const closed = await this.refreshClosedState(record);\n await this.options.sessionStore.save(record).catch(() => {});\n if (!closed && client) {\n pooled = await this.retainPersistentClientAfterTurn({ record, client });\n }\n }\n if (!pooled) {\n await client?.close().catch(() => {});\n }\n if (record) {\n this.activeControllers.delete(record.acpxRecordId);\n this.closingActiveRecords.delete(record.acpxRecordId);\n }\n queue.close();\n }\n })();\n\n return {\n requestId: input.requestId,\n events: queue.iterate(),\n result: result.promise,\n cancel: async () => {\n await requestCancel();\n },\n closeStream: async () => {\n closeStream();\n },\n };\n }\n\n async *runTurn(input: {\n handle: AcpRuntimeHandle;\n text: string;\n attachments?: AcpRuntimeTurnAttachment[];\n mode: AcpRuntimePromptMode;\n sessionMode: \"persistent\" | \"oneshot\";\n requestId: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n }): AsyncIterable<AcpRuntimeEvent> {\n const turn = this.startTurn(input);\n yield* turn.events;\n yield legacyTerminalEventFromTurnResult(await turn.result);\n }\n\n async getStatus(handle: AcpRuntimeHandle): Promise<AcpRuntimeStatus> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n return {\n summary: statusSummary(record),\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n details: {\n cwd: record.cwd,\n lastUsedAt: record.lastUsedAt,\n closed: record.closed === true,\n ...(record.acpx?.config_options !== undefined\n ? { configOptions: structuredClone(record.acpx.config_options) }\n : {}),\n },\n };\n }\n\n async setMode(\n handle: AcpRuntimeHandle,\n mode: string,\n sessionMode: \"persistent\" | \"oneshot\" = \"persistent\",\n ): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n const controller = this.activeControllers.get(record.acpxRecordId);\n let targetRecord = record;\n if (controller) {\n await controller.setSessionMode(mode);\n } else {\n const result = await this.withRuntimeControlSession(\n record,\n sessionMode,\n async ({ client, sessionId }) => {\n await client.setSessionMode(sessionId, mode);\n },\n );\n targetRecord = result.record;\n }\n setDesiredModeId(targetRecord, mode);\n await this.options.sessionStore.save(targetRecord);\n }\n\n async setConfigOption(\n handle: AcpRuntimeHandle,\n key: string,\n value: string,\n sessionMode: \"persistent\" | \"oneshot\" = \"persistent\",\n ): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n const controller = this.activeControllers.get(record.acpxRecordId);\n let targetRecord = record;\n if (controller) {\n const response = await controller.setSessionConfigOption(key, value);\n applyConfigOptionsToRecord(targetRecord, response);\n } else {\n const result = await this.withRuntimeControlSession(\n record,\n sessionMode,\n async ({ client, sessionId, record: connectedRecord }) => {\n const response = await client.setSessionConfigOption(sessionId, key, value);\n applyConfigOptionsToRecord(connectedRecord, response);\n if (key === \"mode\") {\n setDesiredModeId(connectedRecord, value);\n } else {\n setDesiredConfigOption(connectedRecord, key, value);\n }\n },\n );\n targetRecord = result.record;\n }\n if (key === \"mode\") {\n setDesiredModeId(targetRecord, value);\n } else {\n setDesiredConfigOption(targetRecord, key, value);\n }\n await this.options.sessionStore.save(targetRecord);\n }\n\n async cancel(handle: AcpRuntimeHandle): Promise<void> {\n const controller = this.activeControllers.get(handle.acpxRecordId ?? handle.sessionKey);\n await controller?.requestCancelActivePrompt();\n }\n\n async close(\n handle: AcpRuntimeHandle,\n options: { discardPersistentState?: boolean } = {},\n ): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n if (this.activeControllers.has(record.acpxRecordId)) {\n this.closingActiveRecords.add(record.acpxRecordId);\n }\n await this.cancel(handle);\n if (options.discardPersistentState) {\n await this.closeBackendSession(record);\n record.acpx = {\n ...record.acpx,\n reset_on_next_ensure: true,\n };\n } else {\n await this.closePendingPersistentClient(record.acpxRecordId);\n }\n record.closed = true;\n record.closedAt = isoNow();\n await this.options.sessionStore.save(record);\n }\n\n private async closeBackendSession(record: SessionRecord): Promise<void> {\n const pendingClient = await this.readPendingPersistentClient(record, { consume: true });\n\n const client =\n pendingClient ??\n this.createClient({\n agentCommand: record.agentCommand,\n cwd: record.cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n });\n\n try {\n if (!pendingClient) {\n await withTimeout(client.start(), this.options.timeoutMs);\n }\n if (!client.supportsCloseSession()) {\n throw new AcpRuntimeError(\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n `Agent does not support session/close for ${record.acpxRecordId}.`,\n );\n }\n await withTimeout(client.closeSession(record.acpSessionId), this.options.timeoutMs);\n } catch (error) {\n if (isUnsupportedSessionCloseError(error)) {\n throw new AcpRuntimeError(\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n `Agent does not support session/close for ${record.acpxRecordId}.`,\n { cause: error },\n );\n }\n if (isAcpResourceNotFoundError(error)) {\n return;\n }\n throw error;\n } finally {\n await client.close().catch(() => {});\n }\n }\n\n private async requireRecord(sessionId: string): Promise<SessionRecord> {\n const record = await this.options.sessionStore.load(sessionId);\n if (!record) {\n throw new Error(`ACP session not found: ${sessionId}`);\n }\n return record;\n }\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { assertPersistedKeyPolicy } from \"../../persisted-key-policy.js\";\nimport { parseSessionRecord } from \"../../session/persistence/parse.js\";\nimport { serializeSessionRecordForDisk } from \"../../session/persistence/serialize.js\";\nimport type { AcpFileSessionStoreOptions, AcpSessionRecord, AcpSessionStore } from \"./contract.js\";\n\nfunction safeSessionId(sessionId: string): string {\n return encodeURIComponent(sessionId);\n}\n\nclass FileSessionStore implements AcpSessionStore {\n constructor(private readonly stateDir: string) {}\n\n private get sessionDir(): string {\n return path.join(this.stateDir, \"sessions\");\n }\n\n private filePath(sessionId: string): string {\n return path.join(this.sessionDir, `${safeSessionId(sessionId)}.json`);\n }\n\n private async ensureDir(): Promise<void> {\n await fs.mkdir(this.sessionDir, { recursive: true });\n }\n\n async load(sessionId: string): Promise<AcpSessionRecord | undefined> {\n await this.ensureDir();\n try {\n const payload = await fs.readFile(this.filePath(sessionId), \"utf8\");\n return parseSessionRecord(JSON.parse(payload)) ?? undefined;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n }\n\n async save(record: AcpSessionRecord): Promise<void> {\n await this.ensureDir();\n const persisted = serializeSessionRecordForDisk(record);\n assertPersistedKeyPolicy(persisted);\n\n const file = this.filePath(record.acpxRecordId);\n const tempFile = `${file}.${process.pid}.${Date.now()}.tmp`;\n const payload = JSON.stringify(persisted, null, 2);\n await fs.writeFile(tempFile, `${payload}\\n`, \"utf8\");\n await fs.rename(tempFile, file);\n }\n}\n\nexport function createFileSessionStore(options: AcpFileSessionStoreOptions): AcpSessionStore {\n return new FileSessionStore(path.resolve(options.stateDir));\n}\n","import type { AcpRuntimeHandle } from \"./contract.js\";\nimport type { AcpxHandleState } from \"./shared.js\";\nimport { asOptionalString } from \"./shared.js\";\n\nconst ACPX_RUNTIME_HANDLE_PREFIX = \"acpx:v2:\";\n\nexport function encodeAcpxRuntimeHandleState(state: AcpxHandleState): string {\n const payload = Buffer.from(JSON.stringify(state), \"utf8\").toString(\"base64url\");\n return `${ACPX_RUNTIME_HANDLE_PREFIX}${payload}`;\n}\n\nexport function decodeAcpxRuntimeHandleState(runtimeSessionName: string): AcpxHandleState | null {\n const trimmed = runtimeSessionName.trim();\n if (!trimmed.startsWith(ACPX_RUNTIME_HANDLE_PREFIX)) {\n return null;\n }\n try {\n const raw = Buffer.from(trimmed.slice(ACPX_RUNTIME_HANDLE_PREFIX.length), \"base64url\").toString(\n \"utf8\",\n );\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const name = asOptionalString(parsed.name);\n const agent = asOptionalString(parsed.agent);\n const cwd = asOptionalString(parsed.cwd);\n const mode = asOptionalString(parsed.mode);\n if (!name || !agent || !cwd || (mode !== \"persistent\" && mode !== \"oneshot\")) {\n return null;\n }\n return {\n name,\n agent,\n cwd,\n mode,\n acpxRecordId: asOptionalString(parsed.acpxRecordId),\n backendSessionId: asOptionalString(parsed.backendSessionId),\n agentSessionId: asOptionalString(parsed.agentSessionId),\n };\n } catch {\n return null;\n }\n}\n\nexport function writeHandleState(handle: AcpRuntimeHandle, state: AcpxHandleState): void {\n handle.runtimeSessionName = encodeAcpxRuntimeHandleState(state);\n handle.cwd = state.cwd;\n handle.acpxRecordId = state.acpxRecordId;\n handle.backendSessionId = state.backendSessionId;\n handle.agentSessionId = state.agentSessionId;\n}\n","import { AcpClient } from \"../../acp/client.js\";\nimport { DEFAULT_AGENT_NAME } from \"../../agent-registry.js\";\nimport type { AcpRuntimeOptions } from \"./contract.js\";\n\nexport type RuntimeHealthReport = {\n ok: boolean;\n message: string;\n details?: string[];\n};\n\nexport type ProbeRuntimeDeps = {\n clientFactory?: (options: ConstructorParameters<typeof AcpClient>[0]) => AcpClient;\n};\n\nexport function formatRuntimeDetail(value: unknown): string {\n if (value instanceof Error) {\n return value.message || value.name;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (\n value == null ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\" ||\n typeof value === \"symbol\"\n ) {\n return String(value);\n }\n if (typeof value === \"function\") {\n return value.name ? `[Function ${value.name}]` : \"[Function]\";\n }\n\n const seen = new WeakSet<object>();\n try {\n const serialized = JSON.stringify(value, (_key, nested) => {\n if (nested instanceof Error) {\n return nested.message || nested.name;\n }\n if (nested && typeof nested === \"object\") {\n if (seen.has(nested)) {\n return \"[Circular]\";\n }\n seen.add(nested);\n }\n return nested;\n });\n return serialized ?? \"undefined\";\n } catch {\n return \"unserializable object\";\n }\n}\n\nexport function normalizeRuntimeDetails(\n details: readonly unknown[] | undefined,\n): string[] | undefined {\n return details?.map((detail) => formatRuntimeDetail(detail));\n}\n\nexport async function probeRuntime(\n options: AcpRuntimeOptions,\n deps: ProbeRuntimeDeps = {},\n): Promise<RuntimeHealthReport> {\n const agentName = options.probeAgent?.trim() || DEFAULT_AGENT_NAME;\n const agentCommand = options.agentRegistry.resolve(agentName);\n const client =\n deps.clientFactory?.({\n agentCommand,\n cwd: options.cwd,\n mcpServers: [...(options.mcpServers ?? [])],\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n verbose: options.verbose,\n }) ??\n new AcpClient({\n agentCommand,\n cwd: options.cwd,\n mcpServers: [...(options.mcpServers ?? [])],\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n verbose: options.verbose,\n });\n\n try {\n await client.start();\n return {\n ok: true,\n message: \"embedded ACP runtime ready\",\n details: [\n `agent=${agentName}`,\n `command=${agentCommand}`,\n `cwd=${options.cwd}`,\n ...(client.initializeResult?.protocolVersion\n ? [`protocolVersion=${client.initializeResult.protocolVersion}`]\n : []),\n ],\n };\n } catch (error) {\n return {\n ok: false,\n message: \"embedded ACP runtime probe failed\",\n details: [\n `agent=${agentName}`,\n `command=${agentCommand}`,\n `cwd=${options.cwd}`,\n formatRuntimeDetail(error),\n ],\n };\n } finally {\n await client.close().catch(() => {});\n }\n}\n","import { DEFAULT_AGENT_NAME, listBuiltInAgents, resolveAgentCommand } from \"./agent-registry.js\";\nimport { AcpRuntimeManager } from \"./runtime/engine/manager.js\";\nimport type {\n AcpAgentRegistry,\n AcpRuntime,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimeStatus,\n AcpRuntimeTurnInput,\n AcpSessionStore,\n} from \"./runtime/public/contract.js\";\nimport { AcpRuntimeError } from \"./runtime/public/errors.js\";\nimport { createFileSessionStore } from \"./runtime/public/file-session-store.js\";\nimport { decodeAcpxRuntimeHandleState, writeHandleState } from \"./runtime/public/handle-state.js\";\nimport { normalizeRuntimeDetails, probeRuntime } from \"./runtime/public/probe.js\";\nimport { deriveAgentFromSessionKey, type AcpxHandleState } from \"./runtime/public/shared.js\";\n\nexport { DEFAULT_AGENT_NAME, createFileSessionStore };\nexport { AcpRuntimeError, isAcpRuntimeError } from \"./runtime/public/errors.js\";\nexport type { AcpRuntimeErrorCode } from \"./runtime/public/errors.js\";\nexport {\n decodeAcpxRuntimeHandleState,\n encodeAcpxRuntimeHandleState,\n} from \"./runtime/public/handle-state.js\";\nexport type {\n AcpAgentRegistry,\n AcpFileSessionStoreOptions,\n AcpRuntime,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePromptMode,\n AcpRuntimeSessionMode,\n AcpRuntimeStatus,\n AcpRuntimeTurn,\n AcpRuntimeTurnAttachment,\n AcpRuntimeTurnInput,\n AcpRuntimeTurnResult,\n AcpRuntimeTurnResultError,\n AcpSessionRecord,\n AcpSessionStore,\n AcpSessionUpdateTag,\n} from \"./runtime/public/contract.js\";\n\nexport const ACPX_BACKEND_ID = \"acpx\";\n\nconst ACPX_CAPABILITIES: AcpRuntimeCapabilities = {\n controls: [\"session/set_mode\", \"session/set_config_option\", \"session/status\"],\n};\n\ntype AcpxRuntimeLike = AcpRuntime & {\n probeAvailability(): Promise<void>;\n isHealthy(): boolean;\n doctor(): Promise<AcpRuntimeDoctorReport>;\n};\n\nexport function createAgentRegistry(params?: {\n overrides?: Record<string, string>;\n}): AcpAgentRegistry {\n return {\n resolve(agentName: string) {\n return resolveAgentCommand(agentName, params?.overrides);\n },\n list() {\n return listBuiltInAgents(params?.overrides);\n },\n };\n}\n\nexport class AcpxRuntime implements AcpxRuntimeLike {\n private healthy = false;\n private manager: AcpRuntimeManager | null = null;\n private managerPromise: Promise<AcpRuntimeManager> | null = null;\n\n constructor(\n private readonly options: AcpRuntimeOptions,\n private readonly testOptions?: {\n managerFactory?: (options: AcpRuntimeOptions) => AcpRuntimeManager;\n probeRunner?: (options: AcpRuntimeOptions) => Promise<{\n ok: boolean;\n message: string;\n details?: unknown[];\n }>;\n },\n ) {}\n\n isHealthy(): boolean {\n return this.healthy;\n }\n\n async probeAvailability(): Promise<void> {\n const report = await this.runProbe();\n this.healthy = report.ok;\n }\n\n async doctor(): Promise<AcpRuntimeDoctorReport> {\n const report = await this.runProbe();\n this.healthy = report.ok;\n return {\n ok: report.ok,\n code: report.ok ? undefined : \"ACP_BACKEND_UNAVAILABLE\",\n message: report.message,\n details: normalizeRuntimeDetails(report.details),\n };\n }\n\n async ensureSession(input: AcpRuntimeEnsureInput): Promise<AcpRuntimeHandle> {\n const sessionName = input.sessionKey.trim();\n if (!sessionName) {\n throw new AcpRuntimeError(\"ACP_SESSION_INIT_FAILED\", \"ACP session key is required.\");\n }\n const agent = input.agent.trim();\n if (!agent) {\n throw new AcpRuntimeError(\"ACP_SESSION_INIT_FAILED\", \"ACP agent id is required.\");\n }\n\n const manager = await this.getManager();\n const record = await manager.ensureSession({\n sessionKey: sessionName,\n agent,\n mode: input.mode,\n cwd: input.cwd ?? this.options.cwd,\n resumeSessionId: input.resumeSessionId,\n });\n\n const handle: AcpRuntimeHandle = {\n sessionKey: input.sessionKey,\n backend: ACPX_BACKEND_ID,\n runtimeSessionName: \"\",\n cwd: record.cwd,\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n };\n writeHandleState(handle, {\n name: sessionName,\n agent,\n cwd: record.cwd,\n mode: input.mode,\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n });\n return handle;\n }\n\n startTurn(input: AcpRuntimeTurnInput) {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const managerPromise = this.getManager();\n const turnPromise = managerPromise.then((manager) =>\n manager.startTurn({\n handle,\n text: input.text,\n attachments: input.attachments,\n mode: input.mode,\n sessionMode: state.mode,\n requestId: input.requestId,\n timeoutMs: input.timeoutMs,\n signal: input.signal,\n }),\n );\n return {\n requestId: input.requestId,\n events: {\n async *[Symbol.asyncIterator]() {\n const turn = await turnPromise;\n yield* turn.events;\n },\n },\n get result() {\n return turnPromise.then((turn) => turn.result);\n },\n cancel(inputArgs?: { reason?: string }) {\n return turnPromise.then((turn) => turn.cancel(inputArgs));\n },\n closeStream(inputArgs?: { reason?: string }) {\n return turnPromise.then((turn) => turn.closeStream(inputArgs));\n },\n };\n }\n\n async *runTurn(input: AcpRuntimeTurnInput): AsyncIterable<AcpRuntimeEvent> {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n yield* manager.runTurn({\n handle,\n text: input.text,\n attachments: input.attachments,\n mode: input.mode,\n sessionMode: state.mode,\n requestId: input.requestId,\n timeoutMs: input.timeoutMs,\n signal: input.signal,\n });\n }\n\n async getCapabilities(input?: { handle?: AcpRuntimeHandle }): Promise<AcpRuntimeCapabilities> {\n if (!input?.handle) {\n return ACPX_CAPABILITIES;\n }\n\n const { handle } = this.resolveManagerHandle(input.handle);\n const record = await this.options.sessionStore.load(handle.acpxRecordId ?? handle.sessionKey);\n if (!record?.acpx?.config_options) {\n return ACPX_CAPABILITIES;\n }\n\n const configOptionKeys = Array.from(\n new Set(\n record.acpx.config_options\n .map((option) => option.id)\n .filter((id): id is string => typeof id === \"string\" && id.trim().length > 0),\n ),\n );\n\n return {\n ...ACPX_CAPABILITIES,\n ...(configOptionKeys.length > 0 ? { configOptionKeys } : {}),\n };\n }\n\n async getStatus(input: {\n handle: AcpRuntimeHandle;\n signal?: AbortSignal;\n }): Promise<AcpRuntimeStatus> {\n const { handle } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n return await manager.getStatus(handle);\n }\n\n async setMode(input: { handle: AcpRuntimeHandle; mode: string }): Promise<void> {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.setMode(handle, input.mode, state.mode);\n }\n\n async setConfigOption(input: {\n handle: AcpRuntimeHandle;\n key: string;\n value: string;\n }): Promise<void> {\n const { handle, state } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.setConfigOption(handle, input.key, input.value, state.mode);\n }\n\n async cancel(input: { handle: AcpRuntimeHandle; reason?: string }): Promise<void> {\n const { handle } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.cancel(handle);\n }\n\n async close(input: {\n handle: AcpRuntimeHandle;\n reason: string;\n discardPersistentState?: boolean;\n }): Promise<void> {\n const { handle } = this.resolveManagerHandle(input.handle);\n const manager = await this.getManager();\n await manager.close(handle, {\n discardPersistentState: input.discardPersistentState,\n });\n }\n\n private async getManager(): Promise<AcpRuntimeManager> {\n if (this.manager) {\n return this.manager;\n }\n if (!this.managerPromise) {\n this.managerPromise = Promise.resolve(\n this.testOptions?.managerFactory?.(this.options) ?? new AcpRuntimeManager(this.options),\n ).then((manager) => {\n this.manager = manager;\n return manager;\n });\n }\n return await this.managerPromise;\n }\n\n private async runProbe() {\n return await (this.testOptions?.probeRunner?.(this.options) ?? probeRuntime(this.options));\n }\n\n private resolveManagerHandle(handle: AcpRuntimeHandle): {\n handle: AcpRuntimeHandle;\n state: AcpxHandleState;\n } {\n const state = this.resolveHandleState(handle);\n return {\n handle: {\n ...handle,\n acpxRecordId: state.acpxRecordId ?? handle.acpxRecordId ?? handle.sessionKey,\n },\n state,\n };\n }\n\n private resolveHandleState(handle: AcpRuntimeHandle): AcpxHandleState {\n const decoded = decodeAcpxRuntimeHandleState(handle.runtimeSessionName);\n if (decoded) {\n return {\n ...decoded,\n acpxRecordId: decoded.acpxRecordId ?? handle.acpxRecordId,\n backendSessionId: decoded.backendSessionId ?? handle.backendSessionId,\n agentSessionId: decoded.agentSessionId ?? handle.agentSessionId,\n };\n }\n\n const runtimeSessionName = handle.runtimeSessionName.trim();\n if (!runtimeSessionName) {\n throw new AcpRuntimeError(\n \"ACP_SESSION_INIT_FAILED\",\n \"Invalid embedded ACP runtime handle: runtimeSessionName is missing.\",\n );\n }\n\n return {\n name: runtimeSessionName,\n agent: deriveAgentFromSessionKey(handle.sessionKey, DEFAULT_AGENT_NAME),\n cwd: handle.cwd ?? this.options.cwd,\n mode: \"persistent\",\n acpxRecordId: handle.acpxRecordId,\n backendSessionId: handle.backendSessionId,\n agentSessionId: handle.agentSessionId,\n };\n }\n}\n\nexport function createAcpRuntime(options: AcpRuntimeOptions): AcpxRuntime {\n return new AcpxRuntime(options);\n}\n\nexport function createRuntimeStore(options: { stateDir: string }): AcpSessionStore {\n return createFileSessionStore(options);\n}\n"],"mappings":"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"}
|
|
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 resolver = STATUS_TEXT_RESOLVERS[params.tag];\n return resolver ? resolver(params.payload) : null;\n}\n\ntype StatusTextResolver = (payload: Record<string, unknown>) => string | null;\n\nconst STATUS_TEXT_RESOLVERS: Partial<Record<AcpSessionUpdateTag, StatusTextResolver>> = {\n available_commands_update: availableCommandsStatusText,\n current_mode_update: currentModeStatusText,\n config_option_update: configOptionStatusText,\n session_info_update: sessionInfoStatusText,\n plan: planStatusText,\n};\n\nfunction availableCommandsStatusText(payload: Record<string, unknown>): string {\n const commands = Array.isArray(payload.availableCommands) ? payload.availableCommands : [];\n return commands.length > 0\n ? `available commands updated (${commands.length})`\n : \"available commands updated\";\n}\n\nfunction currentModeStatusText(payload: Record<string, unknown>): string {\n const mode =\n asTrimmedString(payload.currentModeId) ||\n asTrimmedString(payload.modeId) ||\n asTrimmedString(payload.mode);\n return mode ? `mode updated: ${mode}` : \"mode updated\";\n}\n\nfunction configOptionStatusText(payload: Record<string, unknown>): string {\n const id = asTrimmedString(payload.id) || asTrimmedString(payload.configOptionId);\n const value =\n asTrimmedString(payload.currentValue) ||\n asTrimmedString(payload.value) ||\n asTrimmedString(payload.optionValue);\n if (id && value) {\n return `config updated: ${id}=${value}`;\n }\n return id ? `config updated: ${id}` : \"config updated\";\n}\n\nfunction sessionInfoStatusText(payload: Record<string, unknown>): string {\n return asTrimmedString(payload.summary) || asTrimmedString(payload.message) || \"session updated\";\n}\n\nfunction planStatusText(payload: Record<string, unknown>): string | null {\n const entries = Array.isArray(payload.entries) ? payload.entries : [];\n const first = entries.find((entry) => isRecord(entry));\n const content = asTrimmedString(first?.content);\n return content ? `plan: ${content}` : null;\n}\n\nfunction resolveTextChunk(params: {\n payload: Record<string, unknown>;\n stream: \"output\" | \"thought\";\n tag: AcpSessionUpdateTag;\n}): AcpRuntimeEvent | null {\n const contentRaw = params.payload.content;\n if (isRecord(contentRaw)) {\n const contentType = asTrimmedString(contentRaw.type);\n if (contentType && contentType !== \"text\") {\n return null;\n }\n const text = asString(contentRaw.text);\n if (text && text.length > 0) {\n return {\n type: \"text_delta\",\n text,\n stream: params.stream,\n tag: params.tag,\n };\n }\n }\n const text = asString(params.payload.text);\n if (!text || text.length === 0) {\n return null;\n }\n return {\n type: \"text_delta\",\n text,\n stream: params.stream,\n tag: params.tag,\n };\n}\n\nfunction createTextDeltaEvent(params: {\n content: string | null | undefined;\n stream: \"output\" | \"thought\";\n tag?: AcpSessionUpdateTag;\n}): AcpRuntimeEvent | null {\n if (params.content == null || params.content.length === 0) {\n return null;\n }\n return {\n type: \"text_delta\",\n text: params.content,\n stream: params.stream,\n ...(params.tag ? { tag: params.tag } : {}),\n };\n}\n\nfunction readFirstString(\n record: Record<string, unknown>,\n keys: readonly string[],\n): string | undefined {\n for (const key of keys) {\n const value = asOptionalString(record[key]);\n if (value) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction readFirstStringArray(\n record: Record<string, unknown>,\n keys: readonly string[],\n): string[] | undefined {\n for (const key of keys) {\n const value = record[key];\n if (!Array.isArray(value)) {\n continue;\n }\n const entries = value\n .map((entry) => asOptionalString(entry))\n .filter((entry): entry is string => entry !== undefined);\n if (entries.length > 0) {\n return entries;\n }\n }\n return undefined;\n}\n\nfunction summarizeToolInput(rawInput: unknown): string | undefined {\n if (rawInput == null) {\n return undefined;\n }\n if (\n typeof rawInput === \"string\" ||\n typeof rawInput === \"number\" ||\n typeof rawInput === \"boolean\"\n ) {\n return String(rawInput);\n }\n if (!isRecord(rawInput)) {\n return undefined;\n }\n\n const command = readFirstString(rawInput, [\"command\", \"cmd\", \"program\"]);\n const args = readFirstStringArray(rawInput, [\"args\", \"arguments\"]);\n if (command) {\n return [command, ...(args ?? [])].join(\" \");\n }\n\n return readFirstString(rawInput, [\n \"path\",\n \"file\",\n \"filePath\",\n \"filepath\",\n \"target\",\n \"uri\",\n \"url\",\n \"query\",\n \"pattern\",\n \"text\",\n \"search\",\n ]);\n}\n\nfunction truncateToolSummary(value: string): string {\n if (value.length <= TOOL_OUTPUT_SUMMARY_MAX_CHARS) {\n return value;\n }\n return `${value.slice(0, TOOL_OUTPUT_SUMMARY_MAX_CHARS - 1)}…`;\n}\n\nfunction readToolContentText(value: unknown): string | undefined {\n const record = isRecord(value) ? value : undefined;\n if (!record) {\n return undefined;\n }\n if (record.type === \"content\") {\n return readToolContentText(record.content);\n }\n const reader = toolContentTextReader(String(record.type));\n return reader?.(record);\n}\n\ntype ToolContentTextReader = (record: Record<string, unknown>) => string | undefined;\n\nconst TOOL_CONTENT_TEXT_READERS: Record<string, ToolContentTextReader> = {\n text: (record) => asString(record.text),\n audio: (record) => `[audio] ${asOptionalString(record.mimeType) || \"audio\"}`,\n resource_link: (record) =>\n asOptionalString(record.title) || asOptionalString(record.name) || asOptionalString(record.uri),\n resource: (record) => {\n const resource = isRecord(record.resource) ? record.resource : undefined;\n return asString(resource?.text) || asOptionalString(resource?.uri);\n },\n diff: (record) => `diff ${asOptionalString(record.path) || \"file\"}`,\n terminal: (record) => {\n const terminalId = asOptionalString(record.terminalId) || asOptionalString(record.id);\n return terminalId ? `[terminal] ${terminalId}` : \"[terminal]\";\n },\n};\n\nfunction toolContentTextReader(type: string): ToolContentTextReader | undefined {\n return Object.hasOwn(TOOL_CONTENT_TEXT_READERS, type)\n ? TOOL_CONTENT_TEXT_READERS[type]\n : undefined;\n}\n\nfunction summarizeToolContent(content: unknown): string | undefined {\n if (!Array.isArray(content)) {\n return undefined;\n }\n const fragments = content\n .map((entry) => readToolContentText(entry)?.trim())\n .filter((entry): entry is string => Boolean(entry));\n if (fragments.length === 0) {\n return undefined;\n }\n return truncateToolSummary([...new Set(fragments)].join(\"\\n\"));\n}\n\nfunction summarizeToolOutput(rawOutput: unknown): string | undefined {\n if (rawOutput == null) {\n return undefined;\n }\n if (isScalarToolOutput(rawOutput)) {\n return truncateToolSummary(String(rawOutput));\n }\n const record = isRecord(rawOutput) ? rawOutput : undefined;\n if (!record) {\n return undefined;\n }\n return (\n truncateToolSummary(\n readFirstString(record, [\"text\", \"message\", \"error\", \"stdout\", \"stderr\", \"content\"]) ?? \"\",\n ) || undefined\n );\n}\n\nfunction isScalarToolOutput(value: unknown): value is string | number | boolean {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n}\n\nfunction shouldForwardArray(value: unknown): boolean {\n return Array.isArray(value);\n}\n\nfunction readToolKind(value: unknown): ToolKind | undefined {\n const kind = asOptionalString(value);\n return kind && TOOL_KINDS.has(kind) ? (kind as ToolKind) : undefined;\n}\n\nconst TOOL_KINDS = new Set([\n \"read\",\n \"edit\",\n \"delete\",\n \"move\",\n \"search\",\n \"execute\",\n \"fetch\",\n \"think\",\n \"other\",\n]);\n\nfunction createToolCallEvent(params: {\n payload: Record<string, unknown>;\n tag: AcpSessionUpdateTag;\n}): AcpRuntimeEvent {\n const title = asTrimmedString(params.payload.title) || \"tool call\";\n const status = asTrimmedString(params.payload.status);\n const inputSummary = summarizeToolInput(params.payload.rawInput);\n const outputSummary =\n summarizeToolContent(params.payload.content) ?? summarizeToolOutput(params.payload.rawOutput);\n const toolCallId = asOptionalString(params.payload.toolCallId);\n const kind = readToolKind(params.payload.kind);\n const summaryText = status ? `${title} (${status})` : title;\n const detailSummary =\n params.tag === \"tool_call_update\"\n ? (outputSummary ?? inputSummary)\n : (inputSummary ?? outputSummary);\n const event: AcpRuntimeEvent = {\n type: \"tool_call\",\n text: detailSummary ? `${summaryText}: ${detailSummary}` : summaryText,\n tag: params.tag,\n title,\n };\n assignToolCallEventMetadata(event, params.payload, { toolCallId, status, kind });\n return event;\n}\n\nfunction assignToolCallEventMetadata(\n event: AcpRuntimeEvent,\n payload: Record<string, unknown>,\n values: { toolCallId?: string; status?: string; kind?: ToolKind },\n): void {\n if (event.type !== \"tool_call\") {\n return;\n }\n if (values.toolCallId) {\n event.toolCallId = values.toolCallId;\n }\n if (values.status) {\n event.status = values.status;\n }\n if (values.kind) {\n event.kind = values.kind;\n }\n assignForwardedToolPayload(event, payload);\n}\n\nfunction assignForwardedToolPayload(\n event: Extract<AcpRuntimeEvent, { type: \"tool_call\" }>,\n payload: Record<string, unknown>,\n): void {\n if (shouldForwardArray(payload.locations)) {\n event.locations = payload.locations as ToolCallLocation[];\n }\n if (Object.prototype.hasOwnProperty.call(payload, \"rawInput\")) {\n event.rawInput = payload.rawInput;\n }\n if (Object.prototype.hasOwnProperty.call(payload, \"rawOutput\")) {\n event.rawOutput = payload.rawOutput;\n }\n if (shouldForwardArray(payload.content)) {\n event.content = payload.content as ToolCallContent[];\n }\n}\n\nexport function parsePromptEventLine(line: string): AcpRuntimeEvent | null {\n const trimmed = line.trim();\n if (!trimmed) {\n return null;\n }\n const parsed = safeParseJsonObject(trimmed);\n if (!parsed) {\n return {\n type: \"status\",\n text: trimmed,\n };\n }\n\n const structured = resolveStructuredPromptPayload(parsed);\n const type = structured.type;\n const payload = structured.payload;\n const tag = structured.tag;\n const parser = promptEventParser(type);\n return parser ? parser(payload, tag) : null;\n}\n\ntype PromptEventParser = (\n payload: Record<string, unknown>,\n tag: AcpSessionUpdateTag | undefined,\n) => AcpRuntimeEvent | null;\n\nconst PROMPT_EVENT_PARSERS: Record<string, PromptEventParser> = {\n text: (payload, tag) =>\n createTextDeltaEvent({ content: asString(payload.content), stream: \"output\", tag }),\n thought: (payload, tag) =>\n createTextDeltaEvent({ content: asString(payload.content), stream: \"thought\", tag }),\n tool_call: (payload, tag) => createToolCallEvent({ payload, tag: tag ?? \"tool_call\" }),\n tool_call_update: (payload, tag) =>\n createToolCallEvent({ payload, tag: tag ?? \"tool_call_update\" }),\n agent_message_chunk: (payload) =>\n resolveTextChunk({ payload, stream: \"output\", tag: \"agent_message_chunk\" }),\n agent_thought_chunk: (payload) =>\n resolveTextChunk({ payload, stream: \"thought\", tag: \"agent_thought_chunk\" }),\n usage_update: usageUpdateEvent,\n available_commands_update: (payload) => statusUpdateEvent(\"available_commands_update\", payload),\n current_mode_update: (payload) => statusUpdateEvent(\"current_mode_update\", payload),\n config_option_update: (payload) => statusUpdateEvent(\"config_option_update\", payload),\n session_info_update: (payload) => statusUpdateEvent(\"session_info_update\", payload),\n plan: (payload) => statusUpdateEvent(\"plan\", payload),\n client_operation: clientOperationEvent,\n update: updateStatusEvent,\n done: () => null,\n error: () => null,\n};\n\nfunction promptEventParser(type: string): PromptEventParser | undefined {\n return Object.hasOwn(PROMPT_EVENT_PARSERS, type) ? PROMPT_EVENT_PARSERS[type] : undefined;\n}\n\nfunction usageUpdateEvent(payload: Record<string, unknown>): AcpRuntimeEvent {\n const used = asOptionalFiniteNumber(payload.used);\n const size = asOptionalFiniteNumber(payload.size);\n const text = used != null && size != null ? `usage updated: ${used}/${size}` : \"usage updated\";\n return {\n type: \"status\",\n text,\n tag: \"usage_update\",\n ...(used != null ? { used } : {}),\n ...(size != null ? { size } : {}),\n };\n}\n\nfunction statusUpdateEvent(\n tag: AcpSessionUpdateTag,\n payload: Record<string, unknown>,\n): AcpRuntimeEvent | null {\n const text = resolveStatusTextForTag({ tag, payload });\n if (!text) {\n return null;\n }\n return { type: \"status\", text, tag };\n}\n\nfunction clientOperationEvent(\n payload: Record<string, unknown>,\n tag: AcpSessionUpdateTag | undefined,\n): AcpRuntimeEvent | null {\n const method = asTrimmedString(payload.method) || \"operation\";\n const status = asTrimmedString(payload.status);\n const summary = asTrimmedString(payload.summary);\n const text = [method, status, summary].filter(Boolean).join(\" \");\n return text ? { type: \"status\", text, ...(tag ? { tag } : {}) } : null;\n}\n\nfunction updateStatusEvent(\n payload: Record<string, unknown>,\n tag: AcpSessionUpdateTag | undefined,\n): AcpRuntimeEvent | null {\n const update = asTrimmedString(payload.update);\n return update ? { type: \"status\", text: update, ...(tag ? { tag } : {}) } : null;\n}\n","import path from \"node:path\";\nimport type { SessionRecord } from \"../../types.js\";\n\nexport function shouldReuseExistingRecord(\n record: Pick<SessionRecord, \"cwd\" | \"agentCommand\" | \"acpSessionId\" | \"acpx\">,\n params: {\n cwd: string;\n agentCommand: string;\n resumeSessionId?: string;\n },\n): boolean {\n if (record.acpx?.reset_on_next_ensure === true) {\n return false;\n }\n if (path.resolve(record.cwd) !== path.resolve(params.cwd)) {\n return false;\n }\n if (record.agentCommand !== params.agentCommand) {\n return false;\n }\n if (params.resumeSessionId && record.acpSessionId !== params.resumeSessionId) {\n return false;\n }\n return true;\n}\n","import { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { 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, type ConnectAndLoadSessionResult } 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: PromptInput = [];\n if (text) {\n blocks.push({ type: \"text\", text });\n }\n for (const attachment of attachments) {\n if (attachment.mediaType.startsWith(\"image/\")) {\n blocks.push({\n type: \"image\",\n mimeType: attachment.mediaType,\n data: attachment.data,\n });\n continue;\n }\n if (attachment.mediaType.startsWith(\"audio/\")) {\n blocks.push({\n type: \"audio\",\n mimeType: attachment.mediaType,\n data: attachment.data,\n });\n continue;\n }\n throw new AcpRuntimeError(\n \"ACP_TURN_FAILED\",\n `Unsupported ACP runtime attachment media type: ${attachment.mediaType}`,\n );\n }\n return blocks.length > 0 ? blocks : textPrompt(text);\n}\n\nfunction createInitialRecord(params: {\n recordId: string;\n sessionName: string;\n sessionId: string;\n agentCommand: string;\n 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\ntype CreatedRuntimeSession = {\n sessionId: string;\n agentSessionId: string | undefined;\n sessionResult:\n | Awaited<ReturnType<AcpClient[\"createSession\"]>>\n | Awaited<ReturnType<AcpClient[\"loadSession\"]>>;\n};\n\ntype RuntimeTurnTaskState = {\n pendingCancel: boolean;\n turnActive: boolean;\n activeController: ActiveSessionController | null;\n};\n\ntype RuntimeTurnTask = {\n input: {\n handle: AcpRuntimeHandle;\n text: string;\n attachments?: AcpRuntimeTurnAttachment[];\n mode: AcpRuntimePromptMode;\n sessionMode: \"persistent\" | \"oneshot\";\n requestId: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n };\n promptInput: PromptInput | string;\n queue: AsyncEventQueue;\n sessionReady: Deferred<void>;\n state: RuntimeTurnTaskState;\n settleResult: (next: AcpRuntimeTurnResult) => void;\n abortHandler: () => void;\n};\n\ntype RunningRuntimeTurn = {\n record: SessionRecord;\n conversation: ReturnType<typeof cloneSessionConversation>;\n acpxState: ReturnType<typeof cloneSessionAcpxState>;\n liveCheckpoint: LiveSessionCheckpoint;\n client: AcpClient;\n pendingClient: AcpClient | undefined;\n promptMessageId: string | undefined;\n activeSessionId: string;\n};\n\nasync function createOrLoadRuntimeSession(\n client: AcpClient,\n resumeSessionId: string | undefined,\n cwd: string,\n): Promise<CreatedRuntimeSession> {\n if (resumeSessionId) {\n if (client.supportsResumeSession()) {\n const resumed = await client.resumeSession(resumeSessionId, cwd);\n return {\n sessionId: resumeSessionId,\n agentSessionId: resumed.agentSessionId,\n sessionResult: resumed,\n };\n }\n if (!client.supportsLoadSession()) {\n throw new Error(\n `Agent does not support session/resume or session/load; cannot resume session ${resumeSessionId}`,\n );\n }\n const loaded = await client.loadSession(resumeSessionId, cwd);\n return {\n sessionId: resumeSessionId,\n agentSessionId: loaded.agentSessionId,\n sessionResult: loaded,\n };\n }\n\n const created = await client.createSession(cwd);\n return {\n sessionId: created.sessionId,\n agentSessionId: created.agentSessionId,\n sessionResult: created,\n };\n}\n\nexport class AcpRuntimeManager {\n private readonly activeControllers = new Map<string, ActiveSessionController>();\n private readonly pendingPersistentClients = new Map<string, AcpClient>();\n private readonly closingActiveRecords = new Set<string>();\n\n constructor(\n private readonly options: AcpRuntimeOptions,\n private readonly deps: AcpRuntimeManagerDeps = {},\n ) {}\n\n private createClient(options: ConstructorParameters<typeof AcpClient>[0]): AcpClient {\n return this.deps.clientFactory?.(options) ?? new AcpClient(options);\n }\n\n private async readPendingPersistentClient(\n record: SessionRecord,\n options: { consume: boolean },\n ): Promise<AcpClient | undefined> {\n const pendingClient = this.pendingPersistentClients.get(record.acpxRecordId);\n if (!pendingClient) {\n return undefined;\n }\n if (!pendingClient.hasReusableSession(record.acpSessionId)) {\n this.pendingPersistentClients.delete(record.acpxRecordId);\n await pendingClient.close().catch(() => {});\n return undefined;\n }\n if (options.consume) {\n this.pendingPersistentClients.delete(record.acpxRecordId);\n }\n return pendingClient;\n }\n\n private async closePendingPersistentClient(recordId: string): Promise<void> {\n const pendingClient = this.pendingPersistentClients.get(recordId);\n if (!pendingClient) {\n return;\n }\n this.pendingPersistentClients.delete(recordId);\n await pendingClient.close().catch(() => {});\n }\n\n private async refreshClosedState(record: SessionRecord): Promise<boolean> {\n if (!this.closingActiveRecords.has(record.acpxRecordId)) {\n return record.closed === true;\n }\n const latest = await this.options.sessionStore.load(record.acpxRecordId).catch(() => undefined);\n record.closed = true;\n record.closedAt = latest?.closedAt ?? record.closedAt ?? isoNow();\n if (latest?.acpx) {\n record.acpx = {\n ...record.acpx,\n ...latest.acpx,\n };\n }\n return true;\n }\n\n private async retainPersistentClientAfterTurn(input: {\n record: SessionRecord;\n client: AcpClient;\n }): Promise<boolean> {\n const { record, client } = input;\n const isPersistentRecord = !record.acpxRecordId.includes(\":oneshot:\");\n if (!isPersistentRecord || record.closed || !client.hasReusableSession(record.acpSessionId)) {\n return false;\n }\n const previousClient = this.pendingPersistentClients.get(record.acpxRecordId);\n this.pendingPersistentClients.set(record.acpxRecordId, client);\n if (previousClient && previousClient !== client) {\n await previousClient.close().catch(() => {});\n }\n return true;\n }\n\n private async withRuntimeControlSession<T>(\n record: SessionRecord,\n sessionMode: \"persistent\" | \"oneshot\",\n run: (context: { client: AcpClient; sessionId: string; record: SessionRecord }) => Promise<T>,\n ): Promise<{ value: T; record: SessionRecord }> {\n const pendingClient = await this.readPendingPersistentClient(record, { consume: false });\n if (pendingClient) {\n const value = await run({\n client: pendingClient,\n sessionId: record.acpSessionId,\n record,\n });\n record.lastUsedAt = isoNow();\n record.closed = false;\n record.closedAt = undefined;\n record.protocolVersion = pendingClient.initializeResult?.protocolVersion;\n record.agentCapabilities = pendingClient.initializeResult?.agentCapabilities;\n applyLifecycleSnapshotToRecord(record, pendingClient.getAgentLifecycleSnapshot());\n return { value, record };\n }\n\n const result = await withConnectedSession({\n sessionRecordId: record.acpxRecordId,\n loadRecord: async (sessionRecordId) => await this.requireRecord(sessionRecordId),\n saveRecord: async (connectedRecord) => await this.options.sessionStore.save(connectedRecord),\n createClient: (options) => this.createClient(options),\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n onPermissionRequest: this.options.onPermissionRequest,\n verbose: this.options.verbose,\n timeoutMs: this.options.timeoutMs,\n resumePolicy: resumePolicyForSessionMode(sessionMode),\n run,\n });\n return {\n value: result.value,\n record: result.record,\n };\n }\n async ensureSession(input: {\n sessionKey: string;\n agent: string;\n mode: \"persistent\" | \"oneshot\";\n cwd?: string;\n resumeSessionId?: string;\n sessionOptions?: SessionAgentOptions;\n }): Promise<SessionRecord> {\n const cwd = path.resolve(input.cwd?.trim() || this.options.cwd);\n const agentCommand = 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 const session = await createOrLoadRuntimeSession(client, input.resumeSessionId, cwd);\n const record = await this.createAndSaveRuntimeRecord({\n input,\n client,\n agentCommand,\n cwd,\n session,\n });\n keepClientOpen = await this.keepPersistentClient(input.mode, record.acpxRecordId, client);\n return record;\n } finally {\n if (!keepClientOpen) {\n await client.close();\n }\n }\n }\n\n private async createAndSaveRuntimeRecord(params: {\n input: {\n sessionKey: string;\n mode: \"persistent\" | \"oneshot\";\n sessionOptions?: SessionAgentOptions;\n };\n client: AcpClient;\n agentCommand: string;\n cwd: string;\n session: CreatedRuntimeSession;\n }): Promise<SessionRecord> {\n const { input, client, agentCommand, cwd, session } = params;\n const record = createInitialRecord({\n recordId: createRecordId(input.sessionKey, input.mode),\n sessionName: input.sessionKey,\n sessionId: session.sessionId,\n agentCommand,\n cwd,\n agentSessionId: session.agentSessionId,\n });\n this.closingActiveRecords.delete(record.acpxRecordId);\n record.protocolVersion = client.initializeResult?.protocolVersion;\n record.agentCapabilities = client.initializeResult?.agentCapabilities;\n applyConfigOptionsToRecord(record, session.sessionResult);\n const requestedModelApplied = await applyRequestedModelIfAdvertised({\n client,\n sessionId: session.sessionId,\n requestedModel: input.sessionOptions?.model,\n models: session.sessionResult.models,\n agentCommand,\n timeoutMs: this.options.timeoutMs,\n });\n syncAdvertisedModelState(record, session.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 return record;\n }\n\n private async keepPersistentClient(\n mode: \"persistent\" | \"oneshot\",\n recordId: string,\n client: AcpClient,\n ): Promise<boolean> {\n if (mode !== \"persistent\") {\n return false;\n }\n const previousClient = this.pendingPersistentClients.get(recordId);\n this.pendingPersistentClients.set(recordId, client);\n await previousClient?.close().catch(() => {});\n return true;\n }\n\n startTurn(input: {\n handle: AcpRuntimeHandle;\n text: string;\n attachments?: AcpRuntimeTurnAttachment[];\n mode: AcpRuntimePromptMode;\n sessionMode: \"persistent\" | \"oneshot\";\n requestId: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n }): AcpRuntimeTurn {\n const promptInput = toPromptInput(input.text, input.attachments);\n const queue = new AsyncEventQueue();\n const result = createDeferred<AcpRuntimeTurnResult>();\n const sessionReady = createDeferred<void>();\n void sessionReady.promise.catch(() => {});\n let resultSettled = false;\n const state: RuntimeTurnTaskState = {\n pendingCancel: false,\n turnActive: true,\n activeController: null,\n };\n let streamClosed = false;\n\n const settleResult = (next: AcpRuntimeTurnResult): void => {\n if (resultSettled) {\n return;\n }\n resultSettled = true;\n result.resolve(next);\n };\n\n const closeStream = (): void => {\n if (streamClosed) {\n return;\n }\n streamClosed = true;\n queue.clear();\n queue.close();\n };\n\n const requestCancel = async (): Promise<boolean> => {\n if (state.activeController) {\n return await state.activeController.requestCancelActivePrompt();\n }\n if (!state.turnActive) {\n return false;\n }\n state.pendingCancel = true;\n return true;\n };\n\n const abortHandler = () => {\n void requestCancel();\n };\n if (input.signal) {\n if (input.signal.aborted) {\n closeStream();\n settleResult({\n status: \"cancelled\",\n stopReason: \"cancelled\",\n });\n return {\n requestId: input.requestId,\n events: queue.iterate(),\n result: result.promise,\n cancel: async () => {},\n closeStream: async () => {},\n };\n }\n input.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n void this.runRuntimeTurnTask({\n input,\n promptInput,\n queue,\n sessionReady,\n state,\n settleResult,\n abortHandler,\n });\n\n return {\n requestId: input.requestId,\n events: queue.iterate(),\n result: result.promise,\n cancel: async () => {\n await requestCancel();\n },\n closeStream: async () => {\n closeStream();\n },\n };\n }\n\n private async runRuntimeTurnTask(task: RuntimeTurnTask): Promise<void> {\n let turn: RunningRuntimeTurn | undefined;\n try {\n turn = await this.prepareRuntimeTurn(task);\n const { sessionId, resumed, loadError } = await this.connectRuntimeTurn(task, turn);\n await this.resolveRuntimeTurnReady(task, turn, resumed, loadError);\n if (this.cancelRuntimeTurnBeforePrompt(task)) {\n return;\n }\n await this.applyPendingRuntimeTurnCancel(task, turn);\n const response = await runPromptTurn({\n client: turn.client,\n sessionId,\n prompt: task.promptInput,\n timeoutMs: task.input.timeoutMs ?? this.options.timeoutMs,\n conversation: turn.conversation,\n promptMessageId: turn.promptMessageId,\n });\n await this.saveCompletedRuntimeTurn(turn, response.stopReason);\n task.settleResult({\n status: response.stopReason === \"cancelled\" ? \"cancelled\" : \"completed\",\n ...(response.stopReason ? { stopReason: response.stopReason } : {}),\n });\n } catch (error) {\n this.failRuntimeTurn(task, error);\n } finally {\n await this.finalizeRuntimeTurn(task, turn);\n }\n }\n\n private async prepareRuntimeTurn(task: RuntimeTurnTask): Promise<RunningRuntimeTurn> {\n const record = await this.requireRecord(\n task.input.handle.acpxRecordId ?? task.input.handle.sessionKey,\n );\n const conversation = cloneSessionConversation(record);\n let acpxState = cloneSessionAcpxState(record.acpx);\n const promptStartedAt = isoNow();\n const promptMessageId = recordPromptSubmission(conversation, task.promptInput, promptStartedAt);\n trimConversationForRuntime(conversation);\n record.lastPromptAt = promptStartedAt;\n record.lastUsedAt = promptStartedAt;\n record.acpx = acpxState;\n applyConversation(record, conversation);\n await this.options.sessionStore.save(record);\n\n const pendingClient = await this.readPendingPersistentClient(record, { consume: true });\n const client = pendingClient ?? this.createTurnClient(record);\n const turn: RunningRuntimeTurn = {\n record,\n conversation,\n acpxState,\n liveCheckpoint: this.createRuntimeTurnCheckpoint(record, conversation, () => turn.acpxState),\n client,\n pendingClient,\n promptMessageId,\n activeSessionId: record.acpSessionId,\n };\n task.state.activeController = this.buildRuntimeTurnController(task, turn);\n this.activeControllers.set(record.acpxRecordId, task.state.activeController);\n this.installRuntimeTurnEventHandlers(task, turn);\n return turn;\n }\n\n private createTurnClient(record: SessionRecord): AcpClient {\n return this.createClient({\n agentCommand: record.agentCommand,\n 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\n private createRuntimeTurnCheckpoint(\n record: SessionRecord,\n conversation: ReturnType<typeof cloneSessionConversation>,\n readAcpxState: () => ReturnType<typeof cloneSessionAcpxState>,\n ): LiveSessionCheckpoint {\n return new LiveSessionCheckpoint({\n save: async () => {\n record.lastUsedAt = isoNow();\n record.acpx = readAcpxState();\n applyConversation(record, conversation);\n await this.refreshClosedState(record);\n await this.options.sessionStore.save(record);\n },\n });\n }\n\n private buildRuntimeTurnController(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): ActiveSessionController {\n return {\n hasActivePrompt: () => turn.client.hasActivePrompt(),\n requestCancelActivePrompt: async () => await this.requestRuntimeTurnCancel(task, turn),\n setSessionMode: async (modeId: string) => {\n await this.waitForRuntimeControlSession(task, turn);\n await turn.client.setSessionMode(turn.activeSessionId, modeId);\n const nextState = cloneSessionAcpxState(turn.acpxState) ?? {};\n nextState.desired_mode_id = modeId;\n turn.acpxState = nextState;\n },\n setSessionModel: async (modelId: string) => {\n await this.waitForRuntimeControlSession(task, turn);\n await turn.client.setSessionModel(turn.activeSessionId, modelId);\n },\n setSessionConfigOption: async (configId: string, value: string) => {\n const result = await task.state.activeController!.setResolvedSessionConfigOption(\n configId,\n value,\n );\n return result.response;\n },\n setResolvedSessionConfigOption: async (configId: string, value: string) =>\n await this.setRuntimeResolvedSessionConfigOption(task, turn, configId, value),\n };\n }\n\n private async waitForRuntimeControlSession(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<void> {\n if (turn.client.hasActivePrompt()) {\n return;\n }\n await task.sessionReady.promise;\n }\n\n private async requestRuntimeTurnCancel(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<boolean> {\n if (turn.client.hasActivePrompt()) {\n return await turn.client.requestCancelActivePrompt();\n }\n if (!task.state.turnActive) {\n return false;\n }\n task.state.pendingCancel = true;\n return true;\n }\n\n private async setRuntimeResolvedSessionConfigOption(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n configId: string,\n value: string,\n ): Promise<{\n configId: string;\n response: Awaited<ReturnType<AcpClient[\"setSessionConfigOption\"]>>;\n }> {\n await this.waitForRuntimeControlSession(task, turn);\n const resolvedConfigId = resolveSupportedConfigOptionId(\n {\n ...turn.record,\n acpx: turn.acpxState ?? undefined,\n },\n configId,\n );\n const response = await turn.client.setSessionConfigOption(\n turn.activeSessionId,\n resolvedConfigId,\n value,\n );\n this.applyRuntimeConfigOptionState(turn, resolvedConfigId, value, response);\n return { configId: resolvedConfigId, response };\n }\n\n private applyRuntimeConfigOptionState(\n turn: RunningRuntimeTurn,\n configId: string,\n value: string,\n response: Awaited<ReturnType<AcpClient[\"setSessionConfigOption\"]>>,\n ): void {\n if (response?.configOptions) {\n const nextState = cloneSessionAcpxState(turn.acpxState) ?? {};\n nextState.config_options = structuredClone(response.configOptions);\n turn.acpxState = nextState;\n }\n if (configId === \"mode\") {\n const nextState = cloneSessionAcpxState(turn.acpxState) ?? {};\n nextState.desired_mode_id = value;\n turn.acpxState = nextState;\n return;\n }\n if (configId !== \"model\") {\n const nextState = cloneSessionAcpxState(turn.acpxState) ?? {};\n nextState.desired_config_options = {\n ...nextState.desired_config_options,\n [configId]: value,\n };\n turn.acpxState = nextState;\n }\n }\n\n private installRuntimeTurnEventHandlers(task: RuntimeTurnTask, turn: RunningRuntimeTurn): void {\n turn.client.setEventHandlers({\n onSessionUpdate: (notification) => {\n turn.acpxState = recordSessionUpdate(turn.conversation, turn.acpxState, notification);\n trimConversationForRuntime(turn.conversation);\n turn.liveCheckpoint.request();\n this.emitRuntimeTurnEvent(task, {\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: notification,\n });\n },\n onClientOperation: (operation: ClientOperation) => {\n turn.acpxState = recordClientOperation(turn.conversation, turn.acpxState, operation);\n trimConversationForRuntime(turn.conversation);\n turn.liveCheckpoint.request();\n this.emitRuntimeTurnEvent(task, {\n type: \"client_operation\",\n ...operation,\n });\n },\n });\n }\n\n private emitRuntimeTurnEvent(task: RuntimeTurnTask, payload: Record<string, unknown>): void {\n const parsed = parsePromptEventLine(JSON.stringify(payload));\n if (!parsed) {\n return;\n }\n task.queue.push(parsed);\n }\n\n private async connectRuntimeTurn(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<ConnectAndLoadSessionResult> {\n const loaded = turn.pendingClient\n ? { sessionId: turn.record.acpSessionId, resumed: false, loadError: undefined }\n : await this.connectRuntimeTurnClient(task, turn);\n turn.acpxState = cloneSessionAcpxState(turn.record.acpx);\n return loaded;\n }\n\n private async connectRuntimeTurnClient(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<ConnectAndLoadSessionResult> {\n return await connectAndLoadSession({\n client: turn.client,\n record: turn.record,\n resumePolicy: resumePolicyForSessionMode(task.input.sessionMode),\n timeoutMs: this.options.timeoutMs,\n activeController: task.state.activeController!,\n onClientAvailable: () => this.publishRuntimeTurnController(task, turn),\n onConnectedRecord: (connectedRecord) => {\n connectedRecord.lastPromptAt = isoNow();\n },\n onSessionIdResolved: (sessionIdValue) => {\n turn.activeSessionId = sessionIdValue;\n },\n });\n }\n\n private publishRuntimeTurnController(task: RuntimeTurnTask, turn: RunningRuntimeTurn): void {\n const controller = task.state.activeController;\n if (controller) {\n this.activeControllers.set(turn.record.acpxRecordId, controller);\n }\n }\n\n private async resolveRuntimeTurnReady(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n resumed: boolean,\n loadError: string | undefined,\n ): Promise<void> {\n task.sessionReady.resolve();\n turn.record.lastRequestId = task.input.requestId;\n turn.record.lastPromptAt = isoNow();\n turn.record.closed = false;\n turn.record.closedAt = undefined;\n turn.record.lastUsedAt = isoNow();\n await turn.liveCheckpoint.checkpoint();\n this.emitRuntimeTurnLoadStatus(task, resumed, loadError);\n }\n\n private emitRuntimeTurnLoadStatus(\n task: RuntimeTurnTask,\n resumed: boolean,\n loadError: string | undefined,\n ): void {\n if (!resumed && !loadError) {\n return;\n }\n this.emitRuntimeTurnEvent(task, {\n type: \"status\",\n text: loadError ? `session reconnect fallback: ${loadError}` : \"session resumed\",\n });\n }\n\n private cancelRuntimeTurnBeforePrompt(task: RuntimeTurnTask): boolean {\n if (!task.state.pendingCancel && !task.input.signal?.aborted) {\n return false;\n }\n task.state.pendingCancel = false;\n task.settleResult({\n status: \"cancelled\",\n stopReason: \"cancelled\",\n });\n return true;\n }\n\n private async applyPendingRuntimeTurnCancel(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn,\n ): Promise<boolean> {\n if (!task.state.pendingCancel || !turn.client.hasActivePrompt()) {\n return false;\n }\n const cancelled = await turn.client.requestCancelActivePrompt();\n if (cancelled) {\n task.state.pendingCancel = false;\n }\n return cancelled;\n }\n\n private async saveCompletedRuntimeTurn(\n turn: RunningRuntimeTurn,\n _stopReason: string | undefined,\n ): Promise<void> {\n turn.record.acpSessionId = turn.activeSessionId;\n reconcileAgentSessionId(turn.record, turn.record.agentSessionId);\n turn.record.protocolVersion = turn.client.initializeResult?.protocolVersion;\n turn.record.agentCapabilities = turn.client.initializeResult?.agentCapabilities;\n turn.record.acpx = turn.acpxState;\n applyConversation(turn.record, turn.conversation);\n applyLifecycleSnapshotToRecord(turn.record, turn.client.getAgentLifecycleSnapshot());\n await this.options.sessionStore.save(turn.record);\n }\n\n private failRuntimeTurn(task: RuntimeTurnTask, error: unknown): void {\n task.sessionReady.reject(error);\n const normalized = normalizeOutputError(error, { origin: \"runtime\" });\n task.settleResult({\n status: \"failed\",\n error: {\n message: normalized.message,\n ...(normalized.code ? { code: normalized.code } : {}),\n ...(normalized.detailCode ? { detailCode: normalized.detailCode } : {}),\n ...(normalized.retryable !== undefined ? { retryable: normalized.retryable } : {}),\n },\n });\n }\n\n private async finalizeRuntimeTurn(\n task: RuntimeTurnTask,\n turn: RunningRuntimeTurn | undefined,\n ): Promise<void> {\n task.state.turnActive = false;\n task.input.signal?.removeEventListener(\"abort\", task.abortHandler);\n turn?.client.clearEventHandlers();\n const pooled = turn ? await this.finalizeRuntimeTurnRecord(turn) : false;\n if (!pooled) {\n await turn?.client.close().catch(() => {});\n }\n if (turn) {\n this.activeControllers.delete(turn.record.acpxRecordId);\n this.closingActiveRecords.delete(turn.record.acpxRecordId);\n }\n task.queue.close();\n }\n\n private async finalizeRuntimeTurnRecord(turn: RunningRuntimeTurn): Promise<boolean> {\n applyLifecycleSnapshotToRecord(turn.record, turn.client.getAgentLifecycleSnapshot());\n turn.record.acpx = turn.acpxState;\n applyConversation(turn.record, turn.conversation);\n turn.record.lastUsedAt = isoNow();\n await turn.liveCheckpoint.flush().catch(() => {});\n const closed = await this.refreshClosedState(turn.record);\n await this.options.sessionStore.save(turn.record).catch(() => {});\n if (closed) {\n return false;\n }\n return await this.retainPersistentClientAfterTurn({\n record: turn.record,\n client: turn.client,\n });\n }\n\n async *runTurn(input: {\n handle: AcpRuntimeHandle;\n text: string;\n attachments?: AcpRuntimeTurnAttachment[];\n mode: AcpRuntimePromptMode;\n sessionMode: \"persistent\" | \"oneshot\";\n requestId: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n }): AsyncIterable<AcpRuntimeEvent> {\n const turn = this.startTurn(input);\n yield* turn.events;\n yield legacyTerminalEventFromTurnResult(await turn.result);\n }\n\n async getStatus(handle: AcpRuntimeHandle): Promise<AcpRuntimeStatus> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n return {\n summary: statusSummary(record),\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n ...buildModelsField(record),\n 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\nfunction isPrimitiveDetail(value: unknown): boolean {\n return (\n value == null ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\" ||\n typeof value === \"symbol\"\n );\n}\n\nfunction formatFunctionDetail(value: Function): string {\n return value.name ? `[Function ${value.name}]` : \"[Function]\";\n}\n\nfunction serializeRuntimeDetail(value: unknown): string {\n const seen = new WeakSet<object>();\n const serialized = JSON.stringify(value, (_key: string, nested: unknown): unknown => {\n if (nested instanceof Error) {\n return nested.message || nested.name;\n }\n if (nested && typeof nested === \"object\") {\n if (seen.has(nested)) {\n return \"[Circular]\";\n }\n seen.add(nested);\n }\n return nested;\n });\n return serialized ?? \"undefined\";\n}\n\nexport function formatRuntimeDetail(value: unknown): string {\n if (value instanceof Error) {\n return value.message || value.name;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (isPrimitiveDetail(value)) {\n return String(value);\n }\n if (typeof value === \"function\") {\n return formatFunctionDetail(value);\n }\n\n try {\n return serializeRuntimeDetail(value);\n } catch {\n return \"unserializable object\";\n }\n}\n\nexport function normalizeRuntimeDetails(\n details: readonly unknown[] | undefined,\n): string[] | undefined {\n return details?.map((detail) => formatRuntimeDetail(detail));\n}\n\nexport async function probeRuntime(\n options: AcpRuntimeOptions,\n deps: ProbeRuntimeDeps = {},\n): Promise<RuntimeHealthReport> {\n const agentName = options.probeAgent?.trim() || DEFAULT_AGENT_NAME;\n const agentCommand = options.agentRegistry.resolve(agentName);\n const client = createProbeClient(options, agentCommand, deps);\n\n try {\n await client.start();\n return {\n ok: true,\n message: \"embedded ACP runtime ready\",\n details: [\n `agent=${agentName}`,\n `command=${agentCommand}`,\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\nfunction createProbeClient(\n options: AcpRuntimeOptions,\n agentCommand: string,\n deps: ProbeRuntimeDeps,\n): AcpClient {\n const clientOptions = {\n agentCommand,\n cwd: options.cwd,\n mcpServers: [...(options.mcpServers ?? [])],\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n verbose: options.verbose,\n };\n return deps.clientFactory?.(clientOptions) ?? new AcpClient(clientOptions);\n}\n","import { 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 = {
|
|
@@ -67,6 +109,10 @@ type SessionMessageImage = {
|
|
|
67
109
|
height: number;
|
|
68
110
|
} | null;
|
|
69
111
|
};
|
|
112
|
+
type SessionMessageAudio = {
|
|
113
|
+
source: string;
|
|
114
|
+
mime_type: string;
|
|
115
|
+
};
|
|
70
116
|
type SessionUserContent = {
|
|
71
117
|
Text: string;
|
|
72
118
|
} | {
|
|
@@ -76,6 +122,8 @@ type SessionUserContent = {
|
|
|
76
122
|
};
|
|
77
123
|
} | {
|
|
78
124
|
Image: SessionMessageImage;
|
|
125
|
+
} | {
|
|
126
|
+
Audio: SessionMessageAudio;
|
|
79
127
|
};
|
|
80
128
|
type SessionToolUse = {
|
|
81
129
|
id: string;
|
|
@@ -179,5 +227,16 @@ type SessionRecord = {
|
|
|
179
227
|
acpx?: SessionAcpxState;
|
|
180
228
|
};
|
|
181
229
|
//#endregion
|
|
182
|
-
|
|
183
|
-
|
|
230
|
+
//#region src/runtime/engine/session-options.d.ts
|
|
231
|
+
type SystemPromptOption = string | {
|
|
232
|
+
append: string;
|
|
233
|
+
};
|
|
234
|
+
type SessionAgentOptions = {
|
|
235
|
+
model?: string;
|
|
236
|
+
allowedTools?: string[];
|
|
237
|
+
maxTurns?: number;
|
|
238
|
+
systemPrompt?: SystemPromptOption;
|
|
239
|
+
};
|
|
240
|
+
//#endregion
|
|
241
|
+
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 };
|
|
242
|
+
//# sourceMappingURL=session-options-CFudjdkU.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-options-CFudjdkU.d.ts","names":[],"sources":["../src/prompt-content.ts","../src/types.ts","../src/runtime/engine/session-options.ts"],"mappings":"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"}
|