acpx 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-registry-DGw0-3Tc.js +54 -0
- package/dist/agent-registry-DGw0-3Tc.js.map +1 -0
- package/dist/{cli-idpWyCOs.js → cli-CLRrs6eQ.js} +8 -12
- package/dist/cli-CLRrs6eQ.js.map +1 -0
- package/dist/cli.d.ts +2 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1018 -1009
- package/dist/cli.js.map +1 -1
- package/dist/client-DLTWuu4w.d.ts +116 -0
- package/dist/client-DLTWuu4w.d.ts.map +1 -0
- package/dist/{flags-CCcX9fZj.js → flags-BmubjvOw.js} +5 -55
- package/dist/flags-BmubjvOw.js.map +1 -0
- package/dist/{flows-BL1tSvZT.js → flows-CR7xCmkR.js} +471 -281
- package/dist/flows-CR7xCmkR.js.map +1 -0
- package/dist/flows.d.ts +5 -9
- package/dist/flows.d.ts.map +1 -1
- package/dist/flows.js +1 -1
- package/dist/{queue-ipc-CE8_QGX3.js → ipc-DN6M4Ui9.js} +12 -571
- package/dist/ipc-DN6M4Ui9.js.map +1 -0
- package/dist/{acp-jsonrpc-BbBgC5gO.js → jsonrpc-M3y-qzy8.js} +2 -2
- package/dist/jsonrpc-M3y-qzy8.js.map +1 -0
- package/dist/{output-Du3m6oPQ.js → output-Di0M9Et8.js} +6 -6
- package/dist/output-Di0M9Et8.js.map +1 -0
- package/dist/perf-metrics-D9QC81lB.js +568 -0
- package/dist/perf-metrics-D9QC81lB.js.map +1 -0
- package/dist/{session-RO_LZUnv.js → prompt-turn-Bt8T3SRR.js} +2304 -3632
- package/dist/prompt-turn-Bt8T3SRR.js.map +1 -0
- package/dist/{output-render-Bz58qaQn.js → render-BL5ynRkN.js} +7 -6
- package/dist/render-BL5ynRkN.js.map +1 -0
- package/dist/runtime.d.ts +266 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +984 -0
- package/dist/runtime.js.map +1 -0
- package/dist/session-BbN0SBgf.js +1488 -0
- package/dist/session-BbN0SBgf.js.map +1 -0
- package/dist/{types-CeRKmEQ1.d.ts → types-DXxLBQc3.d.ts} +40 -3
- package/dist/types-DXxLBQc3.d.ts.map +1 -0
- package/package.json +5 -3
- package/dist/acp-jsonrpc-BbBgC5gO.js.map +0 -1
- package/dist/cli-idpWyCOs.js.map +0 -1
- package/dist/flags-CCcX9fZj.js.map +0 -1
- package/dist/flows-BL1tSvZT.js.map +0 -1
- package/dist/output-Du3m6oPQ.js.map +0 -1
- package/dist/output-render-Bz58qaQn.js.map +0 -1
- package/dist/queue-ipc-CE8_QGX3.js.map +0 -1
- package/dist/session-RO_LZUnv.js.map +0 -1
- package/dist/types-CeRKmEQ1.d.ts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flows-BL1tSvZT.js","names":["isoNow","recordConversationSessionUpdate","recordConversationClientOperation"],"sources":["../src/flows/definition.ts","../src/flows/executors/shell.ts","../src/flows/graph.ts","../src/flows/store.ts","../src/flows/runtime.ts","../src/flows/json.ts"],"sourcesContent":["import type {\n AcpNodeDefinition,\n ActionNodeDefinition,\n CheckpointNodeDefinition,\n ComputeNodeDefinition,\n FlowDefinition,\n FunctionActionNodeDefinition,\n ShellActionNodeDefinition,\n} from \"./types.js\";\n\nexport function defineFlow<TFlow extends FlowDefinition>(definition: TFlow): TFlow {\n return definition;\n}\n\nexport function acp(definition: Omit<AcpNodeDefinition, \"nodeType\">): AcpNodeDefinition {\n return {\n nodeType: \"acp\",\n ...definition,\n };\n}\n\nexport function compute(\n definition: Omit<ComputeNodeDefinition, \"nodeType\">,\n): ComputeNodeDefinition {\n return {\n nodeType: \"compute\",\n ...definition,\n };\n}\n\nexport function action(\n definition: Omit<FunctionActionNodeDefinition, \"nodeType\">,\n): FunctionActionNodeDefinition;\nexport function action(\n definition: Omit<ShellActionNodeDefinition, \"nodeType\">,\n): ShellActionNodeDefinition;\nexport function action(\n definition:\n | Omit<FunctionActionNodeDefinition, \"nodeType\">\n | Omit<ShellActionNodeDefinition, \"nodeType\">,\n): ActionNodeDefinition {\n return {\n nodeType: \"action\",\n ...definition,\n } as ActionNodeDefinition;\n}\n\nexport function shell(\n definition: Omit<ShellActionNodeDefinition, \"nodeType\">,\n): ShellActionNodeDefinition {\n return {\n nodeType: \"action\",\n ...definition,\n };\n}\n\nexport function checkpoint(\n definition: Omit<CheckpointNodeDefinition, \"nodeType\"> = {},\n): CheckpointNodeDefinition {\n return {\n nodeType: \"checkpoint\",\n ...definition,\n };\n}\n","import { spawn } from \"node:child_process\";\nimport { TimeoutError } from \"../../session-runtime-helpers.js\";\nimport type { ShellActionExecution, ShellActionResult } from \"../runtime.js\";\n\nexport function formatShellActionSummary(spec: ShellActionExecution): string {\n return `shell: ${renderShellCommand(spec.command, spec.args ?? [])}`;\n}\n\nexport function renderShellCommand(command: string, args: string[]): string {\n const renderedArgs = args.map((arg) => JSON.stringify(arg)).join(\" \");\n return renderedArgs.length > 0 ? `${command} ${renderedArgs}` : command;\n}\n\nexport async function runShellAction(spec: ShellActionExecution): Promise<ShellActionResult> {\n const cwd = spec.cwd ?? process.cwd();\n const args = spec.args ?? [];\n const startMs = Date.now();\n const child = spawn(spec.command, args, {\n cwd,\n env: {\n ...process.env,\n ...spec.env,\n },\n shell: spec.shell,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n windowsHide: true,\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let timeout: NodeJS.Timeout | undefined;\n\n const finish = new Promise<ShellActionResult>((resolve, reject) => {\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.stderr.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n\n child.once(\"error\", reject);\n child.once(\"exit\", (exitCode, signal) => {\n const result: ShellActionResult = {\n command: spec.command,\n args,\n cwd,\n stdout,\n stderr,\n combinedOutput: `${stdout}${stderr}`,\n exitCode,\n signal,\n durationMs: Date.now() - startMs,\n };\n\n if (timedOut) {\n reject(new TimeoutError(spec.timeoutMs ?? 0));\n return;\n }\n\n if (((exitCode ?? 0) !== 0 || signal != null) && spec.allowNonZeroExit !== true) {\n reject(\n new Error(\n `Shell action failed (${renderShellCommand(spec.command, args)}): ${signal ? `signal ${signal}` : `exit ${String(exitCode)}`}${stderr.length > 0 ? `\\n${stderr.trim()}` : \"\"}`,\n ),\n );\n return;\n }\n\n resolve(result);\n });\n });\n\n if (spec.stdin != null) {\n child.stdin.write(spec.stdin);\n }\n child.stdin.end();\n\n if (spec.timeoutMs != null && spec.timeoutMs > 0) {\n timeout = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n child.kill(\"SIGKILL\");\n }, 1_000).unref();\n }, spec.timeoutMs);\n }\n\n try {\n return await finish;\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n}\n","import type { FlowDefinition, FlowEdge, FlowNodeResult } from \"./types.js\";\n\nexport function validateFlowDefinition(flow: FlowDefinition): void {\n if (!flow.name.trim()) {\n throw new Error(\"Flow name must not be empty\");\n }\n if (flow.permissions?.reason !== undefined && !flow.permissions.reason.trim()) {\n throw new Error(\"Flow permission reason must not be empty\");\n }\n if (!flow.nodes[flow.startAt]) {\n throw new Error(`Flow start node is missing: ${flow.startAt}`);\n }\n\n const outgoingEdges = new Set<string>();\n for (const edge of flow.edges) {\n if (!flow.nodes[edge.from]) {\n throw new Error(`Flow edge references unknown from-node: ${edge.from}`);\n }\n if (outgoingEdges.has(edge.from)) {\n throw new Error(`Flow node must not declare multiple outgoing edges: ${edge.from}`);\n }\n outgoingEdges.add(edge.from);\n if (\"to\" in edge) {\n if (!flow.nodes[edge.to]) {\n throw new Error(`Flow edge references unknown to-node: ${edge.to}`);\n }\n continue;\n }\n for (const target of Object.values(edge.switch.cases)) {\n if (!flow.nodes[target]) {\n throw new Error(`Flow switch references unknown to-node: ${target}`);\n }\n }\n }\n}\n\nexport function resolveNext(\n edges: FlowEdge[],\n from: string,\n output: unknown,\n result?: FlowNodeResult,\n): string | null {\n const edge = edges.find((candidate) => candidate.from === from);\n if (!edge) {\n return null;\n }\n\n if (\"to\" in edge) {\n return edge.to;\n }\n\n const value = getBySwitchPath(output, result, edge.switch.on);\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n throw new Error(`Flow switch value must be scalar for ${edge.switch.on}`);\n }\n const next = edge.switch.cases[String(value)];\n if (!next) {\n throw new Error(`No flow switch case for ${edge.switch.on}=${JSON.stringify(value)}`);\n }\n return next;\n}\n\nexport function resolveNextForOutcome(\n edges: FlowEdge[],\n from: string,\n result: FlowNodeResult,\n): string | null {\n const edge = edges.find((candidate) => candidate.from === from);\n if (!edge || \"to\" in edge) {\n return null;\n }\n if (!edge.switch.on.startsWith(\"$result.\")) {\n return null;\n }\n const value = getBySwitchPath(undefined, result, edge.switch.on);\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n throw new Error(`Flow switch value must be scalar for ${edge.switch.on}`);\n }\n const next = edge.switch.cases[String(value)];\n if (!next) {\n throw new Error(`No flow switch case for ${edge.switch.on}=${JSON.stringify(value)}`);\n }\n return next;\n}\n\nfunction getBySwitchPath(\n output: unknown,\n result: FlowNodeResult | undefined,\n jsonPath: string,\n): unknown {\n if (jsonPath.startsWith(\"$result.\")) {\n return getByPath(result, `$.${jsonPath.slice(\"$result.\".length)}`);\n }\n if (jsonPath.startsWith(\"$output.\")) {\n return getByPath(output, `$.${jsonPath.slice(\"$output.\".length)}`);\n }\n return getByPath(output, jsonPath);\n}\n\nfunction getByPath(value: unknown, jsonPath: string): unknown {\n if (!jsonPath.startsWith(\"$.\")) {\n throw new Error(`Unsupported JSON path: ${jsonPath}`);\n }\n\n return jsonPath\n .slice(2)\n .split(\".\")\n .reduce<unknown>((current, key) => {\n if (current == null || typeof current !== \"object\") {\n return undefined;\n }\n return (current as Record<string, unknown>)[key];\n }, value);\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { AcpJsonRpcMessage, AcpMessageDirection, SessionRecord } from \"../types.js\";\nimport type {\n AcpNodeDefinition,\n FlowArtifactRef,\n FlowDefinition,\n FlowDefinitionSnapshot,\n FlowManifestSessionEntry,\n FlowNodeDefinition,\n FlowRunManifest,\n FlowRunState,\n FlowSessionBinding,\n FlowTraceEvent,\n FlowTraceEventDraft,\n} from \"./types.js\";\n\nconst FLOW_BUNDLE_SCHEMA = \"acpx.flow-run-bundle.v1\" as const;\nconst FLOW_TRACE_SCHEMA = \"acpx.flow-trace-event.v1\" as const;\nconst FLOW_SNAPSHOT_SCHEMA = \"acpx.flow-definition-snapshot.v1\" as const;\n\nconst MANIFEST_PATH = \"manifest.json\";\nconst FLOW_SNAPSHOT_PATH = \"flow.json\";\nconst TRACE_PATH = \"trace.ndjson\";\nconst PROJECTIONS_DIR = \"projections\";\nconst RUN_PROJECTION_PATH = \"projections/run.json\";\nconst LIVE_PROJECTION_PATH = \"projections/live.json\";\nconst STEPS_PROJECTION_PATH = \"projections/steps.json\";\nconst SESSIONS_DIR = \"sessions\";\nconst ARTIFACTS_DIR = \"artifacts\";\n\ntype FlowLiveState = {\n runId: string;\n flowName: string;\n runTitle?: string;\n flowPath?: string;\n startedAt: string;\n finishedAt?: string;\n updatedAt: string;\n status: FlowRunState[\"status\"];\n currentNode?: string;\n currentAttemptId?: string;\n currentNodeType?: FlowRunState[\"currentNodeType\"];\n currentNodeStartedAt?: string;\n lastHeartbeatAt?: string;\n statusDetail?: string;\n waitingOn?: string;\n error?: string;\n sessionBindings: FlowRunState[\"sessionBindings\"];\n};\n\ntype WriteArtifactOptions = {\n mediaType: string;\n extension: string;\n nodeId?: string;\n attemptId?: string;\n sessionId?: string;\n emitTrace?: boolean;\n};\n\nexport function flowRunsBaseDir(homeDir: string = os.homedir()): string {\n return path.join(homeDir, \".acpx\", \"flows\", \"runs\");\n}\n\nexport class FlowRunStore {\n readonly outputRoot: string;\n private readonly traceSeqByRun = new Map<string, number>();\n private readonly sessionSeqByBundle = new Map<string, number>();\n private readonly manifestByRun = new Map<string, FlowRunManifest>();\n private readonly appendChainByPath = new Map<string, Promise<void>>();\n\n constructor(outputRoot: string = flowRunsBaseDir()) {\n this.outputRoot = outputRoot;\n }\n\n async createRunDir(runId: string): Promise<string> {\n const runDir = path.join(this.outputRoot, runId);\n await fs.mkdir(path.join(runDir, PROJECTIONS_DIR), { recursive: true });\n await fs.mkdir(path.join(runDir, SESSIONS_DIR), { recursive: true });\n await fs.mkdir(path.join(runDir, ARTIFACTS_DIR), { recursive: true });\n this.traceSeqByRun.set(runDir, 0);\n return runDir;\n }\n\n async initializeRunBundle(\n runDir: string,\n options: {\n flow: FlowDefinition;\n state: FlowRunState;\n inputArtifact?: FlowArtifactRef;\n },\n ): Promise<void> {\n const snapshot = createFlowDefinitionSnapshot(options.flow);\n const manifest: FlowRunManifest = {\n schema: FLOW_BUNDLE_SCHEMA,\n runId: options.state.runId,\n flowName: options.state.flowName,\n runTitle: options.state.runTitle,\n flowPath: options.state.flowPath,\n startedAt: options.state.startedAt,\n finishedAt: options.state.finishedAt,\n status: options.state.status,\n traceSchema: FLOW_TRACE_SCHEMA,\n paths: {\n flow: FLOW_SNAPSHOT_PATH,\n trace: TRACE_PATH,\n runProjection: RUN_PROJECTION_PATH,\n liveProjection: LIVE_PROJECTION_PATH,\n stepsProjection: STEPS_PROJECTION_PATH,\n sessionsDir: SESSIONS_DIR,\n artifactsDir: ARTIFACTS_DIR,\n },\n sessions: [],\n };\n\n this.manifestByRun.set(runDir, manifest);\n await writeJsonAtomic(this.resolveRunPath(runDir, FLOW_SNAPSHOT_PATH), snapshot);\n await writeJsonAtomic(this.resolveRunPath(runDir, MANIFEST_PATH), manifest);\n await writeJsonAtomic(this.resolveRunPath(runDir, RUN_PROJECTION_PATH), options.state);\n await writeJsonAtomic(\n this.resolveRunPath(runDir, LIVE_PROJECTION_PATH),\n createLiveState(options.state),\n );\n await writeJsonAtomic(this.resolveRunPath(runDir, STEPS_PROJECTION_PATH), options.state.steps);\n await ensureFile(this.resolveRunPath(runDir, TRACE_PATH));\n\n await this.appendTrace(runDir, options.state, {\n scope: \"run\",\n type: \"run_started\",\n payload: {\n flowName: options.state.flowName,\n ...(options.state.runTitle ? { runTitle: options.state.runTitle } : {}),\n ...(options.state.flowPath ? { flowPath: options.state.flowPath } : {}),\n ...(options.inputArtifact ? { inputArtifact: options.inputArtifact } : {}),\n },\n });\n }\n\n async writeSnapshot(\n runDir: string,\n state: FlowRunState,\n event: FlowTraceEventDraft,\n ): Promise<void> {\n state.updatedAt = isoNow();\n await writeJsonAtomic(this.resolveRunPath(runDir, RUN_PROJECTION_PATH), state);\n await writeJsonAtomic(\n this.resolveRunPath(runDir, LIVE_PROJECTION_PATH),\n createLiveState(state),\n );\n await writeJsonAtomic(this.resolveRunPath(runDir, STEPS_PROJECTION_PATH), state.steps);\n await this.writeManifest(runDir, state);\n await this.appendTrace(runDir, state, event);\n }\n\n async writeLive(runDir: string, state: FlowRunState, event: FlowTraceEventDraft): Promise<void> {\n state.updatedAt = isoNow();\n await writeJsonAtomic(\n this.resolveRunPath(runDir, LIVE_PROJECTION_PATH),\n createLiveState(state),\n );\n await this.writeManifest(runDir, state);\n await this.appendTrace(runDir, state, event);\n }\n\n async appendTrace(\n runDir: string,\n state: FlowRunState,\n event: FlowTraceEventDraft,\n ): Promise<FlowTraceEvent> {\n const traceEvent: FlowTraceEvent = {\n seq: this.nextTraceSeq(runDir),\n at: isoNow(),\n runId: state.runId,\n ...event,\n };\n await this.appendJsonLine(this.resolveRunPath(runDir, TRACE_PATH), traceEvent);\n return traceEvent;\n }\n\n async writeArtifact(\n runDir: string,\n state: FlowRunState,\n content: unknown,\n options: WriteArtifactOptions,\n ): Promise<FlowArtifactRef> {\n const buffer = toArtifactBuffer(content, options.mediaType);\n const sha256 = createHash(\"sha256\").update(buffer).digest(\"hex\");\n const relativePath = path.posix.join(\n ARTIFACTS_DIR,\n `sha256-${sha256}${normalizeArtifactExtension(options.extension)}`,\n );\n const filePath = this.resolveRunPath(runDir, relativePath);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n try {\n await fs.access(filePath);\n } catch {\n await fs.writeFile(filePath, buffer);\n }\n\n const artifact: FlowArtifactRef = {\n path: relativePath,\n mediaType: options.mediaType,\n bytes: buffer.byteLength,\n sha256,\n };\n if (options.emitTrace !== false) {\n await this.appendTrace(runDir, state, {\n scope: \"artifact\",\n type: \"artifact_written\",\n nodeId: options.nodeId,\n attemptId: options.attemptId,\n sessionId: options.sessionId,\n artifact,\n payload: {\n artifact,\n },\n });\n }\n return artifact;\n }\n\n async ensureSessionBundle(\n runDir: string,\n state: FlowRunState,\n binding: FlowSessionBinding,\n record?: SessionRecord,\n ): Promise<void> {\n const sessionDir = this.resolveRunPath(runDir, sessionDirPath(binding.bundleId));\n await fs.mkdir(sessionDir, { recursive: true });\n await writeJsonAtomic(path.join(sessionDir, \"binding.json\"), binding);\n await ensureFile(path.join(sessionDir, \"events.ndjson\"));\n if (record) {\n await this.writeSessionRecord(runDir, state, binding, record);\n }\n\n const manifest = this.getManifest(runDir, state);\n const existing = manifest.sessions.find((entry) => entry.id === binding.bundleId);\n const isNew = !existing;\n if (isNew) {\n const entry: FlowManifestSessionEntry = {\n id: binding.bundleId,\n handle: binding.handle,\n bindingPath: path.posix.join(sessionDirPath(binding.bundleId), \"binding.json\"),\n recordPath: path.posix.join(sessionDirPath(binding.bundleId), \"record.json\"),\n eventsPath: path.posix.join(sessionDirPath(binding.bundleId), \"events.ndjson\"),\n };\n manifest.sessions.push(entry);\n await writeJsonAtomic(this.resolveRunPath(runDir, MANIFEST_PATH), manifest);\n }\n\n if (isNew) {\n await this.appendTrace(runDir, state, {\n scope: \"session\",\n type: \"session_bound\",\n sessionId: binding.bundleId,\n payload: {\n sessionId: binding.bundleId,\n handle: binding.handle,\n bindingArtifact: {\n path: path.posix.join(sessionDirPath(binding.bundleId), \"binding.json\"),\n mediaType: \"application/json\",\n sha256: await fileSha256(path.join(sessionDir, \"binding.json\")),\n },\n },\n });\n }\n }\n\n async writeSessionRecord(\n runDir: string,\n _state: FlowRunState,\n binding: FlowSessionBinding,\n record: SessionRecord,\n ): Promise<void> {\n const bundleSeq = this.sessionSeqByBundle.get(`${runDir}::${binding.bundleId}`) ?? 0;\n const bundledRecord = createBundledSessionRecord(binding, record, bundleSeq);\n await writeJsonAtomic(\n this.resolveRunPath(runDir, path.posix.join(sessionDirPath(binding.bundleId), \"record.json\")),\n bundledRecord,\n );\n }\n\n async appendSessionEvent(\n runDir: string,\n binding: FlowSessionBinding,\n direction: AcpMessageDirection,\n message: AcpJsonRpcMessage,\n ): Promise<number> {\n const sessionKey = `${runDir}::${binding.bundleId}`;\n const seq = (this.sessionSeqByBundle.get(sessionKey) ?? 0) + 1;\n this.sessionSeqByBundle.set(sessionKey, seq);\n await this.appendJsonLine(\n this.resolveRunPath(\n runDir,\n path.posix.join(sessionDirPath(binding.bundleId), \"events.ndjson\"),\n ),\n {\n seq,\n at: isoNow(),\n direction,\n message,\n },\n );\n return seq;\n }\n\n private getManifest(runDir: string, state: FlowRunState): FlowRunManifest {\n const existing = this.manifestByRun.get(runDir);\n if (existing) {\n existing.startedAt = state.startedAt;\n existing.finishedAt = state.finishedAt;\n existing.status = state.status;\n existing.flowPath = state.flowPath;\n existing.flowName = state.flowName;\n existing.runTitle = state.runTitle;\n return existing;\n }\n\n const created: FlowRunManifest = {\n schema: FLOW_BUNDLE_SCHEMA,\n runId: state.runId,\n flowName: state.flowName,\n runTitle: state.runTitle,\n flowPath: state.flowPath,\n startedAt: state.startedAt,\n finishedAt: state.finishedAt,\n status: state.status,\n traceSchema: FLOW_TRACE_SCHEMA,\n paths: {\n flow: FLOW_SNAPSHOT_PATH,\n trace: TRACE_PATH,\n runProjection: RUN_PROJECTION_PATH,\n liveProjection: LIVE_PROJECTION_PATH,\n stepsProjection: STEPS_PROJECTION_PATH,\n sessionsDir: SESSIONS_DIR,\n artifactsDir: ARTIFACTS_DIR,\n },\n sessions: [],\n };\n this.manifestByRun.set(runDir, created);\n return created;\n }\n\n private async writeManifest(runDir: string, state: FlowRunState): Promise<void> {\n const manifest = this.getManifest(runDir, state);\n await writeJsonAtomic(this.resolveRunPath(runDir, MANIFEST_PATH), manifest);\n }\n\n private nextTraceSeq(runDir: string): number {\n const next = (this.traceSeqByRun.get(runDir) ?? 0) + 1;\n this.traceSeqByRun.set(runDir, next);\n return next;\n }\n\n private resolveRunPath(runDir: string, relativePath: string): string {\n return path.join(runDir, ...relativePath.split(\"/\"));\n }\n\n private async appendJsonLine(filePath: string, value: unknown): Promise<void> {\n const prior = this.appendChainByPath.get(filePath) ?? Promise.resolve();\n const nextWrite = prior.then(async () => {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.appendFile(filePath, `${JSON.stringify(value)}\\n`, \"utf8\");\n });\n const tracked = nextWrite.finally(() => {\n if (this.appendChainByPath.get(filePath) === tracked) {\n this.appendChainByPath.delete(filePath);\n }\n });\n this.appendChainByPath.set(filePath, tracked);\n await tracked;\n }\n}\n\nfunction createLiveState(state: FlowRunState): FlowLiveState {\n return {\n runId: state.runId,\n flowName: state.flowName,\n runTitle: state.runTitle,\n flowPath: state.flowPath,\n startedAt: state.startedAt,\n finishedAt: state.finishedAt,\n updatedAt: state.updatedAt,\n status: state.status,\n currentNode: state.currentNode,\n currentAttemptId: state.currentAttemptId,\n currentNodeType: state.currentNodeType,\n currentNodeStartedAt: state.currentNodeStartedAt,\n lastHeartbeatAt: state.lastHeartbeatAt,\n statusDetail: state.statusDetail,\n waitingOn: state.waitingOn,\n error: state.error,\n sessionBindings: state.sessionBindings,\n };\n}\n\nfunction createFlowDefinitionSnapshot(flow: FlowDefinition): FlowDefinitionSnapshot {\n return {\n schema: FLOW_SNAPSHOT_SCHEMA,\n name: flow.name,\n ...(flow.run?.title !== undefined ? { run: { hasTitle: true } } : {}),\n ...(flow.permissions ? { permissions: structuredClone(flow.permissions) } : {}),\n startAt: flow.startAt,\n nodes: Object.fromEntries(\n Object.entries(flow.nodes).map(([nodeId, node]) => [nodeId, snapshotNode(node)]),\n ),\n edges: structuredClone(flow.edges),\n };\n}\n\nfunction snapshotNode(node: FlowNodeDefinition) {\n const common = {\n nodeType: node.nodeType,\n ...(node.timeoutMs !== undefined ? { timeoutMs: node.timeoutMs } : {}),\n ...(node.heartbeatMs !== undefined ? { heartbeatMs: node.heartbeatMs } : {}),\n ...(node.statusDetail ? { statusDetail: node.statusDetail } : {}),\n };\n\n switch (node.nodeType) {\n case \"acp\":\n return {\n ...common,\n ...(node.profile ? { profile: node.profile } : {}),\n session: {\n ...(node.session?.handle ? { handle: node.session.handle } : {}),\n ...(node.session?.isolated ? { isolated: true } : {}),\n },\n cwd: snapshotCwd(node.cwd),\n hasPrompt: true,\n hasParse: typeof node.parse === \"function\",\n };\n case \"compute\":\n return {\n ...common,\n hasRun: true,\n };\n case \"action\": {\n const actionExecution: \"shell\" | \"function\" = \"exec\" in node ? \"shell\" : \"function\";\n return {\n ...common,\n actionExecution,\n hasRun: \"run\" in node,\n hasExec: \"exec\" in node,\n hasParse: \"parse\" in node && typeof node.parse === \"function\",\n };\n }\n case \"checkpoint\":\n return {\n ...common,\n ...(node.summary ? { summary: node.summary } : {}),\n hasRun: typeof node.run === \"function\",\n };\n }\n}\n\nfunction snapshotCwd(cwd: AcpNodeDefinition[\"cwd\"]): {\n mode: \"default\" | \"static\" | \"dynamic\";\n value?: string;\n} {\n if (typeof cwd === \"function\") {\n return { mode: \"dynamic\" };\n }\n if (typeof cwd === \"string\") {\n return { mode: \"static\", value: cwd };\n }\n return { mode: \"default\" };\n}\n\nfunction createBundledSessionRecord(\n binding: FlowSessionBinding,\n record: SessionRecord,\n bundleLastSeq: number,\n): SessionRecord {\n return {\n ...structuredClone(record),\n lastSeq: bundleLastSeq,\n eventLog: {\n ...structuredClone(record.eventLog),\n active_path: path.posix.join(sessionDirPath(binding.bundleId), \"events.ndjson\"),\n segment_count: 1,\n max_segments: 1,\n },\n };\n}\n\nasync function writeJsonAtomic(filePath: string, value: unknown): Promise<void> {\n const tempPath = `${filePath}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`;\n const payload = JSON.stringify(value, null, 2);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(tempPath, `${payload}\\n`, \"utf8\");\n await fs.rename(tempPath, filePath);\n}\n\nasync function ensureFile(filePath: string): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.appendFile(filePath, \"\", \"utf8\");\n}\n\nasync function fileSha256(filePath: string): Promise<string> {\n const payload = await fs.readFile(filePath);\n return createHash(\"sha256\").update(payload).digest(\"hex\");\n}\n\nfunction toArtifactBuffer(content: unknown, mediaType: string): Buffer {\n if (typeof content === \"string\") {\n return Buffer.from(content, \"utf8\");\n }\n if (Buffer.isBuffer(content)) {\n return content;\n }\n if (content instanceof Uint8Array) {\n return Buffer.from(content);\n }\n if (mediaType === \"application/json\") {\n return Buffer.from(`${JSON.stringify(content, null, 2)}\\n`, \"utf8\");\n }\n return Buffer.from(String(content), \"utf8\");\n}\n\nfunction normalizeArtifactExtension(extension: string): string {\n if (!extension) {\n return \"\";\n }\n return extension.startsWith(\".\") ? extension : `.${extension}`;\n}\n\nfunction sessionDirPath(bundleId: string): string {\n return path.posix.join(SESSIONS_DIR, bundleId);\n}\n\nfunction isoNow(): string {\n return new Date().toISOString();\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport type { AcpClient } from \"../client.js\";\nimport { createOutputFormatter } from \"../output.js\";\nimport { promptToDisplayText, textPrompt } from \"../prompt-content.js\";\nimport {\n cloneSessionAcpxState,\n createSessionConversation,\n recordClientOperation as recordConversationClientOperation,\n recordPromptSubmission,\n recordSessionUpdate as recordConversationSessionUpdate,\n} from \"../session-conversation-model.js\";\nimport { defaultSessionEventLog } from \"../session-event-log.js\";\nimport { resolveSessionRecord } from \"../session-persistence.js\";\nimport {\n InterruptedError,\n TimeoutError,\n withInterrupt,\n withTimeout,\n} from \"../session-runtime-helpers.js\";\nimport {\n cancelSessionPrompt,\n createSessionWithClient,\n runOnce,\n sendSessionDirect,\n} from \"../session.js\";\nimport { SESSION_RECORD_SCHEMA } from \"../types.js\";\nimport type { PromptInput, SessionRecord } from \"../types.js\";\nimport { acp, action, checkpoint, compute, defineFlow, shell } from \"./definition.js\";\nimport { formatShellActionSummary, runShellAction } from \"./executors/shell.js\";\nimport { resolveNext, resolveNextForOutcome, validateFlowDefinition } from \"./graph.js\";\nimport { FlowRunStore } from \"./store.js\";\nimport type {\n AcpNodeDefinition,\n ActionNodeDefinition,\n CheckpointNodeDefinition,\n ComputeNodeDefinition,\n FlowDefinition,\n FlowNodeCommon,\n FlowNodeContext,\n FlowNodeDefinition,\n FlowStepTrace,\n FlowPermissionRequirements,\n FlowRunResult,\n FlowRunState,\n FlowRunnerOptions,\n FlowSessionBinding,\n FlowEdge,\n FlowStepRecord,\n FlowNodeOutcome,\n FlowNodeResult,\n FunctionActionNodeDefinition,\n ResolvedFlowAgent,\n ShellActionExecution,\n ShellActionNodeDefinition,\n ShellActionResult,\n} from \"./types.js\";\n\nexport { acp, action, checkpoint, compute, defineFlow, shell };\nexport type {\n AcpNodeDefinition,\n ActionNodeDefinition,\n CheckpointNodeDefinition,\n ComputeNodeDefinition,\n FlowDefinition,\n FlowEdge,\n FlowNodeCommon,\n FlowNodeContext,\n FlowNodeDefinition,\n FlowPermissionRequirements,\n FlowNodeOutcome,\n FlowNodeResult,\n FlowRunResult,\n FlowRunState,\n FlowRunnerOptions,\n FlowSessionBinding,\n FlowStepRecord,\n FunctionActionNodeDefinition,\n ResolvedFlowAgent,\n ShellActionExecution,\n ShellActionNodeDefinition,\n ShellActionResult,\n} from \"./types.js\";\n\nconst DEFAULT_FLOW_HEARTBEAT_MS = 5_000;\nconst DEFAULT_FLOW_STEP_TIMEOUT_MS = 15 * 60_000;\n\ntype MemoryWritable = {\n write(chunk: string): void;\n};\n\ntype FlowNodeExecutionResult = {\n output: unknown;\n promptText: string | null;\n rawText: string | null;\n sessionInfo: FlowSessionBinding | null;\n agentInfo: ResolvedFlowAgent | null;\n trace: FlowStepTrace | null;\n};\n\ntype TracedPromptResult = {\n rawText: string;\n sessionInfo: FlowSessionBinding;\n conversation: {\n sessionId: string;\n messageStart: number;\n messageEnd: number;\n eventStartSeq: number;\n eventEndSeq: number;\n };\n};\n\nexport class FlowRunner {\n private readonly resolveAgent;\n private readonly defaultCwd;\n private readonly permissionMode;\n private readonly mcpServers?;\n private readonly nonInteractivePermissions?;\n private readonly authCredentials?;\n private readonly authPolicy?;\n private readonly timeoutMs?;\n private readonly defaultNodeTimeoutMs;\n private readonly verbose?;\n private readonly suppressSdkConsoleErrors?;\n private readonly sessionOptions?;\n private readonly services;\n private readonly store;\n private readonly pendingPersistentSessionClients = new Map<string, AcpClient>();\n\n constructor(options: FlowRunnerOptions) {\n this.resolveAgent = options.resolveAgent;\n this.defaultCwd = options.resolveAgent(undefined).cwd;\n this.permissionMode = options.permissionMode;\n this.mcpServers = options.mcpServers;\n this.nonInteractivePermissions = options.nonInteractivePermissions;\n this.authCredentials = options.authCredentials;\n this.authPolicy = options.authPolicy;\n this.timeoutMs = options.timeoutMs;\n this.defaultNodeTimeoutMs =\n options.defaultNodeTimeoutMs ?? options.timeoutMs ?? DEFAULT_FLOW_STEP_TIMEOUT_MS;\n this.verbose = options.verbose;\n this.suppressSdkConsoleErrors = options.suppressSdkConsoleErrors;\n this.sessionOptions = options.sessionOptions;\n this.services = options.services ?? {};\n this.store = new FlowRunStore(options.outputRoot);\n }\n\n async run(\n flow: FlowDefinition,\n input: unknown,\n options: { flowPath?: string } = {},\n ): Promise<FlowRunResult> {\n validateFlowDefinition(flow);\n\n const runId = createRunId(flow.name);\n const runTitle = await resolveFlowRunTitle(flow, input, options.flowPath);\n const runDir = await this.store.createRunDir(runId);\n const state: FlowRunState = {\n runId,\n flowName: flow.name,\n runTitle,\n flowPath: options.flowPath,\n startedAt: isoNow(),\n updatedAt: isoNow(),\n status: \"running\",\n input,\n outputs: {},\n results: {},\n steps: [],\n sessionBindings: {},\n };\n const inputArtifact = await this.store.writeArtifact(runDir, state, input, {\n mediaType: \"application/json\",\n extension: \"json\",\n emitTrace: false,\n });\n await this.store.initializeRunBundle(runDir, {\n flow,\n state,\n inputArtifact,\n });\n\n let current: string | null = flow.startAt;\n const attemptCounts = new Map<string, number>();\n\n try {\n return await withInterrupt(\n async () => {\n try {\n while (current) {\n const node = flow.nodes[current];\n if (!node) {\n throw new Error(`Unknown flow node: ${current}`);\n }\n\n const attemptId = nextAttemptId(attemptCounts, current);\n const startedAt = isoNow();\n const context = this.makeContext(state, input);\n let output: unknown;\n let promptText: string | null = null;\n let rawText: string | null = null;\n let sessionInfo: FlowSessionBinding | null = null;\n let agentInfo: ResolvedFlowAgent | null = null;\n let trace: FlowStepTrace | null = null;\n this.markNodeStarted(\n state,\n current,\n attemptId,\n node.nodeType,\n startedAt,\n node.statusDetail,\n );\n await this.store.writeSnapshot(runDir, state, {\n scope: \"node\",\n type: \"node_started\",\n nodeId: current,\n attemptId,\n payload: {\n nodeType: node.nodeType,\n ...(node.timeoutMs !== undefined\n ? { timeoutMs: node.timeoutMs ?? this.defaultNodeTimeoutMs }\n : { timeoutMs: this.defaultNodeTimeoutMs }),\n ...(state.statusDetail ? { statusDetail: state.statusDetail } : {}),\n },\n });\n let nodeResult: FlowNodeResult | undefined;\n let executionError: unknown;\n try {\n ({ output, promptText, rawText, sessionInfo, agentInfo, trace } =\n await this.executeNode(runDir, state, flow, current, node, context));\n trace = await this.finalizeStepTrace(\n runDir,\n state,\n current,\n attemptId,\n output,\n trace,\n );\n nodeResult = createNodeResult({\n attemptId,\n nodeId: current,\n nodeType: node.nodeType,\n outcome: \"ok\",\n startedAt,\n finishedAt: isoNow(),\n output,\n });\n } catch (error) {\n executionError = error;\n trace = extractAttachedStepTrace(error) ?? trace;\n trace = await this.finalizeStepTrace(\n runDir,\n state,\n current,\n attemptId,\n undefined,\n trace,\n );\n nodeResult = createNodeResult({\n attemptId,\n nodeId: current,\n nodeType: node.nodeType,\n outcome: outcomeForError(error),\n startedAt,\n finishedAt: isoNow(),\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n state.results[current] = nodeResult;\n\n if (nodeResult.outcome === \"ok\" && node.nodeType === \"checkpoint\") {\n state.outputs[current] = output;\n state.waitingOn = current;\n state.updatedAt = isoNow();\n state.status = \"waiting\";\n this.clearActiveNode(\n state,\n (output as { summary?: string } | null)?.summary ?? current,\n );\n state.steps.push({\n attemptId,\n nodeId: current,\n nodeType: node.nodeType,\n outcome: nodeResult.outcome,\n startedAt,\n finishedAt: nodeResult.finishedAt,\n promptText,\n rawText,\n output,\n session: null,\n agent: null,\n ...(trace ? { trace } : {}),\n });\n await this.store.writeSnapshot(runDir, state, {\n scope: \"node\",\n type: \"node_outcome\",\n nodeId: current,\n attemptId,\n payload: createNodeOutcomePayload(nodeResult, trace),\n });\n return {\n runDir,\n state,\n };\n }\n\n if (nodeResult.outcome === \"ok\") {\n state.outputs[current] = output;\n }\n state.updatedAt = isoNow();\n this.clearActiveNode(state);\n state.steps.push({\n attemptId,\n nodeId: current,\n nodeType: node.nodeType,\n outcome: nodeResult.outcome,\n startedAt,\n finishedAt: nodeResult.finishedAt,\n promptText,\n rawText,\n output,\n error: nodeResult.error,\n session: sessionInfo,\n agent: agentInfo,\n ...(trace ? { trace } : {}),\n });\n\n await this.store.writeSnapshot(runDir, state, {\n scope: \"node\",\n type: \"node_outcome\",\n nodeId: current,\n attemptId,\n payload: createNodeOutcomePayload(nodeResult, trace),\n });\n\n if (nodeResult.outcome === \"ok\") {\n current = resolveNext(flow.edges, current, output, nodeResult);\n continue;\n }\n\n const next = resolveNextForOutcome(flow.edges, current, nodeResult);\n if (next) {\n current = next;\n continue;\n }\n\n throw executionError;\n }\n\n state.status = \"completed\";\n state.finishedAt = isoNow();\n state.updatedAt = state.finishedAt;\n this.clearActiveNode(state);\n await this.store.writeSnapshot(runDir, state, {\n scope: \"run\",\n type: \"run_completed\",\n payload: {\n status: state.status,\n },\n });\n return {\n runDir,\n state,\n };\n } catch (error) {\n await this.persistRunFailure(runDir, state, error);\n throw error;\n }\n },\n async () => {\n await this.persistRunFailure(runDir, state, new InterruptedError());\n },\n );\n } finally {\n await this.closePendingPersistentSessionClients();\n }\n }\n\n private async persistRunFailure(\n runDir: string,\n state: FlowRunState,\n error: unknown,\n ): Promise<void> {\n if (\n state.finishedAt !== undefined &&\n (state.status === \"failed\" || state.status === \"timed_out\")\n ) {\n return;\n }\n state.status = error instanceof TimeoutError ? \"timed_out\" : \"failed\";\n state.updatedAt = isoNow();\n state.finishedAt = state.updatedAt;\n state.error = error instanceof Error ? error.message : String(error);\n state.statusDetail = state.currentNode\n ? `Failed in ${state.currentNode}: ${state.error}`\n : state.error;\n await this.store.writeSnapshot(runDir, state, {\n scope: \"run\",\n type: \"run_failed\",\n payload: {\n status: state.status,\n error: state.error,\n },\n });\n }\n\n private makeContext(state: FlowRunState, input: unknown): FlowNodeContext {\n return {\n input,\n outputs: state.outputs,\n results: state.results,\n state,\n services: this.services,\n };\n }\n\n private async executeNode(\n runDir: string,\n state: FlowRunState,\n flow: FlowDefinition,\n nodeId: string,\n node: FlowNodeDefinition,\n context: FlowNodeContext,\n ): Promise<FlowNodeExecutionResult> {\n switch (node.nodeType) {\n case \"compute\":\n return await this.executeComputeNode(runDir, state, node, context);\n case \"action\":\n return await this.executeActionNode(runDir, state, node, context);\n case \"checkpoint\":\n return await this.executeCheckpointNode(runDir, state, nodeId, node, context);\n case \"acp\":\n return await this.executeAcpNode(runDir, state, flow, node, context);\n default: {\n const exhaustive: never = node;\n throw new Error(`Unsupported flow node: ${String(exhaustive)}`);\n }\n }\n }\n\n private async executeComputeNode(\n runDir: string,\n state: FlowRunState,\n node: ComputeNodeDefinition,\n context: FlowNodeContext,\n ): Promise<FlowNodeExecutionResult> {\n const nodeTimeoutMs = node.timeoutMs ?? this.defaultNodeTimeoutMs;\n const output = await this.runWithHeartbeat(\n runDir,\n state,\n state.currentNode ?? \"\",\n node,\n nodeTimeoutMs,\n async () => await Promise.resolve(node.run(context)),\n );\n return {\n output,\n promptText: null,\n rawText: null,\n sessionInfo: null,\n agentInfo: null,\n trace: null,\n };\n }\n\n private async executeActionNode(\n runDir: string,\n state: FlowRunState,\n node: ActionNodeDefinition,\n context: FlowNodeContext,\n ): Promise<FlowNodeExecutionResult> {\n const nodeTimeoutMs = node.timeoutMs ?? this.defaultNodeTimeoutMs;\n if (\"run\" in node) {\n const output = await this.runWithHeartbeat(\n runDir,\n state,\n state.currentNode ?? \"\",\n node,\n nodeTimeoutMs,\n async () => await Promise.resolve(node.run(context)),\n );\n return {\n output,\n promptText: null,\n rawText: null,\n sessionInfo: null,\n agentInfo: null,\n trace: {\n action: {\n actionType: \"function\",\n },\n },\n };\n }\n\n const { output, rawText, trace } = await this.runWithHeartbeat(\n runDir,\n state,\n state.currentNode ?? \"\",\n node,\n nodeTimeoutMs,\n async () => {\n const execution = await Promise.resolve(node.exec(context));\n const effectiveExecution: ShellActionExecution = {\n ...execution,\n cwd: resolveShellActionCwd(this.defaultCwd, execution.cwd),\n timeoutMs: execution.timeoutMs ?? nodeTimeoutMs,\n };\n this.updateStatusDetail(state, formatShellActionSummary(effectiveExecution));\n await this.store.writeLive(runDir, state, {\n scope: \"node\",\n type: \"node_heartbeat\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n payload: {\n statusDetail: state.statusDetail,\n },\n });\n await this.store.appendTrace(runDir, state, {\n scope: \"action\",\n type: \"action_prepared\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n payload: {\n action: {\n actionType: \"shell\",\n command: effectiveExecution.command,\n args: effectiveExecution.args ?? [],\n cwd: effectiveExecution.cwd,\n },\n },\n });\n const result = await runShellAction(effectiveExecution);\n const stdoutArtifact = await this.store.writeArtifact(runDir, state, result.stdout, {\n mediaType: \"text/plain\",\n extension: \"txt\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n });\n const stderrArtifact = await this.store.writeArtifact(runDir, state, result.stderr, {\n mediaType: \"text/plain\",\n extension: \"txt\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n });\n await this.store.appendTrace(runDir, state, {\n scope: \"action\",\n type: \"action_completed\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n payload: {\n action: {\n actionType: \"shell\",\n command: result.command,\n args: result.args,\n cwd: result.cwd,\n exitCode: result.exitCode,\n signal: result.signal,\n durationMs: result.durationMs,\n },\n stdoutArtifact,\n stderrArtifact,\n },\n });\n const trace: FlowStepTrace = {\n action: {\n actionType: \"shell\",\n command: result.command,\n args: result.args,\n cwd: result.cwd,\n exitCode: result.exitCode,\n signal: result.signal,\n durationMs: result.durationMs,\n },\n stdoutArtifact,\n stderrArtifact,\n };\n let parsedOutput: unknown;\n try {\n parsedOutput = node.parse ? await node.parse(result, context) : result;\n } catch (error) {\n throw attachStepTrace(error, trace);\n }\n return {\n output: parsedOutput,\n rawText: result.combinedOutput,\n trace,\n };\n },\n );\n return {\n output,\n promptText: null,\n rawText,\n sessionInfo: null,\n agentInfo: null,\n trace,\n };\n }\n\n private async executeCheckpointNode(\n runDir: string,\n state: FlowRunState,\n nodeId: string,\n node: CheckpointNodeDefinition,\n context: FlowNodeContext,\n ): Promise<FlowNodeExecutionResult> {\n const nodeTimeoutMs = node.timeoutMs ?? this.defaultNodeTimeoutMs;\n const output =\n typeof node.run === \"function\"\n ? await this.runWithHeartbeat(\n runDir,\n state,\n state.currentNode ?? \"\",\n node,\n nodeTimeoutMs,\n async () => await Promise.resolve(node.run?.(context)),\n )\n : {\n checkpoint: nodeId,\n summary: node.summary ?? nodeId,\n };\n return {\n output,\n promptText: null,\n rawText: null,\n sessionInfo: null,\n agentInfo: null,\n trace: null,\n };\n }\n\n private async executeAcpNode(\n runDir: string,\n state: FlowRunState,\n flow: FlowDefinition,\n node: AcpNodeDefinition,\n context: FlowNodeContext,\n ): Promise<FlowNodeExecutionResult> {\n const nodeTimeoutMs = node.timeoutMs ?? this.defaultNodeTimeoutMs;\n let boundSession: FlowSessionBinding | null = null;\n return await this.runWithHeartbeat(\n runDir,\n state,\n state.currentNode ?? \"\",\n node,\n nodeTimeoutMs,\n async () => {\n const resolvedAgent = this.resolveAgent(node.profile);\n const agentInfo = {\n ...resolvedAgent,\n cwd: await resolveNodeCwd(resolvedAgent.cwd, node.cwd, context),\n };\n const prompt = normalizePromptInput(await Promise.resolve(node.prompt(context)));\n const promptText = promptToDisplayText(prompt);\n this.updateStatusDetail(state, summarizePrompt(promptText, node.statusDetail));\n await this.store.writeLive(runDir, state, {\n scope: \"node\",\n type: \"node_heartbeat\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n payload: {\n statusDetail: state.statusDetail,\n },\n });\n const promptArtifact = await this.store.writeArtifact(runDir, state, promptText, {\n mediaType: \"text/plain\",\n extension: \"txt\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n });\n\n if (node.session?.isolated) {\n const isolatedBinding = createIsolatedSessionBinding(\n flow.name,\n state.runId,\n state.currentAttemptId ?? randomUUID(),\n node.profile,\n agentInfo,\n );\n const initialIsolatedRecord = createSyntheticSessionRecord({\n binding: isolatedBinding,\n createdAt: state.currentNodeStartedAt ?? isoNow(),\n updatedAt: state.currentNodeStartedAt ?? isoNow(),\n conversation: createSessionConversation(state.currentNodeStartedAt ?? isoNow()),\n acpxState: undefined,\n lastSeq: 0,\n });\n await this.store.ensureSessionBundle(\n runDir,\n state,\n isolatedBinding,\n initialIsolatedRecord,\n );\n await this.store.appendTrace(runDir, state, {\n scope: \"acp\",\n type: \"acp_prompt_prepared\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n sessionId: isolatedBinding.bundleId,\n payload: {\n sessionId: isolatedBinding.bundleId,\n promptArtifact,\n },\n });\n const isolatedPrompt = await this.runIsolatedPrompt(\n runDir,\n state,\n isolatedBinding,\n agentInfo,\n prompt,\n nodeTimeoutMs,\n );\n const rawResponseArtifact = await this.store.writeArtifact(\n runDir,\n state,\n isolatedPrompt.rawText,\n {\n mediaType: \"text/plain\",\n extension: \"txt\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n sessionId: isolatedBinding.bundleId,\n },\n );\n await this.store.appendTrace(runDir, state, {\n scope: \"acp\",\n type: \"acp_response_parsed\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n sessionId: isolatedBinding.bundleId,\n payload: {\n sessionId: isolatedBinding.bundleId,\n conversation: isolatedPrompt.conversation,\n rawResponseArtifact,\n },\n });\n const trace: FlowStepTrace = {\n sessionId: isolatedBinding.bundleId,\n promptArtifact,\n rawResponseArtifact,\n conversation: isolatedPrompt.conversation,\n };\n let parsedOutput: unknown;\n try {\n parsedOutput = node.parse\n ? await node.parse(isolatedPrompt.rawText, context)\n : isolatedPrompt.rawText;\n } catch (error) {\n throw attachStepTrace(error, trace);\n }\n return {\n output: parsedOutput,\n promptText,\n rawText: isolatedPrompt.rawText,\n sessionInfo: isolatedBinding,\n agentInfo,\n trace,\n };\n }\n\n boundSession = await this.ensureSessionBinding(\n runDir,\n state,\n flow,\n node,\n agentInfo,\n nodeTimeoutMs,\n );\n await this.store.appendTrace(runDir, state, {\n scope: \"acp\",\n type: \"acp_prompt_prepared\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n sessionId: boundSession.bundleId,\n payload: {\n sessionId: boundSession.bundleId,\n promptArtifact,\n },\n });\n const persistentPrompt = await this.runPersistentPrompt(\n runDir,\n state,\n boundSession,\n prompt,\n nodeTimeoutMs,\n );\n const rawResponseArtifact = await this.store.writeArtifact(\n runDir,\n state,\n persistentPrompt.rawText,\n {\n mediaType: \"text/plain\",\n extension: \"txt\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n sessionId: persistentPrompt.sessionInfo.bundleId,\n },\n );\n await this.store.appendTrace(runDir, state, {\n scope: \"acp\",\n type: \"acp_response_parsed\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n sessionId: persistentPrompt.sessionInfo.bundleId,\n payload: {\n sessionId: persistentPrompt.sessionInfo.bundleId,\n conversation: persistentPrompt.conversation,\n rawResponseArtifact,\n },\n });\n const trace: FlowStepTrace = {\n sessionId: persistentPrompt.sessionInfo.bundleId,\n promptArtifact,\n rawResponseArtifact,\n conversation: persistentPrompt.conversation,\n };\n let parsedOutput: unknown;\n try {\n parsedOutput = node.parse\n ? await node.parse(persistentPrompt.rawText, context)\n : persistentPrompt.rawText;\n } catch (error) {\n throw attachStepTrace(error, trace);\n }\n return {\n output: parsedOutput,\n promptText,\n rawText: persistentPrompt.rawText,\n sessionInfo: persistentPrompt.sessionInfo,\n agentInfo,\n trace,\n };\n },\n async () => {\n if (!boundSession) {\n return;\n }\n await cancelSessionPrompt({\n sessionId: boundSession.acpxRecordId,\n });\n },\n );\n }\n\n private markNodeStarted(\n state: FlowRunState,\n nodeId: string,\n attemptId: string,\n nodeType: FlowNodeDefinition[\"nodeType\"],\n startedAt: string,\n detail?: string,\n ): void {\n state.status = \"running\";\n state.waitingOn = undefined;\n state.currentNode = nodeId;\n state.currentAttemptId = attemptId;\n state.currentNodeType = nodeType;\n state.currentNodeStartedAt = startedAt;\n state.lastHeartbeatAt = startedAt;\n state.statusDetail = detail ?? `Running ${nodeType} node ${nodeId}`;\n }\n\n private clearActiveNode(state: FlowRunState, detail?: string): void {\n state.currentNode = undefined;\n state.currentAttemptId = undefined;\n state.currentNodeType = undefined;\n state.currentNodeStartedAt = undefined;\n state.lastHeartbeatAt = undefined;\n state.statusDetail = detail;\n }\n\n private updateStatusDetail(state: FlowRunState, detail?: string): void {\n if (!detail) {\n return;\n }\n state.statusDetail = detail;\n }\n\n private async finalizeStepTrace(\n runDir: string,\n state: FlowRunState,\n nodeId: string,\n attemptId: string,\n output: unknown,\n baseTrace: FlowStepTrace | null,\n ): Promise<FlowStepTrace | null> {\n const trace: FlowStepTrace = baseTrace ? structuredClone(baseTrace) : {};\n if (output !== undefined) {\n const inlineOutput = toInlineOutput(output);\n if (inlineOutput !== undefined) {\n trace.outputInline = inlineOutput;\n } else {\n trace.outputArtifact = await this.store.writeArtifact(runDir, state, output, {\n mediaType: outputArtifactMediaType(output),\n extension: outputArtifactExtension(output),\n nodeId,\n attemptId,\n });\n }\n }\n return Object.keys(trace).length > 0 ? trace : null;\n }\n\n private async runWithHeartbeat<T>(\n runDir: string,\n state: FlowRunState,\n nodeId: string,\n node: FlowNodeCommon,\n timeoutMs: number | undefined,\n run: () => Promise<T>,\n onTimeout?: () => Promise<void>,\n ): Promise<T> {\n const heartbeatMs = Math.max(0, Math.round(node.heartbeatMs ?? DEFAULT_FLOW_HEARTBEAT_MS));\n let timer: NodeJS.Timeout | undefined;\n let active = true;\n const heartbeat = async (): Promise<void> => {\n if (!active) {\n return;\n }\n state.lastHeartbeatAt = isoNow();\n state.updatedAt = state.lastHeartbeatAt;\n await this.store.writeLive(runDir, state, {\n scope: \"node\",\n type: \"node_heartbeat\",\n nodeId,\n attemptId: state.currentAttemptId,\n payload: {\n statusDetail: state.statusDetail,\n },\n });\n };\n\n if (heartbeatMs > 0) {\n timer = setInterval(() => {\n void heartbeat();\n }, heartbeatMs);\n }\n\n try {\n return await withTimeout(run(), timeoutMs);\n } catch (error) {\n if (error instanceof TimeoutError && onTimeout) {\n await onTimeout().catch(() => {\n // best effort cancellation only\n });\n }\n throw error;\n } finally {\n active = false;\n if (timer) {\n clearInterval(timer);\n }\n }\n }\n\n private async ensureSessionBinding(\n runDir: string,\n state: FlowRunState,\n flow: FlowDefinition,\n node: AcpNodeDefinition,\n agent: ResolvedFlowAgent,\n timeoutMs: number | undefined,\n ): Promise<FlowSessionBinding> {\n const handle = node.session?.handle ?? \"main\";\n const key = createSessionBindingKey(agent.agentCommand, agent.cwd, handle);\n const existing = state.sessionBindings[key];\n if (existing) {\n await this.store.ensureSessionBundle(runDir, state, existing);\n return existing;\n }\n\n const name = createSessionName(flow.name, handle, agent.cwd, state.runId);\n const created = await createSessionWithClient({\n agentCommand: agent.agentCommand,\n cwd: agent.cwd,\n name,\n mcpServers: this.mcpServers,\n permissionMode: this.permissionMode,\n nonInteractivePermissions: this.nonInteractivePermissions,\n authCredentials: this.authCredentials,\n authPolicy: this.authPolicy,\n timeoutMs,\n verbose: this.verbose,\n sessionOptions: this.sessionOptions,\n });\n\n const binding: FlowSessionBinding = {\n key,\n handle,\n bundleId: createSessionBundleId(handle, key),\n name,\n profile: node.profile,\n agentName: agent.agentName,\n agentCommand: agent.agentCommand,\n cwd: agent.cwd,\n acpxRecordId: created.record.acpxRecordId,\n acpSessionId: created.record.acpSessionId,\n agentSessionId: created.record.agentSessionId,\n };\n state.sessionBindings[key] = binding;\n this.pendingPersistentSessionClients.set(binding.key, created.client);\n await this.store.ensureSessionBundle(runDir, state, binding, created.record);\n return binding;\n }\n\n private async refreshSessionBinding(binding: FlowSessionBinding): Promise<FlowSessionBinding> {\n const record = await resolveSessionRecord(binding.acpxRecordId);\n return {\n ...binding,\n acpSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n };\n }\n\n private async runPersistentPrompt(\n runDir: string,\n state: FlowRunState,\n binding: FlowSessionBinding,\n prompt: PromptInput,\n timeoutMs?: number,\n ): Promise<TracedPromptResult> {\n const capture = createQuietCaptureOutput();\n const beforeRecord = await resolveSessionRecord(binding.acpxRecordId);\n let eventStartSeq: number | undefined;\n let eventEndSeq: number | undefined;\n const pendingEventWrites: Promise<void>[] = [];\n const initialClient = this.pendingPersistentSessionClients.get(binding.key);\n if (initialClient) {\n this.pendingPersistentSessionClients.delete(binding.key);\n }\n\n try {\n await sendSessionDirect({\n sessionId: binding.acpxRecordId,\n prompt,\n resumePolicy: \"same-session-only\",\n mcpServers: this.mcpServers,\n permissionMode: this.permissionMode,\n nonInteractivePermissions: this.nonInteractivePermissions,\n authCredentials: this.authCredentials,\n authPolicy: this.authPolicy,\n outputFormatter: capture.formatter,\n onAcpMessage: (direction, message) => {\n const pending = this.store\n .appendSessionEvent(runDir, binding, direction, message)\n .then((seq) => {\n eventStartSeq = eventStartSeq === undefined ? seq : Math.min(eventStartSeq, seq);\n eventEndSeq = eventEndSeq === undefined ? seq : Math.max(eventEndSeq, seq);\n });\n pendingEventWrites.push(pending);\n },\n suppressSdkConsoleErrors: this.suppressSdkConsoleErrors,\n timeoutMs,\n verbose: this.verbose,\n client: initialClient,\n });\n await Promise.all(pendingEventWrites);\n const sessionInfo = await this.refreshSessionBinding(binding);\n state.sessionBindings[sessionInfo.key] = sessionInfo;\n await this.store.ensureSessionBundle(runDir, state, sessionInfo);\n const afterRecord = await resolveSessionRecord(sessionInfo.acpxRecordId);\n await this.store.writeSessionRecord(runDir, state, sessionInfo, afterRecord);\n const messageStartResolved = findConversationDeltaStart(\n beforeRecord.messages,\n afterRecord.messages,\n );\n\n return {\n rawText: capture.read(),\n sessionInfo,\n conversation: {\n sessionId: sessionInfo.bundleId,\n messageStart: messageStartResolved,\n messageEnd: Math.max(messageStartResolved, afterRecord.messages.length - 1),\n eventStartSeq:\n eventStartSeq ??\n (() => {\n throw new Error(`Missing ACP event capture for session ${sessionInfo.bundleId}`);\n })(),\n eventEndSeq:\n eventEndSeq ??\n (() => {\n throw new Error(`Missing ACP event capture for session ${sessionInfo.bundleId}`);\n })(),\n },\n };\n } finally {\n if (initialClient) {\n await initialClient.close().catch(() => {\n // best effort cleanup; persisted session state already exists\n });\n }\n }\n }\n\n private async closePendingPersistentSessionClients(): Promise<void> {\n const pendingClients = [...this.pendingPersistentSessionClients.values()];\n this.pendingPersistentSessionClients.clear();\n await Promise.all(\n pendingClients.map(async (client) => {\n await client.close().catch(() => {\n // best effort on flow shutdown\n });\n }),\n );\n }\n\n private async runIsolatedPrompt(\n runDir: string,\n state: FlowRunState,\n binding: FlowSessionBinding,\n agent: ResolvedFlowAgent,\n prompt: PromptInput,\n timeoutMs?: number,\n ): Promise<TracedPromptResult> {\n const capture = createQuietCaptureOutput();\n const conversation = createSessionConversation(state.currentNodeStartedAt ?? isoNow());\n let acpxState: SessionRecord[\"acpx\"] | undefined;\n recordPromptSubmission(conversation, prompt, state.currentNodeStartedAt ?? isoNow());\n let eventStartSeq: number | undefined;\n let eventEndSeq: number | undefined;\n const pendingEventWrites: Promise<void>[] = [];\n const result = await runOnce({\n agentCommand: agent.agentCommand,\n cwd: agent.cwd,\n prompt,\n mcpServers: this.mcpServers,\n permissionMode: this.permissionMode,\n nonInteractivePermissions: this.nonInteractivePermissions,\n authCredentials: this.authCredentials,\n authPolicy: this.authPolicy,\n outputFormatter: capture.formatter,\n onAcpMessage: (direction, message) => {\n const pending = this.store\n .appendSessionEvent(runDir, binding, direction, message)\n .then((seq) => {\n eventStartSeq = eventStartSeq === undefined ? seq : Math.min(eventStartSeq, seq);\n eventEndSeq = eventEndSeq === undefined ? seq : Math.max(eventEndSeq, seq);\n });\n pendingEventWrites.push(pending);\n },\n onSessionUpdate: (notification) => {\n acpxState = recordConversationSessionUpdate(conversation, acpxState, notification);\n },\n onClientOperation: (operation) => {\n acpxState = recordConversationClientOperation(conversation, acpxState, operation);\n },\n suppressSdkConsoleErrors: this.suppressSdkConsoleErrors,\n timeoutMs,\n verbose: this.verbose,\n sessionOptions: this.sessionOptions,\n });\n await Promise.all(pendingEventWrites);\n const sessionInfo: FlowSessionBinding = {\n ...binding,\n acpxRecordId: result.sessionId,\n acpSessionId: result.sessionId,\n };\n await this.store.ensureSessionBundle(runDir, state, sessionInfo);\n const syntheticRecord = createSyntheticSessionRecord({\n binding: sessionInfo,\n createdAt: state.currentNodeStartedAt ?? isoNow(),\n updatedAt: conversation.updated_at,\n conversation,\n acpxState: cloneSessionAcpxState(acpxState),\n lastSeq: eventEndSeq ?? 0,\n });\n await this.store.writeSessionRecord(runDir, state, sessionInfo, syntheticRecord);\n return {\n rawText: capture.read(),\n sessionInfo,\n conversation: {\n sessionId: sessionInfo.bundleId,\n messageStart: 0,\n messageEnd: Math.max(0, conversation.messages.length - 1),\n eventStartSeq:\n eventStartSeq ??\n (() => {\n throw new Error(`Missing ACP event capture for session ${sessionInfo.bundleId}`);\n })(),\n eventEndSeq:\n eventEndSeq ??\n (() => {\n throw new Error(`Missing ACP event capture for session ${sessionInfo.bundleId}`);\n })(),\n },\n };\n }\n}\n\nfunction normalizePromptInput(prompt: PromptInput | string): PromptInput {\n return typeof prompt === \"string\" ? textPrompt(prompt) : prompt;\n}\n\nasync function resolveNodeCwd(\n defaultCwd: string,\n cwd: AcpNodeDefinition[\"cwd\"],\n context: FlowNodeContext,\n): Promise<string> {\n if (typeof cwd === \"function\") {\n const resolved = (await cwd(context)) ?? defaultCwd;\n return path.resolve(defaultCwd, resolved);\n }\n return path.resolve(defaultCwd, cwd ?? defaultCwd);\n}\n\nfunction resolveShellActionCwd(defaultCwd: string, cwd: string | undefined): string {\n return path.resolve(defaultCwd, cwd ?? defaultCwd);\n}\n\nfunction summarizePrompt(promptText: string, explicitDetail?: string): string {\n if (explicitDetail) {\n return explicitDetail;\n }\n\n const line = promptText\n .split(\"\\n\")\n .map((candidate) => candidate.trim())\n .find((candidate) => candidate.length > 0);\n\n if (!line) {\n return \"Running ACP prompt\";\n }\n\n const truncated = line.length > 120 ? `${line.slice(0, 117)}...` : line;\n return `ACP: ${truncated}`;\n}\n\nfunction createQuietCaptureOutput(): {\n formatter: ReturnType<typeof createOutputFormatter>;\n read: () => string;\n} {\n const chunks: string[] = [];\n const stdout: MemoryWritable = {\n write(chunk: string) {\n chunks.push(chunk);\n },\n };\n\n return {\n formatter: createOutputFormatter(\"quiet\", {\n stdout,\n }),\n read: () => chunks.join(\"\").trim(),\n };\n}\n\nasync function resolveFlowRunTitle(\n flow: FlowDefinition,\n input: unknown,\n flowPath?: string,\n): Promise<string | undefined> {\n const titleDefinition = flow.run?.title;\n if (titleDefinition === undefined) {\n return undefined;\n }\n\n const resolved =\n typeof titleDefinition === \"function\"\n ? await Promise.resolve(titleDefinition({ input, flowName: flow.name, flowPath }))\n : titleDefinition;\n\n return normalizeFlowRunTitle(resolved);\n}\n\nfunction normalizeFlowRunTitle(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction createRunId(flowName: string): string {\n const stamp = isoNow().replaceAll(\":\", \"\").replaceAll(\".\", \"\");\n const slug = flowName\n .replace(/[^a-z0-9]+/gi, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase();\n return `${stamp}-${slug}-${randomUUID().slice(0, 8)}`;\n}\n\nfunction createSessionBindingKey(agentCommand: string, cwd: string, handle: string): string {\n return `${agentCommand}::${cwd}::${handle}`;\n}\n\nfunction createSessionName(flowName: string, handle: string, cwd: string, runId: string): string {\n const stamp = stableShortHash(cwd);\n return `${flowName}-${handle}-${stamp}-${runId.slice(-8)}`;\n}\n\nfunction createSessionBundleId(handle: string, key: string): string {\n const safeHandle = handle\n .replace(/[^a-z0-9]+/gi, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase();\n return `${safeHandle || \"session\"}-${stableShortHash(key)}`;\n}\n\nfunction createIsolatedSessionBinding(\n flowName: string,\n runId: string,\n attemptId: string,\n profile: string | undefined,\n agent: ResolvedFlowAgent,\n): FlowSessionBinding {\n const key = `isolated::${attemptId}`;\n const handle = \"isolated\";\n return {\n key,\n handle,\n bundleId: createSessionBundleId(`${handle}-${attemptId}`, `${key}::${agent.cwd}`),\n name: `${flowName}-${attemptId}-${runId.slice(-8)}`,\n profile,\n agentName: agent.agentName,\n agentCommand: agent.agentCommand,\n cwd: agent.cwd,\n acpxRecordId: key,\n acpSessionId: key,\n };\n}\n\nfunction createSyntheticSessionRecord(options: {\n binding: FlowSessionBinding;\n createdAt: string;\n updatedAt: string;\n conversation: ReturnType<typeof createSessionConversation>;\n acpxState: SessionRecord[\"acpx\"] | undefined;\n lastSeq: number;\n}): SessionRecord {\n return {\n schema: SESSION_RECORD_SCHEMA,\n acpxRecordId: options.binding.acpxRecordId,\n acpSessionId: options.binding.acpSessionId,\n agentSessionId: options.binding.agentSessionId,\n agentCommand: options.binding.agentCommand,\n cwd: options.binding.cwd,\n name: options.binding.name,\n createdAt: options.createdAt,\n lastUsedAt: options.updatedAt,\n lastSeq: options.lastSeq,\n lastRequestId: undefined,\n eventLog: defaultSessionEventLog(options.binding.acpxRecordId),\n closed: true,\n closedAt: options.updatedAt,\n title: options.conversation.title,\n messages: options.conversation.messages,\n updated_at: options.conversation.updated_at,\n cumulative_token_usage: options.conversation.cumulative_token_usage,\n request_token_usage: options.conversation.request_token_usage,\n acpx: options.acpxState,\n };\n}\n\nfunction createNodeResult(options: {\n attemptId: string;\n nodeId: string;\n nodeType: FlowNodeDefinition[\"nodeType\"];\n outcome: FlowNodeOutcome;\n startedAt: string;\n finishedAt: string;\n output?: unknown;\n error?: string;\n}): FlowNodeResult {\n return {\n attemptId: options.attemptId,\n nodeId: options.nodeId,\n nodeType: options.nodeType,\n outcome: options.outcome,\n startedAt: options.startedAt,\n finishedAt: options.finishedAt,\n durationMs: new Date(options.finishedAt).getTime() - new Date(options.startedAt).getTime(),\n output: options.output,\n error: options.error,\n };\n}\n\nfunction outcomeForError(error: unknown): FlowNodeOutcome {\n if (error instanceof TimeoutError) {\n return \"timed_out\";\n }\n if (error instanceof InterruptedError) {\n return \"cancelled\";\n }\n return \"failed\";\n}\n\nfunction stableShortHash(value: string): string {\n return createHash(\"sha1\").update(value).digest(\"hex\").slice(0, 8);\n}\n\nfunction nextAttemptId(attemptCounts: Map<string, number>, nodeId: string): string {\n const next = (attemptCounts.get(nodeId) ?? 0) + 1;\n attemptCounts.set(nodeId, next);\n return `${nodeId}#${next}`;\n}\n\nfunction createNodeOutcomePayload(\n result: FlowNodeResult,\n trace: FlowStepTrace | null,\n): Record<string, unknown> {\n return {\n nodeType: result.nodeType,\n outcome: result.outcome,\n durationMs: result.durationMs,\n error: result.error ?? null,\n ...trace,\n };\n}\n\nfunction attachStepTrace(error: unknown, trace: FlowStepTrace | null): Error {\n const attached =\n error instanceof Error ? error : new Error(typeof error === \"string\" ? error : String(error));\n (attached as Error & { flowStepTrace?: FlowStepTrace | null }).flowStepTrace = trace;\n return attached;\n}\n\nfunction extractAttachedStepTrace(error: unknown): FlowStepTrace | null | undefined {\n if (!(error instanceof Error)) {\n return undefined;\n }\n return (error as Error & { flowStepTrace?: FlowStepTrace | null }).flowStepTrace;\n}\n\nfunction toInlineOutput(value: unknown): undefined | null | boolean | number | string | object {\n if (value == null || typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"string\") {\n return value.length <= 200 && !value.includes(\"\\n\") ? value : undefined;\n }\n try {\n const serialized = JSON.stringify(value);\n if (serialized.length <= 200 && !serialized.includes(\"\\n\")) {\n return value;\n }\n } catch {\n return undefined;\n }\n return undefined;\n}\n\nfunction outputArtifactMediaType(value: unknown): string {\n return typeof value === \"string\" ? \"text/plain\" : \"application/json\";\n}\n\nfunction outputArtifactExtension(value: unknown): string {\n return typeof value === \"string\" ? \"txt\" : \"json\";\n}\n\nfunction findConversationDeltaStart(\n before: SessionRecord[\"messages\"],\n after: SessionRecord[\"messages\"],\n): number {\n const maxOverlap = Math.min(before.length, after.length);\n for (let overlap = maxOverlap; overlap >= 0; overlap -= 1) {\n let matches = true;\n for (let index = 0; index < overlap; index += 1) {\n const beforeMessage = before[before.length - overlap + index];\n const afterMessage = after[index];\n if (!deepEqualJson(beforeMessage, afterMessage)) {\n matches = false;\n break;\n }\n }\n if (matches) {\n return overlap;\n }\n }\n return 0;\n}\n\nfunction deepEqualJson(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction isoNow(): string {\n return new Date().toISOString();\n}\n","export type JsonObjectParseMode = \"strict\" | \"fenced\" | \"compat\";\n\n// The generic entrypoint when a workflow wants to choose its tolerance level\n// explicitly. Most callers should still use one of the small helpers below.\nexport function parseJsonObject(\n text: string,\n options: {\n mode?: JsonObjectParseMode;\n } = {},\n): unknown {\n const trimmed = String(text ?? \"\").trim();\n if (!trimmed) {\n throw new Error(\"Expected JSON output, got empty text\");\n }\n const mode = options.mode ?? \"compat\";\n\n const direct = tryParse(trimmed);\n if (direct.ok) {\n return direct.value;\n }\n\n if (mode === \"fenced\" || mode === \"compat\") {\n const fencedMatch = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)```/i);\n if (fencedMatch) {\n const fenced = tryParse(fencedMatch[1].trim());\n if (fenced.ok) {\n return fenced.value;\n }\n }\n }\n\n if (mode === \"compat\") {\n for (const candidate of extractBalancedJsonCandidates(trimmed)) {\n const parsed = tryParse(candidate);\n if (parsed.ok) {\n return parsed.value;\n }\n }\n }\n\n throw new Error(`Could not parse JSON from assistant output:\\n${trimmed}`);\n}\n\n// Use this when the model contract must be exact JSON and any extra text\n// should fail the step immediately.\nexport function parseStrictJsonObject(text: string): unknown {\n return parseJsonObject(text, { mode: \"strict\" });\n}\n\n// Default workflow parser: direct JSON first, fenced JSON second, and finally\n// a balanced embedded object for compatibility with chatty model output.\nexport function extractJsonObject(text: string): unknown {\n return parseJsonObject(text, { mode: \"compat\" });\n}\n\nfunction tryParse(text: string): { ok: true; value: unknown } | { ok: false } {\n try {\n return {\n ok: true,\n value: JSON.parse(text),\n };\n } catch {\n return {\n ok: false,\n };\n }\n}\n\nfunction extractBalancedJsonCandidates(text: string): string[] {\n const candidates: string[] = [];\n\n for (let index = 0; index < text.length; index += 1) {\n if (text[index] !== \"{\" && text[index] !== \"[\") {\n continue;\n }\n\n const result = scanBalanced(text, index);\n if (result) {\n candidates.push(result);\n }\n }\n\n return candidates;\n}\n\nfunction scanBalanced(text: string, startIndex: number): string | null {\n const stack: string[] = [];\n let inString = false;\n let escaped = false;\n\n for (let index = startIndex; index < text.length; index += 1) {\n const char = text[index];\n\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n continue;\n }\n\n if (char === \"{\" || char === \"[\") {\n stack.push(char);\n continue;\n }\n\n if (char !== \"}\" && char !== \"]\") {\n continue;\n }\n\n const last = stack.at(-1);\n if ((last === \"{\" && char !== \"}\") || (last === \"[\" && char !== \"]\")) {\n return null;\n }\n\n stack.pop();\n if (stack.length === 0) {\n return text.slice(startIndex, index + 1);\n }\n }\n\n return null;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"output-Du3m6oPQ.js","names":["asRecord"],"sources":["../src/jsonrpc-error.ts","../src/read-output-suppression.ts","../src/output-json-formatter.ts","../src/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 \"./jsonrpc-error.js\";\nimport { isReadLikeTool, SUPPRESSED_READ_OUTPUT } from \"./read-output-suppression.js\";\nimport type {\n OutputErrorAcpPayload,\n OutputErrorCode,\n OutputErrorOrigin,\n OutputFormatter,\n OutputFormatterContext,\n} from \"./types.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 { createJsonOutputFormatter } from \"./output-json-formatter.js\";\nimport { isReadLikeTool, SUPPRESSED_READ_OUTPUT } from \"./read-output-suppression.js\";\nimport type {\n AcpJsonRpcMessage,\n ClientOperation,\n OutputErrorAcpPayload,\n OutputErrorCode,\n OutputFormatterContext,\n OutputFormat,\n OutputFormatter,\n OutputErrorOrigin,\n} from \"./types.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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"output-render-Bz58qaQn.js","names":[],"sources":["../src/cli/json-output.ts","../src/cli/output-render.ts"],"sourcesContent":["import type { OutputFormat } from \"../types.js\";\n\nexport function emitJsonResult(format: OutputFormat, payload: unknown): boolean {\n if (format !== \"json\") {\n return false;\n }\n process.stdout.write(`${JSON.stringify(payload)}\\n`);\n return true;\n}\n","import path from \"node:path\";\nimport { probeQueueOwnerHealth } from \"../queue-ipc.js\";\nimport { normalizeRuntimeSessionId } from \"../runtime-session-id.js\";\nimport type { OutputFormat, SessionRecord } from \"../types.js\";\nimport { emitJsonResult } from \"./json-output.js\";\n\nfunction formatSessionLabel(record: SessionRecord): string {\n return record.name ?? \"cwd\";\n}\n\nfunction formatRoutedFrom(sessionCwd: string, currentCwd: string): string | undefined {\n const relative = path.relative(sessionCwd, currentCwd);\n if (!relative || relative === \".\") {\n return undefined;\n }\n return relative.startsWith(\".\") ? relative : `.${path.sep}${relative}`;\n}\n\ntype SessionConnectionStatus = \"connected\" | \"needs reconnect\";\n\nasync function resolveSessionConnectionStatus(\n record: SessionRecord,\n): Promise<SessionConnectionStatus> {\n const health = await probeQueueOwnerHealth(record.acpxRecordId);\n return health.healthy ? \"connected\" : \"needs reconnect\";\n}\n\nexport function printSessionsByFormat(sessions: SessionRecord[], format: OutputFormat): void {\n if (format === \"json\") {\n process.stdout.write(`${JSON.stringify(sessions)}\\n`);\n return;\n }\n\n if (format === \"quiet\") {\n for (const session of sessions) {\n const closedMarker = session.closed ? \" [closed]\" : \"\";\n process.stdout.write(`${session.acpxRecordId}${closedMarker}\\n`);\n }\n return;\n }\n\n if (sessions.length === 0) {\n process.stdout.write(\"No sessions\\n\");\n return;\n }\n\n for (const session of sessions) {\n const closedMarker = session.closed ? \" [closed]\" : \"\";\n process.stdout.write(\n `${session.acpxRecordId}${closedMarker}\\t${session.name ?? \"-\"}\\t${session.cwd}\\t${session.lastUsedAt}\\n`,\n );\n }\n}\n\nexport function printClosedSessionByFormat(record: SessionRecord, format: OutputFormat): void {\n if (\n emitJsonResult(format, {\n action: \"session_closed\",\n acpxRecordId: record.acpxRecordId,\n acpxSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n })\n ) {\n return;\n }\n\n if (format === \"quiet\") {\n return;\n }\n\n process.stdout.write(`${record.acpxRecordId}\\n`);\n}\n\nexport function printNewSessionByFormat(\n record: SessionRecord,\n replaced: SessionRecord | undefined,\n format: OutputFormat,\n): void {\n if (\n emitJsonResult(format, {\n action: \"session_ensured\",\n created: true,\n acpxRecordId: record.acpxRecordId,\n acpxSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n name: record.name,\n replacedSessionId: replaced?.acpxRecordId,\n })\n ) {\n return;\n }\n\n if (format === \"quiet\") {\n process.stdout.write(`${record.acpxRecordId}\\n`);\n return;\n }\n\n if (replaced) {\n process.stdout.write(`${record.acpxRecordId}\\t(replaced ${replaced.acpxRecordId})\\n`);\n return;\n }\n\n process.stdout.write(`${record.acpxRecordId}\\n`);\n}\n\nexport function printEnsuredSessionByFormat(\n record: SessionRecord,\n created: boolean,\n format: OutputFormat,\n): void {\n if (\n emitJsonResult(format, {\n action: \"session_ensured\",\n created,\n acpxRecordId: record.acpxRecordId,\n acpxSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n name: record.name,\n })\n ) {\n return;\n }\n\n if (format === \"quiet\") {\n process.stdout.write(`${record.acpxRecordId}\\n`);\n return;\n }\n\n const action = created ? \"created\" : \"existing\";\n process.stdout.write(`${record.acpxRecordId}\\t(${action})\\n`);\n}\n\nexport function printQueuedPromptByFormat(\n result: {\n sessionId: string;\n requestId: string;\n },\n format: OutputFormat,\n): void {\n if (\n emitJsonResult(format, {\n action: \"prompt_queued\",\n acpxRecordId: result.sessionId,\n requestId: result.requestId,\n })\n ) {\n return;\n }\n\n if (format === \"quiet\") {\n return;\n }\n\n process.stdout.write(`[queued] ${result.requestId}\\n`);\n}\n\nexport function formatPromptSessionBannerLine(\n record: SessionRecord,\n currentCwd: string,\n connectionStatus: SessionConnectionStatus = \"needs reconnect\",\n): string {\n const label = formatSessionLabel(record);\n const normalizedSessionCwd = path.resolve(record.cwd);\n const normalizedCurrentCwd = path.resolve(currentCwd);\n const routedFrom =\n normalizedSessionCwd === normalizedCurrentCwd\n ? undefined\n : formatRoutedFrom(normalizedSessionCwd, normalizedCurrentCwd);\n const status = connectionStatus;\n\n if (routedFrom) {\n return `[acpx] session ${label} (${record.acpxRecordId}) · ${normalizedSessionCwd} (routed from ${routedFrom}) · agent ${status}`;\n }\n\n return `[acpx] session ${label} (${record.acpxRecordId}) · ${normalizedSessionCwd} · agent ${status}`;\n}\n\nexport async function printPromptSessionBanner(\n record: SessionRecord,\n currentCwd: string,\n format: OutputFormat,\n jsonStrict = false,\n): Promise<void> {\n if (format === \"quiet\" || (jsonStrict && format === \"json\")) {\n return;\n }\n\n const status = await resolveSessionConnectionStatus(record);\n process.stderr.write(`${formatPromptSessionBannerLine(record, currentCwd, status)}\\n`);\n}\n\nexport function printCreatedSessionBanner(\n record: SessionRecord,\n agentName: string,\n format: OutputFormat,\n jsonStrict = false,\n): void {\n if (format === \"quiet\" || (jsonStrict && format === \"json\")) {\n return;\n }\n\n const label = formatSessionLabel(record);\n process.stderr.write(`[acpx] created session ${label} (${record.acpxRecordId})\\n`);\n process.stderr.write(`[acpx] agent: ${agentName}\\n`);\n process.stderr.write(`[acpx] cwd: ${record.cwd}\\n`);\n}\n\nexport function agentSessionIdPayload(agentSessionId: string | undefined): {\n agentSessionId?: string;\n} {\n const normalized = normalizeRuntimeSessionId(agentSessionId);\n if (!normalized) {\n return {};\n }\n\n return { agentSessionId: normalized };\n}\n"],"mappings":"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"}
|