acpx 0.5.0 → 0.5.2
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-CLRrs6eQ.js → cli-ChWsO-bb.js} +4 -4
- package/dist/{cli-CLRrs6eQ.js.map → cli-ChWsO-bb.js.map} +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +11 -12
- package/dist/cli.js.map +1 -1
- package/dist/{client-DLTWuu4w.d.ts → client-D-4_aZf2.d.ts} +7 -2
- package/dist/client-D-4_aZf2.d.ts.map +1 -0
- package/dist/{flags-BmubjvOw.js → flags-ceSqz2T6.js} +4 -4
- package/dist/{flags-BmubjvOw.js.map → flags-ceSqz2T6.js.map} +1 -1
- package/dist/{flows-CR7xCmkR.js → flows-_KmnuUXd.js} +5 -5
- package/dist/{flows-CR7xCmkR.js.map → flows-_KmnuUXd.js.map} +1 -1
- package/dist/flows.d.ts +1 -1
- package/dist/flows.js +1 -1
- package/dist/{ipc-DN6M4Ui9.js → ipc-BM335WFg.js} +3 -3
- package/dist/{ipc-DN6M4Ui9.js.map → ipc-BM335WFg.js.map} +1 -1
- package/dist/{jsonrpc-M3y-qzy8.js → jsonrpc-DSxh2w5R.js} +1 -1
- package/dist/{jsonrpc-M3y-qzy8.js.map → jsonrpc-DSxh2w5R.js.map} +1 -1
- package/dist/{output-Di0M9Et8.js → output-C4QhjpM6.js} +2 -2
- package/dist/{output-Di0M9Et8.js.map → output-C4QhjpM6.js.map} +1 -1
- package/dist/{perf-metrics-D9QC81lB.js → perf-metrics-D0um6IR6.js} +22 -2
- package/dist/perf-metrics-D0um6IR6.js.map +1 -0
- package/dist/{prompt-turn-Bt8T3SRR.js → prompt-turn-CXMtXBl-.js} +266 -28
- package/dist/prompt-turn-CXMtXBl-.js.map +1 -0
- package/dist/{render-BL5ynRkN.js → render-Br-kVPK_.js} +3 -3
- package/dist/{render-BL5ynRkN.js.map → render-Br-kVPK_.js.map} +1 -1
- package/dist/runtime.d.ts +9 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +45 -5
- package/dist/runtime.js.map +1 -1
- package/dist/{session-BbN0SBgf.js → session-BtwAKtJ3.js} +5 -5
- package/dist/{session-BbN0SBgf.js.map → session-BtwAKtJ3.js.map} +1 -1
- package/dist/{types-DXxLBQc3.d.ts → types-yxf-gcOE.d.ts} +2 -1
- package/dist/{types-DXxLBQc3.d.ts.map → types-yxf-gcOE.d.ts.map} +1 -1
- package/package.json +1 -1
- package/dist/agent-registry-DGw0-3Tc.js +0 -54
- package/dist/agent-registry-DGw0-3Tc.js.map +0 -1
- package/dist/client-DLTWuu4w.d.ts.map +0 -1
- package/dist/perf-metrics-D9QC81lB.js.map +0 -1
- package/dist/prompt-turn-Bt8T3SRR.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-Di0M9Et8.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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"}
|
|
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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"}
|
|
@@ -32,6 +32,26 @@ var AgentSpawnError = class extends AcpxOperationalError {
|
|
|
32
32
|
this.agentCommand = agentCommand;
|
|
33
33
|
}
|
|
34
34
|
};
|
|
35
|
+
var AgentStartupError = class extends AcpxOperationalError {
|
|
36
|
+
agentCommand;
|
|
37
|
+
exitCode;
|
|
38
|
+
signal;
|
|
39
|
+
stderrSummary;
|
|
40
|
+
constructor(params) {
|
|
41
|
+
const exitSummary = `exit=${params.exitCode ?? "null"}, signal=${params.signal ?? "null"}`;
|
|
42
|
+
const stderrSuffix = typeof params.stderrSummary === "string" && params.stderrSummary.trim().length > 0 ? `: ${params.stderrSummary.trim()}` : "";
|
|
43
|
+
super(`ACP agent exited before initialize completed (${exitSummary})${stderrSuffix}`, {
|
|
44
|
+
cause: params.cause instanceof Error ? params.cause : void 0,
|
|
45
|
+
outputCode: "RUNTIME",
|
|
46
|
+
detailCode: "AGENT_STARTUP_FAILED",
|
|
47
|
+
origin: "acp"
|
|
48
|
+
});
|
|
49
|
+
this.agentCommand = params.agentCommand;
|
|
50
|
+
this.exitCode = params.exitCode;
|
|
51
|
+
this.signal = params.signal;
|
|
52
|
+
this.stderrSummary = params.stderrSummary?.trim() || void 0;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
35
55
|
var AgentDisconnectedError = class extends AcpxOperationalError {
|
|
36
56
|
reason;
|
|
37
57
|
exitCode;
|
|
@@ -563,6 +583,6 @@ function formatPerfMetric(name, durationMsValue) {
|
|
|
563
583
|
return `${name}=${roundMetric(durationMsValue)}ms`;
|
|
564
584
|
}
|
|
565
585
|
//#endregion
|
|
566
|
-
export { PERMISSION_MODES as A,
|
|
586
|
+
export { PERMISSION_MODES as A, PermissionPromptUnavailableError as B, isAcpResourceNotFoundError as C, OUTPUT_ERROR_CODES as D, NON_INTERACTIVE_PERMISSION_POLICIES as E, AuthPolicyError as F, SessionNotFoundError as G, QueueProtocolError as H, ClaudeAcpSessionCreateTimeoutError as I, SessionResolutionError as K, CopilotAcpUnsupportedError as L, AgentDisconnectedError as M, AgentSpawnError as N, OUTPUT_ERROR_ORIGINS as O, AgentStartupError as P, GeminiAcpStartupTimeoutError as R, extractAcpError as S, EXIT_CODES as T, SessionModeReplayError as U, QueueConnectionError as V, SessionModelReplayError as W, exitCodeForOutputErrorCode as _, recordPerfDuration as a, isRetryablePromptError as b, startPerfTimer as c, PromptInputValidationError as d, isPromptInput as f, textPrompt as g, promptToDisplayText as h, measurePerf as i, SESSION_RECORD_SCHEMA as j, OUTPUT_FORMATS as k, extractRuntimeSessionId as l, parsePromptSource as m, getPerfMetricsSnapshot as n, resetPerfMetrics as o, mergePromptSourceWithText as p, SessionResumeRequiredError as q, incrementPerfCounter as r, setPerfGauge as s, formatPerfMetric as t, normalizeRuntimeSessionId as u, formatErrorMessage as v, AUTH_POLICIES as w, normalizeOutputError as x, isAcpQueryClosedBeforeResponseError as y, PermissionDeniedError as z };
|
|
567
587
|
|
|
568
|
-
//# sourceMappingURL=perf-metrics-
|
|
588
|
+
//# sourceMappingURL=perf-metrics-D0um6IR6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf-metrics-D0um6IR6.js","names":["asRecord","asRecord"],"sources":["../src/errors.ts","../src/types.ts","../src/acp/error-shapes.ts","../src/acp/error-normalization.ts","../src/prompt-content.ts","../src/acp/agent-session-id.ts","../src/session/runtime-session-id.ts","../src/perf-metrics.ts"],"sourcesContent":["import type { OutputErrorAcpPayload, OutputErrorCode, OutputErrorOrigin } from \"./types.js\";\n\ntype AcpxErrorOptions = ErrorOptions & {\n outputCode?: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n outputAlreadyEmitted?: boolean;\n};\n\nexport class AcpxOperationalError extends Error {\n readonly outputCode?: OutputErrorCode;\n readonly detailCode?: string;\n readonly origin?: OutputErrorOrigin;\n readonly retryable?: boolean;\n readonly acp?: OutputErrorAcpPayload;\n readonly outputAlreadyEmitted?: boolean;\n\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n this.outputCode = options?.outputCode;\n this.detailCode = options?.detailCode;\n this.origin = options?.origin;\n this.retryable = options?.retryable;\n this.acp = options?.acp;\n this.outputAlreadyEmitted = options?.outputAlreadyEmitted;\n }\n}\n\nexport class SessionNotFoundError extends AcpxOperationalError {\n readonly sessionId: string;\n\n constructor(sessionId: string) {\n super(`Session not found: ${sessionId}`);\n this.sessionId = sessionId;\n }\n}\n\nexport class SessionResolutionError extends AcpxOperationalError {}\n\nexport class AgentSpawnError extends AcpxOperationalError {\n readonly agentCommand: string;\n\n constructor(agentCommand: string, cause?: unknown) {\n super(`Failed to spawn agent command: ${agentCommand}`, {\n cause: cause instanceof Error ? cause : undefined,\n });\n this.agentCommand = agentCommand;\n }\n}\n\nexport class AgentStartupError extends AcpxOperationalError {\n readonly agentCommand: string;\n readonly exitCode: number | null;\n readonly signal: NodeJS.Signals | null;\n readonly stderrSummary?: string;\n\n constructor(params: {\n agentCommand: string;\n exitCode: number | null;\n signal: NodeJS.Signals | null;\n stderrSummary?: string;\n cause?: unknown;\n }) {\n const exitSummary = `exit=${params.exitCode ?? \"null\"}, signal=${params.signal ?? \"null\"}`;\n const stderrSuffix =\n typeof params.stderrSummary === \"string\" && params.stderrSummary.trim().length > 0\n ? `: ${params.stderrSummary.trim()}`\n : \"\";\n super(`ACP agent exited before initialize completed (${exitSummary})${stderrSuffix}`, {\n cause: params.cause instanceof Error ? params.cause : undefined,\n outputCode: \"RUNTIME\",\n detailCode: \"AGENT_STARTUP_FAILED\",\n origin: \"acp\",\n });\n this.agentCommand = params.agentCommand;\n this.exitCode = params.exitCode;\n this.signal = params.signal;\n this.stderrSummary = params.stderrSummary?.trim() || undefined;\n }\n}\n\nexport class AgentDisconnectedError extends AcpxOperationalError {\n readonly reason: string;\n readonly exitCode: number | null;\n readonly signal: NodeJS.Signals | null;\n\n constructor(\n reason: string,\n exitCode: number | null,\n signal: NodeJS.Signals | null,\n options?: AcpxErrorOptions,\n ) {\n super(\n `ACP agent disconnected during request (${reason}, exit=${exitCode ?? \"null\"}, signal=${signal ?? \"null\"})`,\n {\n outputCode: \"RUNTIME\",\n detailCode: \"AGENT_DISCONNECTED\",\n origin: \"acp\",\n ...options,\n },\n );\n this.reason = reason;\n this.exitCode = exitCode;\n this.signal = signal;\n }\n}\n\nexport class SessionResumeRequiredError extends AcpxOperationalError {\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, {\n outputCode: \"RUNTIME\",\n detailCode: \"SESSION_RESUME_REQUIRED\",\n origin: \"acp\",\n retryable: true,\n ...options,\n });\n }\n}\n\nexport class GeminiAcpStartupTimeoutError extends AcpxOperationalError {\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, {\n outputCode: \"TIMEOUT\",\n detailCode: \"GEMINI_ACP_STARTUP_TIMEOUT\",\n origin: \"acp\",\n ...options,\n });\n }\n}\n\nexport class SessionModeReplayError extends AcpxOperationalError {\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, {\n outputCode: \"RUNTIME\",\n detailCode: \"SESSION_MODE_REPLAY_FAILED\",\n origin: \"acp\",\n ...options,\n });\n }\n}\n\nexport class SessionModelReplayError extends AcpxOperationalError {\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, {\n outputCode: \"RUNTIME\",\n detailCode: \"SESSION_MODEL_REPLAY_FAILED\",\n origin: \"acp\",\n ...options,\n });\n }\n}\n\nexport class ClaudeAcpSessionCreateTimeoutError extends AcpxOperationalError {\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, {\n outputCode: \"TIMEOUT\",\n detailCode: \"CLAUDE_ACP_SESSION_CREATE_TIMEOUT\",\n origin: \"acp\",\n ...options,\n });\n }\n}\n\nexport class CopilotAcpUnsupportedError extends AcpxOperationalError {\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, {\n outputCode: \"RUNTIME\",\n detailCode: \"COPILOT_ACP_UNSUPPORTED\",\n origin: \"acp\",\n ...options,\n });\n }\n}\n\nexport class AuthPolicyError extends AcpxOperationalError {\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, {\n outputCode: \"RUNTIME\",\n detailCode: \"AUTH_REQUIRED\",\n origin: \"acp\",\n ...options,\n });\n }\n}\n\nexport class QueueConnectionError extends AcpxOperationalError {}\n\nexport class QueueProtocolError extends AcpxOperationalError {}\n\nexport class PermissionDeniedError extends AcpxOperationalError {}\n\nexport class PermissionPromptUnavailableError extends AcpxOperationalError {\n constructor() {\n super(\"Permission prompt unavailable in non-interactive mode\");\n }\n}\n","import type {\n AgentCapabilities,\n AnyMessage,\n McpServer,\n SessionNotification,\n SessionConfigOption,\n SetSessionConfigOptionResponse,\n StopReason,\n} from \"@agentclientprotocol/sdk\";\nexport type { McpServer, SessionNotification } from \"@agentclientprotocol/sdk\";\nimport type { PromptInput } from \"./prompt-content.js\";\n\nexport const EXIT_CODES = {\n SUCCESS: 0,\n ERROR: 1,\n USAGE: 2,\n TIMEOUT: 3,\n NO_SESSION: 4,\n PERMISSION_DENIED: 5,\n INTERRUPTED: 130,\n} as const;\n\nexport type ExitCode = (typeof EXIT_CODES)[keyof typeof EXIT_CODES];\n\nexport const OUTPUT_FORMATS = [\"text\", \"json\", \"quiet\"] as const;\nexport type OutputFormat = (typeof OUTPUT_FORMATS)[number];\n\nexport const PERMISSION_MODES = [\"approve-all\", \"approve-reads\", \"deny-all\"] as const;\nexport type PermissionMode = (typeof PERMISSION_MODES)[number];\n\nexport const AUTH_POLICIES = [\"skip\", \"fail\"] as const;\nexport type AuthPolicy = (typeof AUTH_POLICIES)[number];\n\nexport const NON_INTERACTIVE_PERMISSION_POLICIES = [\"deny\", \"fail\"] as const;\nexport type NonInteractivePermissionPolicy = (typeof NON_INTERACTIVE_PERMISSION_POLICIES)[number];\n\nexport const SESSION_RESUME_POLICIES = [\"allow-new\", \"same-session-only\"] as const;\nexport type SessionResumePolicy = (typeof SESSION_RESUME_POLICIES)[number];\n\nexport const OUTPUT_STREAMS = [\"prompt\", \"control\"] as const;\nexport type OutputStream = (typeof OUTPUT_STREAMS)[number];\nexport type AcpJsonRpcMessage = AnyMessage;\nexport type AcpMessageDirection = \"outbound\" | \"inbound\";\n\nexport const OUTPUT_ERROR_CODES = [\n \"NO_SESSION\",\n \"TIMEOUT\",\n \"PERMISSION_DENIED\",\n \"PERMISSION_PROMPT_UNAVAILABLE\",\n \"RUNTIME\",\n \"USAGE\",\n] as const;\nexport type OutputErrorCode = (typeof OUTPUT_ERROR_CODES)[number];\n\nexport const OUTPUT_ERROR_ORIGINS = [\"cli\", \"runtime\", \"queue\", \"acp\"] as const;\nexport type OutputErrorOrigin = (typeof OUTPUT_ERROR_ORIGINS)[number];\n\nexport const QUEUE_ERROR_DETAIL_CODES = [\n \"QUEUE_OWNER_CLOSED\",\n \"QUEUE_OWNER_SHUTTING_DOWN\",\n \"QUEUE_OWNER_OVERLOADED\",\n \"QUEUE_OWNER_GENERATION_MISMATCH\",\n \"QUEUE_REQUEST_INVALID\",\n \"QUEUE_REQUEST_PAYLOAD_INVALID_JSON\",\n \"QUEUE_ACK_MISSING\",\n \"QUEUE_DISCONNECTED_BEFORE_ACK\",\n \"QUEUE_DISCONNECTED_BEFORE_COMPLETION\",\n \"QUEUE_PROTOCOL_INVALID_JSON\",\n \"QUEUE_PROTOCOL_MALFORMED_MESSAGE\",\n \"QUEUE_PROTOCOL_UNEXPECTED_RESPONSE\",\n \"QUEUE_NOT_ACCEPTING_REQUESTS\",\n \"QUEUE_CONTROL_REQUEST_FAILED\",\n \"QUEUE_RUNTIME_PROMPT_FAILED\",\n] as const;\nexport type QueueErrorDetailCode = (typeof QUEUE_ERROR_DETAIL_CODES)[number];\n\nexport type OutputErrorAcpPayload = {\n code: number;\n message: string;\n data?: unknown;\n};\n\nexport type PermissionStats = {\n requested: number;\n approved: number;\n denied: number;\n cancelled: number;\n};\n\nexport type ClientOperationMethod =\n | \"fs/read_text_file\"\n | \"fs/write_text_file\"\n | \"terminal/create\"\n | \"terminal/output\"\n | \"terminal/wait_for_exit\"\n | \"terminal/kill\"\n | \"terminal/release\";\n\nexport type ClientOperationStatus = \"running\" | \"completed\" | \"failed\";\n\nexport type ClientOperation = {\n method: ClientOperationMethod;\n status: ClientOperationStatus;\n summary: string;\n details?: string;\n timestamp: string;\n};\n\nexport type SessionEventLog = {\n active_path: string;\n segment_count: number;\n max_segment_bytes: number;\n max_segments: number;\n last_write_at?: string;\n last_write_error?: string | null;\n};\n\nexport type PerfMetricSummary = {\n count: number;\n totalMs: number;\n maxMs: number;\n};\n\nexport type PerfMetricsSnapshot = {\n counters: Record<string, number>;\n timings: Record<string, PerfMetricSummary>;\n gauges: Record<string, number>;\n};\n\nexport type OutputFormatterContext = {\n sessionId: string;\n};\n\nexport type OutputPolicy = {\n format: OutputFormat;\n jsonStrict: boolean;\n suppressReads: boolean;\n suppressNonJsonStderr: boolean;\n queueErrorAlreadyEmitted: boolean;\n suppressSdkConsoleErrors: boolean;\n};\n\nexport type OutputErrorEmissionPolicy = {\n queueErrorAlreadyEmitted: boolean;\n};\n\nexport interface OutputFormatter {\n setContext(context: OutputFormatterContext): void;\n onAcpMessage(message: AcpJsonRpcMessage): void;\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 flush(): void;\n}\n\nexport type AcpClientOptions = {\n agentCommand: string;\n cwd: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n sessionOptions?: {\n model?: string;\n allowedTools?: string[];\n maxTurns?: number;\n };\n onAcpMessage?: (direction: AcpMessageDirection, message: AcpJsonRpcMessage) => void;\n onAcpOutputMessage?: (direction: AcpMessageDirection, message: AcpJsonRpcMessage) => void;\n onSessionUpdate?: (notification: SessionNotification) => void;\n onClientOperation?: (operation: ClientOperation) => void;\n};\n\nexport const SESSION_RECORD_SCHEMA = \"acpx.session.v1\" as const;\nexport type SessionMessageImage = {\n source: string;\n size?: {\n width: number;\n height: number;\n } | null;\n};\n\nexport type SessionUserContent =\n | {\n Text: string;\n }\n | {\n Mention: {\n uri: string;\n content: string;\n };\n }\n | {\n Image: SessionMessageImage;\n };\n\nexport type SessionToolUse = {\n id: string;\n name: string;\n raw_input: string;\n input: unknown;\n is_input_complete: boolean;\n thought_signature?: string | null;\n};\n\nexport type SessionToolResultContent =\n | {\n Text: string;\n }\n | {\n Image: SessionMessageImage;\n };\n\nexport type SessionToolResult = {\n tool_use_id: string;\n tool_name: string;\n is_error: boolean;\n content: SessionToolResultContent;\n output?: unknown;\n};\n\nexport type SessionAgentContent =\n | {\n Text: string;\n }\n | {\n Thinking: {\n text: string;\n signature?: string | null;\n };\n }\n | {\n RedactedThinking: string;\n }\n | {\n ToolUse: SessionToolUse;\n };\n\nexport type SessionUserMessage = {\n id: string;\n content: SessionUserContent[];\n};\n\nexport type SessionAgentMessage = {\n content: SessionAgentContent[];\n tool_results: Record<string, SessionToolResult>;\n reasoning_details?: unknown;\n};\n\nexport type SessionMessage =\n | {\n User: SessionUserMessage;\n }\n | {\n Agent: SessionAgentMessage;\n }\n | \"Resume\";\n\nexport type SessionTokenUsage = {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n};\n\nexport type SessionConversation = {\n title?: string | null;\n messages: SessionMessage[];\n updated_at: string;\n cumulative_token_usage: SessionTokenUsage;\n request_token_usage: Record<string, SessionTokenUsage>;\n};\n\nexport type SessionAcpxState = {\n reset_on_next_ensure?: boolean;\n current_mode_id?: string;\n desired_mode_id?: string;\n current_model_id?: string;\n available_models?: string[];\n available_commands?: string[];\n config_options?: SessionConfigOption[];\n session_options?: {\n model?: string;\n allowed_tools?: string[];\n max_turns?: number;\n };\n};\n\nexport type SessionRecord = {\n schema: typeof SESSION_RECORD_SCHEMA;\n acpxRecordId: string;\n acpSessionId: string;\n agentSessionId?: string;\n agentCommand: string;\n cwd: string;\n name?: string;\n createdAt: string;\n lastUsedAt: string;\n lastSeq: number;\n lastRequestId?: string;\n eventLog: SessionEventLog;\n closed?: boolean;\n closedAt?: string;\n pid?: number;\n agentStartedAt?: string;\n lastPromptAt?: string;\n lastAgentExitCode?: number | null;\n lastAgentExitSignal?: NodeJS.Signals | null;\n lastAgentExitAt?: string;\n lastAgentDisconnectReason?: string;\n protocolVersion?: number;\n agentCapabilities?: AgentCapabilities;\n title?: string | null;\n messages: SessionMessage[];\n updated_at: string;\n cumulative_token_usage: SessionTokenUsage;\n request_token_usage: Record<string, SessionTokenUsage>;\n acpx?: SessionAcpxState;\n};\n\nexport type RunPromptResult = {\n stopReason: StopReason;\n permissionStats: PermissionStats;\n sessionId: string;\n};\n\nexport type SessionSendResult = RunPromptResult & {\n record: SessionRecord;\n resumed: boolean;\n loadError?: string;\n};\n\nexport type SessionSetModeResult = {\n record: SessionRecord;\n resumed: boolean;\n loadError?: string;\n};\n\nexport type SessionSetConfigOptionResult = {\n record: SessionRecord;\n response: SetSessionConfigOptionResponse;\n resumed: boolean;\n loadError?: string;\n};\n\nexport type SessionSetModelResult = {\n record: SessionRecord;\n resumed: boolean;\n loadError?: string;\n};\n\nexport type SessionEnsureResult = {\n record: SessionRecord;\n created: boolean;\n};\n\nexport type SessionEnqueueResult = {\n queued: true;\n sessionId: string;\n requestId: string;\n};\n\nexport type SessionSendOutcome = SessionSendResult | SessionEnqueueResult;\nexport type { PromptInput };\n","import type { OutputErrorAcpPayload } from \"../types.js\";\n\nconst RESOURCE_NOT_FOUND_ACP_CODES = new Set([-32001, -32002]);\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 toAcpErrorPayload(value: unknown): OutputErrorAcpPayload | undefined {\n const record = asRecord(value);\n if (!record) {\n return undefined;\n }\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 extractAcpErrorInternal(value: unknown, depth: number): OutputErrorAcpPayload | undefined {\n if (depth > 5) {\n return undefined;\n }\n\n const direct = toAcpErrorPayload(value);\n if (direct) {\n return direct;\n }\n\n const record = asRecord(value);\n if (!record) {\n return undefined;\n }\n\n if (\"error\" in record) {\n const nested = extractAcpErrorInternal(record.error, depth + 1);\n if (nested) {\n return nested;\n }\n }\n\n if (\"acp\" in record) {\n const nested = extractAcpErrorInternal(record.acp, depth + 1);\n if (nested) {\n return nested;\n }\n }\n\n if (\"cause\" in record) {\n const nested = extractAcpErrorInternal(record.cause, depth + 1);\n if (nested) {\n return nested;\n }\n }\n\n return undefined;\n}\n\nexport function formatUnknownErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (error && typeof error === \"object\") {\n const maybeMessage = (error as { message?: unknown }).message;\n if (typeof maybeMessage === \"string\" && maybeMessage.length > 0) {\n return maybeMessage;\n }\n\n try {\n return JSON.stringify(error);\n } catch {\n // fall through\n }\n }\n\n return String(error);\n}\n\n// Matches \"session\" followed by optional ID (quoted or unquoted) followed by \"not found\"\n// Examples: \"Session \\\"abc\\\" not found\", \"Session abc-123 not found\"\nconst SESSION_NOT_FOUND_PATTERN = /session\\s+[\"'\\w-]+\\s+not found/i;\n\nfunction isSessionNotFoundText(value: unknown): boolean {\n if (typeof value !== \"string\") {\n return false;\n }\n\n const normalized = value.toLowerCase();\n return (\n normalized.includes(\"resource_not_found\") ||\n normalized.includes(\"resource not found\") ||\n normalized.includes(\"session not found\") ||\n normalized.includes(\"unknown session\") ||\n normalized.includes(\"invalid session identifier\") ||\n SESSION_NOT_FOUND_PATTERN.test(value)\n );\n}\n\nfunction hasSessionNotFoundHint(value: unknown, depth = 0): boolean {\n if (depth > 4) {\n return false;\n }\n\n if (isSessionNotFoundText(value)) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.some((entry) => hasSessionNotFoundHint(entry, depth + 1));\n }\n\n const record = asRecord(value);\n if (!record) {\n return false;\n }\n\n return Object.values(record).some((entry) => hasSessionNotFoundHint(entry, depth + 1));\n}\n\nexport function extractAcpError(error: unknown): OutputErrorAcpPayload | undefined {\n return extractAcpErrorInternal(error, 0);\n}\n\nexport function isAcpResourceNotFoundError(error: unknown): boolean {\n const acp = extractAcpError(error);\n if (acp && RESOURCE_NOT_FOUND_ACP_CODES.has(acp.code)) {\n return true;\n }\n\n if (acp) {\n if (isSessionNotFoundText(acp.message)) {\n return true;\n }\n if (hasSessionNotFoundHint(acp.data)) {\n return true;\n }\n }\n\n return isSessionNotFoundText(formatUnknownErrorMessage(error));\n}\n","import {\n AuthPolicyError,\n PermissionDeniedError,\n PermissionPromptUnavailableError,\n} from \"../errors.js\";\nimport {\n EXIT_CODES,\n OUTPUT_ERROR_CODES,\n OUTPUT_ERROR_ORIGINS,\n type ExitCode,\n type OutputErrorAcpPayload,\n type OutputErrorCode,\n type OutputErrorOrigin,\n} from \"../types.js\";\nimport {\n extractAcpError,\n formatUnknownErrorMessage,\n isAcpResourceNotFoundError,\n} from \"./error-shapes.js\";\n\nconst AUTH_REQUIRED_ACP_CODES = new Set([-32000]);\nconst QUERY_CLOSED_BEFORE_RESPONSE_DETAIL = \"query closed before response received\";\n\ntype ErrorMeta = {\n outputCode?: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n};\n\nexport type NormalizedOutputError = {\n code: OutputErrorCode;\n message: string;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n};\n\nexport type NormalizeOutputErrorOptions = {\n defaultCode?: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n};\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction isAuthRequiredMessage(value: string | undefined): boolean {\n if (!value) {\n return false;\n }\n const normalized = value.toLowerCase();\n return (\n normalized.includes(\"auth required\") ||\n normalized.includes(\"authentication required\") ||\n normalized.includes(\"authorization required\") ||\n normalized.includes(\"credential required\") ||\n normalized.includes(\"credentials required\") ||\n normalized.includes(\"token required\") ||\n normalized.includes(\"login required\")\n );\n}\n\nfunction isAcpAuthRequiredPayload(acp: OutputErrorAcpPayload | undefined): boolean {\n if (!acp) {\n return false;\n }\n if (!AUTH_REQUIRED_ACP_CODES.has(acp.code)) {\n return false;\n }\n if (isAuthRequiredMessage(acp.message)) {\n return true;\n }\n\n const data = asRecord(acp.data);\n if (!data) {\n return false;\n }\n\n if (data.authRequired === true) {\n return true;\n }\n\n const methodId = data.methodId;\n if (typeof methodId === \"string\" && methodId.trim().length > 0) {\n return true;\n }\n\n const methods = data.methods;\n if (Array.isArray(methods) && methods.length > 0) {\n return true;\n }\n\n return false;\n}\n\nfunction isOutputErrorCode(value: unknown): value is OutputErrorCode {\n return typeof value === \"string\" && OUTPUT_ERROR_CODES.includes(value as OutputErrorCode);\n}\n\nfunction isOutputErrorOrigin(value: unknown): value is OutputErrorOrigin {\n return typeof value === \"string\" && OUTPUT_ERROR_ORIGINS.includes(value as OutputErrorOrigin);\n}\n\nfunction readOutputErrorMeta(error: unknown): ErrorMeta {\n const record = asRecord(error);\n if (!record) {\n return {};\n }\n\n const outputCode = isOutputErrorCode(record.outputCode) ? record.outputCode : undefined;\n const detailCode =\n typeof record.detailCode === \"string\" && record.detailCode.trim().length > 0\n ? record.detailCode\n : undefined;\n const origin = isOutputErrorOrigin(record.origin) ? record.origin : undefined;\n const retryable = typeof record.retryable === \"boolean\" ? record.retryable : undefined;\n\n const acp = extractAcpError(record.acp);\n return {\n outputCode,\n detailCode,\n origin,\n retryable,\n acp,\n };\n}\n\nfunction isTimeoutLike(error: unknown): boolean {\n return error instanceof Error && error.name === \"TimeoutError\";\n}\n\nfunction isNoSessionLike(error: unknown): boolean {\n return error instanceof Error && error.name === \"NoSessionError\";\n}\n\nfunction isUsageLike(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n return (\n error.name === \"CommanderError\" ||\n error.name === \"InvalidArgumentError\" ||\n asRecord(error)?.code === \"commander.invalidArgument\"\n );\n}\n\nexport function formatErrorMessage(error: unknown): string {\n return formatUnknownErrorMessage(error);\n}\n\nexport { extractAcpError, isAcpResourceNotFoundError };\n\nexport function isAcpQueryClosedBeforeResponseError(error: unknown): boolean {\n const acp = extractAcpError(error);\n if (!acp || acp.code !== -32603) {\n return false;\n }\n\n const data = asRecord(acp.data);\n const details = data?.details;\n if (typeof details !== \"string\") {\n return false;\n }\n\n return details.toLowerCase().includes(QUERY_CLOSED_BEFORE_RESPONSE_DETAIL);\n}\n\nfunction mapErrorCode(error: unknown): OutputErrorCode | undefined {\n if (error instanceof PermissionPromptUnavailableError) {\n return \"PERMISSION_PROMPT_UNAVAILABLE\";\n }\n if (error instanceof PermissionDeniedError) {\n return \"PERMISSION_DENIED\";\n }\n if (isTimeoutLike(error)) {\n return \"TIMEOUT\";\n }\n if (isNoSessionLike(error) || isAcpResourceNotFoundError(error)) {\n return \"NO_SESSION\";\n }\n if (isUsageLike(error)) {\n return \"USAGE\";\n }\n return undefined;\n}\n\nexport function normalizeOutputError(\n error: unknown,\n options: NormalizeOutputErrorOptions = {},\n): NormalizedOutputError {\n const meta = readOutputErrorMeta(error);\n const mapped = mapErrorCode(error);\n let code = mapped ?? options.defaultCode ?? \"RUNTIME\";\n\n if (meta.outputCode) {\n code = meta.outputCode;\n }\n\n if (code === \"RUNTIME\" && isAcpResourceNotFoundError(error)) {\n code = \"NO_SESSION\";\n }\n\n const acp = options.acp ?? meta.acp ?? extractAcpError(error);\n const detailCode =\n meta.detailCode ??\n options.detailCode ??\n (error instanceof AuthPolicyError || isAcpAuthRequiredPayload(acp)\n ? \"AUTH_REQUIRED\"\n : undefined);\n return {\n code,\n message: formatErrorMessage(error),\n detailCode,\n origin: meta.origin ?? options.origin,\n retryable: meta.retryable ?? options.retryable,\n acp,\n };\n}\n\n/**\n * Returns true when an error from `client.prompt()` looks transient and\n * can reasonably be retried (e.g. model-API 400/500, network hiccups that\n * surface as ACP internal errors).\n *\n * Errors that are definitively non-recoverable (auth, missing session,\n * invalid params, timeout, permission) return false.\n */\nexport function isRetryablePromptError(error: unknown): boolean {\n if (error instanceof PermissionDeniedError || error instanceof PermissionPromptUnavailableError) {\n return false;\n }\n if (isTimeoutLike(error) || isNoSessionLike(error) || isUsageLike(error)) {\n return false;\n }\n\n // Extract ACP payload once and reuse for all subsequent checks.\n const acp = extractAcpError(error);\n if (!acp) {\n // Non-ACP errors (e.g. process crash) are not retried at the prompt level.\n return false;\n }\n\n // Resource-not-found (session gone) — check using the already-extracted payload.\n if (acp.code === -32001 || acp.code === -32002) {\n return false;\n }\n\n // Auth-required errors are never retryable. Use the same thorough check as normalizeOutputError.\n if (isAcpAuthRequiredPayload(acp)) {\n return false;\n }\n\n // Method-not-found or invalid-params are permanent protocol errors.\n if (acp.code === -32601 || acp.code === -32602) {\n return false;\n }\n\n // ACP internal errors (-32603) typically wrap model-API failures → retryable.\n // Parse errors (-32700) can also be transient.\n return acp.code === -32603 || acp.code === -32700;\n}\n\nexport function exitCodeForOutputErrorCode(code: OutputErrorCode): ExitCode {\n switch (code) {\n case \"USAGE\":\n return EXIT_CODES.USAGE;\n case \"TIMEOUT\":\n return EXIT_CODES.TIMEOUT;\n case \"NO_SESSION\":\n return EXIT_CODES.NO_SESSION;\n case \"PERMISSION_DENIED\":\n case \"PERMISSION_PROMPT_UNAVAILABLE\":\n return EXIT_CODES.PERMISSION_DENIED;\n case \"RUNTIME\":\n default:\n return EXIT_CODES.ERROR;\n }\n}\n","import type { ContentBlock } from \"@agentclientprotocol/sdk\";\n\nexport type PromptInput = ContentBlock[];\n\nexport class PromptInputValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PromptInputValidationError\";\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 isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction isBase64Data(value: string): boolean {\n if (value.length === 0 || value.length % 4 !== 0) {\n return false;\n }\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(value);\n}\n\nfunction isImageMimeType(value: string): boolean {\n return /^image\\/[A-Za-z0-9.+-]+$/i.test(value);\n}\n\nfunction isTextBlock(value: unknown): value is Extract<ContentBlock, { type: \"text\" }> {\n const record = asRecord(value);\n return record?.type === \"text\" && typeof record.text === \"string\";\n}\n\nfunction isImageBlock(value: unknown): value is Extract<ContentBlock, { type: \"image\" }> {\n const record = asRecord(value);\n return (\n record?.type === \"image\" &&\n isNonEmptyString(record.mimeType) &&\n isImageMimeType(record.mimeType) &&\n typeof record.data === \"string\" &&\n isBase64Data(record.data)\n );\n}\n\nfunction isResourceLinkBlock(\n value: unknown,\n): value is Extract<ContentBlock, { type: \"resource_link\" }> {\n const record = asRecord(value);\n return (\n record?.type === \"resource_link\" &&\n isNonEmptyString(record.uri) &&\n (record.title === undefined || typeof record.title === \"string\") &&\n (record.name === undefined || typeof record.name === \"string\")\n );\n}\n\nfunction isResourcePayload(value: unknown): boolean {\n const record = asRecord(value);\n if (!record || !isNonEmptyString(record.uri)) {\n return false;\n }\n return record.text === undefined || typeof record.text === \"string\";\n}\n\nfunction isResourceBlock(value: unknown): value is Extract<ContentBlock, { type: \"resource\" }> {\n const record = asRecord(value);\n return record?.type === \"resource\" && isResourcePayload(record.resource);\n}\n\nfunction isContentBlock(value: unknown): value is ContentBlock {\n return (\n isTextBlock(value) ||\n isImageBlock(value) ||\n isResourceLinkBlock(value) ||\n isResourceBlock(value)\n );\n}\n\nfunction getContentBlockValidationError(value: unknown, index: number): string | undefined {\n const record = asRecord(value);\n if (!record || typeof record.type !== \"string\") {\n return `prompt[${index}] must be an ACP content block object`;\n }\n\n switch (record.type) {\n case \"text\":\n return typeof record.text === \"string\"\n ? undefined\n : `prompt[${index}] text block must include a string text field`;\n case \"image\":\n if (!isNonEmptyString(record.mimeType)) {\n return `prompt[${index}] image block must include a non-empty mimeType`;\n }\n if (!isImageMimeType(record.mimeType)) {\n return `prompt[${index}] image block mimeType must start with image/`;\n }\n if (typeof record.data !== \"string\" || record.data.length === 0) {\n return `prompt[${index}] image block must include non-empty base64 data`;\n }\n if (!isBase64Data(record.data)) {\n return `prompt[${index}] image block data must be valid base64`;\n }\n return undefined;\n case \"resource_link\":\n if (!isNonEmptyString(record.uri)) {\n return `prompt[${index}] resource_link block must include a non-empty uri`;\n }\n if (record.title !== undefined && typeof record.title !== \"string\") {\n return `prompt[${index}] resource_link block title must be a string when present`;\n }\n if (record.name !== undefined && typeof record.name !== \"string\") {\n return `prompt[${index}] resource_link block name must be a string when present`;\n }\n return undefined;\n case \"resource\":\n if (!asRecord(record.resource)) {\n return `prompt[${index}] resource block must include a resource object`;\n }\n if (!isResourcePayload(record.resource)) {\n return `prompt[${index}] resource block resource must include a non-empty uri and optional text`;\n }\n return undefined;\n default:\n return `prompt[${index}] has unsupported content block type ${JSON.stringify(record.type)}`;\n }\n}\n\nexport function isPromptInput(value: unknown): value is PromptInput {\n return Array.isArray(value) && value.every((entry) => isContentBlock(entry));\n}\n\nexport function textPrompt(text: string): PromptInput {\n return [\n {\n type: \"text\",\n text,\n },\n ];\n}\n\nfunction parseStructuredPrompt(source: string): PromptInput | undefined {\n if (!source.startsWith(\"[\")) {\n return undefined;\n }\n try {\n const parsed = JSON.parse(source) as unknown;\n if (isPromptInput(parsed)) {\n return parsed;\n }\n if (Array.isArray(parsed)) {\n const detail =\n parsed\n .map((entry, index) => getContentBlockValidationError(entry, index))\n .find((message) => message !== undefined) ??\n \"Structured prompt JSON must be an array of valid ACP content blocks\";\n throw new PromptInputValidationError(detail);\n }\n return undefined;\n } catch (error) {\n if (error instanceof PromptInputValidationError) {\n throw error;\n }\n return undefined;\n }\n}\n\nexport function parsePromptSource(source: string): PromptInput {\n const trimmed = source.trim();\n const structured = parseStructuredPrompt(trimmed);\n if (structured) {\n return structured;\n }\n if (!trimmed) {\n return [];\n }\n return textPrompt(trimmed);\n}\n\nexport function mergePromptSourceWithText(source: string, suffixText: string): PromptInput {\n const prompt = parsePromptSource(source);\n const appended = suffixText.trim();\n if (!appended) {\n return prompt;\n }\n if (prompt.length === 0) {\n return textPrompt(appended);\n }\n return [...prompt, ...textPrompt(appended)];\n}\n\nexport function promptToDisplayText(prompt: PromptInput): string {\n return prompt\n .map((block) => {\n switch (block.type) {\n case \"text\":\n return block.text;\n case \"resource_link\":\n return block.title ?? block.name ?? block.uri;\n case \"resource\":\n return \"text\" in block.resource && typeof block.resource.text === \"string\"\n ? block.resource.text\n : block.resource.uri;\n case \"image\":\n return `[image] ${block.mimeType}`;\n default:\n return \"\";\n }\n })\n .filter((entry) => entry.trim().length > 0)\n .join(\"\\n\\n\")\n .trim();\n}\n","const AGENT_SESSION_ID_META_KEYS = [\"agentSessionId\", \"sessionId\"] as const;\n\nexport function normalizeAgentSessionId(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction asMetaRecord(meta: unknown): Record<string, unknown> | undefined {\n if (!meta || typeof meta !== \"object\" || Array.isArray(meta)) {\n return undefined;\n }\n return meta as Record<string, unknown>;\n}\n\nexport function extractAgentSessionId(meta: unknown): string | undefined {\n const record = asMetaRecord(meta);\n if (!record) {\n return undefined;\n }\n\n for (const key of AGENT_SESSION_ID_META_KEYS) {\n const normalized = normalizeAgentSessionId(record[key]);\n if (normalized) {\n return normalized;\n }\n }\n\n return undefined;\n}\n\nexport { AGENT_SESSION_ID_META_KEYS };\n","import {\n AGENT_SESSION_ID_META_KEYS,\n extractAgentSessionId,\n normalizeAgentSessionId,\n} from \"../acp/agent-session-id.js\";\n\nexport const RUNTIME_SESSION_ID_META_KEYS = AGENT_SESSION_ID_META_KEYS;\n\nexport function normalizeRuntimeSessionId(value: unknown): string | undefined {\n return normalizeAgentSessionId(value);\n}\n\nexport function extractRuntimeSessionId(meta: unknown): string | undefined {\n return extractAgentSessionId(meta);\n}\n","import type { PerfMetricsSnapshot } from \"./types.js\";\n\ntype TimingBucket = {\n count: number;\n totalMs: number;\n maxMs: number;\n};\n\nconst counters = new Map<string, number>();\nconst gauges = new Map<string, number>();\nconst timings = new Map<string, TimingBucket>();\n\nfunction hrNow(): bigint {\n return process.hrtime.bigint();\n}\n\nfunction durationMs(start: bigint): number {\n return Number(process.hrtime.bigint() - start) / 1_000_000;\n}\n\nfunction roundMetric(value: number): number {\n return Number(value.toFixed(3));\n}\n\nexport function incrementPerfCounter(name: string, delta = 1): void {\n counters.set(name, (counters.get(name) ?? 0) + delta);\n}\n\nexport function setPerfGauge(name: string, value: number): void {\n gauges.set(name, value);\n}\n\nexport function recordPerfDuration(name: string, durationMsValue: number): void {\n const next = timings.get(name) ?? {\n count: 0,\n totalMs: 0,\n maxMs: 0,\n };\n next.count += 1;\n next.totalMs += durationMsValue;\n next.maxMs = Math.max(next.maxMs, durationMsValue);\n timings.set(name, next);\n}\n\nexport async function measurePerf<T>(name: string, run: () => Promise<T>): Promise<T> {\n const startedAt = hrNow();\n try {\n return await run();\n } finally {\n recordPerfDuration(name, durationMs(startedAt));\n }\n}\n\nexport function startPerfTimer(name: string): () => number {\n const startedAt = hrNow();\n return () => {\n const elapsedMs = durationMs(startedAt);\n recordPerfDuration(name, elapsedMs);\n return elapsedMs;\n };\n}\n\nexport function getPerfMetricsSnapshot(): PerfMetricsSnapshot {\n return {\n counters: Object.fromEntries(counters.entries()),\n gauges: Object.fromEntries(gauges.entries()),\n timings: Object.fromEntries(\n [...timings.entries()].map(([name, bucket]) => [\n name,\n {\n count: bucket.count,\n totalMs: roundMetric(bucket.totalMs),\n maxMs: roundMetric(bucket.maxMs),\n },\n ]),\n ),\n };\n}\n\nexport function resetPerfMetrics(): void {\n counters.clear();\n gauges.clear();\n timings.clear();\n}\n\nexport function formatPerfMetric(name: string, durationMsValue: number): string {\n return `${name}=${roundMetric(durationMsValue)}ms`;\n}\n"],"mappings":"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"}
|