acpx 0.17.0 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/{agent-registry-DU6mhZBL.js → agent-registry-evUoJINz.js} +5 -1
  2. package/dist/agent-registry-evUoJINz.js.map +1 -0
  3. package/dist/agent-registry.d.ts.map +1 -1
  4. package/dist/agent-registry.js +1 -1
  5. package/dist/{cli-CiyfEC7L.js → cli-B2ycKzaO.js} +5 -5
  6. package/dist/{cli-CiyfEC7L.js.map → cli-B2ycKzaO.js.map} +1 -1
  7. package/dist/cli.js +9 -9
  8. package/dist/{client-C6NUFqr-.d.ts → client-CkbBoSGd.d.ts} +6 -2
  9. package/dist/client-CkbBoSGd.d.ts.map +1 -0
  10. package/dist/{flows-CTOdIk-m.js → flows-xGyhmoHO.js} +5 -5
  11. package/dist/{flows-CTOdIk-m.js.map → flows-xGyhmoHO.js.map} +1 -1
  12. package/dist/flows.d.ts +1 -1
  13. package/dist/flows.js +1 -1
  14. package/dist/{invocation-options-DbCcOAzM.js → invocation-options-eZEBh4vd.js} +5 -5
  15. package/dist/{invocation-options-DbCcOAzM.js.map → invocation-options-eZEBh4vd.js.map} +1 -1
  16. package/dist/{ipc-D3akHMEq.js → ipc-D2rstexT.js} +4 -4
  17. package/dist/ipc-D2rstexT.js.map +1 -0
  18. package/dist/{output-BPPjvJTI.js → output-D2xL6wdp.js} +3 -3
  19. package/dist/{output-BPPjvJTI.js.map → output-D2xL6wdp.js.map} +1 -1
  20. package/dist/{queue-owner-runtime--IbbndGz.js → queue-owner-runtime-Dgv3e2Tp.js} +64 -38
  21. package/dist/queue-owner-runtime-Dgv3e2Tp.js.map +1 -0
  22. package/dist/runtime.d.ts +91 -37
  23. package/dist/runtime.d.ts.map +1 -1
  24. package/dist/runtime.js +113 -29
  25. package/dist/runtime.js.map +1 -1
  26. package/dist/{session-watch--UX5dh00.js → session-watch-CTe9Bnbc.js} +4 -4
  27. package/dist/{session-watch--UX5dh00.js.map → session-watch-CTe9Bnbc.js.map} +1 -1
  28. package/dist/{watch-BbBxO-kb.js → watch-DxuXEc8n.js} +2 -2
  29. package/dist/{watch-BbBxO-kb.js.map → watch-DxuXEc8n.js.map} +1 -1
  30. package/package.json +3 -3
  31. package/skills/acpx/SKILL.md +1 -0
  32. package/dist/agent-registry-DU6mhZBL.js.map +0 -1
  33. package/dist/client-C6NUFqr-.d.ts.map +0 -1
  34. package/dist/ipc-D3akHMEq.js.map +0 -1
  35. package/dist/queue-owner-runtime--IbbndGz.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-owner-runtime-Dgv3e2Tp.js","names":["asRecord","fs","segmentEventPath","activeEventPath","nowIso","canPromptForPermission","canPromptForPermission","asRecord","delay","asRecord","isoNow","ensureAcpxState","fs","delay","isoNow","fs","isoNow","waitMs","isoNow","recordConversationSessionUpdate","recordConversationClientOperation","waitMs"],"sources":["../src/acp/error-normalization.ts","../src/async-control.ts","../src/acp/codex-compat.ts","../src/session/events.ts","../src/session/execution/contracts.ts","../src/permission-prompt.ts","../src/filesystem.ts","../src/permissions.ts","../src/acp/agent-command.ts","../src/acp/auth-env.ts","../src/version.ts","../src/acp/client-protocol.ts","../src/acp/model-support.ts","../src/acp/ndjson-stream.ts","../src/acp/observed-stream.ts","../src/acp/process-descendants.ts","../src/acp/session-control-errors.ts","../src/acp/terminal-manager.ts","../src/acp/client.ts","../src/session/model-state.ts","../src/session/conversation-model.ts","../src/runtime/engine/lifecycle.ts","../src/runtime/engine/session-options.ts","../src/session/mode-preference.ts","../src/session/model-application.ts","../src/session/config-options.ts","../src/session/turn-ownership.ts","../src/session/queue/ipc-server.ts","../src/runtime/engine/reconnect.ts","../src/runtime/engine/connected-session.ts","../src/session/execution/prompt-runner.ts","../src/session/execution/session-control.ts","../src/session/execution/session-management.ts","../src/perf-metrics-capture.ts","../src/session/queue/owner-turn-controller.ts","../src/session/execution/queue-owner-process.ts","../src/runtime/engine/prompt-turn.ts","../src/session/live-checkpoint.ts","../src/session/execution/discard-output.ts","../src/session/execution/runtime.ts","../src/session/execution/queue-owner-runtime.ts"],"sourcesContent":["import {\n AuthPolicyError,\n PermissionDeniedError,\n PermissionPromptUnavailableError,\n} from \"../errors.js\";\nimport {\n EXIT_CODES,\n OUTPUT_ERROR_CODES,\n OUTPUT_ERROR_ORIGINS,\n type ExitCode,\n type OutputErrorAcpPayload,\n type OutputErrorCode,\n type OutputErrorOrigin,\n} from \"../types.js\";\nimport {\n extractAcpError,\n formatUnknownErrorMessage,\n isAcpResourceNotFoundError,\n} from \"./error-shapes.js\";\n\nconst AUTH_REQUIRED_ACP_CODES = new Set([-32000]);\nconst QUERY_CLOSED_BEFORE_RESPONSE_DETAIL = \"query closed before response received\";\n\ntype ErrorMeta = {\n outputCode?: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n};\n\nexport type NormalizedOutputError = {\n code: OutputErrorCode;\n message: string;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n};\n\nexport type NormalizeOutputErrorOptions = {\n defaultCode?: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n};\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction isAuthRequiredMessage(value: string | undefined): boolean {\n if (!value) {\n return false;\n }\n const normalized = value.toLowerCase();\n return [\n \"auth required\",\n \"authentication required\",\n \"authorization required\",\n \"credential required\",\n \"credentials required\",\n \"token required\",\n \"login required\",\n ].some((needle) => normalized.includes(needle));\n}\n\nfunction isAcpAuthRequiredPayload(acp: OutputErrorAcpPayload | undefined): boolean {\n if (!acp) {\n return false;\n }\n if (!AUTH_REQUIRED_ACP_CODES.has(acp.code)) {\n return false;\n }\n if (isAuthRequiredMessage(acp.message)) {\n return true;\n }\n\n const data = asRecord(acp.data);\n if (!data) {\n return false;\n }\n\n return hasAuthRequiredData(data);\n}\n\nfunction hasAuthRequiredData(data: Record<string, unknown>): boolean {\n return (\n data.authRequired === true || hasNonEmptyString(data.methodId) || hasNonEmptyArray(data.methods)\n );\n}\n\nfunction hasNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction hasNonEmptyArray(value: unknown): value is unknown[] {\n return Array.isArray(value) && value.length > 0;\n}\n\nfunction isOutputErrorCode(value: unknown): value is OutputErrorCode {\n return typeof value === \"string\" && OUTPUT_ERROR_CODES.includes(value as OutputErrorCode);\n}\n\nfunction isOutputErrorOrigin(value: unknown): value is OutputErrorOrigin {\n return typeof value === \"string\" && OUTPUT_ERROR_ORIGINS.includes(value as OutputErrorOrigin);\n}\n\nfunction readOutputErrorMeta(error: unknown): ErrorMeta {\n const record = asRecord(error);\n if (!record) {\n return {};\n }\n\n const outputCode = isOutputErrorCode(record.outputCode) ? record.outputCode : undefined;\n const detailCode =\n typeof record.detailCode === \"string\" && record.detailCode.trim().length > 0\n ? record.detailCode\n : undefined;\n const origin = isOutputErrorOrigin(record.origin) ? record.origin : undefined;\n const retryable = typeof record.retryable === \"boolean\" ? record.retryable : undefined;\n\n const acp = extractAcpError(record.acp);\n return {\n outputCode,\n detailCode,\n origin,\n retryable,\n acp,\n };\n}\n\nfunction isTimeoutLike(error: unknown): boolean {\n return error instanceof Error && error.name === \"TimeoutError\";\n}\n\nfunction isNoSessionLike(error: unknown): boolean {\n return error instanceof Error && error.name === \"NoSessionError\";\n}\n\nfunction isUsageLike(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n return (\n error.name === \"CommanderError\" ||\n error.name === \"InvalidArgumentError\" ||\n asRecord(error)?.code === \"commander.invalidArgument\"\n );\n}\n\nexport function formatErrorMessage(error: unknown): string {\n return formatUnknownErrorMessage(error);\n}\n\nexport { extractAcpError, isAcpResourceNotFoundError };\n\nexport function isAcpQueryClosedBeforeResponseError(error: unknown): boolean {\n const acp = extractAcpError(error);\n if (!acp || acp.code !== -32603) {\n return false;\n }\n\n const data = asRecord(acp.data);\n const details = data?.details;\n if (typeof details !== \"string\") {\n return false;\n }\n\n return details.toLowerCase().includes(QUERY_CLOSED_BEFORE_RESPONSE_DETAIL);\n}\n\nfunction mapErrorCode(error: unknown): OutputErrorCode | undefined {\n if (error instanceof PermissionPromptUnavailableError) {\n return \"PERMISSION_PROMPT_UNAVAILABLE\";\n }\n if (error instanceof PermissionDeniedError) {\n return \"PERMISSION_DENIED\";\n }\n if (isTimeoutLike(error)) {\n return \"TIMEOUT\";\n }\n if (isNoSessionLike(error) || isAcpResourceNotFoundError(error)) {\n return \"NO_SESSION\";\n }\n if (isUsageLike(error)) {\n return \"USAGE\";\n }\n return undefined;\n}\n\nexport function normalizeOutputError(\n error: unknown,\n options: NormalizeOutputErrorOptions = {},\n): NormalizedOutputError {\n const meta = readOutputErrorMeta(error);\n const code = resolveOutputErrorCode(error, options, meta);\n const acp = options.acp ?? meta.acp ?? extractAcpError(error);\n return {\n code,\n message: formatErrorMessage(error),\n detailCode: resolveDetailCode(error, acp, options, meta),\n origin: meta.origin ?? options.origin,\n retryable: meta.retryable ?? options.retryable,\n acp,\n };\n}\n\nfunction resolveOutputErrorCode(\n error: unknown,\n options: NormalizeOutputErrorOptions,\n meta: ErrorMeta,\n): OutputErrorCode {\n const code = meta.outputCode ?? mapErrorCode(error) ?? options.defaultCode ?? \"RUNTIME\";\n if (code === \"RUNTIME\" && isAcpResourceNotFoundError(error)) {\n return \"NO_SESSION\";\n }\n return code;\n}\n\nfunction resolveDetailCode(\n error: unknown,\n acp: OutputErrorAcpPayload | undefined,\n options: NormalizeOutputErrorOptions,\n meta: ErrorMeta,\n): string | undefined {\n return (\n meta.detailCode ??\n options.detailCode ??\n (error instanceof AuthPolicyError || isAcpAuthRequiredPayload(acp)\n ? \"AUTH_REQUIRED\"\n : undefined)\n );\n}\n\n/**\n * Returns true when an error from `client.prompt()` looks transient and\n * can reasonably be retried (e.g. model-API 400/500, network hiccups that\n * surface as ACP internal errors).\n *\n * Errors that are definitively non-recoverable (auth, missing session,\n * invalid params, timeout, permission) return false.\n */\nexport function isRetryablePromptError(error: unknown): boolean {\n if (isNonRetryablePromptError(error)) {\n return false;\n }\n\n const acp = extractAcpError(error);\n if (!acp) {\n // Non-ACP errors (e.g. process crash) are not retried at the prompt level.\n return false;\n }\n\n // ACP internal errors (-32603) typically wrap model-API failures → retryable.\n // Parse errors (-32700) can also be transient.\n return acp.code === -32603 || acp.code === -32700;\n}\n\nfunction isNonRetryablePromptError(error: unknown): boolean {\n return (\n error instanceof PermissionDeniedError ||\n error instanceof PermissionPromptUnavailableError ||\n isTimeoutLike(error) ||\n isNoSessionLike(error) ||\n isUsageLike(error)\n );\n}\n\nexport function exitCodeForOutputErrorCode(code: OutputErrorCode): ExitCode {\n switch (code) {\n case \"USAGE\":\n return EXIT_CODES.USAGE;\n case \"TIMEOUT\":\n return EXIT_CODES.TIMEOUT;\n case \"NO_SESSION\":\n return EXIT_CODES.NO_SESSION;\n case \"PERMISSION_DENIED\":\n case \"PERMISSION_PROMPT_UNAVAILABLE\":\n return EXIT_CODES.PERMISSION_DENIED;\n case \"RUNTIME\":\n default:\n return EXIT_CODES.ERROR;\n }\n}\n","export class TimeoutError extends Error {\n constructor(timeoutMs: number) {\n super(`Timed out after ${timeoutMs}ms`);\n this.name = \"TimeoutError\";\n }\n}\n\nexport class InterruptedError extends Error {\n constructor() {\n super(\"Interrupted\");\n this.name = \"InterruptedError\";\n }\n}\n\nexport type AcpControlAuthority = {\n signal?: AbortSignal;\n assertActive?: () => void;\n};\n\nexport function assertControlAuthority(authority?: AcpControlAuthority): void {\n authority?.signal?.throwIfAborted();\n authority?.assertActive?.();\n}\n\nexport async function withTimeout<T>(promise: Promise<T>, timeoutMs?: number): Promise<T> {\n if (timeoutMs == null || timeoutMs <= 0) {\n return await promise;\n }\n\n let timer: NodeJS.Timeout | undefined;\n const timeoutPromise = new Promise<T>((_resolve, reject) => {\n timer = setTimeout(() => {\n reject(new TimeoutError(timeoutMs));\n }, timeoutMs);\n });\n\n try {\n return await Promise.race([promise, timeoutPromise]);\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n }\n}\n\nexport async function withInterrupt<T>(\n run: () => Promise<T>,\n onInterrupt: (signal: NodeJS.Signals) => Promise<void>,\n): Promise<T> {\n return await new Promise<T>((resolve, reject) => {\n let settled = false;\n\n const finish = (cb: () => void) => {\n if (settled) {\n return;\n }\n settled = true;\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n process.off(\"SIGHUP\", onSighup);\n cb();\n };\n\n const rejectInterrupted = (signal: NodeJS.Signals) => {\n void onInterrupt(signal).then(\n () => finish(() => reject(new InterruptedError())),\n (error: unknown) => finish(() => reject(error)),\n );\n };\n\n const onSigint = () => {\n rejectInterrupted(\"SIGINT\");\n };\n\n const onSigterm = () => {\n rejectInterrupted(\"SIGTERM\");\n };\n\n const onSighup = () => {\n rejectInterrupted(\"SIGHUP\");\n };\n\n process.once(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", onSigterm);\n process.once(\"SIGHUP\", onSighup);\n\n void run().then(\n (result) => finish(() => resolve(result)),\n (error) => finish(() => reject(error)),\n );\n });\n}\n","import type { RequestPermissionRequest, RequestPermissionResponse } from \"@agentclientprotocol/sdk\";\n\nexport function isLegacyZedCodexAcpInvocation(agentCommand: string): boolean {\n return /@zed-industries\\/codex-acp\\b/u.test(agentCommand);\n}\n\nexport function preferCodexPermissionRefusal(\n request: RequestPermissionRequest,\n agentName: string | undefined,\n): RequestPermissionRequest {\n if (agentName !== \"@agentclientprotocol/codex-acp\") {\n return request;\n }\n const preferred = request.options.find(\n (option) =>\n option.kind === \"reject_once\" && [\"decline\", \"reject_permissions\"].includes(option.optionId),\n );\n return preferred\n ? {\n ...request,\n options: [preferred, ...request.options.filter((option) => option !== preferred)],\n }\n : request;\n}\n\nexport function codexPermissionNotice(\n request: RequestPermissionRequest,\n response: RequestPermissionResponse,\n agentName: string | undefined,\n): string | undefined {\n if (agentName !== \"@agentclientprotocol/codex-acp\") {\n return undefined;\n }\n if (response.outcome.outcome === \"cancelled\") {\n return \"No matching permission option was available. The request was safely cancelled; Codex may end the current turn.\";\n }\n const selectedId = response.outcome.optionId;\n const option = request.options.find((option) => option.optionId === selectedId);\n return option?.kind === \"reject_once\" && selectedId === \"cancel\"\n ? \"Permission refused using Codex's cancellation option; this can end the current turn. The operation was not approved.\"\n : undefined;\n}\n","import fs from \"node:fs/promises\";\nimport { appendRegularFile } from \"@openclaw/fs-safe/advanced\";\nimport { isAcpJsonRpcMessage } from \"../acp/jsonrpc.js\";\nimport { incrementPerfCounter, measurePerf } from \"../perf-metrics.js\";\nimport type { AcpJsonRpcMessage, SessionRecord } from \"../types.js\";\nimport {\n DEFAULT_EVENT_MAX_SEGMENTS,\n DEFAULT_EVENT_SEGMENT_MAX_BYTES,\n sessionBaseDir,\n sessionEventActivePath as activeEventPath,\n sessionEventSegmentPath as segmentEventPath,\n} from \"./event-log.js\";\nimport {\n SESSION_JOURNAL_SCHEMA,\n SessionJournalReader,\n type SessionJournalMarker,\n type SessionWatchResult,\n} from \"./journal.js\";\nimport { resolveSessionRecord, writeSessionRecord } from \"./persistence.js\";\n\nasync function ensureSessionDir(): Promise<void> {\n await fs.mkdir(sessionBaseDir(), { recursive: true, mode: 0o700 });\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function countExistingSegments(sessionId: string, maxSegments: number): Promise<number> {\n let count = 0;\n\n for (let segment = 1; segment <= maxSegments; segment += 1) {\n if (await pathExists(segmentEventPath(sessionId, segment))) {\n count += 1;\n }\n }\n\n if (await pathExists(activeEventPath(sessionId))) {\n count += 1;\n }\n\n return count;\n}\n\nasync function resolveInitialSegmentCount(\n record: SessionRecord,\n maxSegments: number,\n): Promise<number> {\n if (Number.isInteger(record.eventLog.segment_count) && record.eventLog.segment_count > 0) {\n return record.eventLog.segment_count;\n }\n return (await countExistingSegments(record.acpxRecordId, maxSegments)) || 1;\n}\n\nasync function resolveSessionMaxSegments(sessionId: string): Promise<number> {\n try {\n const record = await resolveSessionRecord(sessionId);\n const configured = record.eventLog.max_segments;\n if (Number.isInteger(configured) && configured > 0) {\n return configured;\n }\n } catch {\n // Fall back to defaults when metadata is unavailable.\n }\n\n return DEFAULT_EVENT_MAX_SEGMENTS;\n}\n\nasync function rotateSegments(sessionId: string, maxSegments: number): Promise<void> {\n const active = activeEventPath(sessionId);\n\n const overflow = segmentEventPath(sessionId, maxSegments);\n await fs.unlink(overflow).catch((error) => {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n });\n\n for (let segment = maxSegments - 1; segment >= 1; segment -= 1) {\n const from = segmentEventPath(sessionId, segment);\n const to = segmentEventPath(sessionId, segment + 1);\n if (!(await pathExists(from))) {\n continue;\n }\n await fs.rename(from, to);\n }\n\n if (await pathExists(active)) {\n await fs.rename(active, segmentEventPath(sessionId, 1));\n }\n}\n\ntype SessionEventWriterOptions = {\n maxSegmentBytes?: number;\n maxSegments?: number;\n};\n\ntype AppendOptions = {\n checkpoint?: boolean;\n};\n\nexport class SessionEventWriter {\n private readonly record: SessionRecord;\n private readonly maxSegmentBytes: number;\n private readonly maxSegments: number;\n private readonly activePath: string;\n private activeSizeBytes: number;\n private segmentCount: number;\n private closed = false;\n private pending: Promise<void> = Promise.resolve();\n private appendFailure?: { error: unknown };\n private sequence: number;\n private requestId: string | null;\n private recoveryPending: boolean;\n private needsAnchor: boolean;\n private needsRotation: boolean;\n private activeEntries: number;\n\n private constructor(\n record: SessionRecord,\n options: Required<SessionEventWriterOptions>,\n state: {\n activePath: string;\n activeSizeBytes: number;\n segmentCount: number;\n sequence: number;\n requestId: string | null;\n anchored: boolean;\n partial: boolean;\n },\n ) {\n this.record = record;\n this.maxSegmentBytes = options.maxSegmentBytes;\n this.maxSegments = options.maxSegments;\n this.activePath = state.activePath;\n this.activeSizeBytes = state.activeSizeBytes;\n this.segmentCount = state.segmentCount;\n this.sequence = state.sequence;\n this.requestId = state.requestId;\n this.recoveryPending = state.requestId !== null;\n this.needsAnchor = !state.anchored;\n this.needsRotation = state.activeSizeBytes > 0 && (!state.anchored || state.partial);\n this.activeEntries = state.anchored ? 1 : 0;\n }\n\n static async open(\n record: SessionRecord,\n options: SessionEventWriterOptions = {},\n ): Promise<SessionEventWriter> {\n const maxSegmentBytes =\n options.maxSegmentBytes ??\n record.eventLog.max_segment_bytes ??\n DEFAULT_EVENT_SEGMENT_MAX_BYTES;\n const maxSegments =\n options.maxSegments ?? record.eventLog.max_segments ?? DEFAULT_EVENT_MAX_SEGMENTS;\n const activePath = activeEventPath(record.acpxRecordId);\n const tail = await new SessionJournalReader({\n ...record,\n eventLog: { ...record.eventLog, max_segments: maxSegments },\n }).readTail();\n if (tail.messageSequence !== undefined) {\n record.lastSeq = tail.messageSequence;\n }\n const segmentCount = await resolveInitialSegmentCount(record, maxSegments);\n return new SessionEventWriter(\n record,\n {\n maxSegmentBytes,\n maxSegments,\n },\n {\n activePath,\n activeSizeBytes: tail.activeSize,\n segmentCount,\n sequence: tail.sequence,\n requestId: tail.requestId,\n anchored: tail.activeAnchored,\n partial: tail.activePartial,\n },\n );\n }\n\n getRecord(): SessionRecord {\n return this.record;\n }\n\n private enqueue(run: () => Promise<void>): Promise<void> {\n if (this.closed) {\n return Promise.reject(new Error(\"SessionEventWriter is closed\"));\n }\n const operation = this.pending.then(run);\n this.pending = operation.catch(() => {});\n return operation;\n }\n\n async beginTurn(requestId: string): Promise<void> {\n if (!requestId) {\n throw new Error(\"Session journal request ID must not be empty\");\n }\n await this.enqueue(async () => {\n if (this.requestId !== null) {\n if (!this.recoveryPending) {\n throw new Error(\"A session journal turn is already active\");\n }\n await this.appendEntry({\n schema: SESSION_JOURNAL_SCHEMA,\n type: \"turn_result\",\n request_id: this.requestId,\n result: {\n status: \"failed\",\n error: {\n message:\n \"The previous owner ended without recording a settled result; the turn outcome is unknown.\",\n detailCode: \"WATCH_OUTCOME_UNKNOWN\",\n retryable: false,\n },\n },\n });\n this.requestId = null;\n }\n this.recoveryPending = false;\n await this.appendEntry({\n schema: SESSION_JOURNAL_SCHEMA,\n type: \"turn_started\",\n request_id: requestId,\n });\n this.requestId = requestId;\n });\n }\n\n async finishTurn(requestId: string, result: SessionWatchResult): Promise<void> {\n await this.enqueue(async () => {\n if (requestId !== this.requestId) {\n throw new Error(\"Session journal result does not match the active request\");\n }\n await this.appendEntry({\n schema: SESSION_JOURNAL_SCHEMA,\n type: \"turn_result\",\n request_id: requestId,\n result,\n });\n this.requestId = null;\n });\n }\n\n async appendMessage(message: AcpJsonRpcMessage, options: AppendOptions = {}): Promise<void> {\n await this.appendMessages([message], options);\n }\n\n async appendMessages(messages: AcpJsonRpcMessage[], options: AppendOptions = {}): Promise<void> {\n await this.enqueue(async () => {\n await measurePerf(\"session.events.append_batch\", async () => {\n for (const message of messages) {\n if (!isAcpJsonRpcMessage(message)) {\n throw new Error(\"Attempted to persist invalid ACP JSON-RPC payload\");\n }\n await this.appendEntry(message);\n this.record.lastSeq += 1;\n if (Object.hasOwn(message, \"id\")) {\n const id = (message as { id?: unknown }).id;\n if (typeof id === \"string\" || typeof id === \"number\") {\n this.record.lastRequestId = String(id);\n }\n }\n }\n });\n if (options.checkpoint === true) {\n await writeSessionRecord(this.record);\n }\n });\n }\n\n private async appendEntry(entry: AcpJsonRpcMessage | SessionJournalMarker): Promise<void> {\n if (this.appendFailure) {\n throw this.appendFailure.error;\n }\n try {\n await this.writeEntry(entry);\n } catch (error) {\n // A checkpoint can recover; an incomplete append needs a newly recovered writer.\n this.appendFailure = { error };\n throw error;\n }\n }\n\n private async writeEntry(entry: AcpJsonRpcMessage | SessionJournalMarker): Promise<void> {\n if (!Number.isSafeInteger(this.sequence + 1)) {\n throw new Error(\"Session journal sequence exceeds its supported range\");\n }\n await ensureSessionDir();\n const line = `${JSON.stringify(entry)}\\n`;\n const lineBytes = Buffer.byteLength(line);\n if (\n this.needsRotation ||\n (this.activeEntries > 0 && this.activeSizeBytes + lineBytes > this.maxSegmentBytes)\n ) {\n await rotateSegments(this.record.acpxRecordId, this.maxSegments);\n this.activeSizeBytes = 0;\n this.activeEntries = 0;\n this.needsAnchor = true;\n this.needsRotation = false;\n this.segmentCount = Math.min(this.segmentCount + 1, this.maxSegments);\n incrementPerfCounter(\"session.events.rotate\");\n }\n if (this.needsAnchor) {\n const anchor: SessionJournalMarker = {\n schema: SESSION_JOURNAL_SCHEMA,\n type: \"segment\",\n record_id: this.record.acpxRecordId,\n sequence: this.sequence,\n message_sequence: this.record.lastSeq,\n request_id: this.requestId,\n };\n const header = `${JSON.stringify(anchor)}\\n`;\n await appendRegularFile({ filePath: this.activePath, content: header, mode: 0o600 });\n this.activeSizeBytes += Buffer.byteLength(header);\n this.needsAnchor = false;\n }\n await appendRegularFile({ filePath: this.activePath, content: line, mode: 0o600 });\n this.activeSizeBytes += lineBytes;\n this.activeEntries += 1;\n this.sequence += 1;\n const writeTs = new Date().toISOString();\n this.record.lastUsedAt = writeTs;\n this.record.eventLog = {\n active_path: this.activePath,\n segment_count: this.segmentCount,\n max_segment_bytes: this.maxSegmentBytes,\n max_segments: this.maxSegments,\n last_write_at: writeTs,\n last_write_error: null,\n };\n }\n\n async checkpoint(): Promise<void> {\n await this.enqueue(async () => await writeSessionRecord(this.record));\n }\n\n async close(options: AppendOptions = {}): Promise<void> {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n await this.pending;\n if (this.appendFailure) {\n throw this.appendFailure.error;\n }\n if (options.checkpoint !== false) {\n await writeSessionRecord(this.record);\n }\n }\n}\n\nexport async function listSessionEvents(\n sessionId: string,\n maxSegments?: number,\n): Promise<AcpJsonRpcMessage[]> {\n maxSegments ??= await resolveSessionMaxSegments(sessionId);\n return await new SessionJournalReader({\n acpxRecordId: sessionId,\n eventLog: { max_segments: maxSegments },\n }).readAcpMessages();\n}\n","import type { AcpClient } from \"../../acp/client.js\";\nimport type { SessionAgentOptions } from \"../../runtime/engine/session-options.js\";\nimport type {\n AcpJsonRpcMessage,\n AcpMessageDirection,\n AuthPolicy,\n ClientOperation,\n McpServer,\n NonInteractivePermissionPolicy,\n OutputErrorEmissionPolicy,\n OutputFormatter,\n PermissionEscalationEvent,\n PermissionMode,\n PermissionPolicy,\n PromptInput,\n AgentSessionListResult,\n SessionNotification,\n SessionResumePolicy,\n SessionRecord,\n} from \"../../types.js\";\n\nexport type SessionConnectionOptions = {\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n fs?: boolean;\n terminal?: boolean;\n verbose?: boolean;\n timeoutMs?: number;\n};\n\nexport const DEFAULT_QUEUE_OWNER_TTL_MS = 300_000;\n\nexport function normalizeQueueOwnerTtlMs(ttlMs: number | undefined): number {\n if (ttlMs == null) {\n return DEFAULT_QUEUE_OWNER_TTL_MS;\n }\n\n if (!Number.isFinite(ttlMs) || ttlMs < 0) {\n return DEFAULT_QUEUE_OWNER_TTL_MS;\n }\n\n // 0 means keep alive forever (no TTL)\n return Math.round(ttlMs);\n}\n\nexport type RunOnceOptions = {\n agentCommand: string;\n agentArgv?: string[];\n cwd: string;\n prompt: PromptInput;\n permissionMode: PermissionMode;\n permissionPolicy?: PermissionPolicy;\n outputFormatter: OutputFormatter;\n errorEmissionPolicy?: OutputErrorEmissionPolicy;\n onAcpMessage?: (direction: AcpMessageDirection, message: AcpJsonRpcMessage) => void;\n onSessionUpdate?: (notification: SessionNotification) => void;\n onClientOperation?: (operation: ClientOperation) => void;\n onPermissionEscalation?: (event: PermissionEscalationEvent) => void;\n suppressSdkConsoleErrors?: boolean;\n sessionOptions?: SessionAgentOptions;\n configOptions?: Array<{ configId: string; value: string }>;\n promptRetries?: number;\n} & SessionConnectionOptions;\n\nexport type SessionCreateOptions = {\n signal?: AbortSignal;\n agentCommand: string;\n agentArgv?: string[];\n cwd: string;\n name?: string;\n resumeSessionId?: string;\n permissionMode: PermissionMode;\n permissionPolicy?: PermissionPolicy;\n sessionOptions?: SessionAgentOptions;\n onModelWarning?: (message: string) => void;\n handleProcessInterrupts?: boolean;\n} & SessionConnectionOptions;\n\nexport type SessionSendOptions = {\n sessionId: string;\n requestId?: string;\n requireSharedRuntime?: boolean;\n onQueueAccepted?: () => void;\n onPromptStarted?: () => void;\n /** Detaches this submitting client without cancelling the accepted prompt. */\n signal?: AbortSignal;\n /** Explicit acpx owner entry point for embedding hosts; never persisted. */\n queueOwnerArgs?: readonly string[];\n prompt: PromptInput;\n resumePolicy?: SessionResumePolicy;\n mcpConfigPath?: string;\n mcpConfigFingerprint?: string;\n permissionMode: PermissionMode;\n permissionPolicy?: PermissionPolicy;\n outputFormatter: OutputFormatter;\n onAcpMessage?: (direction: AcpMessageDirection, message: AcpJsonRpcMessage) => void;\n onSessionUpdate?: (notification: SessionNotification) => void;\n onClientOperation?: (operation: ClientOperation) => void;\n onPermissionEscalation?: (event: PermissionEscalationEvent) => void;\n errorEmissionPolicy?: OutputErrorEmissionPolicy;\n suppressSdkConsoleErrors?: boolean;\n waitForCompletion?: boolean;\n ttlMs?: number;\n maxQueueDepth?: number;\n client?: AcpClient;\n promptRetries?: number;\n sessionOptions?: SessionAgentOptions;\n} & SessionConnectionOptions;\n\nexport type SessionEnsureOptions = SessionCreateOptions & {\n walkBoundary?: string;\n};\n\nexport type SessionListOptions = {\n agentCommand: string;\n agentArgv?: string[];\n cwd: string;\n cursor?: string;\n filterCwd?: string;\n permissionMode: PermissionMode;\n permissionPolicy?: PermissionPolicy;\n} & SessionConnectionOptions;\n\nexport type SessionListResult = AgentSessionListResult | undefined;\n\nexport type SessionCancelOptions = {\n sessionId: string;\n verbose?: boolean;\n};\n\nexport type SessionCancelResult = {\n sessionId: string;\n cancelled: boolean;\n};\n\nexport type SessionSetModeOptions = {\n sessionId: string;\n modeId: string;\n} & SessionConnectionOptions;\n\nexport type SessionSetModelOptions = {\n sessionId: string;\n modelId: string;\n} & SessionConnectionOptions;\n\nexport type SessionSetConfigOptionOptions = {\n sessionId: string;\n configId: string;\n value: string;\n} & SessionConnectionOptions;\n\nexport type SessionCreateWithClientResult = {\n record: SessionRecord;\n client: AcpClient;\n};\n\nexport type { SessionAgentOptions };\n","import readline from \"node:readline/promises\";\n\nexport type PermissionPromptOptions = {\n prompt: string;\n header?: string;\n details?: string;\n};\n\nexport async function promptForPermission(options: PermissionPromptOptions): Promise<boolean> {\n if (!process.stdin.isTTY || !process.stderr.isTTY) {\n return false;\n }\n\n if (options.header) {\n process.stderr.write(`\\n${options.header}\\n`);\n }\n if (options.details && options.details.trim().length > 0) {\n process.stderr.write(`${options.details}\\n`);\n }\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n\n try {\n const answer = await rl.question(options.prompt);\n const normalized = answer.trim().toLowerCase();\n return normalized === \"y\" || normalized === \"yes\";\n } finally {\n rl.close();\n }\n}\n","import path from \"node:path\";\nimport type {\n ReadTextFileRequest,\n ReadTextFileResponse,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from \"@agentclientprotocol/sdk\";\nimport { isPathInside } from \"@openclaw/fs-safe/path\";\nimport { root, type Root } from \"@openclaw/fs-safe/root\";\nimport { PermissionDeniedError, PermissionPromptUnavailableError } from \"./errors.js\";\nimport { promptForPermission } from \"./permission-prompt.js\";\nimport type { ClientOperation, NonInteractivePermissionPolicy, PermissionMode } from \"./types.js\";\n\nconst WRITE_PREVIEW_MAX_LINES = 16;\nconst WRITE_PREVIEW_MAX_CHARS = 1_200;\n\nexport type FileSystemHandlersOptions = {\n cwd: string;\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n onOperation?: (operation: ClientOperation) => void;\n confirmWrite?: (filePath: string, preview: string) => Promise<boolean>;\n};\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction toWritePreview(content: string): string {\n const normalized = content.replace(/\\r\\n/g, \"\\n\");\n const lines = normalized.split(\"\\n\");\n const visibleLines = lines.slice(0, WRITE_PREVIEW_MAX_LINES);\n let preview = visibleLines.join(\"\\n\");\n\n if (lines.length > visibleLines.length) {\n preview += `\\n... (${lines.length - visibleLines.length} more lines)`;\n }\n\n if (preview.length > WRITE_PREVIEW_MAX_CHARS) {\n preview = `${preview.slice(0, WRITE_PREVIEW_MAX_CHARS - 3)}...`;\n }\n\n return preview;\n}\n\nasync function defaultConfirmWrite(filePath: string, preview: string): Promise<boolean> {\n return await promptForPermission({\n header: `[permission] Allow write to ${filePath}?`,\n details: preview,\n prompt: \"Allow write? (y/N) \",\n });\n}\n\nfunction canPromptForPermission(): boolean {\n return process.stdin.isTTY && process.stderr.isTTY;\n}\n\nexport class FileSystemHandlers {\n private readonly rootDir: string;\n private workspace?: Promise<Root>;\n private permissionMode: PermissionMode;\n private nonInteractivePermissions: NonInteractivePermissionPolicy;\n private readonly onOperation?: (operation: ClientOperation) => void;\n private readonly usesDefaultConfirmWrite: boolean;\n private readonly confirmWrite: (filePath: string, preview: string) => Promise<boolean>;\n\n constructor(options: FileSystemHandlersOptions) {\n this.rootDir = path.resolve(options.cwd);\n this.permissionMode = options.permissionMode;\n this.nonInteractivePermissions = options.nonInteractivePermissions ?? \"deny\";\n this.onOperation = options.onOperation;\n this.usesDefaultConfirmWrite = options.confirmWrite == null;\n this.confirmWrite = options.confirmWrite ?? defaultConfirmWrite;\n }\n\n updatePermissionPolicy(\n permissionMode: PermissionMode,\n nonInteractivePermissions?: NonInteractivePermissionPolicy,\n ): void {\n this.permissionMode = permissionMode;\n this.nonInteractivePermissions = nonInteractivePermissions ?? \"deny\";\n }\n\n async readTextFile(params: ReadTextFileRequest): Promise<ReadTextFileResponse> {\n const filePath = this.resolvePathWithinRoot(params.path);\n const summary = `read_text_file: ${filePath}`;\n this.emitOperation({\n method: \"fs/read_text_file\",\n status: \"running\",\n summary,\n details: this.readWindowDetails(params.line, params.limit),\n timestamp: nowIso(),\n });\n\n try {\n if (this.permissionMode === \"deny-all\") {\n throw new PermissionDeniedError(\"Permission denied for fs/read_text_file (--deny-all)\");\n }\n\n const workspace = await this.getWorkspace();\n const content = await workspace.readText(\n `.${path.sep}${path.relative(this.rootDir, filePath)}`,\n );\n const sliced = this.sliceContent(content, params.line, params.limit);\n\n this.emitOperation({\n method: \"fs/read_text_file\",\n status: \"completed\",\n summary,\n details: this.readWindowDetails(params.line, params.limit),\n timestamp: nowIso(),\n });\n return { content: sliced };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.emitOperation({\n method: \"fs/read_text_file\",\n status: \"failed\",\n summary,\n details: message,\n timestamp: nowIso(),\n });\n throw error;\n }\n }\n\n async writeTextFile(params: WriteTextFileRequest): Promise<WriteTextFileResponse> {\n const filePath = this.resolvePathWithinRoot(params.path);\n const preview = toWritePreview(params.content);\n const summary = `write_text_file: ${filePath}`;\n\n this.emitOperation({\n method: \"fs/write_text_file\",\n status: \"running\",\n summary,\n details: preview,\n timestamp: nowIso(),\n });\n\n try {\n if (!(await this.isWriteApproved(filePath, preview))) {\n throw new PermissionDeniedError(\"Permission denied for fs/write_text_file\");\n }\n\n const workspace = await this.getWorkspace();\n const file = await workspace.openWritable(\n `.${path.sep}${path.relative(this.rootDir, filePath)}`,\n { mode: 0o666 },\n );\n try {\n await file.handle.writeFile(params.content, \"utf8\");\n } finally {\n await file.handle.close();\n }\n\n this.emitOperation({\n method: \"fs/write_text_file\",\n status: \"completed\",\n summary,\n details: preview,\n timestamp: nowIso(),\n });\n return {};\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.emitOperation({\n method: \"fs/write_text_file\",\n status: \"failed\",\n summary,\n details: message,\n timestamp: nowIso(),\n });\n throw error;\n }\n }\n\n private async isWriteApproved(filePath: string, preview: string): Promise<boolean> {\n if (this.permissionMode === \"approve-all\") {\n return true;\n }\n if (this.permissionMode === \"deny-all\") {\n return false;\n }\n if (\n this.usesDefaultConfirmWrite &&\n this.nonInteractivePermissions === \"fail\" &&\n !canPromptForPermission()\n ) {\n throw new PermissionPromptUnavailableError();\n }\n return await this.confirmWrite(filePath, preview);\n }\n\n private resolvePathWithinRoot(rawPath: string): string {\n if (!path.isAbsolute(rawPath)) {\n throw new Error(`Path must be absolute: ${rawPath}`);\n }\n const resolved = path.resolve(rawPath);\n if (!isPathInside(this.rootDir, resolved)) {\n throw new Error(`Path is outside allowed cwd subtree: ${resolved}`);\n }\n return resolved;\n }\n\n private getWorkspace(): Promise<Root> {\n return (this.workspace ??= root(this.rootDir, {\n symlinks: \"follow-within-root\",\n hardlinks: \"allow\",\n maxBytes: Infinity,\n }));\n }\n\n private sliceContent(\n content: string,\n line: number | null | undefined,\n limit: number | null | undefined,\n ): string {\n if (line == null && limit == null) {\n return content;\n }\n\n const lines = content.split(\"\\n\");\n const startLine = line == null ? 1 : Math.max(1, Math.trunc(line));\n const startIndex = Math.max(0, startLine - 1);\n const maxLines = limit == null ? undefined : Math.max(0, Math.trunc(limit));\n\n if (maxLines === 0) {\n return \"\";\n }\n\n const endIndex =\n maxLines == null ? lines.length : Math.min(lines.length, startIndex + maxLines);\n\n return lines.slice(startIndex, endIndex).join(\"\\n\");\n }\n\n private readWindowDetails(\n line: number | null | undefined,\n limit: number | null | undefined,\n ): string | undefined {\n if (line == null && limit == null) {\n return undefined;\n }\n const start = line == null ? 1 : Math.max(1, Math.trunc(line));\n const max = limit == null ? \"all\" : Math.max(0, Math.trunc(limit));\n return `line=${start}, limit=${max}`;\n }\n\n private emitOperation(operation: ClientOperation): void {\n this.onOperation?.(operation);\n }\n}\n","import {\n type PermissionOption,\n type RequestPermissionRequest,\n type RequestPermissionResponse,\n type ToolKind,\n} from \"@agentclientprotocol/sdk\";\nimport { PermissionPromptUnavailableError } from \"./errors.js\";\nimport { promptForPermission } from \"./permission-prompt.js\";\nimport type {\n AcpPermissionDecision,\n NonInteractivePermissionPolicy,\n PermissionEscalationEvent,\n PermissionMode,\n PermissionPolicy,\n PermissionPolicyAction,\n} from \"./types.js\";\n\ntype PermissionDecision = \"approved\" | \"denied\" | \"cancelled\";\ntype PermissionPolicyMatch = {\n action: PermissionPolicyAction;\n matchedRule?: string;\n};\nexport type ResolvedPermissionRequest = {\n response: RequestPermissionResponse;\n escalation?: PermissionEscalationEvent;\n};\nconst PERMISSION_MODE_RANK: Record<PermissionMode, number> = {\n \"deny-all\": 0,\n \"approve-reads\": 1,\n \"approve-all\": 2,\n};\n\nfunction selected(optionId: string): RequestPermissionResponse {\n return { outcome: { outcome: \"selected\", optionId } };\n}\n\nfunction cancelled(): RequestPermissionResponse {\n return { outcome: { outcome: \"cancelled\" } };\n}\n\nexport function withPermissionMetadata(\n response: RequestPermissionResponse,\n metadata: Record<string, unknown>,\n): RequestPermissionResponse {\n return {\n ...response,\n _meta: {\n ...response._meta,\n acpx: {\n ...(response._meta?.acpx &&\n typeof response._meta.acpx === \"object\" &&\n !Array.isArray(response._meta.acpx)\n ? response._meta.acpx\n : {}),\n ...metadata,\n },\n },\n };\n}\n\nfunction pickOption(\n options: PermissionOption[],\n kinds: PermissionOption[\"kind\"][],\n): PermissionOption | undefined {\n for (const kind of kinds) {\n const match = options.find((option) => option.kind === kind);\n if (match) {\n return match;\n }\n }\n return undefined;\n}\n\nconst TOOL_KIND_TITLE_MATCHERS: Array<{ kind: ToolKind; needles: readonly string[] }> = [\n { kind: \"read\", needles: [\"read\", \"cat\"] },\n { kind: \"search\", needles: [\"search\", \"find\", \"grep\"] },\n { kind: \"edit\", needles: [\"write\", \"edit\", \"patch\"] },\n { kind: \"delete\", needles: [\"delete\", \"remove\"] },\n { kind: \"move\", needles: [\"move\", \"rename\"] },\n { kind: \"execute\", needles: [\"run\", \"execute\", \"bash\"] },\n { kind: \"fetch\", needles: [\"fetch\", \"http\", \"url\"] },\n { kind: \"think\", needles: [\"think\"] },\n];\n\nexport function inferToolKind(params: RequestPermissionRequest): ToolKind | undefined {\n if (params.toolCall.kind) {\n return params.toolCall.kind;\n }\n\n const title = params.toolCall.title?.trim().toLowerCase();\n if (!title) {\n return undefined;\n }\n\n const head = title.split(\":\", 1)[0]?.trim();\n if (!head) {\n return undefined;\n }\n\n return titleHeadToolKind(head) ?? \"other\";\n}\n\nfunction titleHeadToolKind(head: string): ToolKind | undefined {\n return TOOL_KIND_TITLE_MATCHERS.find(({ needles }) =>\n needles.some((needle) => head.includes(needle)),\n )?.kind;\n}\n\nfunction isAutoApprovedReadKind(kind: ToolKind | undefined): boolean {\n return kind === \"read\" || kind === \"search\";\n}\n\nasync function promptForToolPermission(params: RequestPermissionRequest): Promise<boolean> {\n const toolName = params.toolCall.title ?? \"tool\";\n const toolKind = inferToolKind(params) ?? \"other\";\n return await promptForPermission({\n prompt: `\\n[permission] Allow ${toolName} [${toolKind}]? (y/N) `,\n });\n}\n\nfunction canPromptForPermission(): boolean {\n return process.stdin.isTTY && process.stderr.isTTY;\n}\n\nfunction readStringProperty(value: unknown, keys: string[]): string | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n const record = value as Record<string, unknown>;\n for (const key of keys) {\n const entry = record[key];\n if (typeof entry === \"string\" && entry.trim().length > 0) {\n return entry.trim();\n }\n }\n return undefined;\n}\n\nfunction readToolName(params: RequestPermissionRequest): string | undefined {\n const rawInputName = readStringProperty(params.toolCall.rawInput, [\"name\", \"tool\", \"toolName\"]);\n if (rawInputName) {\n return rawInputName;\n }\n\n const title = params.toolCall.title?.trim();\n const head = title?.split(/[:\\s]/, 1)[0]?.trim();\n return head && head.length > 0 ? head : undefined;\n}\n\nfunction normalizeMatcher(value: string): string {\n return value.trim().toLowerCase();\n}\n\nfunction permissionMatchTokens(params: RequestPermissionRequest): string[] {\n const tokens = new Set<string>();\n const kind = inferToolKind(params);\n const rawKind = params.toolCall.kind;\n const title = params.toolCall.title?.trim();\n const toolName = readToolName(params);\n\n for (const value of [kind, rawKind, title, toolName]) {\n if (typeof value === \"string\" && value.trim().length > 0) {\n tokens.add(normalizeMatcher(value));\n }\n }\n\n if (title) {\n const head = title.split(/[:\\s]/, 1)[0]?.trim();\n if (head) {\n tokens.add(normalizeMatcher(head));\n }\n }\n\n return [...tokens];\n}\n\nfunction findPolicyRule(\n rules: string[] | undefined,\n params: RequestPermissionRequest,\n): string | undefined {\n if (!rules || rules.length === 0) {\n return undefined;\n }\n\n const tokens = permissionMatchTokens(params);\n for (const rule of rules) {\n const normalized = normalizeMatcher(rule);\n if (normalized === \"*\" || tokens.includes(normalized)) {\n return rule;\n }\n }\n return undefined;\n}\n\nfunction matchPermissionPolicy(\n params: RequestPermissionRequest,\n policy: PermissionPolicy | undefined,\n): PermissionPolicyMatch | undefined {\n if (!policy) {\n return undefined;\n }\n\n const denyRule = findPolicyRule(policy.autoDeny, params);\n if (denyRule) {\n return { action: \"deny\", matchedRule: denyRule };\n }\n\n const approveRule = findPolicyRule(policy.autoApprove, params);\n if (approveRule) {\n return { action: \"approve\", matchedRule: approveRule };\n }\n\n const escalateRule = findPolicyRule(policy.escalate, params);\n if (escalateRule) {\n return { action: \"escalate\", matchedRule: escalateRule };\n }\n\n return policy.defaultAction ? { action: policy.defaultAction } : undefined;\n}\n\nfunction buildEscalationEvent(\n params: RequestPermissionRequest,\n matchedRule: string | undefined,\n): PermissionEscalationEvent {\n const toolKind = inferToolKind(params);\n const toolTitle = params.toolCall.title?.trim() || \"tool\";\n const toolName = readToolName(params);\n return {\n type: \"permission_escalation\",\n sessionId: params.sessionId,\n toolCallId: params.toolCall.toolCallId,\n ...(toolName ? { toolName } : {}),\n toolTitle,\n ...(params.toolCall.rawInput !== undefined ? { toolInput: params.toolCall.rawInput } : {}),\n ...(toolKind ? { toolKind } : {}),\n action: \"escalate\",\n ...(matchedRule ? { matchedRule } : {}),\n message: `Permission escalation required for ${toolTitle}`,\n timestamp: new Date().toISOString(),\n };\n}\n\nfunction selectedOrFirst(\n options: PermissionOption[],\n allowOption: PermissionOption | undefined,\n): ResolvedPermissionRequest {\n return { response: selected((allowOption ?? options[0]).optionId) };\n}\n\nfunction selectedOrCancelled(option: PermissionOption | undefined): ResolvedPermissionRequest {\n return { response: option ? selected(option.optionId) : cancelled() };\n}\n\nasync function resolveEscalatingPermissionRequest(\n params: RequestPermissionRequest,\n policyMatch: PermissionPolicyMatch,\n allowOption: PermissionOption | undefined,\n rejectOption: PermissionOption | undefined,\n): Promise<ResolvedPermissionRequest> {\n if (canPromptForPermission()) {\n return resolveInteractivePromptResult(params, allowOption, rejectOption);\n }\n\n const escalation = buildEscalationEvent(params, policyMatch.matchedRule);\n const response = rejectOption ? selected(rejectOption.optionId) : cancelled();\n return {\n response: withPermissionMetadata(response, { permissionEscalation: escalation }),\n escalation,\n };\n}\n\nasync function resolveInteractivePromptResult(\n params: RequestPermissionRequest,\n allowOption: PermissionOption | undefined,\n rejectOption: PermissionOption | undefined,\n): Promise<ResolvedPermissionRequest> {\n const approved = await promptForToolPermission(params);\n if (approved && allowOption) {\n return { response: selected(allowOption.optionId) };\n }\n if (!approved && rejectOption) {\n return { response: selected(rejectOption.optionId) };\n }\n return { response: cancelled() };\n}\n\nfunction resolvePolicyMatch(\n params: RequestPermissionRequest,\n policyMatch: PermissionPolicyMatch | undefined,\n options: PermissionOption[],\n allowOption: PermissionOption | undefined,\n rejectOption: PermissionOption | undefined,\n): Promise<ResolvedPermissionRequest | undefined> | ResolvedPermissionRequest | undefined {\n if (policyMatch?.action === \"approve\") {\n return selectedOrFirst(options, allowOption);\n }\n if (policyMatch?.action === \"deny\") {\n return selectedOrCancelled(rejectOption);\n }\n if (policyMatch?.action === \"escalate\") {\n return resolveEscalatingPermissionRequest(params, policyMatch, allowOption, rejectOption);\n }\n return undefined;\n}\n\nfunction resolveModeMatch(\n options: PermissionOption[],\n mode: PermissionMode,\n allowOption: PermissionOption | undefined,\n rejectOption: PermissionOption | undefined,\n): ResolvedPermissionRequest | undefined {\n if (mode === \"approve-all\") {\n return selectedOrFirst(options, allowOption);\n }\n if (mode === \"deny-all\") {\n return selectedOrCancelled(rejectOption);\n }\n return undefined;\n}\n\nfunction resolveNonInteractivePermission(\n nonInteractivePolicy: NonInteractivePermissionPolicy,\n rejectOption: PermissionOption | undefined,\n): ResolvedPermissionRequest {\n if (nonInteractivePolicy === \"fail\") {\n throw new PermissionPromptUnavailableError();\n }\n return selectedOrCancelled(rejectOption);\n}\n\nasync function resolveReadOrPromptPermission(\n params: RequestPermissionRequest,\n nonInteractivePolicy: NonInteractivePermissionPolicy,\n allowOption: PermissionOption | undefined,\n rejectOption: PermissionOption | undefined,\n): Promise<ResolvedPermissionRequest> {\n const kind = inferToolKind(params);\n if (isAutoApprovedReadKind(kind) && allowOption) {\n return { response: selected(allowOption.optionId) };\n }\n\n if (!canPromptForPermission()) {\n return resolveNonInteractivePermission(nonInteractivePolicy, rejectOption);\n }\n\n return resolveInteractivePromptResult(params, allowOption, rejectOption);\n}\n\nexport function permissionModeSatisfies(actual: PermissionMode, required: PermissionMode): boolean {\n return PERMISSION_MODE_RANK[actual] >= PERMISSION_MODE_RANK[required];\n}\n\nexport async function resolvePermissionRequest(\n params: RequestPermissionRequest,\n mode: PermissionMode,\n nonInteractivePolicy: NonInteractivePermissionPolicy = \"deny\",\n policy?: PermissionPolicy,\n): Promise<RequestPermissionResponse> {\n const result = await resolvePermissionRequestWithDetails(\n params,\n mode,\n nonInteractivePolicy,\n policy,\n );\n return result.response;\n}\n\nexport async function resolvePermissionRequestWithDetails(\n params: RequestPermissionRequest,\n mode: PermissionMode,\n nonInteractivePolicy: NonInteractivePermissionPolicy = \"deny\",\n policy?: PermissionPolicy,\n): Promise<ResolvedPermissionRequest> {\n const options = params.options ?? [];\n if (options.length === 0) {\n return { response: cancelled() };\n }\n\n const allowOption = pickOption(options, [\"allow_once\", \"allow_always\"]);\n const rejectOption = pickOption(options, [\"reject_once\", \"reject_always\"]);\n const policyMatch = matchPermissionPolicy(params, policy);\n\n const resolvedByPolicy = await resolvePolicyMatch(\n params,\n policyMatch,\n options,\n allowOption,\n rejectOption,\n );\n if (resolvedByPolicy) {\n return resolvedByPolicy;\n }\n\n const resolvedByMode = resolveModeMatch(options, mode, allowOption, rejectOption);\n if (resolvedByMode) {\n return resolvedByMode;\n }\n\n return resolveReadOrPromptPermission(params, nonInteractivePolicy, allowOption, rejectOption);\n}\n\nconst DECISION_FALLBACK_ORDER: Record<\n Exclude<AcpPermissionDecision[\"outcome\"], \"cancel\">,\n PermissionOption[\"kind\"][]\n> = {\n allow_once: [\"allow_once\", \"allow_always\"],\n allow_always: [\"allow_always\", \"allow_once\"],\n reject_once: [\"reject_once\", \"reject_always\"],\n reject_always: [\"reject_always\", \"reject_once\"],\n};\n\nexport function decisionToResponse(\n params: RequestPermissionRequest,\n decision: AcpPermissionDecision,\n): RequestPermissionResponse {\n if (decision.outcome === \"cancel\") {\n return cancelled();\n }\n const matched = pickOption(params.options ?? [], DECISION_FALLBACK_ORDER[decision.outcome]);\n return matched ? selected(matched.optionId) : cancelled();\n}\n\nexport function classifyPermissionDecision(\n params: RequestPermissionRequest,\n response: RequestPermissionResponse,\n): PermissionDecision {\n if (response.outcome.outcome !== \"selected\") {\n return \"cancelled\";\n }\n\n const selectedOptionId = response.outcome.optionId;\n const selectedOption = params.options.find((option) => option.optionId === selectedOptionId);\n\n if (!selectedOption) {\n return \"cancelled\";\n }\n\n if (selectedOption.kind === \"allow_once\" || selectedOption.kind === \"allow_always\") {\n return \"approved\";\n }\n\n return \"denied\";\n}\n","import { spawn } from \"node:child_process\";\nimport { CopilotAcpUnsupportedError } from \"../errors.js\";\nimport {\n buildSpawnCommandOptions,\n readWindowsEnvValue,\n resolveWindowsExecutablePath,\n} from \"../spawn-command-options.js\";\nimport { type AcpClientOptions } from \"../types.js\";\nimport { basenameToken, splitCommandLine } from \"./client-process.js\";\n\nconst DEFAULT_AGENT_CLOSE_AFTER_STDIN_END_MS = 100;\nconst QODER_AGENT_CLOSE_AFTER_STDIN_END_MS = 750;\nconst GEMINI_ACP_STARTUP_TIMEOUT_MS = 15_000;\nconst CLAUDE_ACP_SESSION_CREATE_TIMEOUT_MS = 60_000;\nconst GEMINI_VERSION_TIMEOUT_MS = 2_000;\nconst GEMINI_ACP_FLAG_VERSION = [0, 33, 0] as const;\nconst COPILOT_HELP_TIMEOUT_MS = 2_000;\nconst CLAUDE_CODE_DEFAULT_SETTING_SOURCES = [\"project\", \"local\"] as const;\n\ntype GeminiVersion = {\n raw: string;\n parts: [number, number, number];\n};\n\nconst QODER_BENIGN_STDOUT_LINES = new Set([\n \"Received interrupt signal. Cleaning up resources...\",\n \"Cleanup completed. Exiting...\",\n]);\n\nexport function resolveAgentCloseAfterStdinEndMs(agentCommand: string): number {\n const { command } = splitCommandLine(agentCommand);\n return basenameToken(command) === \"qodercli\"\n ? QODER_AGENT_CLOSE_AFTER_STDIN_END_MS\n : DEFAULT_AGENT_CLOSE_AFTER_STDIN_END_MS;\n}\n\nexport function shouldIgnoreNonJsonAgentOutputLine(\n agentCommand: string,\n trimmedLine: string,\n): boolean {\n const { command } = splitCommandLine(agentCommand);\n return basenameToken(command) === \"qodercli\" && QODER_BENIGN_STDOUT_LINES.has(trimmedLine);\n}\n\nexport function isGeminiAcpCommand(command: string, args: readonly string[]): boolean {\n return (\n basenameToken(command) === \"gemini\" &&\n (args.includes(\"--acp\") || args.includes(\"--experimental-acp\"))\n );\n}\n\nexport function isClaudeAcpCommand(command: string, args: readonly string[]): boolean {\n const commandToken = basenameToken(command);\n if (commandToken === \"claude-agent-acp\") {\n return true;\n }\n return args.some((arg) => arg.includes(\"claude-agent-acp\"));\n}\n\nexport function isCopilotAcpCommand(command: string, args: readonly string[]): boolean {\n return basenameToken(command) === \"copilot\" && args.includes(\"--acp\");\n}\n\nexport function isQoderAcpCommand(command: string, args: readonly string[]): boolean {\n return basenameToken(command) === \"qodercli\" && args.includes(\"--acp\");\n}\n\nexport function isCursorAcpCommand(command: string, args: readonly string[]): boolean {\n const commandToken = basenameToken(command);\n return commandToken === \"cursor-agent\" || (commandToken === \"agent\" && args.includes(\"acp\"));\n}\n\nexport function isDevinAcpCommand(command: string, args: readonly string[]): boolean {\n return (\n basenameToken(command) === \"devin\" &&\n (args.includes(\"acp\") || args.includes(\"--acp\") || args.includes(\"--experimental-acp\"))\n );\n}\n\nfunction hasCommandFlag(args: readonly string[], flagName: string): boolean {\n return args.some((arg) => arg === flagName || arg.startsWith(`${flagName}=`));\n}\n\nfunction normalizeQoderAllowedToolName(tool: string): string {\n switch (tool.trim().toLowerCase()) {\n case \"bash\":\n case \"glob\":\n case \"grep\":\n case \"ls\":\n case \"read\":\n case \"write\":\n return tool.trim().toUpperCase();\n default:\n return tool.trim();\n }\n}\n\nexport function buildQoderAcpCommandArgs(\n initialArgs: readonly string[],\n options: Pick<AcpClientOptions, \"sessionOptions\">,\n): string[] {\n const args = [...initialArgs];\n const sessionOptions = options.sessionOptions;\n\n if (typeof sessionOptions?.maxTurns === \"number\" && !hasCommandFlag(args, \"--max-turns\")) {\n args.push(`--max-turns=${sessionOptions.maxTurns}`);\n }\n\n if (\n Array.isArray(sessionOptions?.allowedTools) &&\n !hasCommandFlag(args, \"--allowed-tools\") &&\n !hasCommandFlag(args, \"--disallowed-tools\")\n ) {\n const encodedTools = sessionOptions.allowedTools.map(normalizeQoderAllowedToolName).join(\",\");\n args.push(`--allowed-tools=${encodedTools}`);\n }\n\n return args;\n}\n\nexport function resolveGeminiAcpStartupTimeoutMs(): number {\n const raw = process.env.ACPX_GEMINI_ACP_STARTUP_TIMEOUT_MS;\n if (typeof raw === \"string\" && raw.trim().length > 0) {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed > 0) {\n return Math.round(parsed);\n }\n }\n return GEMINI_ACP_STARTUP_TIMEOUT_MS;\n}\n\nexport function resolveClaudeAcpSessionCreateTimeoutMs(): number {\n const raw = process.env.ACPX_CLAUDE_ACP_SESSION_CREATE_TIMEOUT_MS;\n if (typeof raw === \"string\" && raw.trim().length > 0) {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed > 0) {\n return Math.round(parsed);\n }\n }\n return CLAUDE_ACP_SESSION_CREATE_TIMEOUT_MS;\n}\n\nfunction parseGeminiVersion(value: string | undefined): GeminiVersion | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const normalized = value.trim();\n const match = normalized.match(/(\\d+)\\.(\\d+)\\.(\\d+)/);\n if (!match) {\n return undefined;\n }\n\n return {\n raw: normalized,\n parts: [Number(match[1]), Number(match[2]), Number(match[3])],\n };\n}\n\nfunction compareVersionParts(left: readonly number[], right: readonly number[]): number {\n for (let index = 0; index < Math.max(left.length, right.length); index += 1) {\n const leftPart = left[index] ?? 0;\n const rightPart = right[index] ?? 0;\n if (leftPart !== rightPart) {\n return leftPart - rightPart;\n }\n }\n return 0;\n}\n\nasync function detectGeminiVersion(command: string): Promise<GeminiVersion | undefined> {\n const output = await readCommandOutput(command, [\"--version\"], GEMINI_VERSION_TIMEOUT_MS);\n const versionLine = output\n ?.split(/\\r?\\n/)\n .map((line) => line.trim())\n .find((line) => /\\d+\\.\\d+\\.\\d+/.test(line));\n return parseGeminiVersion(versionLine);\n}\n\nexport async function resolveGeminiCommandArgs(\n command: string,\n args: readonly string[],\n): Promise<string[]> {\n if (basenameToken(command) !== \"gemini\" || !args.includes(\"--acp\")) {\n return [...args];\n }\n\n const version = await detectGeminiVersion(command);\n if (version && compareVersionParts(version.parts, GEMINI_ACP_FLAG_VERSION) < 0) {\n return args.map((arg) => (arg === \"--acp\" ? \"--experimental-acp\" : arg));\n }\n\n return [...args];\n}\n\nasync function readCommandOutput(\n command: string,\n args: readonly string[],\n timeoutMs: number,\n): Promise<string | undefined> {\n return await new Promise<string | undefined>((resolve) => {\n const child = spawn(\n command,\n [...args],\n buildSpawnCommandOptions(command, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n }),\n );\n\n let stdout = \"\";\n let stderr = \"\";\n let settled = false;\n const finish = (value: string | undefined) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n child.removeAllListeners();\n child.stdout?.removeAllListeners();\n child.stderr?.removeAllListeners();\n resolve(value);\n };\n const timer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n finish(undefined);\n }, timeoutMs);\n\n child.stdout?.setEncoding(\"utf8\");\n child.stderr?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.stderr?.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n child.once(\"error\", () => {\n finish(undefined);\n });\n child.once(\"close\", () => {\n finish(`${stdout}\\n${stderr}`);\n });\n });\n}\n\nexport async function buildGeminiAcpStartupTimeoutMessage(command: string): Promise<string> {\n const parts = [\n \"Gemini CLI ACP startup timed out before initialize completed.\",\n \"This usually means the local Gemini CLI is waiting on interactive OAuth or has incompatible ACP subprocess behavior.\",\n ];\n\n const version = await detectGeminiVersion(command);\n if (version) {\n parts.push(`Detected Gemini CLI version: ${version.raw}.`);\n }\n\n if (!process.env.GEMINI_API_KEY && !process.env.GOOGLE_API_KEY) {\n parts.push(\"No GEMINI_API_KEY or GOOGLE_API_KEY was set for non-interactive auth.\");\n }\n\n parts.push(\"Try upgrading Gemini CLI and using API-key-based auth for non-interactive ACP runs.\");\n return parts.join(\" \");\n}\n\nexport function buildClaudeAcpSessionCreateTimeoutMessage(): string {\n return [\n \"Claude ACP session creation timed out before session/new completed.\",\n \"This matches the known persistent-session stall seen with some Claude Code and @agentclientprotocol/claude-agent-acp combinations.\",\n \"In harnessed or non-interactive runs, prefer --approve-all with nonInteractivePermissions=deny, upgrade Claude Code and the Claude ACP adapter, or use acpx claude exec as a one-shot fallback.\",\n ].join(\" \");\n}\n\nasync function buildCopilotAcpUnsupportedMessage(command: string): Promise<string> {\n const parts = [\n \"GitHub Copilot CLI ACP stdio mode is not available in the installed copilot binary.\",\n \"acpx copilot expects a Copilot CLI release that supports --acp --stdio.\",\n ];\n\n const helpOutput = await readCommandOutput(command, [\"--help\"], COPILOT_HELP_TIMEOUT_MS);\n if (typeof helpOutput === \"string\" && !helpOutput.includes(\"--acp\")) {\n parts.push(\"Detected copilot --help output without --acp support.\");\n }\n\n parts.push(\n \"Upgrade GitHub Copilot CLI to a release with ACP stdio support, or use --agent with another ACP-compatible adapter in the meantime.\",\n );\n return parts.join(\" \");\n}\n\nexport async function ensureCopilotAcpSupport(command: string): Promise<void> {\n const helpOutput = await readCommandOutput(command, [\"--help\"], COPILOT_HELP_TIMEOUT_MS);\n if (typeof helpOutput === \"string\" && !helpOutput.includes(\"--acp\")) {\n throw new CopilotAcpUnsupportedError(await buildCopilotAcpUnsupportedMessage(command), {\n retryable: false,\n });\n }\n}\n\nexport function buildClaudeCodeOptionsMeta(\n options: AcpClientOptions[\"sessionOptions\"],\n isolateUserSettings = false,\n): Record<string, unknown> | undefined {\n const claudeCodeOptions: Record<string, unknown> = {};\n if (isolateUserSettings) {\n claudeCodeOptions.settingSources = resolveClaudeCodeSettingSources();\n }\n if (options) {\n assignClaudeCodeOptions(claudeCodeOptions, options);\n }\n\n const meta: Record<string, unknown> = {};\n if (Object.keys(claudeCodeOptions).length > 0) {\n meta.claudeCode = { options: claudeCodeOptions };\n }\n\n assignClaudeCodeSystemPrompt(meta, options?.systemPrompt);\n\n if (Object.keys(meta).length === 0) {\n return undefined;\n }\n\n return meta;\n}\n\nexport function resolveClaudeCodeSettingSources(env: NodeJS.ProcessEnv = process.env): string[] {\n if (env.ACPX_CLAUDE_INCLUDE_USER_SETTINGS?.trim() === \"1\") {\n return [\"user\", ...CLAUDE_CODE_DEFAULT_SETTING_SOURCES];\n }\n return [...CLAUDE_CODE_DEFAULT_SETTING_SOURCES];\n}\n\nfunction assignClaudeCodeOptions(\n target: Record<string, unknown>,\n options: NonNullable<AcpClientOptions[\"sessionOptions\"]>,\n): void {\n if (typeof options.model === \"string\" && options.model.trim().length > 0) {\n target.model = options.model;\n }\n if (Array.isArray(options.allowedTools)) {\n target.allowedTools = [...options.allowedTools];\n }\n if (typeof options.maxTurns === \"number\") {\n target.maxTurns = options.maxTurns;\n }\n}\n\nfunction assignClaudeCodeSystemPrompt(\n target: Record<string, unknown>,\n systemPrompt: NonNullable<AcpClientOptions[\"sessionOptions\"]>[\"systemPrompt\"] | undefined,\n): void {\n if (typeof systemPrompt === \"string\" && systemPrompt.length > 0) {\n target.systemPrompt = systemPrompt;\n return;\n }\n if (isAppendSystemPrompt(systemPrompt)) {\n target.systemPrompt = { append: systemPrompt.append };\n }\n}\n\nfunction isAppendSystemPrompt(\n value: NonNullable<AcpClientOptions[\"sessionOptions\"]>[\"systemPrompt\"],\n): value is { append: string } {\n return (\n !!value &&\n typeof value === \"object\" &&\n typeof value.append === \"string\" &&\n value.append.length > 0\n );\n}\n\nexport function resolveClaudeCodeExecutable(\n platform: NodeJS.Platform = process.platform,\n env: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n if (platform !== \"win32\") {\n return undefined;\n }\n if (readWindowsEnvValue(env, \"CLAUDE_CODE_EXECUTABLE\")) {\n return undefined;\n }\n return resolveWindowsExecutablePath(\"claude\", env);\n}\n","import type { AcpClientOptions } from \"../types.js\";\n\nconst AUTH_ENV_PREFIX = \"ACPX_AUTH_\";\n\nfunction toEnvToken(value: string): string {\n return value\n .trim()\n .replace(/[^a-zA-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .toUpperCase();\n}\n\nfunction buildAuthEnvKey(methodId: string): string | undefined {\n const token = toEnvToken(methodId);\n return token.length > 0 ? `${AUTH_ENV_PREFIX}${token}` : undefined;\n}\n\nconst authEnvKeyCache = new Map<string, string | undefined>();\n\nfunction authEnvKey(methodId: string): string | undefined {\n const cached = authEnvKeyCache.get(methodId);\n if (cached !== undefined) {\n return cached;\n }\n const key = buildAuthEnvKey(methodId);\n authEnvKeyCache.set(methodId, key);\n return key;\n}\n\nexport function readEnvCredential(methodId: string): string | undefined {\n const key = authEnvKey(methodId);\n if (!key) {\n return undefined;\n }\n const value = process.env[key];\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n return undefined;\n}\n\nfunction protectedEnvKey(key: string): string {\n return process.platform === \"win32\" ? key.toUpperCase() : key;\n}\n\nfunction isAuthEnvKey(key: string): boolean {\n return protectedEnvKey(key).startsWith(AUTH_ENV_PREFIX);\n}\n\nfunction authEnvSuffix(key: string): string {\n return key.slice(AUTH_ENV_PREFIX.length);\n}\n\nfunction protectEnvKey(protectedKeys: Set<string>, key: string): void {\n protectedKeys.add(protectedEnvKey(key));\n}\n\nfunction promotePrefixedAuthEnvironment(env: NodeJS.ProcessEnv): Set<string> {\n const protectedKeys = new Set<string>();\n for (const [key, value] of Object.entries(env)) {\n if (!isAuthEnvKey(key)) {\n continue;\n }\n if (typeof value !== \"string\" || value.trim().length === 0) {\n continue;\n }\n\n const normalized = toEnvToken(authEnvSuffix(key));\n if (!normalized) {\n continue;\n }\n\n protectEnvKey(protectedKeys, key);\n protectEnvKey(protectedKeys, normalized);\n if (env[normalized] == null) {\n env[normalized] = value;\n }\n }\n return protectedKeys;\n}\n\nfunction validateAgentProcessEnv(agentProcessEnv: Record<string, string> | undefined): void {\n for (const [key, value] of Object.entries(agentProcessEnv ?? {})) {\n if (\n typeof value !== \"string\" ||\n key.includes(\"=\") ||\n key.includes(\"\\u0000\") ||\n value.includes(\"\\u0000\")\n ) {\n throw new Error(\n \"Invalid agentProcessEnv: environment entries cannot contain NUL or names with '='\",\n );\n }\n }\n}\n\nfunction buildAgentEnvironment(\n authCredentials: Record<string, string> | undefined,\n sessionEnv: Record<string, string> | undefined,\n agentProcessEnv: Record<string, string> | undefined,\n): NodeJS.ProcessEnv {\n validateAgentProcessEnv(agentProcessEnv);\n const env: NodeJS.ProcessEnv = { ...process.env };\n const protectedAuthEnvKeys = promotePrefixedAuthEnvironment(env);\n if (authCredentials) {\n for (const [methodId, credential] of Object.entries(authCredentials)) {\n addAuthCredentialEnvKeys(protectedAuthEnvKeys, methodId, credential);\n assignAuthCredentialEnv(env, methodId, credential);\n }\n }\n\n for (const overlay of [sessionEnv, agentProcessEnv]) {\n for (const [key, value] of Object.entries(overlay ?? {})) {\n if (typeof value !== \"string\" || protectedAuthEnvKeys.has(protectedEnvKey(key))) {\n continue;\n }\n assignSessionEnv(env, key, value);\n }\n }\n\n return env;\n}\n\nfunction assignSessionEnv(env: NodeJS.ProcessEnv, key: string, value: string): void {\n const normalizedKey = protectedEnvKey(key);\n for (const existingKey of Object.keys(env)) {\n if (protectedEnvKey(existingKey) === normalizedKey) {\n delete env[existingKey];\n }\n }\n env[key] = value;\n}\n\nfunction addAuthCredentialEnvKeys(\n protectedKeys: Set<string>,\n methodId: string,\n credential: string,\n): void {\n if (typeof credential !== \"string\" || credential.trim().length === 0) {\n return;\n }\n\n if (!methodId.includes(\"=\") && !methodId.includes(\"\\u0000\")) {\n protectEnvKey(protectedKeys, methodId);\n }\n\n const normalized = toEnvToken(methodId);\n if (normalized) {\n protectEnvKey(protectedKeys, `${AUTH_ENV_PREFIX}${normalized}`);\n protectEnvKey(protectedKeys, normalized);\n }\n}\n\nfunction assignAuthCredentialEnv(\n env: NodeJS.ProcessEnv,\n methodId: string,\n credential: string,\n): void {\n if (typeof credential !== \"string\" || credential.trim().length === 0) {\n return;\n }\n\n if (!methodId.includes(\"=\") && !methodId.includes(\"\\u0000\") && env[methodId] == null) {\n env[methodId] = credential;\n }\n\n const normalized = toEnvToken(methodId);\n if (normalized) {\n assignIfMissing(env, `${AUTH_ENV_PREFIX}${normalized}`, credential);\n assignIfMissing(env, normalized, credential);\n }\n}\n\nfunction assignIfMissing(env: NodeJS.ProcessEnv, key: string, value: string): void {\n if (env[key] == null) {\n env[key] = value;\n }\n}\n\nexport function resolveConfiguredAuthCredential(\n methodId: string,\n authCredentials: AcpClientOptions[\"authCredentials\"],\n): string | undefined {\n const configCredentials = authCredentials ?? {};\n return configCredentials[methodId] ?? configCredentials[toEnvToken(methodId)];\n}\n\nexport function buildAgentSpawnOptions(\n cwd: string,\n authCredentials: Record<string, string> | undefined,\n sessionEnv?: Record<string, string>,\n agentProcessEnv?: Record<string, string>,\n): {\n cwd: string;\n env: NodeJS.ProcessEnv;\n stdio: [\"pipe\", \"pipe\", \"pipe\"];\n windowsHide: true;\n} {\n return {\n cwd,\n env: buildAgentEnvironment(authCredentials, sessionEnv, agentProcessEnv),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n windowsHide: true,\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst UNKNOWN_VERSION = \"0.0.0-unknown\";\nconst MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));\n\nlet cachedVersion: string | null = null;\n\nfunction parseVersion(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction readPackageVersion(packageJsonPath: string): string | null {\n try {\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n version?: unknown;\n };\n return parseVersion(parsed.version);\n } catch {\n return null;\n }\n}\n\nfunction resolveVersionFromAncestors(startDir: string): string | null {\n let current = startDir;\n while (true) {\n const packageVersion = readPackageVersion(path.join(current, \"package.json\"));\n if (packageVersion) {\n return packageVersion;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n\nexport function resolveAcpxVersion(params?: {\n env?: NodeJS.ProcessEnv;\n packageJsonPath?: string;\n}): string {\n const envVersion = resolvePackageEnvVersion(params?.env ?? process.env);\n if (envVersion) {\n return envVersion;\n }\n\n if (params?.packageJsonPath) {\n return readPackageVersion(params.packageJsonPath) ?? UNKNOWN_VERSION;\n }\n\n return resolveVersionFromAncestors(MODULE_DIR) ?? UNKNOWN_VERSION;\n}\n\nfunction resolvePackageEnvVersion(env: NodeJS.ProcessEnv): string | null {\n const envPackageName = parseVersion(env.npm_package_name);\n const envVersion = parseVersion(env.npm_package_version);\n return envPackageName === \"acpx\" ? envVersion : null;\n}\n\nexport function getAcpxVersion(): string {\n if (cachedVersion) {\n return cachedVersion;\n }\n cachedVersion = resolveAcpxVersion();\n return cachedVersion;\n}\n","import type { ClientCapabilities } from \"@agentclientprotocol/sdk\";\nimport type { AcpElicitationMode } from \"../types.js\";\nimport { getAcpxVersion } from \"../version.js\";\n\nconst DEVIN_COMPATIBILITY_CLIENT_CAPABILITIES_META = Object.freeze({\n \"cognition.ai/requestDiagnostics\": true,\n});\nconst DEVIN_COMPATIBILITY_CLIENT_NAME = \"windsurf\";\n// This is the embedded Windsurf IDE version bundled with Devin Desktop 3.1.7, the first locally verified version that passes Devin's server-side ACP precondition.\nconst DEFAULT_DEVIN_COMPATIBILITY_CLIENT_VERSION = \"1.110.1\";\n\nexport function resolveClientInfo(devinAcp: boolean): { name: string; version: string } {\n if (!devinAcp) {\n return {\n name: \"acpx\",\n version: getAcpxVersion(),\n };\n }\n\n return {\n name: DEVIN_COMPATIBILITY_CLIENT_NAME,\n version: process.env.ACPX_DEVIN_WINDSURF_VERSION ?? DEFAULT_DEVIN_COMPATIBILITY_CLIENT_VERSION,\n };\n}\n\nexport function resolveClientCapabilities(params: {\n devinAcp: boolean;\n fs: boolean;\n terminal: boolean;\n elicitationModes: readonly AcpElicitationMode[];\n}): ClientCapabilities {\n const baseCapabilities: ClientCapabilities = {\n fs: {\n readTextFile: params.fs,\n writeTextFile: params.fs,\n },\n terminal: params.terminal,\n ...(params.elicitationModes.length > 0\n ? {\n elicitation: {\n ...(params.elicitationModes.includes(\"form\") ? { form: {} } : {}),\n ...(params.elicitationModes.includes(\"url\") ? { url: {} } : {}),\n },\n }\n : {}),\n };\n\n if (!params.devinAcp) {\n return baseCapabilities;\n }\n\n return {\n ...baseCapabilities,\n _meta: DEVIN_COMPATIBILITY_CLIENT_CAPABILITIES_META,\n };\n}\n","import { isClaudeAcpCommand, isCursorAcpCommand } from \"./agent-command.js\";\nimport { splitCommandLine } from \"./client-process.js\";\n\nexport type SessionModelState = {\n configId?: string;\n currentModelId: string;\n availableModels: Array<{\n modelId: string;\n name: string;\n }>;\n};\n\ntype AdvertisedModelIds = Pick<SessionModelState, \"availableModels\">;\n\ntype LegacySessionModelResponse = {\n models?: {\n currentModelId?: unknown;\n availableModels?: unknown;\n } | null;\n};\n\nexport const REQUESTED_MODEL_UNSUPPORTED_ERROR_CODE = \"ACP_MODEL_UNSUPPORTED\" as const;\n\nexport type RequestedModelUnsupportedErrorCode = typeof REQUESTED_MODEL_UNSUPPORTED_ERROR_CODE;\n\nexport const REQUESTED_MODEL_UNSUPPORTED_REASONS = [\n \"missing-capability\",\n \"unadvertised-model\",\n] as const;\n\nexport type RequestedModelUnsupportedReason = (typeof REQUESTED_MODEL_UNSUPPORTED_REASONS)[number];\n\nexport class RequestedModelUnsupportedError extends Error {\n readonly code = REQUESTED_MODEL_UNSUPPORTED_ERROR_CODE;\n readonly reason: RequestedModelUnsupportedReason;\n\n constructor(message: string, reason: RequestedModelUnsupportedReason) {\n super(message);\n this.name = \"RequestedModelUnsupportedError\";\n this.reason = reason;\n }\n}\n\nfunction isRequestedModelUnsupportedReason(\n value: unknown,\n): value is RequestedModelUnsupportedReason {\n return (\n typeof value === \"string\" &&\n REQUESTED_MODEL_UNSUPPORTED_REASONS.includes(value as RequestedModelUnsupportedReason)\n );\n}\n\nexport function isRequestedModelUnsupportedError(\n value: unknown,\n): value is RequestedModelUnsupportedError {\n if (value instanceof RequestedModelUnsupportedError) {\n return true;\n }\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const candidate = value as { code?: unknown; name?: unknown; reason?: unknown };\n return (\n candidate.name === \"RequestedModelUnsupportedError\" &&\n candidate.code === REQUESTED_MODEL_UNSUPPORTED_ERROR_CODE &&\n isRequestedModelUnsupportedReason(candidate.reason)\n );\n}\n\nexport function supportsLegacyClaudeCodeModelMetadata(agentCommand: string | undefined): boolean {\n if (!agentCommand) {\n return false;\n }\n const { command, args } = splitCommandLine(agentCommand);\n return isClaudeAcpCommand(command, args);\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\ntype AvailableModel = SessionModelState[\"availableModels\"][number];\n\nfunction parseAvailableModel(value: unknown): AvailableModel | undefined {\n const option = asRecord(value);\n if (!option || typeof option.value !== \"string\" || typeof option.name !== \"string\") {\n return undefined;\n }\n return { modelId: option.value, name: option.name };\n}\n\nfunction parseAvailableModelGroup(value: unknown): AvailableModel[] | undefined {\n const group = asRecord(value);\n if (\n !group ||\n typeof group.group !== \"string\" ||\n typeof group.name !== \"string\" ||\n !Array.isArray(group.options)\n ) {\n return undefined;\n }\n const models = group.options.map((option) => parseAvailableModel(option));\n return models.every((model): model is AvailableModel => model !== undefined) ? models : undefined;\n}\n\nfunction parseAvailableModels(value: unknown): AvailableModel[] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n const directModels = value.map((option) => parseAvailableModel(option));\n if (directModels.every((model): model is AvailableModel => model !== undefined)) {\n return directModels;\n }\n const groupedModels = value.map((group) => parseAvailableModelGroup(group));\n return groupedModels.every((models): models is AvailableModel[] => models !== undefined)\n ? groupedModels.flat()\n : undefined;\n}\n\nfunction isModelSelectOption(option: Record<string, unknown>): boolean {\n return option.type === \"select\" && (option.category === \"model\" || option.id === \"model\");\n}\n\nfunction parseModelConfigOption(option: Record<string, unknown>): SessionModelState | undefined {\n if (\n !isModelSelectOption(option) ||\n typeof option.id !== \"string\" ||\n typeof option.currentValue !== \"string\"\n ) {\n return undefined;\n }\n const availableModels = parseAvailableModels(option.options);\n return availableModels\n ? {\n configId: option.id,\n currentModelId: option.currentValue,\n availableModels,\n }\n : undefined;\n}\n\nfunction modelConfigPriority(option: Record<string, unknown>): number {\n if (option.category !== \"model\") {\n return 0;\n }\n return option.id === \"model\" ? 2 : 1;\n}\n\nexport function modelStateFromConfigOptions(configOptions: unknown): SessionModelState | undefined {\n if (!Array.isArray(configOptions)) {\n return undefined;\n }\n\n let selected: SessionModelState | undefined;\n let selectedPriority = -1;\n for (const value of configOptions) {\n const option = asRecord(value);\n if (!option) {\n continue;\n }\n const models = parseModelConfigOption(option);\n if (!models) {\n continue;\n }\n const priority = modelConfigPriority(option);\n if (priority > selectedPriority) {\n selected = models;\n selectedPriority = priority;\n }\n }\n return selected;\n}\n\nexport function modelStateFromLegacyResponse(response: unknown): SessionModelState | undefined {\n if (!response || typeof response !== \"object\") {\n return undefined;\n }\n const models = (response as LegacySessionModelResponse).models;\n if (\n !models ||\n typeof models.currentModelId !== \"string\" ||\n !Array.isArray(models.availableModels)\n ) {\n return undefined;\n }\n\n const availableModels = models.availableModels.flatMap((entry) => {\n if (!entry || typeof entry !== \"object\") {\n return [];\n }\n const candidate = entry as { modelId?: unknown; name?: unknown };\n return typeof candidate.modelId === \"string\" && typeof candidate.name === \"string\"\n ? [{ modelId: candidate.modelId, name: candidate.name }]\n : [];\n });\n return {\n currentModelId: models.currentModelId,\n availableModels,\n };\n}\n\nexport function modelStateFromSessionResponse(params: {\n configOptions: unknown;\n response: unknown;\n}): SessionModelState | undefined {\n return (\n modelStateFromConfigOptions(params.configOptions) ??\n modelStateFromLegacyResponse(params.response)\n );\n}\n\nexport function formatAvailableModelIds(models: SessionModelState | undefined): string {\n const ids =\n models?.availableModels\n .map((model) => model.modelId.trim())\n .filter((modelId) => modelId.length > 0) ?? [];\n return ids.length > 0 ? ids.join(\", \") : \"none advertised\";\n}\n\nexport function resolveRequestedModelId(params: {\n requestedModel: string;\n models: AdvertisedModelIds | undefined;\n agentCommand?: string;\n}): string {\n if (!params.models || !isCursorAcpCommandForModelAlias(params.agentCommand)) {\n return params.requestedModel;\n }\n\n if (params.models.availableModels.some((model) => model.modelId === params.requestedModel)) {\n return params.requestedModel;\n }\n\n const candidates = params.models.availableModels\n .map((model) => model.modelId)\n .filter((modelId) => modelId.startsWith(`${params.requestedModel}[`));\n return candidates.length === 1 ? candidates[0] : params.requestedModel;\n}\n\nfunction isCursorAcpCommandForModelAlias(agentCommand: string | undefined): boolean {\n if (!agentCommand) {\n return false;\n }\n const { command, args } = splitCommandLine(agentCommand);\n return isCursorAcpCommand(command, args);\n}\n\nexport function assertRequestedModelSupported(params: {\n requestedModel: string;\n models: SessionModelState | undefined;\n agentCommand?: string;\n context: \"apply\" | \"replay\";\n}): string | undefined {\n if (!params.models) {\n if (supportsLegacyClaudeCodeModelMetadata(params.agentCommand)) {\n return undefined;\n }\n const action = params.context === \"replay\" ? \"replay saved model\" : \"apply --model\";\n throw new RequestedModelUnsupportedError(\n `Cannot ${action} \"${params.requestedModel}\": the ACP agent did not advertise model support through a session config option or legacy models metadata, and the adapter does not support a startup model flag.`,\n \"missing-capability\",\n );\n }\n\n const advertised = new Set(params.models.availableModels.map((model) => model.modelId));\n if (!advertised.has(params.requestedModel)) {\n const resolvedModel = resolveRequestedModelId(params);\n if (resolvedModel !== params.requestedModel) {\n return `Cursor ACP advertised \"${resolvedModel}\" for requested model \"${params.requestedModel}\"; using the advertised id.`;\n }\n if (supportsLegacyClaudeCodeModelMetadata(params.agentCommand)) {\n return `requested model \"${params.requestedModel}\" was not in the Claude ACP advertised model list (${formatAvailableModelIds(params.models)}); forwarding it to Claude Code so the adapter can accept or reject it.`;\n }\n const action = params.context === \"replay\" ? \"replay saved model\" : \"apply --model\";\n throw new RequestedModelUnsupportedError(\n `Cannot ${action} \"${params.requestedModel}\": the ACP agent did not advertise that model. Available models: ${formatAvailableModelIds(params.models)}.`,\n \"unadvertised-model\",\n );\n }\n return undefined;\n}\n","import type { AnyMessage } from \"@agentclientprotocol/sdk\";\nimport { AcpxOperationalError } from \"../errors.js\";\nimport { shouldIgnoreNonJsonAgentOutputLine } from \"./agent-command.js\";\nimport { isAcpMessageObject } from \"./jsonrpc.js\";\n\nexport const DEFAULT_MAX_ACP_MESSAGE_BYTES = 64 * 1024 * 1024;\n\nexport class AcpMessageLimitError extends AcpxOperationalError {\n constructor(limit: number) {\n super(\n `ACP message exceeded ACPX_MAX_ACP_MESSAGE_BYTES (${limit} bytes). Increase the limit or set it to 0 for unlimited input.`,\n {\n outputCode: \"RUNTIME\",\n detailCode: \"ACP_MESSAGE_TOO_LARGE\",\n origin: \"acp\",\n retryable: false,\n },\n );\n }\n}\n\nexport function readMaxAcpMessageBytes(\n raw = process.env.ACPX_MAX_ACP_MESSAGE_BYTES,\n): number | undefined {\n const value = raw?.trim();\n if (!value) {\n return DEFAULT_MAX_ACP_MESSAGE_BYTES;\n }\n const bytes = Number(value);\n if (!/^\\d+$/.test(value) || !Number.isSafeInteger(bytes)) {\n throw new Error(\n \"ACPX_MAX_ACP_MESSAGE_BYTES must be a non-negative safe integer; zero is unlimited\",\n );\n }\n return bytes === 0 ? undefined : bytes;\n}\n\nfunction countLineBytes(chunk: Uint8Array, retained: number, limit: number): number {\n let start = 0;\n while (start < chunk.length) {\n const newline = chunk.indexOf(0x0a, start);\n const end = newline < 0 ? chunk.length : newline;\n retained += end - start;\n if (retained > limit) {\n throw new AcpMessageLimitError(limit);\n }\n if (newline < 0) {\n return retained;\n }\n retained = 0;\n start = end + 1;\n }\n return retained;\n}\n\nexport function parseAcpJsonMessageLine(line: string): AnyMessage | undefined {\n const message: unknown = JSON.parse(line);\n return isAcpMessageObject(message) ? message : undefined;\n}\n\nfunction enqueueNdJsonLine(\n agentCommand: string,\n line: string,\n controller: ReadableStreamDefaultController<AnyMessage>,\n): void {\n const trimmedLine = line.trim();\n if (!trimmedLine || shouldIgnoreNonJsonAgentOutputLine(agentCommand, trimmedLine)) {\n return;\n }\n try {\n const message = parseAcpJsonMessageLine(trimmedLine);\n if (message) {\n controller.enqueue(message);\n }\n } catch (err) {\n console.error(\"Failed to parse JSON message:\", trimmedLine, err);\n }\n}\n\nfunction enqueueNdJsonLines(\n agentCommand: string,\n lines: string[],\n controller: ReadableStreamDefaultController<AnyMessage>,\n): void {\n for (const line of lines) {\n enqueueNdJsonLine(agentCommand, line, controller);\n }\n}\n\nexport function createNdJsonMessageStream(\n agentCommand: string,\n output: WritableStream<Uint8Array>,\n input: ReadableStream<Uint8Array>,\n maxMessageBytes?: number,\n onReadError?: (error: Error) => void,\n): {\n readable: ReadableStream<AnyMessage>;\n writable: WritableStream<AnyMessage>;\n} {\n const textEncoder = new TextEncoder();\n const textDecoder = new TextDecoder();\n\n const readable = new ReadableStream<AnyMessage>({\n async start(controller) {\n let content = \"\";\n let retainedBytes = 0;\n const reader = input.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n break;\n }\n if (maxMessageBytes !== undefined) {\n retainedBytes = countLineBytes(value, retainedBytes, maxMessageBytes);\n }\n content += textDecoder.decode(value, { stream: true });\n const lines = content.split(\"\\n\");\n content = lines.pop() || \"\";\n enqueueNdJsonLines(agentCommand, lines, controller);\n }\n controller.close();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n controller.error(error);\n onReadError?.(error);\n } finally {\n reader.releaseLock();\n }\n },\n });\n\n const writable = new WritableStream<AnyMessage>({\n async write(message) {\n const content = JSON.stringify(message) + \"\\n\";\n const writer = output.getWriter();\n try {\n await writer.write(textEncoder.encode(content));\n } finally {\n writer.releaseLock();\n }\n },\n });\n\n return { readable, writable };\n}\n","import { methods, type AnyMessage, type JsonRpcId } from \"@agentclientprotocol/sdk\";\nimport type { AcpMessageDirection } from \"../types.js\";\nimport { isSessionUpdateNotification } from \"./jsonrpc.js\";\n\ntype MessageStream = {\n readable: ReadableStream<AnyMessage>;\n writable: WritableStream<AnyMessage>;\n};\n\ntype PromptOwner = { requestId: JsonRpcId; sessionId: string };\n\ntype ObservedStreamOptions<T> = {\n onMessage: (direction: AcpMessageDirection, message: AnyMessage) => void;\n suppressReplaySessionUpdates: () => boolean;\n bindPromptOwner: (owner: PromptOwner) => T | undefined;\n assertPromptActive: (active: T) => void;\n onPromptRequestWritten: (active: T, owner: PromptOwner) => void;\n};\n\nexport function observeAcpStream<T>(\n base: MessageStream,\n options: ObservedStreamOptions<T>,\n): MessageStream {\n const elicitationRequestIds = new Set<JsonRpcId>();\n const shouldSuppressInboundReplaySessionUpdate = (message: AnyMessage): boolean => {\n return options.suppressReplaySessionUpdates() && isSessionUpdateNotification(message);\n };\n const observeInbound = (message: AnyMessage): void => {\n const requestId = elicitationRequestId(message);\n if (requestId !== undefined) {\n elicitationRequestIds.add(requestId);\n return;\n }\n if (!shouldSuppressInboundReplaySessionUpdate(message)) {\n options.onMessage(\"inbound\", message);\n }\n };\n\n const readable = new ReadableStream<AnyMessage>({\n async start(controller) {\n const reader = base.readable.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n break;\n }\n if (!value) {\n continue;\n }\n observeInbound(value);\n if (isExtensionNotification(value)) {\n continue;\n }\n controller.enqueue(value);\n }\n } finally {\n reader.releaseLock();\n controller.close();\n }\n },\n });\n\n const writable = new WritableStream<AnyMessage>({\n async write(message) {\n const promptOwner = promptRequestOwner(message);\n const activePrompt = promptOwner ? options.bindPromptOwner(promptOwner) : undefined;\n const id = responseId(message);\n const sensitive = id !== undefined && elicitationRequestIds.delete(id);\n if (!sensitive) {\n options.onMessage(\"outbound\", message);\n }\n if (activePrompt) {\n options.assertPromptActive(activePrompt);\n }\n const writer = base.writable.getWriter();\n try {\n await writer.write(message);\n } finally {\n writer.releaseLock();\n }\n if (activePrompt && promptOwner) {\n options.onPromptRequestWritten(activePrompt, promptOwner);\n }\n },\n });\n\n return { readable, writable };\n}\n\nfunction isExtensionNotification(message: AnyMessage): boolean {\n if (!(\"method\" in message) || \"id\" in message || typeof message.method !== \"string\") {\n return false;\n }\n return (\n message.method !== methods.client.session.update &&\n message.method !== methods.client.elicitation.complete &&\n message.method !== methods.protocol.cancelRequest\n );\n}\n\nfunction elicitationRequestId(message: AnyMessage): JsonRpcId | undefined {\n if (\n !(\"method\" in message) ||\n message.method !== methods.client.elicitation.create ||\n !(\"id\" in message)\n ) {\n return undefined;\n }\n return message.id;\n}\n\nfunction responseId(message: AnyMessage): JsonRpcId | undefined {\n if (!(\"id\" in message) || \"method\" in message) {\n return undefined;\n }\n return message.id;\n}\n\nfunction promptRequestOwner(\n message: AnyMessage,\n): { requestId: JsonRpcId; sessionId: string } | undefined {\n if (\n !(\"method\" in message) ||\n message.method !== methods.agent.session.prompt ||\n !(\"id\" in message)\n ) {\n return undefined;\n }\n const sessionId = (message.params as { sessionId?: unknown } | undefined)?.sessionId;\n return typeof sessionId === \"string\" ? { requestId: message.id, sessionId } : undefined;\n}\n","import type { ChildProcess } from \"node:child_process\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport {\n isChildProcessRunning,\n PROCESS_HELPER_TIMEOUT_MS,\n runTimedExecFile,\n} from \"./client-process.js\";\n\ntype ProcessIdentity = { pid: number; parentPid: number; birth: string };\n\nfunction parseProcessTable(output: string): Map<number, ProcessIdentity> {\n const table = new Map<number, ProcessIdentity>();\n for (const line of output.split(\"\\n\")) {\n const match = /^\\s*(\\d+)\\s+(\\d+)\\s+(\\S+)\\s+(.+?)\\s*$/.exec(line);\n if (match && !match[3].startsWith(\"Z\")) {\n const pid = Number(match[1]);\n if (Number.isSafeInteger(pid) && pid > 1 && pid !== process.pid) {\n table.set(pid, { pid, parentPid: Number(match[2]), birth: match[4] });\n }\n }\n }\n return table;\n}\n\nfunction includeDescendants(table: Map<number, ProcessIdentity>, owned: Set<number>): void {\n let expanded: boolean;\n do {\n expanded = false;\n for (const identity of table.values()) {\n if (owned.has(identity.parentPid) && !owned.has(identity.pid)) {\n owned.add(identity.pid);\n expanded = true;\n }\n }\n } while (expanded);\n}\n\n/** Best-effort POSIX cleanup for descendants witnessed during this child launch. */\nexport class ProcessDescendants {\n private identities = new Map<number, ProcessIdentity>();\n private pending: Promise<boolean> | undefined;\n private retired = false;\n\n constructor(private readonly child: ChildProcess) {}\n\n capture(timeoutMs = PROCESS_HELPER_TIMEOUT_MS): Promise<boolean> {\n if (this.retired || process.platform === \"win32\") {\n return Promise.resolve(true);\n }\n this.pending ??= this.readSnapshot(timeoutMs).finally(() => {\n this.pending = undefined;\n });\n return this.pending;\n }\n\n private async readSnapshot(timeoutMs: number): Promise<boolean> {\n try {\n const output = await runTimedExecFile(\"ps\", [\"-eo\", \"pid=,ppid=,stat=,lstart=\"], {\n timeoutMs,\n });\n if (!this.retired) {\n this.refresh(parseProcessTable(output));\n }\n return true;\n } catch {\n return false;\n }\n }\n\n private refresh(table: Map<number, ProcessIdentity>): void {\n const owned = new Set<number>();\n for (const [pid, identity] of this.identities) {\n if (table.get(pid)?.birth === identity.birth) {\n owned.add(pid);\n }\n }\n const root = this.child.pid;\n if (root && isChildProcessRunning(this.child)) {\n owned.add(root);\n }\n includeDescendants(table, owned);\n owned.delete(root ?? 0);\n this.identities = new Map([...table].filter(([pid]) => owned.has(pid)));\n }\n\n async signal(signal: NodeJS.Signals, timeoutMs: number): Promise<void> {\n if (!(await this.capture(timeoutMs)) || this.retired) {\n return;\n }\n // Never signal a saved PID without a fresh matching birth identity.\n for (const pid of this.identities.keys()) {\n try {\n process.kill(pid, signal);\n } catch {\n this.identities.delete(pid);\n }\n }\n }\n\n async waitForExit(timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n do {\n if (!(await this.capture(Math.max(1, deadline - Date.now())))) {\n return false;\n }\n if (this.identities.size === 0) {\n return true;\n }\n await delay(Math.min(100, Math.max(0, deadline - Date.now())));\n } while (Date.now() < deadline);\n return false;\n }\n\n retire(): void {\n this.retired = true;\n this.identities.clear();\n }\n}\n","import { extractAcpError } from \"./error-shapes.js\";\n\nconst SESSION_CONTROL_UNSUPPORTED_ACP_CODES = new Set([-32601, -32602]);\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction isLikelySessionControlUnsupportedError(acp: {\n code: number;\n message: string;\n data?: unknown;\n}): boolean {\n if (SESSION_CONTROL_UNSUPPORTED_ACP_CODES.has(acp.code)) {\n return true;\n }\n\n if (acp.code !== -32603) {\n return false;\n }\n\n const details = asRecord(acp.data)?.details;\n return typeof details === \"string\" && details.toLowerCase().includes(\"invalid params\");\n}\n\nexport function formatSessionControlAcpSummary(acp: {\n code: number;\n message: string;\n data?: unknown;\n}): string {\n const details = asRecord(acp.data)?.details;\n if (typeof details === \"string\" && details.trim().length > 0) {\n return `${details.trim()} (ACP ${acp.code}, adapter reported \"${acp.message}\")`;\n }\n return `${acp.message} (ACP ${acp.code})`;\n}\n\nexport function maybeWrapSessionControlError(\n method: \"session/set_mode\" | \"session/set_model\" | \"session/set_config_option\",\n error: unknown,\n context?: string,\n): unknown {\n const acp = extractAcpError(error);\n if (!acp || !isLikelySessionControlUnsupportedError(acp)) {\n return error;\n }\n\n const acpSummary = formatSessionControlAcpSummary(acp);\n const contextSuffix = context ? ` ${context}` : \"\";\n const message =\n `Agent rejected ${method}${contextSuffix}: ${acpSummary}. ` +\n `The adapter may not implement ${method}, or the requested value is not supported.`;\n const wrapped = new Error(message, {\n cause: error instanceof Error ? error : undefined,\n }) as Error & {\n acp?: typeof acp;\n };\n wrapped.acp = acp;\n return wrapped;\n}\n","import { spawn, type ChildProcessByStdio } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport type {\n CreateTerminalRequest,\n CreateTerminalResponse,\n KillTerminalRequest,\n KillTerminalResponse,\n ReleaseTerminalRequest,\n ReleaseTerminalResponse,\n TerminalOutputRequest,\n TerminalOutputResponse,\n WaitForTerminalExitRequest,\n WaitForTerminalExitResponse,\n} from \"@agentclientprotocol/sdk\";\nimport { PermissionDeniedError, PermissionPromptUnavailableError } from \"../errors.js\";\nimport { promptForPermission } from \"../permission-prompt.js\";\nimport {\n buildSpawnCommandOptions,\n buildTerminalShellSpawnCommand,\n buildTerminalSpawnCommand,\n type TerminalSpawnCommand,\n} from \"../spawn-command-options.js\";\nimport type { ClientOperation, NonInteractivePermissionPolicy, PermissionMode } from \"../types.js\";\nimport { PROCESS_HELPER_TIMEOUT_MS, runTimedExecFile, waitForSpawn } from \"./client-process.js\";\n\nconst DEFAULT_TERMINAL_OUTPUT_LIMIT_BYTES = 64 * 1024;\nconst DEFAULT_KILL_GRACE_MS = 1_500;\n\ntype ManagedTerminal = {\n process: ChildProcessByStdio<null, Readable, Readable>;\n killProcessGroup: boolean;\n descendantPids: Set<number>;\n processGroupSnapshotPromise?: Promise<void>;\n processHelperTimeoutMs: number;\n output: Buffer;\n truncated: boolean;\n outputByteLimit: number;\n exitCode: number | null | undefined;\n signal: NodeJS.Signals | null | undefined;\n exitPromise: Promise<WaitForTerminalExitResponse>;\n resolveExit: (response: WaitForTerminalExitResponse) => void;\n};\n\nexport type TerminalManagerOptions = {\n cwd: string;\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n onOperation?: (operation: ClientOperation) => void;\n confirmExecute?: (commandLine: string) => Promise<boolean>;\n killGraceMs?: number;\n processHelperTimeoutMs?: number;\n};\n\ntype TerminalSpawnOptions = {\n cwd: string;\n env: NodeJS.ProcessEnv | undefined;\n stdio: [\"ignore\", \"pipe\", \"pipe\"];\n detached?: boolean;\n shell?: true;\n windowsHide: true;\n};\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction toCommandLine(command: string, args: string[] | undefined): string {\n const renderedArgs = (args ?? []).map((arg) => JSON.stringify(arg)).join(\" \");\n return renderedArgs.length > 0 ? `${command} ${renderedArgs}` : command;\n}\n\nfunction toEnvObject(env: CreateTerminalRequest[\"env\"]): NodeJS.ProcessEnv | undefined {\n if (!env || env.length === 0) {\n return undefined;\n }\n\n const merged: NodeJS.ProcessEnv = { ...process.env };\n for (const entry of env) {\n merged[entry.name] = entry.value;\n }\n return merged;\n}\n\nexport function buildTerminalSpawnOptions(\n command: string,\n cwd: string,\n env: CreateTerminalRequest[\"env\"],\n platform: NodeJS.Platform = process.platform,\n): TerminalSpawnOptions {\n const resolvedEnv = toEnvObject(env);\n const options: TerminalSpawnOptions = {\n cwd,\n env: resolvedEnv,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n };\n return buildSpawnCommandOptions(\n command,\n options,\n platform,\n resolvedEnv ?? process.env,\n ) as TerminalSpawnOptions;\n}\n\nfunction readTerminalOutputCeiling(): number | undefined {\n const raw = process.env.ACPX_TERMINAL_MAX_OUTPUT_BYTES?.trim();\n if (!raw) {\n return undefined;\n }\n const bytes = Number(raw);\n if (!/^\\d+$/.test(raw) || !Number.isSafeInteger(bytes)) {\n throw new Error(\n \"ACPX_TERMINAL_MAX_OUTPUT_BYTES must be a non-negative safe integer; zero disables the host ceiling\",\n );\n }\n return bytes === 0 ? undefined : bytes;\n}\n\nfunction trimToUtf8Boundary(buffer: Buffer, limit: number): Buffer {\n if (limit <= 0) {\n return Buffer.alloc(0);\n }\n if (buffer.length <= limit) {\n return buffer;\n }\n\n let start = buffer.length - limit;\n while (start < buffer.length && (buffer[start] & 0b1100_0000) === 0b1000_0000) {\n start += 1;\n }\n\n if (start >= buffer.length) {\n start = buffer.length - limit;\n }\n return buffer.subarray(start);\n}\n\nasync function defaultConfirmExecute(commandLine: string): Promise<boolean> {\n return await promptForPermission({\n prompt: `\\n[permission] Allow terminal command \"${commandLine}\"? (y/N) `,\n });\n}\n\nfunction canPromptForPermission(): boolean {\n return process.stdin.isTTY && process.stderr.isTTY;\n}\n\nfunction waitMs(ms: number): Promise<void> {\n return new Promise<void>((resolve) => {\n setTimeout(resolve, Math.max(0, ms));\n });\n}\n\nfunction onStreamError(): void {\n // Child pipe failures must not terminate the ACP host; process exit owns status.\n}\n\nexport class TerminalManager {\n private readonly cwd: string;\n private permissionMode: PermissionMode;\n private nonInteractivePermissions: NonInteractivePermissionPolicy;\n private readonly onOperation?: (operation: ClientOperation) => void;\n private readonly usesDefaultConfirmExecute: boolean;\n private readonly confirmExecute: (commandLine: string) => Promise<boolean>;\n private readonly killGraceMs: number;\n private readonly processHelperTimeoutMs: number;\n private readonly outputCeilingBytes: number | undefined;\n private readonly terminals = new Map<string, ManagedTerminal>();\n\n constructor(options: TerminalManagerOptions) {\n this.outputCeilingBytes = readTerminalOutputCeiling();\n this.cwd = options.cwd;\n this.permissionMode = options.permissionMode;\n this.nonInteractivePermissions = options.nonInteractivePermissions ?? \"deny\";\n this.onOperation = options.onOperation;\n this.usesDefaultConfirmExecute = options.confirmExecute == null;\n this.confirmExecute = options.confirmExecute ?? defaultConfirmExecute;\n this.killGraceMs = Math.max(0, Math.round(options.killGraceMs ?? DEFAULT_KILL_GRACE_MS));\n this.processHelperTimeoutMs = Math.max(\n 1,\n Math.round(options.processHelperTimeoutMs ?? PROCESS_HELPER_TIMEOUT_MS),\n );\n }\n\n updatePermissionPolicy(\n permissionMode: PermissionMode,\n nonInteractivePermissions?: NonInteractivePermissionPolicy,\n ): void {\n this.permissionMode = permissionMode;\n this.nonInteractivePermissions = nonInteractivePermissions ?? \"deny\";\n }\n\n async createTerminal(params: CreateTerminalRequest): Promise<CreateTerminalResponse> {\n const commandLine = toCommandLine(params.command, params.args);\n const summary = `terminal/create: ${commandLine}`;\n\n this.emitOperation({\n method: \"terminal/create\",\n status: \"running\",\n summary,\n timestamp: nowIso(),\n });\n\n try {\n if (!(await this.isExecuteApproved(commandLine))) {\n throw new PermissionDeniedError(\"Permission denied for terminal/create\");\n }\n\n const requestedLimit = Math.max(\n 0,\n Math.round(params.outputByteLimit ?? DEFAULT_TERMINAL_OUTPUT_LIMIT_BYTES),\n );\n const outputByteLimit = Math.min(\n requestedLimit,\n this.outputCeilingBytes ?? Number.POSITIVE_INFINITY,\n );\n const { proc, spawnCommand } = await spawnTerminalProcess(params, this.cwd);\n\n let resolveExit: (response: WaitForTerminalExitResponse) => void = () => {};\n const exitPromise = new Promise<WaitForTerminalExitResponse>((resolve) => {\n resolveExit = resolve;\n });\n\n const terminal: ManagedTerminal = {\n process: proc,\n killProcessGroup: spawnCommand.killProcessGroup,\n descendantPids: new Set(),\n processHelperTimeoutMs: this.processHelperTimeoutMs,\n output: Buffer.alloc(0),\n truncated: false,\n outputByteLimit,\n exitCode: undefined,\n signal: undefined,\n exitPromise,\n resolveExit,\n };\n\n const appendOutput = (chunk: Buffer | string): void => {\n const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n if (bytes.length === 0) {\n return;\n }\n\n terminal.output = Buffer.concat([terminal.output, bytes]);\n if (terminal.output.length > terminal.outputByteLimit) {\n terminal.output = trimToUtf8Boundary(terminal.output, terminal.outputByteLimit);\n terminal.truncated = true;\n }\n };\n\n proc.stdout.on(\"data\", appendOutput);\n proc.stderr.on(\"data\", appendOutput);\n proc.stdout.on(\"error\", onStreamError);\n proc.stderr.on(\"error\", onStreamError);\n proc.once(\"exit\", (exitCode, signal) => {\n terminal.exitCode = exitCode;\n terminal.signal = signal;\n terminal.processGroupSnapshotPromise = rememberProcessGroupPids(terminal);\n void (async () => {\n await terminal.processGroupSnapshotPromise;\n terminal.resolveExit({\n exitCode: exitCode ?? null,\n signal: signal ?? null,\n });\n })();\n });\n\n const terminalId = randomUUID();\n this.terminals.set(terminalId, terminal);\n\n this.emitOperation({\n method: \"terminal/create\",\n status: \"completed\",\n summary,\n details: `terminalId=${terminalId}`,\n timestamp: nowIso(),\n });\n return { terminalId };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.emitOperation({\n method: \"terminal/create\",\n status: \"failed\",\n summary,\n details: message,\n timestamp: nowIso(),\n });\n throw error;\n }\n }\n\n async terminalOutput(params: TerminalOutputRequest): Promise<TerminalOutputResponse> {\n const terminal = this.getTerminal(params.terminalId);\n if (!terminal) {\n throw new Error(`Unknown terminal: ${params.terminalId}`);\n }\n\n const hasExitStatus = terminal.exitCode !== undefined || terminal.signal !== undefined;\n\n this.emitOperation({\n method: \"terminal/output\",\n status: \"completed\",\n summary: `terminal/output: ${params.terminalId}`,\n timestamp: nowIso(),\n });\n\n return {\n output: terminal.output.toString(\"utf8\"),\n truncated: terminal.truncated,\n exitStatus: hasExitStatus\n ? {\n exitCode: terminal.exitCode ?? null,\n signal: terminal.signal ?? null,\n }\n : undefined,\n };\n }\n\n async waitForTerminalExit(\n params: WaitForTerminalExitRequest,\n ): Promise<WaitForTerminalExitResponse> {\n const terminal = this.getTerminal(params.terminalId);\n if (!terminal) {\n throw new Error(`Unknown terminal: ${params.terminalId}`);\n }\n\n const response = await terminal.exitPromise;\n this.emitOperation({\n method: \"terminal/wait_for_exit\",\n status: \"completed\",\n summary: `terminal/wait_for_exit: ${params.terminalId}`,\n details: `exitCode=${response.exitCode ?? \"null\"}, signal=${response.signal ?? \"null\"}`,\n timestamp: nowIso(),\n });\n return response;\n }\n\n async killTerminal(params: KillTerminalRequest): Promise<KillTerminalResponse> {\n const terminal = this.getTerminal(params.terminalId);\n if (!terminal) {\n throw new Error(`Unknown terminal: ${params.terminalId}`);\n }\n\n const summary = `terminal/kill: ${params.terminalId}`;\n this.emitOperation({\n method: \"terminal/kill\",\n status: \"running\",\n summary,\n timestamp: nowIso(),\n });\n\n try {\n await this.killProcess(terminal);\n this.emitOperation({\n method: \"terminal/kill\",\n status: \"completed\",\n summary,\n timestamp: nowIso(),\n });\n return {};\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.emitOperation({\n method: \"terminal/kill\",\n status: \"failed\",\n summary,\n details: message,\n timestamp: nowIso(),\n });\n throw error;\n }\n }\n\n async releaseTerminal(params: ReleaseTerminalRequest): Promise<ReleaseTerminalResponse> {\n const summary = `terminal/release: ${params.terminalId}`;\n this.emitOperation({\n method: \"terminal/release\",\n status: \"running\",\n summary,\n timestamp: nowIso(),\n });\n\n const terminal = this.getTerminal(params.terminalId);\n if (!terminal) {\n this.emitOperation({\n method: \"terminal/release\",\n status: \"completed\",\n summary,\n details: \"already released\",\n timestamp: nowIso(),\n });\n return {};\n }\n\n try {\n await this.killProcess(terminal);\n await terminal.exitPromise.catch(() => {\n // ignore best-effort wait failures\n });\n terminal.output = Buffer.alloc(0);\n this.terminals.delete(params.terminalId);\n\n this.emitOperation({\n method: \"terminal/release\",\n status: \"completed\",\n summary,\n timestamp: nowIso(),\n });\n return {};\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.emitOperation({\n method: \"terminal/release\",\n status: \"failed\",\n summary,\n details: message,\n timestamp: nowIso(),\n });\n throw error;\n }\n }\n\n async shutdown(): Promise<void> {\n for (const terminalId of Array.from(this.terminals.keys())) {\n await this.releaseTerminal({ terminalId, sessionId: \"shutdown\" });\n }\n }\n\n private getTerminal(terminalId: string): ManagedTerminal | undefined {\n return this.terminals.get(terminalId);\n }\n\n private emitOperation(operation: ClientOperation): void {\n this.onOperation?.(operation);\n }\n\n private async isExecuteApproved(commandLine: string): Promise<boolean> {\n if (this.permissionMode === \"approve-all\") {\n return true;\n }\n if (this.permissionMode === \"deny-all\") {\n return false;\n }\n if (\n this.usesDefaultConfirmExecute &&\n this.nonInteractivePermissions === \"fail\" &&\n !canPromptForPermission()\n ) {\n throw new PermissionPromptUnavailableError();\n }\n return await this.confirmExecute(commandLine);\n }\n\n private isRunning(terminal: ManagedTerminal): boolean {\n return terminal.exitCode === undefined && terminal.signal === undefined;\n }\n\n private async killProcess(terminal: ManagedTerminal): Promise<void> {\n if (!this.isRunning(terminal) && !terminal.killProcessGroup) {\n return;\n }\n\n try {\n await this.signalProcess(terminal, \"SIGTERM\");\n } catch {\n return;\n }\n\n const exitedAfterTerm = await this.waitForCleanupAfterSignal(terminal);\n if (exitedAfterTerm && !terminal.killProcessGroup) {\n return;\n }\n\n try {\n await this.signalProcess(terminal, \"SIGKILL\");\n } catch {\n return;\n }\n\n await this.waitForFinalCleanup(terminal);\n }\n\n private async signalProcess(terminal: ManagedTerminal, signal: NodeJS.Signals): Promise<void> {\n const pid = terminal.process.pid;\n if (terminal.killProcessGroup && pid && process.platform === \"win32\") {\n await this.signalWindowsProcessGroup(terminal, pid, signal);\n return;\n }\n if (terminal.killProcessGroup && pid) {\n await this.signalPosixProcessGroup(terminal, pid, signal);\n return;\n }\n terminal.process.kill(signal);\n }\n\n private async signalWindowsProcessGroup(\n terminal: ManagedTerminal,\n pid: number,\n signal: NodeJS.Signals,\n ): Promise<void> {\n await this.captureDescendantPids(terminal, pid);\n if (this.isRunning(terminal)) {\n await killWindowsProcessTree(pid, signal, terminal.processHelperTimeoutMs);\n return;\n }\n for (const descendantPid of terminal.descendantPids) {\n await killWindowsProcessTree(descendantPid, signal, terminal.processHelperTimeoutMs);\n }\n }\n\n private async signalPosixProcessGroup(\n terminal: ManagedTerminal,\n pid: number,\n signal: NodeJS.Signals,\n ): Promise<void> {\n await this.captureDescendantPids(terminal, pid);\n if (hasLiveProcessGroup(pid)) {\n sendSignal(-pid, signal);\n return;\n }\n for (const descendantPid of terminal.descendantPids) {\n sendSignal(descendantPid, signal);\n }\n }\n\n private async captureDescendantPids(terminal: ManagedTerminal, pid: number): Promise<void> {\n if (!this.isRunning(terminal)) {\n await terminal.processGroupSnapshotPromise?.catch(() => {\n // ignore best-effort process group snapshot failures\n });\n }\n for (const descendantPid of await listDescendantPids(pid, terminal.processHelperTimeoutMs)) {\n terminal.descendantPids.add(descendantPid);\n }\n }\n\n private async waitForFinalCleanup(terminal: ManagedTerminal): Promise<void> {\n const cleaned = await this.waitForCleanupAfterSignal(terminal);\n if (!cleaned && process.platform === \"win32\") {\n throw new Error(\"Terminal process cleanup did not finish after SIGKILL\");\n }\n }\n\n private async waitForCleanupAfterSignal(terminal: ManagedTerminal): Promise<boolean> {\n return await Promise.race([\n this.waitForTerminalAndTrackedDescendants(terminal).then(() => true),\n waitMs(this.killGraceMs).then(() => false),\n ]);\n }\n\n private async waitForTerminalAndTrackedDescendants(terminal: ManagedTerminal): Promise<void> {\n await terminal.exitPromise;\n while (hasLiveTerminalProcessGroup(terminal)) {\n await waitMs(25);\n }\n while (hasLivePid(terminal.descendantPids)) {\n await waitMs(25);\n }\n }\n}\n\nasync function spawnTerminalProcess(\n params: CreateTerminalRequest,\n defaultCwd: string,\n): Promise<{\n proc: ChildProcessByStdio<null, Readable, Readable>;\n spawnCommand: TerminalSpawnCommand;\n}> {\n const directCommand = buildTerminalSpawnCommand(params.command, params.args);\n try {\n return {\n proc: await spawnAndWait(directCommand, params, defaultCwd),\n spawnCommand: directCommand,\n };\n } catch (error) {\n const fallbackCommand =\n params.args === undefined && isNotFoundSpawnError(error)\n ? buildTerminalFallbackSpawnCommand(params.command, params.cwd ?? defaultCwd)\n : undefined;\n if (!fallbackCommand) {\n throw error;\n }\n return {\n proc: await spawnAndWait(fallbackCommand, params, defaultCwd),\n spawnCommand: fallbackCommand,\n };\n }\n}\n\nasync function spawnAndWait(\n spawnCommand: TerminalSpawnCommand,\n params: CreateTerminalRequest,\n defaultCwd: string,\n): Promise<ChildProcessByStdio<null, Readable, Readable>> {\n const spawnOptions = buildTerminalSpawnOptions(\n spawnCommand.command,\n params.cwd ?? defaultCwd,\n params.env,\n );\n if (spawnCommand.killProcessGroup) {\n spawnOptions.detached = true;\n }\n // ACP terminal/create is a permission-gated command-execution surface.\n // CodeQL otherwise treats the intentional shell fallback as accidental injection.\n // codeql[js/shell-command-injection-from-environment]\n // lgtm[js/shell-command-injection-from-environment]\n const proc = spawn(spawnCommand.command, spawnCommand.args, spawnOptions);\n await waitForSpawn(proc);\n return proc;\n}\n\nfunction isNotFoundSpawnError(error: unknown): boolean {\n return error instanceof Error && (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\nfunction buildTerminalFallbackSpawnCommand(\n command: string,\n cwd: string,\n platform: NodeJS.Platform = process.platform,\n): TerminalSpawnCommand | undefined {\n if (commandPathExists(command, cwd)) {\n return undefined;\n }\n\n if (platform === \"win32\") {\n return hasWindowsShellSyntax(command) || /\\s/u.test(command)\n ? buildTerminalShellSpawnCommand(command, platform)\n : undefined;\n }\n\n if (hasShellSyntax(command) || /\\s/u.test(command)) {\n return buildTerminalShellSpawnCommand(command, platform);\n }\n\n return undefined;\n}\n\nfunction hasShellSyntax(command: string): boolean {\n return /[|&;<>()>$`*?[\\]{}'\"\\\\\\r\\n]/u.test(command);\n}\n\nfunction hasWindowsShellSyntax(command: string): boolean {\n return /[|&;<>()>$`*?[\\]{}'\"\\r\\n]/u.test(command);\n}\n\nfunction commandPathExists(command: string, cwd: string): boolean {\n if (!/[\\\\/]/u.test(command)) {\n return false;\n }\n const resolvedPath = path.isAbsolute(command) ? command : path.resolve(cwd, command);\n return fs.existsSync(resolvedPath);\n}\n\nasync function listDescendantPids(rootPid: number, timeoutMs: number): Promise<number[]> {\n let output: string;\n try {\n output = await runProcessListCommand(timeoutMs);\n } catch {\n return [];\n }\n\n const childrenByParent = new Map<number, number[]>();\n for (const line of output.split(\"\\n\")) {\n addProcessListLine(childrenByParent, line);\n }\n\n const descendants: number[] = [];\n const queue = [...(childrenByParent.get(rootPid) ?? [])];\n for (let index = 0; index < queue.length; index += 1) {\n const pid = queue[index];\n descendants.push(pid);\n queue.push(...(childrenByParent.get(pid) ?? []));\n }\n return descendants;\n}\n\nfunction addProcessListLine(childrenByParent: Map<number, number[]>, line: string): void {\n const parsed = parseProcessListLine(line);\n if (!parsed) {\n return;\n }\n\n const children = childrenByParent.get(parsed.parentPid);\n if (children) {\n children.push(parsed.pid);\n } else {\n childrenByParent.set(parsed.parentPid, [parsed.pid]);\n }\n}\n\nfunction parseProcessListLine(line: string): { pid: number; parentPid: number } | undefined {\n const match = line.trim().match(/^(\\d+)\\s+(\\d+)$/);\n if (!match) {\n return undefined;\n }\n\n const pid = Number(match[1]);\n const parentPid = Number(match[2]);\n if (!Number.isInteger(pid) || !Number.isInteger(parentPid) || pid <= 0 || parentPid <= 0) {\n return undefined;\n }\n return { pid, parentPid };\n}\n\nasync function runProcessListCommand(timeoutMs: number): Promise<string> {\n if (process.platform === \"win32\") {\n return await runWindowsProcessListCommand(timeoutMs);\n }\n\n return await runTimedExecFile(\"ps\", [\"-eo\", \"pid=,ppid=\"], { timeoutMs });\n}\n\nasync function rememberProcessGroupPids(terminal: ManagedTerminal): Promise<void> {\n const processGroupId = terminal.process.pid;\n if (!terminal.killProcessGroup || !processGroupId) {\n return;\n }\n\n if (process.platform === \"win32\") {\n for (const pid of await listDescendantPids(processGroupId, terminal.processHelperTimeoutMs)) {\n terminal.descendantPids.add(pid);\n }\n return;\n }\n\n for (const pid of await listProcessGroupPids(processGroupId, terminal.processHelperTimeoutMs)) {\n if (pid !== processGroupId) {\n terminal.descendantPids.add(pid);\n }\n }\n}\n\nasync function listProcessGroupPids(processGroupId: number, timeoutMs: number): Promise<number[]> {\n let output: string;\n try {\n output = await runProcessGroupListCommand(timeoutMs);\n } catch {\n return [];\n }\n\n const pids: number[] = [];\n for (const line of output.split(\"\\n\")) {\n const match = line.trim().match(/^(\\d+)\\s+(\\d+)$/);\n if (!match) {\n continue;\n }\n\n const pid = Number(match[1]);\n const pgid = Number(match[2]);\n if (Number.isInteger(pid) && Number.isInteger(pgid) && pid > 0 && pgid === processGroupId) {\n pids.push(pid);\n }\n }\n return pids;\n}\n\nasync function runProcessGroupListCommand(timeoutMs: number): Promise<string> {\n return await runTimedExecFile(\"ps\", [\"-eo\", \"pid=,pgid=\"], { timeoutMs });\n}\n\nasync function runWindowsProcessListCommand(timeoutMs: number): Promise<string> {\n const command = [\n \"Get-CimInstance Win32_Process |\",\n 'ForEach-Object { \"$($_.ProcessId) $($_.ParentProcessId)\" }',\n ].join(\" \");\n return await runTimedExecFile(\n \"powershell.exe\",\n [\"-NoProfile\", \"-NonInteractive\", \"-Command\", command],\n { timeoutMs, windowsHide: true },\n );\n}\n\nexport async function killWindowsProcessTree(\n pid: number,\n signal: NodeJS.Signals,\n timeoutMs: number = PROCESS_HELPER_TIMEOUT_MS,\n): Promise<void> {\n const args = [\"/pid\", String(pid), \"/t\"];\n if (signal === \"SIGKILL\") {\n args.push(\"/f\");\n }\n try {\n await runTimedExecFile(\"taskkill\", args, { timeoutMs, windowsHide: true });\n } catch {\n // Hung or missing taskkill must not block terminal/kill or terminal/release.\n }\n}\n\nfunction sendSignal(pid: number, signal: NodeJS.Signals): void {\n try {\n process.kill(pid, signal);\n } catch {\n // Process tree cleanup is best-effort because descendants can exit between ps and kill.\n }\n}\n\nfunction hasLiveProcessGroup(processGroupId: number): boolean {\n try {\n process.kill(-processGroupId, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction hasLiveTerminalProcessGroup(terminal: ManagedTerminal): boolean {\n const pid = terminal.process.pid;\n return Boolean(\n terminal.killProcessGroup && pid && process.platform !== \"win32\" && hasLiveProcessGroup(pid),\n );\n}\n\nfunction hasLivePid(pids: Set<number>): boolean {\n for (const pid of pids) {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n pids.delete(pid);\n }\n }\n return false;\n}\n","import { spawn, type ChildProcess, type ChildProcessByStdio } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { Readable, Writable } from \"node:stream\";\nimport { pathToFileURL } from \"node:url\";\nimport {\n PROTOCOL_VERSION,\n RequestError,\n client,\n methods,\n type AnyMessage,\n type ClientConnection,\n type ClientCapabilities,\n type AuthMethod,\n type CreateElicitationRequest,\n type CreateElicitationResponse,\n type CreateTerminalRequest,\n type CreateTerminalResponse,\n type InitializeRequest,\n type InitializeResponse,\n type JsonRpcId,\n type ListSessionsRequest,\n type ListSessionsResponse,\n type LoadSessionResponse,\n type NewSessionResponse,\n type PromptResponse,\n type ReadTextFileRequest,\n type ReadTextFileResponse,\n type ResumeSessionResponse,\n type RequestPermissionRequest,\n type RequestPermissionResponse,\n type SessionNotification,\n type SetSessionConfigOptionResponse,\n type WriteTextFileRequest,\n type WriteTextFileResponse,\n type SessionConfigOption,\n} from \"@agentclientprotocol/sdk\";\nimport { FsSafeError } from \"@openclaw/fs-safe/errors\";\nimport { resolveBuiltInAgentLaunch } from \"../agent-registry.js\";\nimport {\n assertControlAuthority,\n TimeoutError,\n withTimeout,\n type AcpControlAuthority,\n} from \"../async-control.js\";\nimport {\n AgentDisconnectedError,\n AgentSpawnError,\n AgentStartupError,\n AuthPolicyError,\n ClaudeAcpSessionCreateTimeoutError,\n GeminiAcpStartupTimeoutError,\n PermissionDeniedError,\n PermissionPromptUnavailableError,\n UnsupportedPromptContentError,\n} from \"../errors.js\";\nimport { FileSystemHandlers } from \"../filesystem.js\";\nimport {\n classifyPermissionDecision,\n decisionToResponse,\n inferToolKind,\n resolvePermissionRequestWithDetails,\n withPermissionMetadata,\n} from \"../permissions.js\";\nimport { getUnsupportedPromptContentMessage, textPrompt } from \"../prompt-content.js\";\nimport { buildAgentSpawnCommand, buildSpawnCommandOptions } from \"../spawn-command-options.js\";\nimport type {\n AcpClientOptions,\n AcpElicitationHandler,\n AcpPermissionHandler,\n AcpElicitationMode,\n AcpProcessLaunch,\n AcpProcessLaunchScope,\n AcpProcessStarted,\n NonInteractivePermissionPolicy,\n PermissionMode,\n PermissionStats,\n PromptInput,\n} from \"../types.js\";\nimport {\n buildClaudeAcpSessionCreateTimeoutMessage,\n buildClaudeCodeOptionsMeta,\n buildGeminiAcpStartupTimeoutMessage,\n buildQoderAcpCommandArgs,\n ensureCopilotAcpSupport,\n isClaudeAcpCommand,\n isCopilotAcpCommand,\n isDevinAcpCommand,\n isGeminiAcpCommand,\n isQoderAcpCommand,\n resolveAgentCloseAfterStdinEndMs,\n resolveClaudeAcpSessionCreateTimeoutMs,\n resolveClaudeCodeExecutable,\n resolveClaudeCodeSettingSources,\n resolveGeminiAcpStartupTimeoutMs,\n resolveGeminiCommandArgs,\n shouldIgnoreNonJsonAgentOutputLine,\n} from \"./agent-command.js\";\nimport { extractAgentSessionId } from \"./agent-session-id.js\";\nimport {\n buildAgentSpawnOptions,\n readEnvCredential,\n resolveConfiguredAuthCredential,\n} from \"./auth-env.js\";\nimport {\n asAbsoluteCwd,\n isoNow,\n isChildProcessRunning,\n requireAgentStdio,\n resolveAgentCommandParts,\n resolveAgentSessionCwd,\n waitForChildExit,\n waitForSpawn,\n} from \"./client-process.js\";\nimport { resolveClientCapabilities, resolveClientInfo } from \"./client-protocol.js\";\nimport { codexPermissionNotice, preferCodexPermissionRefusal } from \"./codex-compat.js\";\nimport { extractAcpError } from \"./error-shapes.js\";\nimport {\n modelStateFromConfigOptions,\n modelStateFromSessionResponse,\n RequestedModelUnsupportedError,\n resolveRequestedModelId,\n type SessionModelState,\n} from \"./model-support.js\";\nimport {\n AcpMessageLimitError,\n createNdJsonMessageStream,\n readMaxAcpMessageBytes,\n} from \"./ndjson-stream.js\";\nimport { observeAcpStream } from \"./observed-stream.js\";\nimport { ProcessDescendants } from \"./process-descendants.js\";\nimport {\n formatSessionControlAcpSummary,\n maybeWrapSessionControlError,\n} from \"./session-control-errors.js\";\nimport { TerminalManager } from \"./terminal-manager.js\";\n\nexport { buildSpawnCommandOptions };\nexport {\n buildAgentSpawnOptions,\n buildQoderAcpCommandArgs,\n resolveAgentCloseAfterStdinEndMs,\n resolveClaudeCodeSettingSources,\n shouldIgnoreNonJsonAgentOutputLine,\n};\nexport { parseAcpJsonMessageLine } from \"./ndjson-stream.js\";\n\nconst REPLAY_IDLE_MS = 80;\nconst REPLAY_DRAIN_TIMEOUT_MS = 5_000;\nconst DRAIN_POLL_INTERVAL_MS = 20;\nconst AGENT_CLOSE_TERM_GRACE_MS = 1_500;\nconst AGENT_CLOSE_KILL_GRACE_MS = 1_000;\nconst AGENT_CLEANUP_BUDGET_MS = 8_000;\nconst STARTUP_STDERR_MAX_CHARS = 8_192;\nconst ELICITATION_CANCEL_MESSAGES = {\n inactive: \"elicitation owner is no longer active\",\n unavailable: \"elicitation handler is unavailable\",\n unsupported: \"elicitation mode is not supported\",\n mismatchedSession: \"elicitation session is not active\",\n cancelled: \"elicitation request was cancelled\",\n requestScoped: \"request-scoped elicitation has no owner\",\n} as const;\n\nfunction normalizeElicitationModes(\n modes: readonly AcpElicitationMode[] | undefined,\n): AcpElicitationMode[] {\n return [...new Set((modes ?? []).filter((mode) => mode === \"form\" || mode === \"url\"))];\n}\n\nfunction cancelledElicitationResponse(message: string): CreateElicitationResponse {\n return { action: \"cancel\", _meta: { message } };\n}\n\nfunction isKnownElicitationResponse(response: unknown): response is CreateElicitationResponse {\n if (!response || typeof response !== \"object\") {\n return false;\n }\n const action = (response as { action?: unknown }).action;\n return action === \"accept\" || action === \"decline\" || action === \"cancel\";\n}\n\nfunction elicitationSessionId(request: CreateElicitationRequest): string | undefined {\n const value = (request as { sessionId?: unknown }).sessionId;\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction elicitationRequestScopeId(request: CreateElicitationRequest): JsonRpcId | undefined {\n const value = (request as { requestId?: unknown }).requestId;\n return value === null || typeof value === \"string\" || typeof value === \"number\"\n ? value\n : undefined;\n}\n\nasync function raceWithAbort<T>(signal: AbortSignal, pending: Promise<T>): Promise<T | undefined> {\n let onAbort!: () => void;\n const aborted = new Promise<undefined>((resolve) => {\n onAbort = () => resolve(undefined);\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n });\n try {\n return await Promise.race([pending, aborted]);\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n}\n\ntype LoadSessionOptions = {\n suppressReplayUpdates?: boolean;\n replayIdleMs?: number;\n replayDrainTimeoutMs?: number;\n};\n\nexport type SessionCreateResult = {\n sessionId: string;\n agentSessionId?: string;\n configOptions?: SessionConfigOption[];\n models?: SessionModelState;\n configOptionsPresent: boolean;\n legacyModelMetadataPresent: boolean;\n};\n\nexport type SessionLoadResult = {\n agentSessionId?: string;\n configOptions?: SessionConfigOption[];\n models?: SessionModelState;\n configOptionsPresent: boolean;\n legacyModelMetadataPresent: boolean;\n};\n\nexport type SessionResumeResult = SessionLoadResult;\n\ntype ReconnectedSessionResponse = LoadSessionResponse | ResumeSessionResponse;\n\nfunction hasResponseField(response: unknown, field: string): boolean {\n return !!response && typeof response === \"object\" && field in response;\n}\n\nfunction normalizeResponseConfigOptions(\n response: { configOptions?: SessionConfigOption[] | null } | undefined,\n): SessionConfigOption[] | undefined {\n if (!response || !(\"configOptions\" in response)) {\n return undefined;\n }\n return response.configOptions ?? [];\n}\n\nfunction toReconnectedSessionResult(\n response: ReconnectedSessionResponse | undefined,\n): SessionLoadResult {\n const configOptions = normalizeResponseConfigOptions(response);\n return {\n agentSessionId: extractAgentSessionId(response?._meta),\n configOptions,\n models: modelStateFromSessionResponse({ configOptions, response }),\n configOptionsPresent: hasResponseField(response, \"configOptions\"),\n legacyModelMetadataPresent: hasResponseField(response, \"models\"),\n };\n}\n\ntype AgentDisconnectReason = \"process_exit\" | \"process_close\" | \"pipe_close\" | \"connection_close\";\n\ntype PendingConnectionRequest = {\n settled: boolean;\n reject: (error: unknown) => void;\n};\n\ntype ActivePromptState = {\n sessionId: string;\n requestId?: JsonRpcId;\n promise?: Promise<PromptResponse>;\n cancelPromise?: Promise<void>;\n onRequestWritten?: () => Promise<void> | void;\n authority?: AcpControlAuthority;\n admissionFailure?: { error: unknown };\n elicitationHandler?: AcpElicitationHandler;\n permissionHandler?: AcpPermissionHandler;\n elicitationController: AbortController;\n};\n\ntype ElicitationOwner = {\n active: ActivePromptState;\n handler: AcpElicitationHandler;\n};\n\nfunction snapshotPermissionPolicy(\n policy: AcpClientOptions[\"permissionPolicy\"],\n): AcpClientOptions[\"permissionPolicy\"] {\n if (!policy) {\n return undefined;\n }\n return {\n ...(policy.autoApprove ? { autoApprove: [...policy.autoApprove] } : {}),\n ...(policy.autoDeny ? { autoDeny: [...policy.autoDeny] } : {}),\n ...(policy.escalate ? { escalate: [...policy.escalate] } : {}),\n ...(policy.defaultAction ? { defaultAction: policy.defaultAction } : {}),\n };\n}\n\nfunction snapshotProcessLaunchScope(\n scope: AcpProcessLaunchScope | undefined,\n): AcpProcessLaunchScope {\n if (!scope || scope.kind === \"client\") {\n return Object.freeze({ kind: \"client\" });\n }\n if (scope.kind === \"runtime-session\") {\n return Object.freeze({ kind: \"runtime-session\", sessionKey: scope.sessionKey });\n }\n return Object.freeze({ kind: \"runtime-probe\", agent: scope.agent });\n}\n\ntype AuthSelection = {\n methodId: string;\n credential?: string;\n source: \"env\" | \"config\" | \"agent\";\n};\n\ntype AgentLaunchPlan = {\n spawnCommand: string;\n args: string[];\n resolvedBuiltInLaunch: ReturnType<typeof resolveBuiltInAgentLaunch>;\n devinAcp: boolean;\n geminiAcp: boolean;\n copilotAcp: boolean;\n claudeAcp: boolean;\n spawnOptions: ReturnType<typeof buildAgentSpawnOptions>;\n};\n\ntype StartupFailureWatcher = {\n promise: Promise<never>;\n dispose: () => void;\n getError: () => AgentStartupError | undefined;\n};\n\ntype SessionUpdateSuppressionState = {\n suppressSessionUpdates: boolean;\n suppressReplaySessionUpdateMessages: boolean;\n};\n\ntype ModelControl = { kind: \"config_option\"; configId: string } | { kind: \"legacy_set_model\" };\ntype ModelControlOverride = Pick<SessionModelState, \"configId\"> &\n Partial<Pick<SessionModelState, \"availableModels\">>;\n\nexport type AgentExitInfo = {\n exitCode: number | null;\n signal: NodeJS.Signals | null;\n exitedAt: string;\n reason: AgentDisconnectReason;\n unexpectedDuringPrompt: boolean;\n};\n\nexport type AgentLifecycleSnapshot = {\n pid?: number;\n startedAt?: string;\n running: boolean;\n lastExit?: AgentExitInfo;\n};\n\ntype ConsoleErrorMethod = typeof console.error;\n\nfunction childProcessIsRunning(\n agent: ChildProcessByStdio<Writable, Readable, Readable> | undefined,\n): boolean {\n if (!agent) {\n return false;\n }\n return agent.exitCode == null && agent.signalCode == null && !agent.killed;\n}\n\nfunction cancelledPermissionResponse(): RequestPermissionResponse {\n return {\n outcome: {\n outcome: \"cancelled\",\n },\n };\n}\n\nfunction shouldSuppressSdkConsoleError(args: unknown[]): boolean {\n if (args.length === 0) {\n return false;\n }\n return typeof args[0] === \"string\" && args[0] === \"Error handling request\";\n}\n\nfunction installSdkConsoleErrorSuppression(): () => void {\n const originalConsoleError: ConsoleErrorMethod = console.error;\n console.error = (...args: unknown[]) => {\n if (shouldSuppressSdkConsoleError(args)) {\n return;\n }\n originalConsoleError(...args);\n };\n return () => {\n console.error = originalConsoleError;\n };\n}\n\nexport class AcpClient {\n private options: AcpClientOptions & { elicitationModes: readonly AcpElicitationMode[] };\n private connection?: ClientConnection;\n private agent?: ChildProcessByStdio<Writable, Readable, Readable>;\n private readonly agentDescendants = new WeakMap<ChildProcess, ProcessDescendants>();\n private readonly agentCleanups = new WeakMap<ChildProcess, Promise<void>>();\n private initResult?: InitializeResponse;\n private loadedSessionId?: string;\n private eventHandlers: Pick<\n AcpClientOptions,\n | \"onAcpMessage\"\n | \"onAcpOutputMessage\"\n | \"onSessionUpdate\"\n | \"onClientOperation\"\n | \"onPermissionEscalation\"\n >;\n private readonly permissionStats: PermissionStats = {\n requested: 0,\n approved: 0,\n denied: 0,\n cancelled: 0,\n };\n private readonly filesystem: FileSystemHandlers;\n private readonly terminalManager: TerminalManager;\n private sessionUpdateChain: Promise<void> = Promise.resolve();\n private observedSessionUpdates = 0;\n private processedSessionUpdates = 0;\n private suppressSessionUpdates = false;\n private suppressReplaySessionUpdateMessages = false;\n private activePrompt?: ActivePromptState;\n private readonly pendingPromptOwners: ActivePromptState[] = [];\n private readonly cancellingSessionIds = new Set<string>();\n private readonly permissionAbortControllers = new Map<string, AbortController>();\n private closing = false;\n // Bumped by close() so a start() still launching can tell it was abandoned.\n private closeEpoch = 0;\n private agentStartedAt?: string;\n private lastAgentExit?: AgentExitInfo;\n private lastKnownPid?: number;\n private readonly promptPermissionFailures = new Map<string, PermissionPromptUnavailableError>();\n private readonly pendingConnectionRequests = new Set<PendingConnectionRequest>();\n private readonly modelConfigIds = new Map<string, string>();\n private readonly legacyModelSessionIds = new Set<string>();\n\n constructor(options: AcpClientOptions) {\n this.options = {\n ...options,\n cwd: asAbsoluteCwd(options.cwd),\n agentProcessEnv: options.agentProcessEnv ? { ...options.agentProcessEnv } : undefined,\n authPolicy: options.authPolicy ?? \"skip\",\n permissionPolicy: snapshotPermissionPolicy(options.permissionPolicy),\n elicitationModes: normalizeElicitationModes(options.elicitationModes),\n };\n this.eventHandlers = {\n onAcpMessage: this.options.onAcpMessage,\n onAcpOutputMessage: this.options.onAcpOutputMessage,\n onSessionUpdate: this.options.onSessionUpdate,\n onClientOperation: this.options.onClientOperation,\n onPermissionEscalation: this.options.onPermissionEscalation,\n };\n\n this.filesystem = new FileSystemHandlers({\n cwd: this.options.cwd,\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n onOperation: (operation) => {\n this.eventHandlers.onClientOperation?.(operation);\n },\n });\n this.terminalManager = new TerminalManager({\n cwd: this.options.cwd,\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n onOperation: (operation) => {\n this.eventHandlers.onClientOperation?.(operation);\n },\n });\n }\n\n get initializeResult(): InitializeResponse | undefined {\n return this.initResult;\n }\n\n getAgentPid(): number | undefined {\n return this.agent?.pid ?? this.lastKnownPid;\n }\n\n getPermissionStats(): PermissionStats {\n return { ...this.permissionStats };\n }\n\n getAgentLifecycleSnapshot(): AgentLifecycleSnapshot {\n const pid = this.agent?.pid ?? this.lastKnownPid;\n const running = childProcessIsRunning(this.agent);\n return {\n pid,\n startedAt: this.agentStartedAt,\n running,\n lastExit: this.lastAgentExit ? { ...this.lastAgentExit } : undefined,\n };\n }\n\n supportsLoadSession(): boolean {\n return Boolean(this.initResult?.agentCapabilities?.loadSession);\n }\n\n supportsResumeSession(): boolean {\n return Boolean(this.initResult?.agentCapabilities?.sessionCapabilities?.resume);\n }\n\n supportsCloseSession(): boolean {\n return Boolean(this.initResult?.agentCapabilities?.sessionCapabilities?.close);\n }\n\n supportsListSessions(): boolean {\n return Boolean(this.initResult?.agentCapabilities?.sessionCapabilities?.list);\n }\n\n setEventHandlers(\n handlers: Pick<\n AcpClientOptions,\n | \"onAcpMessage\"\n | \"onAcpOutputMessage\"\n | \"onSessionUpdate\"\n | \"onClientOperation\"\n | \"onPermissionEscalation\"\n >,\n ): void {\n this.eventHandlers = { ...handlers };\n }\n\n clearEventHandlers(): void {\n this.eventHandlers = {};\n }\n\n updateRuntimeOptions(options: {\n permissionMode?: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n permissionPolicy?: AcpClientOptions[\"permissionPolicy\"];\n fs?: boolean;\n terminal?: boolean;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n }): void {\n const shouldRefreshPermissionPolicy =\n options.permissionMode !== undefined || options.nonInteractivePermissions !== undefined;\n if (options.permissionMode) {\n this.options.permissionMode = options.permissionMode;\n }\n if (options.nonInteractivePermissions !== undefined) {\n this.options.nonInteractivePermissions = options.nonInteractivePermissions;\n }\n if (Object.prototype.hasOwnProperty.call(options, \"permissionPolicy\")) {\n this.options.permissionPolicy = snapshotPermissionPolicy(options.permissionPolicy);\n }\n this.updateClientCapabilityPreferences(options);\n this.refreshRuntimePermissionPolicy(shouldRefreshPermissionPolicy);\n if (options.suppressSdkConsoleErrors !== undefined) {\n this.options.suppressSdkConsoleErrors = options.suppressSdkConsoleErrors;\n }\n if (options.verbose !== undefined) {\n this.options.verbose = options.verbose;\n }\n }\n\n private updateClientCapabilityPreferences(options: { fs?: boolean; terminal?: boolean }): void {\n if (options.fs !== undefined) {\n this.options.fs = options.fs;\n }\n if (options.terminal !== undefined) {\n this.options.terminal = options.terminal;\n }\n }\n\n private refreshRuntimePermissionPolicy(enabled: boolean): void {\n if (!enabled) {\n return;\n }\n this.filesystem.updatePermissionPolicy(\n this.options.permissionMode,\n this.options.nonInteractivePermissions,\n );\n this.terminalManager.updatePermissionPolicy(\n this.options.permissionMode,\n this.options.nonInteractivePermissions,\n );\n }\n\n private hasLiveConnection(): boolean {\n return (\n this.connection != null &&\n !this.connection.signal.aborted &&\n this.agent != null &&\n isChildProcessRunning(this.agent)\n );\n }\n\n hasReusableSession(sessionId: string): boolean {\n return this.hasLiveConnection() && this.loadedSessionId === sessionId;\n }\n\n hasActivePrompt(sessionId?: string): boolean {\n if (!this.activePrompt) {\n return false;\n }\n if (sessionId == null) {\n return true;\n }\n return this.activePrompt.sessionId === sessionId;\n }\n\n hasUnresolvedPrompt(): boolean {\n return this.activePrompt !== undefined;\n }\n\n endPromptElicitation(sessionId: string): void {\n const active = this.activePrompt;\n if (!active || active.sessionId !== sessionId) {\n return;\n }\n active.elicitationHandler = undefined;\n active.elicitationController.abort();\n }\n\n async start(): Promise<void> {\n if (this.hasLiveConnection()) {\n return;\n }\n if (this.connection || this.agent) {\n await this.close();\n }\n\n const epoch = this.closeEpoch;\n const maxMessageBytes = readMaxAcpMessageBytes();\n const launch = await this.resolveAgentLaunchPlan();\n this.logAgentLaunch(launch);\n await this.ensureLaunchSupport(launch);\n const { child, process: startedProcess } = await this.spawnAgentProcess(launch);\n if (this.closeEpoch === epoch) {\n this.agent = child;\n this.closing = false;\n this.agentStartedAt = startedProcess.startedAt;\n this.lastAgentExit = undefined;\n this.lastKnownPid = startedProcess.pid;\n }\n const startupStderr: string[] = [];\n\n child.stderr.on(\"data\", (chunk: Buffer | string) => {\n this.captureStartupStderr(startupStderr, chunk);\n if (!this.options.verbose) {\n return;\n }\n process.stderr.write(chunk);\n });\n const startupFailure = this.createStartupFailureWatcher(child, startupStderr);\n try {\n await this.admitAndObserveSpawnedProcess(child, startedProcess);\n const admissionExit = startupFailure.getError();\n if (admissionExit) {\n throw admissionExit;\n }\n } catch (error) {\n startupFailure.dispose();\n throw error;\n }\n await this.stopIfClosedDuringLaunch(epoch, child, startupFailure);\n\n const input = Writable.toWeb(child.stdin);\n const output = Readable.toWeb(child.stdout) as ReadableStream<Uint8Array>;\n let connection: ClientConnection | undefined;\n const stream = this.createTappedStream(\n createNdJsonMessageStream(\n this.options.agentCommand,\n input,\n output,\n maxMessageBytes,\n (error) => {\n this.rejectPendingConnectionRequests(error);\n connection?.close(error);\n },\n ),\n );\n\n const capabilities = resolveClientCapabilities({\n devinAcp: launch.devinAcp,\n fs: this.options.fs !== false,\n terminal: this.options.terminal !== false,\n elicitationModes: this.options.elicitationModes,\n });\n connection = this.createConnection(stream, launch, capabilities);\n connection.signal.addEventListener(\n \"abort\",\n () => {\n this.recordAgentExit(\n child,\n \"connection_close\",\n child.exitCode ?? null,\n child.signalCode ?? null,\n );\n },\n { once: true },\n );\n await this.initializeAgentConnection({\n child,\n connection,\n startupFailure,\n startupStderr,\n launch,\n capabilities,\n });\n }\n\n private async resolveAgentLaunchPlan(): Promise<AgentLaunchPlan> {\n const configuredCommand = resolveAgentCommandParts(\n this.options.agentCommand,\n this.options.agentArgv,\n );\n const resolvedBuiltInLaunch = resolveBuiltInAgentLaunch(this.options.agentCommand);\n const spawnCommand = resolvedBuiltInLaunch?.command ?? configuredCommand.command;\n let args = resolvedBuiltInLaunch?.args ?? configuredCommand.args;\n args = await resolveGeminiCommandArgs(spawnCommand, args);\n if (isQoderAcpCommand(spawnCommand, args)) {\n args = buildQoderAcpCommandArgs(args, this.options);\n }\n return {\n spawnCommand,\n args,\n resolvedBuiltInLaunch,\n devinAcp: isDevinAcpCommand(spawnCommand, args),\n geminiAcp: isGeminiAcpCommand(spawnCommand, args),\n copilotAcp: isCopilotAcpCommand(spawnCommand, args),\n claudeAcp: isClaudeAcpCommand(spawnCommand, args),\n spawnOptions: buildAgentSpawnOptions(\n this.options.cwd,\n this.options.authCredentials,\n this.options.sessionOptions?.env,\n this.options.agentProcessEnv,\n ),\n };\n }\n\n private logAgentLaunch(plan: AgentLaunchPlan): void {\n const launch = plan.resolvedBuiltInLaunch;\n if (launch?.source === \"installed\") {\n this.log(\n `spawning installed built-in agent ${launch.packageName}${launch.packageVersion ? `@${launch.packageVersion}` : \"\"} via ${plan.spawnCommand} ${plan.args.join(\" \")}`,\n );\n return;\n }\n if (launch?.source === \"package-exec\") {\n this.log(\n `spawning built-in agent ${launch.packageName}@${launch.packageRange} via current Node package exec bridge ${plan.spawnCommand} ${plan.args.join(\" \")}`,\n );\n return;\n }\n this.log(`spawning agent: ${plan.spawnCommand} ${plan.args.join(\" \")}`);\n }\n\n private async ensureLaunchSupport(plan: AgentLaunchPlan): Promise<void> {\n if (plan.copilotAcp) {\n await ensureCopilotAcpSupport(plan.spawnCommand);\n }\n if (!plan.claudeAcp) {\n return;\n }\n const claudeExe = resolveClaudeCodeExecutable(process.platform, plan.spawnOptions.env);\n if (claudeExe) {\n plan.spawnOptions.env.CLAUDE_CODE_EXECUTABLE = claudeExe;\n this.log(`resolved system Claude Code executable: ${claudeExe}`);\n }\n }\n\n private async spawnAgentProcess(plan: AgentLaunchPlan): Promise<{\n child: ChildProcessByStdio<Writable, Readable, Readable>;\n process: AcpProcessStarted;\n }> {\n const spawnCommand = buildAgentSpawnCommand(\n plan.spawnCommand,\n plan.args,\n process.platform,\n plan.spawnOptions.env,\n );\n const launch: AcpProcessLaunch = Object.freeze({\n launchId: randomUUID(),\n scope: snapshotProcessLaunchScope(this.options.processLaunchScope),\n command: spawnCommand.command,\n args: Object.freeze([...spawnCommand.args]),\n cwd: this.options.cwd,\n });\n await this.options.processLifecycle?.onBeforeSpawn?.(launch);\n\n let spawnedChild: ChildProcessByStdio<Writable, Readable, Readable>;\n try {\n spawnedChild = spawn(spawnCommand.command, spawnCommand.args, {\n ...plan.spawnOptions,\n windowsVerbatimArguments: spawnCommand.windowsVerbatimArguments,\n });\n await waitForSpawn(spawnedChild);\n } catch (error) {\n const spawnError = new AgentSpawnError(this.options.agentCommand, error);\n this.notifyProcessSpawnFailure(launch, spawnError);\n throw spawnError;\n }\n\n const child = requireAgentStdio(spawnedChild);\n this.agentDescendants.set(child, new ProcessDescendants(child));\n const pid = child.pid;\n if (pid === undefined) {\n const spawnError = new AgentSpawnError(\n this.options.agentCommand,\n new Error(\"spawned agent process did not expose a PID\"),\n );\n this.notifyProcessSpawnFailure(launch, spawnError);\n await this.terminateAgentProcess(child);\n throw spawnError;\n }\n return {\n child,\n process: Object.freeze({\n ...launch,\n pid,\n startedAt: isoNow(),\n }),\n };\n }\n\n private async admitAndObserveSpawnedProcess(\n child: ChildProcessByStdio<Writable, Readable, Readable>,\n process: AcpProcessStarted,\n ): Promise<void> {\n let releaseExitNotification = () => {};\n const exitNotificationBarrier = new Promise<void>((resolve) => {\n releaseExitNotification = resolve;\n });\n this.attachAgentLifecycleObservers(child, process, exitNotificationBarrier);\n try {\n await this.options.processLifecycle?.onSpawned?.(process);\n } catch (error) {\n await this.terminateAgentProcess(child);\n throw error;\n } finally {\n releaseExitNotification();\n }\n }\n\n private createConnection(\n stream: {\n readable: ReadableStream<AnyMessage>;\n writable: WritableStream<AnyMessage>;\n },\n launch: Pick<AgentLaunchPlan, \"devinAcp\">,\n capabilities: ClientCapabilities,\n ): ClientConnection {\n const app = client({ name: \"acpx\" })\n .onNotification(methods.client.session.update, async ({ params }) => {\n await this.handleSessionUpdate(params);\n })\n .onNotification(methods.client.elicitation.complete, async () => {})\n .onRequest(methods.client.session.requestPermission, async ({ params }) => {\n return await this.handlePermissionRequest(params);\n })\n .onRequest(methods.client.elicitation.create, async ({ params, requestId, signal }) => {\n return await this.handleElicitationRequest(params, requestId, signal);\n });\n\n if (capabilities.fs?.readTextFile) {\n app.onRequest(methods.client.fs.readTextFile, async ({ params }) => {\n return await this.handleReadTextFile(params);\n });\n }\n if (capabilities.fs?.writeTextFile) {\n app.onRequest(methods.client.fs.writeTextFile, async ({ params }) => {\n return await this.handleWriteTextFile(params);\n });\n }\n if (capabilities.terminal) {\n app\n .onRequest(methods.client.terminal.create, async ({ params }) => {\n return await this.handleCreateTerminal(params);\n })\n .onRequest(methods.client.terminal.output, async ({ params }) => {\n return await this.terminalManager.terminalOutput(params);\n })\n .onRequest(methods.client.terminal.waitForExit, async ({ params }) => {\n return await this.terminalManager.waitForTerminalExit(params);\n })\n .onRequest(methods.client.terminal.kill, async ({ params }) => {\n return await this.terminalManager.killTerminal(params);\n })\n .onRequest(methods.client.terminal.release, async ({ params }) => {\n return await this.terminalManager.releaseTerminal(params);\n });\n }\n\n if (launch.devinAcp) {\n app.onRequest(\n \"_cognition.ai/request_diagnostics\",\n (params): Record<string, unknown> => {\n return params && typeof params === \"object\" && !Array.isArray(params)\n ? (params as Record<string, unknown>)\n : {};\n },\n async () => ({}),\n );\n }\n\n return app.connect(stream);\n }\n\n private async initializeAgentConnection(params: {\n child: ChildProcessByStdio<Writable, Readable, Readable>;\n connection: ClientConnection;\n startupFailure: StartupFailureWatcher;\n startupStderr: string[];\n launch: AgentLaunchPlan;\n capabilities: ClientCapabilities;\n }): Promise<void> {\n try {\n const initResult = await Promise.race([\n this.initializeProtocolConnection(params.connection, params.launch, params.capabilities),\n params.startupFailure.promise,\n ]);\n params.startupFailure.dispose();\n this.connection = params.connection;\n this.initResult = initResult;\n await this.captureAgentDescendants(params.child);\n this.log(`initialized protocol version ${initResult.protocolVersion}`);\n } catch (error) {\n params.connection.close(error);\n await this.handleInitializeFailure(params, error);\n }\n }\n\n private async initializeProtocolConnection(\n connection: ClientConnection,\n launch: Pick<AgentLaunchPlan, \"devinAcp\" | \"geminiAcp\">,\n capabilities: ClientCapabilities,\n ): Promise<InitializeResponse> {\n const initializePromise = connection.agent.request<InitializeResponse, InitializeRequest>(\n methods.agent.initialize,\n {\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: capabilities,\n clientInfo: resolveClientInfo(launch.devinAcp),\n },\n );\n const initialized = launch.geminiAcp\n ? await withTimeout(initializePromise, resolveGeminiAcpStartupTimeoutMs())\n : await initializePromise;\n await this.authenticateIfRequired(connection, initialized.authMethods ?? []);\n return initialized;\n }\n\n private async handleInitializeFailure(\n params: {\n child: ChildProcessByStdio<Writable, Readable, Readable>;\n startupFailure: StartupFailureWatcher;\n startupStderr: string[];\n launch: AgentLaunchPlan;\n },\n error: unknown,\n ): Promise<never> {\n params.startupFailure.dispose();\n await this.captureAgentDescendants(params.child);\n const normalizedError =\n error instanceof AcpMessageLimitError\n ? error\n : await this.normalizeInitializeError(error, params.child, params.startupStderr);\n await this.terminateAgentProcess(params.child);\n if (params.launch.geminiAcp && error instanceof TimeoutError) {\n throw new GeminiAcpStartupTimeoutError(\n await buildGeminiAcpStartupTimeoutMessage(params.launch.spawnCommand),\n {\n cause: error,\n retryable: true,\n },\n );\n }\n throw normalizedError;\n }\n\n private createTappedStream(base: {\n readable: ReadableStream<AnyMessage>;\n writable: WritableStream<AnyMessage>;\n }): ReturnType<typeof observeAcpStream> {\n return observeAcpStream(base, {\n onMessage: (direction, message) => {\n this.eventHandlers.onAcpOutputMessage?.(direction, message);\n this.eventHandlers.onAcpMessage?.(direction, message);\n },\n suppressReplaySessionUpdates: () => this.suppressReplaySessionUpdateMessages,\n bindPromptOwner: (owner) => this.bindPromptOwner(owner),\n assertPromptActive: (active) => this.assertPromptActive(active),\n onPromptRequestWritten: (active, owner) => this.onPromptRequestWritten(active, owner),\n });\n }\n\n async createSession(cwd = this.options.cwd): Promise<SessionCreateResult> {\n const connection = this.getConnection();\n const { command, args } = resolveAgentCommandParts(\n this.options.agentCommand,\n this.options.agentArgv,\n );\n const claudeAcp = isClaudeAcpCommand(command, args);\n const sessionCwd = await resolveAgentSessionCwd(cwd, this.options.agentCommand);\n\n let result: NewSessionResponse;\n try {\n const createPromise = this.runConnectionRequest(() =>\n connection.agent.request(methods.agent.session.new, {\n cwd: sessionCwd,\n mcpServers: this.options.mcpServers ?? [],\n _meta: buildClaudeCodeOptionsMeta(this.options.sessionOptions, claudeAcp),\n }),\n );\n result = claudeAcp\n ? await withTimeout(createPromise, resolveClaudeAcpSessionCreateTimeoutMs())\n : await createPromise;\n } catch (error) {\n if (claudeAcp && error instanceof TimeoutError) {\n throw new ClaudeAcpSessionCreateTimeoutError(buildClaudeAcpSessionCreateTimeoutMessage(), {\n cause: error,\n retryable: true,\n });\n }\n throw error;\n }\n\n this.loadedSessionId = result.sessionId;\n const configOptions = normalizeResponseConfigOptions(result);\n const models = modelStateFromSessionResponse({ configOptions, response: result });\n this.rememberSessionModels(result.sessionId, models);\n await this.captureAgentDescendants(this.agent);\n\n return {\n sessionId: result.sessionId,\n agentSessionId: extractAgentSessionId(result._meta),\n configOptions,\n models,\n configOptionsPresent: hasResponseField(result, \"configOptions\"),\n legacyModelMetadataPresent: hasResponseField(result, \"models\"),\n };\n }\n\n async loadSession(sessionId: string, cwd = this.options.cwd): Promise<SessionLoadResult> {\n this.getConnection();\n return await this.loadSessionWithOptions(sessionId, cwd, {});\n }\n\n async loadSessionWithOptions(\n sessionId: string,\n cwd = this.options.cwd,\n options: LoadSessionOptions = {},\n ): Promise<SessionLoadResult> {\n const connection = this.getConnection();\n const sessionCwd = await resolveAgentSessionCwd(cwd, this.options.agentCommand);\n const previousSuppression = this.applySessionUpdateSuppression(\n Boolean(options.suppressReplayUpdates),\n );\n\n let response: LoadSessionResponse | undefined;\n\n try {\n response = await this.runConnectionRequest(() =>\n connection.agent.request(methods.agent.session.load, {\n sessionId,\n cwd: sessionCwd,\n mcpServers: this.options.mcpServers ?? [],\n }),\n );\n\n await this.waitForSessionUpdateDrain(\n options.replayIdleMs ?? REPLAY_IDLE_MS,\n options.replayDrainTimeoutMs ?? REPLAY_DRAIN_TIMEOUT_MS,\n );\n } finally {\n this.restoreSessionUpdateSuppression(previousSuppression);\n }\n\n this.loadedSessionId = sessionId;\n const result = toReconnectedSessionResult(response);\n this.updateRememberedSessionModels(sessionId, result);\n await this.captureAgentDescendants(this.agent);\n return result;\n }\n\n async resumeSession(sessionId: string, cwd = this.options.cwd): Promise<SessionResumeResult> {\n const connection = this.getConnection();\n const sessionCwd = await resolveAgentSessionCwd(cwd, this.options.agentCommand);\n const response = await this.runConnectionRequest(() =>\n connection.agent.request(methods.agent.session.resume, {\n sessionId,\n cwd: sessionCwd,\n mcpServers: this.options.mcpServers ?? [],\n }),\n );\n\n this.loadedSessionId = sessionId;\n const result = toReconnectedSessionResult(response);\n this.updateRememberedSessionModels(sessionId, result);\n await this.captureAgentDescendants(this.agent);\n return result;\n }\n\n private applySessionUpdateSuppression(enabled: boolean): SessionUpdateSuppressionState {\n const previous = {\n suppressSessionUpdates: this.suppressSessionUpdates,\n suppressReplaySessionUpdateMessages: this.suppressReplaySessionUpdateMessages,\n };\n this.suppressSessionUpdates = previous.suppressSessionUpdates || enabled;\n this.suppressReplaySessionUpdateMessages =\n previous.suppressReplaySessionUpdateMessages || enabled;\n return previous;\n }\n\n private restoreSessionUpdateSuppression(previous: SessionUpdateSuppressionState): void {\n this.suppressSessionUpdates = previous.suppressSessionUpdates;\n this.suppressReplaySessionUpdateMessages = previous.suppressReplaySessionUpdateMessages;\n }\n\n async prompt(\n sessionId: string,\n prompt: PromptInput | string,\n onRequestWritten?: () => Promise<void> | void,\n onElicitation?: AcpElicitationHandler,\n onPermissionRequest?: AcpPermissionHandler,\n authority?: AcpControlAuthority,\n ): Promise<PromptResponse> {\n const connection = this.getConnection();\n const normalizedPrompt = this.normalizePromptForAgent(prompt);\n const restoreConsoleError = this.options.suppressSdkConsoleErrors\n ? installSdkConsoleErrorSuppression()\n : undefined;\n\n const previousActivePrompt = this.activePrompt;\n const activePrompt = this.beginActivePrompt(\n sessionId,\n onRequestWritten,\n onElicitation,\n onPermissionRequest,\n authority,\n );\n\n try {\n const promptPromise = this.runConnectionRequest(\n () =>\n connection.agent.request(methods.agent.session.prompt, {\n sessionId,\n prompt: normalizedPrompt,\n }),\n authority,\n );\n activePrompt.promise = promptPromise;\n // Queue this prompt before abort listeners can cancel its newly published owner.\n previousActivePrompt?.elicitationController?.abort();\n return this.returnPromptResponseOrPermissionFailure(sessionId, await promptPromise);\n } catch (error) {\n if (activePrompt.admissionFailure) {\n throw activePrompt.admissionFailure.error;\n }\n this.throwPromptPermissionFailureIfPresent(sessionId);\n throw error;\n } finally {\n restoreConsoleError?.();\n this.clearActivePrompt(activePrompt);\n }\n }\n\n private beginActivePrompt(\n sessionId: string,\n onRequestWritten: (() => Promise<void> | void) | undefined,\n elicitationHandler: AcpElicitationHandler | undefined,\n permissionHandler: AcpPermissionHandler | undefined,\n authority: AcpControlAuthority | undefined,\n ): ActivePromptState {\n this.cancellingSessionIds.delete(sessionId);\n const active: ActivePromptState = {\n sessionId,\n onRequestWritten,\n authority,\n elicitationHandler,\n permissionHandler,\n elicitationController: new AbortController(),\n };\n this.activePrompt = active;\n this.pendingPromptOwners.push(active);\n return active;\n }\n\n private bindPromptOwner(owner: {\n requestId: JsonRpcId;\n sessionId: string;\n }): ActivePromptState | undefined {\n const active = this.pendingPromptOwners.find((candidate) => {\n return candidate.requestId === undefined && candidate.sessionId === owner.sessionId;\n });\n if (active) {\n active.requestId = owner.requestId;\n }\n return active;\n }\n\n private assertPromptActive(active: ActivePromptState): void {\n try {\n assertControlAuthority(active.authority);\n } catch (error) {\n // Connection close observers may otherwise replace this with a disconnect error.\n active.admissionFailure = { error };\n throw error;\n }\n }\n\n private onPromptRequestWritten(\n active: ActivePromptState,\n owner: { requestId: JsonRpcId; sessionId: string },\n ): void {\n if (active.requestId !== owner.requestId || active.sessionId !== owner.sessionId) {\n return;\n }\n try {\n void Promise.resolve(active.onRequestWritten?.()).catch(() => {});\n } catch {\n // Readiness observation must not own a request accepted by the transport.\n }\n }\n\n private clearActivePrompt(active: ActivePromptState): void {\n // Other sessions may be globally active while a newer same-session prompt still owns state.\n const pendingIndex = this.pendingPromptOwners.indexOf(active);\n const clearSession = !this.pendingPromptOwners.some(\n (candidate, index) => index > pendingIndex && candidate.sessionId === active.sessionId,\n );\n if (this.activePrompt === active) {\n this.activePrompt = undefined;\n }\n if (pendingIndex >= 0) {\n this.pendingPromptOwners.splice(pendingIndex, 1);\n }\n let permissionController: AbortController | undefined;\n if (clearSession) {\n this.cancellingSessionIds.delete(active.sessionId);\n permissionController = this.takePermissionAbortController(active.sessionId);\n this.promptPermissionFailures.delete(active.sessionId);\n }\n // Finish bookkeeping before callbacks can admit another prompt or permission request.\n active.elicitationController.abort();\n permissionController?.abort();\n }\n\n private normalizePromptForAgent(prompt: PromptInput | string): PromptInput {\n const normalizedPrompt = typeof prompt === \"string\" ? textPrompt(prompt) : prompt;\n const unsupportedPromptContent = getUnsupportedPromptContentMessage(\n normalizedPrompt,\n this.initResult?.agentCapabilities,\n );\n if (unsupportedPromptContent) {\n throw new UnsupportedPromptContentError(unsupportedPromptContent);\n }\n return normalizedPrompt;\n }\n\n private returnPromptResponseOrPermissionFailure(\n sessionId: string,\n response: PromptResponse,\n ): PromptResponse {\n this.throwPromptPermissionFailureIfPresent(sessionId);\n return response;\n }\n\n private throwPromptPermissionFailureIfPresent(sessionId: string): void {\n const permissionFailure = this.consumePromptPermissionFailure(sessionId);\n if (permissionFailure) {\n throw permissionFailure;\n }\n }\n\n async setSessionMode(\n sessionId: string,\n modeId: string,\n authority?: AcpControlAuthority,\n ): Promise<void> {\n const connection = this.getConnection();\n await this.runConnectionRequest(\n () =>\n connection.agent.request(methods.agent.session.setMode, {\n sessionId,\n modeId,\n }),\n authority,\n (error) => maybeWrapSessionControlError(\"session/set_mode\", error, `for mode \"${modeId}\"`),\n );\n }\n\n async setSessionConfigOption(\n sessionId: string,\n configId: string,\n value: string,\n authority?: AcpControlAuthority,\n ): Promise<SetSessionConfigOptionResponse> {\n const connection = this.getConnection();\n return await this.runConnectionRequest(\n () =>\n connection.agent.request(methods.agent.session.setConfigOption, {\n sessionId,\n configId,\n value,\n }),\n authority,\n (error) =>\n maybeWrapSessionControlError(\n \"session/set_config_option\",\n error,\n `for \"${configId}\"=\"${value}\"`,\n ),\n );\n }\n\n async setSessionModel(\n sessionId: string,\n modelId: string,\n controlOverride?: ModelControlOverride,\n authority?: AcpControlAuthority,\n ): Promise<SetSessionConfigOptionResponse | undefined> {\n const control = this.resolveModelControl(sessionId, controlOverride);\n if (!control) {\n throw new RequestedModelUnsupportedError(\n `Cannot set model \"${modelId}\": the ACP session did not advertise a model config option or legacy session/set_model support.`,\n \"missing-capability\",\n );\n }\n const resolvedModelId = resolveRequestedModelId({\n requestedModel: modelId,\n models: controlOverride?.availableModels\n ? { availableModels: controlOverride.availableModels }\n : undefined,\n agentCommand: this.options.agentCommand,\n });\n return control.kind === \"config_option\"\n ? await this.setSessionModelThroughConfig(\n sessionId,\n resolvedModelId,\n control.configId,\n authority,\n )\n : await this.setSessionModelThroughLegacyMethod(sessionId, resolvedModelId, authority);\n }\n\n private async setSessionModelThroughConfig(\n sessionId: string,\n modelId: string,\n configId: string,\n authority?: AcpControlAuthority,\n ): Promise<SetSessionConfigOptionResponse> {\n const connection = this.getConnection();\n const response = await this.runConnectionRequest(\n () =>\n connection.agent.request(methods.agent.session.setConfigOption, {\n sessionId,\n configId,\n value: modelId,\n }),\n authority,\n (error) => this.throwSessionModelError(\"session/set_config_option\", modelId, error),\n );\n this.rememberSessionModels(sessionId, modelStateFromConfigOptions(response.configOptions));\n return response;\n }\n\n private async setSessionModelThroughLegacyMethod(\n sessionId: string,\n modelId: string,\n authority?: AcpControlAuthority,\n ): Promise<undefined> {\n const connection = this.getConnection();\n await this.runConnectionRequest(\n () =>\n connection.agent.request<Record<string, unknown>, Record<string, unknown>>(\n \"session/set_model\",\n {\n sessionId,\n modelId,\n },\n ),\n authority,\n (error) => this.throwSessionModelError(\"session/set_model\", modelId, error),\n );\n return undefined;\n }\n\n private throwSessionModelError(\n method: \"session/set_model\" | \"session/set_config_option\",\n modelId: string,\n error: unknown,\n ): never {\n const wrapped = maybeWrapSessionControlError(method, error, `for model \"${modelId}\"`);\n if (wrapped !== error) {\n throw wrapped;\n }\n const acp = extractAcpError(error);\n const summary = acp\n ? formatSessionControlAcpSummary(acp)\n : error instanceof Error\n ? error.message\n : String(error);\n throw new Error(`Failed ${method} for model \"${modelId}\": ${summary}`, {\n cause: error,\n });\n }\n\n private resolveModelControl(\n sessionId: string,\n controlOverride: ModelControlOverride | undefined,\n ): ModelControl | undefined {\n if (controlOverride) {\n return controlOverride.configId\n ? { kind: \"config_option\", configId: controlOverride.configId }\n : { kind: \"legacy_set_model\" };\n }\n const configId = this.modelConfigIds.get(sessionId);\n if (configId) {\n return { kind: \"config_option\", configId };\n }\n return this.legacyModelSessionIds.has(sessionId) ? { kind: \"legacy_set_model\" } : undefined;\n }\n\n private rememberSessionModels(sessionId: string, models: SessionModelState | undefined): void {\n if (!models) {\n this.modelConfigIds.delete(sessionId);\n this.legacyModelSessionIds.delete(sessionId);\n return;\n }\n if (models.configId) {\n this.modelConfigIds.set(sessionId, models.configId);\n this.legacyModelSessionIds.delete(sessionId);\n return;\n }\n this.modelConfigIds.delete(sessionId);\n this.legacyModelSessionIds.add(sessionId);\n }\n\n private updateRememberedSessionModels(sessionId: string, result: SessionLoadResult): void {\n const explicitConfigRemoval = result.configOptionsPresent && this.modelConfigIds.has(sessionId);\n if (result.models || result.legacyModelMetadataPresent || explicitConfigRemoval) {\n this.rememberSessionModels(sessionId, result.models);\n }\n }\n\n async cancel(sessionId: string): Promise<void> {\n const connection = this.getConnection();\n const active = this.activePrompt?.sessionId === sessionId ? this.activePrompt : undefined;\n // Queue and latch before abort listeners can reenter cancellation or start another prompt.\n const cancellation: Promise<void> =\n active?.cancelPromise ??\n this.runConnectionRequest(() =>\n connection.agent.notify(methods.agent.session.cancel, { sessionId }),\n ).catch((error: unknown) => {\n if (active?.cancelPromise === cancellation) {\n active.cancelPromise = undefined;\n }\n throw error;\n });\n const permissionController = this.takePermissionAbortController(sessionId);\n if (active) {\n active.cancelPromise = cancellation;\n this.cancellingSessionIds.add(sessionId);\n active.elicitationController?.abort();\n } else {\n this.cancellingSessionIds.delete(sessionId);\n }\n permissionController?.abort();\n await cancellation;\n }\n\n async closeSession(sessionId: string): Promise<void> {\n const connection = this.getConnection();\n this.cancellingSessionIds.add(sessionId);\n if (this.activePrompt?.sessionId === sessionId) {\n this.activePrompt.elicitationController?.abort();\n }\n await this.runConnectionRequest(() =>\n connection.agent.request(methods.agent.session.close, {\n sessionId,\n }),\n );\n if (this.loadedSessionId === sessionId) {\n this.loadedSessionId = undefined;\n }\n this.modelConfigIds.delete(sessionId);\n this.legacyModelSessionIds.delete(sessionId);\n }\n\n async listSessions(params: ListSessionsRequest = {}): Promise<ListSessionsResponse> {\n const connection = this.getConnection();\n return await this.runConnectionRequest(() =>\n connection.agent.request(methods.agent.session.list, params),\n );\n }\n\n async requestCancelActivePrompt(): Promise<boolean> {\n const active = this.activePrompt;\n if (!active) {\n return false;\n }\n await this.cancel(active.sessionId);\n return true;\n }\n\n async cancelActivePrompt(waitMs = 2_500): Promise<PromptResponse | undefined> {\n const active = this.activePrompt;\n if (!active) {\n return undefined;\n }\n\n try {\n await this.cancel(active.sessionId);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.log(`failed to send session/cancel: ${message}`);\n }\n\n if (waitMs <= 0) {\n return undefined;\n }\n const activePromise = active.promise;\n if (!activePromise) {\n return undefined;\n }\n\n let timer: NodeJS.Timeout | number | undefined;\n const timeoutPromise = new Promise<undefined>((resolve) => {\n timer = setTimeout(resolve, waitMs);\n });\n\n try {\n return await Promise.race([\n activePromise.then(\n (response) => response,\n () => undefined,\n ),\n timeoutPromise,\n ]);\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n }\n }\n\n async close(): Promise<void> {\n this.closing = true;\n this.closeEpoch += 1;\n this.abortActiveElicitation();\n\n await this.terminalManager.shutdown();\n\n const agent = this.agent;\n if (agent) {\n await this.terminateAgentProcess(agent);\n }\n this.closeConnection();\n if (this.pendingConnectionRequests.size > 0) {\n this.rejectPendingConnectionRequests(\n this.lastAgentExit\n ? new AgentDisconnectedError(\n this.lastAgentExit.reason,\n this.lastAgentExit.exitCode,\n this.lastAgentExit.signal,\n {\n outputAlreadyEmitted: Boolean(this.activePrompt),\n },\n )\n : new AgentDisconnectedError(\"connection_close\", null, null, {\n outputAlreadyEmitted: Boolean(this.activePrompt),\n }),\n );\n }\n\n this.sessionUpdateChain = Promise.resolve();\n this.observedSessionUpdates = 0;\n this.processedSessionUpdates = 0;\n this.suppressSessionUpdates = false;\n this.suppressReplaySessionUpdateMessages = false;\n this.activePrompt = undefined;\n this.pendingPromptOwners.length = 0;\n this.cancellingSessionIds.clear();\n for (const controller of this.permissionAbortControllers.values()) {\n controller.abort();\n }\n this.permissionAbortControllers.clear();\n this.promptPermissionFailures.clear();\n this.loadedSessionId = undefined;\n this.modelConfigIds.clear();\n this.legacyModelSessionIds.clear();\n this.initResult = undefined;\n this.connection = undefined;\n this.agent = undefined;\n }\n\n // Retire only this launch: close() may already have been followed by a replacement start().\n private async stopIfClosedDuringLaunch(\n epoch: number,\n child: ChildProcessByStdio<Writable, Readable, Readable>,\n startupFailure: StartupFailureWatcher,\n ): Promise<void> {\n if (this.closeEpoch === epoch) {\n return;\n }\n startupFailure.dispose();\n await this.terminateAgentProcess(child);\n throw new Error(\"ACP client was closed while the agent was starting\");\n }\n\n private abortActiveElicitation(): void {\n this.activePrompt?.elicitationController?.abort();\n }\n\n private closeConnection(): void {\n this.connection?.close();\n }\n\n private async captureAgentDescendants(child: ChildProcess | undefined): Promise<void> {\n const descendants = child && this.agentDescendants.get(child);\n if (descendants && !(await descendants.capture())) {\n this.log(\"could not verify agent descendants; skipping unverified process cleanup\");\n }\n }\n\n private terminateAgentProcess(\n child: ChildProcessByStdio<Writable, Readable, Readable>,\n ): Promise<void> {\n let cleanup = this.agentCleanups.get(child);\n if (!cleanup) {\n cleanup = Promise.resolve().then(() => this.cleanupAgentProcess(child));\n this.agentCleanups.set(child, cleanup);\n }\n return cleanup;\n }\n\n private async cleanupAgentProcess(\n child: ChildProcessByStdio<Writable, Readable, Readable>,\n ): Promise<void> {\n const descendants = this.agentDescendants.get(child);\n const deadline = Date.now() + AGENT_CLEANUP_BUDGET_MS;\n const stdinCloseGraceMs = resolveAgentCloseAfterStdinEndMs(this.options.agentCommand);\n try {\n if (descendants) {\n await descendants.capture(Math.max(1, deadline - Date.now()));\n }\n this.endAgentStdin(child);\n await waitForChildExit(\n child,\n Math.min(stdinCloseGraceMs, Math.max(0, deadline - Date.now())),\n );\n const exited = await this.signalAgentAndDescendants(\n child,\n \"SIGTERM\",\n AGENT_CLOSE_TERM_GRACE_MS,\n deadline,\n );\n if (!exited) {\n this.log(\"agent processes did not exit after SIGTERM; forcing SIGKILL\");\n await this.signalAgentAndDescendants(child, \"SIGKILL\", AGENT_CLOSE_KILL_GRACE_MS, deadline);\n }\n } finally {\n descendants?.retire();\n // Stdio must not keep acpx alive after teardown, even if an OS query failed.\n this.detachAgentHandles(child, isChildProcessRunning(child));\n }\n }\n\n private endAgentStdin(child: ChildProcessByStdio<Writable, Readable, Readable>): void {\n // Closing stdin is the most graceful shutdown signal for stdio-based ACP agents.\n if (child.stdin.destroyed) {\n return;\n }\n try {\n child.stdin.end();\n } catch {\n // best effort\n }\n }\n\n private async signalAgentAndDescendants(\n child: ChildProcessByStdio<Writable, Readable, Readable>,\n signal: NodeJS.Signals,\n waitMs: number,\n deadline: number,\n ): Promise<boolean> {\n const descendants = this.agentDescendants.get(child);\n if (descendants && Date.now() < deadline) {\n await descendants.signal(signal, deadline - Date.now());\n }\n if (isChildProcessRunning(child)) {\n try {\n child.kill(signal);\n } catch {\n // The direct child may have exited during descendant inspection.\n }\n }\n const remaining = Math.min(waitMs, Math.max(0, deadline - Date.now()));\n const [exited, descendantsExited] = await Promise.all([\n waitForChildExit(child, remaining),\n descendants ? descendants.waitForExit(remaining) : Promise.resolve(true),\n ]);\n return exited && descendantsExited;\n }\n\n private detachAgentHandles(agent: ChildProcess, unref: boolean): void {\n const stdin = agent.stdin;\n const stdout = agent.stdout;\n const stderr = agent.stderr;\n\n stdin?.destroy();\n stdout?.destroy();\n stderr?.destroy();\n\n if (unref) {\n try {\n agent.unref();\n } catch {\n // best effort\n }\n }\n }\n\n private getConnection(): ClientConnection {\n if (!this.connection) {\n throw new Error(\"ACP client not started\");\n }\n return this.connection;\n }\n\n private log(message: string): void {\n if (!this.options.verbose) {\n return;\n }\n process.stderr.write(`[acpx] ${message}\\n`);\n }\n\n private captureStartupStderr(target: string[], chunk: Buffer | string): void {\n const text = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\");\n if (text.length === 0) {\n return;\n }\n target.push(text);\n const overflow = target.join(\"\").length - STARTUP_STDERR_MAX_CHARS;\n if (overflow <= 0) {\n return;\n }\n const joined = target.join(\"\");\n target.splice(0, target.length, joined.slice(-STARTUP_STDERR_MAX_CHARS));\n }\n\n private summarizeStartupStderr(target: string[]): string | undefined {\n const joined = target.join(\"\").trim();\n if (!joined) {\n return undefined;\n }\n const collapsed = joined.replace(/\\s+/gu, \" \").trim();\n return collapsed.slice(0, STARTUP_STDERR_MAX_CHARS);\n }\n\n private createStartupFailureWatcher(\n child: ChildProcessByStdio<Writable, Readable, Readable>,\n startupStderr: string[],\n ): StartupFailureWatcher {\n let settled = false;\n let failure: AgentStartupError | undefined;\n let rejectPromise: (error: unknown) => void;\n\n const cleanup = () => {\n child.off(\"error\", onError);\n child.off(\"exit\", onExit);\n child.off(\"close\", onClose);\n };\n\n const finish = (error?: AgentStartupError) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n if (error) {\n failure = error;\n rejectPromise(error);\n }\n };\n\n const createError = (params?: {\n cause?: unknown;\n exitCode?: number | null;\n signal?: NodeJS.Signals | null;\n }) =>\n new AgentStartupError({\n agentCommand: this.options.agentCommand,\n exitCode: params?.exitCode ?? child.exitCode ?? null,\n signal: params?.signal ?? child.signalCode ?? null,\n stderrSummary: this.summarizeStartupStderr(startupStderr),\n cause: params?.cause,\n });\n\n const onError = (error: Error) => {\n finish(createError({ cause: error }));\n };\n\n const onExit = (exitCode: number | null, signal: NodeJS.Signals | null) => {\n finish(createError({ exitCode, signal }));\n };\n\n const onClose = (exitCode: number | null, signal: NodeJS.Signals | null) => {\n finish(createError({ exitCode, signal }));\n };\n\n const promise = new Promise<never>((_resolve, reject) => {\n rejectPromise = reject;\n child.once(\"error\", onError);\n child.once(\"exit\", onExit);\n child.once(\"close\", onClose);\n if (child.exitCode !== null || child.signalCode !== null) {\n onExit(child.exitCode, child.signalCode);\n }\n });\n void promise.catch(() => {});\n\n return {\n promise,\n dispose: () => finish(),\n getError: () => failure,\n };\n }\n\n private async normalizeInitializeError(\n error: unknown,\n child: ChildProcessByStdio<Writable, Readable, Readable>,\n startupStderr: string[],\n ): Promise<unknown> {\n if (error instanceof AgentStartupError) {\n return error;\n }\n\n const connectionClosedDuringInitialize =\n error instanceof Error && /acp connection closed/i.test(error.message);\n await waitForChildExit(child, 100);\n const childExited = child.exitCode !== null || child.signalCode !== null;\n if (!connectionClosedDuringInitialize && !childExited) {\n return error;\n }\n\n return new AgentStartupError({\n agentCommand: this.options.agentCommand,\n exitCode: child.exitCode ?? null,\n signal: child.signalCode ?? null,\n stderrSummary: this.summarizeStartupStderr(startupStderr),\n cause: error,\n });\n }\n\n private selectAuthMethod(methods: AuthMethod[]): AuthSelection | undefined {\n for (const method of methods) {\n const envCredential = readEnvCredential(method.id);\n if (envCredential) {\n return {\n methodId: method.id,\n credential: envCredential,\n source: \"env\",\n };\n }\n\n const configCredential = resolveConfiguredAuthCredential(\n method.id,\n this.options.authCredentials,\n );\n if (typeof configCredential === \"string\" && configCredential.trim().length > 0) {\n return {\n methodId: method.id,\n credential: configCredential,\n source: \"config\",\n };\n }\n\n const agentSpecificEnvCredential = this.readAgentSpecificEnvCredential(method.id);\n if (agentSpecificEnvCredential) {\n return {\n methodId: method.id,\n credential: agentSpecificEnvCredential,\n source: \"env\",\n };\n }\n }\n\n for (const method of methods) {\n const agentManagedSelection = this.selectAgentManagedAuthMethod(method.id);\n if (agentManagedSelection) {\n return agentManagedSelection;\n }\n }\n\n return undefined;\n }\n\n private readAgentSpecificEnvCredential(methodId: string): string | undefined {\n if (!this.isGrokBuildAcpCommand() || methodId !== \"xai.api_key\") {\n return undefined;\n }\n const value = process.env.XAI_API_KEY;\n return typeof value === \"string\" && value.trim().length > 0 ? value : undefined;\n }\n\n private selectAgentManagedAuthMethod(methodId: string): AuthSelection | undefined {\n if (!this.isGrokBuildAcpCommand() || methodId !== \"cached_token\") {\n return undefined;\n }\n return {\n methodId,\n source: \"agent\",\n };\n }\n\n private isGrokBuildAcpCommand(): boolean {\n const { command, args } = resolveAgentCommandParts(\n this.options.agentCommand,\n this.options.agentArgv,\n );\n const executable = command\n .replace(/\\\\/g, \"/\")\n .split(\"/\")\n .pop()\n ?.replace(/\\.(cmd|exe|ps1)$/iu, \"\")\n .toLowerCase();\n return executable === \"grok\" && args[0] === \"agent\" && args[1] === \"stdio\";\n }\n\n private async authenticateIfRequired(\n connection: ClientConnection,\n authMethods: AuthMethod[],\n ): Promise<void> {\n if (authMethods.length === 0) {\n return;\n }\n\n const selected = this.selectAuthMethod(authMethods);\n if (!selected) {\n if (this.options.authPolicy === \"fail\") {\n throw new AuthPolicyError(\n `agent advertised auth methods [${authMethods.map((m) => m.id).join(\", \")}] but no matching credentials found`,\n );\n }\n\n this.log(\n `agent advertised auth methods [${authMethods.map((m) => m.id).join(\", \")}] but no matching credentials found — skipping (agent may handle auth internally)`,\n );\n return;\n }\n\n await connection.agent.request(methods.agent.authenticate, {\n methodId: selected.methodId,\n });\n\n this.log(`authenticated with method ${selected.methodId} (${selected.source})`);\n }\n\n private async handlePermissionRequest(\n params: RequestPermissionRequest,\n ): Promise<RequestPermissionResponse> {\n if (this.cancellingSessionIds.has(params.sessionId)) {\n return cancelledPermissionResponse();\n }\n\n // Antigravity encodes questions as permissions, with answers marked allow_once.\n // Neither permission policies nor the host's allow/reject API can answer them.\n if (\n this.initResult?.agentInfo?.name === \"antigravity-acp\" &&\n params.toolCall.toolCallId.startsWith(\"interaction_\")\n ) {\n return this.handleModePermissionError(\n params.sessionId,\n new PermissionPromptUnavailableError(\n \"Antigravity requested a user answer. acpx cannot answer Antigravity interaction questions; continue in an interactive client.\",\n ),\n ).response;\n }\n\n const hostResponse = await this.tryHandlePermissionRequestWithHost(params);\n if (hostResponse) {\n return hostResponse;\n }\n\n const { response, recorded } = await this.resolvePermissionRequestFromMode(params);\n if (!recorded) {\n const decision = classifyPermissionDecision(params, response);\n this.recordPermissionDecision(decision);\n }\n\n return response;\n }\n\n private async handleElicitationRequest(\n request: CreateElicitationRequest,\n requestId: JsonRpcId,\n requestSignal: AbortSignal,\n ): Promise<CreateElicitationResponse> {\n const resolved = this.resolveElicitationOwner(request);\n if (\"response\" in resolved) {\n return resolved.response;\n }\n const { active, handler } = resolved.owner;\n\n const signal = AbortSignal.any([requestSignal, active.elicitationController.signal]);\n const handlerAttempt = Promise.resolve()\n .then(async () => await handler(request, { requestId, signal }))\n .then(\n (response) => ({ kind: \"response\" as const, response }),\n (error: unknown) => ({ kind: \"error\" as const, error }),\n );\n const outcome = await raceWithAbort(signal, handlerAttempt);\n\n if (this.activePrompt !== active) {\n return cancelledElicitationResponse(ELICITATION_CANCEL_MESSAGES.inactive);\n }\n if (!outcome || signal.aborted) {\n return cancelledElicitationResponse(ELICITATION_CANCEL_MESSAGES.cancelled);\n }\n if (outcome.kind === \"error\" || !isKnownElicitationResponse(outcome.response)) {\n return cancelledElicitationResponse(ELICITATION_CANCEL_MESSAGES.unavailable);\n }\n return outcome.response;\n }\n\n private resolveElicitationOwner(\n request: CreateElicitationRequest,\n ): { owner: ElicitationOwner } | { response: CreateElicitationResponse } {\n if (!this.options.elicitationModes?.includes(request.mode as AcpElicitationMode)) {\n return { response: cancelledElicitationResponse(ELICITATION_CANCEL_MESSAGES.unsupported) };\n }\n const active = this.activePrompt;\n if (!active) {\n return { response: cancelledElicitationResponse(ELICITATION_CANCEL_MESSAGES.inactive) };\n }\n const scope = this.resolveElicitationScope(request, active);\n if (\"response\" in scope) {\n return scope;\n }\n if (this.isElicitationSessionCancelling(scope.sessionId)) {\n return { response: cancelledElicitationResponse(ELICITATION_CANCEL_MESSAGES.cancelled) };\n }\n if (!active.elicitationHandler) {\n return { response: cancelledElicitationResponse(ELICITATION_CANCEL_MESSAGES.unavailable) };\n }\n return { owner: { active, handler: active.elicitationHandler } };\n }\n\n private resolveElicitationScope(\n request: CreateElicitationRequest,\n active: ActivePromptState,\n ): { sessionId: string } | { response: CreateElicitationResponse } {\n const sessionId = elicitationSessionId(request);\n if (sessionId) {\n return sessionId === active.sessionId\n ? { sessionId }\n : {\n response: cancelledElicitationResponse(ELICITATION_CANCEL_MESSAGES.mismatchedSession),\n };\n }\n const requestScopeId = elicitationRequestScopeId(request);\n if (requestScopeId === undefined || requestScopeId !== active.requestId) {\n return {\n response: cancelledElicitationResponse(ELICITATION_CANCEL_MESSAGES.requestScoped),\n };\n }\n return { sessionId: active.sessionId };\n }\n\n private isElicitationSessionCancelling(sessionId: string): boolean {\n return this.closing || this.cancellingSessionIds.has(sessionId);\n }\n\n private resolvePermissionOwner(sessionId: string):\n | {\n handler: AcpPermissionHandler;\n signal: AbortSignal;\n }\n | undefined {\n const active = this.activePrompt;\n const handler = active?.permissionHandler ?? this.options.onPermissionRequest;\n if (!handler) {\n return undefined;\n }\n const signal = this.cancellationSignalForSession(sessionId);\n if (!active?.permissionHandler) {\n return { handler, signal };\n }\n return {\n handler,\n signal:\n active.sessionId === sessionId\n ? AbortSignal.any([signal, active.elicitationController.signal])\n : AbortSignal.abort(),\n };\n }\n\n private async tryHandlePermissionRequestWithHost(\n params: RequestPermissionRequest,\n ): Promise<RequestPermissionResponse | undefined> {\n const owner = this.resolvePermissionOwner(params.sessionId);\n if (!owner) {\n return undefined;\n }\n const { handler, signal } = owner;\n if (signal.aborted) {\n return this.hostPermissionDecisionResponse(params, signal, undefined);\n }\n try {\n const decision = await raceWithAbort(\n signal,\n handler(\n {\n sessionId: params.sessionId,\n raw: params,\n inferredKind: inferToolKind(params),\n },\n { signal },\n ),\n );\n return this.hostPermissionDecisionResponse(params, signal, decision);\n } catch (error) {\n return this.hostPermissionErrorResponse(params, signal, error);\n }\n }\n\n private hostPermissionDecisionResponse(\n params: RequestPermissionRequest,\n signal: AbortSignal,\n decision: Parameters<typeof decisionToResponse>[1] | undefined,\n ): RequestPermissionResponse | undefined {\n if (signal.aborted || this.cancellingSessionIds.has(params.sessionId)) {\n this.recordPermissionDecision(\"cancelled\");\n return cancelledPermissionResponse();\n }\n if (!decision) {\n return undefined;\n }\n const response = decisionToResponse(\n preferCodexPermissionRefusal(params, this.initResult?.agentInfo?.name),\n decision,\n );\n this.recordPermissionDecision(classifyPermissionDecision(params, response));\n return decision.outcome === \"cancel\"\n ? response\n : this.explainPermissionRefusal(params, response);\n }\n\n private hostPermissionErrorResponse(\n params: RequestPermissionRequest,\n signal: AbortSignal,\n error: unknown,\n ): RequestPermissionResponse | undefined {\n if (signal.aborted || this.cancellingSessionIds.has(params.sessionId)) {\n this.recordPermissionDecision(\"cancelled\");\n return cancelledPermissionResponse();\n }\n // Fall through to the mode-based resolver so a host UI error\n // doesn't take down the turn.\n this.log(\n `onPermissionRequest threw, falling through to mode-based resolver: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n return undefined;\n }\n\n private async resolvePermissionRequestFromMode(\n params: RequestPermissionRequest,\n ): Promise<{ response: RequestPermissionResponse; recorded: boolean }> {\n try {\n const result = await resolvePermissionRequestWithDetails(\n preferCodexPermissionRefusal(params, this.initResult?.agentInfo?.name),\n this.options.permissionMode,\n this.options.nonInteractivePermissions ?? \"deny\",\n this.options.permissionPolicy,\n );\n this.emitPermissionEscalation(result.escalation);\n return { response: this.explainPermissionRefusal(params, result.response), recorded: false };\n } catch (error) {\n return this.handleModePermissionError(params.sessionId, error);\n }\n }\n\n private explainPermissionRefusal(\n params: RequestPermissionRequest,\n response: RequestPermissionResponse,\n ): RequestPermissionResponse {\n const notice = codexPermissionNotice(params, response, this.initResult?.agentInfo?.name);\n if (!notice || this.cancellingSessionIds.has(params.sessionId)) {\n return response;\n }\n try {\n this.eventHandlers.onClientOperation?.({\n method: \"session/request_permission\",\n status: \"completed\",\n summary: notice,\n timestamp: isoNow(),\n });\n } catch {\n // A diagnostic observer must not change the resolved permission decision.\n }\n return withPermissionMetadata(response, { permissionNotice: notice });\n }\n\n private emitPermissionEscalation(\n escalation: Parameters<NonNullable<AcpClientOptions[\"onPermissionEscalation\"]>>[0] | undefined,\n ): void {\n if (escalation) {\n this.eventHandlers.onPermissionEscalation?.(escalation);\n }\n }\n\n private handleModePermissionError(\n sessionId: string,\n error: unknown,\n ): { response: RequestPermissionResponse; recorded: boolean } {\n if (!(error instanceof PermissionPromptUnavailableError)) {\n throw error;\n }\n this.notePromptPermissionFailure(sessionId, error);\n this.recordPermissionDecision(\"cancelled\");\n return { response: cancelledPermissionResponse(), recorded: true };\n }\n\n private attachAgentLifecycleObservers(\n child: ChildProcessByStdio<Writable, Readable, Readable>,\n startedProcess: AcpProcessStarted,\n exitNotificationBarrier: Promise<void>,\n ): void {\n const onExit = (exitCode: number | null, signal: NodeJS.Signals | null) => {\n const exitedAt = isoNow();\n this.recordAgentExit(child, \"process_exit\", exitCode, signal);\n void this.terminateAgentProcess(child);\n void exitNotificationBarrier.then(() => {\n this.notifyProcessExit(startedProcess, exitCode, signal, exitedAt);\n });\n };\n child.once(\"exit\", onExit);\n\n // A child can exit between spawn completion and observer attachment.\n // Replay Node's recorded state so host process ownership cannot remain stale.\n if (child.exitCode !== null || child.signalCode !== null) {\n child.off(\"exit\", onExit);\n onExit(child.exitCode, child.signalCode);\n }\n\n child.once(\"close\", (exitCode, signal) => {\n this.recordAgentExit(child, \"process_close\", exitCode, signal);\n });\n\n child.stdout.once(\"close\", () => {\n this.recordAgentExit(child, \"pipe_close\", child.exitCode ?? null, child.signalCode ?? null);\n });\n }\n\n private notifyProcessSpawnFailure(launch: AcpProcessLaunch, error: unknown): void {\n const handler = this.options.processLifecycle?.onSpawnFailed;\n if (!handler) {\n return;\n }\n const event = Object.freeze({\n ...launch,\n error,\n failedAt: isoNow(),\n });\n try {\n void Promise.resolve(handler(event)).catch((observerError: unknown) => {\n this.logProcessLifecycleError(\"onSpawnFailed\", observerError);\n });\n } catch (observerError) {\n this.logProcessLifecycleError(\"onSpawnFailed\", observerError);\n }\n }\n\n private notifyProcessExit(\n startedProcess: AcpProcessStarted,\n exitCode: number | null,\n signal: NodeJS.Signals | null,\n exitedAt: string,\n ): void {\n const handler = this.options.processLifecycle?.onExit;\n if (!handler) {\n return;\n }\n const event = Object.freeze({\n ...startedProcess,\n exitCode,\n signal,\n exitedAt,\n });\n try {\n void Promise.resolve(handler(event)).catch((error: unknown) => {\n this.logProcessLifecycleError(\"onExit\", error);\n });\n } catch (error) {\n this.logProcessLifecycleError(\"onExit\", error);\n }\n }\n\n private logProcessLifecycleError(hook: string, error: unknown): void {\n const message = error instanceof Error ? error.message : String(error);\n this.log(`process lifecycle ${hook} hook failed: ${message}`);\n }\n\n private recordAgentExit(\n child: ChildProcess,\n reason: AgentDisconnectReason,\n exitCode: number | null,\n signal: NodeJS.Signals | null,\n ): void {\n if (this.agent !== child || this.lastAgentExit) {\n return;\n }\n\n this.lastAgentExit = {\n exitCode,\n signal,\n exitedAt: isoNow(),\n reason,\n unexpectedDuringPrompt: !this.closing && Boolean(this.activePrompt),\n };\n this.rejectPendingConnectionRequests(\n new AgentDisconnectedError(reason, exitCode, signal, {\n outputAlreadyEmitted: Boolean(this.activePrompt),\n }),\n );\n }\n\n private notePromptPermissionFailure(\n sessionId: string,\n error: PermissionPromptUnavailableError,\n ): void {\n if (!this.promptPermissionFailures.has(sessionId)) {\n this.promptPermissionFailures.set(sessionId, error);\n }\n }\n\n private consumePromptPermissionFailure(\n sessionId: string,\n ): PermissionPromptUnavailableError | undefined {\n const error = this.promptPermissionFailures.get(sessionId);\n if (error) {\n this.promptPermissionFailures.delete(sessionId);\n }\n return error;\n }\n\n private async runConnectionRequest<T>(\n run: () => Promise<T>,\n authority?: AcpControlAuthority,\n mapRequestError?: (error: unknown) => unknown,\n ): Promise<T> {\n return await new Promise<T>((resolve, reject) => {\n const rejectRequestError = (error: unknown) => {\n try {\n reject(mapRequestError ? mapRequestError(error) : error);\n } catch (mappedError) {\n reject(mappedError);\n }\n };\n const pending: PendingConnectionRequest = {\n settled: false,\n reject: rejectRequestError,\n };\n\n const finish = (cb: () => void) => {\n if (pending.settled) {\n return;\n }\n pending.settled = true;\n this.pendingConnectionRequests.delete(pending);\n cb();\n };\n\n this.pendingConnectionRequests.add(pending);\n void Promise.resolve()\n .then(async () => {\n if (pending.settled) {\n return { started: false as const };\n }\n // Check in the dispatch microtask; once sent, the native response must still settle.\n try {\n assertControlAuthority(authority);\n } catch (error) {\n finish(() => reject(error));\n return { started: false as const };\n }\n return { started: true as const, value: await run() };\n })\n .then(\n (outcome) => {\n if (outcome.started) {\n finish(() => resolve(outcome.value));\n }\n },\n (error) => finish(() => rejectRequestError(error)),\n );\n });\n }\n\n private rejectPendingConnectionRequests(error: unknown): void {\n for (const pending of this.pendingConnectionRequests) {\n if (pending.settled) {\n this.pendingConnectionRequests.delete(pending);\n continue;\n }\n pending.settled = true;\n this.pendingConnectionRequests.delete(pending);\n pending.reject(error);\n }\n }\n\n private async handleReadTextFile(params: ReadTextFileRequest): Promise<ReadTextFileResponse> {\n try {\n return await this.filesystem.readTextFile(params);\n } catch (error) {\n this.recordPermissionError(params.sessionId, error);\n if (\n (error instanceof FsSafeError && error.code === \"not-found\") ||\n (error instanceof Error && \"code\" in error && error.code === \"ENOENT\")\n ) {\n throw RequestError.resourceNotFound(pathToFileURL(params.path).href);\n }\n throw error;\n }\n }\n\n private async handleWriteTextFile(params: WriteTextFileRequest): Promise<WriteTextFileResponse> {\n try {\n return await this.filesystem.writeTextFile(params);\n } catch (error) {\n this.recordPermissionError(params.sessionId, error);\n throw error;\n }\n }\n\n private async handleCreateTerminal(\n params: CreateTerminalRequest,\n ): Promise<CreateTerminalResponse> {\n try {\n return await this.terminalManager.createTerminal(params);\n } catch (error) {\n this.recordPermissionError(params.sessionId, error);\n throw error;\n }\n }\n\n private cancellationSignalForSession(sessionId: string): AbortSignal {\n let controller = this.permissionAbortControllers.get(sessionId);\n if (!controller) {\n controller = new AbortController();\n this.permissionAbortControllers.set(sessionId, controller);\n }\n return controller.signal;\n }\n\n private takePermissionAbortController(sessionId: string): AbortController | undefined {\n const controller = this.permissionAbortControllers.get(sessionId);\n this.permissionAbortControllers.delete(sessionId);\n return controller;\n }\n\n private recordPermissionDecision(decision: \"approved\" | \"denied\" | \"cancelled\"): void {\n this.permissionStats.requested += 1;\n if (decision === \"approved\") {\n this.permissionStats.approved += 1;\n return;\n }\n if (decision === \"denied\") {\n this.permissionStats.denied += 1;\n return;\n }\n this.permissionStats.cancelled += 1;\n }\n\n private recordPermissionError(sessionId: string, error: unknown): void {\n if (error instanceof PermissionPromptUnavailableError) {\n this.notePromptPermissionFailure(sessionId, error);\n this.recordPermissionDecision(\"cancelled\");\n return;\n }\n if (error instanceof PermissionDeniedError) {\n this.recordPermissionDecision(\"denied\");\n }\n }\n\n private async handleSessionUpdate(notification: SessionNotification): Promise<void> {\n const sequence = ++this.observedSessionUpdates;\n this.sessionUpdateChain = this.sessionUpdateChain.then(async () => {\n try {\n if (!this.suppressSessionUpdates) {\n this.eventHandlers.onSessionUpdate?.(notification);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.log(`session update handler failed: ${message}`);\n } finally {\n this.processedSessionUpdates = sequence;\n }\n });\n\n await this.sessionUpdateChain;\n }\n\n private async waitForSessionUpdateDrain(idleMs: number, timeoutMs: number): Promise<void> {\n const normalizedIdleMs = Math.max(0, idleMs);\n const normalizedTimeoutMs = Math.max(normalizedIdleMs, timeoutMs);\n const deadline = Date.now() + normalizedTimeoutMs;\n let lastObserved = this.observedSessionUpdates;\n let idleSince = Date.now();\n\n while (Date.now() <= deadline) {\n const observed = this.observedSessionUpdates;\n if (observed !== lastObserved) {\n lastObserved = observed;\n idleSince = Date.now();\n }\n\n if (\n this.processedSessionUpdates === this.observedSessionUpdates &&\n Date.now() - idleSince >= normalizedIdleMs\n ) {\n await this.sessionUpdateChain;\n if (this.processedSessionUpdates === this.observedSessionUpdates) {\n return;\n }\n }\n\n await new Promise<void>((resolve) => {\n setTimeout(resolve, DRAIN_POLL_INTERVAL_MS);\n });\n }\n\n throw new Error(`Timed out waiting for session replay drain after ${normalizedTimeoutMs}ms`);\n }\n\n async waitForSessionUpdatesIdle(options?: {\n idleMs?: number;\n timeoutMs?: number;\n }): Promise<void> {\n await this.waitForSessionUpdateDrain(options?.idleMs ?? 0, options?.timeoutMs ?? 0);\n }\n}\n","import type { SessionConfigOption } from \"@agentclientprotocol/sdk\";\nimport { modelStateFromConfigOptions, type SessionModelState } from \"../acp/model-support.js\";\nimport type { SessionAcpxState } from \"../types.js\";\n\nfunction configOptionsAreAuthoritative(state: SessionAcpxState): boolean {\n return state.model_control === \"config_option\";\n}\n\nfunction legacyModelState(state: SessionAcpxState): SessionModelState | undefined {\n if (!Array.isArray(state.available_models)) {\n return undefined;\n }\n return {\n currentModelId: state.current_model_id ?? \"\",\n availableModels: state.available_models.map((modelId) => ({\n modelId,\n name:\n state.available_model_names && Object.hasOwn(state.available_model_names, modelId)\n ? state.available_model_names[modelId]\n : modelId,\n })),\n };\n}\n\nexport function advertisedModelState(\n state: SessionAcpxState | undefined,\n): SessionModelState | undefined {\n if (!state) {\n return undefined;\n }\n const configModels = modelStateFromConfigOptions(state?.config_options);\n if (configModels) {\n return configModels;\n }\n if (configOptionsAreAuthoritative(state)) {\n return undefined;\n }\n return legacyModelState(state);\n}\n\nexport function applyAdvertisedModelState(\n state: SessionAcpxState,\n models: SessionModelState,\n): void {\n state.current_model_id = models.currentModelId;\n state.available_models = models.availableModels.map((model) => model.modelId);\n state.available_model_names = Object.fromEntries(\n models.availableModels.map((model) => [model.modelId, model.name]),\n );\n state.model_control = models.configId ? \"config_option\" : \"legacy_set_model\";\n}\n\nexport function clearAdvertisedModelState(state: SessionAcpxState): void {\n delete state.current_model_id;\n delete state.available_models;\n delete state.available_model_names;\n delete state.model_control;\n}\n\nexport function removeModelConfigOptions(state: SessionAcpxState): void {\n if (!state.config_options) {\n return;\n }\n state.config_options = state.config_options.filter(\n (option) => option.category !== \"model\" && option.id !== \"model\",\n );\n}\n\nexport function applyConfigOptionsModelState(\n state: SessionAcpxState,\n configOptions: SessionConfigOption[],\n): void {\n const previousConfigModels = modelStateFromConfigOptions(state.config_options);\n const preservesLegacyControl =\n state.model_control === \"legacy_set_model\" ||\n (state.model_control === undefined &&\n previousConfigModels === undefined &&\n legacyModelState(state) !== undefined);\n state.config_options = structuredClone(configOptions);\n const models = modelStateFromConfigOptions(configOptions);\n if (models) {\n applyAdvertisedModelState(state, models);\n } else if (preservesLegacyControl) {\n state.model_control = \"legacy_set_model\";\n } else {\n clearAdvertisedModelState(state);\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n ContentBlock,\n SessionNotification,\n SessionUpdate,\n ToolCall,\n ToolCallUpdate,\n UsageUpdate,\n} from \"@agentclientprotocol/sdk\";\nimport { textPrompt } from \"../prompt-content.js\";\nimport type {\n ClientOperation,\n PromptInput,\n SessionAcpxState,\n SessionConversation,\n SessionAvailableCommand,\n SessionAgentContent,\n SessionAgentMessage,\n SessionMessage,\n SessionTokenUsage,\n SessionUsageCost,\n SessionToolResult,\n SessionToolResultContent,\n SessionToolUse,\n SessionUserContent,\n} from \"../types.js\";\nimport { applyConfigOptionsModelState } from \"./model-state.js\";\n\nconst MAX_RUNTIME_MESSAGES = 200;\nconst MAX_RUNTIME_AGENT_TEXT_CHARS = 8_000;\nconst MAX_RUNTIME_THINKING_CHARS = 4_000;\nconst MAX_RUNTIME_TOOL_IO_CHARS = 4_000;\nconst MAX_RUNTIME_REQUEST_TOKEN_USAGE = 100;\n\nfunction isoNow(): string {\n return new Date().toISOString();\n}\n\nfunction deepClone<T>(value: T): T {\n try {\n return structuredClone(value);\n } catch {\n return value;\n }\n}\n\nfunction hasOwn(source: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(source, key);\n}\n\nfunction normalizeAgentName(value: unknown): string | undefined {\n return trimmedString(value);\n}\n\nfunction trimmedString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction normalizeAvailableCommand(value: unknown): SessionAvailableCommand | undefined {\n const record = asRecord(value);\n if (!record) {\n return undefined;\n }\n const name = trimmedString(record.name);\n if (!name) {\n return undefined;\n }\n const description = trimmedString(record.description);\n return {\n name,\n ...(description ? { description } : {}),\n has_input: record.input != null,\n };\n}\n\nfunction extractText(content: ContentBlock): string | undefined {\n switch (content.type) {\n case \"text\":\n return content.text;\n case \"resource_link\":\n return content.title ?? content.name ?? content.uri;\n case \"resource\":\n return extractResourceText(content);\n case \"audio\":\n return `[audio] ${content.mimeType}`;\n default:\n return undefined;\n }\n}\n\nfunction extractResourceText(content: Extract<ContentBlock, { type: \"resource\" }>): string {\n return \"text\" in content.resource && typeof content.resource.text === \"string\"\n ? content.resource.text\n : content.resource.uri;\n}\n\nfunction contentToUserContent(content: ContentBlock): SessionUserContent | undefined {\n if (content.type === \"text\") {\n return {\n Text: content.text,\n };\n }\n\n if (content.type === \"resource_link\") {\n const value = content.title ?? content.name ?? content.uri;\n return {\n Mention: {\n uri: content.uri,\n content: value,\n },\n };\n }\n\n if (content.type === \"resource\") {\n return resourceToUserContent(content);\n }\n\n if (content.type === \"image\") {\n return {\n Image: {\n source: content.data,\n size: null,\n },\n };\n }\n\n if (content.type === \"audio\") {\n return {\n Audio: {\n source: content.data,\n mime_type: content.mimeType,\n },\n };\n }\n\n return undefined;\n}\n\nfunction resourceToUserContent(\n content: Extract<ContentBlock, { type: \"resource\" }>,\n): SessionUserContent {\n if (\"text\" in content.resource && typeof content.resource.text === \"string\") {\n return {\n Text: content.resource.text,\n };\n }\n\n return {\n Mention: {\n uri: content.resource.uri,\n content: content.resource.uri,\n },\n };\n}\n\nfunction nextUserMessageId(): string {\n return randomUUID();\n}\n\nfunction isUserMessage(message: SessionMessage): message is {\n User: SessionConversation[\"messages\"][number] extends infer T\n ? T extends { User: infer U }\n ? U\n : never\n : never;\n} {\n return typeof message === \"object\" && message !== null && hasOwn(message, \"User\");\n}\n\nfunction isAgentMessage(message: SessionMessage): message is { Agent: SessionAgentMessage } {\n return typeof message === \"object\" && message !== null && hasOwn(message, \"Agent\");\n}\n\nfunction isAgentTextContent(content: SessionAgentContent): content is { Text: string } {\n return hasOwn(content, \"Text\");\n}\n\nfunction isAgentThinkingContent(\n content: SessionAgentContent,\n): content is { Thinking: { text: string; signature?: string | null } } {\n return hasOwn(content, \"Thinking\");\n}\n\nfunction isAgentToolUseContent(\n content: SessionAgentContent,\n): content is { ToolUse: SessionToolUse } {\n return hasOwn(content, \"ToolUse\");\n}\n\nfunction updateConversationTimestamp(conversation: SessionConversation, timestamp: string): void {\n conversation.updated_at = timestamp;\n}\n\nfunction ensureAgentMessage(conversation: SessionConversation): SessionAgentMessage {\n const last = conversation.messages.at(-1);\n if (last && isAgentMessage(last)) {\n return last.Agent;\n }\n\n const created: SessionAgentMessage = {\n content: [],\n tool_results: {},\n };\n conversation.messages.push({ Agent: created });\n return created;\n}\n\nfunction appendAgentText(agent: SessionAgentMessage, text: string): void {\n if (!text.trim()) {\n return;\n }\n\n const last = agent.content.at(-1);\n if (last && isAgentTextContent(last)) {\n last.Text = trimRuntimeText(`${last.Text}${text}`, MAX_RUNTIME_AGENT_TEXT_CHARS);\n return;\n }\n\n const next: SessionAgentContent = {\n Text: text,\n };\n agent.content.push(next);\n}\n\nfunction appendAgentThinking(agent: SessionAgentMessage, text: string): void {\n if (!text.trim()) {\n return;\n }\n\n const last = agent.content.at(-1);\n if (last && isAgentThinkingContent(last)) {\n last.Thinking.text = trimRuntimeText(\n `${last.Thinking.text}${text}`,\n MAX_RUNTIME_THINKING_CHARS,\n );\n return;\n }\n\n const next: SessionAgentContent = {\n Thinking: {\n text,\n signature: null,\n },\n };\n agent.content.push(next);\n}\n\nfunction trimRuntimeText(value: string, maxChars: number): string {\n if (value.length <= maxChars) {\n return value;\n }\n return `${value.slice(0, Math.max(0, maxChars - 3))}...`;\n}\n\nfunction statusIndicatesComplete(status: unknown): boolean {\n if (typeof status !== \"string\") {\n return false;\n }\n const normalized = status.toLowerCase();\n return (\n normalized.includes(\"complete\") ||\n normalized.includes(\"done\") ||\n normalized.includes(\"success\") ||\n normalized.includes(\"failed\") ||\n normalized.includes(\"error\") ||\n normalized.includes(\"cancel\")\n );\n}\n\nfunction statusIndicatesError(status: unknown): boolean {\n if (typeof status !== \"string\") {\n return false;\n }\n const normalized = status.toLowerCase();\n return normalized.includes(\"fail\") || normalized.includes(\"error\");\n}\n\nfunction toToolResultContent(value: unknown): SessionToolResultContent {\n if (typeof value === \"string\") {\n return { Text: trimRuntimeText(value, MAX_RUNTIME_TOOL_IO_CHARS) };\n }\n\n if (value != null) {\n try {\n return { Text: trimRuntimeText(JSON.stringify(value), MAX_RUNTIME_TOOL_IO_CHARS) };\n } catch {\n return { Text: \"[Unserializable value]\" };\n }\n }\n\n return { Text: \"\" };\n}\n\nfunction toRawInput(value: unknown): string {\n if (typeof value === \"string\") {\n return trimRuntimeText(value, MAX_RUNTIME_TOOL_IO_CHARS);\n }\n\n try {\n return trimRuntimeText(JSON.stringify(value ?? {}), MAX_RUNTIME_TOOL_IO_CHARS);\n } catch {\n return value == null ? \"\" : \"[Unserializable input]\";\n }\n}\n\nfunction ensureToolUseContent(agent: SessionAgentMessage, toolCallId: string): SessionToolUse {\n for (const content of agent.content) {\n if (isAgentToolUseContent(content) && content.ToolUse.id === toolCallId) {\n return content.ToolUse;\n }\n }\n\n const created: SessionToolUse = {\n id: toolCallId,\n name: \"tool_call\",\n raw_input: \"{}\",\n input: {},\n is_input_complete: false,\n thought_signature: null,\n };\n agent.content.push({ ToolUse: created });\n return created;\n}\n\nfunction upsertToolResult(\n agent: SessionAgentMessage,\n toolCallId: string,\n patch: Partial<SessionToolResult>,\n): void {\n const existing = agent.tool_results[toolCallId];\n const fallback = existingToolResultValues(existing);\n const next: SessionToolResult = {\n tool_use_id: toolCallId,\n tool_name: patch.tool_name ?? fallback.tool_name,\n is_error: patch.is_error ?? fallback.is_error,\n content: patch.content ?? fallback.content,\n output: patch.output ?? fallback.output,\n };\n agent.tool_results[toolCallId] = next;\n}\n\nfunction existingToolResultValues(existing: SessionToolResult | undefined): SessionToolResult {\n if (existing) {\n return existing;\n }\n return {\n tool_use_id: \"\",\n tool_name: \"tool_call\",\n is_error: false,\n content: { Text: \"\" },\n output: undefined,\n };\n}\n\nfunction applyToolCallUpdate(agent: SessionAgentMessage, update: ToolCall | ToolCallUpdate): void {\n const tool = ensureToolUseContent(agent, update.toolCallId);\n\n applyToolIdentityUpdate(tool, update);\n applyToolInputUpdate(tool, update);\n applyToolStatusUpdate(tool, update);\n applyToolResultUpdate(agent, tool, update);\n}\n\nfunction applyToolIdentityUpdate(tool: SessionToolUse, update: ToolCall | ToolCallUpdate): void {\n if (hasOwn(update, \"title\")) {\n tool.name =\n normalizeAgentName((update as { title?: unknown }).title) ?? tool.name ?? \"tool_call\";\n }\n\n if (hasOwn(update, \"kind\")) {\n const kindName = normalizeAgentName((update as { kind?: unknown }).kind);\n if (!tool.name || tool.name === \"tool_call\") {\n tool.name = kindName ?? tool.name;\n }\n }\n}\n\nfunction applyToolInputUpdate(tool: SessionToolUse, update: ToolCall | ToolCallUpdate): void {\n if (!hasOwn(update, \"rawInput\")) {\n return;\n }\n const rawInput = deepClone((update as { rawInput?: unknown }).rawInput);\n tool.input = rawInput ?? {};\n tool.raw_input = toRawInput(rawInput);\n}\n\nfunction applyToolStatusUpdate(tool: SessionToolUse, update: ToolCall | ToolCallUpdate): void {\n if (hasOwn(update, \"status\")) {\n tool.is_input_complete = statusIndicatesComplete((update as { status?: unknown }).status);\n }\n}\n\nfunction applyToolResultUpdate(\n agent: SessionAgentMessage,\n tool: SessionToolUse,\n update: ToolCall | ToolCallUpdate,\n): void {\n if (!hasToolResultPatch(update)) {\n return;\n }\n const status = (update as { status?: unknown }).status;\n const output = hasOwn(update, \"rawOutput\")\n ? deepClone((update as { rawOutput?: unknown }).rawOutput)\n : undefined;\n\n upsertToolResult(agent, update.toolCallId, {\n tool_name: tool.name,\n is_error: statusIndicatesError(status),\n content: output === undefined ? undefined : toToolResultContent(output),\n output,\n });\n}\n\nfunction hasToolResultPatch(update: ToolCall | ToolCallUpdate): boolean {\n return [\"rawOutput\", \"status\", \"title\", \"kind\"].some((key) => hasOwn(update, key));\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction numberField(source: Record<string, unknown>, keys: readonly string[]): number | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"number\" && Number.isFinite(value) && value >= 0) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction sourceToTokenUsage(source: unknown): SessionTokenUsage | undefined {\n const usageRecord = asRecord(source);\n if (!usageRecord) {\n return undefined;\n }\n\n const normalized: SessionTokenUsage = {\n input_tokens: numberField(usageRecord, [\"input_tokens\", \"inputTokens\"]),\n output_tokens: numberField(usageRecord, [\"output_tokens\", \"outputTokens\"]),\n cache_creation_input_tokens: numberField(usageRecord, [\n \"cache_creation_input_tokens\",\n \"cacheCreationInputTokens\",\n \"cachedWriteTokens\",\n ]),\n cache_read_input_tokens: numberField(usageRecord, [\n \"cache_read_input_tokens\",\n \"cacheReadInputTokens\",\n \"cachedReadTokens\",\n ]),\n thought_tokens: numberField(usageRecord, [\"thought_tokens\", \"thoughtTokens\"]),\n total_tokens: numberField(usageRecord, [\"total_tokens\", \"totalTokens\"]),\n };\n\n if (!hasTokenUsageValue(normalized)) {\n return undefined;\n }\n\n return normalized;\n}\n\nfunction usageToTokenUsage(update: UsageUpdate): SessionTokenUsage | undefined {\n const updateRecord = asRecord(update);\n const usageMeta = asRecord(updateRecord?._meta)?.usage;\n const source = asRecord(usageMeta) ?? updateRecord;\n if (!source) {\n return undefined;\n }\n\n return sourceToTokenUsage(source);\n}\n\nfunction hasTokenUsageValue(usage: SessionTokenUsage): boolean {\n return Object.values(usage).some((value) => value !== undefined);\n}\n\nfunction usageCost(update: UsageUpdate): SessionUsageCost | undefined {\n const cost = asRecord(asRecord(update)?.cost);\n if (!cost) {\n return undefined;\n }\n return buildUsageCost(numberField(cost, [\"amount\"]), stringField(cost.currency));\n}\n\nfunction stringField(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction buildUsageCost(\n amount: number | undefined,\n currency: string | undefined,\n): SessionUsageCost | undefined {\n const cost: SessionUsageCost = {\n ...(amount !== undefined ? { amount } : {}),\n ...(currency !== undefined ? { currency } : {}),\n };\n return Object.keys(cost).length > 0 ? cost : undefined;\n}\n\nfunction ensureAcpxState(state: SessionAcpxState | undefined): SessionAcpxState {\n return state ?? {};\n}\n\nfunction lastUserMessageId(conversation: SessionConversation): string | undefined {\n for (let index = conversation.messages.length - 1; index >= 0; index -= 1) {\n const message = conversation.messages[index];\n if (message && isUserMessage(message)) {\n return message.User.id;\n }\n }\n return undefined;\n}\n\nexport function createSessionConversation(timestamp = isoNow()): SessionConversation {\n return {\n title: null,\n messages: [],\n updated_at: timestamp,\n cumulative_token_usage: {},\n cumulative_cost: undefined,\n request_token_usage: {},\n };\n}\n\nexport function cloneSessionConversation(\n conversation: SessionConversation | undefined,\n): SessionConversation {\n if (!conversation) {\n return createSessionConversation();\n }\n\n return {\n title: conversation.title,\n messages: deepClone(conversation.messages ?? []),\n updated_at: conversation.updated_at,\n cumulative_token_usage: deepClone(conversation.cumulative_token_usage ?? {}),\n cumulative_cost: cloneUsageCost(conversation.cumulative_cost),\n request_token_usage: deepClone(conversation.request_token_usage ?? {}),\n };\n}\n\nfunction cloneUsageCost(cost: SessionUsageCost | undefined): SessionUsageCost | undefined {\n return cost ? { ...cost } : undefined;\n}\n\nexport function cloneSessionAcpxState(\n state: SessionAcpxState | undefined,\n): SessionAcpxState | undefined {\n if (!state) {\n return undefined;\n }\n\n return {\n current_mode_id: state.current_mode_id,\n desired_mode_id: state.desired_mode_id,\n desired_config_options: state.desired_config_options\n ? { ...state.desired_config_options }\n : undefined,\n current_model_id: state.current_model_id,\n available_models: state.available_models ? [...state.available_models] : undefined,\n ...(state.available_model_names\n ? { available_model_names: { ...state.available_model_names } }\n : {}),\n model_control: state.model_control,\n available_commands: state.available_commands\n ? state.available_commands.map((command) => ({ ...command }))\n : undefined,\n config_options: state.config_options ? deepClone(state.config_options) : undefined,\n session_options: cloneSessionOptions(state.session_options),\n };\n}\n\nfunction cloneSessionOptions(\n options: SessionAcpxState[\"session_options\"],\n): SessionAcpxState[\"session_options\"] {\n if (!options) {\n return undefined;\n }\n return {\n model: options.model,\n allowed_tools: options.allowed_tools ? [...options.allowed_tools] : undefined,\n max_turns: options.max_turns,\n ...(options.system_prompt !== undefined\n ? { system_prompt: cloneSystemPromptOption(options.system_prompt) }\n : {}),\n ...(options.env !== undefined ? { env: { ...options.env } } : {}),\n };\n}\n\nfunction cloneSystemPromptOption(\n option: NonNullable<NonNullable<SessionAcpxState[\"session_options\"]>[\"system_prompt\"]>,\n): NonNullable<NonNullable<SessionAcpxState[\"session_options\"]>[\"system_prompt\"]> {\n return typeof option === \"string\" ? option : { append: option.append };\n}\n\nexport function recordPromptSubmission(\n conversation: SessionConversation,\n prompt: PromptInput | string,\n timestamp = isoNow(),\n messageId?: string,\n): string | undefined {\n const normalizedPrompt = typeof prompt === \"string\" ? textPrompt(prompt) : prompt;\n const userContent = normalizedPrompt\n .map((content) => contentToUserContent(content))\n .filter((content) => content !== undefined);\n if (userContent.length === 0) {\n return undefined;\n }\n\n const promptMessageId = messageId ?? nextUserMessageId();\n conversation.messages.push({\n User: {\n id: promptMessageId,\n content: userContent.map((content) => {\n if (\"Text\" in content) {\n return {\n Text: trimRuntimeText(content.Text, MAX_RUNTIME_AGENT_TEXT_CHARS),\n };\n }\n return content;\n }),\n },\n });\n updateConversationTimestamp(conversation, timestamp);\n trimConversationForRuntime(conversation);\n return promptMessageId;\n}\n\nfunction agentMessageHasObservedReply(message: SessionAgentMessage): boolean {\n return message.content.length > 0 || Object.keys(message.tool_results).length > 0;\n}\n\nexport function hasAgentReplyAfterPrompt(\n conversation: SessionConversation,\n promptMessageId: string,\n): boolean {\n let sawPrompt = false;\n\n for (const message of conversation.messages) {\n if (!sawPrompt) {\n if (isUserMessage(message) && message.User.id === promptMessageId) {\n sawPrompt = true;\n }\n continue;\n }\n\n if (isAgentMessage(message) && agentMessageHasObservedReply(message.Agent)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function recordSessionUpdate(\n conversation: SessionConversation,\n state: SessionAcpxState | undefined,\n notification: SessionNotification,\n timestamp = isoNow(),\n userMessageId?: string,\n): SessionAcpxState {\n const acpx = ensureAcpxState(state);\n\n const update: SessionUpdate = notification.update;\n applySessionUpdate(conversation, acpx, update, userMessageId);\n\n updateConversationTimestamp(conversation, timestamp);\n trimConversationForRuntime(conversation);\n return acpx;\n}\n\nexport function recordPromptResponseUsage(\n conversation: SessionConversation,\n usage: unknown,\n promptMessageId?: string,\n timestamp = isoNow(),\n): boolean {\n const tokenUsage = sourceToTokenUsage(usage);\n if (!tokenUsage) {\n return false;\n }\n\n applyTokenUsage(conversation, tokenUsage, promptMessageId);\n updateConversationTimestamp(conversation, timestamp);\n trimConversationForRuntime(conversation);\n return true;\n}\n\nfunction applySessionUpdate(\n conversation: SessionConversation,\n acpx: SessionAcpxState,\n update: SessionUpdate,\n userMessageId?: string,\n): void {\n const handler = SESSION_UPDATE_HANDLERS[update.sessionUpdate];\n handler?.(conversation, acpx, update, userMessageId);\n}\n\ntype SessionUpdateHandler = (\n conversation: SessionConversation,\n acpx: SessionAcpxState,\n update: SessionUpdate,\n userMessageId?: string,\n) => void;\n\nconst SESSION_UPDATE_HANDLERS: Record<string, SessionUpdateHandler> = {\n user_message_chunk: (conversation, _acpx, update, userMessageId) => {\n if (update.sessionUpdate === \"user_message_chunk\") {\n appendUserMessageChunk(conversation, update.content, userMessageId);\n }\n },\n agent_message_chunk: (conversation, _acpx, update) => {\n if (update.sessionUpdate === \"agent_message_chunk\") {\n appendAgentMessageChunk(conversation, update.content, appendAgentText);\n }\n },\n agent_thought_chunk: (conversation, _acpx, update) => {\n if (update.sessionUpdate === \"agent_thought_chunk\") {\n appendAgentMessageChunk(conversation, update.content, appendAgentThinking);\n }\n },\n tool_call: (conversation, _acpx, update) => {\n if (update.sessionUpdate === \"tool_call\" || update.sessionUpdate === \"tool_call_update\") {\n applyToolCallUpdate(ensureAgentMessage(conversation), update);\n }\n },\n tool_call_update: (conversation, _acpx, update) => {\n if (update.sessionUpdate === \"tool_call\" || update.sessionUpdate === \"tool_call_update\") {\n applyToolCallUpdate(ensureAgentMessage(conversation), update);\n }\n },\n usage_update: (conversation, _acpx, update) => {\n if (update.sessionUpdate === \"usage_update\") {\n applyUsageUpdate(conversation, update);\n }\n },\n session_info_update: (conversation, _acpx, update) => {\n if (update.sessionUpdate === \"session_info_update\") {\n applySessionInfoUpdate(conversation, update);\n }\n },\n available_commands_update: (_conversation, acpx, update) => {\n if (update.sessionUpdate === \"available_commands_update\") {\n acpx.available_commands = update.availableCommands\n .map((entry) => normalizeAvailableCommand(entry))\n .filter((entry): entry is SessionAvailableCommand => entry !== undefined);\n }\n },\n current_mode_update: (_conversation, acpx, update) => {\n if (update.sessionUpdate === \"current_mode_update\") {\n acpx.current_mode_id = update.currentModeId;\n }\n },\n config_option_update: (_conversation, acpx, update) => {\n if (update.sessionUpdate === \"config_option_update\") {\n const configOptions = deepClone(update.configOptions);\n applyConfigOptionsModelState(acpx, configOptions);\n }\n },\n};\n\nfunction appendUserMessageChunk(\n conversation: SessionConversation,\n content: ContentBlock,\n messageId?: string,\n): void {\n const userContent = contentToUserContent(content);\n if (!userContent) {\n return;\n }\n conversation.messages.push({\n User: {\n id: messageId ?? nextUserMessageId(),\n content: [userContent],\n },\n });\n}\n\nfunction appendAgentMessageChunk(\n conversation: SessionConversation,\n content: ContentBlock,\n append: (agent: SessionAgentMessage, text: string) => void,\n): void {\n const text = extractText(content);\n if (text) {\n append(ensureAgentMessage(conversation), text);\n }\n}\n\nfunction applyUsageUpdate(conversation: SessionConversation, update: UsageUpdate): void {\n const usage = usageToTokenUsage(update);\n const cost = usageCost(update);\n if (!usage && !cost) {\n return;\n }\n if (usage) {\n applyTokenUsage(conversation, usage);\n }\n if (cost) {\n conversation.cumulative_cost = cost;\n }\n}\n\nfunction applyTokenUsage(\n conversation: SessionConversation,\n usage: SessionTokenUsage,\n promptMessageId?: string,\n): void {\n conversation.cumulative_token_usage = usage;\n const userId = promptMessageId ?? lastUserMessageId(conversation);\n if (userId) {\n conversation.request_token_usage[userId] = usage;\n }\n}\n\nfunction applySessionInfoUpdate(\n conversation: SessionConversation,\n update: Extract<SessionUpdate, { sessionUpdate: \"session_info_update\" }>,\n): void {\n if (hasOwn(update, \"title\")) {\n conversation.title = update.title ?? null;\n }\n if (hasOwn(update, \"updatedAt\")) {\n conversation.updated_at = update.updatedAt ?? conversation.updated_at;\n }\n}\n\nexport function recordClientOperation(\n conversation: SessionConversation,\n state: SessionAcpxState | undefined,\n _operation: ClientOperation,\n timestamp = isoNow(),\n): SessionAcpxState {\n const acpx = ensureAcpxState(state);\n updateConversationTimestamp(conversation, timestamp);\n trimConversationForRuntime(conversation);\n return acpx;\n}\n\nexport function trimConversationForRuntime(conversation: SessionConversation): void {\n if (conversation.messages.length > MAX_RUNTIME_MESSAGES) {\n conversation.messages = conversation.messages.slice(-MAX_RUNTIME_MESSAGES);\n }\n\n for (const message of conversation.messages) {\n trimRuntimeMessage(message);\n }\n\n const requestUsageEntries = Object.entries(conversation.request_token_usage);\n if (requestUsageEntries.length > MAX_RUNTIME_REQUEST_TOKEN_USAGE) {\n conversation.request_token_usage = Object.fromEntries(\n requestUsageEntries.slice(-MAX_RUNTIME_REQUEST_TOKEN_USAGE),\n );\n }\n}\n\nfunction trimRuntimeMessage(message: SessionMessage): void {\n if (isUserMessage(message)) {\n trimRuntimeUserMessage(message.User);\n return;\n }\n\n if (isAgentMessage(message)) {\n trimRuntimeAgentMessage(message.Agent);\n }\n}\n\nfunction trimRuntimeUserMessage(message: { content: SessionUserContent[] }): void {\n message.content = message.content.map((content) => {\n if (\"Text\" in content) {\n return {\n Text: trimRuntimeText(content.Text, MAX_RUNTIME_AGENT_TEXT_CHARS),\n };\n }\n return content;\n });\n}\n\nfunction trimRuntimeAgentMessage(message: SessionAgentMessage): void {\n for (const content of message.content) {\n trimRuntimeAgentContent(content);\n }\n\n for (const result of Object.values(message.tool_results)) {\n trimRuntimeToolResult(result);\n }\n}\n\nfunction trimRuntimeAgentContent(content: SessionAgentContent): void {\n if (\"Text\" in content) {\n content.Text = trimRuntimeText(content.Text, MAX_RUNTIME_AGENT_TEXT_CHARS);\n } else if (\"Thinking\" in content) {\n content.Thinking.text = trimRuntimeText(content.Thinking.text, MAX_RUNTIME_THINKING_CHARS);\n } else if (\"ToolUse\" in content) {\n content.ToolUse.raw_input = trimRuntimeText(\n content.ToolUse.raw_input,\n MAX_RUNTIME_TOOL_IO_CHARS,\n );\n }\n}\n\nfunction trimRuntimeToolResult(result: SessionToolResult): void {\n if (\"Text\" in result.content) {\n result.content.Text = trimRuntimeText(result.content.Text, MAX_RUNTIME_TOOL_IO_CHARS);\n }\n if (typeof result.output === \"string\") {\n result.output = trimRuntimeText(result.output, MAX_RUNTIME_TOOL_IO_CHARS);\n }\n}\n","import { normalizeAgentSessionId } from \"../../acp/agent-session-id.js\";\nimport type { AgentLifecycleSnapshot } from \"../../acp/client.js\";\nimport { createSessionConversation } from \"../../session/conversation-model.js\";\nimport { defaultSessionEventLog } from \"../../session/event-log.js\";\nimport type { SessionConversation, SessionRecord } from \"../../types.js\";\n\nexport function createInitialSessionRecord(params: {\n recordId: string;\n name?: string;\n sessionId: string;\n agentCommand: string;\n agentArgv?: string[];\n cwd: string;\n agentSessionId?: string;\n}): SessionRecord {\n const now = new Date().toISOString();\n return {\n schema: \"acpx.session.v1\",\n acpxRecordId: params.recordId,\n acpSessionId: params.sessionId,\n agentSessionId: params.agentSessionId,\n agentCommand: params.agentCommand,\n agentArgv: params.agentArgv,\n cwd: params.cwd,\n name: params.name,\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\nexport function applyLifecycleSnapshotToRecord(\n record: SessionRecord,\n snapshot: AgentLifecycleSnapshot | undefined,\n): void {\n if (!snapshot) {\n return;\n }\n\n record.pid = snapshot.running ? snapshot.pid : undefined;\n record.agentStartedAt = snapshot.startedAt;\n\n if (snapshot.lastExit) {\n record.lastAgentExitCode = snapshot.lastExit.exitCode;\n record.lastAgentExitSignal = snapshot.lastExit.signal;\n record.lastAgentExitAt = snapshot.lastExit.exitedAt;\n record.lastAgentDisconnectReason = snapshot.lastExit.reason;\n return;\n }\n\n record.lastAgentExitCode = undefined;\n record.lastAgentExitSignal = undefined;\n record.lastAgentExitAt = undefined;\n record.lastAgentDisconnectReason = undefined;\n}\n\nexport function reconcileAgentSessionId(\n record: SessionRecord,\n agentSessionId: string | undefined,\n): void {\n const normalized = normalizeAgentSessionId(agentSessionId);\n if (!normalized) {\n return;\n }\n\n record.agentSessionId = normalized;\n}\n\nexport function sessionHasAgentMessages(\n recordOrConversation: Pick<SessionRecord, \"messages\"> | SessionConversation,\n): boolean {\n return recordOrConversation.messages.some(\n (message) => typeof message === \"object\" && message !== null && \"Agent\" in message,\n );\n}\n\nexport function applyConversation(record: SessionRecord, conversation: SessionConversation): void {\n record.title = conversation.title;\n record.updated_at = conversation.updated_at;\n record.messages = conversation.messages;\n record.cumulative_token_usage = conversation.cumulative_token_usage;\n record.cumulative_cost = conversation.cumulative_cost;\n record.request_token_usage = conversation.request_token_usage;\n}\n","import type { SessionRecord } from \"../../types.js\";\n\nexport type SystemPromptOption = string | { append: string };\n\nexport type SessionAgentOptions = {\n model?: string;\n allowedTools?: string[];\n maxTurns?: number;\n systemPrompt?: SystemPromptOption;\n /**\n * Per-agent environment variables injected into the spawned agent child\n * process and persisted with the session record for reconnects. Keys here\n * override the parent process environment for the spawned child, except\n * acpx-managed auth credential keys. Do not put secrets here; use\n * authCredentials for credentials. Callers are responsible for sanitizing\n * dangerous keys such as `PATH`, `LD_PRELOAD`, and `NODE_OPTIONS` before\n * passing them to acpx.\n */\n env?: Record<string, string>;\n};\n\nexport function mergeSessionOptions(\n preferred: SessionAgentOptions | undefined,\n fallback: SessionAgentOptions | undefined,\n): SessionAgentOptions | undefined {\n const merged: SessionAgentOptions = { ...fallback };\n assignDefinedOption(merged, \"model\", preferred?.model);\n assignDefinedOption(merged, \"allowedTools\", preferred?.allowedTools);\n assignDefinedOption(merged, \"maxTurns\", preferred?.maxTurns);\n assignDefinedOption(merged, \"systemPrompt\", preferred?.systemPrompt);\n assignDefinedOption(merged, \"env\", mergeEnvRecords(fallback?.env, preferred?.env));\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeEnvRecords(\n fallback: Record<string, string> | undefined,\n preferred: Record<string, string> | undefined,\n): Record<string, string> | undefined {\n if (!fallback && !preferred) {\n return undefined;\n }\n return { ...fallback, ...preferred };\n}\n\nfunction assignDefinedOption<Key extends keyof SessionAgentOptions>(\n target: SessionAgentOptions,\n key: Key,\n value: SessionAgentOptions[Key] | undefined,\n): void {\n if (value !== undefined) {\n target[key] = value;\n }\n}\n\nexport function persistSessionOptions(\n record: SessionRecord,\n options: SessionAgentOptions | undefined,\n): void {\n const next = options === undefined ? undefined : persistedSessionOptions(options);\n if (next !== undefined) {\n record.acpx = {\n ...record.acpx,\n session_options: next,\n };\n return;\n }\n\n if (!record.acpx) {\n return;\n }\n\n delete record.acpx.session_options;\n}\n\nexport function sessionOptionsFromRecord(record: SessionRecord): SessionAgentOptions | undefined {\n const stored = record.acpx?.session_options;\n if (!stored) {\n return undefined;\n }\n\n const sessionOptions: SessionAgentOptions = {};\n assignDefinedOption(sessionOptions, \"model\", nonEmptyString(stored.model));\n assignDefinedOption(sessionOptions, \"allowedTools\", storedAllowedTools(stored.allowed_tools));\n assignDefinedOption(sessionOptions, \"maxTurns\", storedMaxTurns(stored.max_turns));\n assignDefinedOption(\n sessionOptions,\n \"systemPrompt\",\n normalizeSystemPromptOption(stored.system_prompt),\n );\n assignDefinedOption(sessionOptions, \"env\", storedEnvRecord(stored.env));\n\n return Object.keys(sessionOptions).length > 0 ? sessionOptions : undefined;\n}\n\ntype PersistedSessionOptions = NonNullable<NonNullable<SessionRecord[\"acpx\"]>[\"session_options\"]>;\n\nfunction persistedSessionOptions(\n options: SessionAgentOptions,\n): PersistedSessionOptions | undefined {\n const next = {\n model: nonEmptyString(options.model),\n allowed_tools: Array.isArray(options.allowedTools) ? [...options.allowedTools] : undefined,\n max_turns: typeof options.maxTurns === \"number\" ? options.maxTurns : undefined,\n system_prompt: normalizeSystemPromptOption(options.systemPrompt),\n env: storedEnvRecord(options.env),\n } satisfies PersistedSessionOptions;\n return hasPersistedSessionOptions(next) ? next : undefined;\n}\n\nfunction hasPersistedSessionOptions(options: PersistedSessionOptions): boolean {\n return (\n options.model !== undefined ||\n options.allowed_tools !== undefined ||\n options.max_turns !== undefined ||\n options.system_prompt !== undefined ||\n options.env !== undefined\n );\n}\n\nfunction storedEnvRecord(value: unknown): Record<string, string> | undefined {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n const entries = Object.entries(value as Record<string, unknown>);\n const result: Record<string, string> = {};\n for (const [key, raw] of entries) {\n if (typeof raw !== \"string\") {\n continue;\n }\n result[key] = raw;\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction normalizeSystemPromptOption(value: unknown): SystemPromptOption | undefined {\n const prompt = nonEmptyString(value);\n if (prompt !== undefined) {\n return prompt;\n }\n const append = appendedSystemPrompt(value);\n return append === undefined ? undefined : { append };\n}\n\nfunction appendedSystemPrompt(value: unknown): string | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return undefined;\n }\n return nonEmptyString((value as { append?: unknown }).append);\n}\n\nfunction storedAllowedTools(value: unknown): string[] | undefined {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\")\n ? [...value]\n : undefined;\n}\n\nfunction storedMaxTurns(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value : undefined;\n}\n","import { modelStateFromConfigOptions, type SessionModelState } from \"../acp/model-support.js\";\nimport type { SessionAcpxState, SessionRecord } from \"../types.js\";\nimport { applyAdvertisedModelState } from \"./model-state.js\";\n\nfunction ensureAcpxState(state: SessionAcpxState | undefined): SessionAcpxState {\n return state ?? {};\n}\n\nexport function normalizeModeId(modeId: string | undefined): string | undefined {\n if (typeof modeId !== \"string\") {\n return undefined;\n }\n const trimmed = modeId.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction normalizeModelId(modelId: string | undefined): string | undefined {\n if (typeof modelId !== \"string\") {\n return undefined;\n }\n const trimmed = modelId.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function getDesiredModeId(state: SessionAcpxState | undefined): string | undefined {\n return normalizeModeId(state?.desired_mode_id);\n}\n\nexport function getDesiredConfigOptions(\n state: SessionAcpxState | undefined,\n): Record<string, string> {\n const desired = state?.desired_config_options;\n if (!desired) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(desired).flatMap(([configId, value]) => {\n const normalizedConfigId = normalizeModeId(configId);\n return normalizedConfigId && typeof value === \"string\" ? [[normalizedConfigId, value]] : [];\n }),\n );\n}\n\nexport function setDesiredModeId(record: SessionRecord, modeId: string | undefined): void {\n const acpx = ensureAcpxState(record.acpx);\n const normalized = normalizeModeId(modeId);\n\n if (normalized) {\n acpx.desired_mode_id = normalized;\n } else {\n delete acpx.desired_mode_id;\n }\n\n record.acpx = acpx;\n}\n\nexport function clearDesiredConfigOption(\n state: SessionAcpxState,\n configId: string | undefined,\n): void {\n const normalizedConfigId = normalizeModeId(configId);\n if (!normalizedConfigId || !state.desired_config_options) {\n return;\n }\n const desired = { ...state.desired_config_options };\n delete desired[normalizedConfigId];\n if (Object.keys(desired).length > 0) {\n state.desired_config_options = desired;\n } else {\n delete state.desired_config_options;\n }\n}\n\nexport function getDesiredModelId(state: SessionAcpxState | undefined): string | undefined {\n return normalizeModelId(state?.session_options?.model);\n}\n\nfunction hasStoredSessionOptions(\n options: NonNullable<SessionAcpxState[\"session_options\"]>,\n): boolean {\n return (\n typeof options.model === \"string\" ||\n Array.isArray(options.allowed_tools) ||\n typeof options.max_turns === \"number\" ||\n options.system_prompt !== undefined ||\n options.env !== undefined\n );\n}\n\nexport function setDesiredModelId(\n record: SessionRecord,\n modelId: string | undefined,\n modelConfigId?: string,\n): void {\n const acpx = ensureAcpxState(record.acpx);\n const normalized = normalizeModelId(modelId);\n const sessionOptions = { ...acpx.session_options };\n\n if (normalized) {\n sessionOptions.model = normalized;\n } else {\n delete sessionOptions.model;\n }\n\n if (hasStoredSessionOptions(sessionOptions)) {\n acpx.session_options = sessionOptions;\n } else {\n delete acpx.session_options;\n }\n\n clearDesiredConfigOption(\n acpx,\n modelConfigId ?? modelStateFromConfigOptions(acpx.config_options)?.configId,\n );\n record.acpx = acpx;\n}\n\nexport function setCurrentModelId(record: SessionRecord, modelId: string | undefined): void {\n const acpx = ensureAcpxState(record.acpx);\n const normalized = normalizeModelId(modelId);\n\n if (normalized) {\n acpx.current_model_id = normalized;\n } else {\n delete acpx.current_model_id;\n }\n\n record.acpx = acpx;\n}\n\nexport function syncAdvertisedModelState(\n record: SessionRecord,\n models: SessionModelState | undefined,\n): void {\n if (!models) {\n return;\n }\n\n const acpx = ensureAcpxState(record.acpx);\n applyAdvertisedModelState(acpx, models);\n record.acpx = acpx;\n}\n","import type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport type { AcpClient, SessionCreateResult } from \"../acp/client.js\";\nimport {\n assertRequestedModelSupported,\n modelStateFromConfigOptions,\n} from \"../acp/model-support.js\";\nimport { withTimeout } from \"../async-control.js\";\n\nexport function currentModelIdFromSetModelResponse(\n response: SetSessionConfigOptionResponse | undefined,\n fallbackModelId: string | undefined,\n): string | undefined {\n return modelStateFromConfigOptions(response?.configOptions)?.currentModelId ?? fallbackModelId;\n}\n\nexport async function applyRequestedModelIfAdvertised(params: {\n client: AcpClient;\n sessionId: string;\n requestedModel: string | undefined;\n models: SessionCreateResult[\"models\"];\n agentCommand?: string;\n timeoutMs?: number;\n onWarning?: (message: string) => void;\n}): Promise<{\n applied: boolean;\n response?: SetSessionConfigOptionResponse;\n}> {\n const requestedModel =\n typeof params.requestedModel === \"string\" ? params.requestedModel.trim() : \"\";\n if (!requestedModel) {\n return { applied: false };\n }\n const warning = assertRequestedModelSupported({\n requestedModel,\n models: params.models,\n agentCommand: params.agentCommand,\n context: \"apply\",\n });\n if (warning) {\n params.onWarning?.(warning);\n }\n if (!params.models) {\n return { applied: false };\n }\n if (params.models.currentModelId === requestedModel) {\n return { applied: true };\n }\n\n const response = await withTimeout(\n params.client.setSessionModel(params.sessionId, requestedModel, params.models),\n params.timeoutMs,\n );\n return { applied: true, response };\n}\n","import type { SessionConfigOption, SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport type { SessionCreateResult, SessionLoadResult } from \"../acp/client.js\";\nimport { modelStateFromConfigOptions } from \"../acp/model-support.js\";\nimport type { SessionAcpxState, SessionRecord } from \"../types.js\";\nimport { cloneSessionAcpxState } from \"./conversation-model.js\";\nimport {\n clearDesiredConfigOption,\n setCurrentModelId,\n syncAdvertisedModelState,\n} from \"./mode-preference.js\";\nimport {\n currentModelIdFromSetModelResponse,\n type applyRequestedModelIfAdvertised,\n} from \"./model-application.js\";\nimport { advertisedModelState, applyConfigOptionsModelState } from \"./model-state.js\";\n\ntype ConfigOptionsResult = Pick<SessionCreateResult | SessionLoadResult, \"configOptions\">;\n\nexport function applyConfigOptionsToState(\n state: SessionAcpxState | undefined,\n configOptions: SessionConfigOption[],\n): SessionAcpxState {\n const acpxState: SessionAcpxState = cloneSessionAcpxState(state) ?? {};\n applyConfigOptionsModelState(acpxState, configOptions);\n return acpxState;\n}\n\nexport function applyConfigOptionsToRecord(\n record: SessionRecord,\n result: ConfigOptionsResult | undefined,\n): void {\n const configOptions = result?.configOptions;\n if (!configOptions) {\n return;\n }\n\n record.acpx = applyConfigOptionsToState(record.acpx, configOptions);\n}\n\nexport function applyInitialModelSelection(\n record: SessionRecord,\n originalModels: SessionCreateResult[\"models\"],\n requestedModel: string | undefined,\n modelApplication: Awaited<ReturnType<typeof applyRequestedModelIfAdvertised>>,\n): void {\n applyConfigOptionsToRecord(record, modelApplication.response);\n syncAdvertisedModelState(\n record,\n modelApplication.response\n ? modelStateFromConfigOptions(modelApplication.response.configOptions)\n : originalModels,\n );\n if (modelApplication.applied) {\n setCurrentModelId(\n record,\n currentModelIdFromSetModelResponse(modelApplication.response, requestedModel),\n );\n }\n}\n\nfunction applyAcceptedConfigOptions(\n state: SessionAcpxState | undefined,\n response: SetSessionConfigOptionResponse | undefined,\n): SessionAcpxState {\n const next = cloneSessionAcpxState(state) ?? {};\n if (!response) {\n return next;\n }\n applyConfigOptionsModelState(next, response.configOptions);\n if (!next.desired_config_options) {\n return next;\n }\n // A control response can change sibling options. Reconcile only saved\n // selections; new/load snapshots must not replace preferences with defaults.\n const desired: Record<string, string> = {};\n for (const option of response.configOptions) {\n if (\n typeof option.currentValue === \"string\" &&\n Object.hasOwn(next.desired_config_options, option.id)\n ) {\n desired[option.id] = option.currentValue;\n }\n }\n if (Object.keys(desired).length > 0) {\n next.desired_config_options = desired;\n } else {\n delete next.desired_config_options;\n }\n return next;\n}\n\nexport function applyModelSelection(\n state: SessionAcpxState | undefined,\n modelId: string,\n response: SetSessionConfigOptionResponse | undefined,\n): SessionAcpxState {\n const modelConfigId = advertisedModelState(state)?.configId;\n const next = applyAcceptedConfigOptions(state, response);\n next.session_options = { ...next.session_options, model: modelId };\n next.current_model_id = currentModelIdFromSetModelResponse(response, modelId);\n clearDesiredConfigOption(next, modelConfigId ?? advertisedModelState(next)?.configId);\n return next;\n}\n\nexport function applyConfigOptionSelection(\n state: SessionAcpxState | undefined,\n configId: string,\n value: string,\n response: SetSessionConfigOptionResponse,\n modelConfigId = advertisedModelState(state)?.configId,\n): SessionAcpxState {\n if (\n configId === modelConfigId ||\n configId === modelStateFromConfigOptions(response.configOptions)?.configId\n ) {\n return applyModelSelection(state, value, response);\n }\n const next = cloneSessionAcpxState(state) ?? {};\n if (configId === \"mode\") {\n next.desired_mode_id = value;\n } else {\n next.desired_config_options = { ...next.desired_config_options, [configId]: value };\n }\n return applyAcceptedConfigOptions(next, response);\n}\n","import type { BigIntStats } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { withTempFile } from \"@openclaw/fs-safe/advanced\";\nimport { isHardlinkFallbackError } from \"@openclaw/fs-safe/durability\";\nimport { incrementPerfCounter } from \"../perf-metrics.js\";\nimport { isProcessAlive } from \"../process-liveness.js\";\nimport { sessionEventLockPath } from \"./event-log.js\";\n\nconst LOCK_RETRY_MS = 15;\nconst INCOMPLETE_RESERVATION_GRACE_MS = 15_000;\nlet lastCreatedAt = 0;\n\ntype LockSnapshot = { stat: BigIntStats; payload: string };\n\nasync function readLock(filePath: string): Promise<LockSnapshot | undefined> {\n try {\n const stat = await fs.lstat(filePath, { bigint: true });\n if (!stat.isFile()) {\n throw new Error(`Session turn lock is not a regular file: ${filePath}`);\n }\n return { stat, payload: await fs.readFile(filePath, \"utf8\") };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nfunction lockPid(payload: string): number | undefined {\n try {\n const value = JSON.parse(payload) as { pid?: unknown } | null;\n const pid = value?.pid;\n return typeof pid === \"number\" && Number.isInteger(pid) && pid > 0 ? pid : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function removeObservedLock(filePath: string, observed: LockSnapshot): Promise<boolean> {\n const current = await readLock(filePath);\n if (!current) {\n return true;\n }\n if (\n current.payload !== observed.payload ||\n current.stat.mtimeNs !== observed.stat.mtimeNs ||\n current.stat.size !== observed.stat.size\n ) {\n return false;\n }\n await fs.unlink(filePath).catch((error: NodeJS.ErrnoException) => {\n if (error.code !== \"ENOENT\") {\n throw error;\n }\n });\n return true;\n}\n\nasync function recoverAbandonedLock(filePath: string): Promise<void> {\n const observed = await readLock(filePath);\n if (!observed) {\n return;\n }\n const pid = lockPid(observed.payload);\n if (pid === process.pid || isProcessAlive(pid)) {\n return;\n }\n // A partial exclusive-create fallback is not evidence that its writer died.\n if (!pid && Date.now() - Number(observed.stat.mtimeMs) <= INCOMPLETE_RESERVATION_GRACE_MS) {\n return;\n }\n if (await removeObservedLock(filePath, observed)) {\n incrementPerfCounter(\"session.events.stale_lock_recovered\");\n }\n}\n\nasync function publishLock(filePath: string, payload: string, signal?: AbortSignal): Promise<void> {\n try {\n await withTempFile(\n { rootDir: path.dirname(filePath), prefix: \"session-turn\", fileName: \"lock\" },\n async (temporaryPath) => {\n await fs.writeFile(temporaryPath, payload, { encoding: \"utf8\", flag: \"wx\", mode: 0o600 });\n signal?.throwIfAborted();\n try {\n await fs.link(temporaryPath, filePath);\n } catch (error) {\n if (!isHardlinkFallbackError(error)) {\n throw error;\n }\n await fs.writeFile(filePath, payload, { encoding: \"utf8\", flag: \"wx\", mode: 0o600 });\n }\n },\n );\n } catch (error) {\n await removePublishedLock(filePath, payload).catch(() => {});\n throw error;\n }\n}\n\nasync function removePublishedLock(filePath: string, payload: string): Promise<void> {\n const current = await readLock(filePath);\n if (current?.payload === payload) {\n await removeObservedLock(filePath, current);\n }\n}\n\nasync function observePublishedLock(\n filePath: string,\n payload: string,\n signal?: AbortSignal,\n): Promise<AsyncDisposable> {\n try {\n const observed = await readLock(filePath);\n if (observed?.payload !== payload) {\n throw new Error(`Session turn ownership changed before admission: ${filePath}`);\n }\n signal?.throwIfAborted();\n return {\n [Symbol.asyncDispose]: async () => {\n await removeObservedLock(filePath, observed);\n },\n };\n } catch (error) {\n await removePublishedLock(filePath, payload).catch(() => {});\n throw error;\n }\n}\n\nexport async function acquireSessionTurn(\n recordId: string,\n signal?: AbortSignal,\n): Promise<AsyncDisposable> {\n const filePath = sessionEventLockPath(recordId);\n await fs.mkdir(path.dirname(filePath), { recursive: true, mode: 0o700 });\n // Keep the existing on-disk fields while distinguishing successive same-process owners.\n lastCreatedAt = Math.max(Date.now(), lastCreatedAt + 1);\n const payload = `${JSON.stringify({ pid: process.pid, created_at: new Date(lastCreatedAt).toISOString() }, null, 2)}\\n`;\n for (;;) {\n signal?.throwIfAborted();\n try {\n await publishLock(filePath, payload, signal);\n break;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n await recoverAbandonedLock(filePath);\n await delay(LOCK_RETRY_MS, undefined, { signal });\n }\n }\n return await observePublishedLock(filePath, payload, signal);\n}\n","import net from \"node:net\";\nimport type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { normalizeOutputError } from \"../../acp/error-normalization.js\";\nimport { recordPerfDuration } from \"../../perf-metrics.js\";\nimport { textPrompt } from \"../../prompt-content.js\";\nimport type {\n AcpClientOptions,\n NonInteractivePermissionPolicy,\n PermissionMode,\n PromptInput,\n SessionResumePolicy,\n} from \"../../types.js\";\nimport {\n parseQueueRequest,\n type QueueOwnerErrorMessage,\n type QueueOwnerMessage,\n type QueueRequest,\n} from \"./messages.js\";\nimport { queueRequestByteLimit, queueRequestExceedsLimit } from \"./request-limit.js\";\n\ntype QueueOwnerSocketLease = {\n socketPath: string;\n ownerGeneration?: number;\n};\n\nconst QUEUE_SOCKET_DRAIN_TIMEOUT_MS = 1_000;\n\nfunction makeQueueOwnerError(\n requestId: string,\n message: string,\n detailCode: string,\n options: {\n retryable?: boolean;\n } = {},\n): QueueOwnerErrorMessage {\n return {\n type: \"error\",\n requestId,\n ownerGeneration: undefined,\n code: \"RUNTIME\",\n detailCode,\n origin: \"queue\",\n retryable: options.retryable,\n message,\n };\n}\n\nfunction makeQueueOwnerErrorFromUnknown(\n requestId: string,\n error: unknown,\n detailCode: string,\n options: {\n retryable?: boolean;\n } = {},\n): QueueOwnerErrorMessage {\n const normalized = normalizeOutputError(error, {\n defaultCode: \"RUNTIME\",\n origin: \"queue\",\n detailCode,\n retryable: options.retryable,\n });\n\n return {\n type: \"error\",\n requestId,\n code: normalized.code,\n detailCode: normalized.detailCode,\n origin: normalized.origin,\n message: normalized.message,\n retryable: normalized.retryable,\n acp: normalized.acp,\n };\n}\n\nfunction writeQueueMessage(socket: net.Socket, message: QueueOwnerMessage): void {\n if (socket.destroyed || !socket.writable) {\n return;\n }\n socket.write(`${JSON.stringify(message)}\\n`);\n}\n\nexport type QueueTask = {\n requestId: string;\n message: string;\n prompt: PromptInput;\n permissionMode: PermissionMode;\n resumePolicy?: SessionResumePolicy;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n permissionPolicy?: AcpClientOptions[\"permissionPolicy\"];\n timeoutMs?: number;\n suppressSdkConsoleErrors?: boolean;\n promptRetries?: number;\n sessionOptions?: NonNullable<AcpClientOptions[\"sessionOptions\"]>;\n waitForCompletion: boolean;\n reportPromptStarted?: boolean;\n enqueuedAt: number;\n send: (message: QueueOwnerMessage) => void;\n close: () => void;\n};\n\nexport type QueueOwnerControlHandlers = {\n cancelPrompt: () => Promise<boolean>;\n closeSession: (timeoutMs?: number) => Promise<boolean>;\n setSessionMode: (modeId: string, timeoutMs?: number) => Promise<void>;\n setSessionModel: (\n modelId: string,\n timeoutMs?: number,\n ) => Promise<SetSessionConfigOptionResponse | undefined>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n timeoutMs?: number,\n ) => Promise<SetSessionConfigOptionResponse>;\n};\n\ntype SessionQueueOwnerOptions = {\n maxQueueDepth: number;\n maxRequestBytes?: number;\n onQueueDepthChanged?: (queueDepth: number) => void;\n};\n\nexport class SessionQueueOwner {\n private readonly server: net.Server;\n private readonly controlHandlers: QueueOwnerControlHandlers;\n private readonly ownerGeneration?: number;\n private readonly maxQueueDepth: number;\n private readonly maxRequestBytes?: number;\n private readonly onQueueDepthChanged?: (queueDepth: number) => void;\n private readonly pending: QueueTask[] = [];\n private activeTask?: QueueTask;\n private readonly waiters: Array<(task: QueueTask | undefined) => void> = [];\n private readonly sockets = new Set<net.Socket>();\n private readonly taskSockets = new Set<net.Socket>();\n private readonly drainingSockets = new Set<net.Socket>();\n private closed = false;\n\n private constructor(\n server: net.Server,\n controlHandlers: QueueOwnerControlHandlers,\n lease: QueueOwnerSocketLease,\n options: SessionQueueOwnerOptions,\n ) {\n this.server = server;\n this.controlHandlers = controlHandlers;\n this.ownerGeneration = lease.ownerGeneration;\n this.maxQueueDepth = Math.max(1, Math.round(options.maxQueueDepth));\n this.maxRequestBytes = queueRequestByteLimit(options.maxRequestBytes?.toString());\n this.onQueueDepthChanged = options.onQueueDepthChanged;\n }\n\n static async start(\n lease: QueueOwnerSocketLease,\n controlHandlers: QueueOwnerControlHandlers,\n options: SessionQueueOwnerOptions = {\n maxQueueDepth: 16,\n },\n ): Promise<SessionQueueOwner> {\n const ownerRef: { current: SessionQueueOwner | undefined } = { current: undefined };\n const server = net.createServer((socket) => {\n ownerRef.current?.handleConnection(socket);\n });\n ownerRef.current = new SessionQueueOwner(server, controlHandlers, lease, options);\n\n await new Promise<void>((resolve, reject) => {\n const onListening = () => {\n server.off(\"error\", onError);\n resolve();\n };\n const onError = (error: Error) => {\n server.off(\"listening\", onListening);\n reject(error);\n };\n\n server.once(\"listening\", onListening);\n server.once(\"error\", onError);\n server.listen(lease.socketPath);\n });\n\n return ownerRef.current;\n }\n\n beginShutdown(): void {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n for (const waiter of this.waiters.splice(0)) {\n waiter(undefined);\n }\n\n for (const task of this.pending.splice(0)) {\n if (task.waitForCompletion) {\n task.send(\n makeQueueOwnerError(\n task.requestId,\n \"Queue owner shutting down before prompt execution\",\n \"QUEUE_OWNER_SHUTTING_DOWN\",\n {\n retryable: true,\n },\n ),\n );\n }\n task.close();\n }\n for (const socket of this.sockets) {\n if (!this.taskSockets.has(socket) && !this.drainingSockets.has(socket)) {\n socket.destroy();\n }\n }\n this.emitQueueDepth();\n }\n\n async close(): Promise<void> {\n this.beginShutdown();\n\n await new Promise<void>((resolve) => {\n const forceCloseTimer = setTimeout(() => {\n for (const socket of this.sockets) {\n socket.destroy();\n }\n }, QUEUE_SOCKET_DRAIN_TIMEOUT_MS);\n forceCloseTimer.unref();\n this.server.close(() => {\n clearTimeout(forceCloseTimer);\n resolve();\n });\n });\n }\n\n async nextTask(timeoutMs?: number): Promise<QueueTask | undefined> {\n if (this.pending.length > 0) {\n const task = this.pending.shift();\n this.emitQueueDepth();\n if (task) {\n this.activeTask = task;\n recordPerfDuration(\"queue.owner.wait_ms\", Date.now() - task.enqueuedAt);\n }\n return task;\n }\n if (this.closed) {\n return undefined;\n }\n\n return await new Promise<QueueTask | undefined>((resolve) => {\n const shouldTimeout = timeoutMs != null;\n const timer =\n shouldTimeout &&\n setTimeout(\n () => {\n const index = this.waiters.indexOf(waiter);\n if (index >= 0) {\n this.waiters.splice(index, 1);\n }\n resolve(undefined);\n },\n Math.max(0, timeoutMs),\n );\n\n const waiter = (task: QueueTask | undefined) => {\n if (timer) {\n clearTimeout(timer);\n }\n resolve(task);\n };\n\n this.waiters.push(waiter);\n });\n }\n\n queueDepth(): number {\n return this.pending.length;\n }\n\n completeTask(task: QueueTask): void {\n if (this.activeTask === task) {\n this.activeTask = undefined;\n }\n }\n\n private async cancelPrompt(targetRequestId?: string): Promise<boolean> {\n if (targetRequestId === undefined) {\n return await this.controlHandlers.cancelPrompt();\n }\n const index = this.pending.findIndex((task) => task.requestId === targetRequestId);\n if (index >= 0) {\n const [task] = this.pending.splice(index, 1);\n task.send(\n makeQueueOwnerError(\n task.requestId,\n \"Prompt cancelled before execution\",\n \"QUEUE_REQUEST_CANCELLED\",\n {\n retryable: false,\n },\n ),\n );\n task.close();\n this.emitQueueDepth();\n return true;\n }\n return this.activeTask?.requestId === targetRequestId\n ? await this.controlHandlers.cancelPrompt()\n : false;\n }\n\n private emitQueueDepth(): void {\n this.onQueueDepthChanged?.(this.pending.length);\n }\n\n private enqueue(task: QueueTask): boolean {\n if (this.closed) {\n task.send(\n makeQueueOwnerError(\n task.requestId,\n \"Queue owner is shutting down\",\n \"QUEUE_OWNER_SHUTTING_DOWN\",\n {\n retryable: true,\n },\n ),\n );\n task.close();\n return false;\n }\n\n if (\n this.activeTask?.requestId === task.requestId ||\n this.pending.some((queued) => queued.requestId === task.requestId)\n ) {\n task.send(\n makeQueueOwnerError(\n task.requestId,\n \"Request is already queued or active\",\n \"QUEUE_REQUEST_DUPLICATE\",\n {\n retryable: false,\n },\n ),\n );\n task.close();\n return false;\n }\n\n const waiter = this.waiters.shift();\n if (waiter) {\n this.activeTask = task;\n waiter(task);\n return true;\n }\n\n if (this.pending.length >= this.maxQueueDepth) {\n task.send({\n ...makeQueueOwnerError(\n task.requestId,\n `Queue owner is overloaded (${this.pending.length}/${this.maxQueueDepth} queued)`,\n \"QUEUE_OWNER_OVERLOADED\",\n {\n retryable: true,\n },\n ),\n ownerGeneration: this.ownerGeneration,\n });\n task.close();\n return false;\n }\n\n this.pending.push(task);\n this.emitQueueDepth();\n return true;\n }\n\n private handleControlRequest<TMessage extends QueueOwnerMessage>(options: {\n socket: net.Socket;\n requestId: string;\n run: () => Promise<TMessage>;\n }): void {\n writeQueueMessage(options.socket, {\n type: \"accepted\",\n requestId: options.requestId,\n ownerGeneration: this.ownerGeneration,\n });\n\n void options\n .run()\n .then((message) => {\n writeQueueMessage(options.socket, {\n ...message,\n ownerGeneration: this.ownerGeneration,\n });\n })\n .catch((error) => {\n writeQueueMessage(options.socket, {\n ...makeQueueOwnerErrorFromUnknown(\n options.requestId,\n error,\n \"QUEUE_CONTROL_REQUEST_FAILED\",\n ),\n ownerGeneration: this.ownerGeneration,\n });\n })\n .finally(() => {\n this.endSocket(options.socket);\n });\n }\n\n private endSocket(socket: net.Socket): void {\n if (socket.destroyed || this.drainingSockets.has(socket)) {\n return;\n }\n this.taskSockets.delete(socket);\n this.drainingSockets.add(socket);\n socket.end(() => {\n this.drainingSockets.delete(socket);\n socket.destroy();\n });\n }\n\n private failRequest(\n socket: net.Socket,\n requestId: string,\n message: string,\n detailCode: string,\n ): void {\n writeQueueMessage(socket, {\n ...makeQueueOwnerError(requestId, message, detailCode, {\n retryable: false,\n }),\n ownerGeneration: this.ownerGeneration,\n });\n this.endSocket(socket);\n }\n\n private parseRequestLine(socket: net.Socket, line: string): QueueRequest | undefined {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n this.failRequest(\n socket,\n \"unknown\",\n \"Invalid queue request payload\",\n \"QUEUE_REQUEST_PAYLOAD_INVALID_JSON\",\n );\n return undefined;\n }\n const request = parseQueueRequest(parsed);\n if (!request) {\n this.failRequest(socket, \"unknown\", \"Invalid queue request\", \"QUEUE_REQUEST_INVALID\");\n }\n return request ?? undefined;\n }\n\n private rejectStaleOwnerGeneration(socket: net.Socket, request: QueueRequest): boolean {\n if (\n request.ownerGeneration === undefined ||\n this.ownerGeneration === undefined ||\n request.ownerGeneration === this.ownerGeneration\n ) {\n return false;\n }\n this.failRequest(\n socket,\n request.requestId,\n \"Queue request targeted a stale queue owner generation\",\n \"QUEUE_OWNER_GENERATION_MISMATCH\",\n );\n return true;\n }\n\n private rejectClosedOwner(socket: net.Socket, request: QueueRequest): boolean {\n if (!this.closed) {\n return false;\n }\n writeQueueMessage(socket, {\n ...makeQueueOwnerError(\n request.requestId,\n \"Queue owner is shutting down\",\n \"QUEUE_OWNER_CLOSED\",\n {\n retryable: true,\n },\n ),\n ownerGeneration: this.ownerGeneration,\n });\n this.endSocket(socket);\n return true;\n }\n\n private handleControlQueueRequest(socket: net.Socket, request: QueueRequest): boolean {\n if (request.type === \"cancel_prompt\") {\n this.handleControlRequest({\n socket,\n requestId: request.requestId,\n run: async () => ({\n type: \"cancel_result\",\n requestId: request.requestId,\n cancelled: await this.cancelPrompt(request.targetRequestId),\n }),\n });\n return true;\n }\n if (request.type === \"close_session\") {\n this.handleControlRequest({\n socket,\n requestId: request.requestId,\n run: async () => ({\n type: \"close_session_result\",\n requestId: request.requestId,\n closed: await this.controlHandlers.closeSession(request.timeoutMs),\n }),\n });\n return true;\n }\n return this.handleSessionControlQueueRequest(socket, request);\n }\n\n private handleSessionControlQueueRequest(socket: net.Socket, request: QueueRequest): boolean {\n if (request.type === \"set_mode\") {\n this.handleControlRequest({\n socket,\n requestId: request.requestId,\n run: async () => {\n await this.controlHandlers.setSessionMode(request.modeId, request.timeoutMs);\n return {\n type: \"set_mode_result\",\n requestId: request.requestId,\n modeId: request.modeId,\n };\n },\n });\n return true;\n }\n if (request.type === \"set_model\") {\n this.handleControlRequest({\n socket,\n requestId: request.requestId,\n run: async () => {\n const response = await this.controlHandlers.setSessionModel(\n request.modelId,\n request.timeoutMs,\n );\n return {\n type: \"set_model_result\",\n requestId: request.requestId,\n modelId: request.modelId,\n response,\n };\n },\n });\n return true;\n }\n if (request.type === \"set_config_option\") {\n this.handleControlRequest({\n socket,\n requestId: request.requestId,\n run: async () => ({\n type: \"set_config_option_result\",\n requestId: request.requestId,\n response: await this.controlHandlers.setSessionConfigOption(\n request.configId,\n request.value,\n request.timeoutMs,\n ),\n }),\n });\n return true;\n }\n return false;\n }\n\n private enqueuePromptRequest(\n socket: net.Socket,\n request: Extract<QueueRequest, { type: \"submit_prompt\" }>,\n ): void {\n this.taskSockets.add(socket);\n const task: QueueTask = {\n requestId: request.requestId,\n message: request.message,\n prompt: request.prompt ?? textPrompt(request.message),\n permissionMode: request.permissionMode,\n resumePolicy: request.resumePolicy,\n nonInteractivePermissions: request.nonInteractivePermissions,\n permissionPolicy: request.permissionPolicy,\n timeoutMs: request.timeoutMs,\n suppressSdkConsoleErrors: request.suppressSdkConsoleErrors,\n promptRetries: request.promptRetries,\n sessionOptions: request.sessionOptions,\n waitForCompletion: request.waitForCompletion,\n reportPromptStarted: request.reportPromptStarted,\n enqueuedAt: Date.now(),\n send: (message) => {\n writeQueueMessage(socket, {\n ...message,\n ownerGeneration: this.ownerGeneration,\n });\n },\n close: () => {\n this.endSocket(socket);\n },\n };\n\n const enqueued = this.enqueue(task);\n if (!enqueued) {\n return;\n }\n\n writeQueueMessage(socket, {\n type: \"accepted\",\n requestId: request.requestId,\n ownerGeneration: this.ownerGeneration,\n });\n if (!request.waitForCompletion) {\n task.close();\n }\n }\n\n private handleConnection(socket: net.Socket): void {\n this.sockets.add(socket);\n socket.setEncoding(\"utf8\");\n socket.once(\"close\", () => {\n this.sockets.delete(socket);\n this.taskSockets.delete(socket);\n this.drainingSockets.delete(socket);\n });\n\n let buffer = \"\";\n let handled = false;\n\n const processLine = (line: string): void => {\n if (handled) {\n return;\n }\n handled = true;\n\n const request = this.parseRequestLine(socket, line);\n if (\n !request ||\n this.rejectClosedOwner(socket, request) ||\n this.rejectStaleOwnerGeneration(socket, request)\n ) {\n return;\n }\n if (this.handleControlQueueRequest(socket, request)) {\n return;\n }\n if (request.type !== \"submit_prompt\") {\n this.failRequest(\n socket,\n request.requestId,\n \"Invalid queue request\",\n \"QUEUE_REQUEST_INVALID\",\n );\n return;\n }\n this.enqueuePromptRequest(socket, request);\n };\n\n socket.on(\"data\", (chunk: string) => {\n buffer += chunk;\n\n let index = buffer.indexOf(\"\\n\");\n while (index >= 0) {\n const rawLine = buffer.slice(0, index);\n if (this.rejectOversizedRequest(socket, rawLine)) {\n return;\n }\n const line = rawLine.trim();\n buffer = buffer.slice(index + 1);\n\n if (line.length > 0) {\n processLine(line);\n }\n\n index = buffer.indexOf(\"\\n\");\n }\n this.rejectOversizedRequest(socket, buffer);\n });\n\n socket.on(\"error\", () => {\n // no-op: queue processing continues even if client disconnects\n });\n }\n\n private rejectOversizedRequest(socket: net.Socket, line: string): boolean {\n if (!queueRequestExceedsLimit(line, this.maxRequestBytes)) {\n return false;\n }\n socket.destroy();\n return true;\n }\n}\n","import type { SessionConfigOption } from \"@agentclientprotocol/sdk\";\nimport type { AcpClient } from \"../../acp/client.js\";\nimport {\n extractAcpError,\n formatErrorMessage,\n isAcpQueryClosedBeforeResponseError,\n isAcpResourceNotFoundError,\n} from \"../../acp/error-normalization.js\";\nimport {\n assertRequestedModelSupported,\n modelStateFromConfigOptions,\n type SessionModelState,\n} from \"../../acp/model-support.js\";\nimport {\n assertControlAuthority,\n InterruptedError,\n TimeoutError,\n withTimeout,\n type AcpControlAuthority,\n} from \"../../async-control.js\";\nimport {\n SessionConfigOptionReplayError,\n SessionModeReplayError,\n SessionModelReplayError,\n SessionResumeRequiredError,\n} from \"../../errors.js\";\nimport { incrementPerfCounter } from \"../../perf-metrics.js\";\nimport { isProcessAlive } from \"../../process-liveness.js\";\nimport {\n applyConfigOptionsToRecord,\n applyConfigOptionSelection,\n applyModelSelection,\n} from \"../../session/config-options.js\";\nimport { cloneSessionAcpxState } from \"../../session/conversation-model.js\";\nimport {\n getDesiredConfigOptions,\n getDesiredModeId,\n getDesiredModelId,\n syncAdvertisedModelState,\n} from \"../../session/mode-preference.js\";\nimport {\n advertisedModelState,\n clearAdvertisedModelState,\n removeModelConfigOptions,\n} from \"../../session/model-state.js\";\nimport type { SessionRecord, SessionResumePolicy } from \"../../types.js\";\nimport {\n applyLifecycleSnapshotToRecord,\n reconcileAgentSessionId,\n sessionHasAgentMessages,\n} from \"./lifecycle.js\";\n\nexport type ConnectedSessionController = {\n hasActivePrompt: () => boolean;\n requestCancelActivePrompt: () => Promise<boolean>;\n setSessionMode: (modeId: string) => Promise<void>;\n setSessionModel: (modelId: string) => ReturnType<AcpClient[\"setSessionModel\"]>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n ) => ReturnType<AcpClient[\"setSessionConfigOption\"]>;\n};\n\nexport type ConnectAndLoadSessionOptions = {\n client: AcpClient;\n record: SessionRecord;\n resumePolicy?: SessionResumePolicy;\n replacingConfigOption?: {\n key: string;\n resolve?: (record: SessionRecord) => string;\n };\n timeoutMs?: number;\n authority?: AcpControlAuthority;\n verbose?: boolean;\n suppressWarnings?: boolean;\n activeController: ConnectedSessionController;\n onClientAvailable?: (controller: ConnectedSessionController) => void;\n onConnectedRecord?: (record: SessionRecord) => void;\n onSessionIdResolved?: (sessionId: string) => void;\n};\n\nexport type ConnectAndLoadSessionResult = {\n sessionId: string;\n agentSessionId?: string;\n resumed: boolean;\n loadError?: string;\n};\n\nconst SESSION_LOAD_UNSUPPORTED_CODES = new Set([-32601, -32602]);\n\ntype ReplayState = {\n authority?: AcpControlAuthority;\n acknowledged: boolean;\n isAuthorityFailure: (error: unknown) => boolean;\n};\n\nfunction createReplayState(authority?: AcpControlAuthority): ReplayState {\n let failure: { error: unknown } | undefined;\n return {\n acknowledged: false,\n authority: authority\n ? {\n assertActive() {\n try {\n assertControlAuthority(authority);\n } catch (error) {\n failure = { error };\n throw error;\n }\n },\n }\n : undefined,\n isAuthorityFailure: (error) => failure !== undefined && failure.error === error,\n };\n}\n\nfunction rethrowAuthorityFailure(replay: ReplayState, error: unknown): void {\n if (replay.isAuthorityFailure(error)) {\n throw error;\n }\n}\n\nfunction shouldFallbackToNewSession(error: unknown, record: SessionRecord): boolean {\n if (isHardReconnectFailure(error)) {\n return false;\n }\n const acp = extractAcpError(error);\n if (isAcpResourceNotFoundError(error) || isUnsupportedSessionLoadAcpError(acp)) {\n return true;\n }\n\n return !sessionHasAgentMessages(record) && isFallbackSafeEmptySessionError(error, acp);\n}\n\nfunction isHardReconnectFailure(error: unknown): boolean {\n return error instanceof TimeoutError || error instanceof InterruptedError;\n}\n\nfunction isUnsupportedSessionLoadAcpError(acp: ReturnType<typeof extractAcpError>): boolean {\n return !!acp && SESSION_LOAD_UNSUPPORTED_CODES.has(acp.code);\n}\n\nfunction isFallbackSafeEmptySessionError(\n error: unknown,\n acp: ReturnType<typeof extractAcpError>,\n): boolean {\n return isAcpQueryClosedBeforeResponseError(error) || acp?.code === -32603;\n}\n\nfunction requiresSameSession(resumePolicy: SessionResumePolicy | undefined): boolean {\n return resumePolicy === \"same-session-only\";\n}\n\nfunction makeSessionResumeRequiredError(params: {\n record: SessionRecord;\n reason: string;\n cause?: unknown;\n}): SessionResumeRequiredError {\n return new SessionResumeRequiredError(\n `Persistent ACP session ${params.record.acpSessionId} could not be resumed: ${params.reason}`,\n {\n cause: params.cause instanceof Error ? params.cause : undefined,\n },\n );\n}\n\nasync function replayDesiredMode(params: {\n client: AcpClient;\n sessionId: string;\n desiredModeId: string | undefined;\n replay: ReplayState;\n previousSessionId: string;\n timeoutMs?: number;\n verbose?: boolean;\n}): Promise<void> {\n if (!params.desiredModeId) {\n return;\n }\n\n try {\n await withTimeout(\n params.client.setSessionMode(params.sessionId, params.desiredModeId, params.replay.authority),\n params.timeoutMs,\n );\n params.replay.acknowledged = true;\n if (params.verbose) {\n process.stderr.write(\n `[acpx] replayed desired mode ${params.desiredModeId} on fresh ACP session ${params.sessionId} (previous ${params.previousSessionId})\\n`,\n );\n }\n } catch (error) {\n rethrowAuthorityFailure(params.replay, error);\n throw new SessionModeReplayError(\n `Failed to replay saved session mode ${params.desiredModeId} on fresh ACP session ${params.sessionId}: ${formatErrorMessage(error)}`,\n {\n cause: error instanceof Error ? error : undefined,\n retryable: true,\n },\n );\n }\n}\n\nfunction canReplayModel(\n desiredModelId: string | undefined,\n models: SessionModelState | undefined,\n createdFreshSession: boolean,\n): desiredModelId is string {\n // Resume metadata is optional; omission alone does not revoke saved model support.\n return Boolean(desiredModelId) && (createdFreshSession || models !== undefined);\n}\n\nasync function replayDesiredModel(params: {\n client: AcpClient;\n sessionId: string;\n desiredModelId: string | undefined;\n replay: ReplayState;\n previousSessionId: string;\n record: SessionRecord;\n models: import(\"../../acp/client.js\").SessionLoadResult[\"models\"] | undefined;\n createdFreshSession: boolean;\n timeoutMs?: number;\n verbose?: boolean;\n suppressWarnings?: boolean;\n}): Promise<ModelReplayResult> {\n if (!canReplayModel(params.desiredModelId, params.models, params.createdFreshSession)) {\n return { replayed: false };\n }\n\n try {\n const warning = assertRequestedModelSupported({\n requestedModel: params.desiredModelId,\n models: params.models,\n agentCommand: params.record.agentCommand,\n context: \"replay\",\n });\n emitModelSupportWarning(warning, params.suppressWarnings);\n if (!params.models) {\n return { replayed: false };\n }\n // Reassert even an unchanged model: its acknowledgement reconciles saved\n // sibling selections left invalid by earlier model switches.\n const response = await withTimeout(\n params.client.setSessionModel(\n params.sessionId,\n params.desiredModelId,\n params.models,\n params.replay.authority,\n ),\n params.timeoutMs,\n );\n params.replay.acknowledged = true;\n params.record.acpx = applyModelSelection(params.record.acpx, params.desiredModelId, response);\n const models = response\n ? modelStateFromConfigOptions(response.configOptions)\n : { ...params.models, currentModelId: params.desiredModelId };\n if (params.verbose) {\n process.stderr.write(\n `[acpx] replayed desired model ${params.desiredModelId} on ACP session ${params.sessionId} (previous ${params.previousSessionId})\\n`,\n );\n }\n return {\n replayed: true,\n models,\n configOptions: response?.configOptions,\n };\n } catch (error) {\n rethrowAuthorityFailure(params.replay, error);\n throw new SessionModelReplayError(\n `Failed to replay saved session model ${params.desiredModelId} on ACP session ${params.sessionId}: ${formatErrorMessage(error)}`,\n {\n cause: error instanceof Error ? error : undefined,\n retryable: true,\n },\n );\n }\n}\n\nfunction emitModelSupportWarning(warning: string | undefined, suppressWarnings?: boolean): void {\n if (warning && !suppressWarnings) {\n process.stderr.write(`[acpx] warning: ${warning}\\n`);\n }\n}\n\ntype ModelReplayResult =\n | { replayed: false; configOptions?: undefined }\n | {\n replayed: true;\n models: SessionModelState | undefined;\n configOptions: SessionConfigOption[] | undefined;\n };\n\ntype ConfigReplayResult =\n | { replayed: false }\n | {\n replayed: true;\n models: SessionModelState | undefined;\n };\n\ntype PreferenceReplayResult = {\n modelReplay: ModelReplayResult;\n configReplay: ConfigReplayResult;\n};\n\nasync function replayDesiredConfigOptions(params: {\n client: AcpClient;\n record: SessionRecord;\n sessionId: string;\n desiredConfigOptions: Record<string, string>;\n replay: ReplayState;\n acceptedConfigOptions?: SessionConfigOption[];\n replacingConfigOption?: ConnectAndLoadSessionOptions[\"replacingConfigOption\"];\n previousSessionId: string;\n timeoutMs?: number;\n verbose?: boolean;\n}): Promise<ConfigReplayResult> {\n let result: ConfigReplayResult = { replayed: false };\n let acceptedConfigOptions = params.acceptedConfigOptions;\n const replacingKey = resolveReplacingConfigOptionId(params.replacingConfigOption, params.record);\n for (const [configId, value] of Object.entries(params.desiredConfigOptions)) {\n // Each acknowledgement can retire later selections. Startup snapshots alone\n // must not replace saved preferences with the adapter's defaults.\n if (\n configId === replacingKey ||\n (acceptedConfigOptions &&\n !acceptsSavedConfigValue(\n acceptedConfigOptions.find((option) => option.id === configId),\n value,\n ))\n ) {\n continue;\n }\n try {\n const response = await withTimeout(\n params.client.setSessionConfigOption(\n params.sessionId,\n configId,\n value,\n params.replay.authority,\n ),\n params.timeoutMs,\n );\n params.replay.acknowledged = true;\n params.record.acpx = applyConfigOptionSelection(\n params.record.acpx,\n configId,\n value,\n response,\n );\n acceptedConfigOptions = response.configOptions;\n result = {\n replayed: true,\n models: modelStateFromConfigOptions(response.configOptions),\n };\n if (params.verbose) {\n process.stderr.write(\n `[acpx] replayed desired config option ${configId} on ACP session ${params.sessionId} (previous ${params.previousSessionId})\\n`,\n );\n }\n } catch (error) {\n rethrowAuthorityFailure(params.replay, error);\n throw new SessionConfigOptionReplayError(\n `Failed to replay saved session config option ${configId} on ACP session ${params.sessionId}: ${formatErrorMessage(error)}`,\n {\n cause: error instanceof Error ? error : undefined,\n retryable: true,\n },\n );\n }\n }\n return result;\n}\n\nfunction restoreOriginalSessionState(params: {\n record: SessionRecord;\n sessionId: string;\n agentSessionId: string | undefined;\n}): void {\n params.record.acpSessionId = params.sessionId;\n params.record.agentSessionId = params.agentSessionId;\n}\n\nexport async function connectAndLoadSession(\n options: ConnectAndLoadSessionOptions,\n): Promise<ConnectAndLoadSessionResult> {\n const record = options.record;\n const client = options.client;\n const sameSessionOnly = requiresSameSession(options.resumePolicy) || Boolean(record.importedFrom);\n const originalSessionId = record.acpSessionId;\n const originalAgentSessionId = record.agentSessionId;\n const originalAcpx = cloneSessionAcpxState(record.acpx);\n const desiredModeId = getDesiredModeId(record.acpx);\n const desiredModelId = getDesiredModelId(record.acpx);\n const desiredConfigOptions = getDesiredConfigOptions(record.acpx);\n const storedProcessAlive = isProcessAlive(record.pid);\n const shouldReconnect = Boolean(record.pid) && !storedProcessAlive;\n\n logReconnectAttempt(record, storedProcessAlive, shouldReconnect, options.verbose);\n\n const reusingLoadedSession = client.hasReusableSession(record.acpSessionId);\n if (reusingLoadedSession) {\n incrementPerfCounter(\"runtime.connect_and_load.reused_session\");\n } else {\n await withTimeout(client.start(), options.timeoutMs);\n }\n options.onClientAvailable?.(options.activeController);\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n record.closed = false;\n record.closedAt = undefined;\n options.onConnectedRecord?.(record);\n\n const loadState = await loadOrCreateRuntimeSession({\n client,\n record,\n reusingLoadedSession,\n sameSessionOnly,\n timeoutMs: options.timeoutMs,\n });\n const {\n resumed,\n loadError,\n sessionId,\n createdFreshSession,\n pendingAgentSessionId,\n sessionModels,\n } = loadState;\n\n const preferenceReplay = await replaySessionPreferences({\n client,\n record,\n createdFreshSession,\n reusingLoadedSession,\n replacingConfigOption: options.replacingConfigOption,\n sessionId,\n pendingAgentSessionId,\n originalSessionId,\n originalAgentSessionId,\n originalAcpx,\n desiredModeId,\n desiredModelId,\n desiredConfigOptions,\n sessionModels,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n suppressWarnings: options.suppressWarnings,\n authority: options.authority,\n });\n\n applyReconnectedModelState(\n record,\n resolveModelsAfterReplay(preferenceReplay, sessionModels),\n resolveConfigOptionsPresenceAfterReplay(preferenceReplay, loadState.configOptionsPresent),\n loadState.legacyModelMetadataPresent,\n createdFreshSession,\n );\n\n options.onSessionIdResolved?.(sessionId);\n\n return {\n sessionId,\n agentSessionId: record.agentSessionId,\n resumed,\n loadError,\n };\n}\n\nfunction resolveModelsAfterReplay(\n replay: PreferenceReplayResult,\n initialModels: SessionModelState | undefined,\n): SessionModelState | undefined {\n if (replay.configReplay.replayed) {\n return (\n replay.configReplay.models ??\n preserveLegacyModels(replay.modelReplay.replayed ? replay.modelReplay.models : initialModels)\n );\n }\n return replay.modelReplay.replayed ? replay.modelReplay.models : initialModels;\n}\n\nfunction preserveLegacyModels(\n models: SessionModelState | undefined,\n): SessionModelState | undefined {\n return models && !models.configId ? models : undefined;\n}\n\nfunction resolveConfigOptionsPresenceAfterReplay(\n replay: PreferenceReplayResult,\n initiallyPresent: boolean,\n): boolean {\n return (\n initiallyPresent ||\n replay.configReplay.replayed ||\n replay.modelReplay.configOptions !== undefined\n );\n}\n\nfunction applyReconnectedModelState(\n record: SessionRecord,\n sessionModels: import(\"../../acp/client.js\").SessionLoadResult[\"models\"],\n configOptionsPresent: boolean,\n legacyModelMetadataPresent: boolean,\n createdFreshSession: boolean,\n): void {\n clearOmittedFreshSessionConfigOptions(record, createdFreshSession, configOptionsPresent);\n if (sessionModels) {\n if (legacyModelMetadataPresent && !sessionModels.configId && record.acpx) {\n removeModelConfigOptions(record.acpx);\n }\n syncAdvertisedModelState(record, sessionModels);\n } else {\n clearRemovedModelState(record, legacyModelMetadataPresent || createdFreshSession);\n }\n}\n\nfunction clearOmittedFreshSessionConfigOptions(\n record: SessionRecord,\n createdFreshSession: boolean,\n configOptionsPresent: boolean,\n): void {\n if (createdFreshSession && !configOptionsPresent && record.acpx) {\n delete record.acpx.config_options;\n }\n}\n\nfunction clearRemovedModelState(record: SessionRecord, shouldClear: boolean): void {\n if (shouldClear && record.acpx) {\n clearAdvertisedModelState(record.acpx);\n }\n}\n\nfunction logReconnectAttempt(\n record: SessionRecord,\n storedProcessAlive: boolean,\n shouldReconnect: boolean,\n verbose: boolean | undefined,\n): void {\n if (!verbose) {\n return;\n }\n if (storedProcessAlive) {\n process.stderr.write(\n `[acpx] saved session pid ${record.pid} is running; reconnecting to saved ACP session\\n`,\n );\n return;\n }\n if (shouldReconnect) {\n process.stderr.write(\n `[acpx] saved session pid ${record.pid} is dead; respawning agent and attempting session reconnect\\n`,\n );\n }\n}\n\nfunction replacesModel(\n replacingConfigOption: ConnectAndLoadSessionOptions[\"replacingConfigOption\"],\n models: SessionModelState | undefined,\n originalAcpx: SessionRecord[\"acpx\"],\n): boolean {\n // Metadata may be omitted on resume; either advertisement identifies the\n // model replacement that must bypass obsolete model and config preferences.\n const key = replacingConfigOption?.key;\n return (\n key !== undefined &&\n (key === \"model\" ||\n key === models?.configId ||\n key === advertisedModelState(originalAcpx)?.configId)\n );\n}\n\nfunction acceptsSavedConfigValue(option: SessionConfigOption | undefined, value: string): boolean {\n if (!option || option.type !== \"select\") {\n return false;\n }\n return (\n option.currentValue === value ||\n option.options.some((entry) =>\n \"options\" in entry\n ? entry.options.some((choice) => choice.value === value)\n : entry.value === value,\n )\n );\n}\n\nfunction resolveReplacingConfigOptionId(\n replacement: ConnectAndLoadSessionOptions[\"replacingConfigOption\"],\n record: SessionRecord,\n): string | undefined {\n return replacement?.resolve?.(record) ?? replacement?.key;\n}\n\ntype ReplaySessionPreferencesOptions = {\n client: AcpClient;\n record: SessionRecord;\n createdFreshSession: boolean;\n reusingLoadedSession: boolean;\n replacingConfigOption?: ConnectAndLoadSessionOptions[\"replacingConfigOption\"];\n sessionId: string;\n pendingAgentSessionId: string | undefined;\n originalSessionId: string;\n originalAgentSessionId: string | undefined;\n originalAcpx: SessionRecord[\"acpx\"];\n desiredModeId: string | undefined;\n desiredModelId: string | undefined;\n desiredConfigOptions: Record<string, string>;\n sessionModels: import(\"../../acp/client.js\").SessionLoadResult[\"models\"];\n timeoutMs?: number;\n verbose?: boolean;\n suppressWarnings?: boolean;\n authority?: AcpControlAuthority;\n};\n\nasync function replaySessionPreferences(\n params: ReplaySessionPreferencesOptions,\n): Promise<PreferenceReplayResult> {\n if (params.reusingLoadedSession) {\n return {\n modelReplay: { replayed: false },\n configReplay: { replayed: false },\n };\n }\n\n let modelReplay: ModelReplayResult = { replayed: false };\n let configReplay: ConfigReplayResult = { replayed: false };\n const replay = createReplayState(params.authority);\n const replacingModel = replacesModel(\n params.replacingConfigOption,\n params.sessionModels,\n params.originalAcpx,\n );\n try {\n assertControlAuthority(replay.authority);\n await replayDesiredMode({\n client: params.client,\n sessionId: params.sessionId,\n desiredModeId: params.createdFreshSession ? params.desiredModeId : undefined,\n replay,\n previousSessionId: params.originalSessionId,\n timeoutMs: params.timeoutMs,\n verbose: params.verbose,\n });\n modelReplay = await replayDesiredModel({\n client: params.client,\n sessionId: params.sessionId,\n desiredModelId: replacingModel ? undefined : params.desiredModelId,\n replay,\n previousSessionId: params.originalSessionId,\n record: params.record,\n models: params.sessionModels,\n createdFreshSession: params.createdFreshSession,\n timeoutMs: params.timeoutMs,\n verbose: params.verbose,\n suppressWarnings: params.suppressWarnings,\n });\n configReplay = await replayDesiredConfigOptions({\n client: params.client,\n record: params.record,\n sessionId: params.sessionId,\n desiredConfigOptions: replacingModel ? {} : params.desiredConfigOptions,\n replay,\n acceptedConfigOptions: modelReplay.configOptions,\n replacingConfigOption: replacingModel ? undefined : params.replacingConfigOption,\n previousSessionId: params.originalSessionId,\n timeoutMs: params.timeoutMs,\n verbose: params.verbose,\n });\n } catch (error) {\n settleFailedReplay(params, replay, error);\n if (params.verbose) {\n process.stderr.write(`[acpx] ${formatErrorMessage(error)}\\n`);\n }\n throw error;\n }\n\n params.record.acpSessionId = params.sessionId;\n reconcileAgentSessionId(params.record, params.pendingAgentSessionId);\n return { modelReplay, configReplay };\n}\n\nfunction settleFailedReplay(\n params: ReplaySessionPreferencesOptions,\n replay: ReplayState,\n error: unknown,\n): void {\n if (replay.isAuthorityFailure(error) && replay.acknowledged) {\n // Earlier replies already changed the agent; retain their accepted state.\n params.record.acpSessionId = params.sessionId;\n reconcileAgentSessionId(params.record, params.pendingAgentSessionId);\n } else {\n restoreOriginalSessionState({\n record: params.record,\n sessionId: params.originalSessionId,\n agentSessionId: params.originalAgentSessionId,\n });\n params.record.acpx = cloneSessionAcpxState(params.originalAcpx);\n }\n}\n\ntype RuntimeSessionLoadState = {\n sessionId: string;\n pendingAgentSessionId: string | undefined;\n sessionModels: import(\"../../acp/client.js\").SessionLoadResult[\"models\"];\n configOptionsPresent: boolean;\n legacyModelMetadataPresent: boolean;\n resumed: boolean;\n createdFreshSession: boolean;\n loadError?: string;\n};\n\nasync function loadOrCreateRuntimeSession(params: {\n client: AcpClient;\n record: SessionRecord;\n reusingLoadedSession: boolean;\n sameSessionOnly: boolean;\n timeoutMs?: number;\n}): Promise<RuntimeSessionLoadState> {\n if (params.reusingLoadedSession) {\n return {\n sessionId: params.record.acpSessionId,\n pendingAgentSessionId: params.record.agentSessionId,\n sessionModels: undefined,\n configOptionsPresent: false,\n legacyModelMetadataPresent: false,\n resumed: true,\n createdFreshSession: false,\n };\n }\n\n if (params.client.supportsResumeSession()) {\n return await loadRuntimeSession(params, true);\n }\n\n if (params.client.supportsLoadSession()) {\n return await loadRuntimeSession(params, false);\n }\n\n if (params.sameSessionOnly) {\n throw makeSessionResumeRequiredError({\n record: params.record,\n reason: \"agent does not support session/resume or session/load\",\n });\n }\n\n return await createFreshRuntimeSession(params.client, params.record, params.timeoutMs);\n}\n\nasync function loadRuntimeSession(\n params: {\n client: AcpClient;\n record: SessionRecord;\n sameSessionOnly: boolean;\n timeoutMs?: number;\n },\n resume: boolean,\n): Promise<RuntimeSessionLoadState> {\n try {\n const loadResult = await withTimeout(\n resume\n ? params.client.resumeSession(params.record.acpSessionId, params.record.cwd)\n : params.client.loadSessionWithOptions(params.record.acpSessionId, params.record.cwd, {\n suppressReplayUpdates: true,\n }),\n params.timeoutMs,\n );\n reconcileAgentSessionId(params.record, loadResult.agentSessionId);\n applyConfigOptionsToRecord(params.record, loadResult);\n return {\n sessionId: params.record.acpSessionId,\n pendingAgentSessionId: params.record.agentSessionId,\n sessionModels: loadResult.models,\n configOptionsPresent: loadResult.configOptionsPresent,\n legacyModelMetadataPresent: loadResult.legacyModelMetadataPresent,\n resumed: true,\n createdFreshSession: false,\n };\n } catch (error) {\n return await recoverRuntimeSessionLoadFailure(params, error);\n }\n}\n\nasync function recoverRuntimeSessionLoadFailure(\n params: {\n client: AcpClient;\n record: SessionRecord;\n sameSessionOnly: boolean;\n timeoutMs?: number;\n },\n error: unknown,\n): Promise<RuntimeSessionLoadState> {\n const loadError = formatErrorMessage(error);\n if (params.sameSessionOnly) {\n throw makeSessionResumeRequiredError({\n record: params.record,\n reason: loadError,\n cause: error,\n });\n }\n if (!shouldFallbackToNewSession(error, params.record)) {\n throw error;\n }\n return {\n ...(await createFreshRuntimeSession(params.client, params.record, params.timeoutMs)),\n loadError,\n };\n}\n\nasync function createFreshRuntimeSession(\n client: AcpClient,\n record: SessionRecord,\n timeoutMs: number | undefined,\n): Promise<RuntimeSessionLoadState> {\n const createdSession = await withTimeout(client.createSession(record.cwd), timeoutMs);\n applyConfigOptionsToRecord(record, createdSession);\n return {\n sessionId: createdSession.sessionId,\n pendingAgentSessionId: createdSession.agentSessionId,\n sessionModels: createdSession.models,\n configOptionsPresent: createdSession.configOptionsPresent,\n legacyModelMetadataPresent: createdSession.legacyModelMetadataPresent,\n resumed: false,\n createdFreshSession: true,\n };\n}\n","import type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { AcpClient } from \"../../acp/client.js\";\nimport {\n assertControlAuthority,\n withInterrupt,\n type AcpControlAuthority,\n} from \"../../async-control.js\";\nimport { applyConfigOptionsToRecord } from \"../../session/config-options.js\";\nimport { advertisedModelState } from \"../../session/model-state.js\";\nimport { absolutePath, isoNow } from \"../../session/persistence.js\";\nimport type {\n AcpPermissionHandler,\n AcpElicitationMode,\n AuthPolicy,\n McpServer,\n NonInteractivePermissionPolicy,\n PermissionMode,\n PermissionPolicy,\n SessionRecord,\n SessionResumePolicy,\n} from \"../../types.js\";\nimport { applyLifecycleSnapshotToRecord } from \"./lifecycle.js\";\nimport {\n connectAndLoadSession,\n type ConnectAndLoadSessionOptions,\n type ConnectedSessionController,\n} from \"./reconnect.js\";\nimport { sessionOptionsFromRecord } from \"./session-options.js\";\n\nexport type FullConnectedSessionController = ConnectedSessionController & {\n setSessionModel: (modelId: string) => Promise<SetSessionConfigOptionResponse | undefined>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n ) => Promise<SetSessionConfigOptionResponse>;\n};\n\ntype ConnectedSessionContext = {\n record: SessionRecord;\n client: AcpClient;\n activeController: FullConnectedSessionController;\n sessionId: string;\n resumed: boolean;\n loadError?: string;\n};\n\nexport type WithConnectedSessionOptions<T> = {\n sessionRecordId: string;\n loadRecord: (sessionRecordId: string) => Promise<SessionRecord>;\n saveRecord: (record: SessionRecord) => Promise<void>;\n createClient?: (options: ConstructorParameters<typeof AcpClient>[0]) => AcpClient;\n mcpServers?: McpServer[];\n permissionMode?: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n permissionPolicy?: PermissionPolicy;\n onPermissionRequest?: AcpPermissionHandler;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n fs?: boolean;\n terminal?: boolean;\n elicitationModes?: readonly AcpElicitationMode[];\n resumePolicy?: SessionResumePolicy;\n replacingConfigOption?: ConnectAndLoadSessionOptions[\"replacingConfigOption\"];\n timeoutMs?: number;\n authority?: AcpControlAuthority;\n verbose?: boolean;\n onClientAvailable?: (controller: FullConnectedSessionController) => void;\n onClientClosed?: () => void;\n onConnectedRecord?: (record: SessionRecord) => void;\n onInterrupt?: (params: { client: AcpClient; record: SessionRecord }) => Promise<void>;\n run: (context: ConnectedSessionContext) => Promise<T>;\n};\n\nexport type WithConnectedSessionResult<T> = {\n value: T;\n record: SessionRecord;\n resumed: boolean;\n loadError?: string;\n};\n\nfunction createActiveSessionController(params: {\n client: AcpClient;\n record: SessionRecord;\n getActiveSessionId: () => string;\n}): FullConnectedSessionController {\n const getActiveSessionId = () => params.getActiveSessionId();\n return {\n hasActivePrompt: () => params.client.hasActivePrompt(),\n requestCancelActivePrompt: async () => await params.client.requestCancelActivePrompt(),\n setSessionMode: async (modeId: string) => {\n await params.client.setSessionMode(getActiveSessionId(), modeId);\n },\n setSessionModel: async (modelId: string) => {\n const models = advertisedModelState(params.record.acpx);\n const response = await params.client.setSessionModel(getActiveSessionId(), modelId, models);\n applyConfigOptionsToRecord(params.record, response);\n return response;\n },\n setSessionConfigOption: async (configId: string, value: string) => {\n return await params.client.setSessionConfigOption(getActiveSessionId(), configId, value);\n },\n };\n}\n\nexport async function withConnectedSession<T>(\n options: WithConnectedSessionOptions<T>,\n): Promise<WithConnectedSessionResult<T>> {\n const record = await options.loadRecord(options.sessionRecordId);\n assertControlAuthority(options.authority);\n const clientOptions: ConstructorParameters<typeof AcpClient>[0] = {\n agentCommand: record.agentCommand,\n agentArgv: record.agentArgv,\n cwd: absolutePath(record.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode ?? \"approve-reads\",\n nonInteractivePermissions: options.nonInteractivePermissions,\n permissionPolicy: options.permissionPolicy,\n onPermissionRequest: options.onPermissionRequest,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n elicitationModes: options.elicitationModes,\n verbose: options.verbose,\n sessionOptions: sessionOptionsFromRecord(record),\n };\n const client = options.createClient?.(clientOptions) ?? new AcpClient(clientOptions);\n let activeSessionIdForControl = record.acpSessionId;\n let notifiedClientAvailable = false;\n const activeController = createActiveSessionController({\n client,\n record,\n getActiveSessionId: () => activeSessionIdForControl,\n });\n\n try {\n return await withInterrupt(\n async () => {\n const { sessionId, resumed, loadError } = await connectAndLoadSession({\n client,\n record,\n resumePolicy: options.resumePolicy,\n replacingConfigOption: options.replacingConfigOption,\n authority: options.authority,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n activeController,\n onClientAvailable: (controller) => {\n options.onClientAvailable?.(controller);\n notifiedClientAvailable = true;\n },\n onConnectedRecord: options.onConnectedRecord,\n onSessionIdResolved: (sessionIdValue) => {\n activeSessionIdForControl = sessionIdValue;\n },\n });\n\n assertControlAuthority(options.authority);\n const value = await options.run({\n record,\n client,\n activeController,\n sessionId,\n resumed,\n loadError,\n });\n\n const now = isoNow();\n record.lastUsedAt = now;\n record.closed = false;\n record.closedAt = undefined;\n record.protocolVersion = client.initializeResult?.protocolVersion;\n record.agentCapabilities = client.initializeResult?.agentCapabilities;\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n await options.saveRecord(record);\n\n return {\n value,\n record,\n resumed,\n loadError,\n };\n },\n async () => {\n if (options.onInterrupt) {\n await options.onInterrupt({ client, record });\n } else {\n await client.cancelActivePrompt(2_500);\n }\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n record.lastUsedAt = isoNow();\n await options.saveRecord(record).catch(() => {\n // best effort while process is being interrupted\n });\n await client.close();\n },\n );\n } finally {\n if (notifiedClientAvailable) {\n options.onClientClosed?.();\n }\n await client.close();\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n await options.saveRecord(record).catch(() => {\n // best effort on close\n });\n }\n}\n","import { withTimeout } from \"../../async-control.js\";\nimport {\n withConnectedSession,\n type FullConnectedSessionController,\n type WithConnectedSessionOptions,\n type WithConnectedSessionResult,\n} from \"../../runtime/engine/connected-session.js\";\nimport type {\n AuthPolicy,\n McpServer,\n NonInteractivePermissionPolicy,\n SessionSetConfigOptionResult,\n SessionSetModelResult,\n SessionSetModeResult,\n} from \"../../types.js\";\nimport { applyConfigOptionSelection, applyModelSelection } from \"../config-options.js\";\nimport { setDesiredModeId } from \"../mode-preference.js\";\nimport { advertisedModelState } from \"../model-state.js\";\nimport { resolveSessionRecord, writeSessionRecord } from \"../persistence.js\";\nimport type { QueueOwnerActiveSessionController } from \"../queue/owner-turn-controller.js\";\n\nexport type ActiveSessionController = QueueOwnerActiveSessionController;\n\ntype SessionControlConnectionOptions = {\n sessionRecordId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n fs?: boolean;\n terminal?: boolean;\n timeoutMs?: number;\n verbose?: boolean;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n};\n\nexport type RunSessionSetModeDirectOptions = SessionControlConnectionOptions & {\n modeId: string;\n};\n\nexport type RunSessionSetConfigOptionDirectOptions = SessionControlConnectionOptions & {\n configId: string;\n value: string;\n};\n\nexport type RunSessionSetModelDirectOptions = SessionControlConnectionOptions & {\n modelId: string;\n};\n\ntype DirectConnectedSessionOptions = SessionControlConnectionOptions & {\n replacingConfigOption?: WithConnectedSessionOptions<unknown>[\"replacingConfigOption\"];\n};\n\nfunction buildDirectConnectedSessionOptions<T>(\n options: DirectConnectedSessionOptions,\n run: WithConnectedSessionOptions<T>[\"run\"],\n): WithConnectedSessionOptions<T> {\n return {\n sessionRecordId: options.sessionRecordId,\n replacingConfigOption: options.replacingConfigOption,\n loadRecord: resolveSessionRecord,\n saveRecord: writeSessionRecord,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n onClientAvailable: (controller: FullConnectedSessionController) => {\n options.onClientAvailable?.(controller);\n },\n onClientClosed: options.onClientClosed,\n run,\n };\n}\n\nfunction toSessionMutationResult(\n result: Pick<WithConnectedSessionResult<unknown>, \"record\" | \"resumed\" | \"loadError\">,\n): Pick<SessionSetModeResult, \"record\" | \"resumed\" | \"loadError\"> {\n return {\n record: result.record,\n resumed: result.resumed,\n loadError: result.loadError,\n };\n}\n\nexport async function runSessionSetModeDirect(\n options: RunSessionSetModeDirectOptions,\n): Promise<SessionSetModeResult> {\n const result = await withConnectedSession(\n buildDirectConnectedSessionOptions(options, async ({ client, sessionId, record }) => {\n await withTimeout(client.setSessionMode(sessionId, options.modeId), options.timeoutMs);\n setDesiredModeId(record, options.modeId);\n }),\n );\n\n return toSessionMutationResult(result);\n}\n\nexport async function runSessionSetModelDirect(\n options: RunSessionSetModelDirectOptions,\n): Promise<SessionSetModelResult> {\n const result = await withConnectedSession(\n buildDirectConnectedSessionOptions(\n { ...options, replacingConfigOption: { key: \"model\" } },\n async ({ client, sessionId, record }) => {\n const models = advertisedModelState(record.acpx);\n const response = await withTimeout(\n client.setSessionModel(sessionId, options.modelId, models),\n options.timeoutMs,\n );\n record.acpx = applyModelSelection(record.acpx, options.modelId, response);\n return response;\n },\n ),\n );\n\n return { ...toSessionMutationResult(result), response: result.value };\n}\n\nexport async function runSessionSetConfigOptionDirect(\n options: RunSessionSetConfigOptionDirectOptions,\n): Promise<SessionSetConfigOptionResult> {\n const result = await withConnectedSession(\n buildDirectConnectedSessionOptions(\n { ...options, replacingConfigOption: { key: options.configId } },\n async ({ client, sessionId, record }) => {\n const response = await withTimeout(\n client.setSessionConfigOption(sessionId, options.configId, options.value),\n options.timeoutMs,\n );\n record.acpx = applyConfigOptionSelection(\n record.acpx,\n options.configId,\n options.value,\n response,\n );\n return response;\n },\n ),\n );\n\n return {\n record: result.record,\n response: result.value,\n resumed: result.resumed,\n loadError: result.loadError,\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { runTimedExecFile, splitCommandLine } from \"../../acp/client-process.js\";\nimport type {\n SessionRecord,\n SessionSetConfigOptionResult,\n SessionSetModelResult,\n SessionSetModeResult,\n} from \"../../types.js\";\nimport { applyConfigOptionSelection, applyModelSelection } from \"../config-options.js\";\nimport { setDesiredModeId } from \"../mode-preference.js\";\nimport { resolveSessionRecord, writeSessionRecord, isoNow } from \"../persistence.js\";\nimport {\n isProcessAlive,\n terminateProcess,\n terminateQueueOwnerForSession,\n tryCancelOnRunningOwner,\n tryCloseSessionOnRunningOwner,\n trySetConfigOptionOnRunningOwner,\n trySetModelOnRunningOwner,\n trySetModeOnRunningOwner,\n} from \"../queue/ipc.js\";\nimport type {\n SessionCancelOptions,\n SessionCancelResult,\n SessionSetConfigOptionOptions,\n SessionSetModelOptions,\n SessionSetModeOptions,\n} from \"./contracts.js\";\nimport {\n runSessionSetConfigOptionDirect,\n runSessionSetModelDirect,\n runSessionSetModeDirect,\n} from \"./prompt-runner.js\";\n\nexport async function cancelSessionPrompt(\n options: SessionCancelOptions,\n): Promise<SessionCancelResult> {\n const cancelled = await tryCancelOnRunningOwner(options);\n return {\n sessionId: options.sessionId,\n cancelled: cancelled === true,\n };\n}\n\nexport async function setSessionMode(\n options: SessionSetModeOptions,\n): Promise<SessionSetModeResult> {\n const submittedToOwner = await trySetModeOnRunningOwner(\n options.sessionId,\n options.modeId,\n options.timeoutMs,\n options.verbose,\n );\n if (submittedToOwner) {\n const record = await resolveSessionRecord(options.sessionId);\n setDesiredModeId(record, options.modeId);\n await writeSessionRecord(record);\n return {\n record,\n resumed: false,\n };\n }\n\n return await runSessionSetModeDirect({\n sessionRecordId: options.sessionId,\n modeId: options.modeId,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n}\n\nexport async function setSessionModel(\n options: SessionSetModelOptions,\n): Promise<SessionSetModelResult> {\n const submittedToOwner = await trySetModelOnRunningOwner(\n options.sessionId,\n options.modelId,\n options.timeoutMs,\n options.verbose,\n );\n if (submittedToOwner) {\n const record = await resolveSessionRecord(options.sessionId);\n record.acpx = applyModelSelection(record.acpx, options.modelId, submittedToOwner.response);\n await writeSessionRecord(record);\n return {\n record,\n response: submittedToOwner.response,\n resumed: false,\n };\n }\n\n return await runSessionSetModelDirect({\n sessionRecordId: options.sessionId,\n modelId: options.modelId,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n}\n\nexport async function setSessionConfigOption(\n options: SessionSetConfigOptionOptions,\n): Promise<SessionSetConfigOptionResult> {\n const ownerResponse = await trySetConfigOptionOnRunningOwner(\n options.sessionId,\n options.configId,\n options.value,\n options.timeoutMs,\n options.verbose,\n );\n if (ownerResponse) {\n const record = await resolveSessionRecord(options.sessionId);\n record.acpx = applyConfigOptionSelection(\n record.acpx,\n options.configId,\n options.value,\n ownerResponse,\n );\n await writeSessionRecord(record);\n return {\n record,\n response: ownerResponse,\n resumed: false,\n };\n }\n\n return await runSessionSetConfigOptionDirect({\n sessionRecordId: options.sessionId,\n configId: options.configId,\n value: options.value,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n}\n\nfunction firstAgentCommandToken(command: string): string | undefined {\n try {\n const parsed = splitCommandLine(command);\n return parsed.command || undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function isLikelyMatchingProcess(pid: number, agentCommand: string): Promise<boolean> {\n const expectedToken = firstAgentCommandToken(agentCommand);\n if (!expectedToken) {\n return false;\n }\n\n const argv = await readProcessArgv(pid);\n if (argv.length === 0) {\n return false;\n }\n\n const executableBase = path.basename(argv[0]);\n const expectedBase = path.basename(expectedToken);\n return (\n executableBase === expectedBase || argv.some((entry) => path.basename(entry) === expectedBase)\n );\n}\n\nasync function readProcessArgv(pid: number): Promise<string[]> {\n const procArgv = await readProcCmdline(pid);\n if (procArgv) {\n return procArgv;\n }\n\n const commandLine =\n process.platform === \"win32\"\n ? await readWindowsCommandLine(pid)\n : await readPosixCommandLine(pid);\n return splitCommandLineLike(commandLine);\n}\n\nasync function readProcCmdline(pid: number): Promise<string[] | undefined> {\n try {\n const payload = await fs.readFile(`/proc/${pid}/cmdline`, \"utf8\");\n return payload\n .split(\"\\u0000\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n } catch {\n return undefined;\n }\n}\n\nasync function readPosixCommandLine(pid: number): Promise<string | undefined> {\n try {\n const stdout = await runTimedExecFile(\"ps\", [\"-p\", String(pid), \"-o\", \"command=\"]);\n return stdout.trim() || undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function readWindowsCommandLine(pid: number): Promise<string | undefined> {\n try {\n const stdout = await runTimedExecFile(\n \"powershell.exe\",\n [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n `(Get-CimInstance Win32_Process -Filter \"ProcessId = ${pid}\").CommandLine`,\n ],\n { windowsHide: true },\n );\n return stdout.trim() || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction splitCommandLineLike(commandLine: string | undefined): string[] {\n if (!commandLine) {\n return [];\n }\n try {\n const parsed = splitCommandLine(commandLine);\n return [parsed.command, ...parsed.args];\n } catch {\n return commandLine\n .split(/\\s+/u)\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n }\n}\n\nexport const sessionControlTestInternals = { firstAgentCommandToken, splitCommandLineLike };\n\nexport async function closeSession(sessionId: string): Promise<SessionRecord> {\n const record = await resolveSessionRecord(sessionId);\n await tryCloseSessionOnRunningOwner({ sessionId: record.acpxRecordId }).catch(() => {\n // Preserve local close semantics even if best-effort ACP session shutdown fails.\n });\n await terminateQueueOwnerForSession(record.acpxRecordId);\n\n if (\n record.pid != null &&\n isProcessAlive(record.pid) &&\n (await isLikelyMatchingProcess(record.pid, record.agentCommand))\n ) {\n await terminateProcess(record.pid);\n }\n\n record.pid = undefined;\n record.closed = true;\n record.closedAt = isoNow();\n await writeSessionRecord(record);\n\n return record;\n}\n","import { createHash } from \"node:crypto\";\nimport { normalizeAgentSessionId } from \"../../acp/agent-session-id.js\";\nimport { AcpClient } from \"../../acp/client.js\";\nimport { formatErrorMessage } from \"../../acp/error-normalization.js\";\nimport { withInterrupt, withTimeout } from \"../../async-control.js\";\nimport {\n applyLifecycleSnapshotToRecord,\n createInitialSessionRecord,\n} from \"../../runtime/engine/lifecycle.js\";\nimport { persistSessionOptions } from \"../../runtime/engine/session-options.js\";\nimport type { SessionEnsureResult, SessionRecord } from \"../../types.js\";\nimport { applyConfigOptionsToRecord, applyInitialModelSelection } from \"../config-options.js\";\nimport { applyRequestedModelIfAdvertised } from \"../model-application.js\";\nimport {\n absolutePath,\n findGitRepositoryRoot,\n findSessionByDirectoryWalk,\n normalizeName,\n writeSessionRecord,\n} from \"../persistence.js\";\nimport { acquireSessionTurn } from \"../turn-ownership.js\";\nimport { DEFAULT_QUEUE_OWNER_TTL_MS } from \"./contracts.js\";\nimport type {\n SessionCreateOptions,\n SessionCreateWithClientResult,\n SessionEnsureOptions,\n SessionListOptions,\n SessionListResult,\n} from \"./contracts.js\";\nimport { setSessionModel } from \"./session-control.js\";\n\ntype CreatedSessionState = {\n sessionId: string;\n agentSessionId: string | undefined;\n sessionResult: Awaited<ReturnType<AcpClient[\"createSession\" | \"loadSession\"]>>;\n modelApplication: Awaited<ReturnType<typeof applyRequestedModelIfAdvertised>>;\n};\n\nasync function createSessionRecordWithClient(\n client: AcpClient,\n options: SessionCreateOptions,\n): Promise<SessionRecord> {\n const cwd = absolutePath(options.cwd);\n await withTimeout(client.start(), options.timeoutMs);\n const createdState = options.resumeSessionId\n ? await resumeSessionRecordWithClient(client, options, cwd)\n : await createFreshSessionState(client, options, cwd);\n const { sessionId, agentSessionId } = createdState;\n\n const lifecycle = client.getAgentLifecycleSnapshot();\n const record: SessionRecord = {\n ...createInitialSessionRecord({\n recordId: sessionId,\n sessionId,\n agentSessionId,\n agentCommand: options.agentCommand,\n agentArgv: options.agentArgv,\n cwd,\n name: normalizeName(options.name),\n }),\n lastRequestId: undefined,\n pid: lifecycle.running ? lifecycle.pid : undefined,\n agentStartedAt: lifecycle.startedAt,\n protocolVersion: client.initializeResult?.protocolVersion,\n agentCapabilities: client.initializeResult?.agentCapabilities,\n };\n\n persistSessionOptions(record, options.sessionOptions);\n applyConfigOptionsToRecord(record, createdState.sessionResult);\n applyInitialModelSelection(\n record,\n createdState.sessionResult.models,\n options.sessionOptions?.model,\n createdState.modelApplication,\n );\n\n await writeSessionRecord(record);\n return record;\n}\n\nasync function createFreshSessionState(\n client: AcpClient,\n options: SessionCreateOptions,\n cwd: string,\n): Promise<CreatedSessionState> {\n const createdSession = await withTimeout(client.createSession(cwd), options.timeoutMs);\n const modelApplication = await applyRequestedModelIfAdvertised({\n client,\n sessionId: createdSession.sessionId,\n requestedModel: options.sessionOptions?.model,\n models: createdSession.models,\n agentCommand: options.agentCommand,\n timeoutMs: options.timeoutMs,\n onWarning: options.onModelWarning,\n });\n return {\n sessionId: createdSession.sessionId,\n agentSessionId: normalizeAgentSessionId(createdSession.agentSessionId),\n sessionResult: createdSession,\n modelApplication,\n };\n}\n\nasync function resumeSessionRecordWithClient(\n client: AcpClient,\n options: SessionCreateOptions,\n cwd: string,\n): Promise<CreatedSessionState> {\n if (!options.resumeSessionId) {\n throw new Error(\"resumeSessionId is required\");\n }\n const resumeMethod = client.supportsResumeSession()\n ? \"session/resume\"\n : client.supportsLoadSession()\n ? \"session/load\"\n : undefined;\n if (!resumeMethod) {\n throw new Error(\n `Agent command \"${options.agentCommand}\" does not support session/resume or session/load; cannot resume session ${options.resumeSessionId}`,\n );\n }\n\n try {\n const resumedSession = await withTimeout(\n resumeMethod === \"session/resume\"\n ? client.resumeSession(options.resumeSessionId, cwd)\n : client.loadSession(options.resumeSessionId, cwd),\n options.timeoutMs,\n );\n const sessionModels = resumedSession.models;\n const modelApplication = await applyRequestedModelIfAdvertised({\n client,\n sessionId: options.resumeSessionId,\n requestedModel: options.sessionOptions?.model,\n models: sessionModels,\n agentCommand: options.agentCommand,\n timeoutMs: options.timeoutMs,\n onWarning: options.onModelWarning,\n });\n return {\n sessionId: options.resumeSessionId,\n agentSessionId: normalizeAgentSessionId(resumedSession.agentSessionId),\n sessionResult: resumedSession,\n modelApplication,\n };\n } catch (error) {\n throw new Error(\n `Failed to resume ACP session ${options.resumeSessionId}: ${formatErrorMessage(error)}`,\n {\n cause: error,\n },\n );\n }\n}\n\nexport async function createSessionWithClient(\n options: SessionCreateOptions,\n): Promise<SessionCreateWithClientResult> {\n options.signal?.throwIfAborted();\n const client = new AcpClient({\n agentCommand: options.agentCommand,\n agentArgv: options.agentArgv,\n cwd: absolutePath(options.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n permissionPolicy: options.permissionPolicy,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n verbose: options.verbose,\n sessionOptions: options.sessionOptions,\n });\n\n const onAbort = () => {\n void client.close().catch(() => {});\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n try {\n const create = async () => {\n options.signal?.throwIfAborted();\n const record = await createSessionRecordWithClient(client, options);\n options.signal?.throwIfAborted();\n return record;\n };\n const record =\n options.handleProcessInterrupts === false\n ? await create()\n : await withInterrupt(create, async () => {\n await client.close();\n });\n\n return {\n record,\n client,\n };\n } catch (error) {\n await client.close();\n throw error;\n } finally {\n options.signal?.removeEventListener(\"abort\", onAbort);\n }\n}\n\nexport async function createSession(options: SessionCreateOptions): Promise<SessionRecord> {\n const { record, client } = await createSessionWithClient(options);\n try {\n return record;\n } finally {\n await client.close();\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n await writeSessionRecord(record);\n }\n}\n\nexport async function listAgentSessions(options: SessionListOptions): Promise<SessionListResult> {\n const client = new AcpClient({\n agentCommand: options.agentCommand,\n agentArgv: options.agentArgv,\n cwd: absolutePath(options.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n permissionPolicy: options.permissionPolicy,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n verbose: options.verbose,\n });\n\n try {\n return await withInterrupt(\n async () => {\n await withTimeout(client.start(), options.timeoutMs);\n if (!client.supportsListSessions()) {\n return undefined;\n }\n\n const cwd = options.filterCwd ? absolutePath(options.filterCwd) : undefined;\n const response = await withTimeout(\n client.listSessions({\n ...(cwd ? { cwd } : {}),\n ...(options.cursor ? { cursor: options.cursor } : {}),\n }),\n options.timeoutMs,\n );\n\n return {\n _meta: response._meta,\n source: \"agent\",\n sessions: response.sessions,\n cursor: options.cursor,\n cwd,\n nextCursor: response.nextCursor,\n };\n },\n async () => {\n await client.close();\n },\n );\n } finally {\n await client.close();\n }\n}\n\nexport async function ensureSession(options: SessionEnsureOptions): Promise<SessionEnsureResult> {\n const cwd = absolutePath(options.cwd);\n const scope = createHash(\"sha256\")\n .update(JSON.stringify([options.agentCommand, cwd, normalizeName(options.name)]))\n .digest(\"hex\");\n const ownership = await acquireSessionTurn(`ensure:${scope}`, options.signal);\n try {\n return await ensureSessionWithOwnership(options, cwd);\n } finally {\n await ownership[Symbol.asyncDispose]();\n }\n}\n\nasync function ensureSessionWithOwnership(\n options: SessionEnsureOptions,\n cwd: string,\n): Promise<SessionEnsureResult> {\n options.signal?.throwIfAborted();\n const gitRoot = findGitRepositoryRoot(cwd);\n const walkBoundary = options.walkBoundary ?? gitRoot ?? cwd;\n const existing = await findSessionByDirectoryWalk({\n agentCommand: options.agentCommand,\n cwd,\n name: options.name,\n boundary: walkBoundary,\n });\n if (existing) {\n const requestedModel = options.sessionOptions?.model;\n if (requestedModel) {\n const result = await setSessionModel({\n sessionId: existing.acpxRecordId,\n modelId: requestedModel,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n return { record: result.record, created: false };\n }\n return {\n record: existing,\n created: false,\n };\n }\n\n const record = await createSession({\n signal: options.signal,\n handleProcessInterrupts: options.handleProcessInterrupts,\n agentCommand: options.agentCommand,\n agentArgv: options.agentArgv,\n cwd,\n name: options.name,\n resumeSessionId: options.resumeSessionId,\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n permissionPolicy: options.permissionPolicy,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n sessionOptions: options.sessionOptions,\n });\n\n return {\n record,\n created: true,\n };\n}\n\nexport { DEFAULT_QUEUE_OWNER_TTL_MS };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { appendRegularFileSync } from \"@openclaw/fs-safe/advanced\";\nimport { getPerfMetricsSnapshot, resetPerfMetrics } from \"./perf-metrics.js\";\n\nconst PERF_METRICS_FILE_ENV = \"ACPX_PERF_METRICS_FILE\";\n\nlet installed = false;\nlet flushed = false;\nlet captureFilePath: string | undefined;\nlet captureRole = \"cli\";\nlet captureArgv: string[] = [];\nlet captureSequence = 0;\n\ntype CaptureReason = \"checkpoint\" | \"exit\" | \"signal\";\n\nfunction shouldCapture(): boolean {\n return typeof captureFilePath === \"string\" && captureFilePath.trim().length > 0;\n}\n\nfunction buildPayload(reason: CaptureReason): Record<string, unknown> {\n return {\n timestamp: new Date().toISOString(),\n pid: process.pid,\n ppid: process.ppid,\n role: captureRole,\n argv: captureArgv,\n cwd: process.cwd(),\n sequence: captureSequence,\n reason,\n metrics: getPerfMetricsSnapshot(),\n };\n}\n\nfunction payloadHasMetrics(payload: Record<string, unknown>): boolean {\n const metrics = payload.metrics as {\n counters?: Record<string, number>;\n gauges?: Record<string, number>;\n timings?: Record<string, unknown>;\n };\n return [metrics.counters, metrics.gauges, metrics.timings].some(\n (entries) => Object.keys(entries ?? {}).length > 0,\n );\n}\n\nfunction appendPerfMetricsPayload(payload: Record<string, unknown>): void {\n fs.mkdirSync(path.dirname(captureFilePath!), { recursive: true });\n appendRegularFileSync({\n filePath: captureFilePath!,\n content: `${JSON.stringify(payload)}\\n`,\n mode: 0o600,\n });\n captureSequence += 1;\n}\n\nfunction writePerfMetricsCapture(reason: CaptureReason, resetAfterWrite: boolean): boolean {\n if (!shouldCapture()) {\n return false;\n }\n\n const payload = buildPayload(reason);\n if (!payloadHasMetrics(payload)) {\n return false;\n }\n\n try {\n appendPerfMetricsPayload(payload);\n if (resetAfterWrite) {\n resetPerfMetrics();\n }\n return true;\n } catch {\n // metrics capture is best-effort only\n return false;\n }\n}\n\nexport function checkpointPerfMetricsCapture(): void {\n flushed = false;\n writePerfMetricsCapture(\"checkpoint\", true);\n}\n\nexport function flushPerfMetricsCapture(reason: CaptureReason = \"exit\"): void {\n if (flushed || !shouldCapture()) {\n return;\n }\n flushed = true;\n writePerfMetricsCapture(reason, false);\n}\n\nexport function installPerfMetricsCapture(\n options: {\n argv?: string[];\n role?: string;\n filePath?: string;\n } = {},\n): void {\n captureFilePath = options.filePath ?? process.env[PERF_METRICS_FILE_ENV];\n if (!shouldCapture()) {\n return;\n }\n\n resetPerfMetrics();\n captureRole = options.role ?? captureRole;\n captureArgv = options.argv ?? [];\n captureSequence = 0;\n flushed = false;\n\n if (installed) {\n return;\n }\n installed = true;\n\n process.once(\"exit\", () => {\n flushPerfMetricsCapture(\"exit\");\n });\n for (const signal of [\"SIGINT\", \"SIGTERM\"] as const) {\n const handler = () => {\n flushPerfMetricsCapture(\"signal\");\n process.removeListener(signal, handler);\n process.kill(process.pid, signal);\n };\n process.once(signal, handler);\n }\n}\n\nexport function perfMetricsCaptureFileFromEnv(\n env: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n const value = env[PERF_METRICS_FILE_ENV];\n if (typeof value !== \"string\" || value.trim().length === 0) {\n return undefined;\n }\n return value;\n}\n","import type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { QueueConnectionError } from \"../../errors.js\";\n\nexport type QueueOwnerTurnState = \"idle\" | \"starting\" | \"active\" | \"closing\";\n\nexport type QueueOwnerActiveSessionController = {\n hasActivePrompt: () => boolean;\n requestCancelActivePrompt: () => Promise<boolean>;\n setSessionMode: (modeId: string) => Promise<void>;\n setSessionModel: (modelId: string) => Promise<SetSessionConfigOptionResponse | undefined>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n ) => Promise<SetSessionConfigOptionResponse>;\n};\n\ntype QueueOwnerTurnControllerOptions = {\n withTimeout: <T>(run: () => Promise<T>, timeoutMs?: number) => Promise<T>;\n setSessionModeFallback: (modeId: string, timeoutMs?: number) => Promise<void>;\n setSessionModelFallback: (\n modelId: string,\n timeoutMs?: number,\n ) => Promise<SetSessionConfigOptionResponse | undefined>;\n setSessionConfigOptionFallback: (\n configId: string,\n value: string,\n timeoutMs?: number,\n ) => Promise<SetSessionConfigOptionResponse>;\n};\n\nexport class QueueOwnerTurnController {\n private readonly options: QueueOwnerTurnControllerOptions;\n private state: QueueOwnerTurnState = \"idle\";\n private pendingCancel = false;\n private activeController?: QueueOwnerActiveSessionController;\n private waitingTurn?: AbortController;\n\n constructor(options: QueueOwnerTurnControllerOptions) {\n this.options = options;\n }\n\n get lifecycleState(): QueueOwnerTurnState {\n return this.state;\n }\n\n get hasPendingCancel(): boolean {\n return this.pendingCancel;\n }\n\n beginTurn(): AbortSignal {\n this.state = \"starting\";\n this.pendingCancel = false;\n this.waitingTurn = new AbortController();\n return this.waitingTurn.signal;\n }\n\n markPromptActive(): void {\n if (this.state === \"starting\" || this.state === \"active\") {\n this.state = \"active\";\n }\n }\n\n endTurn(): void {\n this.state = \"idle\";\n this.pendingCancel = false;\n this.waitingTurn = undefined;\n }\n\n beginClosing(): void {\n this.state = \"closing\";\n this.pendingCancel = false;\n this.activeController = undefined;\n }\n\n setActiveController(controller: QueueOwnerActiveSessionController): void {\n this.activeController = controller;\n }\n\n clearActiveController(): void {\n this.activeController = undefined;\n }\n\n private assertCanHandleControlRequest(): void {\n if (this.state === \"closing\") {\n throw new QueueConnectionError(\"Queue owner is closing\", {\n detailCode: \"QUEUE_OWNER_SHUTTING_DOWN\",\n origin: \"queue\",\n retryable: true,\n });\n }\n }\n\n async requestCancel(): Promise<boolean> {\n const activeController = this.activeController;\n if (activeController?.hasActivePrompt()) {\n const cancelled = await activeController.requestCancelActivePrompt();\n if (cancelled) {\n this.pendingCancel = false;\n }\n return cancelled;\n }\n\n if (this.state === \"starting\" || this.state === \"active\") {\n this.pendingCancel = true;\n this.waitingTurn?.abort();\n return true;\n }\n\n return false;\n }\n\n async applyPendingCancel(): Promise<boolean> {\n const activeController = this.activeController;\n if (!this.pendingCancel || !activeController || !activeController.hasActivePrompt()) {\n return false;\n }\n\n const cancelled = await activeController.requestCancelActivePrompt();\n if (cancelled) {\n this.pendingCancel = false;\n }\n return cancelled;\n }\n\n async setSessionMode(modeId: string, timeoutMs?: number): Promise<void> {\n this.assertCanHandleControlRequest();\n const activeController = this.activeController;\n if (activeController) {\n await this.options.withTimeout(\n async () => await activeController.setSessionMode(modeId),\n timeoutMs,\n );\n return;\n }\n\n await this.options.setSessionModeFallback(modeId, timeoutMs);\n }\n\n async setSessionModel(\n modelId: string,\n timeoutMs?: number,\n ): Promise<SetSessionConfigOptionResponse | undefined> {\n this.assertCanHandleControlRequest();\n const activeController = this.activeController;\n if (activeController) {\n return await this.options.withTimeout(\n async () => await activeController.setSessionModel(modelId),\n timeoutMs,\n );\n }\n\n return await this.options.setSessionModelFallback(modelId, timeoutMs);\n }\n\n async setSessionConfigOption(\n configId: string,\n value: string,\n timeoutMs?: number,\n ): Promise<SetSessionConfigOptionResponse> {\n this.assertCanHandleControlRequest();\n const activeController = this.activeController;\n if (activeController) {\n return await this.options.withTimeout(\n async () => await activeController.setSessionConfigOption(configId, value),\n timeoutMs,\n );\n }\n\n return await this.options.setSessionConfigOptionFallback(configId, value, timeoutMs);\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { realpathSync } from \"node:fs\";\nimport type { SessionAgentOptions } from \"../../runtime/engine/session-options.js\";\nimport type {\n AuthPolicy,\n McpServer,\n NonInteractivePermissionPolicy,\n PermissionMode,\n} from \"../../types.js\";\n\nexport type QueueOwnerRuntimeOptions = {\n sessionId: string;\n mcpServers?: McpServer[];\n mcpConfigPath?: string;\n mcpConfigFingerprint?: string;\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n fs?: boolean;\n terminal?: boolean;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n ttlMs?: number;\n maxQueueDepth?: number;\n promptRetries?: number;\n sessionOptions?: SessionAgentOptions;\n};\n\nfunction isNonEmptyStringArray(value: unknown): value is string[] {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n value.every((entry) => typeof entry === \"string\" && entry.length > 0)\n );\n}\n\nconst NODE_TEST_FLAGS = new Set([\n \"--experimental-test-coverage\",\n \"--test\",\n \"--test-name-pattern\",\n \"--test-reporter\",\n \"--test-reporter-destination\",\n]);\n\nconst NODE_TEST_FLAGS_WITH_VALUE = new Set([\n \"--test-name-pattern\",\n \"--test-reporter\",\n \"--test-reporter-destination\",\n]);\n\nconst INSPECTOR_FLAGS_WITH_VALUE = new Set([\n \"--inspect\",\n \"--inspect-brk\",\n \"--inspect-port\",\n \"--inspect-publish-uid\",\n \"--debug-port\",\n]);\n\nconst INSPECTOR_FLAG_PREFIXES = [\n \"--inspect=\",\n \"--inspect-brk=\",\n \"--inspect-port=\",\n \"--inspect-publish-uid=\",\n \"--debug-port=\",\n];\n\ntype ExecArgvDecision = \"keep\" | \"drop\" | \"drop-with-value\";\n\nfunction classifyExecArgv(value: string | undefined): ExecArgvDecision {\n if (value === undefined) {\n return \"drop\";\n }\n if (NODE_TEST_FLAGS_WITH_VALUE.has(value) || INSPECTOR_FLAGS_WITH_VALUE.has(value)) {\n return \"drop-with-value\";\n }\n return dropSingleExecArgv(value) ? \"drop\" : \"keep\";\n}\n\nfunction dropSingleExecArgv(value: string): boolean {\n return (\n NODE_TEST_FLAGS.has(value) ||\n value.startsWith(\"--test-\") ||\n INSPECTOR_FLAG_PREFIXES.some((prefix) => value.startsWith(prefix))\n );\n}\n\nexport function sanitizeQueueOwnerExecArgv(\n execArgv: readonly string[] = process.execArgv,\n): string[] {\n const sanitized: string[] = [];\n for (let index = 0; index < execArgv.length; index += 1) {\n const value = execArgv[index] ?? \"\";\n const decision = classifyExecArgv(value);\n if (decision === \"drop\") {\n continue;\n }\n if (decision === \"drop-with-value\") {\n index += 1;\n continue;\n }\n sanitized.push(value);\n }\n return sanitized;\n}\n\nexport function buildQueueOwnerArgOverride(\n entryPath: string,\n execArgv: readonly string[] = process.execArgv,\n): string | null {\n const sanitized = sanitizeQueueOwnerExecArgv(execArgv);\n if (sanitized.length === 0) {\n return null;\n }\n return JSON.stringify([...sanitized, entryPath, \"__queue-owner\"]);\n}\n\nexport function resolveQueueOwnerSpawnArgs(argv: readonly string[] = process.argv): string[] {\n const override = process.env.ACPX_QUEUE_OWNER_ARGS;\n if (override) {\n const parsed = JSON.parse(override) as unknown;\n if (isNonEmptyStringArray(parsed)) {\n return [...parsed];\n }\n throw new Error(\"acpx self-spawn failed: invalid ACPX_QUEUE_OWNER_ARGS\");\n }\n\n const entry = argv[1];\n if (!entry || entry.trim().length === 0) {\n throw new Error(\"acpx self-spawn failed: missing CLI entry path\");\n }\n const resolvedEntry = realpathSync(entry);\n return [resolvedEntry, \"__queue-owner\"];\n}\n\nexport function queueOwnerRuntimeOptionsFromSend(\n options: QueueOwnerRuntimeOptions,\n): QueueOwnerRuntimeOptions {\n return {\n sessionId: options.sessionId,\n mcpServers: options.mcpServers,\n ...(options.mcpConfigPath ? { mcpConfigPath: options.mcpConfigPath } : {}),\n ...(options.mcpConfigFingerprint ? { mcpConfigFingerprint: options.mcpConfigFingerprint } : {}),\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n ttlMs: options.ttlMs,\n maxQueueDepth: options.maxQueueDepth,\n promptRetries: options.promptRetries,\n sessionOptions: options.sessionOptions,\n };\n}\n\n/** Max stderr bytes retained for cold-start diagnostics. */\nexport const QUEUE_OWNER_STARTUP_STDERR_MAX_BYTES = 4_000;\n\nexport type QueueOwnerProcessExitState = {\n exited: boolean;\n code: number | null;\n signal: NodeJS.Signals | null;\n spawnError?: Error;\n inputError?: Error;\n};\n\nexport type QueueOwnerProcessHandle = {\n pid?: number;\n getExitState: () => QueueOwnerProcessExitState;\n /** Stderr captured while startup capture is active (bounded). */\n readLogTail: (maxBytes?: number) => string;\n /**\n * Stop retaining owner stderr for diagnostics while keeping the pipe\n * open and draining (so long-lived owners, including --ttl 0, do not\n * get EPIPE). Call as soon as IPC accepts the first request.\n */\n stopStartupCapture: () => void;\n};\n\nexport function formatQueueOwnerStartupFailure(params: {\n sessionId: string;\n exit: QueueOwnerProcessExitState;\n logTail: string;\n}): string {\n const parts = [`Session queue owner failed to start for session ${params.sessionId}`];\n if (params.exit.spawnError) {\n parts.push(`spawn error: ${params.exit.spawnError.message}`);\n } else if (params.exit.exited) {\n const codePart = params.exit.code === null ? \"null\" : String(params.exit.code);\n const signalPart = params.exit.signal ? `, signal ${params.exit.signal}` : \"\";\n parts.push(`exited with code ${codePart}${signalPart} before binding its socket`);\n }\n if (params.exit.inputError) {\n parts.push(`startup input failed: ${params.exit.inputError.message}`);\n }\n const tail = params.logTail.trim();\n if (tail.length > 0) {\n parts.push(`stderr:\\n${tail}`);\n }\n return parts.join(\": \");\n}\n\nexport function spawnQueueOwnerProcess(\n options: QueueOwnerRuntimeOptions,\n queueOwnerArgs?: readonly string[],\n): QueueOwnerProcessHandle {\n const payload = JSON.stringify(options);\n\n let exited = false;\n let code: number | null = null;\n let signal: NodeJS.Signals | null = null;\n let spawnError: Error | undefined;\n let inputError: Error | undefined;\n let capturing = true;\n let stderrTail = Buffer.alloc(0);\n\n const child = spawn(process.execPath, queueOwnerArgs ?? resolveQueueOwnerSpawnArgs(), {\n detached: true,\n stdio: [\"pipe\", \"ignore\", \"pipe\"],\n windowsHide: true,\n });\n child.stdin.on(\"error\", (error: Error) => {\n inputError = error;\n });\n child.stdin.end(payload);\n\n const stopStartupCapture = () => {\n if (!capturing) {\n return;\n }\n capturing = false;\n const stderr = child.stderr;\n if (!stderr) {\n return;\n }\n // Stop retaining bytes, but keep the pipe open and draining so a long-lived\n // owner writing more stderr does not hit EPIPE and die.\n stderr.removeAllListeners(\"data\");\n stderr.on(\"data\", () => {\n // discard\n });\n stderr.resume();\n // A piped stdio stream has its own event-loop reference even after the\n // ChildProcess is unrefed. Release that reference once startup completes\n // so a detached --ttl 0 owner cannot keep the submitting CLI alive.\n (stderr as typeof stderr & { unref: () => void }).unref();\n };\n\n child.stderr?.on(\"data\", (chunk: Buffer | string) => {\n if (!capturing) {\n return;\n }\n const buf = typeof chunk === \"string\" ? Buffer.from(chunk) : chunk;\n const combined = Buffer.concat([stderrTail, buf]);\n stderrTail =\n combined.length > QUEUE_OWNER_STARTUP_STDERR_MAX_BYTES\n ? combined.subarray(combined.length - QUEUE_OWNER_STARTUP_STDERR_MAX_BYTES)\n : combined;\n });\n child.stderr?.on(\"error\", () => {\n // Ignore pipe errors after destroy / early close.\n });\n\n child.on(\"error\", (error) => {\n spawnError = error;\n });\n // `close` follows `exit`/`error` after stdio is drained, so the diagnostic\n // includes the owner's final stderr instead of racing buffered pipe data.\n child.on(\"close\", (exitCode, exitSignal) => {\n exited = true;\n code = exitCode;\n signal = exitSignal;\n stopStartupCapture();\n });\n child.unref();\n\n return {\n pid: child.pid,\n getExitState: () => ({\n exited,\n code,\n signal,\n ...(spawnError ? { spawnError } : {}),\n ...(inputError ? { inputError } : {}),\n }),\n readLogTail: (maxBytes = QUEUE_OWNER_STARTUP_STDERR_MAX_BYTES) => {\n const start = Math.max(0, stderrTail.length - maxBytes);\n return stderrTail.subarray(start).toString(\"utf8\");\n },\n stopStartupCapture,\n };\n}\n","import { TimeoutError, withTimeout, type AcpControlAuthority } from \"../../async-control.js\";\nimport {\n hasAgentReplyAfterPrompt,\n recordPromptResponseUsage,\n} from \"../../session/conversation-model.js\";\nimport type {\n AcpElicitationHandler,\n AcpPermissionHandler,\n PromptInput,\n RunPromptResult,\n SessionConversation,\n} from \"../../types.js\";\n\nconst SESSION_REPLY_IDLE_MS = 1_000;\nconst SESSION_REPLY_DRAIN_TIMEOUT_MS = 5_000;\n\nfunction responseMetaField(meta: Record<string, unknown> | null | undefined): {\n _meta?: Record<string, unknown> | null;\n} {\n return meta === undefined ? {} : { _meta: meta };\n}\n\ntype PromptTurnClient = {\n prompt: (\n sessionId: string,\n prompt: PromptInput | string,\n onRequestWritten?: () => Promise<void> | void,\n onElicitation?: AcpElicitationHandler,\n onPermissionRequest?: AcpPermissionHandler,\n authority?: AcpControlAuthority,\n ) => Promise<{\n stopReason: RunPromptResult[\"stopReason\"];\n usage?: unknown;\n _meta?: Record<string, unknown> | null;\n }>;\n endPromptElicitation?: (sessionId: string) => void;\n waitForSessionUpdatesIdle?: (options?: { idleMs?: number; timeoutMs?: number }) => Promise<void>;\n};\n\ntype PromptResponse = Awaited<ReturnType<PromptTurnClient[\"prompt\"]>>;\n\nfunction recoveredSessionResult(\n response: PromptResponse | undefined,\n conversation: SessionConversation,\n promptMessageId: string,\n): {\n stopReason: \"end_turn\";\n source: \"session\";\n _meta?: Record<string, unknown> | null;\n} {\n recordPromptResponseUsage(conversation, response?.usage, promptMessageId);\n return {\n stopReason: \"end_turn\",\n source: \"session\",\n ...responseMetaField(response?._meta),\n };\n}\n\nfunction abortTimedOutRequests(error: unknown, client: PromptTurnClient, sessionId: string): void {\n if (error instanceof TimeoutError) {\n client.endPromptElicitation?.(sessionId);\n }\n}\n\nexport async function runPromptTurn(params: {\n client: PromptTurnClient;\n sessionId: string;\n prompt: PromptInput | string;\n timeoutMs?: number;\n conversation: SessionConversation;\n promptMessageId?: string;\n onPromptRequestWritten?: () => Promise<void> | void;\n onPromptStarted?: () => Promise<void> | void;\n onElicitation?: AcpElicitationHandler;\n onPermissionRequest?: AcpPermissionHandler;\n authority?: AcpControlAuthority;\n}): Promise<{\n stopReason: RunPromptResult[\"stopReason\"];\n source: \"rpc\" | \"session\";\n _meta?: Record<string, unknown> | null;\n}> {\n let settledResponse: PromptResponse | undefined;\n try {\n const promptPromise = params.client.prompt(\n params.sessionId,\n params.prompt,\n params.onPromptRequestWritten,\n params.onElicitation,\n params.onPermissionRequest,\n params.authority,\n );\n void promptPromise.then(\n (response) => {\n settledResponse = response;\n },\n () => {},\n );\n await params.onPromptStarted?.();\n const response = await withTimeout(promptPromise, params.timeoutMs);\n await params.client\n .waitForSessionUpdatesIdle?.({\n idleMs: SESSION_REPLY_IDLE_MS,\n timeoutMs: SESSION_REPLY_DRAIN_TIMEOUT_MS,\n })\n .catch(() => {\n // Best effort. The prompt already completed successfully, so keep the\n // original stop reason if late update draining itself times out.\n });\n recordPromptResponseUsage(params.conversation, response.usage, params.promptMessageId);\n return {\n stopReason: response.stopReason,\n source: \"rpc\",\n ...responseMetaField(response._meta),\n };\n } catch (error) {\n abortTimedOutRequests(error, params.client, params.sessionId);\n if (!(error instanceof TimeoutError) || !params.promptMessageId) {\n throw error;\n }\n\n await params.client\n .waitForSessionUpdatesIdle?.({\n idleMs: SESSION_REPLY_IDLE_MS,\n timeoutMs: SESSION_REPLY_DRAIN_TIMEOUT_MS,\n })\n .catch(() => {\n // Best effort. If the update drain itself times out, fall back to the prompt error.\n });\n\n if (hasAgentReplyAfterPrompt(params.conversation, params.promptMessageId)) {\n return recoveredSessionResult(settledResponse, params.conversation, params.promptMessageId);\n }\n\n throw error;\n }\n}\n","const DEFAULT_LIVE_CHECKPOINT_INTERVAL_MS = 500;\n\nexport type LiveSessionCheckpointOptions = {\n save: () => Promise<void>;\n intervalMs?: number;\n onError?: (error: unknown) => void;\n};\n\nexport class LiveSessionCheckpoint {\n private readonly save: () => Promise<void>;\n private readonly intervalMs: number;\n private readonly onError: ((error: unknown) => void) | undefined;\n private dirty = false;\n private flushing: Promise<void> | undefined;\n private timer: ReturnType<typeof setTimeout> | undefined;\n\n constructor(options: LiveSessionCheckpointOptions) {\n this.save = options.save;\n this.intervalMs = options.intervalMs ?? DEFAULT_LIVE_CHECKPOINT_INTERVAL_MS;\n this.onError = options.onError;\n }\n\n request(): void {\n this.dirty = true;\n if (this.timer) {\n return;\n }\n\n this.timer = setTimeout(() => {\n this.timer = undefined;\n void this.flush().catch((error: unknown) => {\n this.onError?.(error);\n });\n }, this.intervalMs);\n this.timer.unref?.();\n }\n\n async checkpoint(): Promise<void> {\n this.dirty = true;\n await this.flush();\n }\n\n async flush(): Promise<void> {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = undefined;\n }\n\n if (this.flushing) {\n await this.flushing;\n if (!this.dirty) {\n return;\n }\n }\n\n this.flushing = this.flushDirty();\n try {\n await this.flushing;\n } finally {\n this.flushing = undefined;\n }\n }\n\n private async flushDirty(): Promise<void> {\n while (this.dirty) {\n this.dirty = false;\n await this.save();\n }\n }\n}\n","import type { OutputFormatter } from \"../../types.js\";\n\nexport const DISCARD_OUTPUT_FORMATTER: OutputFormatter = {\n setContext() {},\n onAcpMessage() {},\n onError() {},\n onPermissionEscalation() {},\n flush() {},\n};\n","import { AcpClient } from \"../../acp/client.js\";\nimport {\n extractAcpError,\n formatErrorMessage,\n isRetryablePromptError,\n normalizeOutputError,\n} from \"../../acp/error-normalization.js\";\nimport { InterruptedError, TimeoutError, withInterrupt, withTimeout } from \"../../async-control.js\";\nimport { AcpxOperationalError } from \"../../errors.js\";\nexport { InterruptedError, TimeoutError } from \"../../async-control.js\";\nimport { formatPerfMetric, measurePerf, startPerfTimer } from \"../../perf-metrics.js\";\nimport { textPrompt } from \"../../prompt-content.js\";\nimport {\n applyConversation,\n applyLifecycleSnapshotToRecord,\n} from \"../../runtime/engine/lifecycle.js\";\nimport { runPromptTurn } from \"../../runtime/engine/prompt-turn.js\";\nimport { connectAndLoadSession } from \"../../runtime/engine/reconnect.js\";\nimport {\n mergeSessionOptions,\n sessionOptionsFromRecord,\n type SessionAgentOptions,\n} from \"../../runtime/engine/session-options.js\";\nimport type {\n AcpJsonRpcMessage,\n AcpMessageDirection,\n AuthPolicy,\n McpServer,\n NonInteractivePermissionPolicy,\n OutputErrorAcpPayload,\n OutputErrorCode,\n OutputErrorEmissionPolicy,\n OutputErrorOrigin,\n OutputFormatter,\n PermissionEscalationEvent,\n PermissionPolicy,\n RunPromptResult,\n SessionRecord,\n SessionSendResult,\n} from \"../../types.js\";\nimport { applyConfigOptionSelection, applyModelSelection } from \"../config-options.js\";\nimport {\n cloneSessionAcpxState,\n cloneSessionConversation,\n recordClientOperation as recordConversationClientOperation,\n recordPromptSubmission,\n recordSessionUpdate as recordConversationSessionUpdate,\n trimConversationForRuntime,\n} from \"../conversation-model.js\";\nimport { SessionEventWriter } from \"../events.js\";\nimport type { SessionWatchResult } from \"../journal.js\";\nimport { LiveSessionCheckpoint } from \"../live-checkpoint.js\";\nimport { applyRequestedModelIfAdvertised } from \"../model-application.js\";\nimport { advertisedModelState } from \"../model-state.js\";\nimport { absolutePath, isoNow, resolveSessionRecord, writeSessionRecord } from \"../persistence.js\";\nimport { type QueueOwnerMessage, type QueueTask, waitMs } from \"../queue/ipc.js\";\nimport { type QueueOwnerActiveSessionController } from \"../queue/owner-turn-controller.js\";\nimport { acquireSessionTurn } from \"../turn-ownership.js\";\nimport type { RunOnceOptions, SessionSendOptions } from \"./contracts.js\";\nimport { DISCARD_OUTPUT_FORMATTER } from \"./discard-output.js\";\n\nconst INTERRUPT_CANCEL_WAIT_MS = 2_500;\n\ntype RunSessionPromptOptions = Omit<\n SessionSendOptions,\n \"maxQueueDepth\" | \"sessionId\" | \"ttlMs\" | \"waitForCompletion\"\n> & {\n sessionRecordId: string;\n waitSignal?: AbortSignal;\n handleProcessInterrupts?: boolean;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n onPromptActive?: () => Promise<void> | void;\n onPromptRequestWritten?: () => Promise<void> | void;\n};\n\ntype ActiveSessionController = QueueOwnerActiveSessionController;\n\ntype BufferedAcpOutputMessage = {\n direction: AcpMessageDirection;\n message: AcpJsonRpcMessage;\n};\n\nclass QueueTaskOutputFormatter implements OutputFormatter {\n private readonly requestId: string;\n private readonly send: (message: QueueOwnerMessage) => void;\n\n constructor(task: QueueTask) {\n this.requestId = task.requestId;\n this.send = task.send;\n }\n\n setContext(_context: { sessionId: string }): void {}\n\n onAcpMessage(message: AcpJsonRpcMessage): void {\n this.send({\n type: \"event\",\n requestId: this.requestId,\n message,\n });\n }\n\n onError(params: {\n code: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n message: string;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n timestamp?: string;\n }): void {\n this.send({\n type: \"error\",\n requestId: this.requestId,\n code: params.code,\n detailCode: params.detailCode,\n origin: params.origin,\n message: params.message,\n retryable: params.retryable,\n acp: params.acp,\n });\n }\n\n onPermissionEscalation(event: PermissionEscalationEvent): void {\n this.send({\n type: \"permission_escalation\",\n requestId: this.requestId,\n event,\n });\n }\n\n flush(): void {}\n}\n\nfunction markOutputAlreadyEmitted(error: unknown, outputAlreadyEmitted: boolean): void {\n if (!outputAlreadyEmitted || !error || typeof error !== \"object\") {\n return;\n }\n (error as { outputAlreadyEmitted?: boolean }).outputAlreadyEmitted = true;\n}\n\nasync function runWithOptionalInterrupt<T>(options: {\n handleProcessInterrupts?: boolean;\n run: () => Promise<T>;\n handleInterrupt: () => Promise<void>;\n}): Promise<T> {\n if (options.handleProcessInterrupts === false) {\n return await options.run();\n }\n return await withInterrupt(options.run, options.handleInterrupt);\n}\n\nfunction attachAcpErrorPayload(error: unknown, acp: OutputErrorAcpPayload | undefined): void {\n if (!acp || !error || typeof error !== \"object\") {\n return;\n }\n (error as { acp?: OutputErrorAcpPayload }).acp = acp;\n}\n\nfunction rendersAcpErrors(policy: OutputErrorEmissionPolicy | undefined): boolean {\n return policy?.queueErrorAlreadyEmitted ?? true;\n}\n\nfunction normalizedErrorText(value: string): string {\n return value.trim().toLowerCase();\n}\n\nfunction outboundAcpErrorMatches(error: unknown, acp: OutputErrorAcpPayload): boolean {\n const errorText = normalizedErrorText(formatErrorMessage(error));\n const details = (acp.data as { details?: unknown } | undefined)?.details;\n const candidate =\n typeof details === \"string\" && details.trim().length > 0 ? details : acp.message;\n const candidateText = normalizedErrorText(candidate);\n return errorText === candidateText || errorText.includes(candidateText);\n}\n\nclass AcpErrorTracker {\n private latestInbound: OutputErrorAcpPayload | undefined;\n private readonly outbound: OutputErrorAcpPayload[] = [];\n\n reset(): void {\n this.latestInbound = undefined;\n this.outbound.length = 0;\n }\n\n observe(\n output: OutputFormatter,\n direction: AcpMessageDirection,\n message: AcpJsonRpcMessage,\n ): void {\n output.onAcpMessage(message);\n const acp = extractAcpError(message);\n if (!acp) {\n return;\n }\n if (direction === \"inbound\") {\n this.latestInbound = acp;\n return;\n }\n this.outbound.push(acp);\n }\n\n match(error: unknown): OutputErrorAcpPayload | undefined {\n return (\n this.latestInbound ?? this.outbound.findLast((acp) => outboundAcpErrorMatches(error, acp))\n );\n }\n}\n\nfunction toPromptResult(\n stopReason: RunPromptResult[\"stopReason\"],\n sessionId: string,\n client: AcpClient,\n meta?: Record<string, unknown> | null,\n): RunPromptResult {\n return {\n stopReason,\n sessionId,\n permissionStats: client.getPermissionStats(),\n ...(meta === undefined ? {} : { _meta: meta }),\n };\n}\n\nfunction requestedModelId(value: string | undefined): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nasync function applyPromptModelIfAdvertised(params: {\n client: AcpClient;\n sessionId: string;\n requestedModel: string | undefined;\n record: SessionRecord;\n timeoutMs?: number;\n suppressWarnings?: boolean;\n}): Promise<void> {\n const requestedModel = requestedModelId(params.requestedModel);\n if (!requestedModel) {\n return;\n }\n\n const result = await applyRequestedModelIfAdvertised({\n client: params.client,\n sessionId: params.sessionId,\n requestedModel,\n models: advertisedModelState(params.record.acpx),\n agentCommand: params.record.agentCommand,\n timeoutMs: params.timeoutMs,\n onWarning: params.suppressWarnings\n ? undefined\n : (message) => process.stderr.write(`[acpx] warning: ${message}\\n`),\n });\n if (result.applied) {\n params.record.acpx = applyModelSelection(params.record.acpx, requestedModel, result.response);\n }\n}\n\nfunction jsonRpcIdKey(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n return `s:${value}`;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return `n:${value}`;\n }\n return undefined;\n}\n\nfunction extractJsonRpcRequestInfo(\n message: AcpJsonRpcMessage,\n): { idKey: string; method: string } | undefined {\n const candidate = message as { method?: unknown; id?: unknown };\n if (typeof candidate.method !== \"string\") {\n return undefined;\n }\n const idKey = jsonRpcIdKey(candidate.id);\n if (!idKey) {\n return undefined;\n }\n return {\n idKey,\n method: candidate.method,\n };\n}\n\nfunction extractJsonRpcResponseInfo(\n message: AcpJsonRpcMessage,\n): { idKey: string; hasError: boolean } | undefined {\n const candidate = message as { id?: unknown; error?: unknown; result?: unknown };\n const idKey = jsonRpcIdKey(candidate.id);\n if (!idKey) {\n return undefined;\n }\n const hasError = Object.hasOwn(candidate, \"error\");\n const hasResult = Object.hasOwn(candidate, \"result\");\n if (!hasError && !hasResult) {\n return undefined;\n }\n return {\n idKey,\n hasError,\n };\n}\n\nconst SESSION_RECONNECT_METHODS = new Set([\"session/load\", \"session/resume\"]);\n\nfunction filterRecoverableLoadFallbackOutput(messages: AcpJsonRpcMessage[]): AcpJsonRpcMessage[] {\n const requestMethodById = new Map<string, string>();\n const failedLoadRequestIds = new Set<string>();\n\n for (const message of messages) {\n const request = extractJsonRpcRequestInfo(message);\n if (request) {\n requestMethodById.set(request.idKey, request.method);\n continue;\n }\n\n const response = extractJsonRpcResponseInfo(message);\n if (!response || !response.hasError) {\n continue;\n }\n\n const requestMethod = requestMethodById.get(response.idKey);\n if (requestMethod && SESSION_RECONNECT_METHODS.has(requestMethod)) {\n failedLoadRequestIds.add(response.idKey);\n }\n }\n\n if (failedLoadRequestIds.size === 0) {\n return messages;\n }\n\n return messages.filter((message) => {\n const request = extractJsonRpcRequestInfo(message);\n if (\n request &&\n SESSION_RECONNECT_METHODS.has(request.method) &&\n failedLoadRequestIds.has(request.idKey)\n ) {\n return false;\n }\n\n const response = extractJsonRpcResponseInfo(message);\n if (response && failedLoadRequestIds.has(response.idKey)) {\n return false;\n }\n\n return true;\n });\n}\n\nfunction filterBufferedConnectOutput(\n messages: BufferedAcpOutputMessage[],\n loadError: string | undefined,\n): BufferedAcpOutputMessage[] {\n if (loadError == null) {\n return messages;\n }\n const filteredMessages = new Set(\n filterRecoverableLoadFallbackOutput(messages.map(({ message }) => message)),\n );\n return messages.filter(({ message }) => filteredMessages.has(message));\n}\n\nfunction emitPromptRetryNotice(params: {\n error: unknown;\n delayMs: number;\n attempt: number;\n maxRetries: number;\n suppressSdkConsoleErrors?: boolean;\n}): void {\n if (params.suppressSdkConsoleErrors) {\n return;\n }\n\n process.stderr.write(\n `[acpx] prompt failed (${formatErrorMessage(params.error)}), retrying in ${params.delayMs}ms ` +\n `(attempt ${params.attempt}/${params.maxRetries})\\n`,\n );\n}\n\nfunction emitConnectPerfMetric(startedAt: number, verbose?: boolean): void {\n if (!verbose) {\n return;\n }\n process.stderr.write(\n `[acpx] ${formatPerfMetric(\"prompt.connect_and_load\", Date.now() - startedAt)}\\n`,\n );\n}\n\nfunction emitPromptPerfMetric(startedAt: number, verbose?: boolean): void {\n if (!verbose) {\n return;\n }\n process.stderr.write(`[acpx] ${formatPerfMetric(\"prompt.agent_turn\", Date.now() - startedAt)}\\n`);\n}\n\nfunction emitPromptHookError(error: unknown, verbose?: boolean): void {\n if (!verbose) {\n return;\n }\n process.stderr.write(\"[acpx] onPromptActive hook failed: \" + formatErrorMessage(error) + \"\\n\");\n}\n\nfunction emitPromptDisconnectNotice(\n snapshot: ReturnType<AcpClient[\"getAgentLifecycleSnapshot\"]>,\n verbose?: boolean,\n): void {\n const lastExit = snapshot.lastExit;\n if (!lastExit?.unexpectedDuringPrompt || !verbose) {\n return;\n }\n process.stderr.write(\n \"[acpx] agent disconnected during prompt (\" +\n lastExit.reason +\n \", exit=\" +\n lastExit.exitCode +\n \", signal=\" +\n (lastExit.signal ?? \"none\") +\n \")\\n\",\n );\n}\n\nasync function preparePromptRetry(\n error: unknown,\n attempt: number,\n maxRetries: number,\n hasSideEffects: () => boolean,\n suppressSdkConsoleErrors?: boolean,\n): Promise<boolean> {\n if (attempt < maxRetries && !hasSideEffects() && isRetryablePromptError(error)) {\n const delayMs = Math.min(1_000 * 2 ** attempt, 10_000);\n emitPromptRetryNotice({\n error,\n delayMs,\n attempt: attempt + 1,\n maxRetries,\n suppressSdkConsoleErrors,\n });\n await waitMs(delayMs);\n return !hasSideEffects();\n }\n return false;\n}\n\ntype QueuedTaskRuntimeOptions = Parameters<typeof runQueuedTask>[2];\n\nfunction buildQueuedTaskRunOptions(\n sessionRecordId: string,\n task: QueueTask,\n options: QueuedTaskRuntimeOptions,\n outputFormatter: OutputFormatter,\n): RunSessionPromptOptions {\n return {\n sessionRecordId,\n requestId: task.requestId,\n mcpServers: options.mcpServers,\n prompt: task.prompt ?? textPrompt(task.message),\n permissionMode: task.permissionMode,\n resumePolicy: task.resumePolicy,\n nonInteractivePermissions: task.nonInteractivePermissions ?? options.nonInteractivePermissions,\n permissionPolicy: task.permissionPolicy,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n outputFormatter,\n errorEmissionPolicy: { queueErrorAlreadyEmitted: true },\n timeoutMs: task.timeoutMs,\n suppressSdkConsoleErrors: task.suppressSdkConsoleErrors ?? options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n promptRetries: task.promptRetries ?? options.promptRetries ?? 0,\n sessionOptions: mergeSessionOptions(task.sessionOptions, options.sessionOptions),\n onClientAvailable: options.onClientAvailable,\n onClientClosed: options.onClientClosed,\n onPromptActive: options.onPromptActive,\n onPromptRequestWritten: () => {\n if (task.reportPromptStarted) {\n task.send({ type: \"prompt_started\", requestId: task.requestId });\n }\n },\n handleProcessInterrupts: options.handleProcessInterrupts,\n waitSignal: options.waitSignal,\n client: options.sharedClient,\n };\n}\n\nfunction sendQueuedTaskResult(task: QueueTask, result: SessionSendResult): void {\n if (!task.waitForCompletion) {\n return;\n }\n task.send({\n type: \"result\",\n requestId: task.requestId,\n result,\n });\n}\n\nfunction sendQueuedTaskError(task: QueueTask, error: unknown): void {\n if (!task.waitForCompletion) {\n return;\n }\n const normalizedError = normalizeOutputError(error, {\n origin: \"runtime\",\n detailCode: \"QUEUE_RUNTIME_PROMPT_FAILED\",\n });\n const alreadyEmitted =\n (error as { outputAlreadyEmitted?: unknown }).outputAlreadyEmitted === true;\n task.send({\n type: \"error\",\n requestId: task.requestId,\n code: normalizedError.code,\n detailCode: normalizedError.detailCode,\n origin: normalizedError.origin,\n message: normalizedError.message,\n retryable: normalizedError.retryable,\n acp: normalizedError.acp,\n outputAlreadyEmitted: alreadyEmitted,\n });\n}\n\nexport async function runQueuedTask(\n sessionRecordId: string,\n task: QueueTask,\n options: {\n sharedClient?: AcpClient;\n verbose?: boolean;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n permissionPolicy?: PermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n suppressSdkConsoleErrors?: boolean;\n promptRetries?: number;\n sessionOptions?: SessionAgentOptions;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n onPromptActive?: () => Promise<void> | void;\n handleProcessInterrupts?: boolean;\n waitSignal?: AbortSignal;\n },\n): Promise<void> {\n const outputFormatter = task.waitForCompletion\n ? new QueueTaskOutputFormatter(task)\n : DISCARD_OUTPUT_FORMATTER;\n\n try {\n const result = await runSessionPrompt(\n buildQueuedTaskRunOptions(sessionRecordId, task, options, outputFormatter),\n );\n sendQueuedTaskResult(task, result);\n } catch (error) {\n sendQueuedTaskError(task, error);\n if (error instanceof InterruptedError) {\n throw error;\n }\n } finally {\n task.close();\n }\n}\n\nasync function waitForSessionTurn(options: RunSessionPromptOptions): Promise<{\n recordId: string;\n ownership: AsyncDisposable;\n}> {\n const waiting = new AbortController();\n const onInterrupt = () => waiting.abort(new InterruptedError());\n const signals = [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as const;\n for (const signal of signals) {\n process.once(signal, onInterrupt);\n }\n const timeoutMs = options.timeoutMs;\n const timeout =\n timeoutMs != null && timeoutMs > 0\n ? setTimeout(() => waiting.abort(new TimeoutError(timeoutMs)), timeoutMs)\n : undefined;\n const signal = options.waitSignal\n ? AbortSignal.any([waiting.signal, options.waitSignal])\n : waiting.signal;\n try {\n // Resolve aliases for the lock key only; read the authoritative record again after admission.\n const { acpxRecordId } = await resolveSessionRecord(options.sessionRecordId);\n const ownership = await acquireSessionTurn(acpxRecordId, signal);\n return { recordId: acpxRecordId, ownership };\n } catch (error) {\n signal.throwIfAborted();\n throw error;\n } finally {\n clearTimeout(timeout);\n for (const signal of signals) {\n process.off(signal, onInterrupt);\n }\n }\n}\n\nasync function runSessionPrompt(options: RunSessionPromptOptions): Promise<SessionSendResult> {\n let turn: Awaited<ReturnType<typeof waitForSessionTurn>>;\n try {\n turn = await waitForSessionTurn(options);\n } catch (error) {\n if (options.waitSignal?.aborted && error === options.waitSignal.reason) {\n const record = await resolveSessionRecord(options.sessionRecordId);\n return {\n sessionId: record.acpxRecordId,\n stopReason: \"cancelled\",\n permissionStats: { requested: 0, approved: 0, denied: 0, cancelled: 0 },\n record,\n resumed: false,\n };\n }\n throw error;\n }\n try {\n return await runOwnedSessionPrompt({ ...options, sessionRecordId: turn.recordId });\n } finally {\n await turn.ownership[Symbol.asyncDispose]();\n }\n}\n\nfunction preparePromptConversation(record: SessionRecord, options: RunSessionPromptOptions) {\n const conversation = cloneSessionConversation(record);\n record.acpx = cloneSessionAcpxState(record.acpx);\n const promptStartedAt = isoNow();\n const promptMessageId = recordPromptSubmission(conversation, options.prompt, promptStartedAt);\n record.lastPromptAt = promptStartedAt;\n record.lastUsedAt = promptStartedAt;\n if (options.requestId !== undefined) {\n record.lastRequestId = options.requestId;\n }\n applyConversation(record, conversation);\n return { conversation, promptMessageId };\n}\n\nfunction failedWatchResult(error: unknown): SessionWatchResult {\n const { message, code, detailCode, retryable } = normalizeOutputError(error, {\n origin: \"runtime\",\n detailCode: \"QUEUE_RUNTIME_PROMPT_FAILED\",\n });\n return { status: \"failed\", error: { message, code, detailCode, retryable } };\n}\n\nasync function writeTurnMarker(write: () => Promise<void>): Promise<void> {\n try {\n await write();\n } catch (error) {\n throw new AcpxOperationalError(`Session journal write failed: ${formatErrorMessage(error)}`, {\n outputCode: \"RUNTIME\",\n detailCode: \"SESSION_JOURNAL_WRITE_FAILED\",\n origin: \"runtime\",\n retryable: false,\n cause: error,\n });\n }\n}\n\ntype SettledOperation<T> =\n | { status: \"fulfilled\"; value: T }\n | { status: \"rejected\"; error: unknown };\n\nasync function settleOperation<T>(run: () => T | Promise<T>): Promise<SettledOperation<T>> {\n try {\n return { status: \"fulfilled\", value: await run() };\n } catch (error) {\n return { status: \"rejected\", error };\n }\n}\n\nfunction settledWatchResult(outcome: SettledOperation<SessionSendResult>): SessionWatchResult {\n if (outcome.status === \"rejected\") {\n return failedWatchResult(outcome.error);\n }\n const result = outcome.value;\n return {\n status: result.stopReason === \"cancelled\" ? \"cancelled\" : \"completed\",\n stopReason: result.stopReason,\n ...(result._meta !== undefined ? { _meta: result._meta } : {}),\n };\n}\n\nasync function runFinalizedSessionPrompt(options: {\n writer: SessionEventWriter;\n requestId?: string;\n run: () => Promise<SessionSendResult>;\n cleanup: (attempt: SettledOperation<SessionSendResult>) => Promise<void>;\n}): Promise<SessionSendResult> {\n let journalStarted = false;\n const attempt = await settleOperation(async () => {\n const requestId = options.requestId;\n if (requestId !== undefined) {\n await writeTurnMarker(() => options.writer.beginTurn(requestId));\n journalStarted = true;\n }\n return await options.run();\n });\n const cleanup = await settleOperation(() => options.cleanup(attempt));\n // Cleanup failure changes the actual outcome even after an ACP success response.\n const outcome = cleanup.status === \"rejected\" ? cleanup : attempt;\n const journal = await settleOperation(async () => {\n const requestId = options.requestId;\n if (journalStarted && requestId !== undefined) {\n await writeTurnMarker(() =>\n options.writer.finishTurn(requestId, settledWatchResult(outcome)),\n );\n }\n });\n const closing = await settleOperation(() =>\n writeTurnMarker(() => options.writer.close({ checkpoint: false })),\n );\n if (journal.status === \"rejected\") {\n throw journal.error;\n }\n if (outcome.status === \"rejected\") {\n throw outcome.error;\n }\n if (closing.status === \"rejected\") {\n throw closing.error;\n }\n return outcome.value;\n}\n\nasync function runOwnedSessionPrompt(options: RunSessionPromptOptions): Promise<SessionSendResult> {\n const stopTotalTimer = startPerfTimer(\"runtime.prompt.total\");\n const output = options.outputFormatter;\n const shouldMarkAcpErrorsEmitted = rendersAcpErrors(options.errorEmissionPolicy);\n const record = await measurePerf(\"session.resolve_prompt_record\", async () => {\n return await resolveSessionRecord(options.sessionRecordId);\n });\n const { conversation, promptMessageId } = preparePromptConversation(record, options);\n await writeSessionRecord(record);\n\n output.setContext({\n sessionId: record.acpxRecordId,\n });\n\n const eventWriter = await measurePerf(\"session.events.open\", async () => {\n return await SessionEventWriter.open(record);\n });\n const pendingMessages: AcpJsonRpcMessage[] = [];\n const pendingConnectOutputMessages: BufferedAcpOutputMessage[] = [];\n const sessionOptions = mergeSessionOptions(\n options.sessionOptions,\n sessionOptionsFromRecord(record),\n );\n let bufferingConnectOutput = true;\n let promptTurnActive = false;\n let promptTurnHadSideEffects = false;\n const acpErrors = new AcpErrorTracker();\n\n const flushPendingMessages = async (checkpoint = false): Promise<void> => {\n if (pendingMessages.length === 0) {\n return;\n }\n\n const batch = pendingMessages.splice(0);\n await measurePerf(\"session.events.flush_pending\", async () => {\n await eventWriter.appendMessages(batch, { checkpoint });\n });\n if (options.requestId !== undefined) {\n record.lastRequestId = options.requestId;\n }\n };\n const preserveClosedState = async (): Promise<void> => {\n const latest = await resolveSessionRecord(record.acpxRecordId).catch(() => undefined);\n if (!latest?.closed) {\n return;\n }\n\n record.closed = true;\n record.closedAt = latest.closedAt ?? record.closedAt ?? isoNow();\n record.pid = latest.pid;\n if (latest.acpx) {\n record.acpx = {\n ...record.acpx,\n ...latest.acpx,\n };\n }\n };\n const liveCheckpoint = new LiveSessionCheckpoint({\n save: async () => {\n await flushPendingMessages(false);\n record.lastUsedAt = isoNow();\n applyConversation(record, conversation);\n await preserveClosedState();\n await eventWriter.checkpoint();\n },\n onError: (error) => {\n if (options.verbose) {\n process.stderr.write(\n \"[acpx] live session checkpoint failed: \" + formatErrorMessage(error) + \"\\n\",\n );\n }\n },\n });\n\n let closeClientOnExit = options.client == null;\n const client =\n options.client ??\n new AcpClient({\n agentCommand: record.agentCommand,\n agentArgv: record.agentArgv,\n cwd: absolutePath(record.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n permissionPolicy: options.permissionPolicy,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n sessionOptions,\n });\n client.updateRuntimeOptions({\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n permissionPolicy: options.permissionPolicy,\n fs: options.fs,\n terminal: options.terminal,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n });\n client.setEventHandlers({\n onAcpMessage: (direction, message) => {\n pendingMessages.push(message);\n options.onAcpMessage?.(direction, message);\n },\n onAcpOutputMessage: (direction, message) => {\n if (bufferingConnectOutput) {\n pendingConnectOutputMessages.push({ direction, message });\n return;\n }\n acpErrors.observe(output, direction, message);\n },\n onSessionUpdate: (notification) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n record.acpx = recordConversationSessionUpdate(conversation, record.acpx, notification);\n trimConversationForRuntime(conversation);\n liveCheckpoint.request();\n options.onSessionUpdate?.(notification);\n },\n onClientOperation: (operation) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n record.acpx = recordConversationClientOperation(conversation, record.acpx, operation);\n trimConversationForRuntime(conversation);\n liveCheckpoint.request();\n options.onClientOperation?.(operation);\n },\n onPermissionEscalation: (event) => {\n output.onPermissionEscalation(event);\n options.onPermissionEscalation?.(event);\n },\n });\n let activeSessionIdForControl = record.acpSessionId;\n let notifiedClientAvailable = false;\n const activeController: ActiveSessionController = {\n hasActivePrompt: () => client.hasActivePrompt(),\n requestCancelActivePrompt: async () => await client.requestCancelActivePrompt(),\n setSessionMode: async (modeId: string) => {\n await client.setSessionMode(activeSessionIdForControl, modeId);\n },\n setSessionModel: async (modelId: string) => {\n const models = advertisedModelState(record.acpx);\n const response = await client.setSessionModel(activeSessionIdForControl, modelId, models);\n record.acpx = applyModelSelection(record.acpx, modelId, response);\n return response;\n },\n setSessionConfigOption: async (configId: string, value: string) => {\n // Preserve the selected control's identity across pre-ack notifications.\n const modelConfigId = advertisedModelState(record.acpx)?.configId;\n const response = await client.setSessionConfigOption(\n activeSessionIdForControl,\n configId,\n value,\n );\n record.acpx = applyConfigOptionSelection(\n record.acpx,\n configId,\n value,\n response,\n modelConfigId,\n );\n return response;\n },\n };\n\n const flushConnectOutput = (loadError?: string): void => {\n bufferingConnectOutput = false;\n const outputMessages = filterBufferedConnectOutput(pendingConnectOutputMessages, loadError);\n for (const { direction, message } of outputMessages) {\n acpErrors.observe(output, direction, message);\n }\n pendingConnectOutputMessages.length = 0;\n };\n\n const connectForPrompt = async () => {\n const connectStartedAt = Date.now();\n try {\n const connected = await measurePerf(\"runtime.connect_and_load\", async () => {\n return await connectAndLoadSession({\n client,\n record,\n resumePolicy: options.resumePolicy,\n replacingConfigOption: requestedModelId(options.sessionOptions?.model)\n ? { key: \"model\" }\n : undefined,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n suppressWarnings: options.suppressSdkConsoleErrors,\n activeController,\n onClientAvailable: (controller) => {\n options.onClientAvailable?.(controller);\n notifiedClientAvailable = true;\n },\n onConnectedRecord: (connectedRecord) => {\n connectedRecord.lastPromptAt = isoNow();\n },\n onSessionIdResolved: (sessionId) => {\n activeSessionIdForControl = sessionId;\n },\n });\n });\n flushConnectOutput(connected.loadError);\n emitConnectPerfMetric(connectStartedAt, options.verbose);\n return connected;\n } catch (error) {\n // A shared queue client must reconnect after an incomplete preference replay.\n closeClientOnExit = true;\n flushConnectOutput();\n throw error;\n }\n };\n\n const buildPromptStartedHook = (attempt: number) => {\n if (attempt !== 0 || !options.onPromptActive) {\n return undefined;\n }\n return async () => {\n try {\n await options.onPromptActive?.();\n } catch (error) {\n emitPromptHookError(error, options.verbose);\n }\n };\n };\n\n const runPromptAttempt = async (sessionId: string, attempt: number) => {\n acpErrors.reset();\n const promptStartedAt = Date.now();\n const response = await measurePerf(\"runtime.prompt.agent_turn\", async () => {\n return await runPromptTurn({\n client,\n sessionId,\n prompt: options.prompt,\n timeoutMs: options.timeoutMs,\n conversation,\n promptMessageId,\n onPromptRequestWritten: options.onPromptRequestWritten,\n onPromptStarted: buildPromptStartedHook(attempt),\n });\n });\n emitPromptPerfMetric(promptStartedAt, options.verbose);\n return response;\n };\n\n const handlePromptFailure = async (error: unknown, attempt: number): Promise<void> => {\n const snapshot = client.getAgentLifecycleSnapshot();\n if (\n snapshot.lastExit?.unexpectedDuringPrompt !== true &&\n (await preparePromptRetry(\n error,\n attempt,\n options.promptRetries ?? 0,\n () => promptTurnHadSideEffects,\n options.suppressSdkConsoleErrors,\n ))\n ) {\n return;\n }\n await failRuntimePrompt(error, snapshot);\n };\n\n const failRuntimePrompt = async (\n error: unknown,\n snapshot: ReturnType<AcpClient[\"getAgentLifecycleSnapshot\"]>,\n ): Promise<never> => {\n promptTurnActive = false;\n applyLifecycleSnapshotToRecord(record, snapshot);\n emitPromptDisconnectNotice(snapshot, options.verbose);\n const matchedAcpError = acpErrors.match(error);\n const normalizedError = normalizeOutputError(error, {\n origin: \"runtime\",\n acp: matchedAcpError,\n });\n await flushPendingMessages(false).catch(() => {\n // best effort while bubbling prompt failure\n });\n output.flush();\n record.lastUsedAt = isoNow();\n applyConversation(record, conversation);\n const propagated = error instanceof Error ? error : new Error(formatErrorMessage(error));\n attachAcpErrorPayload(propagated, normalizedError.acp);\n (propagated as { outputAlreadyEmitted?: boolean }).outputAlreadyEmitted =\n matchedAcpError !== undefined && shouldMarkAcpErrorsEmitted;\n (propagated as { normalizedOutputError?: unknown }).normalizedOutputError = normalizedError;\n throw propagated;\n };\n\n const runPromptWithRetries = async (sessionId: string) => {\n promptTurnActive = true;\n for (let attempt = 0; ; attempt++) {\n try {\n return await runPromptAttempt(sessionId, attempt);\n } catch (error) {\n await handlePromptFailure(error, attempt);\n }\n }\n };\n\n const savePromptSuccess = async (response: Awaited<ReturnType<typeof runPromptTurn>>) => {\n await flushPendingMessages(false);\n output.flush();\n const now = isoNow();\n record.lastUsedAt = now;\n record.closed = false;\n record.closedAt = undefined;\n record.protocolVersion = client.initializeResult?.protocolVersion;\n record.agentCapabilities = client.initializeResult?.agentCapabilities;\n applyConversation(record, conversation);\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n stopTotalTimer();\n return response;\n };\n\n const runPrompt = async (): Promise<SessionSendResult> => {\n const { sessionId: activeSessionId, resumed, loadError } = await connectForPrompt();\n\n await applyPromptModelIfAdvertised({\n client,\n sessionId: activeSessionId,\n requestedModel: options.sessionOptions?.model,\n record,\n timeoutMs: options.timeoutMs,\n suppressWarnings: options.suppressSdkConsoleErrors,\n });\n\n output.setContext({\n sessionId: record.acpxRecordId,\n });\n await liveCheckpoint.checkpoint();\n\n const response = await savePromptSuccess(await runPromptWithRetries(activeSessionId));\n promptTurnActive = false;\n\n return {\n ...toPromptResult(response.stopReason, record.acpxRecordId, client, response._meta),\n record,\n resumed,\n loadError,\n };\n };\n\n const handleInterrupt = async (): Promise<void> => {\n await client.cancelActivePrompt(INTERRUPT_CANCEL_WAIT_MS);\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n record.lastUsedAt = isoNow();\n applyConversation(record, conversation);\n await flushPendingMessages(false).catch(() => {\n // best effort while process is being interrupted\n });\n if (closeClientOnExit) {\n await client.close();\n }\n };\n\n const runObservedPrompt = async (): Promise<SessionSendResult> => {\n try {\n return await runWithOptionalInterrupt({\n handleProcessInterrupts: options.handleProcessInterrupts,\n run: runPrompt,\n handleInterrupt,\n });\n } catch (error) {\n const matchedAcpError = acpErrors.match(error);\n attachAcpErrorPayload(error, matchedAcpError);\n markOutputAlreadyEmitted(error, matchedAcpError !== undefined && shouldMarkAcpErrorsEmitted);\n throw error;\n }\n };\n\n const cleanupPrompt = async (attempt: SettledOperation<SessionSendResult>): Promise<void> => {\n const steps = [\n () => {\n const duration = stopTotalTimer();\n if (options.verbose) {\n process.stderr.write(`[acpx] ${formatPerfMetric(\"prompt.total\", duration)}\\n`);\n }\n },\n () => {\n if (notifiedClientAvailable) {\n options.onClientClosed?.();\n }\n },\n () => client.clearEventHandlers(),\n async () => {\n const journalFailed =\n attempt.status === \"rejected\" &&\n attempt.error instanceof AcpxOperationalError &&\n attempt.error.detailCode === \"SESSION_JOURNAL_WRITE_FAILED\";\n if (closeClientOnExit || journalFailed) {\n await client.close();\n }\n },\n () => applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot()),\n () => applyConversation(record, conversation),\n ];\n const outcomes: SettledOperation<void>[] = [];\n for (const step of steps) {\n outcomes.push(await settleOperation(step));\n }\n // Checkpoint failures remain best effort; an append failure is reported by finishTurn.\n for (const checkpoint of [\n () => liveCheckpoint.flush(),\n () => flushPendingMessages(false),\n preserveClosedState,\n () => eventWriter.checkpoint(),\n ]) {\n await settleOperation(checkpoint);\n }\n const failure = outcomes.find((outcome) => outcome.status === \"rejected\");\n if (failure) {\n throw failure.error;\n }\n };\n\n return await runFinalizedSessionPrompt({\n writer: eventWriter,\n requestId: options.requestId,\n run: runObservedPrompt,\n cleanup: cleanupPrompt,\n });\n}\n\nexport async function runOnce(options: RunOnceOptions): Promise<RunPromptResult> {\n const output = options.outputFormatter;\n const shouldMarkAcpErrorsEmitted = rendersAcpErrors(options.errorEmissionPolicy);\n let promptTurnActive = false;\n let promptTurnHadSideEffects = false;\n const acpErrors = new AcpErrorTracker();\n const client = new AcpClient({\n agentCommand: options.agentCommand,\n agentArgv: options.agentArgv,\n cwd: absolutePath(options.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n permissionPolicy: options.permissionPolicy,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n onAcpMessage: options.onAcpMessage,\n onAcpOutputMessage: (direction, message) => {\n acpErrors.observe(output, direction, message);\n },\n onSessionUpdate: (notification) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n options.onSessionUpdate?.(notification);\n },\n onClientOperation: (operation) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n options.onClientOperation?.(operation);\n },\n onPermissionEscalation: (event) => {\n output.onPermissionEscalation(event);\n options.onPermissionEscalation?.(event);\n },\n sessionOptions: options.sessionOptions,\n });\n\n const runExecPromptAttempt = async (sessionId: string) => {\n acpErrors.reset();\n return await measurePerf(\"runtime.exec.prompt\", async () => {\n return await withTimeout(client.prompt(sessionId, options.prompt), options.timeoutMs);\n });\n };\n\n const runExecPromptWithRetries = async (sessionId: string) => {\n const maxRetries = options.promptRetries ?? 0;\n promptTurnActive = true;\n for (let attempt = 0; ; attempt++) {\n try {\n return await runExecPromptAttempt(sessionId);\n } catch (error) {\n if (\n await preparePromptRetry(\n error,\n attempt,\n maxRetries,\n () => promptTurnHadSideEffects,\n options.suppressSdkConsoleErrors,\n )\n ) {\n continue;\n }\n promptTurnActive = false;\n throw error;\n }\n }\n };\n\n try {\n return await withInterrupt(\n async () => {\n await measurePerf(\"runtime.exec.start\", async () => {\n await withTimeout(client.start(), options.timeoutMs);\n });\n const createdSession = await measurePerf(\"runtime.exec.create_session\", async () => {\n return await withTimeout(\n client.createSession(absolutePath(options.cwd)),\n options.timeoutMs,\n );\n });\n const sessionId = createdSession.sessionId;\n await applyRequestedModelIfAdvertised({\n client,\n sessionId,\n requestedModel: options.sessionOptions?.model,\n models: createdSession.models,\n agentCommand: options.agentCommand,\n timeoutMs: options.timeoutMs,\n onWarning: options.suppressSdkConsoleErrors\n ? undefined\n : (message) => process.stderr.write(`[acpx] warning: ${message}\\n`),\n });\n for (const configOption of options.configOptions ?? []) {\n await withTimeout(\n client.setSessionConfigOption(sessionId, configOption.configId, configOption.value),\n options.timeoutMs,\n );\n }\n\n output.setContext({\n sessionId,\n });\n\n const response = await runExecPromptWithRetries(sessionId);\n promptTurnActive = false;\n output.flush();\n return toPromptResult(response.stopReason, sessionId, client, response._meta);\n },\n async () => {\n await client.cancelActivePrompt(INTERRUPT_CANCEL_WAIT_MS);\n await client.close();\n },\n );\n } catch (error) {\n const matchedAcpError = acpErrors.match(error);\n attachAcpErrorPayload(error, matchedAcpError);\n markOutputAlreadyEmitted(error, matchedAcpError !== undefined && shouldMarkAcpErrorsEmitted);\n throw error;\n } finally {\n await client.close();\n }\n}\n\nexport async function sendSessionDirect(options: SessionSendOptions): Promise<SessionSendResult> {\n return await runSessionPrompt({\n sessionRecordId: options.sessionId,\n prompt: options.prompt,\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n resumePolicy: options.resumePolicy,\n nonInteractivePermissions: options.nonInteractivePermissions,\n permissionPolicy: options.permissionPolicy,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n outputFormatter: options.outputFormatter,\n errorEmissionPolicy: options.errorEmissionPolicy,\n onAcpMessage: options.onAcpMessage,\n onSessionUpdate: options.onSessionUpdate,\n onClientOperation: options.onClientOperation,\n onPermissionEscalation: options.onPermissionEscalation,\n timeoutMs: options.timeoutMs,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n client: options.client,\n });\n}\n","import { AcpClient } from \"../../acp/client.js\";\nimport { formatErrorMessage } from \"../../acp/error-normalization.js\";\nimport { withTimeout } from \"../../async-control.js\";\nimport { checkpointPerfMetricsCapture } from \"../../perf-metrics-capture.js\";\nimport { setPerfGauge } from \"../../perf-metrics.js\";\nimport { promptToDisplayText } from \"../../prompt-content.js\";\nimport { applyLifecycleSnapshotToRecord } from \"../../runtime/engine/lifecycle.js\";\nimport {\n mergeSessionOptions,\n sessionOptionsFromRecord,\n} from \"../../runtime/engine/session-options.js\";\nimport type { SessionSendOutcome } from \"../../types.js\";\nimport { absolutePath, resolveSessionRecord, writeSessionRecord } from \"../persistence.js\";\nimport {\n QUEUE_CONNECT_RETRY_MS,\n SessionQueueOwner,\n releaseQueueOwnerLease,\n tryAcquireQueueOwnerLease,\n trySubmitToRunningOwner,\n type QueueOwnerLease,\n waitMs,\n} from \"../queue/ipc.js\";\nimport { refreshQueueOwnerLease } from \"../queue/lease-store.js\";\nimport { QueueOwnerTurnController } from \"../queue/owner-turn-controller.js\";\nimport {\n DEFAULT_QUEUE_OWNER_TTL_MS,\n normalizeQueueOwnerTtlMs,\n type SessionSendOptions,\n} from \"./contracts.js\";\nimport {\n runSessionSetConfigOptionDirect,\n runSessionSetModelDirect,\n runSessionSetModeDirect,\n type ActiveSessionController,\n} from \"./prompt-runner.js\";\nimport type {\n QueueOwnerProcessExitState,\n QueueOwnerRuntimeOptions,\n} from \"./queue-owner-process.js\";\nimport {\n formatQueueOwnerStartupFailure,\n queueOwnerRuntimeOptionsFromSend,\n spawnQueueOwnerProcess,\n} from \"./queue-owner-process.js\";\nimport { runQueuedTask } from \"./runtime.js\";\n\nconst QUEUE_OWNER_STARTUP_MAX_ATTEMPTS = 120;\nconst QUEUE_OWNER_HEARTBEAT_INTERVAL_MS = 5_000;\nconst QUEUE_OWNER_ACTIVE_TURN_CANCEL_GRACE_MS = 750;\n\nasync function submitToRunningOwner(\n options: SessionSendOptions,\n waitForCompletion: boolean,\n extras?: { onQueueAccepted?: () => void },\n): Promise<SessionSendOutcome | undefined> {\n return await trySubmitToRunningOwner({\n sessionId: options.sessionId,\n requestId: options.requestId,\n requireSharedRuntime: options.requireSharedRuntime,\n signal: options.signal,\n message: promptToDisplayText(options.prompt),\n prompt: options.prompt,\n mcpConfigPath: options.mcpConfigPath,\n mcpConfigFingerprint: options.mcpConfigFingerprint,\n permissionMode: options.permissionMode,\n resumePolicy: options.resumePolicy,\n nonInteractivePermissions: options.nonInteractivePermissions,\n permissionPolicy: options.permissionPolicy,\n outputFormatter: options.outputFormatter,\n errorEmissionPolicy: options.errorEmissionPolicy,\n timeoutMs: options.timeoutMs,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n promptRetries: options.promptRetries,\n waitForCompletion,\n verbose: options.verbose,\n sessionOptions: options.sessionOptions,\n onQueueAccepted: () => {\n extras?.onQueueAccepted?.();\n options.onQueueAccepted?.();\n },\n onPromptStarted: options.onPromptStarted,\n });\n}\n\nfunction createQueueOwnerSharedClient(\n options: QueueOwnerRuntimeOptions,\n sessionRecord: Awaited<ReturnType<typeof resolveSessionRecord>>,\n): AcpClient {\n return new AcpClient({\n agentCommand: sessionRecord.agentCommand,\n agentArgv: sessionRecord.agentArgv,\n cwd: absolutePath(sessionRecord.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n sessionOptions: mergeSessionOptions(\n options.sessionOptions,\n sessionOptionsFromRecord(sessionRecord),\n ),\n });\n}\n\nfunction createQueueOwnerTurnController(\n options: QueueOwnerRuntimeOptions,\n): QueueOwnerTurnController {\n return new QueueOwnerTurnController({\n withTimeout: async (run, timeoutMs) => await withTimeout(run(), timeoutMs),\n setSessionModeFallback: async (modeId: string, timeoutMs?: number) => {\n await runSessionSetModeDirect({\n sessionRecordId: options.sessionId,\n modeId,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n timeoutMs,\n verbose: options.verbose,\n });\n },\n setSessionModelFallback: async (modelId: string, timeoutMs?: number) => {\n const result = await runSessionSetModelDirect({\n sessionRecordId: options.sessionId,\n modelId,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n timeoutMs,\n verbose: options.verbose,\n });\n return result.response;\n },\n setSessionConfigOptionFallback: async (configId: string, value: string, timeoutMs?: number) => {\n const result = await runSessionSetConfigOptionDirect({\n sessionRecordId: options.sessionId,\n configId,\n value,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n fs: options.fs,\n terminal: options.terminal,\n timeoutMs,\n verbose: options.verbose,\n });\n return result.response;\n },\n });\n}\n\nfunction logDeferredCancelFailure(error: unknown, verbose?: boolean): void {\n if (!verbose) {\n return;\n }\n process.stderr.write(`[acpx] failed to apply deferred cancel: ${formatErrorMessage(error)}\\n`);\n}\n\nfunction queueOwnerExitIsFatal(exit: QueueOwnerProcessExitState): boolean {\n return (\n exit.exited &&\n (exit.spawnError !== undefined ||\n exit.inputError !== undefined ||\n exit.code !== 0 ||\n exit.signal !== null)\n );\n}\n\nfunction logQueueOwnerReady(params: {\n sessionId: string;\n ttlMs: number;\n maxQueueDepth: number;\n verbose?: boolean;\n}): void {\n if (!params.verbose) {\n return;\n }\n process.stderr.write(\n `[acpx] queue owner ready for session ${params.sessionId} (ttlMs=${params.ttlMs}, maxQueueDepth=${params.maxQueueDepth})\\n`,\n );\n}\n\nasync function closeQueueOwnerRuntime(params: {\n owner: SessionQueueOwner | undefined;\n turnController: QueueOwnerTurnController;\n sharedClient: AcpClient;\n sessionId: string;\n verbose?: boolean;\n}): Promise<void> {\n params.turnController.beginClosing();\n // Kill the bridge before draining IPC so it cannot outlive the owner.\n await params.sharedClient.close().catch(() => {\n // best effort while queue owner is shutting down\n });\n await params.owner?.close();\n await writeQueueOwnerLifecycleSnapshot(params.sessionId, params.sharedClient);\n if (params.verbose) {\n process.stderr.write(`[acpx] queue owner stopped for session ${params.sessionId}\\n`);\n }\n}\n\nasync function writeQueueOwnerLifecycleSnapshot(\n sessionId: string,\n sharedClient: AcpClient,\n): Promise<void> {\n try {\n const record = await resolveSessionRecord(sessionId);\n applyLifecycleSnapshotToRecord(record, sharedClient.getAgentLifecycleSnapshot());\n await writeSessionRecord(record);\n } catch {\n // best effort - session may already be cleaned up\n }\n}\n\nasync function settlesWithin(promise: Promise<unknown>, timeoutMs: number): Promise<boolean> {\n let timer: NodeJS.Timeout | undefined;\n const timeout = new Promise<false>((resolve) => {\n timer = setTimeout(() => resolve(false), timeoutMs);\n });\n try {\n return await Promise.race([\n promise.then(\n () => true,\n () => true,\n ),\n timeout,\n ]);\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n }\n}\n\ntype QueueOwnerShutdownController = {\n readonly requested: boolean;\n request: () => void;\n setActiveTurn: (turn: Promise<void>) => void;\n clearActiveTurn: (turn: Promise<void>) => void;\n shutdown: () => Promise<void>;\n};\n\nfunction createQueueOwnerShutdownController(params: {\n getOwner: () => SessionQueueOwner | undefined;\n stopHeartbeat: () => void;\n turnController: QueueOwnerTurnController;\n sharedClient: AcpClient;\n sessionId: string;\n verbose?: boolean;\n}): QueueOwnerShutdownController {\n let requested = false;\n let activeTurn: Promise<void> | undefined;\n let activeTurnShutdown: Promise<void> | undefined;\n let shutdownPromise: Promise<void> | undefined;\n\n const drainActiveTurn = async (): Promise<void> => {\n const turn = activeTurn;\n if (!turn) {\n return;\n }\n\n void params.turnController.requestCancel().catch((error) => {\n logDeferredCancelFailure(error, params.verbose);\n });\n\n if (!(await settlesWithin(turn, QUEUE_OWNER_ACTIVE_TURN_CANCEL_GRACE_MS))) {\n // A bridge that ignores session/cancel must still be terminated before\n // the external queue-owner SIGKILL deadline. Closing it forces the active\n // turn to unwind; the lease remains held until that unwind completes.\n await params.sharedClient.close().catch(() => {\n // best effort while forcing active-turn cancellation\n });\n }\n await turn.catch(() => {\n // The main loop preserves the original turn result; shutdown only waits\n // for its cleanup boundary before releasing the lease.\n });\n };\n\n const request = (): void => {\n requested = true;\n params.stopHeartbeat();\n params.getOwner()?.beginShutdown();\n activeTurnShutdown ??= drainActiveTurn();\n };\n\n return {\n get requested() {\n return requested;\n },\n request,\n setActiveTurn: (turn) => {\n activeTurn = turn;\n },\n clearActiveTurn: (turn) => {\n if (activeTurn === turn) {\n activeTurn = undefined;\n }\n },\n shutdown: () => {\n request();\n shutdownPromise ??= (async () => {\n await activeTurnShutdown;\n await closeQueueOwnerRuntime({\n owner: params.getOwner(),\n turnController: params.turnController,\n sharedClient: params.sharedClient,\n sessionId: params.sessionId,\n verbose: params.verbose,\n });\n })();\n return shutdownPromise;\n },\n };\n}\n\nfunction applyRequestedShutdown(\n owner: SessionQueueOwner,\n shutdown: QueueOwnerShutdownController,\n): void {\n if (shutdown.requested) {\n owner.beginShutdown();\n }\n}\n\nfunction startQueueOwnerHeartbeat(params: {\n enabled: boolean;\n lease: QueueOwnerLease;\n owner: SessionQueueOwner;\n}): NodeJS.Timeout | undefined {\n if (!params.enabled) {\n return undefined;\n }\n return setInterval(() => {\n void refreshQueueOwnerLease(params.lease, { queueDepth: params.owner.queueDepth() }).catch(\n () => {\n // best effort heartbeat refresh while owner is live\n },\n );\n }, QUEUE_OWNER_HEARTBEAT_INTERVAL_MS);\n}\n\nexport async function runSessionQueueOwner(options: QueueOwnerRuntimeOptions): Promise<void> {\n const lease = await tryAcquireQueueOwnerLease(options.sessionId, {\n path: options.mcpConfigPath,\n fingerprint: options.mcpConfigFingerprint,\n });\n if (!lease) {\n return;\n }\n try {\n await runQueueOwnerRuntime(options, lease);\n } finally {\n await releaseQueueOwnerLease(lease);\n }\n}\n\nasync function runQueueOwnerRuntime(\n options: QueueOwnerRuntimeOptions,\n lease: QueueOwnerLease,\n): Promise<void> {\n const sessionRecord = await resolveSessionRecord(options.sessionId);\n let owner: SessionQueueOwner | undefined;\n let heartbeatTimer: NodeJS.Timeout | undefined;\n const sharedClient = createQueueOwnerSharedClient(options, sessionRecord);\n const ttlMs = normalizeQueueOwnerTtlMs(options.ttlMs);\n const maxQueueDepth = Math.max(1, Math.round(options.maxQueueDepth ?? 16));\n const taskPollTimeoutMs = ttlMs === 0 ? undefined : ttlMs;\n const initialTaskPollTimeoutMs =\n taskPollTimeoutMs == null ? undefined : Math.max(taskPollTimeoutMs, 1_000);\n const turnController = createQueueOwnerTurnController(options);\n\n const applyPendingCancel = async (): Promise<boolean> => {\n return await turnController.applyPendingCancel();\n };\n\n const scheduleApplyPendingCancel = (): void => {\n void applyPendingCancel().catch((error) => {\n logDeferredCancelFailure(error, options.verbose);\n });\n };\n\n const setActiveController = (controller: ActiveSessionController) => {\n turnController.setActiveController(controller);\n scheduleApplyPendingCancel();\n };\n\n const clearActiveController = () => {\n turnController.clearActiveController();\n };\n\n const closeActiveBackendSession = async (timeoutMs?: number): Promise<boolean> => {\n const latestRecord = await resolveSessionRecord(options.sessionId);\n if (!sharedClient.supportsCloseSession()) {\n return false;\n }\n await withTimeout(sharedClient.closeSession(latestRecord.acpSessionId), timeoutMs);\n return true;\n };\n\n const runPromptTurn = async <T>(run: (waitSignal: AbortSignal) => Promise<T>): Promise<T> => {\n const waitSignal = turnController.beginTurn();\n try {\n return await run(waitSignal);\n } finally {\n turnController.endTurn();\n }\n };\n\n const shutdown = createQueueOwnerShutdownController({\n getOwner: () => owner,\n stopHeartbeat: () => {\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n heartbeatTimer = undefined;\n }\n },\n turnController,\n sharedClient,\n sessionId: options.sessionId,\n verbose: options.verbose,\n });\n\n const onSignal = (): void => {\n shutdown.request();\n };\n\n process.once(\"SIGINT\", onSignal);\n process.once(\"SIGTERM\", onSignal);\n process.once(\"SIGHUP\", onSignal);\n\n try {\n owner = await SessionQueueOwner.start(\n lease,\n {\n cancelPrompt: async () => {\n const accepted = await turnController.requestCancel();\n if (!accepted) {\n return false;\n }\n await applyPendingCancel();\n return true;\n },\n closeSession: async (timeoutMs?: number) => await closeActiveBackendSession(timeoutMs),\n setSessionMode: async (modeId: string, timeoutMs?: number) => {\n await turnController.setSessionMode(modeId, timeoutMs);\n },\n setSessionModel: async (modelId: string, timeoutMs?: number) =>\n await turnController.setSessionModel(modelId, timeoutMs),\n setSessionConfigOption: async (configId: string, value: string, timeoutMs?: number) => {\n return await turnController.setSessionConfigOption(configId, value, timeoutMs);\n },\n },\n {\n maxQueueDepth,\n onQueueDepthChanged: (queueDepth) => {\n setPerfGauge(\"queue.owner.depth\", queueDepth);\n void refreshQueueOwnerLease(lease, { queueDepth }).catch(() => {\n // best effort heartbeat refresh while owner is live\n });\n },\n },\n );\n\n applyRequestedShutdown(owner, shutdown);\n\n logQueueOwnerReady({\n sessionId: options.sessionId,\n ttlMs,\n maxQueueDepth,\n verbose: options.verbose,\n });\n await refreshQueueOwnerLease(lease, { queueDepth: owner.queueDepth() }).catch(() => {\n // best effort initial heartbeat\n });\n heartbeatTimer = startQueueOwnerHeartbeat({\n enabled: !shutdown.requested,\n lease,\n owner,\n });\n let isFirstTask = true;\n while (true) {\n const pollTimeoutMs = isFirstTask ? initialTaskPollTimeoutMs : taskPollTimeoutMs;\n const task = await owner.nextTask(pollTimeoutMs);\n if (!task) {\n break;\n }\n isFirstTask = false;\n\n const turnPromise = runPromptTurn(async (waitSignal) => {\n try {\n await runQueuedTask(options.sessionId, task, {\n sharedClient,\n verbose: options.verbose,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n promptRetries: task.promptRetries ?? 0,\n sessionOptions: options.sessionOptions,\n onClientAvailable: setActiveController,\n onClientClosed: clearActiveController,\n onPromptActive: async () => {\n turnController.markPromptActive();\n await applyPendingCancel();\n },\n handleProcessInterrupts: false,\n waitSignal,\n });\n } finally {\n checkpointPerfMetricsCapture();\n }\n });\n shutdown.setActiveTurn(turnPromise);\n try {\n await turnPromise;\n } finally {\n shutdown.clearActiveTurn(turnPromise);\n owner.completeTask(task);\n }\n }\n } finally {\n process.off(\"SIGINT\", onSignal);\n process.off(\"SIGTERM\", onSignal);\n process.off(\"SIGHUP\", onSignal);\n await shutdown.shutdown();\n }\n}\n\nexport async function sendSession(options: SessionSendOptions): Promise<SessionSendOutcome> {\n options.signal?.throwIfAborted();\n const waitForCompletion = options.waitForCompletion !== false;\n\n const queuedToOwner = await submitToRunningOwner(options, waitForCompletion);\n if (queuedToOwner) {\n return queuedToOwner;\n }\n\n options.signal?.throwIfAborted();\n const owner = spawnQueueOwnerProcess(\n queueOwnerRuntimeOptionsFromSend(options),\n options.queueOwnerArgs,\n );\n // Stop retaining diagnostics at first IPC accept (not after full turn completion).\n const onQueueAccepted = () => {\n owner.stopStartupCapture();\n };\n\n try {\n for (let attempt = 0; attempt < QUEUE_OWNER_STARTUP_MAX_ATTEMPTS; attempt += 1) {\n options.signal?.throwIfAborted();\n const queued = await submitToRunningOwner(options, waitForCompletion, { onQueueAccepted });\n if (queued) {\n return queued;\n }\n const exit = owner.getExitState();\n if (queueOwnerExitIsFatal(exit)) {\n const message = formatQueueOwnerStartupFailure({\n sessionId: options.sessionId,\n exit,\n logTail: owner.readLogTail(),\n });\n throw new Error(message);\n }\n await waitMs(QUEUE_CONNECT_RETRY_MS);\n }\n\n const message = formatQueueOwnerStartupFailure({\n sessionId: options.sessionId,\n exit: owner.getExitState(),\n logTail: owner.readLogTail(),\n });\n throw new Error(message);\n } finally {\n owner.stopStartupCapture();\n }\n}\n\nexport type { QueueOwnerRuntimeOptions };\nexport { DEFAULT_QUEUE_OWNER_TTL_MS };\nexport const queueOwnerRuntimeTestInternals = { queueOwnerExitIsFatal };\n"],"mappings":"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"}