acpx 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/{agent-registry-DU6mhZBL.js → agent-registry-DdKB-zia.js} +20 -17
  2. package/dist/agent-registry-DdKB-zia.js.map +1 -0
  3. package/dist/agent-registry.d.ts.map +1 -1
  4. package/dist/agent-registry.js +1 -1
  5. package/dist/{cli-CiyfEC7L.js → cli-8mVHeUXh.js} +5 -5
  6. package/dist/{cli-CiyfEC7L.js.map → cli-8mVHeUXh.js.map} +1 -1
  7. package/dist/cli.js +122 -94
  8. package/dist/cli.js.map +1 -1
  9. package/dist/{client-C6NUFqr-.d.ts → client-DeNKZZcu.d.ts} +19 -13
  10. package/dist/client-DeNKZZcu.d.ts.map +1 -0
  11. package/dist/{flows-CTOdIk-m.js → flows-WOQNzCMC.js} +5 -5
  12. package/dist/{flows-CTOdIk-m.js.map → flows-WOQNzCMC.js.map} +1 -1
  13. package/dist/flows.d.ts +1 -1
  14. package/dist/flows.js +1 -1
  15. package/dist/{invocation-options-DbCcOAzM.js → invocation-options-B6d7TI-y.js} +7 -6
  16. package/dist/{invocation-options-DbCcOAzM.js.map → invocation-options-B6d7TI-y.js.map} +1 -1
  17. package/dist/{ipc-D3akHMEq.js → ipc-BJrvfNXr.js} +307 -90
  18. package/dist/ipc-BJrvfNXr.js.map +1 -0
  19. package/dist/{output-BPPjvJTI.js → output-CL18YmsG.js} +9 -6
  20. package/dist/output-CL18YmsG.js.map +1 -0
  21. package/dist/{queue-owner-runtime--IbbndGz.js → queue-owner-runtime-Cr0dWJuL.js} +1008 -463
  22. package/dist/queue-owner-runtime-Cr0dWJuL.js.map +1 -0
  23. package/dist/runtime.d.ts +129 -39
  24. package/dist/runtime.d.ts.map +1 -1
  25. package/dist/runtime.js +378 -176
  26. package/dist/runtime.js.map +1 -1
  27. package/dist/{session-watch--UX5dh00.js → session-watch-B8Q_TsGf.js} +4 -4
  28. package/dist/{session-watch--UX5dh00.js.map → session-watch-B8Q_TsGf.js.map} +1 -1
  29. package/dist/{watch-BbBxO-kb.js → watch-Dp73ph8h.js} +2 -2
  30. package/dist/{watch-BbBxO-kb.js.map → watch-Dp73ph8h.js.map} +1 -1
  31. package/package.json +3 -3
  32. package/skills/acpx/SKILL.md +27 -7
  33. package/dist/agent-registry-DU6mhZBL.js.map +0 -1
  34. package/dist/client-C6NUFqr-.d.ts.map +0 -1
  35. package/dist/ipc-D3akHMEq.js.map +0 -1
  36. package/dist/output-BPPjvJTI.js.map +0 -1
  37. package/dist/queue-owner-runtime--IbbndGz.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { A as listSessions, D as findSession, E as findGitRepositoryRoot, N as pruneSessions, O as findSessionByDirectoryWalk, at as parsePermissionNotice, et as extractSessionUpdateNotification, ht as isProcessAlive, it as parseJsonRpcErrorMessage, j as listSessionsForAgent, ot as parsePromptStopReason } from "./ipc-D3akHMEq.js";
2
- import { $ as normalizeQueueOwnerTtlMs, Q as DEFAULT_QUEUE_OWNER_TTL_MS, S as setSessionModel, _ as cancelSessionPrompt, a as runQueuedTask, b as setSessionConfigOption, g as listAgentSessions, h as ensureSession, i as runOnce, m as createSessionWithClient, n as runSessionQueueOwner, nt as InterruptedError, o as sendSessionDirect, p as createSession, r as sendSession, rt as TimeoutError, t as queueOwnerRuntimeTestInternals, v as closeSession, x as setSessionMode, y as sessionControlTestInternals } from "./queue-owner-runtime--IbbndGz.js";
1
+ import { D as findGitRepositoryRoot, M as listSessionsForAgent, O as findSession, P as pruneSessions, at as parseJsonRpcErrorMessage, gt as isProcessAlive, j as listSessions, k as findSessionByDirectoryWalk, ot as parsePermissionNotice, st as parsePromptStopReason, tt as extractSessionUpdateNotification } from "./ipc-BJrvfNXr.js";
2
+ import { C as setSessionModeOnOwner, S as setSessionMode, T as setSessionModelOnOwner, _ as cancelSessionPrompt, a as runQueuedTask, at as InterruptedError, b as setSessionConfigOption, g as listAgentSessions, h as ensureSession, i as runOnce, m as createSessionWithClient, n as runSessionQueueOwner, nt as normalizeQueueOwnerTtlMs, o as sendSessionDirect, ot as TimeoutError, p as createSession, r as sendSession, t as queueOwnerRuntimeTestInternals, tt as DEFAULT_QUEUE_OWNER_TTL_MS, v as closeSession, w as setSessionModel, x as setSessionConfigOptionOnOwner, y as sessionControlTestInternals } from "./queue-owner-runtime-Cr0dWJuL.js";
3
3
  //#region \0rolldown/runtime.js
4
4
  var __defProp = Object.defineProperty;
5
5
  var __exportAll = (all, no_symbols) => {
@@ -40,8 +40,11 @@ var session_exports = /* @__PURE__ */ __exportAll({
40
40
  sendSessionDirect: () => sendSessionDirect,
41
41
  sessionControlTestInternals: () => sessionControlTestInternals,
42
42
  setSessionConfigOption: () => setSessionConfigOption,
43
+ setSessionConfigOptionOnOwner: () => setSessionConfigOptionOnOwner,
43
44
  setSessionMode: () => setSessionMode,
44
- setSessionModel: () => setSessionModel
45
+ setSessionModeOnOwner: () => setSessionModeOnOwner,
46
+ setSessionModel: () => setSessionModel,
47
+ setSessionModelOnOwner: () => setSessionModelOnOwner
45
48
  });
46
49
  //#endregion
47
50
  //#region src/acp/jsonrpc-error.ts
@@ -107,14 +110,14 @@ const SUPPRESSED_READ_OUTPUT = "[read output suppressed]";
107
110
  function inferToolKindFromTitle(title) {
108
111
  const normalized = title?.trim().toLowerCase();
109
112
  if (!normalized) return;
110
- const head = normalized.split(":", 1)[0]?.trim();
113
+ const head = normalized.split(/[:\s]/, 1)[0];
111
114
  if (!head) return;
112
115
  if ([
113
116
  "read",
114
117
  "cat",
115
118
  "open",
116
119
  "view"
117
- ].some((needle) => head.includes(needle))) return "read";
120
+ ].includes(head)) return "read";
118
121
  }
