acpx 0.4.1 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{cli-idpWyCOs.js → cli-DZjj5kij.js} +8 -12
- package/dist/cli-DZjj5kij.js.map +1 -0
- package/dist/cli.d.ts +2 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1017 -1009
- package/dist/cli.js.map +1 -1
- package/dist/client-S8QicFBT.d.ts +119 -0
- package/dist/client-S8QicFBT.d.ts.map +1 -0
- package/dist/{flags-CCcX9fZj.js → flags-W3vEVSiS.js} +5 -55
- package/dist/flags-W3vEVSiS.js.map +1 -0
- package/dist/{flows-BL1tSvZT.js → flows-CLQYpPh7.js} +471 -281
- package/dist/flows-CLQYpPh7.js.map +1 -0
- package/dist/flows.d.ts +5 -9
- package/dist/flows.d.ts.map +1 -1
- package/dist/flows.js +1 -1
- package/dist/{queue-ipc-CE8_QGX3.js → ipc-BM335WFg.js} +12 -571
- package/dist/ipc-BM335WFg.js.map +1 -0
- package/dist/{acp-jsonrpc-BbBgC5gO.js → jsonrpc-DSxh2w5R.js} +2 -2
- package/dist/jsonrpc-DSxh2w5R.js.map +1 -0
- package/dist/{output-Du3m6oPQ.js → output-C4QhjpM6.js} +6 -6
- package/dist/output-C4QhjpM6.js.map +1 -0
- package/dist/perf-metrics-D0um6IR6.js +588 -0
- package/dist/perf-metrics-D0um6IR6.js.map +1 -0
- package/dist/{session-RO_LZUnv.js → prompt-turn-CbSSNHjk.js} +2568 -3667
- package/dist/prompt-turn-CbSSNHjk.js.map +1 -0
- package/dist/{output-render-Bz58qaQn.js → render-Br-kVPK_.js} +7 -6
- package/dist/render-Br-kVPK_.js.map +1 -0
- package/dist/runtime.d.ts +267 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +983 -0
- package/dist/runtime.js.map +1 -0
- package/dist/session-BiBN0BvM.js +1488 -0
- package/dist/session-BiBN0BvM.js.map +1 -0
- package/dist/{types-CeRKmEQ1.d.ts → types-Cgigsj1X.d.ts} +40 -3
- package/dist/types-Cgigsj1X.d.ts.map +1 -0
- package/package.json +5 -3
- package/dist/acp-jsonrpc-BbBgC5gO.js.map +0 -1
- package/dist/cli-idpWyCOs.js.map +0 -1
- package/dist/flags-CCcX9fZj.js.map +0 -1
- package/dist/flows-BL1tSvZT.js.map +0 -1
- package/dist/output-Du3m6oPQ.js.map +0 -1
- package/dist/output-render-Bz58qaQn.js.map +0 -1
- package/dist/queue-ipc-CE8_QGX3.js.map +0 -1
- package/dist/session-RO_LZUnv.js.map +0 -1
- package/dist/types-CeRKmEQ1.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc-BM335WFg.js","names":[],"sources":["../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"],"sourcesContent":["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 fs from \"node:fs/promises\";\nimport { queueBaseDir, queueLockFilePath, queueSocketBaseDir, queueSocketPath } from \"./paths.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 (\n !Number.isInteger(record.pid) ||\n (record.pid as number) <= 0 ||\n typeof record.sessionId !== \"string\" ||\n typeof record.socketPath !== \"string\" ||\n typeof record.createdAt !== \"string\" ||\n typeof record.heartbeatAt !== \"string\" ||\n !Number.isInteger(record.ownerGeneration) ||\n (record.ownerGeneration as number) <= 0 ||\n !Number.isInteger(record.queueDepth) ||\n (record.queueDepth as number) < 0\n ) {\n return null;\n }\n\n return {\n pid: record.pid as number,\n sessionId: record.sessionId,\n socketPath: record.socketPath,\n createdAt: record.createdAt,\n heartbeatAt: record.heartbeatAt,\n ownerGeneration: record.ownerGeneration as number,\n queueDepth: record.queueDepth as number,\n };\n}\n\nfunction createOwnerGeneration(): number {\n return Date.now() * 1_000 + Math.floor(Math.random() * 1_000);\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 await fs.mkdir(queueBaseDir(), { recursive: true });\n const socketDir = queueSocketBaseDir();\n if (socketDir) {\n await fs.mkdir(socketDir, { recursive: true });\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 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\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 { isAcpJsonRpcMessage } from \"../../acp/jsonrpc.js\";\nimport { isPromptInput, textPrompt } from \"../../prompt-content.js\";\nimport {\n OUTPUT_ERROR_CODES,\n OUTPUT_ERROR_ORIGINS,\n type OutputErrorAcpPayload,\n type OutputErrorCode,\n type OutputErrorOrigin,\n} from \"../../types.js\";\nimport type {\n AcpJsonRpcMessage,\n NonInteractivePermissionPolicy,\n PermissionMode,\n PromptInput,\n SessionResumePolicy,\n SessionSendResult,\n} from \"../../types.js\";\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 timeoutMs?: number;\n suppressSdkConsoleErrors?: boolean;\n waitForCompletion: boolean;\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 QueueRequest =\n | QueueSubmitRequest\n | QueueCancelRequest\n | QueueSetModeRequest\n | QueueSetModelRequest\n | QueueSetConfigOptionRequest;\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 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 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 | QueueOwnerResultMessage\n | QueueOwnerCancelResultMessage\n | QueueOwnerSetModeResultMessage\n | QueueOwnerSetModelResultMessage\n | QueueOwnerSetConfigOptionResultMessage\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 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 parseAcpError(value: unknown): OutputErrorAcpPayload | undefined {\n const record = asRecord(value);\n if (!record) {\n return undefined;\n }\n if (typeof record.code !== \"number\" || !Number.isFinite(record.code)) {\n return undefined;\n }\n if (typeof record.message !== \"string\" || record.message.length === 0) {\n return undefined;\n }\n\n return {\n code: record.code,\n message: record.message,\n data: record.data,\n };\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\nexport function parseQueueRequest(raw: unknown): QueueRequest | null {\n const request = asRecord(raw);\n if (!request) {\n return null;\n }\n\n if (typeof request.type !== \"string\" || typeof request.requestId !== \"string\") {\n return null;\n }\n const ownerGeneration = parseOwnerGeneration(request.ownerGeneration);\n if (ownerGeneration === null) {\n return null;\n }\n\n const timeoutRaw = request.timeoutMs;\n const timeoutMs =\n typeof timeoutRaw === \"number\" && Number.isFinite(timeoutRaw) && timeoutRaw > 0\n ? Math.round(timeoutRaw)\n : undefined;\n\n if (request.type === \"submit_prompt\") {\n const resumePolicy =\n request.resumePolicy == null\n ? undefined\n : isSessionResumePolicy(request.resumePolicy)\n ? request.resumePolicy\n : null;\n const nonInteractivePermissions =\n request.nonInteractivePermissions == null\n ? undefined\n : isNonInteractivePermissionPolicy(request.nonInteractivePermissions)\n ? request.nonInteractivePermissions\n : null;\n const suppressSdkConsoleErrors =\n request.suppressSdkConsoleErrors == null\n ? undefined\n : typeof request.suppressSdkConsoleErrors === \"boolean\"\n ? request.suppressSdkConsoleErrors\n : null;\n\n const prompt =\n request.prompt == null ? undefined : isPromptInput(request.prompt) ? request.prompt : null;\n if (\n typeof request.message !== \"string\" ||\n !isPermissionMode(request.permissionMode) ||\n resumePolicy === null ||\n prompt === null ||\n nonInteractivePermissions === null ||\n suppressSdkConsoleErrors === null ||\n typeof request.waitForCompletion !== \"boolean\"\n ) {\n return null;\n }\n\n return {\n type: \"submit_prompt\",\n requestId: request.requestId,\n ownerGeneration,\n message: request.message,\n prompt: prompt ?? textPrompt(request.message),\n permissionMode: request.permissionMode,\n ...(resumePolicy !== undefined ? { resumePolicy } : {}),\n nonInteractivePermissions,\n timeoutMs,\n ...(suppressSdkConsoleErrors !== undefined ? { suppressSdkConsoleErrors } : {}),\n waitForCompletion: request.waitForCompletion,\n };\n }\n\n if (request.type === \"cancel_prompt\") {\n return {\n type: \"cancel_prompt\",\n requestId: request.requestId,\n ownerGeneration,\n };\n }\n\n if (request.type === \"set_mode\") {\n if (typeof request.modeId !== \"string\" || request.modeId.trim().length === 0) {\n return null;\n }\n return {\n type: \"set_mode\",\n requestId: request.requestId,\n ownerGeneration,\n modeId: request.modeId,\n timeoutMs,\n };\n }\n\n if (request.type === \"set_model\") {\n if (typeof request.modelId !== \"string\" || request.modelId.trim().length === 0) {\n return null;\n }\n return {\n type: \"set_model\",\n requestId: request.requestId,\n ownerGeneration,\n modelId: request.modelId,\n timeoutMs,\n };\n }\n\n if (request.type === \"set_config_option\") {\n if (\n typeof request.configId !== \"string\" ||\n request.configId.trim().length === 0 ||\n typeof request.value !== \"string\" ||\n request.value.trim().length === 0\n ) {\n return null;\n }\n return {\n type: \"set_config_option\",\n requestId: request.requestId,\n ownerGeneration,\n configId: request.configId,\n value: request.value,\n timeoutMs,\n };\n }\n\n return null;\n}\n\nfunction parseSessionSendResult(raw: unknown): SessionSendResult | null {\n const result = asRecord(raw);\n if (!result) {\n return null;\n }\n\n if (\n typeof result.stopReason !== \"string\" ||\n typeof result.sessionId !== \"string\" ||\n typeof result.resumed !== \"boolean\"\n ) {\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 const statsValid =\n typeof permissionStats.requested === \"number\" &&\n typeof permissionStats.approved === \"number\" &&\n typeof permissionStats.denied === \"number\" &&\n typeof permissionStats.cancelled === \"number\";\n if (!statsValid) {\n return null;\n }\n\n const recordValid =\n typeof record.acpxRecordId === \"string\" &&\n typeof record.acpSessionId === \"string\" &&\n typeof record.agentCommand === \"string\" &&\n typeof record.cwd === \"string\" &&\n typeof record.createdAt === \"string\" &&\n typeof record.lastUsedAt === \"string\" &&\n Array.isArray(record.messages) &&\n typeof record.updated_at === \"string\" &&\n typeof record.lastSeq === \"number\" &&\n Number.isInteger(record.lastSeq) &&\n !!record.eventLog &&\n typeof record.eventLog === \"object\";\n if (!recordValid) {\n return null;\n }\n\n return result as SessionSendResult;\n}\n\nexport function parseQueueOwnerMessage(raw: unknown): QueueOwnerMessage | null {\n const message = asRecord(raw);\n if (!message || typeof message.type !== \"string\") {\n return null;\n }\n\n if (typeof message.requestId !== \"string\") {\n return null;\n }\n const ownerGeneration = parseOwnerGeneration(message.ownerGeneration);\n if (ownerGeneration === null) {\n return null;\n }\n\n if (message.type === \"accepted\") {\n return {\n type: \"accepted\",\n requestId: message.requestId,\n ownerGeneration,\n };\n }\n\n if (message.type === \"event\") {\n if (!isAcpJsonRpcMessage(message.message)) {\n return null;\n }\n\n return {\n type: \"event\",\n requestId: message.requestId,\n ownerGeneration,\n message: message.message,\n };\n }\n\n if (message.type === \"result\") {\n const parsedResult = parseSessionSendResult(message.result);\n if (!parsedResult) {\n return null;\n }\n return {\n type: \"result\",\n requestId: message.requestId,\n ownerGeneration,\n result: parsedResult,\n };\n }\n\n if (message.type === \"cancel_result\") {\n if (typeof message.cancelled !== \"boolean\") {\n return null;\n }\n return {\n type: \"cancel_result\",\n requestId: message.requestId,\n ownerGeneration,\n cancelled: message.cancelled,\n };\n }\n\n if (message.type === \"set_mode_result\") {\n if (typeof message.modeId !== \"string\") {\n return null;\n }\n return {\n type: \"set_mode_result\",\n requestId: message.requestId,\n ownerGeneration,\n modeId: message.modeId,\n };\n }\n\n if (message.type === \"set_model_result\") {\n if (typeof message.modelId !== \"string\") {\n return null;\n }\n return {\n type: \"set_model_result\",\n requestId: message.requestId,\n ownerGeneration,\n modelId: message.modelId,\n };\n }\n\n if (message.type === \"set_config_option_result\") {\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 requestId: message.requestId,\n ownerGeneration,\n response: response as SetSessionConfigOptionResponse,\n };\n }\n\n if (message.type === \"error\") {\n if (\n typeof message.message !== \"string\" ||\n !isOutputErrorCode(message.code) ||\n !isOutputErrorOrigin(message.origin)\n ) {\n return null;\n }\n\n const detailCode =\n typeof message.detailCode === \"string\" && message.detailCode.trim().length > 0\n ? message.detailCode\n : undefined;\n const retryable = typeof message.retryable === \"boolean\" ? message.retryable : undefined;\n const acp = parseAcpError(message.acp);\n const outputAlreadyEmitted =\n typeof message.outputAlreadyEmitted === \"boolean\" ? message.outputAlreadyEmitted : undefined;\n\n return {\n type: \"error\",\n requestId: message.requestId,\n ownerGeneration,\n code: message.code,\n detailCode,\n origin: message.origin,\n message: message.message,\n retryable,\n acp,\n ...(outputAlreadyEmitted === undefined ? {} : { outputAlreadyEmitted }),\n };\n }\n\n return null;\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 NonInteractivePermissionPolicy,\n PermissionMode,\n PromptInput,\n SessionResumePolicy,\n} from \"../../types.js\";\nimport {\n parseQueueRequest,\n type QueueOwnerErrorMessage,\n type QueueOwnerMessage,\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 timeoutMs?: number;\n suppressSdkConsoleErrors?: boolean;\n waitForCompletion: boolean;\n enqueuedAt: number;\n send: (message: QueueOwnerMessage) => void;\n close: () => void;\n};\n\nexport type QueueOwnerControlHandlers = {\n cancelPrompt: () => 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 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 fail = (requestId: string, message: string, detailCode: string): void => {\n writeQueueMessage(socket, {\n ...makeQueueOwnerError(requestId, message, detailCode, {\n retryable: false,\n }),\n ownerGeneration: this.ownerGeneration,\n });\n socket.end();\n };\n\n const processLine = (line: string): void => {\n if (handled) {\n return;\n }\n handled = true;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n fail(\"unknown\", \"Invalid queue request payload\", \"QUEUE_REQUEST_PAYLOAD_INVALID_JSON\");\n return;\n }\n\n const request = parseQueueRequest(parsed);\n if (!request) {\n fail(\"unknown\", \"Invalid queue request\", \"QUEUE_REQUEST_INVALID\");\n return;\n }\n\n if (\n request.ownerGeneration !== undefined &&\n this.ownerGeneration !== undefined &&\n request.ownerGeneration !== this.ownerGeneration\n ) {\n fail(\n request.requestId,\n \"Queue request targeted a stale queue owner generation\",\n \"QUEUE_OWNER_GENERATION_MISMATCH\",\n );\n return;\n }\n\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;\n }\n\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;\n }\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;\n }\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;\n }\n\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 timeoutMs: request.timeoutMs,\n suppressSdkConsoleErrors: request.suppressSdkConsoleErrors,\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 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 NonInteractivePermissionPolicy,\n OutputErrorEmissionPolicy,\n OutputFormatter,\n PermissionMode,\n PromptInput,\n SessionResumePolicy,\n SessionEnqueueResult,\n SessionSendOutcome,\n} from \"../../types.js\";\nimport { probeQueueOwnerHealth, type QueueOwnerHealth } from \"./ipc-health.js\";\nimport { QUEUE_CONNECT_RETRY_MS, 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 QueueOwnerCancelResultMessage,\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 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 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 outputFormatter: OutputFormatter;\n errorEmissionPolicy?: OutputErrorEmissionPolicy;\n timeoutMs?: number;\n suppressSdkConsoleErrors?: boolean;\n waitForCompletion: boolean;\n verbose?: boolean;\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 timeoutMs: options.timeoutMs,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n waitForCompletion: options.waitForCompletion,\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, { state, resolve, reject }) => {\n if (message.type === \"error\") {\n options.outputFormatter.setContext({\n sessionId: options.sessionId,\n });\n\n const queueErrorAlreadyEmitted =\n options.errorEmissionPolicy?.queueErrorAlreadyEmitted ?? true;\n const outputAlreadyEmitted = message.outputAlreadyEmitted === true;\n const shouldEmitInFormatter = !outputAlreadyEmitted || !queueErrorAlreadyEmitted;\n if (shouldEmitInFormatter) {\n options.outputFormatter.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 options.outputFormatter.flush();\n }\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 ...(queueErrorAlreadyEmitted ? { outputAlreadyEmitted: true } : {}),\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 (message.type === \"event\") {\n options.outputFormatter.onAcpMessage(message.message);\n return;\n }\n\n if (message.type === \"result\") {\n options.outputFormatter.flush();\n resolve(message.result);\n return;\n }\n\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 },\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\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 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"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region src/acp
|
|
1
|
+
//#region src/acp/jsonrpc.ts
|
|
2
2
|
function asRecord(value) {
|
|
3
3
|
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
|
|
4
4
|
return value;
|
|
@@ -65,4 +65,4 @@ function parseJsonRpcErrorMessage(message) {
|
|
|
65
65
|
//#endregion
|
|
66
66
|
export { parsePromptStopReason as a, parseJsonRpcErrorMessage as i, isAcpJsonRpcMessage as n, isSessionUpdateNotification as r, extractSessionUpdateNotification as t };
|
|
67
67
|
|
|
68
|
-
//# sourceMappingURL=
|
|
68
|
+
//# sourceMappingURL=jsonrpc-DSxh2w5R.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonrpc-DSxh2w5R.js","names":[],"sources":["../src/acp/jsonrpc.ts"],"sourcesContent":["import type { AnyMessage, SessionNotification } from \"@agentclientprotocol/sdk\";\n\ntype JsonRpcId = string | number | null;\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction hasValidId(value: unknown): value is JsonRpcId {\n return (\n value === null ||\n typeof value === \"string\" ||\n (typeof value === \"number\" && Number.isFinite(value))\n );\n}\n\nfunction isErrorObject(value: unknown): value is { code: number; message: string } {\n const record = asRecord(value);\n return (\n !!record &&\n typeof record.code === \"number\" &&\n Number.isFinite(record.code) &&\n typeof record.message === \"string\"\n );\n}\n\nfunction hasResultOrError(value: Record<string, unknown>): boolean {\n const hasResult = Object.hasOwn(value, \"result\");\n const hasError = Object.hasOwn(value, \"error\");\n if (hasResult && hasError) {\n return false;\n }\n if (!hasResult && !hasError) {\n return false;\n }\n if (hasError && !isErrorObject(value.error)) {\n return false;\n }\n return true;\n}\n\nexport function isAcpJsonRpcMessage(value: unknown): value is AnyMessage {\n const record = asRecord(value);\n if (!record || record.jsonrpc !== \"2.0\") {\n return false;\n }\n\n const hasMethod = typeof record.method === \"string\" && record.method.length > 0;\n const hasId = Object.hasOwn(record, \"id\");\n\n if (hasMethod && !hasId) {\n // Notification\n return true;\n }\n\n if (hasMethod && hasId) {\n // Request\n return hasValidId(record.id);\n }\n\n if (!hasMethod && hasId) {\n // Response\n if (!hasValidId(record.id)) {\n return false;\n }\n return hasResultOrError(record);\n }\n\n return false;\n}\n\nexport function isJsonRpcNotification(message: AnyMessage): boolean {\n return (\n Object.hasOwn(message, \"method\") &&\n typeof (message as { method?: unknown }).method === \"string\" &&\n !Object.hasOwn(message, \"id\")\n );\n}\n\nexport function isSessionUpdateNotification(message: AnyMessage): boolean {\n return (\n isJsonRpcNotification(message) && (message as { method?: unknown }).method === \"session/update\"\n );\n}\n\nexport function extractSessionUpdateNotification(\n message: AnyMessage,\n): SessionNotification | undefined {\n if (!isSessionUpdateNotification(message)) {\n return undefined;\n }\n\n const params = asRecord((message as { params?: unknown }).params);\n if (!params) {\n return undefined;\n }\n\n const sessionId = typeof params.sessionId === \"string\" ? params.sessionId : null;\n if (!sessionId) {\n return undefined;\n }\n\n const update = asRecord(params.update);\n if (!update || typeof update.sessionUpdate !== \"string\") {\n return undefined;\n }\n\n return {\n sessionId,\n update: update as SessionNotification[\"update\"],\n };\n}\n\nexport function parsePromptStopReason(message: AnyMessage): string | undefined {\n if (!Object.hasOwn(message, \"id\") || !Object.hasOwn(message, \"result\")) {\n return undefined;\n }\n const record = asRecord((message as { result?: unknown }).result);\n if (!record) {\n return undefined;\n }\n return typeof record.stopReason === \"string\" ? record.stopReason : undefined;\n}\n\nexport function parseJsonRpcErrorMessage(message: AnyMessage): string | undefined {\n if (!Object.hasOwn(message, \"error\")) {\n return undefined;\n }\n const errorRecord = asRecord((message as { error?: unknown }).error);\n if (!errorRecord || typeof errorRecord.message !== \"string\") {\n return undefined;\n }\n return errorRecord.message;\n}\n"],"mappings":";AAIA,SAAS,SAAS,OAAgD;AAChE,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D,QAAO;AAET,QAAO;;AAGT,SAAS,WAAW,OAAoC;AACtD,QACE,UAAU,QACV,OAAO,UAAU,YAChB,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM;;AAIxD,SAAS,cAAc,OAA4D;CACjF,MAAM,SAAS,SAAS,MAAM;AAC9B,QACE,CAAC,CAAC,UACF,OAAO,OAAO,SAAS,YACvB,OAAO,SAAS,OAAO,KAAK,IAC5B,OAAO,OAAO,YAAY;;AAI9B,SAAS,iBAAiB,OAAyC;CACjE,MAAM,YAAY,OAAO,OAAO,OAAO,SAAS;CAChD,MAAM,WAAW,OAAO,OAAO,OAAO,QAAQ;AAC9C,KAAI,aAAa,SACf,QAAO;AAET,KAAI,CAAC,aAAa,CAAC,SACjB,QAAO;AAET,KAAI,YAAY,CAAC,cAAc,MAAM,MAAM,CACzC,QAAO;AAET,QAAO;;AAGT,SAAgB,oBAAoB,OAAqC;CACvE,MAAM,SAAS,SAAS,MAAM;AAC9B,KAAI,CAAC,UAAU,OAAO,YAAY,MAChC,QAAO;CAGT,MAAM,YAAY,OAAO,OAAO,WAAW,YAAY,OAAO,OAAO,SAAS;CAC9E,MAAM,QAAQ,OAAO,OAAO,QAAQ,KAAK;AAEzC,KAAI,aAAa,CAAC,MAEhB,QAAO;AAGT,KAAI,aAAa,MAEf,QAAO,WAAW,OAAO,GAAG;AAG9B,KAAI,CAAC,aAAa,OAAO;AAEvB,MAAI,CAAC,WAAW,OAAO,GAAG,CACxB,QAAO;AAET,SAAO,iBAAiB,OAAO;;AAGjC,QAAO;;AAGT,SAAgB,sBAAsB,SAA8B;AAClE,QACE,OAAO,OAAO,SAAS,SAAS,IAChC,OAAQ,QAAiC,WAAW,YACpD,CAAC,OAAO,OAAO,SAAS,KAAK;;AAIjC,SAAgB,4BAA4B,SAA8B;AACxE,QACE,sBAAsB,QAAQ,IAAK,QAAiC,WAAW;;AAInF,SAAgB,iCACd,SACiC;AACjC,KAAI,CAAC,4BAA4B,QAAQ,CACvC;CAGF,MAAM,SAAS,SAAU,QAAiC,OAAO;AACjE,KAAI,CAAC,OACH;CAGF,MAAM,YAAY,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY;AAC5E,KAAI,CAAC,UACH;CAGF,MAAM,SAAS,SAAS,OAAO,OAAO;AACtC,KAAI,CAAC,UAAU,OAAO,OAAO,kBAAkB,SAC7C;AAGF,QAAO;EACL;EACQ;EACT;;AAGH,SAAgB,sBAAsB,SAAyC;AAC7E,KAAI,CAAC,OAAO,OAAO,SAAS,KAAK,IAAI,CAAC,OAAO,OAAO,SAAS,SAAS,CACpE;CAEF,MAAM,SAAS,SAAU,QAAiC,OAAO;AACjE,KAAI,CAAC,OACH;AAEF,QAAO,OAAO,OAAO,eAAe,WAAW,OAAO,aAAa,KAAA;;AAGrE,SAAgB,yBAAyB,SAAyC;AAChF,KAAI,CAAC,OAAO,OAAO,SAAS,QAAQ,CAClC;CAEF,MAAM,cAAc,SAAU,QAAgC,MAAM;AACpE,KAAI,CAAC,eAAe,OAAO,YAAY,YAAY,SACjD;AAEF,QAAO,YAAY"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-CiIaOW0V.js";
|
|
2
|
-
import { a as parsePromptStopReason, i as parseJsonRpcErrorMessage, t as extractSessionUpdateNotification } from "./
|
|
3
|
-
//#region src/jsonrpc-error.ts
|
|
2
|
+
import { a as parsePromptStopReason, i as parseJsonRpcErrorMessage, t as extractSessionUpdateNotification } from "./jsonrpc-DSxh2w5R.js";
|
|
3
|
+
//#region src/acp/jsonrpc-error.ts
|
|
4
4
|
const OUTPUT_ERROR_JSONRPC_CODES = {
|
|
5
5
|
NO_SESSION: -32002,
|
|
6
6
|
TIMEOUT: -32070,
|
|
@@ -45,7 +45,7 @@ function buildJsonRpcErrorResponse(params) {
|
|
|
45
45
|
};
|
|
46
46
|
}
|
|
47
47
|
//#endregion
|
|
48
|
-
//#region src/read-
|
|
48
|
+
//#region src/cli/output/read-suppression.ts
|
|
49
49
|
const SUPPRESSED_READ_OUTPUT = "[read output suppressed]";
|
|
50
50
|
function inferToolKindFromTitle(title) {
|
|
51
51
|
const normalized = title?.trim().toLowerCase();
|
|
@@ -58,7 +58,7 @@ function isReadLikeTool(tool) {
|
|
|
58
58
|
return tool.kind?.trim().toLowerCase() === "read" || inferToolKindFromTitle(tool.title) === "read";
|
|
59
59
|
}
|
|
60
60
|
//#endregion
|
|
61
|
-
//#region src/output
|
|
61
|
+
//#region src/cli/output/json-formatter.ts
|
|
62
62
|
const DEFAULT_JSON_SESSION_ID = "unknown";
|
|
63
63
|
function asRecord$1(value) {
|
|
64
64
|
if (!value || typeof value !== "object" || Array.isArray(value)) return;
|
|
@@ -187,7 +187,7 @@ function createJsonOutputFormatter(stdout, suppressReads = false, context) {
|
|
|
187
187
|
return new JsonOutputFormatter(stdout, suppressReads, context);
|
|
188
188
|
}
|
|
189
189
|
//#endregion
|
|
190
|
-
//#region src/output.ts
|
|
190
|
+
//#region src/cli/output/output.ts
|
|
191
191
|
var output_exports = /* @__PURE__ */ __exportAll({ createOutputFormatter: () => createOutputFormatter });
|
|
192
192
|
const MAX_THOUGHT_CHARS = 900;
|
|
193
193
|
const MAX_INLINE_CHARS = 220;
|
|
@@ -675,4 +675,4 @@ function createOutputFormatter(format, options = {}) {
|
|
|
675
675
|
//#endregion
|
|
676
676
|
export { output_exports as n, createOutputFormatter as t };
|
|
677
677
|
|
|
678
|
-
//# sourceMappingURL=output-
|
|
678
|
+
//# sourceMappingURL=output-C4QhjpM6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-C4QhjpM6.js","names":["asRecord"],"sources":["../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 { 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 buildErrorObject(params: BuildJsonRpcErrorParams): JsonRpcErrorObject {\n if (hasValidAcpError(params.acp)) {\n return {\n code: params.acp.code,\n message: params.acp.message,\n ...(params.acp.data !== undefined ? { data: params.acp.data } : {}),\n };\n }\n\n const data = buildFallbackData(params);\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 (\n head.includes(\"read\") ||\n head.includes(\"cat\") ||\n head.includes(\"open\") ||\n head.includes(\"view\")\n ) {\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: {\n ...update,\n rawOutput:\n Object.prototype.hasOwnProperty.call(update, \"rawOutput\") &&\n update.rawOutput !== undefined\n ? { content: SUPPRESSED_READ_OUTPUT }\n : update.rawOutput,\n content:\n Object.prototype.hasOwnProperty.call(update, \"content\") && update.content !== undefined\n ? sanitizeToolContent(update.content)\n : update.content,\n },\n },\n };\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 root = asRecord(message);\n if (root?.method !== \"session/update\") {\n return message;\n }\n\n const params = asRecord(root.params);\n const update = asRecord(params?.update);\n if (!params || !update) {\n return message;\n }\n\n const sessionUpdate = update.sessionUpdate;\n if (sessionUpdate !== \"tool_call\" && sessionUpdate !== \"tool_call_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 previous = this.toolStateById.get(toolCallId) ?? {};\n const current = {\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 this.toolStateById.set(toolCallId, current);\n\n if (!isReadLikeTool(current)) {\n return message;\n }\n\n return sanitizeToolMessage(message);\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 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} 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 OutputFormatterOptions = {\n stdout?: 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 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 summarizeToolInput(rawInput: unknown): string | undefined {\n if (rawInput == null) {\n return undefined;\n }\n\n if (\n typeof rawInput === \"string\" ||\n typeof rawInput === \"number\" ||\n typeof rawInput === \"boolean\"\n ) {\n return toInline(String(rawInput));\n }\n\n const record = asRecord(rawInput);\n if (record) {\n const command = readFirstString(record, [\"command\", \"cmd\", \"program\"]);\n const args = readFirstStringArray(record, [\"args\", \"arguments\"]);\n if (command) {\n const invocation = [command, ...(args ?? [])].join(\" \");\n return toInline(invocation);\n }\n\n const location = readFirstString(record, [\n \"path\",\n \"file\",\n \"filePath\",\n \"filepath\",\n \"target\",\n \"uri\",\n \"url\",\n ]);\n if (location) {\n return toInline(location);\n }\n\n const query = readFirstString(record, [\"query\", \"pattern\", \"text\", \"search\"]);\n if (query) {\n return toInline(query);\n }\n }\n\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 path = location.path?.trim();\n if (!path) {\n continue;\n }\n\n const line =\n typeof location.line === \"number\" && Number.isFinite(location.line)\n ? `:${Math.max(1, Math.trunc(location.line))}`\n : \"\";\n unique.add(`${path}${line}`);\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 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 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 case \"image\":\n return `[image] ${content.mimeType}`;\n case \"audio\":\n return `[audio] ${content.mimeType}`;\n default:\n return undefined;\n }\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 if (entry.type === \"content\") {\n const text = textFromContentBlock(entry.content);\n if (text && text.trim()) {\n fragments.push(text.trimEnd());\n }\n continue;\n }\n\n if (entry.type === \"diff\") {\n fragments.push(summarizeDiff(entry.path, entry.oldText, entry.newText));\n continue;\n }\n\n if (entry.type === \"terminal\") {\n fragments.push(`[terminal] ${entry.terminalId}`);\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 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 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 if (depth >= 4) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n const parts = value\n .map((entry) => extractOutputText(entry, depth + 1, seen))\n .filter((entry): entry is string => Boolean(entry));\n if (parts.length === 0) {\n return undefined;\n }\n return dedupeStrings(parts).join(\"\\n\");\n }\n\n const record = asRecord(value);\n if (!record) {\n return undefined;\n }\n if (seen.has(record)) {\n return undefined;\n }\n seen.add(record);\n\n const preferred: string[] = [];\n for (const key of OUTPUT_PRIORITY_KEYS) {\n if (!(key in record)) {\n continue;\n }\n const extracted = extractOutputText(record[key], depth + 1, seen);\n if (extracted) {\n preferred.push(extracted);\n }\n }\n\n const uniquePreferred = dedupeStrings(preferred);\n if (uniquePreferred.length > 0) {\n return uniquePreferred.join(\"\\n\");\n }\n\n const json = safeJson(record, 2);\n if (!json || json === \"{}\") {\n return undefined;\n }\n return 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\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.beginSection(\"plan\");\n this.writeLine(this.bold(\"[plan]\"));\n for (const entry of update.entries) {\n this.writeLine(` - [${entry.status}] ${entry.content}`);\n }\n return;\n }\n default:\n return;\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: {\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.flushThoughtBuffer();\n this.beginSection(\"done\");\n this.writeLine(this.formatAnsi(`[error] ${params.code}: ${params.message}`, \"31\"));\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 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 if (typeof update.title === \"string\" && update.title.trim().length > 0) {\n state.title = update.title;\n }\n\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 chunks: string[] = [];\n private flushed = false;\n\n constructor(stdout: WritableLike) {\n this.stdout = stdout;\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 }\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 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\nexport function createOutputFormatter(\n format: OutputFormat,\n options: OutputFormatterOptions = {},\n): OutputFormatter {\n const stdout = options.stdout ?? process.stdout;\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);\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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"}
|