acpx 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -6
- package/dist/{cli-T-Z-9x6a.js → cli-Bf3yjqzE.js} +35 -10
- package/dist/cli-Bf3yjqzE.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +724 -241
- package/dist/cli.js.map +1 -1
- package/dist/{client-COPilhO_.d.ts → client-BssohYqM.d.ts} +35 -4
- package/dist/client-BssohYqM.d.ts.map +1 -0
- package/dist/flags-C-rwARqg.js +260 -0
- package/dist/flags-C-rwARqg.js.map +1 -0
- package/dist/{flows-CF8w1rPI.js → flows-WLs26_5Y.js} +405 -337
- package/dist/flows-WLs26_5Y.js.map +1 -0
- package/dist/flows.d.ts +23 -2
- package/dist/flows.d.ts.map +1 -1
- package/dist/flows.js +1 -1
- package/dist/{prompt-turn-CVPMWdj1.js → live-checkpoint-D5d-K9s1.js} +2487 -609
- package/dist/live-checkpoint-D5d-K9s1.js.map +1 -0
- package/dist/output-DPg20dvn.js +4146 -0
- package/dist/output-DPg20dvn.js.map +1 -0
- package/dist/runtime.d.ts +56 -4
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +676 -393
- package/dist/runtime.js.map +1 -1
- package/dist/{types-CVBeQyi3.d.ts → session-options-CFudjdkU.d.ts} +62 -3
- package/dist/session-options-CFudjdkU.d.ts.map +1 -0
- package/package.json +30 -25
- package/skills/acpx/SKILL.md +211 -13
- package/dist/cli-T-Z-9x6a.js.map +0 -1
- package/dist/client-COPilhO_.d.ts.map +0 -1
- package/dist/flags-Dj-IXgo9.js +0 -163
- package/dist/flags-Dj-IXgo9.js.map +0 -1
- package/dist/flows-CF8w1rPI.js.map +0 -1
- package/dist/ipc-ABXlXzGP.js +0 -1290
- package/dist/ipc-ABXlXzGP.js.map +0 -1
- package/dist/jsonrpc-DSxh2w5R.js +0 -68
- package/dist/jsonrpc-DSxh2w5R.js.map +0 -1
- package/dist/output-DmHvT8vm.js +0 -807
- package/dist/output-DmHvT8vm.js.map +0 -1
- package/dist/perf-metrics-C2pXfxvR.js +0 -598
- package/dist/perf-metrics-C2pXfxvR.js.map +0 -1
- package/dist/prompt-turn-CVPMWdj1.js.map +0 -1
- package/dist/render-N5YwotCy.js +0 -172
- package/dist/render-N5YwotCy.js.map +0 -1
- package/dist/rolldown-runtime-CiIaOW0V.js +0 -13
- package/dist/session-CDaQe6BH.js +0 -1538
- package/dist/session-CDaQe6BH.js.map +0 -1
- package/dist/session-options-pCbHn_n7.d.ts +0 -13
- package/dist/session-options-pCbHn_n7.d.ts.map +0 -1
- package/dist/types-CVBeQyi3.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-DPg20dvn.js","names":["fs","asRecord","fs","fs","segmentEventPath","activeEventPath","eventsLockPath","jsonRpcIdKey","recordConversationSessionUpdate","recordConversationClientOperation","asRecord"],"sources":["../src/cli/session/contracts.ts","../src/process-liveness.ts","../src/cli/queue/paths.ts","../src/cli/queue/lease-store.ts","../src/cli/queue/ipc-transport.ts","../src/cli/queue/ipc-health.ts","../src/cli/queue/messages.ts","../src/cli/queue/ipc-server.ts","../src/cli/queue/ipc.ts","../src/cli/session/prompt-runner.ts","../src/cli/session/session-control.ts","../src/cli/session/session-management.ts","../src/perf-metrics-capture.ts","../src/cli/queue/owner-turn-controller.ts","../src/cli/session/queue-owner-process.ts","../src/session/events.ts","../src/cli/session/runtime.ts","../src/cli/session/queue-owner-runtime.ts","../src/session/session.ts","../src/acp/jsonrpc-error.ts","../src/cli/output/read-suppression.ts","../src/cli/output/json-formatter.ts","../src/cli/output/output.ts"],"sourcesContent":["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\ntype TimedRunOptions = {\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 cwd: string;\n prompt: PromptInput;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n permissionPolicy?: PermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\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 suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n sessionOptions?: SessionAgentOptions;\n promptRetries?: number;\n} & TimedRunOptions;\n\nexport type SessionCreateOptions = {\n agentCommand: string;\n cwd: string;\n name?: string;\n resumeSessionId?: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n permissionPolicy?: PermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n verbose?: boolean;\n sessionOptions?: SessionAgentOptions;\n} & TimedRunOptions;\n\nexport type SessionSendOptions = {\n sessionId: string;\n prompt: PromptInput;\n resumePolicy?: SessionResumePolicy;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n permissionPolicy?: PermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\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 verbose?: boolean;\n waitForCompletion?: boolean;\n ttlMs?: number;\n maxQueueDepth?: number;\n client?: AcpClient;\n promptRetries?: number;\n sessionOptions?: SessionAgentOptions;\n} & TimedRunOptions;\n\nexport type SessionEnsureOptions = {\n agentCommand: string;\n cwd: string;\n name?: string;\n resumeSessionId?: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n permissionPolicy?: PermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n verbose?: boolean;\n walkBoundary?: string;\n sessionOptions?: SessionAgentOptions;\n} & TimedRunOptions;\n\nexport type SessionListOptions = {\n agentCommand: string;\n cwd: string;\n cursor?: string;\n filterCwd?: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n permissionPolicy?: PermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n verbose?: boolean;\n} & TimedRunOptions;\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 mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n verbose?: boolean;\n} & TimedRunOptions;\n\nexport type SessionSetModelOptions = {\n sessionId: string;\n modelId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n verbose?: boolean;\n} & TimedRunOptions;\n\nexport type SessionSetConfigOptionOptions = {\n sessionId: string;\n configId: string;\n value: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n verbose?: boolean;\n} & TimedRunOptions;\n\nexport type SessionCreateWithClientResult = {\n record: SessionRecord;\n client: AcpClient;\n};\n\nexport type { SessionAgentOptions };\n","export function isProcessAlive(pid: number | undefined): boolean {\n if (!pid || !Number.isInteger(pid) || pid <= 0 || pid === process.pid) {\n return false;\n }\n\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n","import { createHash } from \"node:crypto\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nfunction shortHash(value: string, length: number): string {\n return createHash(\"sha256\").update(value).digest(\"hex\").slice(0, length);\n}\n\nexport function queueKeyForSession(sessionId: string): string {\n return shortHash(sessionId, 24);\n}\n\nexport function queueBaseDir(homeDir: string = os.homedir()): string {\n return path.join(homeDir, \".acpx\", \"queues\");\n}\n\nexport function queueSocketBaseDir(homeDir: string = os.homedir()): string | undefined {\n if (process.platform === \"win32\") {\n return undefined;\n }\n return path.join(\"/tmp\", `acpx-${shortHash(homeDir, 10)}`);\n}\n\nexport function queueLockFilePath(sessionId: string, homeDir: string = os.homedir()): string {\n return path.join(queueBaseDir(homeDir), `${queueKeyForSession(sessionId)}.lock`);\n}\n\nexport function queueSocketPath(sessionId: string, homeDir: string = os.homedir()): string {\n const key = queueKeyForSession(sessionId);\n if (process.platform === \"win32\") {\n return `\\\\\\\\.\\\\pipe\\\\acpx-${key}`;\n }\n return path.join(queueSocketBaseDir(homeDir) ?? \"/tmp\", `${key}.sock`);\n}\n","import { randomInt } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport { isProcessAlive } from \"../../process-liveness.js\";\nimport { queueBaseDir, queueLockFilePath, queueSocketBaseDir, queueSocketPath } from \"./paths.js\";\n\nexport { isProcessAlive } from \"../../process-liveness.js\";\n\nconst PROCESS_EXIT_GRACE_MS = 1_500;\nconst PROCESS_POLL_MS = 50;\nconst QUEUE_OWNER_STALE_HEARTBEAT_MS = 15_000;\n\nexport type QueueOwnerRecord = {\n pid: number;\n sessionId: string;\n socketPath: string;\n createdAt: string;\n heartbeatAt: string;\n ownerGeneration: number;\n queueDepth: number;\n};\n\nexport type QueueOwnerLease = {\n sessionId: string;\n lockPath: string;\n socketPath: string;\n createdAt: string;\n ownerGeneration: number;\n};\n\nexport type QueueOwnerStatus = {\n pid: number;\n socketPath: string;\n heartbeatAt: string;\n ownerGeneration: number;\n queueDepth: number;\n alive: boolean;\n stale: boolean;\n};\n\nfunction parseQueueOwnerRecord(raw: unknown): QueueOwnerRecord | null {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n return null;\n }\n const record = raw as Record<string, unknown>;\n\n if (!hasValidQueueOwnerRecordFields(record)) {\n return null;\n }\n\n return {\n pid: record.pid,\n sessionId: record.sessionId,\n socketPath: record.socketPath,\n createdAt: record.createdAt,\n heartbeatAt: record.heartbeatAt,\n ownerGeneration: record.ownerGeneration,\n queueDepth: record.queueDepth,\n };\n}\n\nfunction hasValidQueueOwnerRecordFields(record: Record<string, unknown>): record is Record<\n string,\n unknown\n> & {\n pid: number;\n sessionId: string;\n socketPath: string;\n createdAt: string;\n heartbeatAt: string;\n ownerGeneration: number;\n queueDepth: number;\n} {\n return (\n isPositiveInteger(record.pid) &&\n typeof record.sessionId === \"string\" &&\n typeof record.socketPath === \"string\" &&\n typeof record.createdAt === \"string\" &&\n typeof record.heartbeatAt === \"string\" &&\n isPositiveInteger(record.ownerGeneration) &&\n isNonNegativeInteger(record.queueDepth)\n );\n}\n\nfunction isPositiveInteger(value: unknown): value is number {\n return Number.isInteger(value) && (value as number) > 0;\n}\n\nfunction isNonNegativeInteger(value: unknown): value is number {\n return Number.isInteger(value) && (value as number) >= 0;\n}\n\nfunction createOwnerGeneration(): number {\n return randomInt(1, 2 ** 48);\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction isQueueOwnerHeartbeatStale(owner: QueueOwnerRecord): boolean {\n const heartbeatMs = Date.parse(owner.heartbeatAt);\n if (!Number.isFinite(heartbeatMs)) {\n return true;\n }\n return Date.now() - heartbeatMs > QUEUE_OWNER_STALE_HEARTBEAT_MS;\n}\n\nasync function ensureQueueDir(): Promise<void> {\n const baseDir = queueBaseDir();\n await fs.mkdir(baseDir, { recursive: true, mode: 0o700 });\n await fs.chmod(baseDir, 0o700);\n const socketDir = queueSocketBaseDir();\n if (socketDir) {\n await fs.mkdir(socketDir, { recursive: true, mode: 0o700 });\n await fs.chmod(socketDir, 0o700);\n }\n}\n\nasync function removeSocketFile(socketPath: string): Promise<void> {\n if (process.platform === \"win32\") {\n return;\n }\n\n try {\n await fs.unlink(socketPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n}\n\nasync function waitForProcessExit(pid: number, timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + Math.max(0, timeoutMs);\n while (Date.now() <= deadline) {\n if (!isProcessAlive(pid)) {\n return true;\n }\n await waitMs(PROCESS_POLL_MS);\n }\n\n return !isProcessAlive(pid);\n}\n\nasync function cleanupStaleQueueOwner(\n sessionId: string,\n owner: QueueOwnerRecord | undefined,\n): Promise<void> {\n const lockPath = queueLockFilePath(sessionId);\n const socketPath = owner?.socketPath ?? queueSocketPath(sessionId);\n\n await removeSocketFile(socketPath).catch(() => {\n // ignore stale socket cleanup failures\n });\n\n await fs.unlink(lockPath).catch((error) => {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n });\n}\n\nexport async function readQueueOwnerRecord(\n sessionId: string,\n): Promise<QueueOwnerRecord | undefined> {\n const lockPath = queueLockFilePath(sessionId);\n try {\n const payload = await fs.readFile(lockPath, \"utf8\");\n const parsed = parseQueueOwnerRecord(JSON.parse(payload));\n return parsed ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function terminateProcess(pid: number): Promise<boolean> {\n if (!isProcessAlive(pid)) {\n return false;\n }\n\n try {\n process.kill(pid, \"SIGTERM\");\n } catch {\n return false;\n }\n\n if (await waitForProcessExit(pid, PROCESS_EXIT_GRACE_MS)) {\n return true;\n }\n\n try {\n process.kill(pid, \"SIGKILL\");\n } catch {\n return false;\n }\n\n await waitForProcessExit(pid, PROCESS_EXIT_GRACE_MS);\n return true;\n}\n\nexport async function ensureOwnerIsUsable(\n sessionId: string,\n owner: QueueOwnerRecord,\n): Promise<boolean> {\n const alive = isProcessAlive(owner.pid);\n const stale = isQueueOwnerHeartbeatStale(owner);\n if (alive && !stale) {\n return true;\n }\n\n if (alive) {\n await terminateProcess(owner.pid).catch(() => {\n // best effort stale owner termination\n });\n }\n await cleanupStaleQueueOwner(sessionId, owner);\n return false;\n}\n\nexport async function readQueueOwnerStatus(\n sessionId: string,\n): Promise<QueueOwnerStatus | undefined> {\n const owner = await readQueueOwnerRecord(sessionId);\n if (!owner) {\n return undefined;\n }\n\n const alive = await ensureOwnerIsUsable(sessionId, owner);\n if (!alive) {\n return undefined;\n }\n\n return {\n pid: owner.pid,\n socketPath: owner.socketPath,\n heartbeatAt: owner.heartbeatAt,\n ownerGeneration: owner.ownerGeneration,\n queueDepth: owner.queueDepth,\n alive,\n stale: isQueueOwnerHeartbeatStale(owner),\n };\n}\n\nexport async function tryAcquireQueueOwnerLease(\n sessionId: string,\n nowIsoFactory: () => string = nowIso,\n): Promise<QueueOwnerLease | undefined> {\n await ensureQueueDir();\n const lockPath = queueLockFilePath(sessionId);\n const socketPath = queueSocketPath(sessionId);\n const createdAt = nowIsoFactory();\n const ownerGeneration = createOwnerGeneration();\n const payload = JSON.stringify(\n {\n pid: process.pid,\n sessionId,\n socketPath,\n createdAt,\n heartbeatAt: createdAt,\n ownerGeneration,\n queueDepth: 0,\n },\n null,\n 2,\n );\n\n try {\n await fs.writeFile(lockPath, `${payload}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n });\n await removeSocketFile(socketPath).catch(() => {\n // best-effort stale socket cleanup after ownership is acquired\n });\n return {\n sessionId,\n lockPath,\n socketPath,\n createdAt,\n ownerGeneration,\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n\n const owner = await readQueueOwnerRecord(sessionId);\n if (!owner) {\n await cleanupStaleQueueOwner(sessionId, owner);\n return undefined;\n }\n\n if (!isProcessAlive(owner.pid) || isQueueOwnerHeartbeatStale(owner)) {\n if (isProcessAlive(owner.pid)) {\n await terminateProcess(owner.pid).catch(() => {\n // best effort stale owner termination\n });\n }\n await cleanupStaleQueueOwner(sessionId, owner);\n }\n return undefined;\n }\n}\n\nexport async function refreshQueueOwnerLease(\n lease: QueueOwnerLease,\n options: {\n queueDepth: number;\n },\n nowIsoFactory: () => string = nowIso,\n): Promise<void> {\n const payload = JSON.stringify(\n {\n pid: process.pid,\n sessionId: lease.sessionId,\n socketPath: lease.socketPath,\n createdAt: lease.createdAt,\n heartbeatAt: nowIsoFactory(),\n ownerGeneration: lease.ownerGeneration,\n queueDepth: Math.max(0, Math.round(options.queueDepth)),\n },\n null,\n 2,\n );\n await fs.writeFile(lease.lockPath, `${payload}\\n`, {\n encoding: \"utf8\",\n });\n}\n\nexport async function releaseQueueOwnerLease(lease: QueueOwnerLease): Promise<void> {\n await removeSocketFile(lease.socketPath).catch(() => {\n // ignore best-effort cleanup failures\n });\n\n await fs.unlink(lease.lockPath).catch((error) => {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n });\n}\n\nexport async function terminateQueueOwnerForSession(sessionId: string): Promise<void> {\n const owner = await readQueueOwnerRecord(sessionId);\n if (!owner) {\n return;\n }\n\n if (isProcessAlive(owner.pid)) {\n await terminateProcess(owner.pid);\n }\n\n await cleanupStaleQueueOwner(sessionId, owner);\n}\n\nexport async function waitMs(ms: number): Promise<void> {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","import net from \"node:net\";\nimport { measurePerf } from \"../../perf-metrics.js\";\nimport { type QueueOwnerRecord, waitMs } from \"./lease-store.js\";\n\nconst QUEUE_CONNECT_ATTEMPTS = 40;\nexport const QUEUE_CONNECT_RETRY_MS = 50;\nexport const SOCKET_CONNECTION_TIMEOUT_MS = 5000;\n\nfunction shouldRetryQueueConnect(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException).code;\n return code === \"ENOENT\" || code === \"ECONNREFUSED\";\n}\n\nasync function connectToSocket(\n socketPath: string,\n timeoutMs = SOCKET_CONNECTION_TIMEOUT_MS,\n): Promise<net.Socket> {\n return await new Promise<net.Socket>((resolve, reject) => {\n const socket = net.createConnection(socketPath);\n let settled = false;\n\n const timeout = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n socket.destroy();\n reject(new Error(`Connection to ${socketPath} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n const onConnect = () => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n socket.off(\"error\", onError);\n resolve(socket);\n };\n const onError = (error: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n socket.off(\"connect\", onConnect);\n reject(error);\n };\n\n socket.once(\"connect\", onConnect);\n socket.once(\"error\", onError);\n });\n}\n\nexport async function connectToQueueOwner(\n owner: QueueOwnerRecord,\n maxAttempts = QUEUE_CONNECT_ATTEMPTS,\n): Promise<net.Socket | undefined> {\n let lastError: unknown;\n\n const attempts = Math.max(1, Math.trunc(maxAttempts));\n for (let attempt = 0; attempt < attempts; attempt += 1) {\n try {\n return await measurePerf(\n \"queue.connect\",\n async () => await connectToSocket(owner.socketPath),\n );\n } catch (error) {\n lastError = error;\n if (!shouldRetryQueueConnect(error)) {\n throw error;\n }\n await waitMs(QUEUE_CONNECT_RETRY_MS);\n }\n }\n\n if (lastError && !shouldRetryQueueConnect(lastError)) {\n throw lastError;\n }\n\n return undefined;\n}\n","import { connectToQueueOwner } from \"./ipc-transport.js\";\nimport { readQueueOwnerRecord, readQueueOwnerStatus } from \"./lease-store.js\";\n\nexport type QueueOwnerHealth = {\n sessionId: string;\n hasLease: boolean;\n healthy: boolean;\n socketReachable: boolean;\n pidAlive: boolean;\n pid?: number;\n socketPath?: string;\n ownerGeneration?: number;\n queueDepth?: number;\n};\n\nexport async function probeQueueOwnerHealth(sessionId: string): Promise<QueueOwnerHealth> {\n const ownerRecord = await readQueueOwnerRecord(sessionId);\n if (!ownerRecord) {\n return {\n sessionId,\n hasLease: false,\n healthy: false,\n socketReachable: false,\n pidAlive: false,\n };\n }\n\n const owner = await readQueueOwnerStatus(sessionId);\n if (!owner) {\n return {\n sessionId,\n hasLease: false,\n healthy: false,\n socketReachable: false,\n pidAlive: false,\n };\n }\n\n const pidAlive = owner.alive;\n let socketReachable = false;\n try {\n const socket = await connectToQueueOwner(ownerRecord, 2);\n if (socket) {\n socketReachable = true;\n if (!socket.destroyed) {\n socket.end();\n }\n }\n } catch {\n socketReachable = false;\n }\n\n return {\n sessionId,\n hasLease: true,\n healthy: socketReachable,\n socketReachable,\n pidAlive,\n pid: owner.pid,\n socketPath: owner.socketPath,\n ownerGeneration: owner.ownerGeneration,\n queueDepth: owner.queueDepth,\n };\n}\n","import type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { toAcpErrorPayload } from \"../../acp/error-shapes.js\";\nimport { isAcpJsonRpcMessage } from \"../../acp/jsonrpc.js\";\nimport { isPromptInput, textPrompt } from \"../../prompt-content.js\";\nimport {\n OUTPUT_ERROR_CODES,\n OUTPUT_ERROR_ORIGINS,\n type AcpClientOptions,\n type OutputErrorAcpPayload,\n type OutputErrorCode,\n type OutputErrorOrigin,\n type PermissionEscalationEvent,\n type PermissionPolicy,\n} from \"../../types.js\";\nimport type {\n AcpJsonRpcMessage,\n NonInteractivePermissionPolicy,\n PermissionMode,\n PromptInput,\n SessionResumePolicy,\n SessionSendResult,\n} from \"../../types.js\";\n\ntype QueueSessionOptions = NonNullable<AcpClientOptions[\"sessionOptions\"]>;\n\nexport type QueueSubmitRequest = {\n type: \"submit_prompt\";\n requestId: string;\n ownerGeneration?: number;\n message: string;\n prompt?: PromptInput;\n permissionMode: PermissionMode;\n resumePolicy?: SessionResumePolicy;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n permissionPolicy?: PermissionPolicy;\n timeoutMs?: number;\n suppressSdkConsoleErrors?: boolean;\n promptRetries?: number;\n waitForCompletion: boolean;\n sessionOptions?: QueueSessionOptions;\n};\n\nexport type QueueCancelRequest = {\n type: \"cancel_prompt\";\n requestId: string;\n ownerGeneration?: number;\n};\n\nexport type QueueSetModeRequest = {\n type: \"set_mode\";\n requestId: string;\n ownerGeneration?: number;\n modeId: string;\n timeoutMs?: number;\n};\n\nexport type QueueSetModelRequest = {\n type: \"set_model\";\n requestId: string;\n ownerGeneration?: number;\n modelId: string;\n timeoutMs?: number;\n};\n\nexport type QueueSetConfigOptionRequest = {\n type: \"set_config_option\";\n requestId: string;\n ownerGeneration?: number;\n configId: string;\n value: string;\n timeoutMs?: number;\n};\n\nexport type QueueCloseSessionRequest = {\n type: \"close_session\";\n requestId: string;\n ownerGeneration?: number;\n timeoutMs?: number;\n};\n\nexport type QueueRequest =\n | QueueSubmitRequest\n | QueueCancelRequest\n | QueueSetModeRequest\n | QueueSetModelRequest\n | QueueSetConfigOptionRequest\n | QueueCloseSessionRequest;\n\nexport type QueueOwnerAcceptedMessage = {\n type: \"accepted\";\n requestId: string;\n ownerGeneration?: number;\n};\n\nexport type QueueOwnerEventMessage = {\n type: \"event\";\n requestId: string;\n ownerGeneration?: number;\n message: AcpJsonRpcMessage;\n};\n\nexport type QueueOwnerPermissionEscalationMessage = {\n type: \"permission_escalation\";\n requestId: string;\n ownerGeneration?: number;\n event: PermissionEscalationEvent;\n};\n\nexport type QueueOwnerResultMessage = {\n type: \"result\";\n requestId: string;\n ownerGeneration?: number;\n result: SessionSendResult;\n};\n\nexport type QueueOwnerCancelResultMessage = {\n type: \"cancel_result\";\n requestId: string;\n ownerGeneration?: number;\n cancelled: boolean;\n};\n\nexport type QueueOwnerSetModeResultMessage = {\n type: \"set_mode_result\";\n requestId: string;\n ownerGeneration?: number;\n modeId: string;\n};\n\nexport type QueueOwnerSetModelResultMessage = {\n type: \"set_model_result\";\n requestId: string;\n ownerGeneration?: number;\n modelId: string;\n};\n\nexport type QueueOwnerSetConfigOptionResultMessage = {\n type: \"set_config_option_result\";\n requestId: string;\n ownerGeneration?: number;\n response: SetSessionConfigOptionResponse;\n};\n\nexport type QueueOwnerCloseSessionResultMessage = {\n type: \"close_session_result\";\n requestId: string;\n ownerGeneration?: number;\n closed: boolean;\n};\n\nexport type QueueOwnerErrorMessage = {\n type: \"error\";\n requestId: string;\n ownerGeneration?: number;\n code?: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n message: string;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n outputAlreadyEmitted?: boolean;\n};\n\nexport type QueueOwnerMessage =\n | QueueOwnerAcceptedMessage\n | QueueOwnerEventMessage\n | QueueOwnerPermissionEscalationMessage\n | QueueOwnerResultMessage\n | QueueOwnerCancelResultMessage\n | QueueOwnerSetModeResultMessage\n | QueueOwnerSetModelResultMessage\n | QueueOwnerSetConfigOptionResultMessage\n | QueueOwnerCloseSessionResultMessage\n | QueueOwnerErrorMessage;\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 isPermissionMode(value: unknown): value is PermissionMode {\n return value === \"approve-all\" || value === \"approve-reads\" || value === \"deny-all\";\n}\n\nfunction isSessionResumePolicy(value: unknown): value is SessionResumePolicy {\n return value === \"allow-new\" || value === \"same-session-only\";\n}\n\nfunction isNonInteractivePermissionPolicy(value: unknown): value is NonInteractivePermissionPolicy {\n return value === \"deny\" || value === \"fail\";\n}\n\nfunction isPermissionPolicy(value: unknown): value is PermissionPolicy {\n const record = asRecord(value);\n if (!record) {\n return false;\n }\n return hasValidPermissionRuleLists(record) && hasValidPermissionDefaultAction(record);\n}\n\nfunction hasValidPermissionRuleLists(record: Record<string, unknown>): boolean {\n const stringListKeys = [\"autoApprove\", \"autoDeny\", \"escalate\"] as const;\n for (const key of stringListKeys) {\n if (!isOptionalStringList(record[key])) {\n return false;\n }\n }\n return true;\n}\n\nfunction isOptionalStringList(value: unknown): boolean {\n return value == null || (Array.isArray(value) && value.every((item) => typeof item === \"string\"));\n}\n\nfunction hasValidPermissionDefaultAction(record: Record<string, unknown>): boolean {\n return (\n record.defaultAction == null ||\n record.defaultAction === \"approve\" ||\n record.defaultAction === \"deny\" ||\n record.defaultAction === \"escalate\"\n );\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 isPermissionEscalationEvent(value: unknown): value is PermissionEscalationEvent {\n const event = asRecord(value);\n return (\n !!event &&\n hasRequiredPermissionEscalationFields(event) &&\n hasOptionalStringFields(event, [\"toolName\", \"toolKind\", \"matchedRule\"])\n );\n}\n\nfunction hasRequiredPermissionEscalationFields(event: Record<string, unknown>): boolean {\n return (\n event.type === \"permission_escalation\" &&\n typeof event.sessionId === \"string\" &&\n typeof event.toolCallId === \"string\" &&\n typeof event.toolTitle === \"string\" &&\n event.action === \"escalate\" &&\n typeof event.message === \"string\" &&\n typeof event.timestamp === \"string\"\n );\n}\n\nfunction hasOptionalStringFields(\n record: Record<string, unknown>,\n keys: readonly string[],\n): boolean {\n return keys.every((key) => record[key] == null || typeof record[key] === \"string\");\n}\n\nfunction parseSessionOptions(value: unknown): QueueSessionOptions | null | undefined {\n if (value == null) {\n return undefined;\n }\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n const sessionOptions: QueueSessionOptions = {};\n if (!assignSessionModel(sessionOptions, record.model)) {\n return null;\n }\n if (!assignSessionAllowedTools(sessionOptions, record.allowedTools)) {\n return null;\n }\n if (!assignSessionMaxTurns(sessionOptions, record.maxTurns)) {\n return null;\n }\n if (!assignSessionSystemPrompt(sessionOptions, record.systemPrompt)) {\n return null;\n }\n\n return sessionOptions;\n}\n\nfunction assignSessionModel(options: QueueSessionOptions, value: unknown): boolean {\n if (value == null) {\n return true;\n }\n if (typeof value !== \"string\" || value.trim().length === 0) {\n return false;\n }\n options.model = value;\n return true;\n}\n\nfunction assignSessionAllowedTools(options: QueueSessionOptions, value: unknown): boolean {\n if (value == null) {\n return true;\n }\n if (!Array.isArray(value) || value.some((tool) => typeof tool !== \"string\")) {\n return false;\n }\n options.allowedTools = value;\n return true;\n}\n\nfunction assignSessionMaxTurns(options: QueueSessionOptions, value: unknown): boolean {\n if (value == null) {\n return true;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return false;\n }\n options.maxTurns = Math.max(1, Math.round(value));\n return true;\n}\n\nfunction assignSessionSystemPrompt(options: QueueSessionOptions, value: unknown): boolean {\n if (value == null) {\n return true;\n }\n if (typeof value === \"string\") {\n options.systemPrompt = value;\n return true;\n }\n const systemPrompt = asRecord(value);\n if (!systemPrompt || typeof systemPrompt.append !== \"string\") {\n return false;\n }\n options.systemPrompt = { append: systemPrompt.append };\n return true;\n}\n\nfunction parseOwnerGeneration(value: unknown): number | undefined | null {\n if (value == null) {\n return undefined;\n }\n if (typeof value !== \"number\" || !Number.isInteger(value) || value <= 0) {\n return null;\n }\n return value;\n}\n\nfunction parseNonNegativeInteger(value: unknown): number | undefined | null {\n if (value == null) {\n return undefined;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n return null;\n }\n return Math.round(value);\n}\n\nexport function parseQueueRequest(raw: unknown): QueueRequest | null {\n const request = asRecord(raw);\n if (!request || typeof request.type !== \"string\" || typeof request.requestId !== \"string\") {\n return null;\n }\n\n const ownerGeneration = parseOwnerGeneration(request.ownerGeneration);\n if (ownerGeneration === null) {\n return null;\n }\n\n return parseTypedQueueRequest(\n request,\n parseQueueRequestContext(request.requestId, ownerGeneration, request.timeoutMs),\n );\n}\n\ntype QueueRequestContext = {\n requestId: string;\n ownerGeneration: number | undefined;\n timeoutMs: number | undefined;\n};\n\nfunction parseQueueRequestContext(\n requestId: string,\n ownerGeneration: number | undefined,\n timeoutRaw: unknown,\n): QueueRequestContext {\n return {\n requestId,\n ownerGeneration,\n timeoutMs: parsePositiveTimeout(timeoutRaw),\n };\n}\n\nfunction parsePositiveTimeout(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return undefined;\n }\n return Math.round(value);\n}\n\nfunction parseTypedQueueRequest(\n request: Record<string, unknown>,\n context: QueueRequestContext,\n): QueueRequest | null {\n switch (request.type) {\n case \"submit_prompt\":\n return parseSubmitRequest(request, context);\n case \"cancel_prompt\":\n return {\n type: \"cancel_prompt\",\n requestId: context.requestId,\n ownerGeneration: context.ownerGeneration,\n };\n case \"close_session\":\n return { type: \"close_session\", ...context };\n case \"set_mode\":\n return parseStringFieldRequest(request, context, \"set_mode\", \"modeId\");\n case \"set_model\":\n return parseStringFieldRequest(request, context, \"set_model\", \"modelId\");\n case \"set_config_option\":\n return parseSetConfigOptionRequest(request, context);\n default:\n return null;\n }\n}\n\nfunction parseSubmitRequest(\n request: Record<string, unknown>,\n context: QueueRequestContext,\n): QueueSubmitRequest | null {\n const parsed = parseSubmitRequestFields(request);\n if (!parsed) {\n return null;\n }\n\n return {\n type: \"submit_prompt\",\n requestId: context.requestId,\n ownerGeneration: context.ownerGeneration,\n message: parsed.message,\n prompt: parsed.prompt ?? textPrompt(parsed.message),\n permissionMode: parsed.permissionMode,\n ...(parsed.resumePolicy !== undefined ? { resumePolicy: parsed.resumePolicy } : {}),\n nonInteractivePermissions: parsed.nonInteractivePermissions,\n ...(parsed.permissionPolicy !== undefined ? { permissionPolicy: parsed.permissionPolicy } : {}),\n timeoutMs: context.timeoutMs,\n ...(parsed.suppressSdkConsoleErrors !== undefined\n ? { suppressSdkConsoleErrors: parsed.suppressSdkConsoleErrors }\n : {}),\n ...(parsed.promptRetries !== undefined ? { promptRetries: parsed.promptRetries } : {}),\n waitForCompletion: parsed.waitForCompletion,\n ...(parsed.sessionOptions !== undefined ? { sessionOptions: parsed.sessionOptions } : {}),\n };\n}\n\ntype ParsedSubmitRequestFields = Pick<\n QueueSubmitRequest,\n | \"message\"\n | \"prompt\"\n | \"permissionMode\"\n | \"resumePolicy\"\n | \"nonInteractivePermissions\"\n | \"permissionPolicy\"\n | \"suppressSdkConsoleErrors\"\n | \"promptRetries\"\n | \"waitForCompletion\"\n | \"sessionOptions\"\n>;\n\nfunction parseSubmitRequestFields(\n request: Record<string, unknown>,\n): ParsedSubmitRequestFields | null {\n const parsed = {\n message: typeof request.message === \"string\" ? request.message : null,\n prompt: parseOptionalValue(request.prompt, isPromptInput),\n permissionMode: parseRequiredValue(request.permissionMode, isPermissionMode),\n resumePolicy: parseOptionalValue(request.resumePolicy, isSessionResumePolicy),\n nonInteractivePermissions: parseOptionalValue(\n request.nonInteractivePermissions,\n isNonInteractivePermissionPolicy,\n ),\n permissionPolicy: parseOptionalValue(request.permissionPolicy, isPermissionPolicy),\n suppressSdkConsoleErrors: parseOptionalBoolean(request.suppressSdkConsoleErrors),\n promptRetries: parseNonNegativeInteger(request.promptRetries),\n waitForCompletion:\n typeof request.waitForCompletion === \"boolean\" ? request.waitForCompletion : null,\n sessionOptions: parseSessionOptions(request.sessionOptions),\n };\n if (Object.values(parsed).some((value) => value === null)) {\n return null;\n }\n return parsed as ParsedSubmitRequestFields;\n}\n\nfunction parseOptionalValue<T>(\n value: unknown,\n guard: (value: unknown) => value is T,\n): T | undefined | null {\n if (value == null) {\n return undefined;\n }\n return guard(value) ? value : null;\n}\n\nfunction parseRequiredValue<T>(value: unknown, guard: (value: unknown) => value is T): T | null {\n return guard(value) ? value : null;\n}\n\nfunction parseOptionalBoolean(value: unknown): boolean | undefined | null {\n if (value == null) {\n return undefined;\n }\n return typeof value === \"boolean\" ? value : null;\n}\n\nfunction parseStringFieldRequest<TType extends \"set_mode\" | \"set_model\">(\n request: Record<string, unknown>,\n context: QueueRequestContext,\n type: TType,\n field: \"modeId\" | \"modelId\",\n): Extract<QueueRequest, { type: TType }> | null {\n const value = parseNonEmptyString(request[field]);\n if (!value) {\n return null;\n }\n return { type, ...context, [field]: value } as Extract<QueueRequest, { type: TType }>;\n}\n\nfunction parseSetConfigOptionRequest(\n request: Record<string, unknown>,\n context: QueueRequestContext,\n): QueueSetConfigOptionRequest | null {\n const configId = parseNonEmptyString(request.configId);\n const value = parseNonEmptyString(request.value);\n if (!configId || !value) {\n return null;\n }\n return { type: \"set_config_option\", ...context, configId, value };\n}\n\nfunction parseNonEmptyString(value: unknown): string | null {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n return null;\n }\n return value;\n}\n\nfunction parseSessionSendResult(raw: unknown): SessionSendResult | null {\n const result = asRecord(raw);\n if (!result || !hasValidSessionSendResultCore(result)) {\n return null;\n }\n\n const permissionStats = asRecord(result.permissionStats);\n const record = asRecord(result.record);\n if (!permissionStats || !record) {\n return null;\n }\n\n if (!hasValidPermissionStats(permissionStats)) {\n return null;\n }\n\n if (!hasValidSessionRecordShape(record)) {\n return null;\n }\n\n return result as SessionSendResult;\n}\n\nfunction hasValidSessionSendResultCore(result: Record<string, unknown>): boolean {\n return (\n typeof result.stopReason === \"string\" &&\n typeof result.sessionId === \"string\" &&\n typeof result.resumed === \"boolean\"\n );\n}\n\nfunction hasValidPermissionStats(permissionStats: Record<string, unknown>): boolean {\n return [\"requested\", \"approved\", \"denied\", \"cancelled\"].every(\n (key) => typeof permissionStats[key] === \"number\",\n );\n}\n\nfunction hasValidSessionRecordShape(record: Record<string, unknown>): boolean {\n return (\n hasStringFields(record, [\n \"acpxRecordId\",\n \"acpSessionId\",\n \"agentCommand\",\n \"cwd\",\n \"createdAt\",\n \"lastUsedAt\",\n \"updated_at\",\n ]) &&\n Array.isArray(record.messages) &&\n typeof record.lastSeq === \"number\" &&\n Number.isInteger(record.lastSeq) &&\n !!record.eventLog &&\n typeof record.eventLog === \"object\"\n );\n}\n\nfunction hasStringFields(record: Record<string, unknown>, keys: readonly string[]): boolean {\n return keys.every((key) => typeof record[key] === \"string\");\n}\n\nexport function parseQueueOwnerMessage(raw: unknown): QueueOwnerMessage | null {\n const message = asRecord(raw);\n if (!message || typeof message.type !== \"string\" || typeof message.requestId !== \"string\") {\n return null;\n }\n const ownerGeneration = parseOwnerGeneration(message.ownerGeneration);\n if (ownerGeneration === null) {\n return null;\n }\n\n return parseTypedQueueOwnerMessage(message as TypedQueueOwnerRecord, {\n requestId: message.requestId,\n ownerGeneration,\n });\n}\n\ntype QueueOwnerMessageContext = {\n requestId: string;\n ownerGeneration: number | undefined;\n};\n\ntype TypedQueueOwnerRecord = Record<string, unknown> & { type: string };\n\nfunction parseTypedQueueOwnerMessage(\n message: TypedQueueOwnerRecord,\n context: QueueOwnerMessageContext,\n): QueueOwnerMessage | null {\n const parser = queueOwnerMessageParser(message.type);\n return parser ? parser(message, context) : null;\n}\n\ntype QueueOwnerMessageParser = (\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n) => QueueOwnerMessage | null;\n\nconst QUEUE_OWNER_MESSAGE_PARSERS: Record<string, QueueOwnerMessageParser> = {\n accepted: (_message, context) => ({ type: \"accepted\", ...context }),\n event: parseEventOwnerMessage,\n permission_escalation: parsePermissionEscalationOwnerMessage,\n result: parseResultOwnerMessage,\n cancel_result: (message, context) =>\n parseBooleanResultOwnerMessage(message, context, \"cancel_result\", \"cancelled\"),\n close_session_result: (message, context) =>\n parseBooleanResultOwnerMessage(message, context, \"close_session_result\", \"closed\"),\n set_mode_result: (message, context) =>\n parseStringResultOwnerMessage(message, context, \"set_mode_result\", \"modeId\"),\n set_model_result: (message, context) =>\n parseStringResultOwnerMessage(message, context, \"set_model_result\", \"modelId\"),\n set_config_option_result: parseSetConfigOptionOwnerMessage,\n error: parseErrorOwnerMessage,\n};\n\nfunction queueOwnerMessageParser(type: string): QueueOwnerMessageParser | undefined {\n return Object.hasOwn(QUEUE_OWNER_MESSAGE_PARSERS, type)\n ? QUEUE_OWNER_MESSAGE_PARSERS[type]\n : undefined;\n}\n\nfunction parseEventOwnerMessage(\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n): QueueOwnerEventMessage | null {\n if (!isAcpJsonRpcMessage(message.message)) {\n return null;\n }\n return { type: \"event\", ...context, message: message.message };\n}\n\nfunction parsePermissionEscalationOwnerMessage(\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n): QueueOwnerPermissionEscalationMessage | null {\n if (!isPermissionEscalationEvent(message.event)) {\n return null;\n }\n return { type: \"permission_escalation\", ...context, event: message.event };\n}\n\nfunction parseResultOwnerMessage(\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n): QueueOwnerResultMessage | null {\n const result = parseSessionSendResult(message.result);\n if (!result) {\n return null;\n }\n return { type: \"result\", ...context, result };\n}\n\nfunction parseBooleanResultOwnerMessage<TType extends \"cancel_result\" | \"close_session_result\">(\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n type: TType,\n field: \"cancelled\" | \"closed\",\n): Extract<QueueOwnerMessage, { type: TType }> | null {\n if (typeof message[field] !== \"boolean\") {\n return null;\n }\n return { type, ...context, [field]: message[field] } as Extract<\n QueueOwnerMessage,\n { type: TType }\n >;\n}\n\nfunction parseStringResultOwnerMessage<TType extends \"set_mode_result\" | \"set_model_result\">(\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n type: TType,\n field: \"modeId\" | \"modelId\",\n): Extract<QueueOwnerMessage, { type: TType }> | null {\n if (typeof message[field] !== \"string\") {\n return null;\n }\n return { type, ...context, [field]: message[field] } as Extract<\n QueueOwnerMessage,\n { type: TType }\n >;\n}\n\nfunction parseSetConfigOptionOwnerMessage(\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n): QueueOwnerSetConfigOptionResultMessage | null {\n const response = asRecord(message.response);\n if (!response || !Array.isArray(response.configOptions)) {\n return null;\n }\n return {\n type: \"set_config_option_result\",\n ...context,\n response: response as SetSessionConfigOptionResponse,\n };\n}\n\nfunction parseErrorOwnerMessage(\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n): QueueOwnerErrorMessage | null {\n if (!isValidOwnerErrorCore(message)) {\n return null;\n }\n\n const outputAlreadyEmitted =\n typeof message.outputAlreadyEmitted === \"boolean\" ? message.outputAlreadyEmitted : undefined;\n\n return {\n type: \"error\",\n ...context,\n code: message.code,\n detailCode: parseNonEmptyString(message.detailCode) ?? undefined,\n origin: message.origin,\n message: message.message,\n retryable: typeof message.retryable === \"boolean\" ? message.retryable : undefined,\n acp: toAcpErrorPayload(message.acp),\n ...(outputAlreadyEmitted === undefined ? {} : { outputAlreadyEmitted }),\n };\n}\n\nfunction isValidOwnerErrorCore(message: Record<string, unknown>): message is Record<\n string,\n unknown\n> & {\n code: OutputErrorCode;\n origin: OutputErrorOrigin;\n message: string;\n} {\n return (\n typeof message.message === \"string\" &&\n isOutputErrorCode(message.code) &&\n isOutputErrorOrigin(message.origin)\n );\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\";\n\ntype QueueOwnerSocketLease = {\n socketPath: string;\n ownerGeneration?: number;\n};\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 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: (modelId: string, timeoutMs?: number) => Promise<void>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n timeoutMs?: number,\n ) => Promise<SetSessionConfigOptionResponse>;\n};\n\ntype SessionQueueOwnerOptions = {\n maxQueueDepth: 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 onQueueDepthChanged?: (queueDepth: number) => void;\n private readonly pending: QueueTask[] = [];\n private readonly waiters: Array<(task: QueueTask | undefined) => void> = [];\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.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 async close(): Promise<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 this.emitQueueDepth();\n\n await new Promise<void>((resolve) => {\n this.server.close(() => resolve());\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 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 private emitQueueDepth(): void {\n this.onQueueDepthChanged?.(this.pending.length);\n }\n\n private enqueue(task: QueueTask): void {\n if (this.closed) {\n if (task.waitForCompletion) {\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 }\n task.close();\n return;\n }\n\n const waiter = this.waiters.shift();\n if (waiter) {\n waiter(task);\n return;\n }\n\n if (this.pending.length >= this.maxQueueDepth) {\n if (task.waitForCompletion) {\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 }\n task.close();\n return;\n }\n\n this.pending.push(task);\n this.emitQueueDepth();\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 if (!options.socket.destroyed) {\n options.socket.end();\n }\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 socket.end();\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 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.controlHandlers.cancelPrompt(),\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 await this.controlHandlers.setSessionModel(request.modelId, request.timeoutMs);\n return {\n type: \"set_model_result\",\n requestId: request.requestId,\n modelId: request.modelId,\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 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 enqueuedAt: Date.now(),\n send: (message) => {\n writeQueueMessage(socket, {\n ...message,\n ownerGeneration: this.ownerGeneration,\n });\n },\n close: () => {\n if (!socket.destroyed) {\n socket.end();\n }\n },\n };\n\n writeQueueMessage(socket, {\n type: \"accepted\",\n requestId: request.requestId,\n ownerGeneration: this.ownerGeneration,\n });\n\n if (!request.waitForCompletion) {\n task.close();\n }\n\n this.enqueue(task);\n }\n\n private handleConnection(socket: net.Socket): void {\n socket.setEncoding(\"utf8\");\n\n if (this.closed) {\n writeQueueMessage(\n socket,\n makeQueueOwnerError(\"unknown\", \"Queue owner is closed\", \"QUEUE_OWNER_CLOSED\", {\n retryable: true,\n }),\n );\n socket.end();\n return;\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 (!request || this.rejectStaleOwnerGeneration(socket, request)) {\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 line = buffer.slice(0, index).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 });\n\n socket.on(\"error\", () => {\n // no-op: queue processing continues even if client disconnects\n });\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { QueueConnectionError, QueueProtocolError } from \"../../errors.js\";\nimport { incrementPerfCounter } from \"../../perf-metrics.js\";\nimport type {\n AcpClientOptions,\n NonInteractivePermissionPolicy,\n OutputErrorEmissionPolicy,\n OutputFormatter,\n PermissionMode,\n PermissionPolicy,\n PromptInput,\n SessionResumePolicy,\n SessionEnqueueResult,\n SessionSendOutcome,\n} from \"../../types.js\";\nimport { probeQueueOwnerHealth, type QueueOwnerHealth } from \"./ipc-health.js\";\nimport { connectToQueueOwner } from \"./ipc-transport.js\";\nimport {\n type QueueOwnerRecord,\n readQueueOwnerRecord,\n terminateQueueOwnerForSession,\n} from \"./lease-store.js\";\nimport {\n parseQueueOwnerMessage,\n type QueueCancelRequest,\n type QueueCloseSessionRequest,\n type QueueOwnerCancelResultMessage,\n type QueueOwnerCloseSessionResultMessage,\n type QueueOwnerMessage,\n type QueueOwnerSetConfigOptionResultMessage,\n type QueueOwnerSetModelResultMessage,\n type QueueOwnerSetModeResultMessage,\n type QueueRequest,\n type QueueSetConfigOptionRequest,\n type QueueSetModelRequest,\n type QueueSetModeRequest,\n type QueueSubmitRequest,\n} from \"./messages.js\";\n\nexport { QUEUE_CONNECT_RETRY_MS } from \"./ipc-transport.js\";\nexport const MAX_MESSAGE_BUFFER_SIZE = 10 * 1024 * 1024;\nexport {\n isProcessAlive,\n releaseQueueOwnerLease,\n terminateProcess,\n terminateQueueOwnerForSession,\n tryAcquireQueueOwnerLease,\n waitMs,\n} from \"./lease-store.js\";\nexport type { QueueOwnerLease } from \"./lease-store.js\";\n\nconst STALE_OWNER_PROTOCOL_DETAIL_CODES = new Set([\n \"QUEUE_PROTOCOL_MALFORMED_MESSAGE\",\n \"QUEUE_PROTOCOL_UNEXPECTED_RESPONSE\",\n]);\n\nasync function maybeRecoverStaleOwnerAfterProtocolMismatch(params: {\n sessionId: string;\n owner: QueueOwnerRecord;\n error: unknown;\n verbose?: boolean;\n}): Promise<boolean> {\n if (!(params.error instanceof QueueProtocolError)) {\n return false;\n }\n\n const detailCode = params.error.detailCode;\n if (!detailCode || !STALE_OWNER_PROTOCOL_DETAIL_CODES.has(detailCode)) {\n return false;\n }\n\n await terminateQueueOwnerForSession(params.sessionId).catch(() => {\n // Preserve existing behavior if cleanup fails.\n });\n incrementPerfCounter(\"queue.owner.stale_recovered\");\n\n if (params.verbose) {\n process.stderr.write(\n `[acpx] dropped stale queue owner metadata after protocol mismatch for session ${params.sessionId} (${detailCode})\\n`,\n );\n }\n\n return true;\n}\nexport { probeQueueOwnerHealth };\nexport type { QueueOwnerHealth };\nexport type { QueueOwnerMessage, QueueSubmitRequest } from \"./messages.js\";\nexport type { QueueOwnerControlHandlers, QueueTask } from \"./ipc-server.js\";\nexport { SessionQueueOwner } from \"./ipc-server.js\";\n\nfunction assertOwnerGeneration(\n owner: QueueOwnerRecord,\n message: QueueOwnerMessage,\n): QueueOwnerMessage {\n if (\n owner.ownerGeneration !== undefined &&\n message.ownerGeneration !== undefined &&\n message.ownerGeneration !== owner.ownerGeneration\n ) {\n throw new QueueProtocolError(\"Queue owner returned mismatched generation\", {\n detailCode: \"QUEUE_OWNER_GENERATION_MISMATCH\",\n origin: \"queue\",\n retryable: true,\n });\n }\n return message;\n}\n\ntype QueueOwnerRequestState = {\n acknowledged: boolean;\n};\n\ntype QueueOwnerRequestControls<TResult> = {\n state: QueueOwnerRequestState;\n resolve: (result: TResult) => void;\n reject: (error: unknown) => void;\n};\n\nfunction queueConnectionErrorFromOwner(\n message: Extract<QueueOwnerMessage, { type: \"error\" }>,\n outputAlreadyEmitted: boolean,\n): QueueConnectionError {\n return new QueueConnectionError(message.message, {\n outputCode: message.code,\n detailCode: message.detailCode,\n origin: message.origin ?? \"queue\",\n retryable: message.retryable,\n acp: message.acp,\n ...(outputAlreadyEmitted ? { outputAlreadyEmitted: true } : {}),\n });\n}\n\nfunction makeMalformedQueueMessageError(): QueueProtocolError {\n return new QueueProtocolError(\"Queue owner sent malformed message\", {\n detailCode: \"QUEUE_PROTOCOL_MALFORMED_MESSAGE\",\n origin: \"queue\",\n retryable: true,\n });\n}\n\nfunction emitQueueOwnerError(\n formatter: OutputFormatter,\n policy: OutputErrorEmissionPolicy | undefined,\n sessionId: string,\n message: Extract<QueueOwnerMessage, { type: \"error\" }>,\n): QueueConnectionError {\n formatter.setContext({ sessionId });\n const queueErrorAlreadyEmitted = policy?.queueErrorAlreadyEmitted ?? true;\n const shouldEmitInFormatter = message.outputAlreadyEmitted !== true || !queueErrorAlreadyEmitted;\n if (shouldEmitInFormatter) {\n formatter.onError({\n code: message.code ?? \"RUNTIME\",\n detailCode: message.detailCode,\n origin: message.origin ?? \"queue\",\n message: message.message,\n retryable: message.retryable,\n acp: message.acp,\n });\n formatter.flush();\n }\n return queueConnectionErrorFromOwner(message, queueErrorAlreadyEmitted);\n}\n\nfunction parseQueueOwnerResponseLine(\n owner: QueueOwnerRecord,\n requestId: string,\n line: string,\n): QueueOwnerMessage {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n throw new QueueProtocolError(\"Queue owner sent invalid JSON payload\", {\n detailCode: \"QUEUE_PROTOCOL_INVALID_JSON\",\n origin: \"queue\",\n retryable: true,\n });\n }\n\n const parsedMessage = parseQueueOwnerMessage(parsed);\n if (!parsedMessage) {\n throw makeMalformedQueueMessageError();\n }\n\n const message = assertOwnerGeneration(owner, parsedMessage);\n if (message.requestId !== requestId) {\n throw makeMalformedQueueMessageError();\n }\n\n return message;\n}\n\nasync function runQueueOwnerRequest<TResult>(options: {\n owner: QueueOwnerRecord;\n request: QueueRequest;\n onAccepted?: (controls: QueueOwnerRequestControls<TResult>) => void;\n onMessage: (message: QueueOwnerMessage, controls: QueueOwnerRequestControls<TResult>) => void;\n onClose: (controls: QueueOwnerRequestControls<TResult>) => void;\n}): Promise<TResult | undefined> {\n const socket = await connectToQueueOwner(options.owner);\n if (!socket) {\n return undefined;\n }\n\n socket.setEncoding(\"utf8\");\n\n return await new Promise<TResult>((resolve, reject) => {\n let settled = false;\n let buffer = \"\";\n const state: QueueOwnerRequestState = {\n acknowledged: false,\n };\n\n const finishResolve = (result: TResult) => {\n if (settled) {\n return;\n }\n settled = true;\n socket.removeAllListeners();\n if (!socket.destroyed) {\n socket.end();\n }\n resolve(result);\n };\n\n const finishReject = (error: unknown) => {\n if (settled) {\n return;\n }\n settled = true;\n socket.removeAllListeners();\n if (!socket.destroyed) {\n socket.destroy();\n }\n reject(error);\n };\n\n const controls: QueueOwnerRequestControls<TResult> = {\n state,\n resolve: finishResolve,\n reject: finishReject,\n };\n\n const processLine = (line: string): void => {\n let message: QueueOwnerMessage;\n try {\n message = parseQueueOwnerResponseLine(options.owner, options.request.requestId, line);\n } catch (error) {\n finishReject(error);\n return;\n }\n\n if (message.type === \"accepted\") {\n state.acknowledged = true;\n options.onAccepted?.(controls);\n return;\n }\n\n options.onMessage(message, controls);\n };\n\n socket.on(\"data\", (chunk: string) => {\n buffer += chunk;\n\n if (buffer.length > MAX_MESSAGE_BUFFER_SIZE) {\n socket.destroy();\n finishReject(new Error(`Message buffer exceeded ${MAX_MESSAGE_BUFFER_SIZE} bytes`));\n return;\n }\n\n let index = buffer.indexOf(\"\\n\");\n while (index >= 0) {\n const line = buffer.slice(0, index).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 });\n\n socket.once(\"error\", (error: Error) => {\n finishReject(error);\n });\n\n socket.once(\"close\", () => {\n if (settled) {\n return;\n }\n options.onClose(controls);\n });\n\n socket.write(`${JSON.stringify(options.request)}\\n`);\n });\n}\n\nexport type SubmitToQueueOwnerOptions = {\n sessionId: string;\n message: string;\n prompt?: PromptInput;\n permissionMode: PermissionMode;\n resumePolicy?: SessionResumePolicy;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n permissionPolicy?: PermissionPolicy;\n outputFormatter: OutputFormatter;\n errorEmissionPolicy?: OutputErrorEmissionPolicy;\n timeoutMs?: number;\n suppressSdkConsoleErrors?: boolean;\n promptRetries?: number;\n waitForCompletion: boolean;\n verbose?: boolean;\n sessionOptions?: NonNullable<AcpClientOptions[\"sessionOptions\"]>;\n};\n\nfunction missingQueueAckError(): QueueConnectionError {\n return new QueueConnectionError(\"Queue owner did not acknowledge request\", {\n detailCode: \"QUEUE_ACK_MISSING\",\n origin: \"queue\",\n retryable: true,\n });\n}\n\nfunction unexpectedQueueResponseError(): QueueProtocolError {\n return new QueueProtocolError(\"Queue owner returned unexpected response\", {\n detailCode: \"QUEUE_PROTOCOL_UNEXPECTED_RESPONSE\",\n origin: \"queue\",\n retryable: true,\n });\n}\n\nfunction handleAcknowledgedSubmitMessage(\n message: QueueOwnerMessage,\n controls: QueueOwnerRequestControls<SessionSendOutcome>,\n formatter: OutputFormatter,\n): void {\n if (message.type === \"event\") {\n formatter.onAcpMessage(message.message);\n return;\n }\n if (message.type === \"permission_escalation\") {\n formatter.onPermissionEscalation(message.event);\n return;\n }\n if (message.type === \"result\") {\n formatter.flush();\n controls.resolve(message.result);\n return;\n }\n controls.reject(unexpectedQueueResponseError());\n}\n\nfunction handleSubmitQueueOwnerMessage(\n message: QueueOwnerMessage,\n controls: QueueOwnerRequestControls<SessionSendOutcome>,\n options: SubmitToQueueOwnerOptions,\n): void {\n if (message.type === \"error\") {\n controls.reject(\n emitQueueOwnerError(\n options.outputFormatter,\n options.errorEmissionPolicy,\n options.sessionId,\n message,\n ),\n );\n return;\n }\n if (!controls.state.acknowledged) {\n controls.reject(missingQueueAckError());\n return;\n }\n handleAcknowledgedSubmitMessage(message, controls, options.outputFormatter);\n}\n\nasync function submitToQueueOwner(\n owner: QueueOwnerRecord,\n options: SubmitToQueueOwnerOptions,\n): Promise<SessionSendOutcome | undefined> {\n const requestId = randomUUID();\n const request: QueueSubmitRequest = {\n type: \"submit_prompt\",\n requestId,\n ownerGeneration: owner.ownerGeneration,\n message: options.message,\n prompt: options.prompt,\n permissionMode: options.permissionMode,\n resumePolicy: options.resumePolicy,\n nonInteractivePermissions: options.nonInteractivePermissions,\n permissionPolicy: options.permissionPolicy,\n timeoutMs: options.timeoutMs,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n promptRetries: options.promptRetries ?? 0,\n waitForCompletion: options.waitForCompletion,\n sessionOptions: options.sessionOptions,\n };\n\n options.outputFormatter.setContext({\n sessionId: options.sessionId,\n });\n\n return await runQueueOwnerRequest<SessionSendOutcome>({\n owner,\n request,\n onAccepted: ({ resolve }) => {\n options.outputFormatter.setContext({\n sessionId: options.sessionId,\n });\n if (!options.waitForCompletion) {\n const queued: SessionEnqueueResult = {\n queued: true,\n sessionId: options.sessionId,\n requestId,\n };\n resolve(queued);\n }\n },\n onMessage: (message, controls) => {\n handleSubmitQueueOwnerMessage(message, controls, options);\n },\n onClose: ({ state, resolve, reject }) => {\n if (!state.acknowledged) {\n reject(\n new QueueConnectionError(\"Queue owner disconnected before acknowledging request\", {\n detailCode: \"QUEUE_DISCONNECTED_BEFORE_ACK\",\n origin: \"queue\",\n retryable: true,\n }),\n );\n return;\n }\n\n if (!options.waitForCompletion) {\n const queued: SessionEnqueueResult = {\n queued: true,\n sessionId: options.sessionId,\n requestId,\n };\n resolve(queued);\n return;\n }\n\n reject(\n new QueueConnectionError(\"Queue owner disconnected before prompt completion\", {\n detailCode: \"QUEUE_DISCONNECTED_BEFORE_COMPLETION\",\n origin: \"queue\",\n retryable: true,\n }),\n );\n },\n });\n}\n\nasync function submitControlToQueueOwner<TResponse extends QueueOwnerMessage>(\n owner: QueueOwnerRecord,\n request: QueueRequest,\n isExpectedResponse: (message: QueueOwnerMessage) => message is TResponse,\n): Promise<TResponse | undefined> {\n return await runQueueOwnerRequest<TResponse>({\n owner,\n request,\n onMessage: (message, { state, resolve, reject }) => {\n if (message.type === \"error\") {\n reject(\n new QueueConnectionError(message.message, {\n outputCode: message.code,\n detailCode: message.detailCode,\n origin: message.origin ?? \"queue\",\n retryable: message.retryable,\n acp: message.acp,\n }),\n );\n return;\n }\n\n if (!state.acknowledged) {\n reject(\n new QueueConnectionError(\"Queue owner did not acknowledge request\", {\n detailCode: \"QUEUE_ACK_MISSING\",\n origin: \"queue\",\n retryable: true,\n }),\n );\n return;\n }\n\n if (!isExpectedResponse(message)) {\n reject(\n new QueueProtocolError(\"Queue owner returned unexpected response\", {\n detailCode: \"QUEUE_PROTOCOL_UNEXPECTED_RESPONSE\",\n origin: \"queue\",\n retryable: true,\n }),\n );\n return;\n }\n\n resolve(message);\n },\n onClose: ({ state, reject }) => {\n if (!state.acknowledged) {\n reject(\n new QueueConnectionError(\"Queue owner disconnected before acknowledging request\", {\n detailCode: \"QUEUE_DISCONNECTED_BEFORE_ACK\",\n origin: \"queue\",\n retryable: true,\n }),\n );\n return;\n }\n\n reject(\n new QueueConnectionError(\"Queue owner disconnected before responding\", {\n detailCode: \"QUEUE_DISCONNECTED_BEFORE_COMPLETION\",\n origin: \"queue\",\n retryable: true,\n }),\n );\n },\n });\n}\n\nasync function submitCancelToQueueOwner(owner: QueueOwnerRecord): Promise<boolean | undefined> {\n const request: QueueCancelRequest = {\n type: \"cancel_prompt\",\n requestId: randomUUID(),\n ownerGeneration: owner.ownerGeneration,\n };\n const response = await submitControlToQueueOwner(\n owner,\n request,\n (message): message is QueueOwnerCancelResultMessage => message.type === \"cancel_result\",\n );\n if (!response) {\n return undefined;\n }\n if (response.requestId !== request.requestId) {\n throw new QueueProtocolError(\"Queue owner returned mismatched cancel response\", {\n detailCode: \"QUEUE_PROTOCOL_MALFORMED_MESSAGE\",\n origin: \"queue\",\n retryable: true,\n });\n }\n return response.cancelled;\n}\n\nasync function submitSetModeToQueueOwner(\n owner: QueueOwnerRecord,\n modeId: string,\n timeoutMs?: number,\n): Promise<boolean | undefined> {\n const request: QueueSetModeRequest = {\n type: \"set_mode\",\n requestId: randomUUID(),\n ownerGeneration: owner.ownerGeneration,\n modeId,\n timeoutMs,\n };\n const response = await submitControlToQueueOwner(\n owner,\n request,\n (message): message is QueueOwnerSetModeResultMessage => message.type === \"set_mode_result\",\n );\n if (!response) {\n return undefined;\n }\n if (response.requestId !== request.requestId) {\n throw new QueueProtocolError(\"Queue owner returned mismatched set_mode response\", {\n detailCode: \"QUEUE_PROTOCOL_MALFORMED_MESSAGE\",\n origin: \"queue\",\n retryable: true,\n });\n }\n return true;\n}\n\nasync function submitSetModelToQueueOwner(\n owner: QueueOwnerRecord,\n modelId: string,\n timeoutMs?: number,\n): Promise<boolean | undefined> {\n const request: QueueSetModelRequest = {\n type: \"set_model\",\n requestId: randomUUID(),\n ownerGeneration: owner.ownerGeneration,\n modelId,\n timeoutMs,\n };\n const response = await submitControlToQueueOwner(\n owner,\n request,\n (message): message is QueueOwnerSetModelResultMessage => message.type === \"set_model_result\",\n );\n if (!response) {\n return undefined;\n }\n if (response.requestId !== request.requestId) {\n throw new QueueProtocolError(\"Queue owner returned mismatched set_model response\", {\n detailCode: \"QUEUE_PROTOCOL_MALFORMED_MESSAGE\",\n origin: \"queue\",\n retryable: true,\n });\n }\n return true;\n}\n\nasync function submitSetConfigOptionToQueueOwner(\n owner: QueueOwnerRecord,\n configId: string,\n value: string,\n timeoutMs?: number,\n): Promise<SetSessionConfigOptionResponse | undefined> {\n const request: QueueSetConfigOptionRequest = {\n type: \"set_config_option\",\n requestId: randomUUID(),\n ownerGeneration: owner.ownerGeneration,\n configId,\n value,\n timeoutMs,\n };\n const response = await submitControlToQueueOwner(\n owner,\n request,\n (message): message is QueueOwnerSetConfigOptionResultMessage =>\n message.type === \"set_config_option_result\",\n );\n if (!response) {\n return undefined;\n }\n if (response.requestId !== request.requestId) {\n throw new QueueProtocolError(\"Queue owner returned mismatched set_config_option response\", {\n detailCode: \"QUEUE_PROTOCOL_MALFORMED_MESSAGE\",\n origin: \"queue\",\n retryable: true,\n });\n }\n return response.response;\n}\n\nasync function submitCloseSessionToQueueOwner(\n owner: QueueOwnerRecord,\n timeoutMs?: number,\n): Promise<boolean | undefined> {\n const request: QueueCloseSessionRequest = {\n type: \"close_session\",\n requestId: randomUUID(),\n ownerGeneration: owner.ownerGeneration,\n timeoutMs,\n };\n const response = await submitControlToQueueOwner(\n owner,\n request,\n (message): message is QueueOwnerCloseSessionResultMessage =>\n message.type === \"close_session_result\",\n );\n if (!response) {\n return undefined;\n }\n if (response.requestId !== request.requestId) {\n throw new QueueProtocolError(\"Queue owner returned mismatched close_session response\", {\n detailCode: \"QUEUE_PROTOCOL_MALFORMED_MESSAGE\",\n origin: \"queue\",\n retryable: true,\n });\n }\n return response.closed;\n}\n\nexport async function trySubmitToRunningOwner(\n options: SubmitToQueueOwnerOptions,\n): Promise<SessionSendOutcome | undefined> {\n const owner = await readQueueOwnerRecord(options.sessionId);\n if (!owner) {\n return undefined;\n }\n\n let submitted: SessionSendOutcome | undefined;\n try {\n submitted = await submitToQueueOwner(owner, options);\n } catch (error) {\n const recovered = await maybeRecoverStaleOwnerAfterProtocolMismatch({\n sessionId: options.sessionId,\n owner,\n error,\n verbose: options.verbose,\n });\n if (recovered) {\n return undefined;\n }\n throw error;\n }\n if (submitted) {\n if (options.verbose) {\n process.stderr.write(\n `[acpx] queued prompt on active owner pid ${owner.pid} for session ${options.sessionId}\\n`,\n );\n }\n return submitted;\n }\n\n const health = await probeQueueOwnerHealth(options.sessionId);\n if (!health.hasLease) {\n return undefined;\n }\n\n throw new QueueConnectionError(\n \"Session queue owner is running but not accepting queue requests\",\n {\n detailCode: \"QUEUE_NOT_ACCEPTING_REQUESTS\",\n origin: \"queue\",\n retryable: true,\n },\n );\n}\n\nexport async function tryCloseSessionOnRunningOwner(options: {\n sessionId: string;\n timeoutMs?: number;\n verbose?: boolean;\n}): Promise<boolean | undefined> {\n const owner = await readQueueOwnerRecord(options.sessionId);\n if (!owner) {\n return undefined;\n }\n\n const closed = await submitCloseSessionToQueueOwner(owner, options.timeoutMs);\n if (closed !== undefined) {\n if (options.verbose) {\n process.stderr.write(\n `[acpx] requested session/close on active owner pid ${owner.pid} for session ${options.sessionId}\\n`,\n );\n }\n return closed;\n }\n\n const health = await probeQueueOwnerHealth(options.sessionId);\n if (!health.hasLease) {\n return undefined;\n }\n\n throw new QueueConnectionError(\n \"Session queue owner is running but not accepting close_session requests\",\n {\n detailCode: \"QUEUE_NOT_ACCEPTING_REQUESTS\",\n origin: \"queue\",\n retryable: true,\n },\n );\n}\n\nexport async function tryCancelOnRunningOwner(options: {\n sessionId: string;\n verbose?: boolean;\n}): Promise<boolean | undefined> {\n const owner = await readQueueOwnerRecord(options.sessionId);\n if (!owner) {\n return undefined;\n }\n\n const cancelled = await submitCancelToQueueOwner(owner);\n if (cancelled !== undefined) {\n if (options.verbose) {\n process.stderr.write(\n `[acpx] requested cancel on active owner pid ${owner.pid} for session ${options.sessionId}\\n`,\n );\n }\n return cancelled;\n }\n\n const health = await probeQueueOwnerHealth(options.sessionId);\n if (!health.hasLease) {\n return undefined;\n }\n\n throw new QueueConnectionError(\n \"Session queue owner is running but not accepting cancel requests\",\n {\n detailCode: \"QUEUE_NOT_ACCEPTING_REQUESTS\",\n origin: \"queue\",\n retryable: true,\n },\n );\n}\n\nexport async function trySetModeOnRunningOwner(\n sessionId: string,\n modeId: string,\n timeoutMs: number | undefined,\n verbose: boolean | undefined,\n): Promise<boolean | undefined> {\n const owner = await readQueueOwnerRecord(sessionId);\n if (!owner) {\n return undefined;\n }\n\n const submitted = await submitSetModeToQueueOwner(owner, modeId, timeoutMs);\n if (submitted) {\n if (verbose) {\n process.stderr.write(\n `[acpx] requested session/set_mode on owner pid ${owner.pid} for session ${sessionId}\\n`,\n );\n }\n return true;\n }\n\n const health = await probeQueueOwnerHealth(sessionId);\n if (!health.hasLease) {\n return undefined;\n }\n\n throw new QueueConnectionError(\n \"Session queue owner is running but not accepting set_mode requests\",\n {\n detailCode: \"QUEUE_NOT_ACCEPTING_REQUESTS\",\n origin: \"queue\",\n retryable: true,\n },\n );\n}\n\nexport async function trySetModelOnRunningOwner(\n sessionId: string,\n modelId: string,\n timeoutMs: number | undefined,\n verbose: boolean | undefined,\n): Promise<boolean | undefined> {\n const owner = await readQueueOwnerRecord(sessionId);\n if (!owner) {\n return undefined;\n }\n\n const submitted = await submitSetModelToQueueOwner(owner, modelId, timeoutMs);\n if (submitted) {\n if (verbose) {\n process.stderr.write(\n `[acpx] requested session/set_model on owner pid ${owner.pid} for session ${sessionId}\\n`,\n );\n }\n return true;\n }\n\n const health = await probeQueueOwnerHealth(sessionId);\n if (!health.hasLease) {\n return undefined;\n }\n\n throw new QueueConnectionError(\n \"Session queue owner is running but not accepting set_model requests\",\n {\n detailCode: \"QUEUE_NOT_ACCEPTING_REQUESTS\",\n origin: \"queue\",\n retryable: true,\n },\n );\n}\n\nexport async function trySetConfigOptionOnRunningOwner(\n sessionId: string,\n configId: string,\n value: string,\n timeoutMs: number | undefined,\n verbose: boolean | undefined,\n): Promise<SetSessionConfigOptionResponse | undefined> {\n const owner = await readQueueOwnerRecord(sessionId);\n if (!owner) {\n return undefined;\n }\n\n const response = await submitSetConfigOptionToQueueOwner(owner, configId, value, timeoutMs);\n if (response) {\n if (verbose) {\n process.stderr.write(\n `[acpx] requested session/set_config_option on owner pid ${owner.pid} for session ${sessionId}\\n`,\n );\n }\n return response;\n }\n\n const health = await probeQueueOwnerHealth(sessionId);\n if (!health.hasLease) {\n return undefined;\n }\n\n throw new QueueConnectionError(\n \"Session queue owner is running but not accepting set_config_option requests\",\n {\n detailCode: \"QUEUE_NOT_ACCEPTING_REQUESTS\",\n origin: \"queue\",\n retryable: true,\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 {\n setCurrentModelId,\n setDesiredConfigOption,\n setDesiredModeId,\n setDesiredModelId,\n} from \"../../session/mode-preference.js\";\nimport { resolveSessionRecord, writeSessionRecord } from \"../../session/persistence.js\";\nimport type {\n AuthPolicy,\n McpServer,\n NonInteractivePermissionPolicy,\n SessionSetConfigOptionResult,\n SessionSetModelResult,\n SessionSetModeResult,\n} from \"../../types.js\";\nimport type { QueueOwnerActiveSessionController } from \"../queue/owner-turn-controller.js\";\n\nexport type ActiveSessionController = QueueOwnerActiveSessionController;\n\nexport type RunSessionSetModeDirectOptions = {\n sessionRecordId: string;\n modeId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n timeoutMs?: number;\n verbose?: boolean;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n};\n\nexport type RunSessionSetConfigOptionDirectOptions = {\n sessionRecordId: string;\n configId: string;\n value: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n timeoutMs?: number;\n verbose?: boolean;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n};\n\nexport type RunSessionSetModelDirectOptions = {\n sessionRecordId: string;\n modelId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n timeoutMs?: number;\n verbose?: boolean;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n};\n\ntype DirectConnectedSessionOptions = {\n sessionRecordId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n timeoutMs?: number;\n verbose?: boolean;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n};\n\nfunction buildDirectConnectedSessionOptions<T>(\n options: DirectConnectedSessionOptions,\n run: WithConnectedSessionOptions<T>[\"run\"],\n): WithConnectedSessionOptions<T> {\n return {\n sessionRecordId: options.sessionRecordId,\n loadRecord: resolveSessionRecord,\n saveRecord: writeSessionRecord,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\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(options, async ({ client, sessionId, record }) => {\n await withTimeout(client.setSessionModel(sessionId, options.modelId), options.timeoutMs);\n setDesiredModelId(record, options.modelId);\n setCurrentModelId(record, options.modelId);\n }),\n );\n\n return toSessionMutationResult(result);\n}\n\nexport async function runSessionSetConfigOptionDirect(\n options: RunSessionSetConfigOptionDirectOptions,\n): Promise<SessionSetConfigOptionResult> {\n const result = await withConnectedSession(\n buildDirectConnectedSessionOptions(options, async ({ client, sessionId, record }) => {\n const response = await withTimeout(\n client.setSessionConfigOption(sessionId, options.configId, options.value),\n options.timeoutMs,\n );\n if (options.configId === \"mode\") {\n setDesiredModeId(record, options.value);\n } else {\n setDesiredConfigOption(record, options.configId, options.value);\n }\n return response;\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 {\n setCurrentModelId,\n setDesiredConfigOption,\n setDesiredModeId,\n setDesiredModelId,\n} from \"../../session/mode-preference.js\";\nimport { resolveSessionRecord, writeSessionRecord, isoNow } from \"../../session/persistence.js\";\nimport type {\n SessionRecord,\n SessionSetConfigOptionResult,\n SessionSetModelResult,\n SessionSetModeResult,\n} from \"../../types.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 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 setDesiredModelId(record, options.modelId);\n setCurrentModelId(record, options.modelId);\n await writeSessionRecord(record);\n return {\n record,\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 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 if (options.configId === \"mode\") {\n setDesiredModeId(record, options.value);\n } else {\n setDesiredConfigOption(record, options.configId, options.value);\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 terminal: options.terminal,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n}\n\nfunction firstAgentCommandToken(command: string): string | undefined {\n const trimmed = command.trim();\n if (!trimmed) {\n return undefined;\n }\n const token = trimmed.split(/\\s+/, 1)[0];\n return token.length > 0 ? token : undefined;\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 procCmdline = `/proc/${pid}/cmdline`;\n try {\n const payload = await fs.readFile(procCmdline, \"utf8\");\n const argv = payload\n .split(\"\\u0000\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\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 } catch {\n return true;\n }\n}\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 { AcpClient, type SessionCreateResult } from \"../../acp/client.js\";\nimport { formatErrorMessage } from \"../../acp/error-normalization.js\";\nimport { withInterrupt, withTimeout } from \"../../async-control.js\";\nimport { applyLifecycleSnapshotToRecord } from \"../../runtime/engine/lifecycle.js\";\nimport { persistSessionOptions } from \"../../runtime/engine/session-options.js\";\nimport { applyConfigOptionsToRecord } from \"../../session/config-options.js\";\nimport { createSessionConversation } from \"../../session/conversation-model.js\";\nimport { defaultSessionEventLog } from \"../../session/event-log.js\";\nimport { setCurrentModelId, syncAdvertisedModelState } from \"../../session/mode-preference.js\";\nimport { applyRequestedModelIfAdvertised } from \"../../session/model-application.js\";\nimport {\n absolutePath,\n findGitRepositoryRoot,\n findSessionByDirectoryWalk,\n isoNow,\n normalizeName,\n writeSessionRecord,\n} from \"../../session/persistence.js\";\nimport { normalizeRuntimeSessionId } from \"../../session/runtime-session-id.js\";\nimport type { SessionEnsureResult, SessionRecord } from \"../../types.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\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 let sessionId: string;\n let agentSessionId: string | undefined;\n let sessionResult: Awaited<ReturnType<AcpClient[\"createSession\" | \"loadSession\"]>>;\n let sessionModels: SessionCreateResult[\"models\"];\n let requestedModelApplied = false;\n\n if (options.resumeSessionId) {\n const resumed = await resumeSessionRecordWithClient(client, options, cwd);\n sessionId = resumed.sessionId;\n agentSessionId = resumed.agentSessionId;\n sessionResult = resumed.sessionResult;\n sessionModels = resumed.sessionModels;\n requestedModelApplied = resumed.requestedModelApplied;\n } else {\n const createdSession = await withTimeout(client.createSession(cwd), options.timeoutMs);\n sessionId = createdSession.sessionId;\n agentSessionId = normalizeRuntimeSessionId(createdSession.agentSessionId);\n sessionResult = createdSession;\n sessionModels = createdSession.models;\n requestedModelApplied = await applyRequestedModelIfAdvertised({\n client,\n sessionId,\n requestedModel: options.sessionOptions?.model,\n models: sessionModels,\n agentCommand: options.agentCommand,\n timeoutMs: options.timeoutMs,\n });\n }\n\n const lifecycle = client.getAgentLifecycleSnapshot();\n const now = isoNow();\n const record: SessionRecord = {\n schema: \"acpx.session.v1\",\n acpxRecordId: sessionId,\n acpSessionId: sessionId,\n agentSessionId,\n agentCommand: options.agentCommand,\n cwd,\n name: normalizeName(options.name),\n createdAt: now,\n lastUsedAt: now,\n lastSeq: 0,\n lastRequestId: undefined,\n eventLog: defaultSessionEventLog(sessionId),\n closed: false,\n closedAt: undefined,\n pid: lifecycle.running ? lifecycle.pid : undefined,\n agentStartedAt: lifecycle.startedAt,\n protocolVersion: client.initializeResult?.protocolVersion,\n agentCapabilities: client.initializeResult?.agentCapabilities,\n ...createSessionConversation(now),\n acpx: {},\n };\n\n persistSessionOptions(record, options.sessionOptions);\n applyConfigOptionsToRecord(record, sessionResult);\n syncAdvertisedModelState(record, sessionModels);\n if (requestedModelApplied) {\n setCurrentModelId(record, options.sessionOptions?.model);\n }\n\n await writeSessionRecord(record);\n return record;\n}\n\ntype CreatedSessionState = {\n sessionId: string;\n agentSessionId: string | undefined;\n sessionResult: Awaited<ReturnType<AcpClient[\"createSession\" | \"loadSession\"]>>;\n sessionModels: SessionCreateResult[\"models\"];\n requestedModelApplied: boolean;\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 return {\n sessionId: options.resumeSessionId,\n agentSessionId: normalizeRuntimeSessionId(resumedSession.agentSessionId),\n sessionResult: resumedSession,\n sessionModels,\n requestedModelApplied: 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 }),\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 const client = new AcpClient({\n agentCommand: options.agentCommand,\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 terminal: options.terminal,\n verbose: options.verbose,\n sessionOptions: options.sessionOptions,\n });\n\n try {\n const record = await withInterrupt(\n async () => await createSessionRecordWithClient(client, options),\n async () => {\n await client.close();\n },\n );\n\n return {\n record,\n client,\n };\n } catch (error) {\n await client.close();\n throw error;\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 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 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 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 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 agentCommand: options.agentCommand,\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 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 { 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 fs.appendFileSync(captureFilePath!, `${JSON.stringify(payload)}\\n`, \"utf8\");\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<void>;\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: (modelId: string, timeoutMs?: number) => Promise<void>;\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\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(): void {\n this.state = \"starting\";\n this.pendingCancel = false;\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 }\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 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(modelId: 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.setSessionModel(modelId),\n timeoutMs,\n );\n return;\n }\n\n 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 permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n ttlMs?: number;\n maxQueueDepth?: number;\n promptRetries?: number;\n sessionOptions?: SessionAgentOptions;\n};\n\ntype SessionSendLike = {\n sessionId: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\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: SessionSendLike,\n): QueueOwnerRuntimeOptions {\n return {\n sessionId: options.sessionId,\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\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\nexport function buildQueueOwnerSpawnOptions(payload: string): {\n detached: true;\n stdio: \"ignore\";\n env: NodeJS.ProcessEnv;\n windowsHide: true;\n} {\n return {\n detached: true,\n stdio: \"ignore\",\n env: {\n ...process.env,\n ACPX_QUEUE_OWNER_PAYLOAD: payload,\n },\n windowsHide: true,\n };\n}\n\nexport function spawnQueueOwnerProcess(options: QueueOwnerRuntimeOptions): void {\n const payload = JSON.stringify(options);\n const child = spawn(\n process.execPath,\n resolveQueueOwnerSpawnArgs(),\n buildQueueOwnerSpawnOptions(payload),\n );\n child.unref();\n}\n","import fs from \"node:fs/promises\";\nimport { isAcpJsonRpcMessage } from \"../acp/jsonrpc.js\";\nimport { incrementPerfCounter, measurePerf } from \"../perf-metrics.js\";\nimport { isProcessAlive } from \"../process-liveness.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 sessionEventLockPath as eventsLockPath,\n sessionEventSegmentPath as segmentEventPath,\n} from \"./event-log.js\";\nimport { resolveSessionRecord, writeSessionRecord } from \"./persistence.js\";\n\nconst LOCK_RETRY_MS = 15;\nconst EVENT_LOCK_STALE_MS = 15_000;\n\nasync function ensureSessionDir(): Promise<void> {\n await fs.mkdir(sessionBaseDir(), { recursive: true });\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 statSize(filePath: string): Promise<number> {\n try {\n const stats = await fs.stat(filePath);\n return stats.size;\n } catch {\n return 0;\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 LockHandle = {\n filePath: string;\n};\n\ntype EventLockPayload = {\n pid?: number;\n created_at?: string;\n};\n\nfunction parseEventLockPayload(raw: string): EventLockPayload {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return {};\n }\n const record = parsed as Record<string, unknown>;\n return {\n pid: typeof record.pid === \"number\" ? record.pid : undefined,\n created_at: typeof record.created_at === \"string\" ? record.created_at : undefined,\n };\n } catch {\n return {};\n }\n}\n\nasync function removeStaleEventLock(lockPath: string): Promise<boolean> {\n try {\n const payload = await fs.readFile(lockPath, \"utf8\");\n const parsed = parseEventLockPayload(payload);\n const createdAtMs = parsed.created_at ? Date.parse(parsed.created_at) : Number.NaN;\n const lockAgeMs = Number.isFinite(createdAtMs)\n ? Date.now() - createdAtMs\n : Number.POSITIVE_INFINITY;\n const pidAlive = isProcessAlive(parsed.pid);\n if (pidAlive && lockAgeMs <= EVENT_LOCK_STALE_MS) {\n return false;\n }\n await fs.unlink(lockPath);\n incrementPerfCounter(\"session.events.stale_lock_recovered\");\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return true;\n }\n return false;\n }\n}\n\nasync function acquireEventsLock(sessionId: string): Promise<LockHandle> {\n await ensureSessionDir();\n const lockPath = eventsLockPath(sessionId);\n const payload = JSON.stringify(\n {\n pid: process.pid,\n created_at: new Date().toISOString(),\n },\n null,\n 2,\n );\n\n for (;;) {\n try {\n await fs.writeFile(lockPath, `${payload}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n });\n return { filePath: lockPath };\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"EEXIST\") {\n throw error;\n }\n const recovered = await removeStaleEventLock(lockPath);\n if (recovered) {\n continue;\n }\n await new Promise<void>((resolve) => {\n setTimeout(resolve, LOCK_RETRY_MS);\n });\n }\n }\n}\n\nasync function releaseEventsLock(lock: LockHandle): Promise<void> {\n await fs.unlink(lock.filePath).catch((error) => {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\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 lock: LockHandle;\n private readonly maxSegmentBytes: number;\n private readonly maxSegments: number;\n private activePath: string;\n private activeSizeBytes: number;\n private segmentCount: number;\n private closed = false;\n\n private constructor(\n record: SessionRecord,\n lock: LockHandle,\n options: Required<SessionEventWriterOptions>,\n state: {\n activePath: string;\n activeSizeBytes: number;\n segmentCount: number;\n },\n ) {\n this.record = record;\n this.lock = lock;\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 }\n\n static async open(\n record: SessionRecord,\n options: SessionEventWriterOptions = {},\n ): Promise<SessionEventWriter> {\n const lock = await acquireEventsLock(record.acpxRecordId);\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 activeSizeBytes = await statSize(activePath);\n const segmentCount = await resolveInitialSegmentCount(record, maxSegments);\n return new SessionEventWriter(\n record,\n lock,\n {\n maxSegmentBytes,\n maxSegments,\n },\n {\n activePath,\n activeSizeBytes,\n segmentCount,\n },\n );\n }\n\n getRecord(): SessionRecord {\n return this.record;\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 if (this.closed) {\n throw new Error(\"SessionEventWriter is closed\");\n }\n\n if (messages.length === 0) {\n return;\n }\n\n await ensureSessionDir();\n\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\n const line = `${JSON.stringify(message)}\\n`;\n const lineBytes = Buffer.byteLength(line);\n if (this.activeSizeBytes > 0 && this.activeSizeBytes + lineBytes > this.maxSegmentBytes) {\n await rotateSegments(this.record.acpxRecordId, this.maxSegments);\n this.activePath = activeEventPath(this.record.acpxRecordId);\n this.activeSizeBytes = 0;\n this.segmentCount = Math.min(this.segmentCount + 1, this.maxSegments);\n incrementPerfCounter(\"session.events.rotate\");\n }\n\n await fs.appendFile(this.activePath, line, \"utf8\");\n this.activeSizeBytes += lineBytes;\n\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 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\n if (options.checkpoint === true) {\n await writeSessionRecord(this.record);\n }\n }\n\n async checkpoint(): Promise<void> {\n if (this.closed) {\n throw new Error(\"SessionEventWriter is closed\");\n }\n await writeSessionRecord(this.record);\n }\n\n async close(options: AppendOptions = {}): Promise<void> {\n if (this.closed) {\n return;\n }\n\n try {\n if (options.checkpoint !== false) {\n await writeSessionRecord(this.record);\n }\n } finally {\n this.closed = true;\n await releaseEventsLock(this.lock);\n }\n }\n}\n\nexport async function listSessionEvents(sessionId: string): Promise<AcpJsonRpcMessage[]> {\n const maxSegments = await resolveSessionMaxSegments(sessionId);\n const files: string[] = [];\n\n for (let segment = maxSegments; segment >= 1; segment -= 1) {\n const filePath = segmentEventPath(sessionId, segment);\n if (await pathExists(filePath)) {\n files.push(filePath);\n }\n }\n\n const active = activeEventPath(sessionId);\n if (await pathExists(active)) {\n files.push(active);\n }\n\n const events: AcpJsonRpcMessage[] = [];\n for (const filePath of files) {\n const payload = await fs.readFile(filePath, \"utf8\");\n const lines = payload.split(\"\\n\").filter((line) => line.trim().length > 0);\n for (const line of lines) {\n try {\n const parsed: unknown = JSON.parse(line);\n if (isAcpJsonRpcMessage(parsed)) {\n events.push(parsed);\n }\n } catch {\n // Skip malformed lines to keep event listing resilient.\n }\n }\n }\n\n return events;\n}\n","import { AcpClient } from \"../../acp/client.js\";\nimport {\n formatErrorMessage,\n isRetryablePromptError,\n normalizeOutputError,\n} from \"../../acp/error-normalization.js\";\nimport { assertRequestedModelSupported } from \"../../acp/model-support.js\";\nimport { InterruptedError, withInterrupt, withTimeout } from \"../../async-control.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 {\n cloneSessionAcpxState,\n cloneSessionConversation,\n recordClientOperation as recordConversationClientOperation,\n recordPromptSubmission,\n recordSessionUpdate as recordConversationSessionUpdate,\n trimConversationForRuntime,\n} from \"../../session/conversation-model.js\";\nimport { SessionEventWriter } from \"../../session/events.js\";\nimport { LiveSessionCheckpoint } from \"../../session/live-checkpoint.js\";\nimport { setCurrentModelId, setDesiredModelId } from \"../../session/mode-preference.js\";\nimport { applyRequestedModelIfAdvertised } from \"../../session/model-application.js\";\nimport {\n absolutePath,\n isoNow,\n resolveSessionRecord,\n writeSessionRecord,\n} from \"../../session/persistence.js\";\nimport type {\n AcpJsonRpcMessage,\n AuthPolicy,\n McpServer,\n NonInteractivePermissionPolicy,\n OutputErrorAcpPayload,\n OutputErrorCode,\n OutputErrorOrigin,\n OutputFormatter,\n PermissionEscalationEvent,\n PermissionPolicy,\n RunPromptResult,\n SessionRecord,\n SessionSendResult,\n} from \"../../types.js\";\nimport { type QueueOwnerMessage, type QueueTask, waitMs } from \"../queue/ipc.js\";\nimport { type QueueOwnerActiveSessionController } from \"../queue/owner-turn-controller.js\";\nimport type { RunOnceOptions, SessionSendOptions } from \"./contracts.js\";\n\nconst INTERRUPT_CANCEL_WAIT_MS = 2_500;\n\ntype RunSessionPromptOptions = Omit<\n SessionSendOptions,\n \"errorEmissionPolicy\" | \"maxQueueDepth\" | \"sessionId\" | \"ttlMs\" | \"waitForCompletion\"\n> & {\n sessionRecordId: string;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n onPromptActive?: () => Promise<void> | void;\n};\n\ntype ActiveSessionController = QueueOwnerActiveSessionController;\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\nconst DISCARD_OUTPUT_FORMATTER: OutputFormatter = {\n setContext() {},\n onAcpMessage() {},\n onError() {},\n onPermissionEscalation() {},\n flush() {},\n};\n\nfunction toPromptResult(\n stopReason: RunPromptResult[\"stopReason\"],\n sessionId: string,\n client: AcpClient,\n): RunPromptResult {\n return {\n stopReason,\n sessionId,\n permissionStats: client.getPermissionStats(),\n };\n}\n\nfunction requestedModelId(value: string | undefined): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction advertisedModelsForRecord(record: SessionRecord):\n | {\n currentModelId: string;\n availableModels: Array<{ modelId: string; name: string }>;\n }\n | undefined {\n const availableModels = record.acpx?.available_models;\n if (!Array.isArray(availableModels)) {\n return undefined;\n }\n return {\n currentModelId: record.acpx?.current_model_id ?? \"\",\n availableModels: availableModels.map((modelId) => ({ modelId, name: modelId })),\n };\n}\n\nasync function applyPromptModelIfAdvertised(params: {\n client: AcpClient;\n sessionId: string;\n requestedModel: string | undefined;\n record: SessionRecord;\n timeoutMs?: number;\n}): Promise<void> {\n const requestedModel = requestedModelId(params.requestedModel);\n if (!requestedModel) {\n return;\n }\n\n const models = advertisedModelsForRecord(params.record);\n assertRequestedModelSupported({\n requestedModel,\n models,\n agentCommand: params.record.agentCommand,\n context: \"apply\",\n });\n if (!models) {\n return;\n }\n if (params.record.acpx?.current_model_id === requestedModel) {\n setDesiredModelId(params.record, requestedModel);\n return;\n }\n\n await withTimeout(\n params.client.setSessionModel(params.sessionId, requestedModel),\n params.timeoutMs,\n );\n setDesiredModelId(params.record, requestedModel);\n setCurrentModelId(params.record, requestedModel);\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 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\nfunction shouldRetryRuntimePrompt(\n error: unknown,\n attempt: number,\n maxRetries: number,\n snapshot: ReturnType<AcpClient[\"getAgentLifecycleSnapshot\"]>,\n hasSideEffects: () => boolean,\n): boolean {\n if (!shouldRetryPromptAttempt(error, attempt, maxRetries, hasSideEffects)) {\n return false;\n }\n return snapshot.lastExit?.unexpectedDuringPrompt !== true;\n}\n\nfunction shouldRetryPromptAttempt(\n error: unknown,\n attempt: number,\n maxRetries: number,\n hasSideEffects: () => boolean,\n): boolean {\n return attempt < maxRetries && !hasSideEffects() && isRetryablePromptError(error);\n}\n\nasync function waitBeforePromptRetry(\n error: unknown,\n attempt: number,\n maxRetries: number,\n suppressSdkConsoleErrors?: boolean,\n): Promise<void> {\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}\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 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 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 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 },\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 runSessionPrompt(options: RunSessionPromptOptions): Promise<SessionSendResult> {\n const stopTotalTimer = startPerfTimer(\"runtime.prompt.total\");\n const output = options.outputFormatter;\n const record = await measurePerf(\"session.resolve_prompt_record\", async () => {\n return await resolveSessionRecord(options.sessionRecordId);\n });\n const conversation = cloneSessionConversation(record);\n let acpxState = cloneSessionAcpxState(record.acpx);\n const promptStartedAt = isoNow();\n const promptMessageId = recordPromptSubmission(conversation, options.prompt, promptStartedAt);\n record.lastPromptAt = promptStartedAt;\n record.lastUsedAt = promptStartedAt;\n applyConversation(record, conversation);\n record.acpx = acpxState;\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: AcpJsonRpcMessage[] = [];\n const sessionOptions = mergeSessionOptions(\n options.sessionOptions,\n sessionOptionsFromRecord(record),\n );\n let bufferingConnectOutput = true;\n let promptTurnActive = false;\n let promptTurnHadSideEffects = false;\n let sawAcpMessage = false;\n let eventWriterClosed = false;\n\n const closeEventWriter = async (checkpoint: boolean): Promise<void> => {\n if (eventWriterClosed) {\n return;\n }\n eventWriterClosed = true;\n await eventWriter.close({ checkpoint });\n };\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 };\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 record.acpx = acpxState;\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 const ownClient = options.client == null;\n const client =\n options.client ??\n new AcpClient({\n agentCommand: record.agentCommand,\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 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 terminal: options.terminal,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n });\n client.setEventHandlers({\n onAcpMessage: (direction, message) => {\n sawAcpMessage = true;\n pendingMessages.push(message);\n options.onAcpMessage?.(direction, message);\n },\n onAcpOutputMessage: (_direction, message) => {\n if (bufferingConnectOutput) {\n pendingConnectOutputMessages.push(message);\n return;\n }\n output.onAcpMessage(message);\n },\n onSessionUpdate: (notification) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n acpxState = recordConversationSessionUpdate(conversation, acpxState, notification);\n trimConversationForRuntime(conversation);\n liveCheckpoint.request();\n options.onSessionUpdate?.(notification);\n },\n onClientOperation: (operation) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n acpxState = recordConversationClientOperation(conversation, acpxState, 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 await client.setSessionModel(activeSessionIdForControl, modelId);\n },\n setSessionConfigOption: async (configId: string, value: string) => {\n return await client.setSessionConfigOption(activeSessionIdForControl, configId, value);\n },\n };\n\n const flushConnectOutput = (loadError?: string): void => {\n bufferingConnectOutput = false;\n const messages =\n loadError == null\n ? pendingConnectOutputMessages\n : filterRecoverableLoadFallbackOutput(pendingConnectOutputMessages);\n for (const message of messages) {\n output.onAcpMessage(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 timeoutMs: options.timeoutMs,\n verbose: options.verbose,\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 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 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 onPromptStarted: buildPromptStartedHook(attempt),\n });\n });\n emitPromptPerfMetric(promptStartedAt, options.verbose);\n return response;\n };\n\n const handlePromptFailure = async (error: unknown, attempt: number): Promise<\"retry\"> => {\n const snapshot = client.getAgentLifecycleSnapshot();\n if (\n shouldRetryRuntimePrompt(\n error,\n attempt,\n options.promptRetries ?? 0,\n snapshot,\n () => promptTurnHadSideEffects,\n )\n ) {\n await waitBeforePromptRetry(\n error,\n attempt,\n options.promptRetries ?? 0,\n options.suppressSdkConsoleErrors,\n );\n return promptTurnHadSideEffects ? await failRuntimePrompt(error, snapshot) : \"retry\";\n }\n return 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 normalizedError = normalizeOutputError(error, { origin: \"runtime\" });\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 record.acpx = acpxState;\n const propagated = error instanceof Error ? error : new Error(formatErrorMessage(error));\n (propagated as { outputAlreadyEmitted?: boolean }).outputAlreadyEmitted = sawAcpMessage;\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 if ((await handlePromptFailure(error, attempt)) === \"retry\") {\n continue;\n }\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 record.acpx = acpxState;\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n stopTotalTimer();\n return response;\n };\n\n try {\n return await withInterrupt(\n async () => {\n const { sessionId: activeSessionId, resumed, loadError } = await connectForPrompt();\n\n await applyPromptModelIfAdvertised({\n client,\n sessionId: activeSessionId,\n requestedModel: sessionOptions?.model,\n record,\n timeoutMs: options.timeoutMs,\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),\n record,\n resumed,\n loadError,\n };\n },\n async () => {\n await client.cancelActivePrompt(INTERRUPT_CANCEL_WAIT_MS);\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n record.lastUsedAt = isoNow();\n applyConversation(record, conversation);\n record.acpx = acpxState;\n await flushPendingMessages(false).catch(() => {\n // best effort while process is being interrupted\n });\n if (ownClient) {\n await client.close();\n }\n },\n );\n } finally {\n if (options.verbose) {\n process.stderr.write(`[acpx] ${formatPerfMetric(\"prompt.total\", stopTotalTimer())}\\n`);\n } else {\n stopTotalTimer();\n }\n if (notifiedClientAvailable) {\n options.onClientClosed?.();\n }\n client.clearEventHandlers();\n if (ownClient) {\n await client.close();\n }\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n applyConversation(record, conversation);\n record.acpx = acpxState;\n await liveCheckpoint.flush().catch(() => {\n // best effort on close\n });\n await flushPendingMessages(false).catch(() => {\n // best effort on close\n });\n await preserveClosedState().catch(() => {\n // best effort on close\n });\n await closeEventWriter(true).catch(() => {\n // best effort on close\n });\n }\n}\n\nexport async function runOnce(options: RunOnceOptions): Promise<RunPromptResult> {\n const output = options.outputFormatter;\n let promptTurnActive = false;\n let promptTurnHadSideEffects = false;\n const client = new AcpClient({\n agentCommand: options.agentCommand,\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 terminal: options.terminal,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n onAcpMessage: options.onAcpMessage,\n onAcpOutputMessage: (_direction, message) => output.onAcpMessage(message),\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 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 (shouldRetryPromptAttempt(error, attempt, maxRetries, () => promptTurnHadSideEffects)) {\n await waitBeforePromptRetry(error, attempt, maxRetries, options.suppressSdkConsoleErrors);\n if (!promptTurnHadSideEffects) {\n continue;\n }\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 });\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);\n },\n async () => {\n await client.cancelActivePrompt(INTERRUPT_CANCEL_WAIT_MS);\n await client.close();\n },\n );\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 terminal: options.terminal,\n outputFormatter: options.outputFormatter,\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 {\n absolutePath,\n resolveSessionRecord,\n writeSessionRecord,\n} from \"../../session/persistence.js\";\nimport type { SessionSendOutcome } from \"../../types.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 { QueueOwnerRuntimeOptions } from \"./queue-owner-process.js\";\nimport { queueOwnerRuntimeOptionsFromSend, spawnQueueOwnerProcess } 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;\n\nasync function submitToRunningOwner(\n options: SessionSendOptions,\n waitForCompletion: boolean,\n): Promise<SessionSendOutcome | undefined> {\n return await trySubmitToRunningOwner({\n sessionId: options.sessionId,\n message: promptToDisplayText(options.prompt),\n prompt: options.prompt,\n permissionMode: options.permissionMode,\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 });\n}\n\nfunction createQueueOwnerSharedClient(\n options: QueueOwnerRuntimeOptions,\n sessionRecord: Awaited<ReturnType<typeof resolveSessionRecord>>,\n): AcpClient {\n return new AcpClient({\n agentCommand: sessionRecord.agentCommand,\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 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 terminal: options.terminal,\n timeoutMs,\n verbose: options.verbose,\n });\n },\n setSessionModelFallback: async (modelId: string, timeoutMs?: number) => {\n 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 terminal: options.terminal,\n timeoutMs,\n verbose: options.verbose,\n });\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 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 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 lease: QueueOwnerLease;\n owner: SessionQueueOwner | undefined;\n heartbeatTimer: NodeJS.Timeout | undefined;\n turnController: QueueOwnerTurnController;\n sharedClient: AcpClient;\n sessionId: string;\n verbose?: boolean;\n}): Promise<void> {\n if (params.heartbeatTimer) {\n clearInterval(params.heartbeatTimer);\n }\n params.turnController.beginClosing();\n await params.owner?.close();\n await params.sharedClient.close().catch(() => {\n // best effort while queue owner is shutting down\n });\n await writeQueueOwnerLifecycleSnapshot(params.sessionId, params.sharedClient);\n await releaseQueueOwnerLease(params.lease);\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\nexport async function runSessionQueueOwner(options: QueueOwnerRuntimeOptions): Promise<void> {\n const lease = await tryAcquireQueueOwnerLease(options.sessionId);\n if (!lease) {\n return;\n }\n\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: () => Promise<T>): Promise<T> => {\n turnController.beginTurn();\n try {\n return await run();\n } finally {\n turnController.endTurn();\n }\n };\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 },\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 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 = setInterval(() => {\n void refreshQueueOwnerLease(lease, { queueDepth: owner?.queueDepth() ?? 0 }).catch(() => {\n // best effort heartbeat\n });\n }, QUEUE_OWNER_HEARTBEAT_INTERVAL_MS);\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 await runPromptTurn(async () => {\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 });\n } finally {\n checkpointPerfMetricsCapture();\n }\n });\n }\n } finally {\n await closeQueueOwnerRuntime({\n lease,\n owner,\n heartbeatTimer,\n turnController,\n sharedClient,\n sessionId: options.sessionId,\n verbose: options.verbose,\n });\n }\n}\n\nexport async function sendSession(options: SessionSendOptions): Promise<SessionSendOutcome> {\n const waitForCompletion = options.waitForCompletion !== false;\n\n const queuedToOwner = await submitToRunningOwner(options, waitForCompletion);\n if (queuedToOwner) {\n return queuedToOwner;\n }\n\n spawnQueueOwnerProcess(queueOwnerRuntimeOptionsFromSend(options));\n\n for (let attempt = 0; attempt < QUEUE_OWNER_STARTUP_MAX_ATTEMPTS; attempt += 1) {\n const queued = await submitToRunningOwner(options, waitForCompletion);\n if (queued) {\n return queued;\n }\n await waitMs(QUEUE_CONNECT_RETRY_MS);\n }\n\n throw new Error(`Session queue owner failed to start for session ${options.sessionId}`);\n}\n\nexport type { QueueOwnerRuntimeOptions };\nexport { DEFAULT_QUEUE_OWNER_TTL_MS };\n","export * from \"../cli/session/contracts.js\";\nexport * from \"../cli/session/session-management.js\";\nexport * from \"../cli/session/queue-owner-runtime.js\";\nexport * from \"../cli/session/session-control.js\";\nexport * from \"../cli/session/runtime.js\";\nexport {\n DEFAULT_HISTORY_LIMIT,\n findGitRepositoryRoot,\n findSession,\n findSessionByDirectoryWalk,\n listSessions,\n listSessionsForAgent,\n pruneSessions,\n} from \"./persistence.js\";\nexport type { PruneOptions, PruneResult } from \"./persistence.js\";\nexport { isProcessAlive } from \"../process-liveness.js\";\n","import type { OutputErrorAcpPayload, OutputErrorCode, OutputErrorOrigin } from \"../types.js\";\n\nexport const OUTPUT_ERROR_JSONRPC_CODES: Record<OutputErrorCode, number> = {\n NO_SESSION: -32002,\n TIMEOUT: -32070,\n PERMISSION_DENIED: -32071,\n PERMISSION_PROMPT_UNAVAILABLE: -32072,\n RUNTIME: -32603,\n USAGE: -32602,\n};\n\ntype JsonRpcErrorObject = {\n code: number;\n message: string;\n data?: unknown;\n};\n\nexport type BuildJsonRpcErrorParams = {\n id?: string | number | null;\n outputCode: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n message: string;\n retryable?: boolean;\n timestamp?: string;\n sessionId?: string;\n acp?: OutputErrorAcpPayload;\n};\n\nfunction hasValidAcpError(\n acp: OutputErrorAcpPayload | undefined,\n): acp is { code: number; message: string; data?: unknown } {\n return Boolean(\n acp &&\n Number.isFinite(acp.code) &&\n typeof acp.message === \"string\" &&\n acp.message.trim().length > 0,\n );\n}\n\nfunction buildFallbackData(params: BuildJsonRpcErrorParams): Record<string, unknown> {\n const data: Record<string, unknown> = {\n acpxCode: params.outputCode,\n detailCode: params.detailCode,\n origin: params.origin,\n retryable: params.retryable,\n timestamp: params.timestamp,\n sessionId: params.sessionId,\n };\n\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) {\n delete data[key];\n }\n }\n\n return data;\n}\n\nfunction mergeAcpErrorData(acpData: unknown, fallbackData: Record<string, unknown>): unknown {\n if (Object.keys(fallbackData).length === 0) {\n return acpData;\n }\n if (acpData === undefined) {\n return fallbackData;\n }\n if (acpData && typeof acpData === \"object\" && !Array.isArray(acpData)) {\n return {\n ...fallbackData,\n ...acpData,\n };\n }\n return acpData;\n}\n\nfunction buildErrorObject(params: BuildJsonRpcErrorParams): JsonRpcErrorObject {\n const fallbackData = buildFallbackData(params);\n if (hasValidAcpError(params.acp)) {\n const data = mergeAcpErrorData(params.acp.data, fallbackData);\n return {\n code: params.acp.code,\n message: params.acp.message,\n ...(data !== undefined ? { data } : {}),\n };\n }\n\n const data = fallbackData;\n return {\n code: OUTPUT_ERROR_JSONRPC_CODES[params.outputCode] ?? -32603,\n message: params.message,\n ...(Object.keys(data).length > 0 ? { data } : {}),\n };\n}\n\nexport function buildJsonRpcErrorResponse(params: BuildJsonRpcErrorParams): {\n jsonrpc: \"2.0\";\n id: string | number | null;\n error: JsonRpcErrorObject;\n} {\n return {\n jsonrpc: \"2.0\",\n id: params.id ?? null,\n error: buildErrorObject(params),\n };\n}\n","export const SUPPRESSED_READ_OUTPUT = \"[read output suppressed]\";\n\nexport type ReadLikeToolDescriptor = {\n title?: string;\n kind?: string | null;\n};\n\nfunction inferToolKindFromTitle(title: string | undefined): string | undefined {\n const normalized = title?.trim().toLowerCase();\n if (!normalized) {\n return undefined;\n }\n\n const head = normalized.split(\":\", 1)[0]?.trim();\n if (!head) {\n return undefined;\n }\n\n if ([\"read\", \"cat\", \"open\", \"view\"].some((needle) => head.includes(needle))) {\n return \"read\";\n }\n\n return undefined;\n}\n\nexport function isReadLikeTool(tool: ReadLikeToolDescriptor): boolean {\n return (\n tool.kind?.trim().toLowerCase() === \"read\" || inferToolKindFromTitle(tool.title) === \"read\"\n );\n}\n","import { buildJsonRpcErrorResponse } from \"../../acp/jsonrpc-error.js\";\nimport type {\n OutputErrorAcpPayload,\n OutputErrorCode,\n OutputErrorOrigin,\n OutputFormatter,\n OutputFormatterContext,\n} from \"../../types.js\";\nimport { isReadLikeTool, SUPPRESSED_READ_OUTPUT } from \"./read-suppression.js\";\n\ntype WritableLike = {\n write(chunk: string): void;\n};\n\ntype JsonRpcRequestMessage = {\n jsonrpc?: unknown;\n id?: unknown;\n method?: unknown;\n};\n\ntype JsonRpcResponseMessage = {\n jsonrpc?: unknown;\n id?: unknown;\n result?: unknown;\n};\n\nconst DEFAULT_JSON_SESSION_ID = \"unknown\";\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 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 sanitizeReadResult(result: unknown): unknown {\n const record = asRecord(result);\n if (!record || typeof record.content !== \"string\") {\n return result;\n }\n return {\n ...record,\n content: SUPPRESSED_READ_OUTPUT,\n };\n}\n\nfunction sanitizeToolContent(content: unknown): unknown {\n if (!Array.isArray(content)) {\n return content;\n }\n\n return [\n {\n type: \"content\",\n content: {\n type: \"text\",\n text: SUPPRESSED_READ_OUTPUT,\n },\n },\n ];\n}\n\nfunction sanitizeToolMessage(message: unknown): unknown {\n const root = asRecord(message);\n const params = asRecord(root?.params);\n const update = asRecord(params?.update);\n if (!root || !params || !update) {\n return message;\n }\n\n return {\n ...root,\n params: {\n ...params,\n update: sanitizeToolUpdate(update),\n },\n };\n}\n\nfunction sanitizeToolUpdate(update: Record<string, unknown>): Record<string, unknown> {\n return {\n ...update,\n rawOutput: sanitizedRawOutput(update),\n content: sanitizedContent(update),\n };\n}\n\nfunction sanitizedRawOutput(update: Record<string, unknown>): unknown {\n if (Object.prototype.hasOwnProperty.call(update, \"rawOutput\") && update.rawOutput !== undefined) {\n return { content: SUPPRESSED_READ_OUTPUT };\n }\n return update.rawOutput;\n}\n\nfunction sanitizedContent(update: Record<string, unknown>): unknown {\n if (Object.prototype.hasOwnProperty.call(update, \"content\") && update.content !== undefined) {\n return sanitizeToolContent(update.content);\n }\n return update.content;\n}\n\nclass JsonOutputFormatter implements OutputFormatter {\n private readonly stdout: WritableLike;\n private readonly suppressReads: boolean;\n private sessionId: string;\n private readonly requestMethodById = new Map<string, string>();\n private readonly toolStateById = new Map<string, { title?: string; kind?: string | null }>();\n\n constructor(stdout: WritableLike, suppressReads: boolean, context?: OutputFormatterContext) {\n this.stdout = stdout;\n this.suppressReads = suppressReads;\n this.sessionId = context?.sessionId?.trim() || DEFAULT_JSON_SESSION_ID;\n }\n\n setContext(context: OutputFormatterContext): void {\n this.sessionId = context.sessionId?.trim() || this.sessionId || DEFAULT_JSON_SESSION_ID;\n }\n\n onAcpMessage(message: unknown): void {\n this.stdout.write(`${JSON.stringify(this.sanitizeMessage(message))}\\n`);\n }\n\n private sanitizeMessage(message: unknown): unknown {\n if (!this.suppressReads) {\n return message;\n }\n\n const sanitizedResponse = this.sanitizeReadResponse(message);\n if (sanitizedResponse !== message) {\n return sanitizedResponse;\n }\n\n const sanitizedToolMessage = this.sanitizeReadToolMessage(message);\n if (sanitizedToolMessage !== message) {\n return sanitizedToolMessage;\n }\n\n this.trackRequestMethod(message);\n return message;\n }\n\n private trackRequestMethod(message: unknown): void {\n const candidate = message as JsonRpcRequestMessage;\n if (typeof candidate.method !== \"string\") {\n return;\n }\n const idKey = jsonRpcIdKey(candidate.id);\n if (!idKey) {\n return;\n }\n this.requestMethodById.set(idKey, candidate.method);\n }\n\n private sanitizeReadResponse(message: unknown): unknown {\n const candidate = message as JsonRpcResponseMessage;\n const idKey = jsonRpcIdKey(candidate.id);\n if (!idKey || !Object.hasOwn(candidate, \"result\")) {\n return message;\n }\n\n const method = this.requestMethodById.get(idKey);\n this.requestMethodById.delete(idKey);\n if (method !== \"fs/read_text_file\") {\n return message;\n }\n\n const root = asRecord(message);\n if (!root) {\n return message;\n }\n\n return {\n ...root,\n result: sanitizeReadResult(candidate.result),\n };\n }\n\n private sanitizeReadToolMessage(message: unknown): unknown {\n const update = this.readToolUpdate(message);\n if (!update) {\n return message;\n }\n\n const toolCallId = typeof update.toolCallId === \"string\" ? update.toolCallId : undefined;\n if (!toolCallId) {\n return message;\n }\n\n const current = this.mergeToolState(toolCallId, update);\n this.toolStateById.set(toolCallId, current);\n\n return isReadLikeTool(current) ? sanitizeToolMessage(message) : message;\n }\n\n private readToolUpdate(message: unknown): Record<string, unknown> | undefined {\n const root = asRecord(message);\n if (root?.method !== \"session/update\") {\n return undefined;\n }\n const params = asRecord(root.params);\n const update = asRecord(params?.update);\n if (!params || !update) {\n return undefined;\n }\n\n const sessionUpdate = update.sessionUpdate;\n if (sessionUpdate !== \"tool_call\" && sessionUpdate !== \"tool_call_update\") {\n return undefined;\n }\n return update;\n }\n\n private mergeToolState(\n toolCallId: string,\n update: Record<string, unknown>,\n ): { title?: string; kind?: string | null } {\n const previous = this.toolStateById.get(toolCallId) ?? {};\n return {\n title: typeof update.title === \"string\" ? update.title : previous.title,\n kind: typeof update.kind === \"string\" || update.kind === null ? update.kind : previous.kind,\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.stdout.write(\n `${JSON.stringify(\n buildJsonRpcErrorResponse({\n outputCode: params.code,\n detailCode: params.detailCode,\n origin: params.origin,\n message: params.message,\n retryable: params.retryable,\n timestamp: params.timestamp,\n sessionId: this.sessionId,\n acp: params.acp,\n }),\n )}\\n`,\n );\n }\n\n onPermissionEscalation(): void {\n // JSON mode is raw ACP NDJSON. Escalation details ride on the ACP\n // request_permission response _meta instead of a synthetic acpx event line.\n }\n\n flush(): void {\n // no-op for streaming output\n }\n}\n\nexport function createJsonOutputFormatter(\n stdout: WritableLike,\n suppressReads = false,\n context?: OutputFormatterContext,\n): OutputFormatter {\n return new JsonOutputFormatter(stdout, suppressReads, context);\n}\n","import type {\n AnyMessage,\n ContentBlock,\n SessionNotification,\n ToolCall,\n ToolCallContent,\n ToolCallLocation,\n ToolCallStatus,\n ToolCallUpdate,\n} from \"@agentclientprotocol/sdk\";\nimport {\n extractSessionUpdateNotification,\n parseJsonRpcErrorMessage,\n parsePromptStopReason,\n} from \"../../acp/jsonrpc.js\";\nimport type {\n AcpJsonRpcMessage,\n ClientOperation,\n OutputErrorAcpPayload,\n OutputErrorCode,\n OutputFormatterContext,\n OutputFormat,\n OutputFormatter,\n OutputErrorOrigin,\n PermissionEscalationEvent,\n} from \"../../types.js\";\nimport { createJsonOutputFormatter } from \"./json-formatter.js\";\nimport { isReadLikeTool, SUPPRESSED_READ_OUTPUT } from \"./read-suppression.js\";\n\ntype WritableLike = {\n write(chunk: string): void;\n isTTY?: boolean;\n};\n\ntype RenderableOutputError = {\n code: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n message: string;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n timestamp?: string;\n};\n\ntype OutputFormatterOptions = {\n stdout?: WritableLike;\n stderr?: WritableLike;\n jsonContext?: OutputFormatterContext;\n suppressReads?: boolean;\n};\n\ntype NormalizedToolStatus = ToolCallStatus | \"unknown\";\n\ntype FormatterSection = \"assistant\" | \"thought\" | \"tool\" | \"plan\" | \"client\" | \"done\";\n\ntype ToolRenderState = {\n id: string;\n title?: string;\n status?: ToolCallStatus | null;\n kind?: string | null;\n locations?: Array<ToolCallLocation> | null;\n rawInput?: unknown;\n rawOutput?: unknown;\n content?: Array<ToolCallContent> | null;\n startedPrinted: boolean;\n finalSignature?: string;\n};\n\nconst MAX_THOUGHT_CHARS = 900;\nconst MAX_INLINE_CHARS = 220;\nconst MAX_OUTPUT_CHARS = 2_000;\nconst MAX_OUTPUT_LINES = 28;\nconst MAX_LOCATION_ITEMS = 5;\nconst OUTPUT_PRIORITY_KEYS = [\n \"stdout\",\n \"stderr\",\n \"output\",\n \"content\",\n \"text\",\n \"message\",\n \"result\",\n \"response\",\n \"value\",\n] as const;\n\nfunction asStatus(status: ToolCallStatus | null | undefined): NormalizedToolStatus {\n return status ?? \"unknown\";\n}\n\nfunction isFinalStatus(status: NormalizedToolStatus): status is \"completed\" | \"failed\" {\n return status === \"completed\" || status === \"failed\";\n}\n\nfunction toStatusLabel(status: NormalizedToolStatus): string {\n switch (status) {\n case \"in_progress\":\n return \"running\";\n case \"pending\":\n return \"pending\";\n case \"completed\":\n return \"completed\";\n case \"failed\":\n return \"failed\";\n default:\n return \"running\";\n }\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 extractJsonRpcMethod(message: AnyMessage): string | undefined {\n return Object.hasOwn(message, \"method\")\n ? (message as { method?: unknown }).method?.toString()\n : undefined;\n}\n\nfunction collapseWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction normalizeLineEndings(value: string): string {\n return value.replace(/\\r\\n?/g, \"\\n\");\n}\n\nfunction truncate(value: string, maxChars: number): string {\n if (value.length <= maxChars) {\n return value;\n }\n if (maxChars <= 3) {\n return value.slice(0, maxChars);\n }\n return `${value.slice(0, maxChars - 3)}...`;\n}\n\nfunction toInline(value: string, maxChars = MAX_INLINE_CHARS): string {\n return truncate(collapseWhitespace(value), maxChars);\n}\n\nfunction indentBlock(value: string, prefix: string): string {\n return value\n .split(\"\\n\")\n .map((line) => `${prefix}${line}`)\n .join(\"\\n\");\n}\n\nfunction dedupeStrings(values: string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n\n for (const value of values) {\n if (seen.has(value)) {\n continue;\n }\n seen.add(value);\n result.push(value);\n }\n\n return result;\n}\n\nfunction safeJson(value: unknown, spacing: number): string | undefined {\n const seen = new WeakSet();\n\n try {\n return JSON.stringify(\n value,\n (_key, entry: unknown) => {\n if (typeof entry === \"bigint\") {\n return `${entry}n`;\n }\n if (typeof entry === \"function\") {\n return `[Function ${entry.name || \"anonymous\"}]`;\n }\n if (typeof entry === \"symbol\") {\n return entry.toString();\n }\n if (entry && typeof entry === \"object\") {\n if (seen.has(entry)) {\n return \"[Circular]\";\n }\n seen.add(entry);\n }\n return entry;\n },\n spacing,\n );\n } catch {\n return undefined;\n }\n}\n\nfunction readFirstString(source: Record<string, unknown>, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n }\n return undefined;\n}\n\nfunction readFirstFiniteNumber(\n source: Record<string, unknown>,\n keys: string[],\n): number | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction formatMetadataNumber(value: number): string {\n return Number.isInteger(value) ? String(value) : String(Number(value.toFixed(8)));\n}\n\nfunction readFirstStringArray(\n source: Record<string, unknown>,\n keys: string[],\n): string[] | undefined {\n for (const key of keys) {\n const value = source[key];\n if (!Array.isArray(value)) {\n continue;\n }\n const entries = value\n .map((entry) => (typeof entry === \"string\" ? entry.trim() : \"\"))\n .filter((entry) => entry.length > 0);\n if (entries.length > 0) {\n return entries;\n }\n }\n return undefined;\n}\n\nfunction formatDisjunction(values: string[]): string {\n if (values.length <= 1) {\n return values[0] ?? \"\";\n }\n if (values.length === 2) {\n return `${values[0]} or ${values[1]}`;\n }\n return `${values.slice(0, -1).join(\", \")}, or ${values.at(-1)}`;\n}\n\nfunction parseAuthMethodIdsFromMessage(message: string): string[] {\n const methods: string[] = [];\n const methodListMatch = message.match(/auth methods \\[([^\\]]+)\\]/iu);\n if (methodListMatch) {\n methods.push(\n ...methodListMatch[1]\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0),\n );\n }\n\n const singleMethodMatch = message.match(/auth method ([\\w.-]+)/iu);\n if (singleMethodMatch) {\n methods.push(singleMethodMatch[1]);\n }\n\n return dedupeStrings(methods);\n}\n\nfunction parseAuthMethodIdsFromAcpData(data: unknown): string[] {\n const record = asRecord(data);\n if (!record) {\n return [];\n }\n\n const methodIds: string[] = [];\n if (typeof record.methodId === \"string\" && record.methodId.trim().length > 0) {\n methodIds.push(record.methodId.trim());\n }\n\n if (Array.isArray(record.methods)) {\n for (const entry of record.methods) {\n const id = parseAuthMethodIdEntry(entry);\n if (id) {\n methodIds.push(id);\n }\n }\n }\n\n return dedupeStrings(methodIds);\n}\n\nfunction parseAuthMethodIdEntry(entry: unknown): string | undefined {\n if (typeof entry === \"string\" && entry.trim().length > 0) {\n return entry.trim();\n }\n\n const id = asRecord(entry)?.id;\n return typeof id === \"string\" && id.trim().length > 0 ? id.trim() : undefined;\n}\n\nfunction renderAuthRequiredHint(params: RenderableOutputError): string {\n const methodIds = dedupeStrings([\n ...parseAuthMethodIdsFromAcpData(params.acp?.data),\n ...parseAuthMethodIdsFromMessage(params.message),\n ]);\n\n if (methodIds.length === 0) {\n return \"hint: run `acpx config show` to locate the active config, then add the required credential under `auth` and retry.\";\n }\n\n const configKeys = methodIds.map((methodId) => `\\`auth.${methodId}\\``);\n return `hint: run \\`acpx config show\\` to locate the active config, then add ${formatDisjunction(configKeys)} and retry.`;\n}\n\nexport function getTextErrorRemediationHints(params: RenderableOutputError): string[] {\n const lowerMessage = params.message.toLowerCase();\n\n if (params.detailCode === \"AUTH_REQUIRED\") {\n return [renderAuthRequiredHint(params)];\n }\n\n if (params.code === \"TIMEOUT\") {\n return [\n \"hint: increase `--timeout <seconds>` for long-running prompts, or check whether the agent/provider is stalled.\",\n ];\n }\n\n if (params.code === \"NO_SESSION\") {\n return noSessionHints(lowerMessage);\n }\n\n return matchingTextErrorRule(params, lowerMessage)?.hints ?? [];\n}\n\ntype TextErrorHintRule = {\n matches: (params: RenderableOutputError, lowerMessage: string) => boolean;\n hints: string[];\n};\n\nconst TEXT_ERROR_HINT_RULES: TextErrorHintRule[] = [\n {\n matches: (_params, lowerMessage) => isUnsupportedSessionLoadError(lowerMessage),\n hints: [\n \"hint: this adapter cannot resume saved ACP sessions; create a fresh one with `acpx <agent> sessions new` instead of reusing `--resume-session`.\",\n ],\n },\n {\n matches: (_params, lowerMessage) => isSessionLoadError(lowerMessage),\n hints: [\n \"hint: rerun with `--verbose` to capture the ACP load failure details.\",\n \"hint: if you do not need the old backend session, start a fresh one with `acpx <agent> sessions new` and retry.\",\n ],\n },\n {\n matches: (params, lowerMessage) => isRateLimitError(params.message, lowerMessage),\n hints: [\n \"hint: the provider appears rate-limited; retry later, switch model, or check provider quota/billing.\",\n ],\n },\n {\n matches: (_params, lowerMessage) => isModelLookupError(lowerMessage),\n hints: [\n \"hint: check the configured model name for this agent, then retry with `--model <model>` or `sessions set-model <model>`.\",\n ],\n },\n {\n matches: (_params, lowerMessage) => isSessionConfigMethodError(lowerMessage),\n hints: [\n \"hint: rerun with `--verbose` to capture the ACP method/error details before retrying.\",\n ],\n },\n {\n matches: isRuntimeAcpProtocolError,\n hints: [\"hint: rerun with `--verbose` to capture the underlying ACP error details.\"],\n },\n];\n\nfunction matchingTextErrorRule(\n params: RenderableOutputError,\n lowerMessage: string,\n): TextErrorHintRule | undefined {\n return TEXT_ERROR_HINT_RULES.find((rule) => rule.matches(params, lowerMessage));\n}\n\nfunction noSessionHints(lowerMessage: string): string[] {\n if (lowerMessage.includes(\"create one:\")) {\n return [];\n }\n return [\n \"hint: the saved ACP session is missing or stale; start a fresh session with `acpx <agent> sessions new`, then retry.\",\n ];\n}\n\nfunction isUnsupportedSessionLoadError(lowerMessage: string): boolean {\n return (\n lowerMessage.includes(\"does not support session/resume\") ||\n lowerMessage.includes(\"does not support session/load\")\n );\n}\n\nfunction isSessionLoadError(lowerMessage: string): boolean {\n return (\n lowerMessage.includes(\"failed to resume acp session\") ||\n lowerMessage.includes(\"session/resume\") ||\n lowerMessage.includes(\"session/load\")\n );\n}\n\nfunction isRateLimitError(message: string, lowerMessage: string): boolean {\n return (\n /\\b429\\b/u.test(message) ||\n [\"rate limit\", \"quota exceeded\"].some((text) => lowerMessage.includes(text))\n );\n}\n\nfunction isModelLookupError(lowerMessage: string): boolean {\n return [\"model not found\", \"unknown model\", \"invalid model\"].some((text) =>\n lowerMessage.includes(text),\n );\n}\n\nfunction isSessionConfigMethodError(lowerMessage: string): boolean {\n return [\"session/set_mode\", \"session/set_model\", \"session/set_config_option\"].some((text) =>\n lowerMessage.includes(text),\n );\n}\n\nfunction isRuntimeAcpProtocolError(params: RenderableOutputError, lowerMessage: string): boolean {\n return (\n params.origin === \"acp\" &&\n params.code === \"RUNTIME\" &&\n (params.acp?.code === -32602 ||\n params.acp?.code === -32603 ||\n lowerMessage.includes(\"internal error\"))\n );\n}\n\nfunction summarizeToolInput(rawInput: unknown): string | undefined {\n if (rawInput == null) {\n return undefined;\n }\n\n if (isScalarToolInput(rawInput)) {\n return toInline(String(rawInput));\n }\n\n const record = asRecord(rawInput);\n if (record) {\n return summarizeToolInputRecord(record) ?? summarizeToolInputJson(rawInput);\n }\n\n return summarizeToolInputJson(rawInput);\n}\n\nfunction isScalarToolInput(value: unknown): value is string | number | boolean {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n}\n\nfunction summarizeToolInputRecord(record: Record<string, unknown>): string | undefined {\n const command = readFirstString(record, [\"command\", \"cmd\", \"program\"]);\n const args = readFirstStringArray(record, [\"args\", \"arguments\"]);\n if (command) {\n return toInline([command, ...(args ?? [])].join(\" \"));\n }\n\n const location = readFirstString(record, [\n \"path\",\n \"file\",\n \"filePath\",\n \"filepath\",\n \"target\",\n \"uri\",\n \"url\",\n ]);\n const query = readFirstString(record, [\"query\", \"pattern\", \"text\", \"search\"]);\n return location || query ? toInline(location ?? query ?? \"\") : undefined;\n}\n\nfunction summarizeToolInputJson(rawInput: unknown): string | undefined {\n const json = safeJson(rawInput, 0);\n return json ? toInline(json) : undefined;\n}\n\nfunction formatLocations(\n locations: Array<ToolCallLocation> | null | undefined,\n): string | undefined {\n if (!locations || locations.length === 0) {\n return undefined;\n }\n\n const unique = new Set<string>();\n for (const location of locations) {\n const formatted = formatLocation(location);\n if (formatted) {\n unique.add(formatted);\n }\n }\n\n const items = [...unique];\n if (items.length === 0) {\n return undefined;\n }\n\n const visible = items.slice(0, MAX_LOCATION_ITEMS);\n const hidden = items.length - visible.length;\n if (hidden <= 0) {\n return visible.join(\", \");\n }\n\n return `${visible.join(\", \")}, +${hidden} more`;\n}\n\nfunction formatLocation(location: ToolCallLocation): string | undefined {\n const path = location.path?.trim();\n if (!path) {\n return undefined;\n }\n\n const line =\n typeof location.line === \"number\" && Number.isFinite(location.line)\n ? `:${Math.max(1, Math.trunc(location.line))}`\n : \"\";\n return `${path}${line}`;\n}\n\nfunction summarizeDiff(path: string, oldText: string | null | undefined, newText: string): string {\n const oldLines = oldText ? oldText.split(\"\\n\").length : 0;\n const newLines = newText.split(\"\\n\").length;\n const delta = newLines - oldLines;\n\n if (delta === 0) {\n return `diff ${path} (line count unchanged)`;\n }\n\n const signedDelta = `${delta > 0 ? \"+\" : \"\"}${delta}`;\n return `diff ${path} (${signedDelta} lines)`;\n}\n\nfunction textFromContentBlock(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 textFromResourceBlock(content);\n }\n case \"image\":\n return `[image] ${content.mimeType}`;\n case \"audio\":\n return `[audio] ${content.mimeType}`;\n default:\n return undefined;\n }\n}\n\nfunction textFromResourceBlock(content: Extract<ContentBlock, { type: \"resource\" }>): string {\n if (\"text\" in content.resource && typeof content.resource.text === \"string\") {\n return content.resource.text;\n }\n const uri = content.resource.uri;\n const mimeType = content.resource.mimeType;\n return `[resource] ${uri}${mimeType ? ` (${mimeType})` : \"\"}`;\n}\n\nfunction summarizeToolContent(\n content: Array<ToolCallContent> | null | undefined,\n): string | undefined {\n if (!content || content.length === 0) {\n return undefined;\n }\n\n const fragments: string[] = [];\n\n for (const entry of content) {\n const fragment = summarizeToolContentEntry(entry);\n if (fragment) {\n fragments.push(fragment);\n }\n }\n\n const unique = dedupeStrings(\n fragments.map((fragment) => fragment.trim()).filter((fragment) => fragment.length > 0),\n );\n if (unique.length === 0) {\n return undefined;\n }\n\n return unique.join(\"\\n\\n\");\n}\n\nfunction summarizeToolContentEntry(entry: ToolCallContent): string | undefined {\n if (entry.type === \"content\") {\n const text = textFromContentBlock(entry.content);\n return text && text.trim() ? text.trimEnd() : undefined;\n }\n if (entry.type === \"diff\") {\n return summarizeDiff(entry.path, entry.oldText, entry.newText);\n }\n if (entry.type === \"terminal\") {\n return `[terminal] ${entry.terminalId}`;\n }\n return undefined;\n}\n\nfunction extractOutputText(\n value: unknown,\n depth = 0,\n seen = new Set<unknown>(),\n): string | undefined {\n if (value == null) {\n return undefined;\n }\n\n const scalar = extractScalarOutputText(value);\n if (scalar !== null) {\n return scalar;\n }\n\n if (depth >= 4) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n return extractOutputTextArray(value, depth, seen);\n }\n\n return extractOutputTextRecord(value, depth, seen);\n}\n\nfunction extractOutputTextRecord(\n value: unknown,\n depth: number,\n seen: Set<unknown>,\n): string | undefined {\n const record = asRecord(value);\n if (!record || seen.has(record)) {\n return undefined;\n }\n\n seen.add(record);\n\n return extractPreferredOutputText(record, depth, seen) ?? extractJsonOutputText(record);\n}\n\nfunction extractScalarOutputText(value: unknown): string | undefined | null {\n if (typeof value === \"string\") {\n const trimmed = value.trimEnd();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n return null;\n}\n\nfunction extractOutputTextArray(\n value: unknown[],\n depth: number,\n seen: Set<unknown>,\n): string | undefined {\n const parts = value\n .map((entry) => extractOutputText(entry, depth + 1, seen))\n .filter((entry): entry is string => Boolean(entry));\n return parts.length > 0 ? dedupeStrings(parts).join(\"\\n\") : undefined;\n}\n\nfunction extractPreferredOutputText(\n record: Record<string, unknown>,\n depth: number,\n seen: Set<unknown>,\n): string | undefined {\n const preferred = OUTPUT_PRIORITY_KEYS.flatMap((key) => {\n if (!(key in record)) {\n return [];\n }\n const extracted = extractOutputText(record[key], depth + 1, seen);\n return extracted ? [extracted] : [];\n });\n const uniquePreferred = dedupeStrings(preferred);\n return uniquePreferred.length > 0 ? uniquePreferred.join(\"\\n\") : undefined;\n}\n\nfunction extractJsonOutputText(record: Record<string, unknown>): string | undefined {\n const json = safeJson(record, 2);\n return !json || json === \"{}\" ? undefined : json;\n}\n\nfunction summarizeToolOutput(\n rawOutput: unknown,\n content: Array<ToolCallContent> | null | undefined,\n): string | undefined {\n const outputFromRaw = extractOutputText(rawOutput);\n const outputFromContent = summarizeToolContent(content);\n\n const fragments = dedupeStrings(\n [outputFromRaw, outputFromContent]\n .map((fragment) => fragment?.trim())\n .filter((fragment): fragment is string => Boolean(fragment)),\n );\n\n if (fragments.length === 0) {\n return undefined;\n }\n\n return fragments.join(\"\\n\\n\");\n}\n\nfunction renderToolOutput(state: ToolRenderState, suppressReads: boolean): string | undefined {\n if (suppressReads && isReadLikeTool(state)) {\n return SUPPRESSED_READ_OUTPUT;\n }\n\n return summarizeToolOutput(state.rawOutput, state.content);\n}\n\nfunction limitOutputBlock(value: string): string {\n const normalized = value.replace(/\\r\\n/g, \"\\n\").trim();\n if (!normalized) {\n return \"\";\n }\n\n const lines = normalized.split(\"\\n\");\n const visible = lines.slice(0, MAX_OUTPUT_LINES);\n let result = visible.join(\"\\n\");\n\n if (lines.length > visible.length) {\n const hidden = lines.length - visible.length;\n result += `\\n... (${hidden} more lines)`;\n }\n\n if (result.length > MAX_OUTPUT_CHARS) {\n result = `${result.slice(0, MAX_OUTPUT_CHARS - 3)}...`;\n }\n\n return result;\n}\n\nclass TextOutputFormatter implements OutputFormatter {\n private readonly stdout: WritableLike;\n private readonly useColor: boolean;\n private readonly suppressReads: boolean;\n private readonly toolStates = new Map<string, ToolRenderState>();\n private thoughtBuffer = \"\";\n private wroteAny = false;\n private atLineStart = true;\n private section: FormatterSection | null = null;\n\n constructor(stdout: WritableLike, suppressReads: boolean) {\n this.stdout = stdout;\n this.useColor = Boolean(stdout.isTTY);\n this.suppressReads = suppressReads;\n }\n\n setContext(_context: OutputFormatterContext): void {\n // no-op for text mode\n }\n\n onAcpMessage(message: AcpJsonRpcMessage): void {\n const notification = extractSessionUpdateNotification(message);\n if (notification) {\n this.renderSessionUpdate(notification);\n return;\n }\n\n const method = extractJsonRpcMethod(message);\n if (method && method !== \"session/prompt\" && method !== \"session/cancel\") {\n this.onClientOperation({\n method: method as ClientOperation[\"method\"],\n status: \"running\",\n summary: method,\n timestamp: new Date().toISOString(),\n });\n return;\n }\n\n const stopReason = parsePromptStopReason(message);\n if (stopReason) {\n this.renderDone(stopReason);\n return;\n }\n\n const errorMessage = parseJsonRpcErrorMessage(message);\n if (errorMessage) {\n this.onError({\n code: \"RUNTIME\",\n origin: \"acp\",\n message: errorMessage,\n });\n }\n }\n\n private renderSessionUpdate(notification: SessionNotification): void {\n const update = notification.update;\n if (update.sessionUpdate !== \"agent_thought_chunk\") {\n this.flushThoughtBuffer();\n }\n this.renderSessionUpdateBody(update);\n }\n\n private renderSessionUpdateBody(update: SessionNotification[\"update\"]): void {\n switch (update.sessionUpdate) {\n case \"agent_message_chunk\": {\n if (update.content.type === \"text\") {\n this.writeAssistantChunk(update.content.text);\n }\n return;\n }\n case \"agent_thought_chunk\": {\n if (update.content.type === \"text\") {\n this.thoughtBuffer += update.content.text;\n }\n return;\n }\n case \"tool_call\": {\n this.renderToolUpdate(update);\n return;\n }\n case \"tool_call_update\": {\n this.renderToolUpdate(update);\n return;\n }\n case \"plan\": {\n this.renderPlanUpdate(update.entries);\n return;\n }\n default:\n return;\n }\n }\n\n private renderPlanUpdate(\n entries: Extract<SessionNotification[\"update\"], { sessionUpdate: \"plan\" }>[\"entries\"],\n ): void {\n this.beginSection(\"plan\");\n this.writeLine(this.bold(\"[plan]\"));\n for (const entry of entries) {\n this.writeLine(` - [${entry.status}] ${entry.content}`);\n }\n }\n\n private renderDone(stopReason: string): void {\n this.flushThoughtBuffer();\n this.beginSection(\"done\");\n this.writeLine(this.dim(`[done] ${stopReason}`));\n }\n\n onError(params: RenderableOutputError): void {\n this.flushThoughtBuffer();\n this.beginSection(\"done\");\n this.writeLine(this.formatAnsi(`[error] ${params.code}: ${params.message}`, \"31\"));\n for (const hint of getTextErrorRemediationHints(params)) {\n this.writeLine(this.dim(hint));\n }\n }\n\n onClientOperation(operation: ClientOperation): void {\n this.flushThoughtBuffer();\n this.beginSection(\"client\");\n\n const normalizedStatus: NormalizedToolStatus =\n operation.status === \"completed\"\n ? \"completed\"\n : operation.status === \"failed\"\n ? \"failed\"\n : \"in_progress\";\n const statusText = this.colorStatus(operation.status, normalizedStatus);\n this.writeLine(`${this.bold(\"[client]\")} ${operation.summary} (${statusText})`);\n if (operation.details && operation.details.trim().length > 0) {\n this.writeLine(\" details:\");\n this.writeLine(indentBlock(operation.details, \" \"));\n }\n }\n\n onPermissionEscalation(event: PermissionEscalationEvent): void {\n this.flushThoughtBuffer();\n this.beginSection(\"client\");\n this.writeLine(`${this.bold(\"[permission]\")} ${event.message}`);\n const details = [\n `sessionId: ${event.sessionId}`,\n `toolCallId: ${event.toolCallId}`,\n event.toolName ? `toolName: ${event.toolName}` : undefined,\n `toolTitle: ${event.toolTitle}`,\n event.toolInput !== undefined\n ? `toolInput: ${summarizeToolInput(event.toolInput) ?? \"(structured input)\"}`\n : undefined,\n event.toolKind ? `toolKind: ${event.toolKind}` : undefined,\n event.matchedRule ? `matchedRule: ${event.matchedRule}` : undefined,\n ].filter((line): line is string => Boolean(line));\n this.writeLine(indentBlock(details.join(\"\\n\"), \" \"));\n }\n\n flush(): void {\n this.flushThoughtBuffer();\n if (!this.atLineStart) {\n this.write(\"\\n\");\n }\n }\n\n private write(chunk: string): void {\n if (!chunk) {\n return;\n }\n this.stdout.write(chunk);\n this.wroteAny = true;\n this.atLineStart = chunk.endsWith(\"\\n\");\n }\n\n private writeLine(line: string): void {\n this.write(`${line}\\n`);\n }\n\n private beginSection(next: Exclude<FormatterSection, \"assistant\">): void {\n if (!this.atLineStart) {\n this.write(\"\\n\");\n }\n if (this.wroteAny) {\n this.write(\"\\n\");\n }\n this.section = next;\n }\n\n private writeAssistantChunk(text: string): void {\n if (!text) {\n return;\n }\n this.section = \"assistant\";\n this.write(text);\n }\n\n private flushThoughtBuffer(): void {\n const thought = truncate(normalizeLineEndings(this.thoughtBuffer).trim(), MAX_THOUGHT_CHARS);\n this.thoughtBuffer = \"\";\n if (!thought) {\n return;\n }\n\n this.beginSection(\"thought\");\n const [firstLine, ...restLines] = thought.split(\"\\n\");\n this.writeLine(this.dim(`[thinking] ${firstLine}`));\n for (const line of restLines) {\n this.writeLine(this.dim(` ${line}`));\n }\n }\n\n private renderToolUpdate(update: ToolCall | ToolCallUpdate): void {\n const state = this.getOrCreateToolState(update.toolCallId);\n this.mergeToolState(state, update);\n\n const status = asStatus(state.status);\n if (isFinalStatus(status)) {\n const signature = this.toolSignature(state);\n if (signature !== state.finalSignature) {\n state.finalSignature = signature;\n this.renderFinalToolState(state, status);\n }\n return;\n }\n\n if (state.startedPrinted) {\n return;\n }\n\n state.startedPrinted = true;\n this.renderStartingToolState(state, status);\n }\n\n private getOrCreateToolState(toolCallId: string): ToolRenderState {\n const existing = this.toolStates.get(toolCallId);\n if (existing) {\n return existing;\n }\n\n const created: ToolRenderState = {\n id: toolCallId,\n startedPrinted: false,\n };\n this.toolStates.set(toolCallId, created);\n return created;\n }\n\n private mergeToolState(state: ToolRenderState, update: ToolCall | ToolCallUpdate): void {\n this.mergeToolTitle(state, update.title);\n this.mergeToolPayloadState(state, update);\n }\n\n private mergeToolTitle(state: ToolRenderState, title: string | null | undefined): void {\n if (typeof title === \"string\" && title.trim().length > 0) {\n state.title = title;\n }\n }\n\n private mergeToolPayloadState(state: ToolRenderState, update: ToolCall | ToolCallUpdate): void {\n if (update.status !== undefined) {\n state.status = update.status;\n }\n if (update.kind !== undefined) {\n state.kind = update.kind;\n }\n if (update.locations !== undefined) {\n state.locations = update.locations;\n }\n if (update.rawInput !== undefined) {\n state.rawInput = update.rawInput;\n }\n if (update.rawOutput !== undefined) {\n state.rawOutput = update.rawOutput;\n }\n if (update.content !== undefined) {\n state.content = update.content;\n }\n }\n\n private toolSignature(state: ToolRenderState): string {\n const signaturePayload = {\n title: state.title,\n status: state.status,\n kind: state.kind,\n input: summarizeToolInput(state.rawInput),\n files: formatLocations(state.locations),\n output: renderToolOutput(state, this.suppressReads),\n };\n\n return safeJson(signaturePayload, 0) ?? JSON.stringify(signaturePayload);\n }\n\n private renderStartingToolState(\n state: ToolRenderState,\n status: Exclude<NormalizedToolStatus, \"completed\" | \"failed\">,\n ): void {\n this.beginSection(\"tool\");\n\n const title = state.title ?? state.id;\n const label = status === \"pending\" ? \"pending\" : \"running\";\n const statusText = this.colorStatus(label, status);\n this.writeLine(`${this.bold(\"[tool]\")} ${title} (${statusText})`);\n\n const input = summarizeToolInput(state.rawInput);\n if (input) {\n this.writeLine(` input: ${input}`);\n }\n\n const files = formatLocations(state.locations);\n if (files) {\n this.writeLine(` files: ${files}`);\n }\n }\n\n private renderFinalToolState(state: ToolRenderState, status: \"completed\" | \"failed\"): void {\n this.beginSection(\"tool\");\n\n const title = state.title ?? state.id;\n const statusText = this.colorStatus(toStatusLabel(status), status);\n this.writeLine(`${this.bold(\"[tool]\")} ${title} (${statusText})`);\n\n if (state.kind) {\n this.writeLine(` kind: ${state.kind}`);\n }\n\n const input = summarizeToolInput(state.rawInput);\n if (input) {\n this.writeLine(` input: ${input}`);\n }\n\n const files = formatLocations(state.locations);\n if (files) {\n this.writeLine(` files: ${files}`);\n }\n\n const output = renderToolOutput(state, this.suppressReads);\n if (output) {\n this.writeLine(\" output:\");\n this.writeLine(indentBlock(limitOutputBlock(output), \" \"));\n }\n }\n\n private formatAnsi(text: string, code: string): string {\n if (!this.useColor) {\n return text;\n }\n return `\\u001b[${code}m${text}\\u001b[0m`;\n }\n\n private bold(text: string): string {\n return this.formatAnsi(text, \"1\");\n }\n\n private dim(text: string): string {\n return this.formatAnsi(text, \"2\");\n }\n\n private colorStatus(text: string, status: NormalizedToolStatus): string {\n if (!this.useColor) {\n return text;\n }\n\n switch (status) {\n case \"completed\":\n return this.formatAnsi(text, \"32\");\n case \"failed\":\n return this.formatAnsi(text, \"31\");\n case \"pending\":\n case \"in_progress\":\n case \"unknown\":\n default:\n return this.formatAnsi(text, \"33\");\n }\n }\n}\n\nclass QuietOutputFormatter implements OutputFormatter {\n private readonly stdout: WritableLike;\n private readonly stderr: WritableLike;\n private chunks: string[] = [];\n private flushed = false;\n private metadataFlushed = false;\n\n constructor(stdout: WritableLike, stderr: WritableLike) {\n this.stdout = stdout;\n this.stderr = stderr;\n }\n\n setContext(_context: OutputFormatterContext): void {\n // no-op for quiet mode\n }\n\n onAcpMessage(message: AcpJsonRpcMessage): void {\n const update = extractSessionUpdateNotification(message);\n if (\n update?.update.sessionUpdate === \"agent_message_chunk\" &&\n update.update.content.type === \"text\"\n ) {\n this.chunks.push(update.update.content.text);\n return;\n }\n\n if (parsePromptStopReason(message)) {\n this.flushBufferedOutput();\n this.flushMetadata(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 // no-op in quiet mode\n }\n\n onPermissionEscalation(_event: PermissionEscalationEvent): void {\n // no-op in quiet mode\n }\n\n flush(): void {\n // no-op for streaming output\n }\n\n private flushBufferedOutput(): void {\n if (this.flushed) {\n return;\n }\n\n this.flushed = true;\n const text = this.chunks.join(\"\");\n this.stdout.write(text.endsWith(\"\\n\") ? text : `${text}\\n`);\n }\n\n private flushMetadata(message: AcpJsonRpcMessage): void {\n if (this.metadataFlushed) {\n return;\n }\n\n this.metadataFlushed = true;\n const result = asRecord((message as { result?: unknown }).result);\n if (!result) {\n return;\n }\n\n const usageLine = this.formatUsageLine(asRecord(result.usage));\n if (usageLine) {\n this.stderr.write(`${usageLine}\\n`);\n }\n\n const costLine = this.formatCostLine(result.cost);\n if (costLine) {\n this.stderr.write(`${costLine}\\n`);\n }\n }\n\n private formatUsageLine(usage: Record<string, unknown> | undefined): string | undefined {\n if (!usage) {\n return undefined;\n }\n\n const parts: string[] = [];\n const fields: Array<[string, string[]]> = [\n [\"input\", [\"inputTokens\", \"input_tokens\"]],\n [\"output\", [\"outputTokens\", \"output_tokens\"]],\n [\"cache_read\", [\"cachedReadTokens\", \"cacheReadInputTokens\", \"cache_read_input_tokens\"]],\n [\n \"cache_write\",\n [\"cachedWriteTokens\", \"cacheCreationInputTokens\", \"cache_creation_input_tokens\"],\n ],\n [\"total\", [\"totalTokens\", \"total_tokens\"]],\n ];\n\n for (const [label, keys] of fields) {\n const value = readFirstFiniteNumber(usage, keys);\n if (value !== undefined) {\n parts.push(`${label}=${formatMetadataNumber(value)}`);\n }\n }\n\n return parts.length > 0 ? `[acpx] tokens: ${parts.join(\" \")}` : undefined;\n }\n\n private formatCostLine(cost: unknown): string | undefined {\n const scalar = this.formatScalarCostLine(cost);\n if (scalar) {\n return scalar;\n }\n const record = asRecord(cost);\n if (!record) {\n return undefined;\n }\n\n const amount = readFirstFiniteNumber(record, [\"amount\", \"value\", \"total\"]);\n if (amount === undefined) {\n return undefined;\n }\n\n const currency =\n typeof record.currency === \"string\" && record.currency.trim()\n ? ` ${record.currency.trim()}`\n : \"\";\n return `[acpx] cost: ${formatMetadataNumber(amount)}${currency}`;\n }\n\n private formatScalarCostLine(cost: unknown): string | undefined {\n if (typeof cost === \"number\" && Number.isFinite(cost)) {\n return `[acpx] cost: ${formatMetadataNumber(cost)}`;\n }\n\n if (typeof cost === \"string\" && cost.trim()) {\n return `[acpx] cost: ${cost.trim()}`;\n }\n\n return undefined;\n }\n}\n\nexport function createOutputFormatter(\n format: OutputFormat,\n options: OutputFormatterOptions = {},\n): OutputFormatter {\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n const suppressReads = options.suppressReads === true;\n\n switch (format) {\n case \"text\":\n return new TextOutputFormatter(stdout, suppressReads);\n case \"json\":\n return createJsonOutputFormatter(stdout, suppressReads, options.jsonContext);\n case \"quiet\":\n return new QuietOutputFormatter(stdout, stderr);\n default: {\n const exhaustive: never = format;\n void exhaustive;\n throw new Error(\"Unsupported output format\");\n }\n }\n}\n"],"mappings":"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"}
|