119
122
  function isReadLikeTool(tool) {
120
123
  return tool.kind?.trim().toLowerCase() === "read" || inferToolKindFromTitle(tool.title) === "read";
@@ -977,4 +980,4 @@ function createOutputFormatter(format, options = {}) {
977
980
  //#endregion
978
981
  export { session_exports as a, JsonMessageSanitizer as i, getTextErrorRemediationHints as n, __exportAll as o, output_exports as r, createOutputFormatter as t };
979
982
 
980
- //# sourceMappingURL=output-BPPjvJTI.js.map
983
+ //# sourceMappingURL=output-CL18YmsG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-CL18YmsG.js","names":["asRecord"],"sources":["../src/session/session.ts","../src/acp/jsonrpc-error.ts","../src/cli/output/read-suppression.ts","../src/cli/output/json-formatter.ts","../src/cli/output/output.ts"],"sourcesContent":["export * from \"./execution/contracts.js\";\nexport * from \"./execution/session-management.js\";\nexport * from \"./execution/queue-owner-runtime.js\";\nexport * from \"./execution/session-control.js\";\nexport * from \"./execution/runtime.js\";\nexport {\n DEFAULT_HISTORY_LIMIT,\n findGitRepositoryRoot,\n findSession,\n findSessionByDirectoryWalk,\n listSessions,\n listSessionsForAgent,\n pruneSessions,\n} from \"./persistence.js\";\nexport type { PruneOptions, PruneResult } from \"./persistence.js\";\nexport { isProcessAlive } from \"../process-liveness.js\";\n","import type { OutputErrorAcpPayload, OutputErrorCode, OutputErrorOrigin } from \"../types.js\";\n\nexport const OUTPUT_ERROR_JSONRPC_CODES: Record<OutputErrorCode, number> = {\n NO_SESSION: -32002,\n TIMEOUT: -32070,\n PERMISSION_DENIED: -32071,\n PERMISSION_PROMPT_UNAVAILABLE: -32072,\n RUNTIME: -32603,\n USAGE: -32602,\n};\n\ntype JsonRpcErrorObject = {\n code: number;\n message: string;\n data?: unknown;\n};\n\nexport type BuildJsonRpcErrorParams = {\n id?: string | number | null;\n outputCode: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n message: string;\n retryable?: boolean;\n timestamp?: string;\n sessionId?: string;\n acp?: OutputErrorAcpPayload;\n};\n\nfunction hasValidAcpError(\n acp: OutputErrorAcpPayload | undefined,\n): acp is { code: number; message: string; data?: unknown } {\n return Boolean(\n acp &&\n Number.isFinite(acp.code) &&\n typeof acp.message === \"string\" &&\n acp.message.trim().length > 0,\n );\n}\n\nfunction buildFallbackData(params: BuildJsonRpcErrorParams): Record<string, unknown> {\n const data: Record<string, unknown> = {\n acpxCode: params.outputCode,\n detailCode: params.detailCode,\n origin: params.origin,\n retryable: params.retryable,\n timestamp: params.timestamp,\n sessionId: params.sessionId,\n };\n\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) {\n delete data[key];\n }\n }\n\n return data;\n}\n\nfunction mergeAcpErrorData(acpData: unknown, fallbackData: Record<string, unknown>): unknown {\n if (Object.keys(fallbackData).length === 0) {\n return acpData;\n }\n if (acpData === undefined) {\n return fallbackData;\n }\n if (acpData && typeof acpData === \"object\" && !Array.isArray(acpData)) {\n return {\n ...fallbackData,\n ...acpData,\n };\n }\n return acpData;\n}\n\nfunction buildErrorObject(params: BuildJsonRpcErrorParams): JsonRpcErrorObject {\n const fallbackData = buildFallbackData(params);\n if (hasValidAcpError(params.acp)) {\n const data = mergeAcpErrorData(params.acp.data, fallbackData);\n return {\n code: params.acp.code,\n message: params.acp.message,\n ...(data !== undefined ? { data } : {}),\n };\n }\n\n const data = fallbackData;\n return {\n code: OUTPUT_ERROR_JSONRPC_CODES[params.outputCode] ?? -32603,\n message: params.message,\n ...(Object.keys(data).length > 0 ? { data } : {}),\n };\n}\n\nexport function buildJsonRpcErrorResponse(params: BuildJsonRpcErrorParams): {\n jsonrpc: \"2.0\";\n id: string | number | null;\n error: JsonRpcErrorObject;\n} {\n return {\n jsonrpc: \"2.0\",\n id: params.id ?? null,\n error: buildErrorObject(params),\n };\n}\n","export const SUPPRESSED_READ_OUTPUT = \"[read output suppressed]\";\n\nexport type ReadLikeToolDescriptor = {\n title?: string;\n kind?: string | null;\n};\n\nfunction inferToolKindFromTitle(title: string | undefined): string | undefined {\n const normalized = title?.trim().toLowerCase();\n if (!normalized) {\n return undefined;\n }\n\n const head = normalized.split(/[:\\s]/, 1)[0];\n if (!head) {\n return undefined;\n }\n\n if ([\"read\", \"cat\", \"open\", \"view\"].includes(head)) {\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 error?: unknown;\n};\n\nconst DEFAULT_JSON_SESSION_ID = \"unknown\";\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction jsonRpcIdKey(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n return `s:${value}`;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return `n:${value}`;\n }\n return undefined;\n}\n\nfunction sanitizeReadResult(result: unknown): unknown {\n const record = asRecord(result);\n if (!record || typeof record.content !== \"string\") {\n return result;\n }\n return {\n ...record,\n content: SUPPRESSED_READ_OUTPUT,\n };\n}\n\nfunction sanitizeToolContent(content: unknown): unknown {\n if (!Array.isArray(content)) {\n return content;\n }\n\n return [\n {\n type: \"content\",\n content: {\n type: \"text\",\n text: SUPPRESSED_READ_OUTPUT,\n },\n },\n ];\n}\n\nfunction sanitizeToolMessage(message: unknown): unknown {\n const root = asRecord(message);\n const params = asRecord(root?.params);\n const update = asRecord(params?.update);\n if (!root || !params || !update) {\n return message;\n }\n\n return {\n ...root,\n params: {\n ...params,\n update: sanitizeToolUpdate(update),\n },\n };\n}\n\nfunction sanitizeToolUpdate(update: Record<string, unknown>): Record<string, unknown> {\n return {\n ...update,\n rawOutput: sanitizedRawOutput(update),\n content: sanitizedContent(update),\n };\n}\n\nfunction sanitizedRawOutput(update: Record<string, unknown>): unknown {\n if (Object.prototype.hasOwnProperty.call(update, \"rawOutput\") && update.rawOutput !== undefined) {\n return { content: SUPPRESSED_READ_OUTPUT };\n }\n return update.rawOutput;\n}\n\nfunction sanitizedContent(update: Record<string, unknown>): unknown {\n if (Object.prototype.hasOwnProperty.call(update, \"content\") && update.content !== undefined) {\n return sanitizeToolContent(update.content);\n }\n return update.content;\n}\n\nexport class JsonMessageSanitizer {\n private readonly requestMethodById = new Map<string, string>();\n private readonly toolStateById = new Map<string, { title?: string; kind?: string | null }>();\n\n constructor(\n private readonly suppressReads: boolean,\n private readonly partialHistory = false,\n ) {}\n\n sanitize(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) {\n return message;\n }\n\n const hasResult = Object.hasOwn(candidate, \"result\");\n const hasError = Object.hasOwn(candidate, \"error\");\n if (!hasResult && !hasError) {\n return message;\n }\n\n const method = this.requestMethodById.get(idKey);\n this.requestMethodById.delete(idKey);\n if (!hasResult || !this.suppressReadResponse(method)) {\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 suppressReadResponse(method: string | undefined): boolean {\n return method === \"fs/read_text_file\" || (this.partialHistory && method === undefined);\n }\n\n private sanitizeReadToolMessage(message: unknown): unknown {\n const update = this.readToolUpdate(message);\n if (!update) {\n return message;\n }\n\n const toolCallId = typeof update.toolCallId === \"string\" ? update.toolCallId : undefined;\n if (!toolCallId) {\n return message;\n }\n\n const current = this.mergeToolState(toolCallId, update);\n this.toolStateById.set(toolCallId, current);\n\n const unclassified = this.partialHistory && !current.kind && !current.title;\n return isReadLikeTool(current) || unclassified ? sanitizeToolMessage(message) : message;\n }\n\n private readToolUpdate(message: unknown): Record<string, unknown> | undefined {\n const root = asRecord(message);\n if (root?.method !== \"session/update\") {\n return undefined;\n }\n const params = asRecord(root.params);\n const update = asRecord(params?.update);\n if (!params || !update) {\n return undefined;\n }\n\n const sessionUpdate = update.sessionUpdate;\n if (sessionUpdate !== \"tool_call\" && sessionUpdate !== \"tool_call_update\") {\n return undefined;\n }\n return update;\n }\n\n private mergeToolState(\n toolCallId: string,\n update: Record<string, unknown>,\n ): { title?: string; kind?: string | null } {\n const previous = this.toolStateById.get(toolCallId) ?? {};\n return {\n title: typeof update.title === \"string\" ? update.title : previous.title,\n kind: typeof update.kind === \"string\" || update.kind === null ? update.kind : previous.kind,\n };\n }\n}\n\nclass JsonOutputFormatter implements OutputFormatter {\n private readonly stdout: WritableLike;\n private readonly sanitizer: JsonMessageSanitizer;\n private sessionId: string;\n\n constructor(stdout: WritableLike, suppressReads: boolean, context?: OutputFormatterContext) {\n this.stdout = stdout;\n this.sanitizer = new JsonMessageSanitizer(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.sanitizer.sanitize(message))}\\n`);\n }\n\n onError(params: {\n code: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n message: string;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n timestamp?: string;\n }): void {\n this.stdout.write(\n `${JSON.stringify(\n buildJsonRpcErrorResponse({\n outputCode: params.code,\n detailCode: params.detailCode,\n origin: params.origin,\n message: params.message,\n retryable: params.retryable,\n timestamp: params.timestamp,\n sessionId: this.sessionId,\n acp: params.acp,\n }),\n )}\\n`,\n );\n }\n\n onPermissionEscalation(): void {\n // JSON mode is raw ACP NDJSON. Escalation details ride on the ACP\n // request_permission response _meta instead of a synthetic acpx event line.\n }\n\n flush(): void {\n // no-op for streaming output\n }\n}\n\nexport function createJsonOutputFormatter(\n stdout: WritableLike,\n suppressReads = false,\n context?: OutputFormatterContext,\n): OutputFormatter {\n return new JsonOutputFormatter(stdout, suppressReads, context);\n}\n","import type {\n AnyMessage,\n ContentBlock,\n SessionNotification,\n ToolCall,\n ToolCallContent,\n ToolCallLocation,\n ToolCallStatus,\n ToolCallUpdate,\n} from \"@agentclientprotocol/sdk\";\nimport {\n extractSessionUpdateNotification,\n parseJsonRpcErrorMessage,\n parsePromptStopReason,\n parsePermissionNotice,\n} from \"../../acp/jsonrpc.js\";\nimport type {\n AcpJsonRpcMessage,\n ClientOperation,\n OutputErrorAcpPayload,\n OutputErrorCode,\n OutputFormatterContext,\n OutputFormat,\n OutputFormatter,\n OutputErrorOrigin,\n PermissionEscalationEvent,\n} from \"../../types.js\";\nimport { createJsonOutputFormatter } from \"./json-formatter.js\";\nimport { isReadLikeTool, SUPPRESSED_READ_OUTPUT } from \"./read-suppression.js\";\n\ntype WritableLike = {\n write(chunk: string): void;\n isTTY?: boolean;\n};\n\ntype RenderableOutputError = {\n code: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n message: string;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n timestamp?: string;\n};\n\ntype OutputFormatterOptions = {\n stdout?: WritableLike;\n stderr?: WritableLike;\n jsonContext?: OutputFormatterContext;\n suppressReads?: boolean;\n};\n\ntype NormalizedToolStatus = ToolCallStatus | \"unknown\";\n\ntype 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\ntype ToolDisplay = {\n input?: string;\n files?: string;\n output?: 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 return isFinalStatus(status) || status === \"pending\" ? status : \"running\";\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 parseJsonRpcErrorSummary(message: AcpJsonRpcMessage): string | undefined {\n const fallback = parseJsonRpcErrorMessage(message);\n if (!fallback) {\n return undefined;\n }\n\n const error = asRecord((message as { error?: unknown }).error);\n const details = asRecord(error?.data)?.details;\n return typeof details === \"string\" && details.trim().length > 0 ? details.trim() : fallback;\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 return [...new Set(values)];\n}\n\nfunction safeJson(value: unknown, spacing: number): string | undefined {\n const seen = new WeakSet();\n\n try {\n return JSON.stringify(\n value,\n (_key, entry: unknown) => {\n if (typeof entry === \"bigint\") {\n return `${entry}n`;\n }\n if (typeof entry === \"function\") {\n return `[Function ${entry.name || \"anonymous\"}]`;\n }\n if (typeof entry === \"symbol\") {\n return entry.toString();\n }\n if (entry && typeof entry === \"object\") {\n if (seen.has(entry)) {\n return \"[Circular]\";\n }\n seen.add(entry);\n }\n return entry;\n },\n spacing,\n );\n } catch {\n return undefined;\n }\n}\n\nfunction readFirstString(source: Record<string, unknown>, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n }\n return undefined;\n}\n\nfunction readFirstFiniteNumber(\n source: Record<string, unknown>,\n keys: string[],\n): number | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction formatMetadataNumber(value: number): string {\n return Number.isInteger(value) ? String(value) : String(Number(value.toFixed(8)));\n}\n\nfunction readFirstStringArray(\n source: Record<string, unknown>,\n keys: string[],\n): string[] | undefined {\n for (const key of keys) {\n const value = source[key];\n if (!Array.isArray(value)) {\n continue;\n }\n const entries = value\n .map((entry) => (typeof entry === \"string\" ? entry.trim() : \"\"))\n .filter((entry) => entry.length > 0);\n if (entries.length > 0) {\n return entries;\n }\n }\n return undefined;\n}\n\nfunction formatDisjunction(values: string[]): string {\n if (values.length <= 1) {\n return values[0] ?? \"\";\n }\n if (values.length === 2) {\n return `${values[0]} or ${values[1]}`;\n }\n return `${values.slice(0, -1).join(\", \")}, or ${values.at(-1)}`;\n}\n\nfunction parseAuthMethodIdsFromMessage(message: string): string[] {\n const methods: string[] = [];\n const methodListMatch = message.match(/auth methods \\[([^\\]]+)\\]/iu);\n if (methodListMatch) {\n methods.push(\n ...methodListMatch[1]\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0),\n );\n }\n\n const singleMethodMatch = message.match(/auth method ([\\w.-]+)/iu);\n if (singleMethodMatch) {\n methods.push(singleMethodMatch[1]);\n }\n\n return dedupeStrings(methods);\n}\n\nfunction parseAuthMethodIdsFromAcpData(data: unknown): string[] {\n const record = asRecord(data);\n if (!record) {\n return [];\n }\n\n const methodIds: string[] = [];\n if (typeof record.methodId === \"string\" && record.methodId.trim().length > 0) {\n methodIds.push(record.methodId.trim());\n }\n\n if (Array.isArray(record.methods)) {\n for (const entry of record.methods) {\n const id = parseAuthMethodIdEntry(entry);\n if (id) {\n methodIds.push(id);\n }\n }\n }\n\n return dedupeStrings(methodIds);\n}\n\nfunction parseAuthMethodIdEntry(entry: unknown): string | undefined {\n if (typeof entry === \"string\" && entry.trim().length > 0) {\n return entry.trim();\n }\n\n const id = asRecord(entry)?.id;\n return typeof id === \"string\" && id.trim().length > 0 ? id.trim() : undefined;\n}\n\nfunction renderAuthRequiredHint(params: RenderableOutputError): string {\n const methodIds = dedupeStrings([\n ...parseAuthMethodIdsFromAcpData(params.acp?.data),\n ...parseAuthMethodIdsFromMessage(params.message),\n ]);\n\n if (methodIds.length === 0) {\n return \"hint: run `acpx config show` to locate the active config, then add the required credential under `auth` and retry.\";\n }\n\n const configKeys = methodIds.map((methodId) => `\\`auth.${methodId}\\``);\n return `hint: run \\`acpx config show\\` to locate the active config, then add ${formatDisjunction(configKeys)} and retry.`;\n}\n\nexport function getTextErrorRemediationHints(params: RenderableOutputError): string[] {\n const lowerMessage = params.message.toLowerCase();\n\n if (params.detailCode === \"AUTH_REQUIRED\") {\n return [renderAuthRequiredHint(params)];\n }\n\n if (params.code === \"TIMEOUT\") {\n return [\n \"hint: increase `--timeout <seconds>` for long-running prompts, or check whether the agent/provider is stalled.\",\n ];\n }\n\n if (params.code === \"NO_SESSION\") {\n return noSessionHints(lowerMessage);\n }\n\n return matchingTextErrorRule(params, lowerMessage)?.hints ?? [];\n}\n\ntype TextErrorHintRule = {\n matches: (params: RenderableOutputError, lowerMessage: string) => boolean;\n hints: string[];\n};\n\nconst TEXT_ERROR_HINT_RULES: TextErrorHintRule[] = [\n {\n matches: (_params, lowerMessage) => isUnsupportedSessionLoadError(lowerMessage),\n hints: [\n \"hint: this adapter cannot resume saved ACP sessions; create a fresh one with `acpx <agent> sessions new` instead of reusing `--resume-session`.\",\n ],\n },\n {\n matches: (_params, lowerMessage) => isSessionLoadError(lowerMessage),\n hints: [\n \"hint: rerun with `--verbose` to capture the ACP load failure details.\",\n \"hint: if you do not need the old backend session, start a fresh one with `acpx <agent> sessions new` and retry.\",\n ],\n },\n {\n matches: (params, lowerMessage) => isRateLimitError(params.message, lowerMessage),\n hints: [\n \"hint: the provider appears rate-limited; retry later, switch model, or check provider quota/billing.\",\n ],\n },\n {\n matches: (_params, lowerMessage) => isModelLookupError(lowerMessage),\n hints: [\n \"hint: check the configured model name for this agent, then retry with `--model <model>` or `sessions set-model <model>`.\",\n ],\n },\n {\n matches: (_params, lowerMessage) => isSessionConfigMethodError(lowerMessage),\n hints: [\n \"hint: rerun with `--verbose` to capture the ACP method/error details before retrying.\",\n ],\n },\n {\n matches: isRuntimeAcpProtocolError,\n hints: [\"hint: rerun with `--verbose` to capture the underlying ACP error details.\"],\n },\n];\n\nfunction matchingTextErrorRule(\n params: RenderableOutputError,\n lowerMessage: string,\n): TextErrorHintRule | undefined {\n return TEXT_ERROR_HINT_RULES.find((rule) => rule.matches(params, lowerMessage));\n}\n\nfunction noSessionHints(lowerMessage: string): string[] {\n if (lowerMessage.includes(\"create one:\")) {\n return [];\n }\n return [\n \"hint: the saved ACP session is missing or stale; start a fresh session with `acpx <agent> sessions new`, then retry.\",\n ];\n}\n\nfunction isUnsupportedSessionLoadError(lowerMessage: string): boolean {\n return (\n lowerMessage.includes(\"does not support session/resume\") ||\n lowerMessage.includes(\"does not support session/load\")\n );\n}\n\nfunction isSessionLoadError(lowerMessage: string): boolean {\n return (\n lowerMessage.includes(\"failed to resume acp session\") ||\n lowerMessage.includes(\"session/resume\") ||\n lowerMessage.includes(\"session/load\")\n );\n}\n\nfunction isRateLimitError(message: string, lowerMessage: string): boolean {\n return (\n /\\b429\\b/u.test(message) ||\n [\"rate limit\", \"quota exceeded\"].some((text) => lowerMessage.includes(text))\n );\n}\n\nfunction isModelLookupError(lowerMessage: string): boolean {\n return [\"model not found\", \"unknown model\", \"invalid model\"].some((text) =>\n lowerMessage.includes(text),\n );\n}\n\nfunction isSessionConfigMethodError(lowerMessage: string): boolean {\n return [\"session/set_mode\", \"session/set_model\", \"session/set_config_option\"].some((text) =>\n lowerMessage.includes(text),\n );\n}\n\nfunction isRuntimeAcpProtocolError(params: RenderableOutputError, lowerMessage: string): boolean {\n return (\n params.origin === \"acp\" &&\n params.code === \"RUNTIME\" &&\n (params.acp?.code === -32602 ||\n params.acp?.code === -32603 ||\n lowerMessage.includes(\"internal error\"))\n );\n}\n\nfunction summarizeToolInput(rawInput: unknown): string | undefined {\n if (rawInput == null) {\n return undefined;\n }\n\n if (isScalarToolInput(rawInput)) {\n return toInline(String(rawInput));\n }\n\n const record = asRecord(rawInput);\n if (record) {\n return summarizeToolInputRecord(record) ?? summarizeToolInputJson(rawInput);\n }\n\n return summarizeToolInputJson(rawInput);\n}\n\nfunction isScalarToolInput(value: unknown): value is string | number | boolean {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n}\n\nfunction summarizeToolInputRecord(record: Record<string, unknown>): string | undefined {\n const command = readFirstString(record, [\"command\", \"cmd\", \"program\"]);\n const args = readFirstStringArray(record, [\"args\", \"arguments\"]);\n if (command) {\n return toInline([command, ...(args ?? [])].join(\" \"));\n }\n\n const location = readFirstString(record, [\n \"path\",\n \"file\",\n \"filePath\",\n \"filepath\",\n \"target\",\n \"uri\",\n \"url\",\n ]);\n const query = readFirstString(record, [\"query\", \"pattern\", \"text\", \"search\"]);\n return location || query ? toInline(location ?? query ?? \"\") : undefined;\n}\n\nfunction summarizeToolInputJson(rawInput: unknown): string | undefined {\n const json = safeJson(rawInput, 0);\n return json ? toInline(json) : undefined;\n}\n\nfunction formatLocations(\n locations: Array<ToolCallLocation> | null | undefined,\n): string | undefined {\n if (!locations || locations.length === 0) {\n return undefined;\n }\n\n const unique = new Set<string>();\n for (const location of locations) {\n const formatted = formatLocation(location);\n if (formatted) {\n unique.add(formatted);\n }\n }\n\n const items = [...unique];\n if (items.length === 0) {\n return undefined;\n }\n\n const visible = items.slice(0, MAX_LOCATION_ITEMS);\n const hidden = items.length - visible.length;\n if (hidden <= 0) {\n return visible.join(\", \");\n }\n\n return `${visible.join(\", \")}, +${hidden} more`;\n}\n\nfunction formatLocation(location: ToolCallLocation): string | undefined {\n const path = location.path?.trim();\n if (!path) {\n return undefined;\n }\n\n const line =\n typeof location.line === \"number\" && Number.isFinite(location.line)\n ? `:${Math.max(1, Math.trunc(location.line))}`\n : \"\";\n return `${path}${line}`;\n}\n\nfunction summarizeDiff(path: string, oldText: string | null | undefined, newText: string): string {\n const oldLines = oldText ? oldText.split(\"\\n\").length : 0;\n const newLines = newText.split(\"\\n\").length;\n const delta = newLines - oldLines;\n\n if (delta === 0) {\n return `diff ${path} (line count unchanged)`;\n }\n\n const signedDelta = `${delta > 0 ? \"+\" : \"\"}${delta}`;\n return `diff ${path} (${signedDelta} lines)`;\n}\n\nfunction textFromContentBlock(content: ContentBlock): string | undefined {\n switch (content.type) {\n case \"text\":\n return content.text;\n case \"resource_link\":\n return content.title ?? content.name ?? content.uri;\n case \"resource\": {\n return textFromResourceBlock(content);\n }\n case \"image\":\n return `[image] ${content.mimeType}`;\n case \"audio\":\n return `[audio] ${content.mimeType}`;\n default:\n return undefined;\n }\n}\n\nfunction textFromResourceBlock(content: Extract<ContentBlock, { type: \"resource\" }>): string {\n if (\"text\" in content.resource && typeof content.resource.text === \"string\") {\n return content.resource.text;\n }\n const uri = content.resource.uri;\n const mimeType = content.resource.mimeType;\n return `[resource] ${uri}${mimeType ? ` (${mimeType})` : \"\"}`;\n}\n\nfunction summarizeToolContent(\n content: Array<ToolCallContent> | null | undefined,\n): string | undefined {\n if (!content || content.length === 0) {\n return undefined;\n }\n\n const fragments: string[] = [];\n\n for (const entry of content) {\n const fragment = summarizeToolContentEntry(entry);\n if (fragment) {\n fragments.push(fragment);\n }\n }\n\n const unique = dedupeStrings(\n fragments.map((fragment) => fragment.trim()).filter((fragment) => fragment.length > 0),\n );\n if (unique.length === 0) {\n return undefined;\n }\n\n return unique.join(\"\\n\\n\");\n}\n\nfunction summarizeToolContentEntry(entry: ToolCallContent): string | undefined {\n if (entry.type === \"content\") {\n const text = textFromContentBlock(entry.content);\n return text && text.trim() ? text.trimEnd() : undefined;\n }\n if (entry.type === \"diff\") {\n return summarizeDiff(entry.path, entry.oldText, entry.newText);\n }\n if (entry.type === \"terminal\") {\n return `[terminal] ${entry.terminalId}`;\n }\n return undefined;\n}\n\nfunction extractOutputText(\n value: unknown,\n depth = 0,\n seen = new Set<unknown>(),\n): string | undefined {\n if (value == null) {\n return undefined;\n }\n\n const scalar = extractScalarOutputText(value);\n if (scalar !== null) {\n return scalar;\n }\n\n if (depth >= 4) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n return extractOutputTextArray(value, depth, seen);\n }\n\n return extractOutputTextRecord(value, depth, seen);\n}\n\nfunction extractOutputTextRecord(\n value: unknown,\n depth: number,\n seen: Set<unknown>,\n): string | undefined {\n const record = asRecord(value);\n if (!record || seen.has(record)) {\n return undefined;\n }\n\n seen.add(record);\n\n return extractPreferredOutputText(record, depth, seen) ?? extractJsonOutputText(record);\n}\n\nfunction extractScalarOutputText(value: unknown): string | undefined | null {\n if (typeof value === \"string\") {\n const trimmed = value.trimEnd();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n return null;\n}\n\nfunction extractOutputTextArray(\n value: unknown[],\n depth: number,\n seen: Set<unknown>,\n): string | undefined {\n const parts = value\n .map((entry) => extractOutputText(entry, depth + 1, seen))\n .filter((entry): entry is string => Boolean(entry));\n return parts.length > 0 ? dedupeStrings(parts).join(\"\\n\") : undefined;\n}\n\nfunction extractPreferredOutputText(\n record: Record<string, unknown>,\n depth: number,\n seen: Set<unknown>,\n): string | undefined {\n const preferred = OUTPUT_PRIORITY_KEYS.flatMap((key) => {\n if (!(key in record)) {\n return [];\n }\n const extracted = extractOutputText(record[key], depth + 1, seen);\n return extracted ? [extracted] : [];\n });\n const uniquePreferred = dedupeStrings(preferred);\n return uniquePreferred.length > 0 ? uniquePreferred.join(\"\\n\") : undefined;\n}\n\nfunction extractJsonOutputText(record: Record<string, unknown>): string | undefined {\n const json = safeJson(record, 2);\n return !json || json === \"{}\" ? undefined : json;\n}\n\nfunction summarizeToolOutput(\n rawOutput: unknown,\n content: Array<ToolCallContent> | null | undefined,\n): string | undefined {\n const outputFromRaw = extractOutputText(rawOutput);\n const outputFromContent = summarizeToolContent(content);\n\n const fragments = dedupeStrings(\n [outputFromRaw, outputFromContent]\n .map((fragment) => fragment?.trim())\n .filter((fragment): fragment is string => Boolean(fragment)),\n );\n\n if (fragments.length === 0) {\n return undefined;\n }\n\n return fragments.join(\"\\n\\n\");\n}\n\nfunction renderToolOutput(state: ToolRenderState, suppressReads: boolean): string | undefined {\n if (suppressReads && isReadLikeTool(state)) {\n return SUPPRESSED_READ_OUTPUT;\n }\n\n return summarizeToolOutput(state.rawOutput, state.content);\n}\n\nfunction limitOutputBlock(value: string): string {\n const normalized = value.replace(/\\r\\n/g, \"\\n\").trim();\n if (!normalized) {\n return \"\";\n }\n\n const lines = normalized.split(\"\\n\");\n const visible = lines.slice(0, MAX_OUTPUT_LINES);\n let result = visible.join(\"\\n\");\n\n if (lines.length > visible.length) {\n const hidden = lines.length - visible.length;\n result += `\\n... (${hidden} more lines)`;\n }\n\n if (result.length > MAX_OUTPUT_CHARS) {\n result = `${result.slice(0, MAX_OUTPUT_CHARS - 3)}...`;\n }\n\n return result;\n}\n\nclass TextOutputFormatter implements OutputFormatter {\n private readonly stdout: WritableLike;\n private readonly useColor: boolean;\n private readonly suppressReads: boolean;\n private readonly toolStates = new Map<string, ToolRenderState>();\n private thoughtBuffer = \"\";\n private wroteAny = false;\n private atLineStart = true;\n\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 notice = parsePermissionNotice(message);\n if (notice) {\n this.beginSection();\n this.writeLine(`${this.bold(\"[permission]\")} ${notice}`);\n return;\n }\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 = parseJsonRpcErrorSummary(message);\n if (errorMessage) {\n this.onError({\n code: \"RUNTIME\",\n origin: \"acp\",\n message: errorMessage,\n });\n }\n }\n\n private renderSessionUpdate(notification: SessionNotification): void {\n const update = notification.update;\n if (update.sessionUpdate !== \"agent_thought_chunk\") {\n this.flushThoughtBuffer();\n }\n this.renderSessionUpdateBody(update);\n }\n\n private renderSessionUpdateBody(update: SessionNotification[\"update\"]): void {\n switch (update.sessionUpdate) {\n case \"agent_message_chunk\": {\n if (update.content.type === \"text\") {\n this.write(update.content.text);\n }\n return;\n }\n case \"agent_thought_chunk\": {\n if (update.content.type === \"text\") {\n this.thoughtBuffer += update.content.text;\n }\n return;\n }\n case \"tool_call\": {\n this.renderToolUpdate(update);\n return;\n }\n case \"tool_call_update\": {\n this.renderToolUpdate(update);\n return;\n }\n case \"plan\": {\n this.renderPlanUpdate(update.entries);\n return;\n }\n default:\n return;\n }\n }\n\n private renderPlanUpdate(\n entries: Extract<SessionNotification[\"update\"], { sessionUpdate: \"plan\" }>[\"entries\"],\n ): void {\n this.beginSection();\n this.writeLine(this.bold(\"[plan]\"));\n for (const entry of entries) {\n this.writeLine(` - [${entry.status}] ${entry.content}`);\n }\n }\n\n private renderDone(stopReason: string): void {\n this.flushThoughtBuffer();\n this.beginSection();\n this.writeLine(this.dim(`[done] ${stopReason}`));\n }\n\n onError(params: RenderableOutputError): void {\n this.flushThoughtBuffer();\n this.beginSection();\n this.writeLine(this.formatAnsi(`[error] ${params.code}: ${params.message}`, \"31\"));\n for (const hint of getTextErrorRemediationHints(params)) {\n this.writeLine(this.dim(hint));\n }\n }\n\n onClientOperation(operation: ClientOperation): void {\n this.flushThoughtBuffer();\n this.beginSection();\n\n const normalizedStatus: NormalizedToolStatus =\n operation.status === \"completed\"\n ? \"completed\"\n : operation.status === \"failed\"\n ? \"failed\"\n : \"in_progress\";\n const statusText = this.colorStatus(operation.status, normalizedStatus);\n this.writeLine(`${this.bold(\"[client]\")} ${operation.summary} (${statusText})`);\n if (operation.details && operation.details.trim().length > 0) {\n this.writeLine(\" details:\");\n this.writeLine(indentBlock(operation.details, \" \"));\n }\n }\n\n onPermissionEscalation(event: PermissionEscalationEvent): void {\n this.flushThoughtBuffer();\n this.beginSection();\n this.writeLine(`${this.bold(\"[permission]\")} ${event.message}`);\n const details = [\n `sessionId: ${event.sessionId}`,\n `toolCallId: ${event.toolCallId}`,\n event.toolName ? `toolName: ${event.toolName}` : undefined,\n `toolTitle: ${event.toolTitle}`,\n event.toolInput !== undefined\n ? `toolInput: ${summarizeToolInput(event.toolInput) ?? \"(structured input)\"}`\n : undefined,\n event.toolKind ? `toolKind: ${event.toolKind}` : undefined,\n event.matchedRule ? `matchedRule: ${event.matchedRule}` : undefined,\n ].filter((line): line is string => Boolean(line));\n this.writeLine(indentBlock(details.join(\"\\n\"), \" \"));\n }\n\n flush(): void {\n this.flushThoughtBuffer();\n if (!this.atLineStart) {\n this.write(\"\\n\");\n }\n }\n\n private write(chunk: string): void {\n if (!chunk) {\n return;\n }\n this.stdout.write(chunk);\n this.wroteAny = true;\n this.atLineStart = chunk.endsWith(\"\\n\");\n }\n\n private writeLine(line: string): void {\n this.write(`${line}\\n`);\n }\n\n private beginSection(): void {\n if (!this.atLineStart) {\n this.write(\"\\n\");\n }\n if (this.wroteAny) {\n this.write(\"\\n\");\n }\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();\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 const final = isFinalStatus(status);\n if (!final && state.startedPrinted) {\n return;\n }\n const display: ToolDisplay = {\n input: summarizeToolInput(state.rawInput),\n files: formatLocations(state.locations),\n output: final ? renderToolOutput(state, this.suppressReads) : undefined,\n };\n if (final) {\n const payload = { title: state.title, status: state.status, kind: state.kind, ...display };\n const signature = safeJson(payload, 0) ?? JSON.stringify(payload);\n if (signature === state.finalSignature) {\n return;\n }\n state.finalSignature = signature;\n } else {\n state.startedPrinted = true;\n }\n this.renderToolState(state, status, display);\n }\n\n private getOrCreateToolState(toolCallId: string): ToolRenderState {\n const existing = this.toolStates.get(toolCallId);\n if (existing) {\n return existing;\n }\n\n const created: ToolRenderState = {\n id: toolCallId,\n startedPrinted: false,\n };\n this.toolStates.set(toolCallId, created);\n return created;\n }\n\n private mergeToolState(state: ToolRenderState, update: ToolCall | ToolCallUpdate): void {\n this.mergeToolTitle(state, update.title);\n this.mergeToolPayloadState(state, update);\n }\n\n private mergeToolTitle(state: ToolRenderState, title: string | null | undefined): void {\n if (typeof title === \"string\" && title.trim().length > 0) {\n state.title = title;\n }\n }\n\n private mergeToolPayloadState(state: ToolRenderState, update: ToolCall | ToolCallUpdate): void {\n if (update.status !== undefined) {\n state.status = update.status;\n }\n if (update.kind !== undefined) {\n state.kind = update.kind;\n }\n if (update.locations !== undefined) {\n state.locations = update.locations;\n }\n if (update.rawInput !== undefined) {\n state.rawInput = update.rawInput;\n }\n if (update.rawOutput !== undefined) {\n state.rawOutput = update.rawOutput;\n }\n if (update.content !== undefined) {\n state.content = update.content;\n }\n }\n\n private renderToolState(\n state: ToolRenderState,\n status: NormalizedToolStatus,\n display: ToolDisplay,\n ): void {\n this.beginSection();\n const title = state.title ?? state.id;\n const statusText = this.colorStatus(toStatusLabel(status), status);\n this.writeLine(`${this.bold(\"[tool]\")} ${title} (${statusText})`);\n if (isFinalStatus(status) && state.kind) {\n this.writeLine(` kind: ${state.kind}`);\n }\n if (display.input) {\n this.writeLine(` input: ${display.input}`);\n }\n if (display.files) {\n this.writeLine(` files: ${display.files}`);\n }\n if (display.output) {\n this.writeLine(\" output:\");\n this.writeLine(indentBlock(limitOutputBlock(display.output), \" \"));\n }\n }\n\n private formatAnsi(text: string, code: string): string {\n if (!this.useColor) {\n return text;\n }\n return `\\u001b[${code}m${text}\\u001b[0m`;\n }\n\n private bold(text: string): string {\n return this.formatAnsi(text, \"1\");\n }\n\n private dim(text: string): string {\n return this.formatAnsi(text, \"2\");\n }\n\n private colorStatus(text: string, status: NormalizedToolStatus): string {\n if (!this.useColor) {\n return text;\n }\n\n switch (status) {\n case \"completed\":\n return this.formatAnsi(text, \"32\");\n case \"failed\":\n return this.formatAnsi(text, \"31\");\n case \"pending\":\n case \"in_progress\":\n case \"unknown\":\n default:\n return this.formatAnsi(text, \"33\");\n }\n }\n}\n\nclass QuietOutputFormatter implements OutputFormatter {\n private readonly stdout: WritableLike;\n private readonly stderr: WritableLike;\n private chunks: string[] = [];\n private flushed = false;\n private metadataFlushed = false;\n\n constructor(stdout: WritableLike, stderr: WritableLike) {\n this.stdout = stdout;\n this.stderr = stderr;\n }\n\n setContext(_context: OutputFormatterContext): void {\n // no-op for quiet mode\n }\n\n onAcpMessage(message: AcpJsonRpcMessage): void {\n const notice = parsePermissionNotice(message);\n if (notice) {\n this.stderr.write(`[acpx] permission: ${notice.replace(/\\r\\n?|\\n/g, \" \")}\\n`);\n return;\n }\n const update = extractSessionUpdateNotification(message);\n if (\n update?.update.sessionUpdate === \"agent_message_chunk\" &&\n update.update.content.type === \"text\"\n ) {\n this.chunks.push(update.update.content.text);\n return;\n }\n\n if (parsePromptStopReason(message)) {\n this.flushBufferedOutput();\n this.flushMetadata(message);\n }\n }\n\n onError(params: {\n code: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n message: string;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n timestamp?: string;\n }): void {\n const qualifier = params.detailCode ? `${params.code} ${params.detailCode}` : params.code;\n const message = preferredAcpErrorDetails(params.acp) ?? params.message;\n this.stderr.write(`[acpx] error: ${qualifier} ${message.replace(/\\r\\n?|\\n/g, \" \")}\\n`);\n }\n\n onPermissionEscalation(_event: PermissionEscalationEvent): void {\n // no-op in quiet mode\n }\n\n flush(): void {\n // no-op for streaming output\n }\n\n private flushBufferedOutput(): void {\n if (this.flushed) {\n return;\n }\n\n this.flushed = true;\n const text = this.chunks.join(\"\");\n this.stdout.write(text.endsWith(\"\\n\") ? text : `${text}\\n`);\n }\n\n private flushMetadata(message: AcpJsonRpcMessage): void {\n if (this.metadataFlushed) {\n return;\n }\n\n this.metadataFlushed = true;\n const result = asRecord((message as { result?: unknown }).result);\n if (!result) {\n return;\n }\n\n const usageLine = this.formatUsageLine(asRecord(result.usage));\n if (usageLine) {\n this.stderr.write(`${usageLine}\\n`);\n }\n\n const costLine = this.formatCostLine(result.cost);\n if (costLine) {\n this.stderr.write(`${costLine}\\n`);\n }\n }\n\n private formatUsageLine(usage: Record<string, unknown> | undefined): string | undefined {\n if (!usage) {\n return undefined;\n }\n\n const parts: string[] = [];\n const fields: Array<[string, string[]]> = [\n [\"input\", [\"inputTokens\", \"input_tokens\"]],\n [\"output\", [\"outputTokens\", \"output_tokens\"]],\n [\"cache_read\", [\"cachedReadTokens\", \"cacheReadInputTokens\", \"cache_read_input_tokens\"]],\n [\n \"cache_write\",\n [\"cachedWriteTokens\", \"cacheCreationInputTokens\", \"cache_creation_input_tokens\"],\n ],\n [\"total\", [\"totalTokens\", \"total_tokens\"]],\n ];\n\n for (const [label, keys] of fields) {\n const value = readFirstFiniteNumber(usage, keys);\n if (value !== undefined) {\n parts.push(`${label}=${formatMetadataNumber(value)}`);\n }\n }\n\n return parts.length > 0 ? `[acpx] tokens: ${parts.join(\" \")}` : undefined;\n }\n\n private formatCostLine(cost: unknown): string | undefined {\n const scalar = this.formatScalarCostLine(cost);\n if (scalar) {\n return scalar;\n }\n const record = asRecord(cost);\n if (!record) {\n return undefined;\n }\n\n const amount = readFirstFiniteNumber(record, [\"amount\", \"value\", \"total\"]);\n if (amount === undefined) {\n return undefined;\n }\n\n const currency =\n typeof record.currency === \"string\" && record.currency.trim()\n ? ` ${record.currency.trim()}`\n : \"\";\n return `[acpx] cost: ${formatMetadataNumber(amount)}${currency}`;\n }\n\n private formatScalarCostLine(cost: unknown): string | undefined {\n if (typeof cost === \"number\" && Number.isFinite(cost)) {\n return `[acpx] cost: ${formatMetadataNumber(cost)}`;\n }\n\n if (typeof cost === \"string\" && cost.trim()) {\n return `[acpx] cost: ${cost.trim()}`;\n }\n\n return undefined;\n }\n}\n\nfunction preferredAcpErrorDetails(acp: OutputErrorAcpPayload | undefined): string | undefined {\n const details = asRecord(acp?.data)?.details;\n return typeof details === \"string\" && details.trim().length > 0 ? details.trim() : undefined;\n}\n\nexport function createOutputFormatter(\n format: OutputFormat,\n options: OutputFormatterOptions = {},\n): OutputFormatter {\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n const suppressReads = options.suppressReads === true;\n\n switch (format) {\n case \"text\":\n return new TextOutputFormatter(stdout, suppressReads);\n case \"json\":\n return createJsonOutputFormatter(stdout, suppressReads, options.jsonContext);\n case \"quiet\":\n return new QuietOutputFormatter(stdout, stderr);\n default: {\n const exhaustive: never = format;\n void exhaustive;\n throw new Error(\"Unsupported output format\");\n }\n }\n}\n"],"mappings":"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"}