acpx 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -6
- package/dist/{cli-T-Z-9x6a.js → cli-Bf3yjqzE.js} +35 -10
- package/dist/cli-Bf3yjqzE.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +724 -241
- package/dist/cli.js.map +1 -1
- package/dist/{client-COPilhO_.d.ts → client-BssohYqM.d.ts} +35 -4
- package/dist/client-BssohYqM.d.ts.map +1 -0
- package/dist/flags-C-rwARqg.js +260 -0
- package/dist/flags-C-rwARqg.js.map +1 -0
- package/dist/{flows-CF8w1rPI.js → flows-WLs26_5Y.js} +405 -337
- package/dist/flows-WLs26_5Y.js.map +1 -0
- package/dist/flows.d.ts +23 -2
- package/dist/flows.d.ts.map +1 -1
- package/dist/flows.js +1 -1
- package/dist/{prompt-turn-CVPMWdj1.js → live-checkpoint-D5d-K9s1.js} +2487 -609
- package/dist/live-checkpoint-D5d-K9s1.js.map +1 -0
- package/dist/output-DPg20dvn.js +4146 -0
- package/dist/output-DPg20dvn.js.map +1 -0
- package/dist/runtime.d.ts +56 -4
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +676 -393
- package/dist/runtime.js.map +1 -1
- package/dist/{types-CVBeQyi3.d.ts → session-options-CFudjdkU.d.ts} +62 -3
- package/dist/session-options-CFudjdkU.d.ts.map +1 -0
- package/package.json +30 -25
- package/skills/acpx/SKILL.md +211 -13
- package/dist/cli-T-Z-9x6a.js.map +0 -1
- package/dist/client-COPilhO_.d.ts.map +0 -1
- package/dist/flags-Dj-IXgo9.js +0 -163
- package/dist/flags-Dj-IXgo9.js.map +0 -1
- package/dist/flows-CF8w1rPI.js.map +0 -1
- package/dist/ipc-ABXlXzGP.js +0 -1290
- package/dist/ipc-ABXlXzGP.js.map +0 -1
- package/dist/jsonrpc-DSxh2w5R.js +0 -68
- package/dist/jsonrpc-DSxh2w5R.js.map +0 -1
- package/dist/output-DmHvT8vm.js +0 -807
- package/dist/output-DmHvT8vm.js.map +0 -1
- package/dist/perf-metrics-C2pXfxvR.js +0 -598
- package/dist/perf-metrics-C2pXfxvR.js.map +0 -1
- package/dist/prompt-turn-CVPMWdj1.js.map +0 -1
- package/dist/render-N5YwotCy.js +0 -172
- package/dist/render-N5YwotCy.js.map +0 -1
- package/dist/rolldown-runtime-CiIaOW0V.js +0 -13
- package/dist/session-CDaQe6BH.js +0 -1538
- package/dist/session-CDaQe6BH.js.map +0 -1
- package/dist/session-options-pCbHn_n7.d.ts +0 -13
- package/dist/session-options-pCbHn_n7.d.ts.map +0 -1
- package/dist/types-CVBeQyi3.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flows-WLs26_5Y.js","names":["isoNow","isoNow","exhaustive","recordConversationSessionUpdate","recordConversationClientOperation"],"sources":["../src/flows/authoring.ts","../src/flows/schema.ts","../src/flows/definition.ts","../src/flows/executors/shell.ts","../src/flows/graph.ts","../src/flows/runtime-support.ts","../src/flows/store.ts","../src/flows/runtime.ts","../src/flows/json.ts","../src/flows/decision.ts"],"sourcesContent":["import type { FlowDefinition } from \"./types.js\";\n\nconst FLOW_DEFINITION_BRAND = Symbol.for(\"acpx.flow.definition\");\n\nexport function markDefinedFlow<TFlow extends FlowDefinition>(definition: TFlow): TFlow {\n if (isDefinedFlow(definition)) {\n return definition;\n }\n\n Object.defineProperty(definition, FLOW_DEFINITION_BRAND, {\n value: true,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n return definition;\n}\n\nexport function isDefinedFlow(value: unknown): value is FlowDefinition {\n return (\n value != null &&\n typeof value === \"object\" &&\n (value as Record<PropertyKey, unknown>)[FLOW_DEFINITION_BRAND] === true\n );\n}\n","import { ZodError, z } from \"zod\";\nimport { PERMISSION_MODES } from \"../types.js\";\nimport type {\n AcpNodeDefinition,\n ActionNodeDefinition,\n CheckpointNodeDefinition,\n ComputeNodeDefinition,\n FlowDefinition,\n FlowRunDefinition,\n FunctionActionNodeDefinition,\n ShellActionNodeDefinition,\n} from \"./types.js\";\n\nconst FLOW_NODE_TYPES = [\"acp\", \"compute\", \"action\", \"checkpoint\"] as const;\n\nconst finiteNonNegativeNumberSchema = z.number().finite().nonnegative();\nconst nonEmptyTrimmedStringSchema = z.string().refine((value) => value.trim().length > 0, {\n message: \"must not be empty\",\n});\n\nfunction extensibleObject<TShape extends z.ZodRawShape>(shape: TShape) {\n return z.object(shape).passthrough();\n}\n\nfunction functionSchema<T extends Function>(label: string): z.ZodType<T> {\n return z.custom<T>((value) => typeof value === \"function\", {\n message: `${label} must be a function`,\n });\n}\n\nconst flowNodeCommonShape = {\n timeoutMs: finiteNonNegativeNumberSchema.optional(),\n heartbeatMs: finiteNonNegativeNumberSchema.optional(),\n statusDetail: z.string().optional(),\n} satisfies z.ZodRawShape;\n\nconst flowPermissionRequirementsSchema = extensibleObject({\n requiredMode: z.enum(PERMISSION_MODES),\n requireExplicitGrant: z.boolean().optional(),\n reason: nonEmptyTrimmedStringSchema.optional(),\n});\n\nconst flowRunDefinitionSchema = extensibleObject({\n title: z\n .union([\n z.string(),\n functionSchema<Exclude<FlowRunDefinition[\"title\"], string | undefined>>(\"run.title\"),\n ])\n .optional(),\n});\n\nconst acpSessionSchema = extensibleObject({\n handle: z.string().optional(),\n isolated: z.boolean().optional(),\n});\n\nconst acpNodeSchema = extensibleObject({\n ...flowNodeCommonShape,\n nodeType: z.literal(\"acp\"),\n profile: z.string().optional(),\n cwd: z\n .union([\n z.string(),\n functionSchema<Exclude<AcpNodeDefinition[\"cwd\"], string | undefined>>(\"cwd\"),\n ])\n .optional(),\n session: acpSessionSchema.optional(),\n prompt: functionSchema<AcpNodeDefinition[\"prompt\"]>(\"prompt\"),\n parse: functionSchema<NonNullable<AcpNodeDefinition[\"parse\"]>>(\"parse\").optional(),\n});\n\nconst computeNodeSchema = extensibleObject({\n ...flowNodeCommonShape,\n nodeType: z.literal(\"compute\"),\n run: functionSchema<ComputeNodeDefinition[\"run\"]>(\"run\"),\n});\n\nconst functionActionNodeSchema = extensibleObject({\n ...flowNodeCommonShape,\n nodeType: z.literal(\"action\"),\n run: functionSchema<FunctionActionNodeDefinition[\"run\"]>(\"run\"),\n});\n\nconst shellActionNodeSchema = extensibleObject({\n ...flowNodeCommonShape,\n nodeType: z.literal(\"action\"),\n exec: functionSchema<ShellActionNodeDefinition[\"exec\"]>(\"exec\"),\n parse: functionSchema<NonNullable<ShellActionNodeDefinition[\"parse\"]>>(\"parse\").optional(),\n}).refine((node) => !hasOwn(node, \"run\"), {\n message: \"shell action nodes must not define run\",\n});\n\nconst checkpointNodeSchema = extensibleObject({\n ...flowNodeCommonShape,\n nodeType: z.literal(\"checkpoint\"),\n summary: z.string().optional(),\n run: functionSchema<NonNullable<CheckpointNodeDefinition[\"run\"]>>(\"run\").optional(),\n});\n\nconst directFlowEdgeSchema = extensibleObject({\n from: z.string(),\n to: z.string(),\n});\n\nconst switchFlowEdgeSchema = extensibleObject({\n from: z.string(),\n switch: extensibleObject({\n on: z.string(),\n cases: z.record(z.string(), z.string()),\n }),\n});\n\nconst flowDefinitionSchema = extensibleObject({\n name: nonEmptyTrimmedStringSchema,\n run: flowRunDefinitionSchema.optional(),\n permissions: flowPermissionRequirementsSchema.optional(),\n startAt: z.string(),\n nodes: z.record(z.string(), z.unknown()),\n edges: z.array(z.unknown()),\n});\n\nconst flowNodeTypeSchema = z.object({\n nodeType: z.enum(FLOW_NODE_TYPES),\n});\n\nexport function assertValidFlowDefinitionShape(flow: FlowDefinition): void {\n const parsed = parseWithSchema(\"flow definition\", flowDefinitionSchema, flow);\n\n for (const [nodeId, node] of Object.entries(parsed.nodes)) {\n assertValidFlowNodeDefinitionShape(node, `flow node \"${nodeId}\"`);\n }\n parsed.edges.forEach((edge, index) => {\n assertValidFlowEdgeShape(edge, `flow definition: edges.${index}`);\n });\n}\n\nexport function assertValidAcpNodeDefinition(node: AcpNodeDefinition): void {\n parseWithSchema(\"acp node definition\", acpNodeSchema, node);\n}\n\nexport function assertValidComputeNodeDefinition(node: ComputeNodeDefinition): void {\n parseWithSchema(\"compute node definition\", computeNodeSchema, node);\n}\n\nexport function assertValidActionNodeDefinition(node: ActionNodeDefinition): void {\n assertValidActionNodeDefinitionShape(node, \"action node definition\");\n}\n\nexport function assertValidShellActionNodeDefinition(node: ShellActionNodeDefinition): void {\n parseWithSchema(\"shell action node definition\", shellActionNodeSchema, node);\n}\n\nexport function assertValidCheckpointNodeDefinition(node: CheckpointNodeDefinition): void {\n parseWithSchema(\"checkpoint node definition\", checkpointNodeSchema, node);\n}\n\nfunction assertValidFlowNodeDefinitionShape(node: unknown, label: string): void {\n const { nodeType } = parseWithSchema(label, flowNodeTypeSchema, node);\n\n switch (nodeType) {\n case \"acp\":\n parseWithSchema(label, acpNodeSchema, node);\n return;\n case \"compute\":\n parseWithSchema(label, computeNodeSchema, node);\n return;\n case \"action\":\n assertValidActionNodeDefinitionShape(node, label);\n return;\n case \"checkpoint\":\n parseWithSchema(label, checkpointNodeSchema, node);\n return;\n }\n}\n\nfunction assertValidActionNodeDefinitionShape(node: unknown, label: string): void {\n const hasRun = hasOwn(node, \"run\");\n const hasExec = hasOwn(node, \"exec\");\n\n if (hasRun === hasExec) {\n throw new Error(`Invalid ${label}: action nodes must define exactly one of run or exec`);\n }\n\n if (hasExec) {\n parseWithSchema(label, shellActionNodeSchema, node);\n return;\n }\n\n parseWithSchema(label, functionActionNodeSchema, node);\n}\n\nfunction assertValidFlowEdgeShape(edge: unknown, label: string): void {\n const hasTo = hasOwn(edge, \"to\");\n const hasSwitch = hasOwn(edge, \"switch\");\n\n if (hasTo === hasSwitch) {\n throw new Error(`Invalid ${label}: edge must define exactly one of to or switch`);\n }\n\n if (hasTo) {\n parseWithSchema(label, directFlowEdgeSchema, edge);\n return;\n }\n\n parseWithSchema(label, switchFlowEdgeSchema, edge);\n}\n\nfunction parseWithSchema<T>(label: string, schema: z.ZodType<T>, value: unknown): T {\n try {\n return schema.parse(value);\n } catch (error) {\n if (error instanceof ZodError) {\n throw new Error(formatValidationError(label, error), { cause: error });\n }\n throw error;\n }\n}\n\nfunction formatValidationError(label: string, error: ZodError): string {\n const details = Array.from(new Set(error.issues.flatMap((issue) => formatIssue(issue)))).join(\n \"; \",\n );\n return `Invalid ${label}: ${details}`;\n}\n\nfunction formatIssue(issue: z.ZodIssue, parentPath: string[] = []): string[] {\n const path = [...parentPath, ...issue.path.map(String)];\n\n if (issue.code === \"invalid_union\") {\n return issue.errors.flatMap((branch) =>\n branch.flatMap((nestedIssue) => formatIssue(nestedIssue, path)),\n );\n }\n\n const renderedPath = path.join(\".\");\n return [renderedPath ? `${renderedPath}: ${issue.message}` : issue.message];\n}\n\nfunction hasOwn(value: unknown, key: string): boolean {\n return (\n value != null && typeof value === \"object\" && Object.prototype.hasOwnProperty.call(value, key)\n );\n}\n","import { markDefinedFlow } from \"./authoring.js\";\nimport {\n assertValidAcpNodeDefinition,\n assertValidActionNodeDefinition,\n assertValidCheckpointNodeDefinition,\n assertValidComputeNodeDefinition,\n assertValidFlowDefinitionShape,\n assertValidShellActionNodeDefinition,\n} from \"./schema.js\";\nimport 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 assertValidFlowDefinitionShape(definition);\n return markDefinedFlow(definition);\n}\n\nexport function acp(definition: Omit<AcpNodeDefinition, \"nodeType\">): AcpNodeDefinition {\n const node: AcpNodeDefinition = {\n nodeType: \"acp\",\n ...definition,\n };\n assertValidAcpNodeDefinition(node);\n return node;\n}\n\nexport function compute(\n definition: Omit<ComputeNodeDefinition, \"nodeType\">,\n): ComputeNodeDefinition {\n const node: ComputeNodeDefinition = {\n nodeType: \"compute\",\n ...definition,\n };\n assertValidComputeNodeDefinition(node);\n return node;\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 const node: ActionNodeDefinition = {\n nodeType: \"action\",\n ...definition,\n } as ActionNodeDefinition;\n assertValidActionNodeDefinition(node);\n return node;\n}\n\nexport function shell(\n definition: Omit<ShellActionNodeDefinition, \"nodeType\">,\n): ShellActionNodeDefinition {\n const node: ShellActionNodeDefinition = {\n nodeType: \"action\",\n ...definition,\n };\n assertValidShellActionNodeDefinition(node);\n return node;\n}\n\nexport function checkpoint(\n definition: Omit<CheckpointNodeDefinition, \"nodeType\"> = {},\n): CheckpointNodeDefinition {\n const node: CheckpointNodeDefinition = {\n nodeType: \"checkpoint\",\n ...definition,\n };\n assertValidCheckpointNodeDefinition(node);\n return node;\n}\n","import { spawn } from \"node:child_process\";\nimport { TimeoutError } from \"../../async-control.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\nfunction createShellFailureError(\n spec: ShellActionExecution,\n args: string[],\n exitCode: number | null,\n signal: NodeJS.Signals | null,\n stderr: string,\n): Error {\n const status = signal ? `signal ${signal}` : `exit ${String(exitCode)}`;\n const details = stderr.length > 0 ? `\\n${stderr.trim()}` : \"\";\n return new Error(\n `Shell action failed (${renderShellCommand(spec.command, args)}): ${status}${details}`,\n );\n}\n\nfunction rejectIfShellFailed(\n spec: ShellActionExecution,\n args: string[],\n result: ShellActionResult,\n timedOut: boolean,\n): Error | undefined {\n if (timedOut) {\n return new TimeoutError(spec.timeoutMs ?? 0);\n }\n if (((result.exitCode ?? 0) !== 0 || result.signal != null) && spec.allowNonZeroExit !== true) {\n return createShellFailureError(spec, args, result.exitCode, result.signal, result.stderr);\n }\n return undefined;\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 const error = rejectIfShellFailed(spec, args, result, timedOut);\n if (error) {\n reject(error);\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 { assertValidFlowDefinitionShape } from \"./schema.js\";\nimport type { FlowDefinition, FlowEdge, FlowNodeResult } from \"./types.js\";\n\nexport function validateFlowDefinition(flow: FlowDefinition): void {\n assertValidFlowDefinitionShape(flow);\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 validateFlowEdge(flow, edge, outgoingEdges);\n }\n}\n\nfunction assertKnownFlowNode(flow: FlowDefinition, nodeId: string, description: string): void {\n if (!flow.nodes[nodeId]) {\n throw new Error(`${description}: ${nodeId}`);\n }\n}\n\nfunction validateFlowEdge(flow: FlowDefinition, edge: FlowEdge, outgoingEdges: Set<string>): void {\n assertKnownFlowNode(flow, edge.from, \"Flow edge references unknown from-node\");\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\n if (\"to\" in edge) {\n assertKnownFlowNode(flow, edge.to, \"Flow edge references unknown to-node\");\n return;\n }\n\n for (const target of Object.values(edge.switch.cases)) {\n assertKnownFlowNode(flow, target, \"Flow switch references unknown to-node\");\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((current: unknown, 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 path from \"node:path\";\nimport { InterruptedError, TimeoutError } from \"../async-control.js\";\nimport { createOutputFormatter } from \"../cli/output/output.js\";\nimport { textPrompt } from \"../prompt-content.js\";\nimport { defaultSessionEventLog } from \"../session/event-log.js\";\nimport { SESSION_RECORD_SCHEMA } from \"../types.js\";\nimport type { PromptInput, SessionRecord } from \"../types.js\";\nimport type { FlowRunStore } from \"./store.js\";\nimport type {\n AcpNodeDefinition,\n FlowDefinition,\n FlowNodeContext,\n FlowNodeDefinition,\n FlowNodeOutcome,\n FlowNodeResult,\n FlowRunState,\n FlowSessionBinding,\n FlowStepTrace,\n ResolvedFlowAgent,\n} from \"./types.js\";\n\ntype MemoryWritable = {\n write(chunk: string): void;\n};\n\nexport function isoNow(): string {\n return new Date().toISOString();\n}\n\nexport function persistRunFailure(\n store: FlowRunStore,\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 Promise.resolve();\n }\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 return 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\nexport function makeFlowNodeContext(\n state: FlowRunState,\n input: unknown,\n services: FlowNodeContext[\"services\"],\n): FlowNodeContext {\n return {\n input,\n outputs: state.outputs,\n results: state.results,\n state,\n services,\n };\n}\n\nexport function 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\nexport function 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\nexport function updateStatusDetail(state: FlowRunState, detail?: string): void {\n if (!detail) {\n return;\n }\n state.statusDetail = detail;\n}\n\nexport async function finalizeStepTrace(\n store: FlowRunStore,\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 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\nexport function normalizePromptInput(prompt: PromptInput | string): PromptInput {\n return typeof prompt === \"string\" ? textPrompt(prompt) : prompt;\n}\n\nexport async 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\nexport function resolveShellActionCwd(defaultCwd: string, cwd: string | undefined): string {\n return path.resolve(defaultCwd, cwd ?? defaultCwd);\n}\n\nexport function 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\nexport function 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\nexport async 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\nexport function normalizeFlowRunTitle(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n}\n\nexport function createRunId(flowName: string): string {\n const stamp = isoNow().replaceAll(\":\", \"\").replaceAll(\".\", \"\");\n const slug = slugifyAsciiIdPart(flowName);\n return `${stamp}-${slug}-${randomUUID().slice(0, 8)}`;\n}\n\nexport function createSessionBindingKey(agentCommand: string, cwd: string, handle: string): string {\n return `${agentCommand}::${cwd}::${handle}`;\n}\n\nexport function createSessionName(\n flowName: string,\n handle: string,\n cwd: string,\n runId: string,\n): string {\n const stamp = stableShortHash(cwd);\n return `${flowName}-${handle}-${stamp}-${runId.slice(-8)}`;\n}\n\nexport function createSessionBundleId(handle: string, key: string): string {\n const safeHandle = slugifyAsciiIdPart(handle);\n return `${safeHandle || \"session\"}-${stableShortHash(key)}`;\n}\n\nfunction slugifyAsciiIdPart(value: string): string {\n let slug = \"\";\n let lastWasSeparator = false;\n\n for (const char of value) {\n const safeChar = toLowerAsciiAlphaNumeric(char);\n if (safeChar) {\n slug += safeChar;\n lastWasSeparator = false;\n continue;\n }\n\n if (slug.length > 0 && !lastWasSeparator) {\n slug += \"-\";\n lastWasSeparator = true;\n }\n }\n\n return lastWasSeparator ? slug.slice(0, -1) : slug;\n}\n\nfunction toLowerAsciiAlphaNumeric(char: string): string | null {\n const code = char.charCodeAt(0);\n if (code >= 48 && code <= 57) {\n return char;\n }\n if (code >= 65 && code <= 90) {\n return String.fromCharCode(code + 32);\n }\n if (code >= 97 && code <= 122) {\n return char;\n }\n return null;\n}\n\nexport function 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\nexport function createSyntheticSessionRecord(options: {\n binding: FlowSessionBinding;\n createdAt: string;\n updatedAt: string;\n conversation: Pick<\n SessionRecord,\n \"title\" | \"messages\" | \"updated_at\" | \"cumulative_token_usage\" | \"request_token_usage\"\n >;\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\nexport function 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\nexport function 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\nexport function 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\nexport function 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\nexport function 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\nexport function 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 isInlineSerializableText(value) ? value : undefined;\n }\n try {\n const serialized = JSON.stringify(value);\n if (isInlineSerializableText(serialized)) {\n return value;\n }\n } catch {\n return undefined;\n }\n return undefined;\n}\n\nfunction isInlineSerializableText(value: string): boolean {\n return value.length <= 200 && !value.includes(\"\\n\");\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\nexport function 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","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): FlowDefinitionSnapshot[\"nodes\"][string] {\n const common = snapshotCommonNodeFields(node);\n\n switch (node.nodeType) {\n case \"acp\":\n return snapshotAcpNode(node, common);\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 throw new Error(`Unsupported flow node type: ${String(node satisfies never)}`);\n}\n\nfunction snapshotCommonNodeFields(node: FlowNodeDefinition): {\n nodeType: FlowNodeDefinition[\"nodeType\"];\n timeoutMs?: number;\n heartbeatMs?: number;\n statusDetail?: string;\n} {\n return {\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\nfunction snapshotAcpNode(\n node: Extract<FlowNodeDefinition, { nodeType: \"acp\" }>,\n common: ReturnType<typeof snapshotCommonNodeFields>,\n): FlowDefinitionSnapshot[\"nodes\"][string] {\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}\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 { randomUUID } from \"node:crypto\";\nimport type { AcpClient } from \"../acp/client.js\";\nimport { InterruptedError, TimeoutError, withInterrupt, withTimeout } from \"../async-control.js\";\nimport { promptToDisplayText } 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 { resolveSessionRecord } from \"../session/persistence.js\";\nimport {\n cancelSessionPrompt,\n createSessionWithClient,\n runOnce,\n sendSessionDirect,\n} from \"../session/session.js\";\nimport type { PermissionPolicy, 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 {\n attachStepTrace,\n clearActiveNode,\n createIsolatedSessionBinding,\n createNodeOutcomePayload,\n createNodeResult,\n createQuietCaptureOutput,\n createRunId,\n createSessionBindingKey,\n createSessionBundleId,\n createSessionName,\n createSyntheticSessionRecord,\n extractAttachedStepTrace,\n finalizeStepTrace,\n findConversationDeltaStart,\n isoNow,\n makeFlowNodeContext,\n markNodeStarted,\n nextAttemptId,\n normalizePromptInput,\n outcomeForError,\n persistRunFailure,\n resolveFlowRunTitle,\n resolveNodeCwd,\n resolveShellActionCwd,\n summarizePrompt,\n updateStatusDetail,\n} from \"./runtime-support.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 FlowArtifactRef,\n FlowRunResult,\n FlowRunState,\n FlowRunnerOptions,\n FlowSessionBinding,\n FlowNodeResult,\n ResolvedFlowAgent,\n ShellActionExecution,\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 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 FlowRunExecutionResult = {\n runDir: string;\n state: FlowRunState;\n};\n\ntype FlowStepExecutionResult = FlowNodeExecutionResult & {\n attemptId: string;\n nodeResult: FlowNodeResult;\n nodeId: string;\n node: FlowNodeDefinition;\n startedAt: string;\n state: FlowRunState;\n executionError?: unknown;\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\ntype PreparedAcpPrompt = {\n agentInfo: ResolvedFlowAgent;\n prompt: PromptInput;\n promptText: string;\n promptArtifact: FlowArtifactRef;\n nodeTimeoutMs: number | undefined;\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 permissionPolicy?: PermissionPolicy;\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.permissionPolicy = options.permissionPolicy;\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 try {\n return await withInterrupt(\n async () => await this.executeFlowRun(flow, input, runDir, state),\n async () => {\n await persistRunFailure(this.store, runDir, state, new InterruptedError());\n },\n );\n } finally {\n await this.closePendingPersistentSessionClients();\n }\n }\n\n private async executeFlowRun(\n flow: FlowDefinition,\n input: unknown,\n runDir: string,\n state: FlowRunState,\n ): Promise<FlowRunExecutionResult> {\n let current: string | null = flow.startAt;\n const attemptCounts = new Map<string, number>();\n try {\n while (current) {\n const step = await this.executeFlowStep(flow, input, runDir, state, current, attemptCounts);\n const waiting = await this.maybeCompleteCheckpointStep(runDir, state, step);\n if (waiting) {\n return waiting;\n }\n await this.recordFlowStepOutcome(runDir, state, step);\n current = this.resolveNextNode(flow, step);\n }\n return await this.completeFlowRun(runDir, state);\n } catch (error) {\n await persistRunFailure(this.store, runDir, state, error);\n throw error;\n }\n }\n\n private async executeFlowStep(\n flow: FlowDefinition,\n input: unknown,\n runDir: string,\n state: FlowRunState,\n nodeId: string,\n attemptCounts: Map<string, number>,\n ): Promise<FlowStepExecutionResult> {\n const node = flow.nodes[nodeId];\n if (!node) {\n throw new Error(`Unknown flow node: ${nodeId}`);\n }\n const attemptId = nextAttemptId(attemptCounts, nodeId);\n const startedAt = isoNow();\n markNodeStarted(state, nodeId, attemptId, node.nodeType, startedAt, node.statusDetail);\n await this.writeNodeStartedSnapshot(runDir, state, nodeId, attemptId, node);\n return await this.executeStartedFlowStep({\n flow,\n input,\n runDir,\n state,\n nodeId,\n node,\n attemptId,\n startedAt,\n });\n }\n\n private async writeNodeStartedSnapshot(\n runDir: string,\n state: FlowRunState,\n nodeId: string,\n attemptId: string,\n node: FlowNodeDefinition,\n ): Promise<void> {\n await this.store.writeSnapshot(runDir, state, {\n scope: \"node\",\n type: \"node_started\",\n nodeId,\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 }\n\n private async executeStartedFlowStep(params: {\n flow: FlowDefinition;\n input: unknown;\n runDir: string;\n state: FlowRunState;\n nodeId: string;\n node: FlowNodeDefinition;\n attemptId: string;\n startedAt: string;\n }): Promise<FlowStepExecutionResult> {\n const context = makeFlowNodeContext(params.state, params.input, this.services);\n try {\n const executed = await this.executeNode(\n params.runDir,\n params.state,\n params.flow,\n params.nodeId,\n params.node,\n context,\n );\n return await this.createSuccessfulFlowStep(params, executed);\n } catch (error) {\n return await this.createFailedFlowStep(params, error);\n }\n }\n\n private async createSuccessfulFlowStep(\n params: {\n runDir: string;\n state: FlowRunState;\n nodeId: string;\n node: FlowNodeDefinition;\n attemptId: string;\n startedAt: string;\n },\n executed: FlowNodeExecutionResult,\n ): Promise<FlowStepExecutionResult> {\n const trace = await finalizeStepTrace(\n this.store,\n params.runDir,\n params.state,\n params.nodeId,\n params.attemptId,\n executed.output,\n executed.trace,\n );\n const nodeResult = createNodeResult({\n attemptId: params.attemptId,\n nodeId: params.nodeId,\n nodeType: params.node.nodeType,\n outcome: \"ok\",\n startedAt: params.startedAt,\n finishedAt: isoNow(),\n output: executed.output,\n });\n params.state.results[params.nodeId] = nodeResult;\n return {\n ...executed,\n trace,\n nodeResult,\n attemptId: params.attemptId,\n nodeId: params.nodeId,\n node: params.node,\n startedAt: params.startedAt,\n state: params.state,\n };\n }\n\n private async createFailedFlowStep(\n params: {\n runDir: string;\n state: FlowRunState;\n nodeId: string;\n node: FlowNodeDefinition;\n attemptId: string;\n startedAt: string;\n },\n error: unknown,\n ): Promise<FlowStepExecutionResult> {\n const trace = await finalizeStepTrace(\n this.store,\n params.runDir,\n params.state,\n params.nodeId,\n params.attemptId,\n undefined,\n extractAttachedStepTrace(error) ?? null,\n );\n const nodeResult = createNodeResult({\n attemptId: params.attemptId,\n nodeId: params.nodeId,\n nodeType: params.node.nodeType,\n outcome: outcomeForError(error),\n startedAt: params.startedAt,\n finishedAt: isoNow(),\n error: error instanceof Error ? error.message : String(error),\n });\n params.state.results[params.nodeId] = nodeResult;\n return {\n output: undefined,\n promptText: null,\n rawText: null,\n sessionInfo: null,\n agentInfo: null,\n trace,\n nodeResult,\n executionError: error,\n attemptId: params.attemptId,\n nodeId: params.nodeId,\n node: params.node,\n startedAt: params.startedAt,\n state: params.state,\n };\n }\n\n private async maybeCompleteCheckpointStep(\n runDir: string,\n state: FlowRunState,\n step: FlowStepExecutionResult,\n ): Promise<FlowRunExecutionResult | undefined> {\n if (step.nodeResult.outcome !== \"ok\" || step.node.nodeType !== \"checkpoint\") {\n return undefined;\n }\n state.outputs[step.nodeId] = step.output;\n state.waitingOn = step.nodeId;\n state.updatedAt = isoNow();\n state.status = \"waiting\";\n await this.recordFlowStepOutcome(runDir, state, step, {\n sessionInfo: null,\n agentInfo: null,\n statusDetail: (step.output as { summary?: string } | null)?.summary ?? step.nodeId,\n });\n return { runDir, state };\n }\n\n private resolveNextNode(flow: FlowDefinition, step: FlowStepExecutionResult): string | null {\n if (step.nodeResult.outcome === \"ok\") {\n step.state.outputs[step.nodeId] = step.output;\n return resolveNext(flow.edges, step.nodeId, step.output, step.nodeResult);\n }\n const next = resolveNextForOutcome(flow.edges, step.nodeId, step.nodeResult);\n if (next) {\n return next;\n }\n throw step.executionError;\n }\n\n private async completeFlowRun(\n runDir: string,\n state: FlowRunState,\n ): Promise<FlowRunExecutionResult> {\n state.status = \"completed\";\n state.finishedAt = isoNow();\n state.updatedAt = state.finishedAt;\n 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 { runDir, state };\n }\n\n private async recordFlowStepOutcome(\n runDir: string,\n state: FlowRunState,\n step: FlowStepExecutionResult,\n overrides: {\n sessionInfo?: FlowSessionBinding | null;\n agentInfo?: ResolvedFlowAgent | null;\n statusDetail?: string;\n } = {},\n ): Promise<void> {\n state.updatedAt = isoNow();\n clearActiveNode(state, overrides.statusDetail);\n state.steps.push({\n attemptId: step.attemptId,\n nodeId: step.nodeId,\n nodeType: step.node.nodeType,\n outcome: step.nodeResult.outcome,\n startedAt: step.startedAt,\n finishedAt: step.nodeResult.finishedAt,\n promptText: step.promptText,\n rawText: step.rawText,\n output: step.output,\n error: step.nodeResult.error,\n session: overrides.sessionInfo ?? step.sessionInfo,\n agent: overrides.agentInfo ?? step.agentInfo,\n ...(step.trace ? { trace: step.trace } : {}),\n });\n await this.store.writeSnapshot(runDir, state, {\n scope: \"node\",\n type: \"node_outcome\",\n nodeId: step.nodeId,\n attemptId: step.attemptId,\n payload: createNodeOutcomePayload(step.nodeResult, step.trace),\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 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 prepared = await this.prepareAcpPrompt(runDir, state, node, context, nodeTimeoutMs);\n if (node.session?.isolated) {\n return await this.executeIsolatedAcpPrompt(runDir, state, flow, node, context, prepared);\n }\n\n boundSession = await this.ensureSessionBinding(\n runDir,\n state,\n flow,\n node,\n prepared.agentInfo,\n nodeTimeoutMs,\n );\n return await this.executePersistentAcpPrompt(\n runDir,\n state,\n node,\n context,\n prepared,\n boundSession,\n );\n },\n async () => {\n if (!boundSession) {\n return;\n }\n await cancelSessionPrompt({\n sessionId: boundSession.acpxRecordId,\n });\n },\n );\n }\n\n private async prepareAcpPrompt(\n runDir: string,\n state: FlowRunState,\n node: AcpNodeDefinition,\n context: FlowNodeContext,\n nodeTimeoutMs: number | undefined,\n ): Promise<PreparedAcpPrompt> {\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 updateStatusDetail(state, summarizePrompt(promptText, node.statusDetail));\n await this.writeAcpPromptHeartbeat(runDir, state);\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 return { agentInfo, prompt, promptText, promptArtifact, nodeTimeoutMs };\n }\n\n private async writeAcpPromptHeartbeat(runDir: string, state: FlowRunState): Promise<void> {\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 }\n\n private async executeIsolatedAcpPrompt(\n runDir: string,\n state: FlowRunState,\n flow: FlowDefinition,\n node: AcpNodeDefinition,\n context: FlowNodeContext,\n prepared: PreparedAcpPrompt,\n ): Promise<FlowNodeExecutionResult> {\n const binding = createIsolatedSessionBinding(\n flow.name,\n state.runId,\n state.currentAttemptId ?? randomUUID(),\n node.profile,\n prepared.agentInfo,\n );\n await this.initializeIsolatedSessionBundle(runDir, state, binding);\n await this.appendAcpPromptPreparedTrace(runDir, state, binding, prepared.promptArtifact);\n const prompt = await this.runIsolatedPrompt(\n runDir,\n state,\n binding,\n prepared.agentInfo,\n prepared.prompt,\n prepared.nodeTimeoutMs,\n );\n return await this.finishAcpPrompt(runDir, state, node, context, prepared, prompt, binding);\n }\n\n private async initializeIsolatedSessionBundle(\n runDir: string,\n state: FlowRunState,\n binding: FlowSessionBinding,\n ): Promise<void> {\n const timestamp = state.currentNodeStartedAt ?? isoNow();\n const initialRecord = createSyntheticSessionRecord({\n binding,\n createdAt: timestamp,\n updatedAt: timestamp,\n conversation: createSessionConversation(timestamp),\n acpxState: undefined,\n lastSeq: 0,\n });\n await this.store.ensureSessionBundle(runDir, state, binding, initialRecord);\n }\n\n private async executePersistentAcpPrompt(\n runDir: string,\n state: FlowRunState,\n node: AcpNodeDefinition,\n context: FlowNodeContext,\n prepared: PreparedAcpPrompt,\n binding: FlowSessionBinding,\n ): Promise<FlowNodeExecutionResult> {\n await this.appendAcpPromptPreparedTrace(runDir, state, binding, prepared.promptArtifact);\n const prompt = await this.runPersistentPrompt(\n runDir,\n state,\n binding,\n prepared.prompt,\n prepared.nodeTimeoutMs,\n );\n return await this.finishAcpPrompt(\n runDir,\n state,\n node,\n context,\n prepared,\n prompt,\n prompt.sessionInfo,\n );\n }\n\n private async appendAcpPromptPreparedTrace(\n runDir: string,\n state: FlowRunState,\n binding: FlowSessionBinding,\n promptArtifact: FlowArtifactRef,\n ): Promise<void> {\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: binding.bundleId,\n payload: {\n sessionId: binding.bundleId,\n promptArtifact,\n },\n });\n }\n\n private async finishAcpPrompt(\n runDir: string,\n state: FlowRunState,\n node: AcpNodeDefinition,\n context: FlowNodeContext,\n prepared: PreparedAcpPrompt,\n prompt: TracedPromptResult,\n sessionInfo: FlowSessionBinding,\n ): Promise<FlowNodeExecutionResult> {\n const rawResponseArtifact = await this.writeAcpRawResponseArtifact(\n runDir,\n state,\n prompt,\n sessionInfo,\n );\n await this.appendAcpResponseParsedTrace(\n runDir,\n state,\n prompt,\n sessionInfo,\n rawResponseArtifact,\n );\n const trace: FlowStepTrace = {\n sessionId: sessionInfo.bundleId,\n promptArtifact: prepared.promptArtifact,\n rawResponseArtifact,\n conversation: prompt.conversation,\n };\n const output = await this.parseAcpOutput(node, context, prompt.rawText, trace);\n return {\n output,\n promptText: prepared.promptText,\n rawText: prompt.rawText,\n sessionInfo,\n agentInfo: prepared.agentInfo,\n trace,\n };\n }\n\n private async writeAcpRawResponseArtifact(\n runDir: string,\n state: FlowRunState,\n prompt: TracedPromptResult,\n sessionInfo: FlowSessionBinding,\n ): Promise<FlowArtifactRef> {\n return await this.store.writeArtifact(runDir, state, prompt.rawText, {\n mediaType: \"text/plain\",\n extension: \"txt\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n sessionId: sessionInfo.bundleId,\n });\n }\n\n private async appendAcpResponseParsedTrace(\n runDir: string,\n state: FlowRunState,\n prompt: TracedPromptResult,\n sessionInfo: FlowSessionBinding,\n rawResponseArtifact: FlowArtifactRef,\n ): Promise<void> {\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: sessionInfo.bundleId,\n payload: {\n sessionId: sessionInfo.bundleId,\n conversation: prompt.conversation,\n rawResponseArtifact,\n },\n });\n }\n\n private async parseAcpOutput(\n node: AcpNodeDefinition,\n context: FlowNodeContext,\n rawText: string,\n trace: FlowStepTrace,\n ): Promise<unknown> {\n try {\n return node.parse ? await node.parse(rawText, context) : rawText;\n } catch (error) {\n throw attachStepTrace(error, trace);\n }\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 permissionPolicy: this.permissionPolicy,\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 permissionPolicy: this.permissionPolicy,\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 permissionPolicy: this.permissionPolicy,\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","export type JsonObjectParseMode = \"strict\" | \"fenced\" | \"compat\";\n\nfunction normalizeJsonText(text: unknown): string {\n if (typeof text === \"string\") {\n return text.trim();\n }\n if (text == null) {\n return \"\";\n }\n if (\n typeof text === \"number\" ||\n typeof text === \"boolean\" ||\n typeof text === \"bigint\" ||\n typeof text === \"symbol\"\n ) {\n return String(text).trim();\n }\n return \"\";\n}\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 = normalizeJsonText(text);\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 const fenced = parseFencedJsonIfAllowed(trimmed, mode);\n if (fenced.ok) {\n return fenced.value;\n }\n\n if (mode === \"compat\") {\n const balanced = parseBalancedJsonCandidate(trimmed);\n if (balanced.ok) {\n return balanced.value;\n }\n }\n\n throw new Error(`Could not parse JSON from assistant output:\\n${trimmed}`);\n}\n\nfunction parseFencedJsonIfAllowed(\n text: string,\n mode: JsonObjectParseMode,\n): { ok: true; value: unknown } | { ok: false } {\n if (mode !== \"fenced\" && mode !== \"compat\") {\n return { ok: false };\n }\n const fencedText = extractFencedJsonText(text);\n return fencedText === null ? { ok: false } : tryParse(fencedText);\n}\n\nfunction parseBalancedJsonCandidate(text: string): { ok: true; value: unknown } | { ok: false } {\n for (const candidate of extractBalancedJsonCandidates(text)) {\n const parsed = tryParse(candidate);\n if (parsed.ok) {\n return parsed;\n }\n }\n return { ok: false };\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 extractFencedJsonText(text: string): string | null {\n const openingFenceIndex = text.indexOf(\"```\");\n if (openingFenceIndex === -1) {\n return null;\n }\n\n let contentStart = openingFenceIndex + 3;\n if (\n text.slice(contentStart, contentStart + 4).toLowerCase() === \"json\" &&\n isFenceWhitespace(text[contentStart + 4])\n ) {\n contentStart += 4;\n }\n\n while (isFenceWhitespace(text[contentStart])) {\n contentStart += 1;\n }\n\n const closingFenceIndex = text.indexOf(\"```\", contentStart);\n if (closingFenceIndex === -1) {\n return null;\n }\n\n return text.slice(contentStart, closingFenceIndex).trim();\n}\n\nfunction isFenceWhitespace(char: string | undefined): boolean {\n return char === \" \" || char === \"\\n\" || char === \"\\r\" || char === \"\\t\";\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 const next = scanStringChar(char, escaped);\n escaped = next.escaped;\n inString = next.inString;\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n continue;\n }\n\n const result = scanBalancedToken(text, startIndex, index, char, stack);\n if (result !== SCAN_CONTINUE) {\n return result;\n }\n }\n\n return null;\n}\n\nconst SCAN_CONTINUE = Symbol(\"scan-continue\");\n\nfunction scanBalancedToken(\n text: string,\n startIndex: number,\n index: number,\n char: string,\n stack: string[],\n): string | null | typeof SCAN_CONTINUE {\n if (char === \"{\" || char === \"[\") {\n stack.push(char);\n return SCAN_CONTINUE;\n }\n\n if (char !== \"}\" && char !== \"]\") {\n return SCAN_CONTINUE;\n }\n\n if (!balancedClosingTokenMatches(stack.at(-1), char)) {\n return null;\n }\n\n stack.pop();\n return stack.length === 0 ? text.slice(startIndex, index + 1) : SCAN_CONTINUE;\n}\n\nfunction balancedClosingTokenMatches(open: string | undefined, close: string): boolean {\n if (open === \"{\") {\n return close === \"}\";\n }\n if (open === \"[\") {\n return close === \"]\";\n }\n return false;\n}\n\nfunction scanStringChar(char: string, escaped: boolean): { escaped: boolean; inString: boolean } {\n if (escaped) {\n return { escaped: false, inString: true };\n }\n if (char === \"\\\\\") {\n return { escaped: true, inString: true };\n }\n return { escaped: false, inString: char !== '\"' };\n}\n","import { acp } from \"./definition.js\";\nimport { extractJsonObject } from \"./json.js\";\nimport type { AcpNodeDefinition, FlowEdge, FlowNodeContext } from \"./types.js\";\n\nconst DEFAULT_FIELD = \"route\";\nconst SIMPLE_FIELD_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n// All `acp` node fields except the ones the decision helper owns.\ntype DecisionAcpOptions = Omit<AcpNodeDefinition, \"nodeType\" | \"prompt\" | \"parse\">;\n\nexport type DecisionDefinition<TChoice extends string> = DecisionAcpOptions & {\n question: string | ((context: FlowNodeContext) => string | Promise<string>);\n choices: readonly TChoice[];\n field?: string;\n};\n\n// Build an `acp` node that asks the model to pick one of `choices` and reply\n// with a JSON object whose chosen field is validated. Pair with `decisionEdge`\n// (or any `switch` edge keyed on `$.<field>`) to route on the result.\nexport function decision<TChoice extends string>(\n definition: DecisionDefinition<TChoice>,\n): AcpNodeDefinition {\n const { question, choices, field: fieldOverride, ...acpOptions } = definition;\n const field = normalizeField(fieldOverride);\n assertValidChoices(choices);\n const allowed = new Set<string>(choices);\n\n return acp({\n ...acpOptions,\n async prompt(context) {\n const text = typeof question === \"function\" ? await question(context) : question;\n return formatDecisionPrompt(text, choices, field);\n },\n parse(text) {\n const raw = extractJsonObject(text);\n if (raw === null || typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new Error(`Decision response must be a JSON object, got ${typeof raw}`);\n }\n const value = (raw as Record<string, unknown>)[field];\n if (typeof value !== \"string\" || !allowed.has(value)) {\n const allowedLabels = choices.map((choice) => JSON.stringify(choice)).join(\", \");\n throw new Error(\n `Decision returned invalid ${field}=${JSON.stringify(value)}; expected one of ${allowedLabels}`,\n );\n }\n return raw;\n },\n });\n}\n\n// Build the matching `switch` edge for a `decision` node. Typing `cases` as\n// `Record<TChoice, string>` makes a missing case a compile error.\nexport function decisionEdge<TChoice extends string>(args: {\n from: string;\n choices: readonly TChoice[];\n field?: string;\n cases: Record<TChoice, string>;\n}): FlowEdge {\n const field = normalizeField(args.field);\n assertValidChoices(args.choices);\n for (const choice of args.choices) {\n if (!Object.hasOwn(args.cases, choice)) {\n throw new Error(`Decision edge is missing case for choice ${JSON.stringify(choice)}`);\n }\n }\n return {\n from: args.from,\n switch: {\n on: `$.${field}`,\n cases: args.cases as Record<string, string>,\n },\n };\n}\n\nfunction assertValidChoices(choices: readonly string[]): void {\n if (choices.length === 0) {\n throw new Error(\"Decision choices must include at least one value\");\n }\n const seen = new Set<string>();\n for (const choice of choices) {\n if (typeof choice !== \"string\" || choice.length === 0) {\n throw new Error(\"Decision choices must be non-empty strings\");\n }\n if (seen.has(choice)) {\n throw new Error(`Decision choices must be unique; duplicate ${JSON.stringify(choice)}`);\n }\n seen.add(choice);\n }\n}\n\nfunction normalizeField(fieldOverride: string | undefined): string {\n const field = fieldOverride ?? DEFAULT_FIELD;\n if (!SIMPLE_FIELD_PATTERN.test(field)) {\n throw new Error(\n `Decision field must be a simple JSON key matching ${SIMPLE_FIELD_PATTERN.source}`,\n );\n }\n return field;\n}\n\nfunction formatDecisionPrompt(question: string, choices: readonly string[], field: string): string {\n const allowed = choices.map((choice) => JSON.stringify(choice)).join(\" | \");\n return [\n question,\n \"\",\n \"Return exactly one JSON object with this shape:\",\n \"{\",\n ` ${JSON.stringify(field)}: ${allowed},`,\n ' \"reason\": \"short justification\"',\n \"}\",\n \"\",\n \"Do not include any other text outside the JSON object.\",\n ].join(\"\\n\");\n}\n"],"mappings":"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"}
|
package/dist/flows.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as SessionAgentOptions } from "./session-options-pCbHn_n7.js";
|
|
1
|
+
import { c as NonInteractivePermissionPolicy, l as PermissionMode, o as AuthPolicy, p as PromptInput, s as McpServer$1, t as SessionAgentOptions, u as PermissionPolicy } from "./session-options-CFudjdkU.js";
|
|
3
2
|
import { SetSessionConfigOptionResponse } from "@agentclientprotocol/sdk";
|
|
4
3
|
|
|
5
4
|
//#region src/flows/types.d.ts
|
|
@@ -212,6 +211,7 @@ type FlowRunnerOptions = {
|
|
|
212
211
|
permissionMode: PermissionMode;
|
|
213
212
|
mcpServers?: McpServer$1[];
|
|
214
213
|
nonInteractivePermissions?: NonInteractivePermissionPolicy;
|
|
214
|
+
permissionPolicy?: PermissionPolicy;
|
|
215
215
|
authCredentials?: Record<string, string>;
|
|
216
216
|
authPolicy?: AuthPolicy;
|
|
217
217
|
timeoutMs?: number;
|
|
@@ -240,6 +240,7 @@ declare class FlowRunner {
|
|
|
240
240
|
private readonly permissionMode;
|
|
241
241
|
private readonly mcpServers?;
|
|
242
242
|
private readonly nonInteractivePermissions?;
|
|
243
|
+
private readonly permissionPolicy?;
|
|
243
244
|
private readonly authCredentials?;
|
|
244
245
|
private readonly authPolicy?;
|
|
245
246
|
private readonly timeoutMs?;
|
|
@@ -254,11 +255,31 @@ declare class FlowRunner {
|
|
|
254
255
|
run(flow: FlowDefinition, input: unknown, options?: {
|
|
255
256
|
flowPath?: string;
|
|
256
257
|
}): Promise<FlowRunResult>;
|
|
258
|
+
private executeFlowRun;
|
|
259
|
+
private executeFlowStep;
|
|
260
|
+
private writeNodeStartedSnapshot;
|
|
261
|
+
private executeStartedFlowStep;
|
|
262
|
+
private createSuccessfulFlowStep;
|
|
263
|
+
private createFailedFlowStep;
|
|
264
|
+
private maybeCompleteCheckpointStep;
|
|
265
|
+
private resolveNextNode;
|
|
266
|
+
private completeFlowRun;
|
|
267
|
+
private recordFlowStepOutcome;
|
|
257
268
|
private executeNode;
|
|
258
269
|
private executeComputeNode;
|
|
259
270
|
private executeActionNode;
|
|
260
271
|
private executeCheckpointNode;
|
|
261
272
|
private executeAcpNode;
|
|
273
|
+
private prepareAcpPrompt;
|
|
274
|
+
private writeAcpPromptHeartbeat;
|
|
275
|
+
private executeIsolatedAcpPrompt;
|
|
276
|
+
private initializeIsolatedSessionBundle;
|
|
277
|
+
private executePersistentAcpPrompt;
|
|
278
|
+
private appendAcpPromptPreparedTrace;
|
|
279
|
+
private finishAcpPrompt;
|
|
280
|
+
private writeAcpRawResponseArtifact;
|
|
281
|
+
private appendAcpResponseParsedTrace;
|
|
282
|
+
private parseAcpOutput;
|
|
262
283
|
private runWithHeartbeat;
|
|
263
284
|
private ensureSessionBinding;
|
|
264
285
|
private refreshSessionBinding;
|
package/dist/flows.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flows.d.ts","names":[],"sources":["../src/flows/types.ts","../src/flows/definition.ts","../src/flows/runtime.ts","../src/flows/decision.ts","../src/flows/store.ts","../src/flows/json.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"flows.d.ts","names":[],"sources":["../src/flows/types.ts","../src/flows/definition.ts","../src/flows/runtime.ts","../src/flows/decision.ts","../src/flows/store.ts","../src/flows/json.ts"],"mappings":"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"}
|
package/dist/flows.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as parseStrictJsonObject, d as checkpoint, f as compute, i as parseJsonObject, l as acp, m as shell, n as decisionEdge, o as FlowRunner, p as defineFlow, r as extractJsonObject, s as flowRunsBaseDir, t as decision, u as action } from "./flows-
|
|
1
|
+
import { a as parseStrictJsonObject, d as checkpoint, f as compute, i as parseJsonObject, l as acp, m as shell, n as decisionEdge, o as FlowRunner, p as defineFlow, r as extractJsonObject, s as flowRunsBaseDir, t as decision, u as action } from "./flows-WLs26_5Y.js";
|
|
2
2
|
export { FlowRunner, acp, action, checkpoint, compute, decision, decisionEdge, defineFlow, extractJsonObject, flowRunsBaseDir, parseJsonObject, parseStrictJsonObject, shell };
|