acpx 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +1 -0
  2. package/dist/{cli-Ddxpnz9X.js → cli-T-Z-9x6a.js} +4 -4
  3. package/dist/{cli-Ddxpnz9X.js.map → cli-T-Z-9x6a.js.map} +1 -1
  4. package/dist/cli.js +8 -8
  5. package/dist/{client-2fTFutRH.d.ts → client-COPilhO_.d.ts} +4 -2
  6. package/dist/client-COPilhO_.d.ts.map +1 -0
  7. package/dist/{flags-yXzUm7Aq.js → flags-Dj-IXgo9.js} +3 -3
  8. package/dist/{flags-yXzUm7Aq.js.map → flags-Dj-IXgo9.js.map} +1 -1
  9. package/dist/{flows-CDsfbaA2.js → flows-CF8w1rPI.js} +112 -9
  10. package/dist/flows-CF8w1rPI.js.map +1 -0
  11. package/dist/flows.d.ts +16 -1
  12. package/dist/flows.d.ts.map +1 -1
  13. package/dist/flows.js +2 -2
  14. package/dist/{ipc-BruTG5Fb.js → ipc-ABXlXzGP.js} +51 -2
  15. package/dist/ipc-ABXlXzGP.js.map +1 -0
  16. package/dist/{prompt-turn-BY5SwU1F.js → prompt-turn-CVPMWdj1.js} +36 -6
  17. package/dist/prompt-turn-CVPMWdj1.js.map +1 -0
  18. package/dist/{render-yqwtaOX4.js → render-N5YwotCy.js} +2 -2
  19. package/dist/{render-yqwtaOX4.js.map → render-N5YwotCy.js.map} +1 -1
  20. package/dist/runtime.d.ts +5 -3
  21. package/dist/runtime.d.ts.map +1 -1
  22. package/dist/runtime.js +19 -11
  23. package/dist/runtime.js.map +1 -1
  24. package/dist/{session-BwgaPK8-.js → session-CDaQe6BH.js} +15 -3
  25. package/dist/session-CDaQe6BH.js.map +1 -0
  26. package/package.json +10 -10
  27. package/skills/acpx/SKILL.md +1 -0
  28. package/dist/client-2fTFutRH.d.ts.map +0 -1
  29. package/dist/flows-CDsfbaA2.js.map +0 -1
  30. package/dist/ipc-BruTG5Fb.js.map +0 -1
  31. package/dist/prompt-turn-BY5SwU1F.js.map +0 -1
  32. package/dist/session-BwgaPK8-.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"flows-CDsfbaA2.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"],"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\nexport async function runShellAction(spec: ShellActionExecution): Promise<ShellActionResult> {\n const cwd = spec.cwd ?? process.cwd();\n const args = spec.args ?? [];\n const startMs = Date.now();\n const child = spawn(spec.command, args, {\n cwd,\n env: {\n ...process.env,\n ...spec.env,\n },\n shell: spec.shell,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n windowsHide: true,\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let timeout: NodeJS.Timeout | undefined;\n\n const finish = new Promise<ShellActionResult>((resolve, reject) => {\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.stderr.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n\n child.once(\"error\", reject);\n child.once(\"exit\", (exitCode, signal) => {\n const result: ShellActionResult = {\n command: spec.command,\n args,\n cwd,\n stdout,\n stderr,\n combinedOutput: `${stdout}${stderr}`,\n exitCode,\n signal,\n durationMs: Date.now() - startMs,\n };\n\n if (timedOut) {\n reject(new TimeoutError(spec.timeoutMs ?? 0));\n return;\n }\n\n if (((exitCode ?? 0) !== 0 || signal != null) && spec.allowNonZeroExit !== true) {\n reject(\n new Error(\n `Shell action failed (${renderShellCommand(spec.command, args)}): ${signal ? `signal ${signal}` : `exit ${String(exitCode)}`}${stderr.length > 0 ? `\\n${stderr.trim()}` : \"\"}`,\n ),\n );\n return;\n }\n\n resolve(result);\n });\n });\n\n if (spec.stdin != null) {\n child.stdin.write(spec.stdin);\n }\n child.stdin.end();\n\n if (spec.timeoutMs != null && spec.timeoutMs > 0) {\n timeout = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n child.kill(\"SIGKILL\");\n }, 1_000).unref();\n }, spec.timeoutMs);\n }\n\n try {\n return await finish;\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n}\n","import { 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 if (!flow.nodes[edge.from]) {\n throw new Error(`Flow edge references unknown from-node: ${edge.from}`);\n }\n if (outgoingEdges.has(edge.from)) {\n throw new Error(`Flow node must not declare multiple outgoing edges: ${edge.from}`);\n }\n outgoingEdges.add(edge.from);\n if (\"to\" in edge) {\n if (!flow.nodes[edge.to]) {\n throw new Error(`Flow edge references unknown to-node: ${edge.to}`);\n }\n continue;\n }\n for (const target of Object.values(edge.switch.cases)) {\n if (!flow.nodes[target]) {\n throw new Error(`Flow switch references unknown to-node: ${target}`);\n }\n }\n }\n}\n\nexport function resolveNext(\n edges: FlowEdge[],\n from: string,\n output: unknown,\n result?: FlowNodeResult,\n): string | null {\n const edge = edges.find((candidate) => candidate.from === from);\n if (!edge) {\n return null;\n }\n\n if (\"to\" in edge) {\n return edge.to;\n }\n\n const value = getBySwitchPath(output, result, edge.switch.on);\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n throw new Error(`Flow switch value must be scalar for ${edge.switch.on}`);\n }\n const next = edge.switch.cases[String(value)];\n if (!next) {\n throw new Error(`No flow switch case for ${edge.switch.on}=${JSON.stringify(value)}`);\n }\n return next;\n}\n\nexport function resolveNextForOutcome(\n edges: FlowEdge[],\n from: string,\n result: FlowNodeResult,\n): string | null {\n const edge = edges.find((candidate) => candidate.from === from);\n if (!edge || \"to\" in edge) {\n return null;\n }\n if (!edge.switch.on.startsWith(\"$result.\")) {\n return null;\n }\n const value = getBySwitchPath(undefined, result, edge.switch.on);\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n throw new Error(`Flow switch value must be scalar for ${edge.switch.on}`);\n }\n const next = edge.switch.cases[String(value)];\n if (!next) {\n throw new Error(`No flow switch case for ${edge.switch.on}=${JSON.stringify(value)}`);\n }\n return next;\n}\n\nfunction getBySwitchPath(\n output: unknown,\n result: FlowNodeResult | undefined,\n jsonPath: string,\n): unknown {\n if (jsonPath.startsWith(\"$result.\")) {\n return getByPath(result, `$.${jsonPath.slice(\"$result.\".length)}`);\n }\n if (jsonPath.startsWith(\"$output.\")) {\n return getByPath(output, `$.${jsonPath.slice(\"$output.\".length)}`);\n }\n return getByPath(output, jsonPath);\n}\n\nfunction getByPath(value: unknown, jsonPath: string): unknown {\n if (!jsonPath.startsWith(\"$.\")) {\n throw new Error(`Unsupported JSON path: ${jsonPath}`);\n }\n\n return jsonPath\n .slice(2)\n .split(\".\")\n .reduce((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 = flowName\n .replace(/[^a-z0-9]+/gi, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase();\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 = handle\n .replace(/[^a-z0-9]+/gi, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase();\n return `${safeHandle || \"session\"}-${stableShortHash(key)}`;\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 value.length <= 200 && !value.includes(\"\\n\") ? value : undefined;\n }\n try {\n const serialized = JSON.stringify(value);\n if (serialized.length <= 200 && !serialized.includes(\"\\n\")) {\n return value;\n }\n } catch {\n return undefined;\n }\n return undefined;\n}\n\nfunction outputArtifactMediaType(value: unknown): string {\n return typeof value === \"string\" ? \"text/plain\" : \"application/json\";\n}\n\nfunction outputArtifactExtension(value: unknown): string {\n return typeof value === \"string\" ? \"txt\" : \"json\";\n}\n\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 = {\n nodeType: node.nodeType,\n ...(node.timeoutMs !== undefined ? { timeoutMs: node.timeoutMs } : {}),\n ...(node.heartbeatMs !== undefined ? { heartbeatMs: node.heartbeatMs } : {}),\n ...(node.statusDetail ? { statusDetail: node.statusDetail } : {}),\n };\n\n switch (node.nodeType) {\n case \"acp\":\n return {\n ...common,\n ...(node.profile ? { profile: node.profile } : {}),\n session: {\n ...(node.session?.handle ? { handle: node.session.handle } : {}),\n ...(node.session?.isolated ? { isolated: true } : {}),\n },\n cwd: snapshotCwd(node.cwd),\n hasPrompt: true,\n hasParse: typeof node.parse === \"function\",\n };\n case \"compute\":\n return {\n ...common,\n hasRun: true,\n };\n case \"action\": {\n const actionExecution: \"shell\" | \"function\" = \"exec\" in node ? \"shell\" : \"function\";\n return {\n ...common,\n actionExecution,\n hasRun: \"run\" in node,\n hasExec: \"exec\" in node,\n hasParse: \"parse\" in node && typeof node.parse === \"function\",\n };\n }\n case \"checkpoint\":\n return {\n ...common,\n ...(node.summary ? { summary: node.summary } : {}),\n hasRun: typeof node.run === \"function\",\n };\n }\n\n throw new Error(`Unsupported flow node type: ${String(node satisfies never)}`);\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 { 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 FlowPermissionRequirements,\n FlowRunResult,\n FlowRunState,\n FlowRunnerOptions,\n FlowSessionBinding,\n FlowEdge,\n FlowStepRecord,\n FlowNodeOutcome,\n FlowNodeResult,\n FunctionActionNodeDefinition,\n ResolvedFlowAgent,\n ShellActionExecution,\n ShellActionNodeDefinition,\n ShellActionResult,\n} from \"./types.js\";\n\nexport { acp, action, checkpoint, compute, defineFlow, shell };\nexport type {\n AcpNodeDefinition,\n ActionNodeDefinition,\n CheckpointNodeDefinition,\n ComputeNodeDefinition,\n FlowDefinition,\n FlowEdge,\n FlowNodeCommon,\n FlowNodeContext,\n FlowNodeDefinition,\n FlowPermissionRequirements,\n FlowNodeOutcome,\n FlowNodeResult,\n FlowRunResult,\n FlowRunState,\n FlowRunnerOptions,\n FlowSessionBinding,\n FlowStepRecord,\n FunctionActionNodeDefinition,\n ResolvedFlowAgent,\n ShellActionExecution,\n ShellActionNodeDefinition,\n ShellActionResult,\n} from \"./types.js\";\n\nconst DEFAULT_FLOW_HEARTBEAT_MS = 5_000;\nconst DEFAULT_FLOW_STEP_TIMEOUT_MS = 15 * 60_000;\n\ntype FlowNodeExecutionResult = {\n output: unknown;\n promptText: string | null;\n rawText: string | null;\n sessionInfo: FlowSessionBinding | null;\n agentInfo: ResolvedFlowAgent | null;\n trace: FlowStepTrace | null;\n};\n\ntype TracedPromptResult = {\n rawText: string;\n sessionInfo: FlowSessionBinding;\n conversation: {\n sessionId: string;\n messageStart: number;\n messageEnd: number;\n eventStartSeq: number;\n eventEndSeq: number;\n };\n};\n\nexport class FlowRunner {\n private readonly resolveAgent;\n private readonly defaultCwd;\n private readonly permissionMode;\n private readonly mcpServers?;\n private readonly nonInteractivePermissions?;\n private readonly authCredentials?;\n private readonly authPolicy?;\n private readonly timeoutMs?;\n private readonly defaultNodeTimeoutMs;\n private readonly verbose?;\n private readonly suppressSdkConsoleErrors?;\n private readonly sessionOptions?;\n private readonly services;\n private readonly store;\n private readonly pendingPersistentSessionClients = new Map<string, AcpClient>();\n\n constructor(options: FlowRunnerOptions) {\n this.resolveAgent = options.resolveAgent;\n this.defaultCwd = options.resolveAgent(undefined).cwd;\n this.permissionMode = options.permissionMode;\n this.mcpServers = options.mcpServers;\n this.nonInteractivePermissions = options.nonInteractivePermissions;\n this.authCredentials = options.authCredentials;\n this.authPolicy = options.authPolicy;\n this.timeoutMs = options.timeoutMs;\n this.defaultNodeTimeoutMs =\n options.defaultNodeTimeoutMs ?? options.timeoutMs ?? DEFAULT_FLOW_STEP_TIMEOUT_MS;\n this.verbose = options.verbose;\n this.suppressSdkConsoleErrors = options.suppressSdkConsoleErrors;\n this.sessionOptions = options.sessionOptions;\n this.services = options.services ?? {};\n this.store = new FlowRunStore(options.outputRoot);\n }\n\n async run(\n flow: FlowDefinition,\n input: unknown,\n options: { flowPath?: string } = {},\n ): Promise<FlowRunResult> {\n validateFlowDefinition(flow);\n\n const runId = createRunId(flow.name);\n const runTitle = await resolveFlowRunTitle(flow, input, options.flowPath);\n const runDir = await this.store.createRunDir(runId);\n const state: FlowRunState = {\n runId,\n flowName: flow.name,\n runTitle,\n flowPath: options.flowPath,\n startedAt: isoNow(),\n updatedAt: isoNow(),\n status: \"running\",\n input,\n outputs: {},\n results: {},\n steps: [],\n sessionBindings: {},\n };\n const inputArtifact = await this.store.writeArtifact(runDir, state, input, {\n mediaType: \"application/json\",\n extension: \"json\",\n emitTrace: false,\n });\n await this.store.initializeRunBundle(runDir, {\n flow,\n state,\n inputArtifact,\n });\n\n let current: string | null = flow.startAt;\n const attemptCounts = new Map<string, number>();\n\n try {\n return await withInterrupt(\n async () => {\n try {\n while (current) {\n const node = flow.nodes[current];\n if (!node) {\n throw new Error(`Unknown flow node: ${current}`);\n }\n\n const attemptId = nextAttemptId(attemptCounts, current);\n const startedAt = isoNow();\n const context = makeFlowNodeContext(state, input, this.services);\n let output: unknown;\n let promptText: string | null = null;\n let rawText: string | null = null;\n let sessionInfo: FlowSessionBinding | null = null;\n let agentInfo: ResolvedFlowAgent | null = null;\n let trace: FlowStepTrace | null = null;\n markNodeStarted(\n state,\n current,\n attemptId,\n node.nodeType,\n startedAt,\n node.statusDetail,\n );\n await this.store.writeSnapshot(runDir, state, {\n scope: \"node\",\n type: \"node_started\",\n nodeId: current,\n attemptId,\n payload: {\n nodeType: node.nodeType,\n ...(node.timeoutMs !== undefined\n ? { timeoutMs: node.timeoutMs ?? this.defaultNodeTimeoutMs }\n : { timeoutMs: this.defaultNodeTimeoutMs }),\n ...(state.statusDetail ? { statusDetail: state.statusDetail } : {}),\n },\n });\n let nodeResult: FlowNodeResult | undefined;\n let executionError: unknown;\n try {\n ({ output, promptText, rawText, sessionInfo, agentInfo, trace } =\n await this.executeNode(runDir, state, flow, current, node, context));\n trace = await finalizeStepTrace(\n this.store,\n runDir,\n state,\n current,\n attemptId,\n output,\n trace,\n );\n nodeResult = createNodeResult({\n attemptId,\n nodeId: current,\n nodeType: node.nodeType,\n outcome: \"ok\",\n startedAt,\n finishedAt: isoNow(),\n output,\n });\n } catch (error) {\n executionError = error;\n trace = extractAttachedStepTrace(error) ?? trace;\n trace = await finalizeStepTrace(\n this.store,\n runDir,\n state,\n current,\n attemptId,\n undefined,\n trace,\n );\n nodeResult = createNodeResult({\n attemptId,\n nodeId: current,\n nodeType: node.nodeType,\n outcome: outcomeForError(error),\n startedAt,\n finishedAt: isoNow(),\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n state.results[current] = nodeResult;\n\n if (nodeResult.outcome === \"ok\" && node.nodeType === \"checkpoint\") {\n state.outputs[current] = output;\n state.waitingOn = current;\n state.updatedAt = isoNow();\n state.status = \"waiting\";\n clearActiveNode(state, (output as { summary?: string } | null)?.summary ?? current);\n state.steps.push({\n attemptId,\n nodeId: current,\n nodeType: node.nodeType,\n outcome: nodeResult.outcome,\n startedAt,\n finishedAt: nodeResult.finishedAt,\n promptText,\n rawText,\n output,\n session: null,\n agent: null,\n ...(trace ? { trace } : {}),\n });\n await this.store.writeSnapshot(runDir, state, {\n scope: \"node\",\n type: \"node_outcome\",\n nodeId: current,\n attemptId,\n payload: createNodeOutcomePayload(nodeResult, trace),\n });\n return {\n runDir,\n state,\n };\n }\n\n if (nodeResult.outcome === \"ok\") {\n state.outputs[current] = output;\n }\n state.updatedAt = isoNow();\n clearActiveNode(state);\n state.steps.push({\n attemptId,\n nodeId: current,\n nodeType: node.nodeType,\n outcome: nodeResult.outcome,\n startedAt,\n finishedAt: nodeResult.finishedAt,\n promptText,\n rawText,\n output,\n error: nodeResult.error,\n session: sessionInfo,\n agent: agentInfo,\n ...(trace ? { trace } : {}),\n });\n\n await this.store.writeSnapshot(runDir, state, {\n scope: \"node\",\n type: \"node_outcome\",\n nodeId: current,\n attemptId,\n payload: createNodeOutcomePayload(nodeResult, trace),\n });\n\n if (nodeResult.outcome === \"ok\") {\n current = resolveNext(flow.edges, current, output, nodeResult);\n continue;\n }\n\n const next = resolveNextForOutcome(flow.edges, current, nodeResult);\n if (next) {\n current = next;\n continue;\n }\n\n throw executionError;\n }\n\n state.status = \"completed\";\n state.finishedAt = isoNow();\n state.updatedAt = state.finishedAt;\n clearActiveNode(state);\n await this.store.writeSnapshot(runDir, state, {\n scope: \"run\",\n type: \"run_completed\",\n payload: {\n status: state.status,\n },\n });\n return {\n runDir,\n state,\n };\n } catch (error) {\n await persistRunFailure(this.store, runDir, state, error);\n throw error;\n }\n },\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 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 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.store.writeLive(runDir, state, {\n scope: \"node\",\n type: \"node_heartbeat\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n payload: {\n statusDetail: state.statusDetail,\n },\n });\n const promptArtifact = await this.store.writeArtifact(runDir, state, promptText, {\n mediaType: \"text/plain\",\n extension: \"txt\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n });\n\n if (node.session?.isolated) {\n const isolatedBinding = createIsolatedSessionBinding(\n flow.name,\n state.runId,\n state.currentAttemptId ?? randomUUID(),\n node.profile,\n agentInfo,\n );\n const initialIsolatedRecord = createSyntheticSessionRecord({\n binding: isolatedBinding,\n createdAt: state.currentNodeStartedAt ?? isoNow(),\n updatedAt: state.currentNodeStartedAt ?? isoNow(),\n conversation: createSessionConversation(state.currentNodeStartedAt ?? isoNow()),\n acpxState: undefined,\n lastSeq: 0,\n });\n await this.store.ensureSessionBundle(\n runDir,\n state,\n isolatedBinding,\n initialIsolatedRecord,\n );\n await this.store.appendTrace(runDir, state, {\n scope: \"acp\",\n type: \"acp_prompt_prepared\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n sessionId: isolatedBinding.bundleId,\n payload: {\n sessionId: isolatedBinding.bundleId,\n promptArtifact,\n },\n });\n const isolatedPrompt = await this.runIsolatedPrompt(\n runDir,\n state,\n isolatedBinding,\n agentInfo,\n prompt,\n nodeTimeoutMs,\n );\n const rawResponseArtifact = await this.store.writeArtifact(\n runDir,\n state,\n isolatedPrompt.rawText,\n {\n mediaType: \"text/plain\",\n extension: \"txt\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n sessionId: isolatedBinding.bundleId,\n },\n );\n await this.store.appendTrace(runDir, state, {\n scope: \"acp\",\n type: \"acp_response_parsed\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n sessionId: isolatedBinding.bundleId,\n payload: {\n sessionId: isolatedBinding.bundleId,\n conversation: isolatedPrompt.conversation,\n rawResponseArtifact,\n },\n });\n const trace: FlowStepTrace = {\n sessionId: isolatedBinding.bundleId,\n promptArtifact,\n rawResponseArtifact,\n conversation: isolatedPrompt.conversation,\n };\n let parsedOutput: unknown;\n try {\n parsedOutput = node.parse\n ? await node.parse(isolatedPrompt.rawText, context)\n : isolatedPrompt.rawText;\n } catch (error) {\n throw attachStepTrace(error, trace);\n }\n return {\n output: parsedOutput,\n promptText,\n rawText: isolatedPrompt.rawText,\n sessionInfo: isolatedBinding,\n agentInfo,\n trace,\n };\n }\n\n boundSession = await this.ensureSessionBinding(\n runDir,\n state,\n flow,\n node,\n agentInfo,\n nodeTimeoutMs,\n );\n await this.store.appendTrace(runDir, state, {\n scope: \"acp\",\n type: \"acp_prompt_prepared\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n sessionId: boundSession.bundleId,\n payload: {\n sessionId: boundSession.bundleId,\n promptArtifact,\n },\n });\n const persistentPrompt = await this.runPersistentPrompt(\n runDir,\n state,\n boundSession,\n prompt,\n nodeTimeoutMs,\n );\n const rawResponseArtifact = await this.store.writeArtifact(\n runDir,\n state,\n persistentPrompt.rawText,\n {\n mediaType: \"text/plain\",\n extension: \"txt\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n sessionId: persistentPrompt.sessionInfo.bundleId,\n },\n );\n await this.store.appendTrace(runDir, state, {\n scope: \"acp\",\n type: \"acp_response_parsed\",\n nodeId: state.currentNode,\n attemptId: state.currentAttemptId,\n sessionId: persistentPrompt.sessionInfo.bundleId,\n payload: {\n sessionId: persistentPrompt.sessionInfo.bundleId,\n conversation: persistentPrompt.conversation,\n rawResponseArtifact,\n },\n });\n const trace: FlowStepTrace = {\n sessionId: persistentPrompt.sessionInfo.bundleId,\n promptArtifact,\n rawResponseArtifact,\n conversation: persistentPrompt.conversation,\n };\n let parsedOutput: unknown;\n try {\n parsedOutput = node.parse\n ? await node.parse(persistentPrompt.rawText, context)\n : persistentPrompt.rawText;\n } catch (error) {\n throw attachStepTrace(error, trace);\n }\n return {\n output: parsedOutput,\n promptText,\n rawText: persistentPrompt.rawText,\n sessionInfo: persistentPrompt.sessionInfo,\n agentInfo,\n trace,\n };\n },\n async () => {\n if (!boundSession) {\n return;\n }\n await cancelSessionPrompt({\n sessionId: boundSession.acpxRecordId,\n });\n },\n );\n }\n\n private async runWithHeartbeat<T>(\n runDir: string,\n state: FlowRunState,\n nodeId: string,\n node: FlowNodeCommon,\n timeoutMs: number | undefined,\n run: () => Promise<T>,\n onTimeout?: () => Promise<void>,\n ): Promise<T> {\n const heartbeatMs = Math.max(0, Math.round(node.heartbeatMs ?? DEFAULT_FLOW_HEARTBEAT_MS));\n let timer: NodeJS.Timeout | undefined;\n let active = true;\n const heartbeat = async (): Promise<void> => {\n if (!active) {\n return;\n }\n state.lastHeartbeatAt = isoNow();\n state.updatedAt = state.lastHeartbeatAt;\n await this.store.writeLive(runDir, state, {\n scope: \"node\",\n type: \"node_heartbeat\",\n nodeId,\n attemptId: state.currentAttemptId,\n payload: {\n statusDetail: state.statusDetail,\n },\n });\n };\n\n if (heartbeatMs > 0) {\n timer = setInterval(() => {\n void heartbeat();\n }, heartbeatMs);\n }\n\n try {\n return await withTimeout(run(), timeoutMs);\n } catch (error) {\n if (error instanceof TimeoutError && onTimeout) {\n await onTimeout().catch(() => {\n // best effort cancellation only\n });\n }\n throw error;\n } finally {\n active = false;\n if (timer) {\n clearInterval(timer);\n }\n }\n }\n\n private async ensureSessionBinding(\n runDir: string,\n state: FlowRunState,\n flow: FlowDefinition,\n node: AcpNodeDefinition,\n agent: ResolvedFlowAgent,\n timeoutMs: number | undefined,\n ): Promise<FlowSessionBinding> {\n const handle = node.session?.handle ?? \"main\";\n const key = createSessionBindingKey(agent.agentCommand, agent.cwd, handle);\n const existing = state.sessionBindings[key];\n if (existing) {\n await this.store.ensureSessionBundle(runDir, state, existing);\n return existing;\n }\n\n const name = createSessionName(flow.name, handle, agent.cwd, state.runId);\n const created = await createSessionWithClient({\n agentCommand: agent.agentCommand,\n cwd: agent.cwd,\n name,\n mcpServers: this.mcpServers,\n permissionMode: this.permissionMode,\n nonInteractivePermissions: this.nonInteractivePermissions,\n authCredentials: this.authCredentials,\n authPolicy: this.authPolicy,\n timeoutMs,\n verbose: this.verbose,\n sessionOptions: this.sessionOptions,\n });\n\n const binding: FlowSessionBinding = {\n key,\n handle,\n bundleId: createSessionBundleId(handle, key),\n name,\n profile: node.profile,\n agentName: agent.agentName,\n agentCommand: agent.agentCommand,\n cwd: agent.cwd,\n acpxRecordId: created.record.acpxRecordId,\n acpSessionId: created.record.acpSessionId,\n agentSessionId: created.record.agentSessionId,\n };\n state.sessionBindings[key] = binding;\n this.pendingPersistentSessionClients.set(binding.key, created.client);\n await this.store.ensureSessionBundle(runDir, state, binding, created.record);\n return binding;\n }\n\n private async refreshSessionBinding(binding: FlowSessionBinding): Promise<FlowSessionBinding> {\n const record = await resolveSessionRecord(binding.acpxRecordId);\n return {\n ...binding,\n acpSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n };\n }\n\n private async runPersistentPrompt(\n runDir: string,\n state: FlowRunState,\n binding: FlowSessionBinding,\n prompt: PromptInput,\n timeoutMs?: number,\n ): Promise<TracedPromptResult> {\n const capture = createQuietCaptureOutput();\n const beforeRecord = await resolveSessionRecord(binding.acpxRecordId);\n let eventStartSeq: number | undefined;\n let eventEndSeq: number | undefined;\n const pendingEventWrites: Promise<void>[] = [];\n const initialClient = this.pendingPersistentSessionClients.get(binding.key);\n if (initialClient) {\n this.pendingPersistentSessionClients.delete(binding.key);\n }\n\n try {\n await sendSessionDirect({\n sessionId: binding.acpxRecordId,\n prompt,\n resumePolicy: \"same-session-only\",\n mcpServers: this.mcpServers,\n permissionMode: this.permissionMode,\n nonInteractivePermissions: this.nonInteractivePermissions,\n authCredentials: this.authCredentials,\n authPolicy: this.authPolicy,\n outputFormatter: capture.formatter,\n onAcpMessage: (direction, message) => {\n const pending = this.store\n .appendSessionEvent(runDir, binding, direction, message)\n .then((seq) => {\n eventStartSeq = eventStartSeq === undefined ? seq : Math.min(eventStartSeq, seq);\n eventEndSeq = eventEndSeq === undefined ? seq : Math.max(eventEndSeq, seq);\n });\n pendingEventWrites.push(pending);\n },\n suppressSdkConsoleErrors: this.suppressSdkConsoleErrors,\n timeoutMs,\n verbose: this.verbose,\n client: initialClient,\n });\n await Promise.all(pendingEventWrites);\n const sessionInfo = await this.refreshSessionBinding(binding);\n state.sessionBindings[sessionInfo.key] = sessionInfo;\n await this.store.ensureSessionBundle(runDir, state, sessionInfo);\n const afterRecord = await resolveSessionRecord(sessionInfo.acpxRecordId);\n await this.store.writeSessionRecord(runDir, state, sessionInfo, afterRecord);\n const messageStartResolved = findConversationDeltaStart(\n beforeRecord.messages,\n afterRecord.messages,\n );\n\n return {\n rawText: capture.read(),\n sessionInfo,\n conversation: {\n sessionId: sessionInfo.bundleId,\n messageStart: messageStartResolved,\n messageEnd: Math.max(messageStartResolved, afterRecord.messages.length - 1),\n eventStartSeq:\n eventStartSeq ??\n (() => {\n throw new Error(`Missing ACP event capture for session ${sessionInfo.bundleId}`);\n })(),\n eventEndSeq:\n eventEndSeq ??\n (() => {\n throw new Error(`Missing ACP event capture for session ${sessionInfo.bundleId}`);\n })(),\n },\n };\n } finally {\n if (initialClient) {\n await initialClient.close().catch(() => {\n // best effort cleanup; persisted session state already exists\n });\n }\n }\n }\n\n private async closePendingPersistentSessionClients(): Promise<void> {\n const pendingClients = [...this.pendingPersistentSessionClients.values()];\n this.pendingPersistentSessionClients.clear();\n await Promise.all(\n pendingClients.map(async (client) => {\n await client.close().catch(() => {\n // best effort on flow shutdown\n });\n }),\n );\n }\n\n private async runIsolatedPrompt(\n runDir: string,\n state: FlowRunState,\n binding: FlowSessionBinding,\n agent: ResolvedFlowAgent,\n prompt: PromptInput,\n timeoutMs?: number,\n ): Promise<TracedPromptResult> {\n const capture = createQuietCaptureOutput();\n const conversation = createSessionConversation(state.currentNodeStartedAt ?? isoNow());\n let acpxState: SessionRecord[\"acpx\"] | undefined;\n recordPromptSubmission(conversation, prompt, state.currentNodeStartedAt ?? isoNow());\n let eventStartSeq: number | undefined;\n let eventEndSeq: number | undefined;\n const pendingEventWrites: Promise<void>[] = [];\n const result = await runOnce({\n agentCommand: agent.agentCommand,\n cwd: agent.cwd,\n prompt,\n mcpServers: this.mcpServers,\n permissionMode: this.permissionMode,\n nonInteractivePermissions: this.nonInteractivePermissions,\n authCredentials: this.authCredentials,\n authPolicy: this.authPolicy,\n outputFormatter: capture.formatter,\n onAcpMessage: (direction, message) => {\n const pending = this.store\n .appendSessionEvent(runDir, binding, direction, message)\n .then((seq) => {\n eventStartSeq = eventStartSeq === undefined ? seq : Math.min(eventStartSeq, seq);\n eventEndSeq = eventEndSeq === undefined ? seq : Math.max(eventEndSeq, seq);\n });\n pendingEventWrites.push(pending);\n },\n onSessionUpdate: (notification) => {\n acpxState = recordConversationSessionUpdate(conversation, acpxState, notification);\n },\n onClientOperation: (operation) => {\n acpxState = recordConversationClientOperation(conversation, acpxState, operation);\n },\n suppressSdkConsoleErrors: this.suppressSdkConsoleErrors,\n timeoutMs,\n verbose: this.verbose,\n sessionOptions: this.sessionOptions,\n });\n await Promise.all(pendingEventWrites);\n const sessionInfo: FlowSessionBinding = {\n ...binding,\n acpxRecordId: result.sessionId,\n acpSessionId: result.sessionId,\n };\n await this.store.ensureSessionBundle(runDir, state, sessionInfo);\n const syntheticRecord = createSyntheticSessionRecord({\n binding: sessionInfo,\n createdAt: state.currentNodeStartedAt ?? isoNow(),\n updatedAt: conversation.updated_at,\n conversation,\n acpxState: cloneSessionAcpxState(acpxState),\n lastSeq: eventEndSeq ?? 0,\n });\n await this.store.writeSessionRecord(runDir, state, sessionInfo, syntheticRecord);\n return {\n rawText: capture.read(),\n sessionInfo,\n conversation: {\n sessionId: sessionInfo.bundleId,\n messageStart: 0,\n messageEnd: Math.max(0, conversation.messages.length - 1),\n eventStartSeq:\n eventStartSeq ??\n (() => {\n throw new Error(`Missing ACP event capture for session ${sessionInfo.bundleId}`);\n })(),\n eventEndSeq:\n eventEndSeq ??\n (() => {\n throw new Error(`Missing ACP event capture for session ${sessionInfo.bundleId}`);\n })(),\n },\n };\n }\n}\n","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 if (mode === \"fenced\" || mode === \"compat\") {\n const fencedMatch = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)```/i);\n if (fencedMatch) {\n const fenced = tryParse(fencedMatch[1].trim());\n if (fenced.ok) {\n return fenced.value;\n }\n }\n }\n\n if (mode === \"compat\") {\n for (const candidate of extractBalancedJsonCandidates(trimmed)) {\n const parsed = tryParse(candidate);\n if (parsed.ok) {\n return parsed.value;\n }\n }\n }\n\n throw new Error(`Could not parse JSON from assistant output:\\n${trimmed}`);\n}\n\n// Use this when the model contract must be exact JSON and any extra text\n// should fail the step immediately.\nexport function parseStrictJsonObject(text: string): unknown {\n return parseJsonObject(text, { mode: \"strict\" });\n}\n\n// Default workflow parser: direct JSON first, fenced JSON second, and finally\n// a balanced embedded object for compatibility with chatty model output.\nexport function extractJsonObject(text: string): unknown {\n return parseJsonObject(text, { mode: \"compat\" });\n}\n\nfunction tryParse(text: string): { ok: true; value: unknown } | { ok: false } {\n try {\n return {\n ok: true,\n value: JSON.parse(text),\n };\n } catch {\n return {\n ok: false,\n };\n }\n}\n\nfunction extractBalancedJsonCandidates(text: string): string[] {\n const candidates: string[] = [];\n\n for (let index = 0; index < text.length; index += 1) {\n if (text[index] !== \"{\" && text[index] !== \"[\") {\n continue;\n }\n\n const result = scanBalanced(text, index);\n if (result) {\n candidates.push(result);\n }\n }\n\n return candidates;\n}\n\nfunction scanBalanced(text: string, startIndex: number): string | null {\n const stack: string[] = [];\n let inString = false;\n let escaped = false;\n\n for (let index = startIndex; index < text.length; index += 1) {\n const char = text[index];\n\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n continue;\n }\n\n if (char === \"{\" || char === \"[\") {\n stack.push(char);\n continue;\n }\n\n if (char !== \"}\" && char !== \"]\") {\n continue;\n }\n\n const last = stack.at(-1);\n if ((last === \"{\" && char !== \"}\") || (last === \"[\" && char !== \"]\")) {\n return null;\n }\n\n stack.pop();\n if (stack.length === 0) {\n return text.slice(startIndex, index + 1);\n }\n }\n\n return null;\n}\n"],"mappings":";;;;;;;;;;;AAEA,MAAM,wBAAwB,OAAO,IAAI,uBAAuB;AAEhE,SAAgB,gBAA8C,YAA0B;AACtF,KAAI,cAAc,WAAW,CAC3B,QAAO;AAGT,QAAO,eAAe,YAAY,uBAAuB;EACvD,OAAO;EACP,YAAY;EACZ,cAAc;EACd,UAAU;EACX,CAAC;AACF,QAAO;;AAGT,SAAgB,cAAc,OAAyC;AACrE,QACE,SAAS,QACT,OAAO,UAAU,YAChB,MAAuC,2BAA2B;;;;ACTvE,MAAM,kBAAkB;CAAC;CAAO;CAAW;CAAU;CAAa;AAElE,MAAM,gCAAgC,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa;AACvE,MAAM,8BAA8B,EAAE,QAAQ,CAAC,QAAQ,UAAU,MAAM,MAAM,CAAC,SAAS,GAAG,EACxF,SAAS,qBACV,CAAC;AAEF,SAAS,iBAA+C,OAAe;AACrE,QAAO,EAAE,OAAO,MAAM,CAAC,aAAa;;AAGtC,SAAS,eAAmC,OAA6B;AACvE,QAAO,EAAE,QAAW,UAAU,OAAO,UAAU,YAAY,EACzD,SAAS,GAAG,MAAM,sBACnB,CAAC;;AAGJ,MAAM,sBAAsB;CAC1B,WAAW,8BAA8B,UAAU;CACnD,aAAa,8BAA8B,UAAU;CACrD,cAAc,EAAE,QAAQ,CAAC,UAAU;CACpC;AAED,MAAM,mCAAmC,iBAAiB;CACxD,cAAc,EAAE,KAAK,iBAAiB;CACtC,sBAAsB,EAAE,SAAS,CAAC,UAAU;CAC5C,QAAQ,4BAA4B,UAAU;CAC/C,CAAC;AAEF,MAAM,0BAA0B,iBAAiB,EAC/C,OAAO,EACJ,MAAM,CACL,EAAE,QAAQ,EACV,eAAwE,YAAY,CACrF,CAAC,CACD,UAAU,EACd,CAAC;AAEF,MAAM,mBAAmB,iBAAiB;CACxC,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,UAAU,EAAE,SAAS,CAAC,UAAU;CACjC,CAAC;AAEF,MAAM,gBAAgB,iBAAiB;CACrC,GAAG;CACH,UAAU,EAAE,QAAQ,MAAM;CAC1B,SAAS,EAAE,QAAQ,CAAC,UAAU;CAC9B,KAAK,EACF,MAAM,CACL,EAAE,QAAQ,EACV,eAAsE,MAAM,CAC7E,CAAC,CACD,UAAU;CACb,SAAS,iBAAiB,UAAU;CACpC,QAAQ,eAA4C,SAAS;CAC7D,OAAO,eAAwD,QAAQ,CAAC,UAAU;CACnF,CAAC;AAEF,MAAM,oBAAoB,iBAAiB;CACzC,GAAG;CACH,UAAU,EAAE,QAAQ,UAAU;CAC9B,KAAK,eAA6C,MAAM;CACzD,CAAC;AAEF,MAAM,2BAA2B,iBAAiB;CAChD,GAAG;CACH,UAAU,EAAE,QAAQ,SAAS;CAC7B,KAAK,eAAoD,MAAM;CAChE,CAAC;AAEF,MAAM,wBAAwB,iBAAiB;CAC7C,GAAG;CACH,UAAU,EAAE,QAAQ,SAAS;CAC7B,MAAM,eAAkD,OAAO;CAC/D,OAAO,eAAgE,QAAQ,CAAC,UAAU;CAC3F,CAAC,CAAC,QAAQ,SAAS,CAAC,OAAO,MAAM,MAAM,EAAE,EACxC,SAAS,0CACV,CAAC;AAEF,MAAM,uBAAuB,iBAAiB;CAC5C,GAAG;CACH,UAAU,EAAE,QAAQ,aAAa;CACjC,SAAS,EAAE,QAAQ,CAAC,UAAU;CAC9B,KAAK,eAA6D,MAAM,CAAC,UAAU;CACpF,CAAC;AAEF,MAAM,uBAAuB,iBAAiB;CAC5C,MAAM,EAAE,QAAQ;CAChB,IAAI,EAAE,QAAQ;CACf,CAAC;AAEF,MAAM,uBAAuB,iBAAiB;CAC5C,MAAM,EAAE,QAAQ;CAChB,QAAQ,iBAAiB;EACvB,IAAI,EAAE,QAAQ;EACd,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC;EACxC,CAAC;CACH,CAAC;AAEF,MAAM,uBAAuB,iBAAiB;CAC5C,MAAM;CACN,KAAK,wBAAwB,UAAU;CACvC,aAAa,iCAAiC,UAAU;CACxD,SAAS,EAAE,QAAQ;CACnB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC;CACxC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC;CAC5B,CAAC;AAEF,MAAM,qBAAqB,EAAE,OAAO,EAClC,UAAU,EAAE,KAAK,gBAAgB,EAClC,CAAC;AAEF,SAAgB,+BAA+B,MAA4B;CACzE,MAAM,SAAS,gBAAgB,mBAAmB,sBAAsB,KAAK;AAE7E,MAAK,MAAM,CAAC,QAAQ,SAAS,OAAO,QAAQ,OAAO,MAAM,CACvD,oCAAmC,MAAM,cAAc,OAAO,GAAG;AAEnE,QAAO,MAAM,SAAS,MAAM,UAAU;AACpC,2BAAyB,MAAM,0BAA0B,QAAQ;GACjE;;AAGJ,SAAgB,6BAA6B,MAA+B;AAC1E,iBAAgB,uBAAuB,eAAe,KAAK;;AAG7D,SAAgB,iCAAiC,MAAmC;AAClF,iBAAgB,2BAA2B,mBAAmB,KAAK;;AAGrE,SAAgB,gCAAgC,MAAkC;AAChF,sCAAqC,MAAM,yBAAyB;;AAGtE,SAAgB,qCAAqC,MAAuC;AAC1F,iBAAgB,gCAAgC,uBAAuB,KAAK;;AAG9E,SAAgB,oCAAoC,MAAsC;AACxF,iBAAgB,8BAA8B,sBAAsB,KAAK;;AAG3E,SAAS,mCAAmC,MAAe,OAAqB;CAC9E,MAAM,EAAE,aAAa,gBAAgB,OAAO,oBAAoB,KAAK;AAErE,SAAQ,UAAR;EACE,KAAK;AACH,mBAAgB,OAAO,eAAe,KAAK;AAC3C;EACF,KAAK;AACH,mBAAgB,OAAO,mBAAmB,KAAK;AAC/C;EACF,KAAK;AACH,wCAAqC,MAAM,MAAM;AACjD;EACF,KAAK;AACH,mBAAgB,OAAO,sBAAsB,KAAK;AAClD;;;AAIN,SAAS,qCAAqC,MAAe,OAAqB;CAChF,MAAM,SAAS,OAAO,MAAM,MAAM;CAClC,MAAM,UAAU,OAAO,MAAM,OAAO;AAEpC,KAAI,WAAW,QACb,OAAM,IAAI,MAAM,WAAW,MAAM,uDAAuD;AAG1F,KAAI,SAAS;AACX,kBAAgB,OAAO,uBAAuB,KAAK;AACnD;;AAGF,iBAAgB,OAAO,0BAA0B,KAAK;;AAGxD,SAAS,yBAAyB,MAAe,OAAqB;CACpE,MAAM,QAAQ,OAAO,MAAM,KAAK;AAGhC,KAAI,UAFc,OAAO,MAAM,SAER,CACrB,OAAM,IAAI,MAAM,WAAW,MAAM,gDAAgD;AAGnF,KAAI,OAAO;AACT,kBAAgB,OAAO,sBAAsB,KAAK;AAClD;;AAGF,iBAAgB,OAAO,sBAAsB,KAAK;;AAGpD,SAAS,gBAAmB,OAAe,QAAsB,OAAmB;AAClF,KAAI;AACF,SAAO,OAAO,MAAM,MAAM;UACnB,OAAO;AACd,MAAI,iBAAiB,SACnB,OAAM,IAAI,MAAM,sBAAsB,OAAO,MAAM,EAAE,EAAE,OAAO,OAAO,CAAC;AAExE,QAAM;;;AAIV,SAAS,sBAAsB,OAAe,OAAyB;AAIrE,QAAO,WAAW,MAAM,IAHR,MAAM,KAAK,IAAI,IAAI,MAAM,OAAO,SAAS,UAAU,YAAY,MAAM,CAAC,CAAC,CAAC,CAAC,KACvF,KAEiC;;AAGrC,SAAS,YAAY,OAAmB,aAAuB,EAAE,EAAY;CAC3E,MAAM,OAAO,CAAC,GAAG,YAAY,GAAG,MAAM,KAAK,IAAI,OAAO,CAAC;AAEvD,KAAI,MAAM,SAAS,gBACjB,QAAO,MAAM,OAAO,SAAS,WAC3B,OAAO,SAAS,gBAAgB,YAAY,aAAa,KAAK,CAAC,CAChE;CAGH,MAAM,eAAe,KAAK,KAAK,IAAI;AACnC,QAAO,CAAC,eAAe,GAAG,aAAa,IAAI,MAAM,YAAY,MAAM,QAAQ;;AAG7E,SAAS,OAAO,OAAgB,KAAsB;AACpD,QACE,SAAS,QAAQ,OAAO,UAAU,YAAY,OAAO,UAAU,eAAe,KAAK,OAAO,IAAI;;;;AC7NlG,SAAgB,WAAyC,YAA0B;AACjF,gCAA+B,WAAW;AAC1C,QAAO,gBAAgB,WAAW;;AAGpC,SAAgB,IAAI,YAAoE;CACtF,MAAM,OAA0B;EAC9B,UAAU;EACV,GAAG;EACJ;AACD,8BAA6B,KAAK;AAClC,QAAO;;AAGT,SAAgB,QACd,YACuB;CACvB,MAAM,OAA8B;EAClC,UAAU;EACV,GAAG;EACJ;AACD,kCAAiC,KAAK;AACtC,QAAO;;AAST,SAAgB,OACd,YAGsB;CACtB,MAAM,OAA6B;EACjC,UAAU;EACV,GAAG;EACJ;AACD,iCAAgC,KAAK;AACrC,QAAO;;AAGT,SAAgB,MACd,YAC2B;CAC3B,MAAM,OAAkC;EACtC,UAAU;EACV,GAAG;EACJ;AACD,sCAAqC,KAAK;AAC1C,QAAO;;AAGT,SAAgB,WACd,aAAyD,EAAE,EACjC;CAC1B,MAAM,OAAiC;EACrC,UAAU;EACV,GAAG;EACJ;AACD,qCAAoC,KAAK;AACzC,QAAO;;;;AC9ET,SAAgB,yBAAyB,MAAoC;AAC3E,QAAO,UAAU,mBAAmB,KAAK,SAAS,KAAK,QAAQ,EAAE,CAAC;;AAGpE,SAAgB,mBAAmB,SAAiB,MAAwB;CAC1E,MAAM,eAAe,KAAK,KAAK,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,KAAK,IAAI;AACrE,QAAO,aAAa,SAAS,IAAI,GAAG,QAAQ,GAAG,iBAAiB;;AAGlE,eAAsB,eAAe,MAAwD;CAC3F,MAAM,MAAM,KAAK,OAAO,QAAQ,KAAK;CACrC,MAAM,OAAO,KAAK,QAAQ,EAAE;CAC5B,MAAM,UAAU,KAAK,KAAK;CAC1B,MAAM,QAAQ,MAAM,KAAK,SAAS,MAAM;EACtC;EACA,KAAK;GACH,GAAG,QAAQ;GACX,GAAG,KAAK;GACT;EACD,OAAO,KAAK;EACZ,OAAO;GAAC;GAAQ;GAAQ;GAAO;EAC/B,aAAa;EACd,CAAC;CAEF,IAAI,SAAS;CACb,IAAI,SAAS;CACb,IAAI,WAAW;CACf,IAAI;CAEJ,MAAM,SAAS,IAAI,SAA4B,SAAS,WAAW;AACjE,QAAM,OAAO,YAAY,OAAO;AAChC,QAAM,OAAO,YAAY,OAAO;AAChC,QAAM,OAAO,GAAG,SAAS,UAAkB;AACzC,aAAU;IACV;AACF,QAAM,OAAO,GAAG,SAAS,UAAkB;AACzC,aAAU;IACV;AAEF,QAAM,KAAK,SAAS,OAAO;AAC3B,QAAM,KAAK,SAAS,UAAU,WAAW;GACvC,MAAM,SAA4B;IAChC,SAAS,KAAK;IACd;IACA;IACA;IACA;IACA,gBAAgB,GAAG,SAAS;IAC5B;IACA;IACA,YAAY,KAAK,KAAK,GAAG;IAC1B;AAED,OAAI,UAAU;AACZ,WAAO,IAAI,aAAa,KAAK,aAAa,EAAE,CAAC;AAC7C;;AAGF,SAAM,YAAY,OAAO,KAAK,UAAU,SAAS,KAAK,qBAAqB,MAAM;AAC/E,2BACE,IAAI,MACF,wBAAwB,mBAAmB,KAAK,SAAS,KAAK,CAAC,KAAK,SAAS,UAAU,WAAW,QAAQ,OAAO,SAAS,KAAK,OAAO,SAAS,IAAI,KAAK,OAAO,MAAM,KAAK,KAC3K,CACF;AACD;;AAGF,WAAQ,OAAO;IACf;GACF;AAEF,KAAI,KAAK,SAAS,KAChB,OAAM,MAAM,MAAM,KAAK,MAAM;AAE/B,OAAM,MAAM,KAAK;AAEjB,KAAI,KAAK,aAAa,QAAQ,KAAK,YAAY,EAC7C,WAAU,iBAAiB;AACzB,aAAW;AACX,QAAM,KAAK,UAAU;AACrB,mBAAiB;AACf,SAAM,KAAK,UAAU;KACpB,IAAM,CAAC,OAAO;IAChB,KAAK,UAAU;AAGpB,KAAI;AACF,SAAO,MAAM;WACL;AACR,MAAI,QACF,cAAa,QAAQ;;;;;AC3F3B,SAAgB,uBAAuB,MAA4B;AACjE,gCAA+B,KAAK;AACpC,KAAI,CAAC,KAAK,MAAM,KAAK,SACnB,OAAM,IAAI,MAAM,+BAA+B,KAAK,UAAU;CAGhE,MAAM,gCAAgB,IAAI,KAAa;AACvC,MAAK,MAAM,QAAQ,KAAK,OAAO;AAC7B,MAAI,CAAC,KAAK,MAAM,KAAK,MACnB,OAAM,IAAI,MAAM,2CAA2C,KAAK,OAAO;AAEzE,MAAI,cAAc,IAAI,KAAK,KAAK,CAC9B,OAAM,IAAI,MAAM,uDAAuD,KAAK,OAAO;AAErF,gBAAc,IAAI,KAAK,KAAK;AAC5B,MAAI,QAAQ,MAAM;AAChB,OAAI,CAAC,KAAK,MAAM,KAAK,IACnB,OAAM,IAAI,MAAM,yCAAyC,KAAK,KAAK;AAErE;;AAEF,OAAK,MAAM,UAAU,OAAO,OAAO,KAAK,OAAO,MAAM,CACnD,KAAI,CAAC,KAAK,MAAM,QACd,OAAM,IAAI,MAAM,2CAA2C,SAAS;;;AAM5E,SAAgB,YACd,OACA,MACA,QACA,QACe;CACf,MAAM,OAAO,MAAM,MAAM,cAAc,UAAU,SAAS,KAAK;AAC/D,KAAI,CAAC,KACH,QAAO;AAGT,KAAI,QAAQ,KACV,QAAO,KAAK;CAGd,MAAM,QAAQ,gBAAgB,QAAQ,QAAQ,KAAK,OAAO,GAAG;AAC7D,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,UAC7E,OAAM,IAAI,MAAM,wCAAwC,KAAK,OAAO,KAAK;CAE3E,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM;AAC5C,KAAI,CAAC,KACH,OAAM,IAAI,MAAM,2BAA2B,KAAK,OAAO,GAAG,GAAG,KAAK,UAAU,MAAM,GAAG;AAEvF,QAAO;;AAGT,SAAgB,sBACd,OACA,MACA,QACe;CACf,MAAM,OAAO,MAAM,MAAM,cAAc,UAAU,SAAS,KAAK;AAC/D,KAAI,CAAC,QAAQ,QAAQ,KACnB,QAAO;AAET,KAAI,CAAC,KAAK,OAAO,GAAG,WAAW,WAAW,CACxC,QAAO;CAET,MAAM,QAAQ,gBAAgB,KAAA,GAAW,QAAQ,KAAK,OAAO,GAAG;AAChE,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,UAC7E,OAAM,IAAI,MAAM,wCAAwC,KAAK,OAAO,KAAK;CAE3E,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM;AAC5C,KAAI,CAAC,KACH,OAAM,IAAI,MAAM,2BAA2B,KAAK,OAAO,GAAG,GAAG,KAAK,UAAU,MAAM,GAAG;AAEvF,QAAO;;AAGT,SAAS,gBACP,QACA,QACA,UACS;AACT,KAAI,SAAS,WAAW,WAAW,CACjC,QAAO,UAAU,QAAQ,KAAK,SAAS,MAAM,EAAkB,GAAG;AAEpE,KAAI,SAAS,WAAW,WAAW,CACjC,QAAO,UAAU,QAAQ,KAAK,SAAS,MAAM,EAAkB,GAAG;AAEpE,QAAO,UAAU,QAAQ,SAAS;;AAGpC,SAAS,UAAU,OAAgB,UAA2B;AAC5D,KAAI,CAAC,SAAS,WAAW,KAAK,CAC5B,OAAM,IAAI,MAAM,0BAA0B,WAAW;AAGvD,QAAO,SACJ,MAAM,EAAE,CACR,MAAM,IAAI,CACV,QAAQ,SAAkB,QAAQ;AACjC,MAAI,WAAW,QAAQ,OAAO,YAAY,SACxC;AAEF,SAAQ,QAAoC;IAC3C,MAAM;;;;AClFb,SAAgBA,WAAiB;AAC/B,yBAAO,IAAI,MAAM,EAAC,aAAa;;AAGjC,SAAgB,kBACd,OACA,QACA,OACA,OACe;AACf,KACE,MAAM,eAAe,KAAA,MACpB,MAAM,WAAW,YAAY,MAAM,WAAW,aAE/C,QAAO,QAAQ,SAAS;AAG1B,OAAM,SAAS,iBAAiB,eAAe,cAAc;AAC7D,OAAM,YAAYA,UAAQ;AAC1B,OAAM,aAAa,MAAM;AACzB,OAAM,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACpE,OAAM,eAAe,MAAM,cACvB,aAAa,MAAM,YAAY,IAAI,MAAM,UACzC,MAAM;AACV,QAAO,MAAM,cAAc,QAAQ,OAAO;EACxC,OAAO;EACP,MAAM;EACN,SAAS;GACP,QAAQ,MAAM;GACd,OAAO,MAAM;GACd;EACF,CAAC;;AAGJ,SAAgB,oBACd,OACA,OACA,UACiB;AACjB,QAAO;EACL;EACA,SAAS,MAAM;EACf,SAAS,MAAM;EACf;EACA;EACD;;AAGH,SAAgB,gBACd,OACA,QACA,WACA,UACA,WACA,QACM;AACN,OAAM,SAAS;AACf,OAAM,YAAY,KAAA;AAClB,OAAM,cAAc;AACpB,OAAM,mBAAmB;AACzB,OAAM,kBAAkB;AACxB,OAAM,uBAAuB;AAC7B,OAAM,kBAAkB;AACxB,OAAM,eAAe,UAAU,WAAW,SAAS,QAAQ;;AAG7D,SAAgB,gBAAgB,OAAqB,QAAuB;AAC1E,OAAM,cAAc,KAAA;AACpB,OAAM,mBAAmB,KAAA;AACzB,OAAM,kBAAkB,KAAA;AACxB,OAAM,uBAAuB,KAAA;AAC7B,OAAM,kBAAkB,KAAA;AACxB,OAAM,eAAe;;AAGvB,SAAgB,mBAAmB,OAAqB,QAAuB;AAC7E,KAAI,CAAC,OACH;AAEF,OAAM,eAAe;;AAGvB,eAAsB,kBACpB,OACA,QACA,OACA,QACA,WACA,QACA,WAC+B;CAC/B,MAAM,QAAuB,YAAY,gBAAgB,UAAU,GAAG,EAAE;AACxE,KAAI,WAAW,KAAA,GAAW;EACxB,MAAM,eAAe,eAAe,OAAO;AAC3C,MAAI,iBAAiB,KAAA,EACnB,OAAM,eAAe;MAErB,OAAM,iBAAiB,MAAM,MAAM,cAAc,QAAQ,OAAO,QAAQ;GACtE,WAAW,wBAAwB,OAAO;GAC1C,WAAW,wBAAwB,OAAO;GAC1C;GACA;GACD,CAAC;;AAGN,QAAO,OAAO,KAAK,MAAM,CAAC,SAAS,IAAI,QAAQ;;AAGjD,SAAgB,qBAAqB,QAA2C;AAC9E,QAAO,OAAO,WAAW,WAAW,WAAW,OAAO,GAAG;;AAG3D,eAAsB,eACpB,YACA,KACA,SACiB;AACjB,KAAI,OAAO,QAAQ,YAAY;EAC7B,MAAM,WAAY,MAAM,IAAI,QAAQ,IAAK;AACzC,SAAO,KAAK,QAAQ,YAAY,SAAS;;AAE3C,QAAO,KAAK,QAAQ,YAAY,OAAO,WAAW;;AAGpD,SAAgB,sBAAsB,YAAoB,KAAiC;AACzF,QAAO,KAAK,QAAQ,YAAY,OAAO,WAAW;;AAGpD,SAAgB,gBAAgB,YAAoB,gBAAiC;AACnF,KAAI,eACF,QAAO;CAGT,MAAM,OAAO,WACV,MAAM,KAAK,CACX,KAAK,cAAc,UAAU,MAAM,CAAC,CACpC,MAAM,cAAc,UAAU,SAAS,EAAE;AAE5C,KAAI,CAAC,KACH,QAAO;AAIT,QAAO,QADW,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO;;AAIrE,SAAgB,2BAGd;CACA,MAAM,SAAmB,EAAE;AAO3B,QAAO;EACL,WAAW,sBAAsB,SAAS,EACxC,QAAA,EAPF,MAAM,OAAe;AACnB,UAAO,KAAK,MAAM;KAMZ,EACP,CAAC;EACF,YAAY,OAAO,KAAK,GAAG,CAAC,MAAM;EACnC;;AAGH,eAAsB,oBACpB,MACA,OACA,UAC6B;CAC7B,MAAM,kBAAkB,KAAK,KAAK;AAClC,KAAI,oBAAoB,KAAA,EACtB;AAQF,QAAO,sBAJL,OAAO,oBAAoB,aACvB,MAAM,QAAQ,QAAQ,gBAAgB;EAAE;EAAO,UAAU,KAAK;EAAM;EAAU,CAAC,CAAC,GAChF,gBAEgC;;AAGxC,SAAgB,sBAAsB,OAA+C;CACnF,MAAM,UAAU,OAAO,MAAM;AAC7B,QAAO,UAAU,UAAU,KAAA;;AAG7B,SAAgB,YAAY,UAA0B;AAMpD,QAAO,GALOA,UAAQ,CAAC,WAAW,KAAK,GAAG,CAAC,WAAW,KAAK,GAK5C,CAAC,GAJH,SACV,QAAQ,gBAAgB,IAAI,CAC5B,QAAQ,YAAY,GAAG,CACvB,aACoB,CAAC,GAAG,YAAY,CAAC,MAAM,GAAG,EAAE;;AAGrD,SAAgB,wBAAwB,cAAsB,KAAa,QAAwB;AACjG,QAAO,GAAG,aAAa,IAAI,IAAI,IAAI;;AAGrC,SAAgB,kBACd,UACA,QACA,KACA,OACQ;AAER,QAAO,GAAG,SAAS,GAAG,OAAO,GADf,gBAAgB,IACO,CAAC,GAAG,MAAM,MAAM,GAAG;;AAG1D,SAAgB,sBAAsB,QAAgB,KAAqB;AAKzE,QAAO,GAJY,OAChB,QAAQ,gBAAgB,IAAI,CAC5B,QAAQ,YAAY,GAAG,CACvB,aACiB,IAAI,UAAU,GAAG,gBAAgB,IAAI;;AAG3D,SAAgB,6BACd,UACA,OACA,WACA,SACA,OACoB;CACpB,MAAM,MAAM,aAAa;CACzB,MAAM,SAAS;AACf,QAAO;EACL;EACA;EACA,UAAU,sBAAsB,GAAG,OAAO,GAAG,aAAa,GAAG,IAAI,IAAI,MAAM,MAAM;EACjF,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,MAAM,GAAG;EACjD;EACA,WAAW,MAAM;EACjB,cAAc,MAAM;EACpB,KAAK,MAAM;EACX,cAAc;EACd,cAAc;EACf;;AAGH,SAAgB,6BAA6B,SAU3B;AAChB,QAAO;EACL,QAAQ;EACR,cAAc,QAAQ,QAAQ;EAC9B,cAAc,QAAQ,QAAQ;EAC9B,gBAAgB,QAAQ,QAAQ;EAChC,cAAc,QAAQ,QAAQ;EAC9B,KAAK,QAAQ,QAAQ;EACrB,MAAM,QAAQ,QAAQ;EACtB,WAAW,QAAQ;EACnB,YAAY,QAAQ;EACpB,SAAS,QAAQ;EACjB,eAAe,KAAA;EACf,UAAU,uBAAuB,QAAQ,QAAQ,aAAa;EAC9D,QAAQ;EACR,UAAU,QAAQ;EAClB,OAAO,QAAQ,aAAa;EAC5B,UAAU,QAAQ,aAAa;EAC/B,YAAY,QAAQ,aAAa;EACjC,wBAAwB,QAAQ,aAAa;EAC7C,qBAAqB,QAAQ,aAAa;EAC1C,MAAM,QAAQ;EACf;;AAGH,SAAgB,iBAAiB,SASd;AACjB,QAAO;EACL,WAAW,QAAQ;EACnB,QAAQ,QAAQ;EAChB,UAAU,QAAQ;EAClB,SAAS,QAAQ;EACjB,WAAW,QAAQ;EACnB,YAAY,QAAQ;EACpB,YAAY,IAAI,KAAK,QAAQ,WAAW,CAAC,SAAS,GAAG,IAAI,KAAK,QAAQ,UAAU,CAAC,SAAS;EAC1F,QAAQ,QAAQ;EAChB,OAAO,QAAQ;EAChB;;AAGH,SAAgB,gBAAgB,OAAiC;AAC/D,KAAI,iBAAiB,aACnB,QAAO;AAET,KAAI,iBAAiB,iBACnB,QAAO;AAET,QAAO;;AAGT,SAAS,gBAAgB,OAAuB;AAC9C,QAAO,WAAW,OAAO,CAAC,OAAO,MAAM,CAAC,OAAO,MAAM,CAAC,MAAM,GAAG,EAAE;;AAGnE,SAAgB,cAAc,eAAoC,QAAwB;CACxF,MAAM,QAAQ,cAAc,IAAI,OAAO,IAAI,KAAK;AAChD,eAAc,IAAI,QAAQ,KAAK;AAC/B,QAAO,GAAG,OAAO,GAAG;;AAGtB,SAAgB,yBACd,QACA,OACyB;AACzB,QAAO;EACL,UAAU,OAAO;EACjB,SAAS,OAAO;EAChB,YAAY,OAAO;EACnB,OAAO,OAAO,SAAS;EACvB,GAAG;EACJ;;AAGH,SAAgB,gBAAgB,OAAgB,OAAoC;CAClF,MAAM,WACJ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,UAAU,WAAW,QAAQ,OAAO,MAAM,CAAC;AAC9F,UAA8D,gBAAgB;AAC/E,QAAO;;AAGT,SAAgB,yBAAyB,OAAkD;AACzF,KAAI,EAAE,iBAAiB,OACrB;AAEF,QAAQ,MAA2D;;AAGrE,SAAS,eAAe,OAAuE;AAC7F,KAAI,SAAS,QAAQ,OAAO,UAAU,YAAY,OAAO,UAAU,UACjE,QAAO;AAET,KAAI,OAAO,UAAU,SACnB,QAAO,MAAM,UAAU,OAAO,CAAC,MAAM,SAAS,KAAK,GAAG,QAAQ,KAAA;AAEhE,KAAI;EACF,MAAM,aAAa,KAAK,UAAU,MAAM;AACxC,MAAI,WAAW,UAAU,OAAO,CAAC,WAAW,SAAS,KAAK,CACxD,QAAO;SAEH;AACN;;;AAKJ,SAAS,wBAAwB,OAAwB;AACvD,QAAO,OAAO,UAAU,WAAW,eAAe;;AAGpD,SAAS,wBAAwB,OAAwB;AACvD,QAAO,OAAO,UAAU,WAAW,QAAQ;;AAG7C,SAAgB,2BACd,QACA,OACQ;CACR,MAAM,aAAa,KAAK,IAAI,OAAO,QAAQ,MAAM,OAAO;AACxD,MAAK,IAAI,UAAU,YAAY,WAAW,GAAG,WAAW,GAAG;EACzD,IAAI,UAAU;AACd,OAAK,IAAI,QAAQ,GAAG,QAAQ,SAAS,SAAS,GAAG;GAC/C,MAAM,gBAAgB,OAAO,OAAO,SAAS,UAAU;GACvD,MAAM,eAAe,MAAM;AAC3B,OAAI,CAAC,cAAc,eAAe,aAAa,EAAE;AAC/C,cAAU;AACV;;;AAGJ,MAAI,QACF,QAAO;;AAGX,QAAO;;AAGT,SAAS,cAAc,MAAe,OAAyB;AAC7D,QAAO,KAAK,UAAU,KAAK,KAAK,KAAK,UAAU,MAAM;;;;ACnZvD,MAAM,qBAAqB;AAC3B,MAAM,oBAAoB;AAC1B,MAAM,uBAAuB;AAE7B,MAAM,gBAAgB;AACtB,MAAM,qBAAqB;AAC3B,MAAM,aAAa;AACnB,MAAM,kBAAkB;AACxB,MAAM,sBAAsB;AAC5B,MAAM,uBAAuB;AAC7B,MAAM,wBAAwB;AAC9B,MAAM,eAAe;AACrB,MAAM,gBAAgB;AA+BtB,SAAgB,gBAAgB,UAAkB,GAAG,SAAS,EAAU;AACtE,QAAO,KAAK,KAAK,SAAS,SAAS,SAAS,OAAO;;AAGrD,IAAa,eAAb,MAA0B;CACxB;CACA,gCAAiC,IAAI,KAAqB;CAC1D,qCAAsC,IAAI,KAAqB;CAC/D,gCAAiC,IAAI,KAA8B;CACnE,oCAAqC,IAAI,KAA4B;CAErE,YAAY,aAAqB,iBAAiB,EAAE;AAClD,OAAK,aAAa;;CAGpB,MAAM,aAAa,OAAgC;EACjD,MAAM,SAAS,KAAK,KAAK,KAAK,YAAY,MAAM;AAChD,QAAM,GAAG,MAAM,KAAK,KAAK,QAAQ,gBAAgB,EAAE,EAAE,WAAW,MAAM,CAAC;AACvE,QAAM,GAAG,MAAM,KAAK,KAAK,QAAQ,aAAa,EAAE,EAAE,WAAW,MAAM,CAAC;AACpE,QAAM,GAAG,MAAM,KAAK,KAAK,QAAQ,cAAc,EAAE,EAAE,WAAW,MAAM,CAAC;AACrE,OAAK,cAAc,IAAI,QAAQ,EAAE;AACjC,SAAO;;CAGT,MAAM,oBACJ,QACA,SAKe;EACf,MAAM,WAAW,6BAA6B,QAAQ,KAAK;EAC3D,MAAM,WAA4B;GAChC,QAAQ;GACR,OAAO,QAAQ,MAAM;GACrB,UAAU,QAAQ,MAAM;GACxB,UAAU,QAAQ,MAAM;GACxB,UAAU,QAAQ,MAAM;GACxB,WAAW,QAAQ,MAAM;GACzB,YAAY,QAAQ,MAAM;GAC1B,QAAQ,QAAQ,MAAM;GACtB,aAAa;GACb,OAAO;IACL,MAAM;IACN,OAAO;IACP,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,aAAa;IACb,cAAc;IACf;GACD,UAAU,EAAE;GACb;AAED,OAAK,cAAc,IAAI,QAAQ,SAAS;AACxC,QAAM,gBAAgB,KAAK,eAAe,QAAQ,mBAAmB,EAAE,SAAS;AAChF,QAAM,gBAAgB,KAAK,eAAe,QAAQ,cAAc,EAAE,SAAS;AAC3E,QAAM,gBAAgB,KAAK,eAAe,QAAQ,oBAAoB,EAAE,QAAQ,MAAM;AACtF,QAAM,gBACJ,KAAK,eAAe,QAAQ,qBAAqB,EACjD,gBAAgB,QAAQ,MAAM,CAC/B;AACD,QAAM,gBAAgB,KAAK,eAAe,QAAQ,sBAAsB,EAAE,QAAQ,MAAM,MAAM;AAC9F,QAAM,WAAW,KAAK,eAAe,QAAQ,WAAW,CAAC;AAEzD,QAAM,KAAK,YAAY,QAAQ,QAAQ,OAAO;GAC5C,OAAO;GACP,MAAM;GACN,SAAS;IACP,UAAU,QAAQ,MAAM;IACxB,GAAI,QAAQ,MAAM,WAAW,EAAE,UAAU,QAAQ,MAAM,UAAU,GAAG,EAAE;IACtE,GAAI,QAAQ,MAAM,WAAW,EAAE,UAAU,QAAQ,MAAM,UAAU,GAAG,EAAE;IACtE,GAAI,QAAQ,gBAAgB,EAAE,eAAe,QAAQ,eAAe,GAAG,EAAE;IAC1E;GACF,CAAC;;CAGJ,MAAM,cACJ,QACA,OACA,OACe;AACf,QAAM,YAAY,QAAQ;AAC1B,QAAM,gBAAgB,KAAK,eAAe,QAAQ,oBAAoB,EAAE,MAAM;AAC9E,QAAM,gBACJ,KAAK,eAAe,QAAQ,qBAAqB,EACjD,gBAAgB,MAAM,CACvB;AACD,QAAM,gBAAgB,KAAK,eAAe,QAAQ,sBAAsB,EAAE,MAAM,MAAM;AACtF,QAAM,KAAK,cAAc,QAAQ,MAAM;AACvC,QAAM,KAAK,YAAY,QAAQ,OAAO,MAAM;;CAG9C,MAAM,UAAU,QAAgB,OAAqB,OAA2C;AAC9F,QAAM,YAAY,QAAQ;AAC1B,QAAM,gBACJ,KAAK,eAAe,QAAQ,qBAAqB,EACjD,gBAAgB,MAAM,CACvB;AACD,QAAM,KAAK,cAAc,QAAQ,MAAM;AACvC,QAAM,KAAK,YAAY,QAAQ,OAAO,MAAM;;CAG9C,MAAM,YACJ,QACA,OACA,OACyB;EACzB,MAAM,aAA6B;GACjC,KAAK,KAAK,aAAa,OAAO;GAC9B,IAAI,QAAQ;GACZ,OAAO,MAAM;GACb,GAAG;GACJ;AACD,QAAM,KAAK,eAAe,KAAK,eAAe,QAAQ,WAAW,EAAE,WAAW;AAC9E,SAAO;;CAGT,MAAM,cACJ,QACA,OACA,SACA,SAC0B;EAC1B,MAAM,SAAS,iBAAiB,SAAS,QAAQ,UAAU;EAC3D,MAAM,SAAS,WAAW,SAAS,CAAC,OAAO,OAAO,CAAC,OAAO,MAAM;EAChE,MAAM,eAAe,KAAK,MAAM,KAC9B,eACA,UAAU,SAAS,2BAA2B,QAAQ,UAAU,GACjE;EACD,MAAM,WAAW,KAAK,eAAe,QAAQ,aAAa;AAC1D,QAAM,GAAG,MAAM,KAAK,QAAQ,SAAS,EAAE,EAAE,WAAW,MAAM,CAAC;AAC3D,MAAI;AACF,SAAM,GAAG,OAAO,SAAS;UACnB;AACN,SAAM,GAAG,UAAU,UAAU,OAAO;;EAGtC,MAAM,WAA4B;GAChC,MAAM;GACN,WAAW,QAAQ;GACnB,OAAO,OAAO;GACd;GACD;AACD,MAAI,QAAQ,cAAc,MACxB,OAAM,KAAK,YAAY,QAAQ,OAAO;GACpC,OAAO;GACP,MAAM;GACN,QAAQ,QAAQ;GAChB,WAAW,QAAQ;GACnB,WAAW,QAAQ;GACnB;GACA,SAAS,EACP,UACD;GACF,CAAC;AAEJ,SAAO;;CAGT,MAAM,oBACJ,QACA,OACA,SACA,QACe;EACf,MAAM,aAAa,KAAK,eAAe,QAAQ,eAAe,QAAQ,SAAS,CAAC;AAChF,QAAM,GAAG,MAAM,YAAY,EAAE,WAAW,MAAM,CAAC;AAC/C,QAAM,gBAAgB,KAAK,KAAK,YAAY,eAAe,EAAE,QAAQ;AACrE,QAAM,WAAW,KAAK,KAAK,YAAY,gBAAgB,CAAC;AACxD,MAAI,OACF,OAAM,KAAK,mBAAmB,QAAQ,OAAO,SAAS,OAAO;EAG/D,MAAM,WAAW,KAAK,YAAY,QAAQ,MAAM;EAEhD,MAAM,QAAQ,CADG,SAAS,SAAS,MAAM,UAAU,MAAM,OAAO,QAAQ,SACjD;AACvB,MAAI,OAAO;GACT,MAAM,QAAkC;IACtC,IAAI,QAAQ;IACZ,QAAQ,QAAQ;IAChB,aAAa,KAAK,MAAM,KAAK,eAAe,QAAQ,SAAS,EAAE,eAAe;IAC9E,YAAY,KAAK,MAAM,KAAK,eAAe,QAAQ,SAAS,EAAE,cAAc;IAC5E,YAAY,KAAK,MAAM,KAAK,eAAe,QAAQ,SAAS,EAAE,gBAAgB;IAC/E;AACD,YAAS,SAAS,KAAK,MAAM;AAC7B,SAAM,gBAAgB,KAAK,eAAe,QAAQ,cAAc,EAAE,SAAS;;AAG7E,MAAI,MACF,OAAM,KAAK,YAAY,QAAQ,OAAO;GACpC,OAAO;GACP,MAAM;GACN,WAAW,QAAQ;GACnB,SAAS;IACP,WAAW,QAAQ;IACnB,QAAQ,QAAQ;IAChB,iBAAiB;KACf,MAAM,KAAK,MAAM,KAAK,eAAe,QAAQ,SAAS,EAAE,eAAe;KACvE,WAAW;KACX,QAAQ,MAAM,WAAW,KAAK,KAAK,YAAY,eAAe,CAAC;KAChE;IACF;GACF,CAAC;;CAIN,MAAM,mBACJ,QACA,QACA,SACA,QACe;EAEf,MAAM,gBAAgB,2BAA2B,SAAS,QADxC,KAAK,mBAAmB,IAAI,GAAG,OAAO,IAAI,QAAQ,WAAW,IAAI,EACP;AAC5E,QAAM,gBACJ,KAAK,eAAe,QAAQ,KAAK,MAAM,KAAK,eAAe,QAAQ,SAAS,EAAE,cAAc,CAAC,EAC7F,cACD;;CAGH,MAAM,mBACJ,QACA,SACA,WACA,SACiB;EACjB,MAAM,aAAa,GAAG,OAAO,IAAI,QAAQ;EACzC,MAAM,OAAO,KAAK,mBAAmB,IAAI,WAAW,IAAI,KAAK;AAC7D,OAAK,mBAAmB,IAAI,YAAY,IAAI;AAC5C,QAAM,KAAK,eACT,KAAK,eACH,QACA,KAAK,MAAM,KAAK,eAAe,QAAQ,SAAS,EAAE,gBAAgB,CACnE,EACD;GACE;GACA,IAAI,QAAQ;GACZ;GACA;GACD,CACF;AACD,SAAO;;CAGT,YAAoB,QAAgB,OAAsC;EACxE,MAAM,WAAW,KAAK,cAAc,IAAI,OAAO;AAC/C,MAAI,UAAU;AACZ,YAAS,YAAY,MAAM;AAC3B,YAAS,aAAa,MAAM;AAC5B,YAAS,SAAS,MAAM;AACxB,YAAS,WAAW,MAAM;AAC1B,YAAS,WAAW,MAAM;AAC1B,YAAS,WAAW,MAAM;AAC1B,UAAO;;EAGT,MAAM,UAA2B;GAC/B,QAAQ;GACR,OAAO,MAAM;GACb,UAAU,MAAM;GAChB,UAAU,MAAM;GAChB,UAAU,MAAM;GAChB,WAAW,MAAM;GACjB,YAAY,MAAM;GAClB,QAAQ,MAAM;GACd,aAAa;GACb,OAAO;IACL,MAAM;IACN,OAAO;IACP,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,aAAa;IACb,cAAc;IACf;GACD,UAAU,EAAE;GACb;AACD,OAAK,cAAc,IAAI,QAAQ,QAAQ;AACvC,SAAO;;CAGT,MAAc,cAAc,QAAgB,OAAoC;EAC9E,MAAM,WAAW,KAAK,YAAY,QAAQ,MAAM;AAChD,QAAM,gBAAgB,KAAK,eAAe,QAAQ,cAAc,EAAE,SAAS;;CAG7E,aAAqB,QAAwB;EAC3C,MAAM,QAAQ,KAAK,cAAc,IAAI,OAAO,IAAI,KAAK;AACrD,OAAK,cAAc,IAAI,QAAQ,KAAK;AACpC,SAAO;;CAGT,eAAuB,QAAgB,cAA8B;AACnE,SAAO,KAAK,KAAK,QAAQ,GAAG,aAAa,MAAM,IAAI,CAAC;;CAGtD,MAAc,eAAe,UAAkB,OAA+B;EAM5E,MAAM,WALQ,KAAK,kBAAkB,IAAI,SAAS,IAAI,QAAQ,SAAS,EAC/C,KAAK,YAAY;AACvC,SAAM,GAAG,MAAM,KAAK,QAAQ,SAAS,EAAE,EAAE,WAAW,MAAM,CAAC;AAC3D,SAAM,GAAG,WAAW,UAAU,GAAG,KAAK,UAAU,MAAM,CAAC,KAAK,OAAO;IAE5C,CAAC,cAAc;AACtC,OAAI,KAAK,kBAAkB,IAAI,SAAS,KAAK,QAC3C,MAAK,kBAAkB,OAAO,SAAS;IAEzC;AACF,OAAK,kBAAkB,IAAI,UAAU,QAAQ;AAC7C,QAAM;;;AAIV,SAAS,gBAAgB,OAAoC;AAC3D,QAAO;EACL,OAAO,MAAM;EACb,UAAU,MAAM;EAChB,UAAU,MAAM;EAChB,UAAU,MAAM;EAChB,WAAW,MAAM;EACjB,YAAY,MAAM;EAClB,WAAW,MAAM;EACjB,QAAQ,MAAM;EACd,aAAa,MAAM;EACnB,kBAAkB,MAAM;EACxB,iBAAiB,MAAM;EACvB,sBAAsB,MAAM;EAC5B,iBAAiB,MAAM;EACvB,cAAc,MAAM;EACpB,WAAW,MAAM;EACjB,OAAO,MAAM;EACb,iBAAiB,MAAM;EACxB;;AAGH,SAAS,6BAA6B,MAA8C;AAClF,QAAO;EACL,QAAQ;EACR,MAAM,KAAK;EACX,GAAI,KAAK,KAAK,UAAU,KAAA,IAAY,EAAE,KAAK,EAAE,UAAU,MAAM,EAAE,GAAG,EAAE;EACpE,GAAI,KAAK,cAAc,EAAE,aAAa,gBAAgB,KAAK,YAAY,EAAE,GAAG,EAAE;EAC9E,SAAS,KAAK;EACd,OAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,MAAM,CAAC,KAAK,CAAC,QAAQ,UAAU,CAAC,QAAQ,aAAa,KAAK,CAAC,CAAC,CACjF;EACD,OAAO,gBAAgB,KAAK,MAAM;EACnC;;AAGH,SAAS,aAAa,MAAmE;CACvF,MAAM,SAAS;EACb,UAAU,KAAK;EACf,GAAI,KAAK,cAAc,KAAA,IAAY,EAAE,WAAW,KAAK,WAAW,GAAG,EAAE;EACrE,GAAI,KAAK,gBAAgB,KAAA,IAAY,EAAE,aAAa,KAAK,aAAa,GAAG,EAAE;EAC3E,GAAI,KAAK,eAAe,EAAE,cAAc,KAAK,cAAc,GAAG,EAAE;EACjE;AAED,SAAQ,KAAK,UAAb;EACE,KAAK,MACH,QAAO;GACL,GAAG;GACH,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,SAAS,GAAG,EAAE;GACjD,SAAS;IACP,GAAI,KAAK,SAAS,SAAS,EAAE,QAAQ,KAAK,QAAQ,QAAQ,GAAG,EAAE;IAC/D,GAAI,KAAK,SAAS,WAAW,EAAE,UAAU,MAAM,GAAG,EAAE;IACrD;GACD,KAAK,YAAY,KAAK,IAAI;GAC1B,WAAW;GACX,UAAU,OAAO,KAAK,UAAU;GACjC;EACH,KAAK,UACH,QAAO;GACL,GAAG;GACH,QAAQ;GACT;EACH,KAAK,UAAU;GACb,MAAM,kBAAwC,UAAU,OAAO,UAAU;AACzE,UAAO;IACL,GAAG;IACH;IACA,QAAQ,SAAS;IACjB,SAAS,UAAU;IACnB,UAAU,WAAW,QAAQ,OAAO,KAAK,UAAU;IACpD;;EAEH,KAAK,aACH,QAAO;GACL,GAAG;GACH,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,SAAS,GAAG,EAAE;GACjD,QAAQ,OAAO,KAAK,QAAQ;GAC7B;;AAGL,OAAM,IAAI,MAAM,+BAA+B,OAAO,KAAqB,GAAG;;AAGhF,SAAS,YAAY,KAGnB;AACA,KAAI,OAAO,QAAQ,WACjB,QAAO,EAAE,MAAM,WAAW;AAE5B,KAAI,OAAO,QAAQ,SACjB,QAAO;EAAE,MAAM;EAAU,OAAO;EAAK;AAEvC,QAAO,EAAE,MAAM,WAAW;;AAG5B,SAAS,2BACP,SACA,QACA,eACe;AACf,QAAO;EACL,GAAG,gBAAgB,OAAO;EAC1B,SAAS;EACT,UAAU;GACR,GAAG,gBAAgB,OAAO,SAAS;GACnC,aAAa,KAAK,MAAM,KAAK,eAAe,QAAQ,SAAS,EAAE,gBAAgB;GAC/E,eAAe;GACf,cAAc;GACf;EACF;;AAGH,eAAe,gBAAgB,UAAkB,OAA+B;CAC9E,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,IAAI,GAAG,KAAK,KAAK,CAAC,GAAG,YAAY,CAAC;CAC1E,MAAM,UAAU,KAAK,UAAU,OAAO,MAAM,EAAE;AAC9C,OAAM,GAAG,MAAM,KAAK,QAAQ,SAAS,EAAE,EAAE,WAAW,MAAM,CAAC;AAC3D,OAAM,GAAG,UAAU,UAAU,GAAG,QAAQ,KAAK,OAAO;AACpD,OAAM,GAAG,OAAO,UAAU,SAAS;;AAGrC,eAAe,WAAW,UAAiC;AACzD,OAAM,GAAG,MAAM,KAAK,QAAQ,SAAS,EAAE,EAAE,WAAW,MAAM,CAAC;AAC3D,OAAM,GAAG,WAAW,UAAU,IAAI,OAAO;;AAG3C,eAAe,WAAW,UAAmC;CAC3D,MAAM,UAAU,MAAM,GAAG,SAAS,SAAS;AAC3C,QAAO,WAAW,SAAS,CAAC,OAAO,QAAQ,CAAC,OAAO,MAAM;;AAG3D,SAAS,iBAAiB,SAAkB,WAA2B;AACrE,KAAI,OAAO,YAAY,SACrB,QAAO,OAAO,KAAK,SAAS,OAAO;AAErC,KAAI,OAAO,SAAS,QAAQ,CAC1B,QAAO;AAET,KAAI,mBAAmB,WACrB,QAAO,OAAO,KAAK,QAAQ;AAE7B,KAAI,cAAc,mBAChB,QAAO,OAAO,KAAK,GAAG,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC,KAAK,OAAO;AAErE,QAAO,OAAO,KAAK,OAAO,QAAQ,EAAE,OAAO;;AAG7C,SAAS,2BAA2B,WAA2B;AAC7D,KAAI,CAAC,UACH,QAAO;AAET,QAAO,UAAU,WAAW,IAAI,GAAG,YAAY,IAAI;;AAGrD,SAAS,eAAe,UAA0B;AAChD,QAAO,KAAK,MAAM,KAAK,cAAc,SAAS;;AAGhD,SAAS,SAAiB;AACxB,yBAAO,IAAI,MAAM,EAAC,aAAa;;;;AChbjC,MAAM,4BAA4B;AAClC,MAAM,+BAA+B,KAAK;AAuB1C,IAAa,aAAb,MAAwB;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,kDAAmD,IAAI,KAAwB;CAE/E,YAAY,SAA4B;AACtC,OAAK,eAAe,QAAQ;AAC5B,OAAK,aAAa,QAAQ,aAAa,KAAA,EAAU,CAAC;AAClD,OAAK,iBAAiB,QAAQ;AAC9B,OAAK,aAAa,QAAQ;AAC1B,OAAK,4BAA4B,QAAQ;AACzC,OAAK,kBAAkB,QAAQ;AAC/B,OAAK,aAAa,QAAQ;AAC1B,OAAK,YAAY,QAAQ;AACzB,OAAK,uBACH,QAAQ,wBAAwB,QAAQ,aAAa;AACvD,OAAK,UAAU,QAAQ;AACvB,OAAK,2BAA2B,QAAQ;AACxC,OAAK,iBAAiB,QAAQ;AAC9B,OAAK,WAAW,QAAQ,YAAY,EAAE;AACtC,OAAK,QAAQ,IAAI,aAAa,QAAQ,WAAW;;CAGnD,MAAM,IACJ,MACA,OACA,UAAiC,EAAE,EACX;AACxB,yBAAuB,KAAK;EAE5B,MAAM,QAAQ,YAAY,KAAK,KAAK;EACpC,MAAM,WAAW,MAAM,oBAAoB,MAAM,OAAO,QAAQ,SAAS;EACzE,MAAM,SAAS,MAAM,KAAK,MAAM,aAAa,MAAM;EACnD,MAAM,QAAsB;GAC1B;GACA,UAAU,KAAK;GACf;GACA,UAAU,QAAQ;GAClB,WAAWC,UAAQ;GACnB,WAAWA,UAAQ;GACnB,QAAQ;GACR;GACA,SAAS,EAAE;GACX,SAAS,EAAE;GACX,OAAO,EAAE;GACT,iBAAiB,EAAE;GACpB;EACD,MAAM,gBAAgB,MAAM,KAAK,MAAM,cAAc,QAAQ,OAAO,OAAO;GACzE,WAAW;GACX,WAAW;GACX,WAAW;GACZ,CAAC;AACF,QAAM,KAAK,MAAM,oBAAoB,QAAQ;GAC3C;GACA;GACA;GACD,CAAC;EAEF,IAAI,UAAyB,KAAK;EAClC,MAAM,gCAAgB,IAAI,KAAqB;AAE/C,MAAI;AACF,UAAO,MAAM,cACX,YAAY;AACV,QAAI;AACF,YAAO,SAAS;MACd,MAAM,OAAO,KAAK,MAAM;AACxB,UAAI,CAAC,KACH,OAAM,IAAI,MAAM,sBAAsB,UAAU;MAGlD,MAAM,YAAY,cAAc,eAAe,QAAQ;MACvD,MAAM,YAAYA,UAAQ;MAC1B,MAAM,UAAU,oBAAoB,OAAO,OAAO,KAAK,SAAS;MAChE,IAAI;MACJ,IAAI,aAA4B;MAChC,IAAI,UAAyB;MAC7B,IAAI,cAAyC;MAC7C,IAAI,YAAsC;MAC1C,IAAI,QAA8B;AAClC,sBACE,OACA,SACA,WACA,KAAK,UACL,WACA,KAAK,aACN;AACD,YAAM,KAAK,MAAM,cAAc,QAAQ,OAAO;OAC5C,OAAO;OACP,MAAM;OACN,QAAQ;OACR;OACA,SAAS;QACP,UAAU,KAAK;QACf,GAAI,KAAK,cAAc,KAAA,IACnB,EAAE,WAAW,KAAK,aAAa,KAAK,sBAAsB,GAC1D,EAAE,WAAW,KAAK,sBAAsB;QAC5C,GAAI,MAAM,eAAe,EAAE,cAAc,MAAM,cAAc,GAAG,EAAE;QACnE;OACF,CAAC;MACF,IAAI;MACJ,IAAI;AACJ,UAAI;AACF,QAAC,CAAE,QAAQ,YAAY,SAAS,aAAa,WAAW,SACtD,MAAM,KAAK,YAAY,QAAQ,OAAO,MAAM,SAAS,MAAM,QAAQ;AACrE,eAAQ,MAAM,kBACZ,KAAK,OACL,QACA,OACA,SACA,WACA,QACA,MACD;AACD,oBAAa,iBAAiB;QAC5B;QACA,QAAQ;QACR,UAAU,KAAK;QACf,SAAS;QACT;QACA,YAAYA,UAAQ;QACpB;QACD,CAAC;eACK,OAAO;AACd,wBAAiB;AACjB,eAAQ,yBAAyB,MAAM,IAAI;AAC3C,eAAQ,MAAM,kBACZ,KAAK,OACL,QACA,OACA,SACA,WACA,KAAA,GACA,MACD;AACD,oBAAa,iBAAiB;QAC5B;QACA,QAAQ;QACR,UAAU,KAAK;QACf,SAAS,gBAAgB,MAAM;QAC/B;QACA,YAAYA,UAAQ;QACpB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;QAC9D,CAAC;;AAGJ,YAAM,QAAQ,WAAW;AAEzB,UAAI,WAAW,YAAY,QAAQ,KAAK,aAAa,cAAc;AACjE,aAAM,QAAQ,WAAW;AACzB,aAAM,YAAY;AAClB,aAAM,YAAYA,UAAQ;AAC1B,aAAM,SAAS;AACf,uBAAgB,OAAQ,QAAwC,WAAW,QAAQ;AACnF,aAAM,MAAM,KAAK;QACf;QACA,QAAQ;QACR,UAAU,KAAK;QACf,SAAS,WAAW;QACpB;QACA,YAAY,WAAW;QACvB;QACA;QACA;QACA,SAAS;QACT,OAAO;QACP,GAAI,QAAQ,EAAE,OAAO,GAAG,EAAE;QAC3B,CAAC;AACF,aAAM,KAAK,MAAM,cAAc,QAAQ,OAAO;QAC5C,OAAO;QACP,MAAM;QACN,QAAQ;QACR;QACA,SAAS,yBAAyB,YAAY,MAAM;QACrD,CAAC;AACF,cAAO;QACL;QACA;QACD;;AAGH,UAAI,WAAW,YAAY,KACzB,OAAM,QAAQ,WAAW;AAE3B,YAAM,YAAYA,UAAQ;AAC1B,sBAAgB,MAAM;AACtB,YAAM,MAAM,KAAK;OACf;OACA,QAAQ;OACR,UAAU,KAAK;OACf,SAAS,WAAW;OACpB;OACA,YAAY,WAAW;OACvB;OACA;OACA;OACA,OAAO,WAAW;OAClB,SAAS;OACT,OAAO;OACP,GAAI,QAAQ,EAAE,OAAO,GAAG,EAAE;OAC3B,CAAC;AAEF,YAAM,KAAK,MAAM,cAAc,QAAQ,OAAO;OAC5C,OAAO;OACP,MAAM;OACN,QAAQ;OACR;OACA,SAAS,yBAAyB,YAAY,MAAM;OACrD,CAAC;AAEF,UAAI,WAAW,YAAY,MAAM;AAC/B,iBAAU,YAAY,KAAK,OAAO,SAAS,QAAQ,WAAW;AAC9D;;MAGF,MAAM,OAAO,sBAAsB,KAAK,OAAO,SAAS,WAAW;AACnE,UAAI,MAAM;AACR,iBAAU;AACV;;AAGF,YAAM;;AAGR,WAAM,SAAS;AACf,WAAM,aAAaA,UAAQ;AAC3B,WAAM,YAAY,MAAM;AACxB,qBAAgB,MAAM;AACtB,WAAM,KAAK,MAAM,cAAc,QAAQ,OAAO;MAC5C,OAAO;MACP,MAAM;MACN,SAAS,EACP,QAAQ,MAAM,QACf;MACF,CAAC;AACF,YAAO;MACL;MACA;MACD;aACM,OAAO;AACd,WAAM,kBAAkB,KAAK,OAAO,QAAQ,OAAO,MAAM;AACzD,WAAM;;MAGV,YAAY;AACV,UAAM,kBAAkB,KAAK,OAAO,QAAQ,OAAO,IAAI,kBAAkB,CAAC;KAE7E;YACO;AACR,SAAM,KAAK,sCAAsC;;;CAIrD,MAAc,YACZ,QACA,OACA,MACA,QACA,MACA,SACkC;AAClC,UAAQ,KAAK,UAAb;GACE,KAAK,UACH,QAAO,MAAM,KAAK,mBAAmB,QAAQ,OAAO,MAAM,QAAQ;GACpE,KAAK,SACH,QAAO,MAAM,KAAK,kBAAkB,QAAQ,OAAO,MAAM,QAAQ;GACnE,KAAK,aACH,QAAO,MAAM,KAAK,sBAAsB,QAAQ,OAAO,QAAQ,MAAM,QAAQ;GAC/E,KAAK,MACH,QAAO,MAAM,KAAK,eAAe,QAAQ,OAAO,MAAM,MAAM,QAAQ;GACtE,QAEE,OAAM,IAAI,MAAM,0BAA0B,OAAOC,KAAW,GAAG;;;CAKrE,MAAc,mBACZ,QACA,OACA,MACA,SACkC;EAClC,MAAM,gBAAgB,KAAK,aAAa,KAAK;AAS7C,SAAO;GACL,QAAA,MATmB,KAAK,iBACxB,QACA,OACA,MAAM,eAAe,IACrB,MACA,eACA,YAAY,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,CAAC,CACrD;GAGC,YAAY;GACZ,SAAS;GACT,aAAa;GACb,WAAW;GACX,OAAO;GACR;;CAGH,MAAc,kBACZ,QACA,OACA,MACA,SACkC;EAClC,MAAM,gBAAgB,KAAK,aAAa,KAAK;AAC7C,MAAI,SAAS,KASX,QAAO;GACL,QAAA,MATmB,KAAK,iBACxB,QACA,OACA,MAAM,eAAe,IACrB,MACA,eACA,YAAY,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,CAAC,CACrD;GAGC,YAAY;GACZ,SAAS;GACT,aAAa;GACb,WAAW;GACX,OAAO,EACL,QAAQ,EACN,YAAY,YACb,EACF;GACF;EAGH,MAAM,EAAE,QAAQ,SAAS,UAAU,MAAM,KAAK,iBAC5C,QACA,OACA,MAAM,eAAe,IACrB,MACA,eACA,YAAY;GACV,MAAM,YAAY,MAAM,QAAQ,QAAQ,KAAK,KAAK,QAAQ,CAAC;GAC3D,MAAM,qBAA2C;IAC/C,GAAG;IACH,KAAK,sBAAsB,KAAK,YAAY,UAAU,IAAI;IAC1D,WAAW,UAAU,aAAa;IACnC;AACD,sBAAmB,OAAO,yBAAyB,mBAAmB,CAAC;AACvE,SAAM,KAAK,MAAM,UAAU,QAAQ,OAAO;IACxC,OAAO;IACP,MAAM;IACN,QAAQ,MAAM;IACd,WAAW,MAAM;IACjB,SAAS,EACP,cAAc,MAAM,cACrB;IACF,CAAC;AACF,SAAM,KAAK,MAAM,YAAY,QAAQ,OAAO;IAC1C,OAAO;IACP,MAAM;IACN,QAAQ,MAAM;IACd,WAAW,MAAM;IACjB,SAAS,EACP,QAAQ;KACN,YAAY;KACZ,SAAS,mBAAmB;KAC5B,MAAM,mBAAmB,QAAQ,EAAE;KACnC,KAAK,mBAAmB;KACzB,EACF;IACF,CAAC;GACF,MAAM,SAAS,MAAM,eAAe,mBAAmB;GACvD,MAAM,iBAAiB,MAAM,KAAK,MAAM,cAAc,QAAQ,OAAO,OAAO,QAAQ;IAClF,WAAW;IACX,WAAW;IACX,QAAQ,MAAM;IACd,WAAW,MAAM;IAClB,CAAC;GACF,MAAM,iBAAiB,MAAM,KAAK,MAAM,cAAc,QAAQ,OAAO,OAAO,QAAQ;IAClF,WAAW;IACX,WAAW;IACX,QAAQ,MAAM;IACd,WAAW,MAAM;IAClB,CAAC;AACF,SAAM,KAAK,MAAM,YAAY,QAAQ,OAAO;IAC1C,OAAO;IACP,MAAM;IACN,QAAQ,MAAM;IACd,WAAW,MAAM;IACjB,SAAS;KACP,QAAQ;MACN,YAAY;MACZ,SAAS,OAAO;MAChB,MAAM,OAAO;MACb,KAAK,OAAO;MACZ,UAAU,OAAO;MACjB,QAAQ,OAAO;MACf,YAAY,OAAO;MACpB;KACD;KACA;KACD;IACF,CAAC;GACF,MAAM,QAAuB;IAC3B,QAAQ;KACN,YAAY;KACZ,SAAS,OAAO;KAChB,MAAM,OAAO;KACb,KAAK,OAAO;KACZ,UAAU,OAAO;KACjB,QAAQ,OAAO;KACf,YAAY,OAAO;KACpB;IACD;IACA;IACD;GACD,IAAI;AACJ,OAAI;AACF,mBAAe,KAAK,QAAQ,MAAM,KAAK,MAAM,QAAQ,QAAQ,GAAG;YACzD,OAAO;AACd,UAAM,gBAAgB,OAAO,MAAM;;AAErC,UAAO;IACL,QAAQ;IACR,SAAS,OAAO;IAChB;IACD;IAEJ;AACD,SAAO;GACL;GACA,YAAY;GACZ;GACA,aAAa;GACb,WAAW;GACX;GACD;;CAGH,MAAc,sBACZ,QACA,OACA,QACA,MACA,SACkC;EAClC,MAAM,gBAAgB,KAAK,aAAa,KAAK;AAe7C,SAAO;GACL,QAdA,OAAO,KAAK,QAAQ,aAChB,MAAM,KAAK,iBACT,QACA,OACA,MAAM,eAAe,IACrB,MACA,eACA,YAAY,MAAM,QAAQ,QAAQ,KAAK,MAAM,QAAQ,CAAC,CACvD,GACD;IACE,YAAY;IACZ,SAAS,KAAK,WAAW;IAC1B;GAGL,YAAY;GACZ,SAAS;GACT,aAAa;GACb,WAAW;GACX,OAAO;GACR;;CAGH,MAAc,eACZ,QACA,OACA,MACA,MACA,SACkC;EAClC,MAAM,gBAAgB,KAAK,aAAa,KAAK;EAC7C,IAAI,eAA0C;AAC9C,SAAO,MAAM,KAAK,iBAChB,QACA,OACA,MAAM,eAAe,IACrB,MACA,eACA,YAAY;GACV,MAAM,gBAAgB,KAAK,aAAa,KAAK,QAAQ;GACrD,MAAM,YAAY;IAChB,GAAG;IACH,KAAK,MAAM,eAAe,cAAc,KAAK,KAAK,KAAK,QAAQ;IAChE;GACD,MAAM,SAAS,qBAAqB,MAAM,QAAQ,QAAQ,KAAK,OAAO,QAAQ,CAAC,CAAC;GAChF,MAAM,aAAa,oBAAoB,OAAO;AAC9C,sBAAmB,OAAO,gBAAgB,YAAY,KAAK,aAAa,CAAC;AACzE,SAAM,KAAK,MAAM,UAAU,QAAQ,OAAO;IACxC,OAAO;IACP,MAAM;IACN,QAAQ,MAAM;IACd,WAAW,MAAM;IACjB,SAAS,EACP,cAAc,MAAM,cACrB;IACF,CAAC;GACF,MAAM,iBAAiB,MAAM,KAAK,MAAM,cAAc,QAAQ,OAAO,YAAY;IAC/E,WAAW;IACX,WAAW;IACX,QAAQ,MAAM;IACd,WAAW,MAAM;IAClB,CAAC;AAEF,OAAI,KAAK,SAAS,UAAU;IAC1B,MAAM,kBAAkB,6BACtB,KAAK,MACL,MAAM,OACN,MAAM,oBAAoB,YAAY,EACtC,KAAK,SACL,UACD;IACD,MAAM,wBAAwB,6BAA6B;KACzD,SAAS;KACT,WAAW,MAAM,wBAAwBD,UAAQ;KACjD,WAAW,MAAM,wBAAwBA,UAAQ;KACjD,cAAc,0BAA0B,MAAM,wBAAwBA,UAAQ,CAAC;KAC/E,WAAW,KAAA;KACX,SAAS;KACV,CAAC;AACF,UAAM,KAAK,MAAM,oBACf,QACA,OACA,iBACA,sBACD;AACD,UAAM,KAAK,MAAM,YAAY,QAAQ,OAAO;KAC1C,OAAO;KACP,MAAM;KACN,QAAQ,MAAM;KACd,WAAW,MAAM;KACjB,WAAW,gBAAgB;KAC3B,SAAS;MACP,WAAW,gBAAgB;MAC3B;MACD;KACF,CAAC;IACF,MAAM,iBAAiB,MAAM,KAAK,kBAChC,QACA,OACA,iBACA,WACA,QACA,cACD;IACD,MAAM,sBAAsB,MAAM,KAAK,MAAM,cAC3C,QACA,OACA,eAAe,SACf;KACE,WAAW;KACX,WAAW;KACX,QAAQ,MAAM;KACd,WAAW,MAAM;KACjB,WAAW,gBAAgB;KAC5B,CACF;AACD,UAAM,KAAK,MAAM,YAAY,QAAQ,OAAO;KAC1C,OAAO;KACP,MAAM;KACN,QAAQ,MAAM;KACd,WAAW,MAAM;KACjB,WAAW,gBAAgB;KAC3B,SAAS;MACP,WAAW,gBAAgB;MAC3B,cAAc,eAAe;MAC7B;MACD;KACF,CAAC;IACF,MAAM,QAAuB;KAC3B,WAAW,gBAAgB;KAC3B;KACA;KACA,cAAc,eAAe;KAC9B;IACD,IAAI;AACJ,QAAI;AACF,oBAAe,KAAK,QAChB,MAAM,KAAK,MAAM,eAAe,SAAS,QAAQ,GACjD,eAAe;aACZ,OAAO;AACd,WAAM,gBAAgB,OAAO,MAAM;;AAErC,WAAO;KACL,QAAQ;KACR;KACA,SAAS,eAAe;KACxB,aAAa;KACb;KACA;KACD;;AAGH,kBAAe,MAAM,KAAK,qBACxB,QACA,OACA,MACA,MACA,WACA,cACD;AACD,SAAM,KAAK,MAAM,YAAY,QAAQ,OAAO;IAC1C,OAAO;IACP,MAAM;IACN,QAAQ,MAAM;IACd,WAAW,MAAM;IACjB,WAAW,aAAa;IACxB,SAAS;KACP,WAAW,aAAa;KACxB;KACD;IACF,CAAC;GACF,MAAM,mBAAmB,MAAM,KAAK,oBAClC,QACA,OACA,cACA,QACA,cACD;GACD,MAAM,sBAAsB,MAAM,KAAK,MAAM,cAC3C,QACA,OACA,iBAAiB,SACjB;IACE,WAAW;IACX,WAAW;IACX,QAAQ,MAAM;IACd,WAAW,MAAM;IACjB,WAAW,iBAAiB,YAAY;IACzC,CACF;AACD,SAAM,KAAK,MAAM,YAAY,QAAQ,OAAO;IAC1C,OAAO;IACP,MAAM;IACN,QAAQ,MAAM;IACd,WAAW,MAAM;IACjB,WAAW,iBAAiB,YAAY;IACxC,SAAS;KACP,WAAW,iBAAiB,YAAY;KACxC,cAAc,iBAAiB;KAC/B;KACD;IACF,CAAC;GACF,MAAM,QAAuB;IAC3B,WAAW,iBAAiB,YAAY;IACxC;IACA;IACA,cAAc,iBAAiB;IAChC;GACD,IAAI;AACJ,OAAI;AACF,mBAAe,KAAK,QAChB,MAAM,KAAK,MAAM,iBAAiB,SAAS,QAAQ,GACnD,iBAAiB;YACd,OAAO;AACd,UAAM,gBAAgB,OAAO,MAAM;;AAErC,UAAO;IACL,QAAQ;IACR;IACA,SAAS,iBAAiB;IAC1B,aAAa,iBAAiB;IAC9B;IACA;IACD;KAEH,YAAY;AACV,OAAI,CAAC,aACH;AAEF,SAAM,oBAAoB,EACxB,WAAW,aAAa,cACzB,CAAC;IAEL;;CAGH,MAAc,iBACZ,QACA,OACA,QACA,MACA,WACA,KACA,WACY;EACZ,MAAM,cAAc,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,eAAe,0BAA0B,CAAC;EAC1F,IAAI;EACJ,IAAI,SAAS;EACb,MAAM,YAAY,YAA2B;AAC3C,OAAI,CAAC,OACH;AAEF,SAAM,kBAAkBA,UAAQ;AAChC,SAAM,YAAY,MAAM;AACxB,SAAM,KAAK,MAAM,UAAU,QAAQ,OAAO;IACxC,OAAO;IACP,MAAM;IACN;IACA,WAAW,MAAM;IACjB,SAAS,EACP,cAAc,MAAM,cACrB;IACF,CAAC;;AAGJ,MAAI,cAAc,EAChB,SAAQ,kBAAkB;AACnB,cAAW;KACf,YAAY;AAGjB,MAAI;AACF,UAAO,MAAM,YAAY,KAAK,EAAE,UAAU;WACnC,OAAO;AACd,OAAI,iBAAiB,gBAAgB,UACnC,OAAM,WAAW,CAAC,YAAY,GAE5B;AAEJ,SAAM;YACE;AACR,YAAS;AACT,OAAI,MACF,eAAc,MAAM;;;CAK1B,MAAc,qBACZ,QACA,OACA,MACA,MACA,OACA,WAC6B;EAC7B,MAAM,SAAS,KAAK,SAAS,UAAU;EACvC,MAAM,MAAM,wBAAwB,MAAM,cAAc,MAAM,KAAK,OAAO;EAC1E,MAAM,WAAW,MAAM,gBAAgB;AACvC,MAAI,UAAU;AACZ,SAAM,KAAK,MAAM,oBAAoB,QAAQ,OAAO,SAAS;AAC7D,UAAO;;EAGT,MAAM,OAAO,kBAAkB,KAAK,MAAM,QAAQ,MAAM,KAAK,MAAM,MAAM;EACzE,MAAM,UAAU,MAAM,wBAAwB;GAC5C,cAAc,MAAM;GACpB,KAAK,MAAM;GACX;GACA,YAAY,KAAK;GACjB,gBAAgB,KAAK;GACrB,2BAA2B,KAAK;GAChC,iBAAiB,KAAK;GACtB,YAAY,KAAK;GACjB;GACA,SAAS,KAAK;GACd,gBAAgB,KAAK;GACtB,CAAC;EAEF,MAAM,UAA8B;GAClC;GACA;GACA,UAAU,sBAAsB,QAAQ,IAAI;GAC5C;GACA,SAAS,KAAK;GACd,WAAW,MAAM;GACjB,cAAc,MAAM;GACpB,KAAK,MAAM;GACX,cAAc,QAAQ,OAAO;GAC7B,cAAc,QAAQ,OAAO;GAC7B,gBAAgB,QAAQ,OAAO;GAChC;AACD,QAAM,gBAAgB,OAAO;AAC7B,OAAK,gCAAgC,IAAI,QAAQ,KAAK,QAAQ,OAAO;AACrE,QAAM,KAAK,MAAM,oBAAoB,QAAQ,OAAO,SAAS,QAAQ,OAAO;AAC5E,SAAO;;CAGT,MAAc,sBAAsB,SAA0D;EAC5F,MAAM,SAAS,MAAM,qBAAqB,QAAQ,aAAa;AAC/D,SAAO;GACL,GAAG;GACH,cAAc,OAAO;GACrB,gBAAgB,OAAO;GACxB;;CAGH,MAAc,oBACZ,QACA,OACA,SACA,QACA,WAC6B;EAC7B,MAAM,UAAU,0BAA0B;EAC1C,MAAM,eAAe,MAAM,qBAAqB,QAAQ,aAAa;EACrE,IAAI;EACJ,IAAI;EACJ,MAAM,qBAAsC,EAAE;EAC9C,MAAM,gBAAgB,KAAK,gCAAgC,IAAI,QAAQ,IAAI;AAC3E,MAAI,cACF,MAAK,gCAAgC,OAAO,QAAQ,IAAI;AAG1D,MAAI;AACF,SAAM,kBAAkB;IACtB,WAAW,QAAQ;IACnB;IACA,cAAc;IACd,YAAY,KAAK;IACjB,gBAAgB,KAAK;IACrB,2BAA2B,KAAK;IAChC,iBAAiB,KAAK;IACtB,YAAY,KAAK;IACjB,iBAAiB,QAAQ;IACzB,eAAe,WAAW,YAAY;KACpC,MAAM,UAAU,KAAK,MAClB,mBAAmB,QAAQ,SAAS,WAAW,QAAQ,CACvD,MAAM,QAAQ;AACb,sBAAgB,kBAAkB,KAAA,IAAY,MAAM,KAAK,IAAI,eAAe,IAAI;AAChF,oBAAc,gBAAgB,KAAA,IAAY,MAAM,KAAK,IAAI,aAAa,IAAI;OAC1E;AACJ,wBAAmB,KAAK,QAAQ;;IAElC,0BAA0B,KAAK;IAC/B;IACA,SAAS,KAAK;IACd,QAAQ;IACT,CAAC;AACF,SAAM,QAAQ,IAAI,mBAAmB;GACrC,MAAM,cAAc,MAAM,KAAK,sBAAsB,QAAQ;AAC7D,SAAM,gBAAgB,YAAY,OAAO;AACzC,SAAM,KAAK,MAAM,oBAAoB,QAAQ,OAAO,YAAY;GAChE,MAAM,cAAc,MAAM,qBAAqB,YAAY,aAAa;AACxE,SAAM,KAAK,MAAM,mBAAmB,QAAQ,OAAO,aAAa,YAAY;GAC5E,MAAM,uBAAuB,2BAC3B,aAAa,UACb,YAAY,SACb;AAED,UAAO;IACL,SAAS,QAAQ,MAAM;IACvB;IACA,cAAc;KACZ,WAAW,YAAY;KACvB,cAAc;KACd,YAAY,KAAK,IAAI,sBAAsB,YAAY,SAAS,SAAS,EAAE;KAC3E,eACE,wBACO;AACL,YAAM,IAAI,MAAM,yCAAyC,YAAY,WAAW;SAC9E;KACN,aACE,sBACO;AACL,YAAM,IAAI,MAAM,yCAAyC,YAAY,WAAW;SAC9E;KACP;IACF;YACO;AACR,OAAI,cACF,OAAM,cAAc,OAAO,CAAC,YAAY,GAEtC;;;CAKR,MAAc,uCAAsD;EAClE,MAAM,iBAAiB,CAAC,GAAG,KAAK,gCAAgC,QAAQ,CAAC;AACzE,OAAK,gCAAgC,OAAO;AAC5C,QAAM,QAAQ,IACZ,eAAe,IAAI,OAAO,WAAW;AACnC,SAAM,OAAO,OAAO,CAAC,YAAY,GAE/B;IACF,CACH;;CAGH,MAAc,kBACZ,QACA,OACA,SACA,OACA,QACA,WAC6B;EAC7B,MAAM,UAAU,0BAA0B;EAC1C,MAAM,eAAe,0BAA0B,MAAM,wBAAwBA,UAAQ,CAAC;EACtF,IAAI;AACJ,yBAAuB,cAAc,QAAQ,MAAM,wBAAwBA,UAAQ,CAAC;EACpF,IAAI;EACJ,IAAI;EACJ,MAAM,qBAAsC,EAAE;EAC9C,MAAM,SAAS,MAAM,QAAQ;GAC3B,cAAc,MAAM;GACpB,KAAK,MAAM;GACX;GACA,YAAY,KAAK;GACjB,gBAAgB,KAAK;GACrB,2BAA2B,KAAK;GAChC,iBAAiB,KAAK;GACtB,YAAY,KAAK;GACjB,iBAAiB,QAAQ;GACzB,eAAe,WAAW,YAAY;IACpC,MAAM,UAAU,KAAK,MAClB,mBAAmB,QAAQ,SAAS,WAAW,QAAQ,CACvD,MAAM,QAAQ;AACb,qBAAgB,kBAAkB,KAAA,IAAY,MAAM,KAAK,IAAI,eAAe,IAAI;AAChF,mBAAc,gBAAgB,KAAA,IAAY,MAAM,KAAK,IAAI,aAAa,IAAI;MAC1E;AACJ,uBAAmB,KAAK,QAAQ;;GAElC,kBAAkB,iBAAiB;AACjC,gBAAYE,oBAAgC,cAAc,WAAW,aAAa;;GAEpF,oBAAoB,cAAc;AAChC,gBAAYC,sBAAkC,cAAc,WAAW,UAAU;;GAEnF,0BAA0B,KAAK;GAC/B;GACA,SAAS,KAAK;GACd,gBAAgB,KAAK;GACtB,CAAC;AACF,QAAM,QAAQ,IAAI,mBAAmB;EACrC,MAAM,cAAkC;GACtC,GAAG;GACH,cAAc,OAAO;GACrB,cAAc,OAAO;GACtB;AACD,QAAM,KAAK,MAAM,oBAAoB,QAAQ,OAAO,YAAY;EAChE,MAAM,kBAAkB,6BAA6B;GACnD,SAAS;GACT,WAAW,MAAM,wBAAwBH,UAAQ;GACjD,WAAW,aAAa;GACxB;GACA,WAAW,sBAAsB,UAAU;GAC3C,SAAS,eAAe;GACzB,CAAC;AACF,QAAM,KAAK,MAAM,mBAAmB,QAAQ,OAAO,aAAa,gBAAgB;AAChF,SAAO;GACL,SAAS,QAAQ,MAAM;GACvB;GACA,cAAc;IACZ,WAAW,YAAY;IACvB,cAAc;IACd,YAAY,KAAK,IAAI,GAAG,aAAa,SAAS,SAAS,EAAE;IACzD,eACE,wBACO;AACL,WAAM,IAAI,MAAM,yCAAyC,YAAY,WAAW;QAC9E;IACN,aACE,sBACO;AACL,WAAM,IAAI,MAAM,yCAAyC,YAAY,WAAW;QAC9E;IACP;GACF;;;;;AC/kCL,SAAS,kBAAkB,MAAuB;AAChD,KAAI,OAAO,SAAS,SAClB,QAAO,KAAK,MAAM;AAEpB,KAAI,QAAQ,KACV,QAAO;AAET,KACE,OAAO,SAAS,YAChB,OAAO,SAAS,aAChB,OAAO,SAAS,YAChB,OAAO,SAAS,SAEhB,QAAO,OAAO,KAAK,CAAC,MAAM;AAE5B,QAAO;;AAKT,SAAgB,gBACd,MACA,UAEI,EAAE,EACG;CACT,MAAM,UAAU,kBAAkB,KAAK;AACvC,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,uCAAuC;CAEzD,MAAM,OAAO,QAAQ,QAAQ;CAE7B,MAAM,SAAS,SAAS,QAAQ;AAChC,KAAI,OAAO,GACT,QAAO,OAAO;AAGhB,KAAI,SAAS,YAAY,SAAS,UAAU;EAC1C,MAAM,cAAc,QAAQ,MAAM,gCAAgC;AAClE,MAAI,aAAa;GACf,MAAM,SAAS,SAAS,YAAY,GAAG,MAAM,CAAC;AAC9C,OAAI,OAAO,GACT,QAAO,OAAO;;;AAKpB,KAAI,SAAS,SACX,MAAK,MAAM,aAAa,8BAA8B,QAAQ,EAAE;EAC9D,MAAM,SAAS,SAAS,UAAU;AAClC,MAAI,OAAO,GACT,QAAO,OAAO;;AAKpB,OAAM,IAAI,MAAM,gDAAgD,UAAU;;AAK5E,SAAgB,sBAAsB,MAAuB;AAC3D,QAAO,gBAAgB,MAAM,EAAE,MAAM,UAAU,CAAC;;AAKlD,SAAgB,kBAAkB,MAAuB;AACvD,QAAO,gBAAgB,MAAM,EAAE,MAAM,UAAU,CAAC;;AAGlD,SAAS,SAAS,MAA4D;AAC5E,KAAI;AACF,SAAO;GACL,IAAI;GACJ,OAAO,KAAK,MAAM,KAAK;GACxB;SACK;AACN,SAAO,EACL,IAAI,OACL;;;AAIL,SAAS,8BAA8B,MAAwB;CAC7D,MAAM,aAAuB,EAAE;AAE/B,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,MAAI,KAAK,WAAW,OAAO,KAAK,WAAW,IACzC;EAGF,MAAM,SAAS,aAAa,MAAM,MAAM;AACxC,MAAI,OACF,YAAW,KAAK,OAAO;;AAI3B,QAAO;;AAGT,SAAS,aAAa,MAAc,YAAmC;CACrE,MAAM,QAAkB,EAAE;CAC1B,IAAI,WAAW;CACf,IAAI,UAAU;AAEd,MAAK,IAAI,QAAQ,YAAY,QAAQ,KAAK,QAAQ,SAAS,GAAG;EAC5D,MAAM,OAAO,KAAK;AAElB,MAAI,UAAU;AACZ,OAAI,QACF,WAAU;YACD,SAAS,KAClB,WAAU;YACD,SAAS,KAClB,YAAW;AAEb;;AAGF,MAAI,SAAS,MAAK;AAChB,cAAW;AACX;;AAGF,MAAI,SAAS,OAAO,SAAS,KAAK;AAChC,SAAM,KAAK,KAAK;AAChB;;AAGF,MAAI,SAAS,OAAO,SAAS,IAC3B;EAGF,MAAM,OAAO,MAAM,GAAG,GAAG;AACzB,MAAK,SAAS,OAAO,SAAS,OAAS,SAAS,OAAO,SAAS,IAC9D,QAAO;AAGT,QAAM,KAAK;AACX,MAAI,MAAM,WAAW,EACnB,QAAO,KAAK,MAAM,YAAY,QAAQ,EAAE;;AAI5C,QAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ipc-BruTG5Fb.js","names":[],"sources":["../src/cli/queue/paths.ts","../src/cli/queue/lease-store.ts","../src/cli/queue/ipc-transport.ts","../src/cli/queue/ipc-health.ts","../src/cli/queue/messages.ts","../src/cli/queue/ipc-server.ts","../src/cli/queue/ipc.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nfunction shortHash(value: string, length: number): string {\n return createHash(\"sha256\").update(value).digest(\"hex\").slice(0, length);\n}\n\nexport function queueKeyForSession(sessionId: string): string {\n return shortHash(sessionId, 24);\n}\n\nexport function queueBaseDir(homeDir: string = os.homedir()): string {\n return path.join(homeDir, \".acpx\", \"queues\");\n}\n\nexport function queueSocketBaseDir(homeDir: string = os.homedir()): string | undefined {\n if (process.platform === \"win32\") {\n return undefined;\n }\n return path.join(\"/tmp\", `acpx-${shortHash(homeDir, 10)}`);\n}\n\nexport function queueLockFilePath(sessionId: string, homeDir: string = os.homedir()): string {\n return path.join(queueBaseDir(homeDir), `${queueKeyForSession(sessionId)}.lock`);\n}\n\nexport function queueSocketPath(sessionId: string, homeDir: string = os.homedir()): string {\n const key = queueKeyForSession(sessionId);\n if (process.platform === \"win32\") {\n return `\\\\\\\\.\\\\pipe\\\\acpx-${key}`;\n }\n return path.join(queueSocketBaseDir(homeDir) ?? \"/tmp\", `${key}.sock`);\n}\n","import { randomInt } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport { queueBaseDir, queueLockFilePath, queueSocketBaseDir, queueSocketPath } from \"./paths.js\";\n\nconst PROCESS_EXIT_GRACE_MS = 1_500;\nconst PROCESS_POLL_MS = 50;\nconst QUEUE_OWNER_STALE_HEARTBEAT_MS = 15_000;\n\nexport type QueueOwnerRecord = {\n pid: number;\n sessionId: string;\n socketPath: string;\n createdAt: string;\n heartbeatAt: string;\n ownerGeneration: number;\n queueDepth: number;\n};\n\nexport type QueueOwnerLease = {\n sessionId: string;\n lockPath: string;\n socketPath: string;\n createdAt: string;\n ownerGeneration: number;\n};\n\nexport type QueueOwnerStatus = {\n pid: number;\n socketPath: string;\n heartbeatAt: string;\n ownerGeneration: number;\n queueDepth: number;\n alive: boolean;\n stale: boolean;\n};\n\nfunction parseQueueOwnerRecord(raw: unknown): QueueOwnerRecord | null {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n return null;\n }\n const record = raw as Record<string, unknown>;\n\n if (\n !Number.isInteger(record.pid) ||\n (record.pid as number) <= 0 ||\n typeof record.sessionId !== \"string\" ||\n typeof record.socketPath !== \"string\" ||\n typeof record.createdAt !== \"string\" ||\n typeof record.heartbeatAt !== \"string\" ||\n !Number.isInteger(record.ownerGeneration) ||\n (record.ownerGeneration as number) <= 0 ||\n !Number.isInteger(record.queueDepth) ||\n (record.queueDepth as number) < 0\n ) {\n return null;\n }\n\n return {\n pid: record.pid as number,\n sessionId: record.sessionId,\n socketPath: record.socketPath,\n createdAt: record.createdAt,\n heartbeatAt: record.heartbeatAt,\n ownerGeneration: record.ownerGeneration as number,\n queueDepth: record.queueDepth as number,\n };\n}\n\nfunction createOwnerGeneration(): number {\n return randomInt(1, 2 ** 48);\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction isQueueOwnerHeartbeatStale(owner: QueueOwnerRecord): boolean {\n const heartbeatMs = Date.parse(owner.heartbeatAt);\n if (!Number.isFinite(heartbeatMs)) {\n return true;\n }\n return Date.now() - heartbeatMs > QUEUE_OWNER_STALE_HEARTBEAT_MS;\n}\n\nasync function ensureQueueDir(): Promise<void> {\n const baseDir = queueBaseDir();\n await fs.mkdir(baseDir, { recursive: true, mode: 0o700 });\n await fs.chmod(baseDir, 0o700);\n const socketDir = queueSocketBaseDir();\n if (socketDir) {\n await fs.mkdir(socketDir, { recursive: true, mode: 0o700 });\n await fs.chmod(socketDir, 0o700);\n }\n}\n\nasync function removeSocketFile(socketPath: string): Promise<void> {\n if (process.platform === \"win32\") {\n return;\n }\n\n try {\n await fs.unlink(socketPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n}\n\nasync function waitForProcessExit(pid: number, timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + Math.max(0, timeoutMs);\n while (Date.now() <= deadline) {\n if (!isProcessAlive(pid)) {\n return true;\n }\n await waitMs(PROCESS_POLL_MS);\n }\n\n return !isProcessAlive(pid);\n}\n\nasync function cleanupStaleQueueOwner(\n sessionId: string,\n owner: QueueOwnerRecord | undefined,\n): Promise<void> {\n const lockPath = queueLockFilePath(sessionId);\n const socketPath = owner?.socketPath ?? queueSocketPath(sessionId);\n\n await removeSocketFile(socketPath).catch(() => {\n // ignore stale socket cleanup failures\n });\n\n await fs.unlink(lockPath).catch((error) => {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n });\n}\n\nexport async function readQueueOwnerRecord(\n sessionId: string,\n): Promise<QueueOwnerRecord | undefined> {\n const lockPath = queueLockFilePath(sessionId);\n try {\n const payload = await fs.readFile(lockPath, \"utf8\");\n const parsed = parseQueueOwnerRecord(JSON.parse(payload));\n return parsed ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function isProcessAlive(pid: number | undefined): boolean {\n if (!pid || !Number.isInteger(pid) || pid <= 0 || pid === process.pid) {\n return false;\n }\n\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function terminateProcess(pid: number): Promise<boolean> {\n if (!isProcessAlive(pid)) {\n return false;\n }\n\n try {\n process.kill(pid, \"SIGTERM\");\n } catch {\n return false;\n }\n\n if (await waitForProcessExit(pid, PROCESS_EXIT_GRACE_MS)) {\n return true;\n }\n\n try {\n process.kill(pid, \"SIGKILL\");\n } catch {\n return false;\n }\n\n await waitForProcessExit(pid, PROCESS_EXIT_GRACE_MS);\n return true;\n}\n\nexport async function ensureOwnerIsUsable(\n sessionId: string,\n owner: QueueOwnerRecord,\n): Promise<boolean> {\n const alive = isProcessAlive(owner.pid);\n const stale = isQueueOwnerHeartbeatStale(owner);\n if (alive && !stale) {\n return true;\n }\n\n if (alive) {\n await terminateProcess(owner.pid).catch(() => {\n // best effort stale owner termination\n });\n }\n await cleanupStaleQueueOwner(sessionId, owner);\n return false;\n}\n\nexport async function readQueueOwnerStatus(\n sessionId: string,\n): Promise<QueueOwnerStatus | undefined> {\n const owner = await readQueueOwnerRecord(sessionId);\n if (!owner) {\n return undefined;\n }\n\n const alive = await ensureOwnerIsUsable(sessionId, owner);\n if (!alive) {\n return undefined;\n }\n\n return {\n pid: owner.pid,\n socketPath: owner.socketPath,\n heartbeatAt: owner.heartbeatAt,\n ownerGeneration: owner.ownerGeneration,\n queueDepth: owner.queueDepth,\n alive,\n stale: isQueueOwnerHeartbeatStale(owner),\n };\n}\n\nexport async function tryAcquireQueueOwnerLease(\n sessionId: string,\n nowIsoFactory: () => string = nowIso,\n): Promise<QueueOwnerLease | undefined> {\n await ensureQueueDir();\n const lockPath = queueLockFilePath(sessionId);\n const socketPath = queueSocketPath(sessionId);\n const createdAt = nowIsoFactory();\n const ownerGeneration = createOwnerGeneration();\n const payload = JSON.stringify(\n {\n pid: process.pid,\n sessionId,\n socketPath,\n createdAt,\n heartbeatAt: createdAt,\n ownerGeneration,\n queueDepth: 0,\n },\n null,\n 2,\n );\n\n try {\n await fs.writeFile(lockPath, `${payload}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n });\n await removeSocketFile(socketPath).catch(() => {\n // best-effort stale socket cleanup after ownership is acquired\n });\n return {\n sessionId,\n lockPath,\n socketPath,\n createdAt,\n ownerGeneration,\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n\n const owner = await readQueueOwnerRecord(sessionId);\n if (!owner) {\n await cleanupStaleQueueOwner(sessionId, owner);\n return undefined;\n }\n\n if (!isProcessAlive(owner.pid) || isQueueOwnerHeartbeatStale(owner)) {\n if (isProcessAlive(owner.pid)) {\n await terminateProcess(owner.pid).catch(() => {\n // best effort stale owner termination\n });\n }\n await cleanupStaleQueueOwner(sessionId, owner);\n }\n return undefined;\n }\n}\n\nexport async function refreshQueueOwnerLease(\n lease: QueueOwnerLease,\n options: {\n queueDepth: number;\n },\n nowIsoFactory: () => string = nowIso,\n): Promise<void> {\n const payload = JSON.stringify(\n {\n pid: process.pid,\n sessionId: lease.sessionId,\n socketPath: lease.socketPath,\n createdAt: lease.createdAt,\n heartbeatAt: nowIsoFactory(),\n ownerGeneration: lease.ownerGeneration,\n queueDepth: Math.max(0, Math.round(options.queueDepth)),\n },\n null,\n 2,\n );\n await fs.writeFile(lease.lockPath, `${payload}\\n`, {\n encoding: \"utf8\",\n });\n}\n\nexport async function releaseQueueOwnerLease(lease: QueueOwnerLease): Promise<void> {\n await removeSocketFile(lease.socketPath).catch(() => {\n // ignore best-effort cleanup failures\n });\n\n await fs.unlink(lease.lockPath).catch((error) => {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n });\n}\n\nexport async function terminateQueueOwnerForSession(sessionId: string): Promise<void> {\n const owner = await readQueueOwnerRecord(sessionId);\n if (!owner) {\n return;\n }\n\n if (isProcessAlive(owner.pid)) {\n await terminateProcess(owner.pid);\n }\n\n await cleanupStaleQueueOwner(sessionId, owner);\n}\n\nexport async function waitMs(ms: number): Promise<void> {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","import net from \"node:net\";\nimport { measurePerf } from \"../../perf-metrics.js\";\nimport { type QueueOwnerRecord, waitMs } from \"./lease-store.js\";\n\nconst QUEUE_CONNECT_ATTEMPTS = 40;\nexport const QUEUE_CONNECT_RETRY_MS = 50;\nexport const SOCKET_CONNECTION_TIMEOUT_MS = 5000;\n\nfunction shouldRetryQueueConnect(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException).code;\n return code === \"ENOENT\" || code === \"ECONNREFUSED\";\n}\n\nasync function connectToSocket(\n socketPath: string,\n timeoutMs = SOCKET_CONNECTION_TIMEOUT_MS,\n): Promise<net.Socket> {\n return await new Promise<net.Socket>((resolve, reject) => {\n const socket = net.createConnection(socketPath);\n let settled = false;\n\n const timeout = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n socket.destroy();\n reject(new Error(`Connection to ${socketPath} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n const onConnect = () => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n socket.off(\"error\", onError);\n resolve(socket);\n };\n const onError = (error: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n socket.off(\"connect\", onConnect);\n reject(error);\n };\n\n socket.once(\"connect\", onConnect);\n socket.once(\"error\", onError);\n });\n}\n\nexport async function connectToQueueOwner(\n owner: QueueOwnerRecord,\n maxAttempts = QUEUE_CONNECT_ATTEMPTS,\n): Promise<net.Socket | undefined> {\n let lastError: unknown;\n\n const attempts = Math.max(1, Math.trunc(maxAttempts));\n for (let attempt = 0; attempt < attempts; attempt += 1) {\n try {\n return await measurePerf(\n \"queue.connect\",\n async () => await connectToSocket(owner.socketPath),\n );\n } catch (error) {\n lastError = error;\n if (!shouldRetryQueueConnect(error)) {\n throw error;\n }\n await waitMs(QUEUE_CONNECT_RETRY_MS);\n }\n }\n\n if (lastError && !shouldRetryQueueConnect(lastError)) {\n throw lastError;\n }\n\n return undefined;\n}\n","import { connectToQueueOwner } from \"./ipc-transport.js\";\nimport { readQueueOwnerRecord, readQueueOwnerStatus } from \"./lease-store.js\";\n\nexport type QueueOwnerHealth = {\n sessionId: string;\n hasLease: boolean;\n healthy: boolean;\n socketReachable: boolean;\n pidAlive: boolean;\n pid?: number;\n socketPath?: string;\n ownerGeneration?: number;\n queueDepth?: number;\n};\n\nexport async function probeQueueOwnerHealth(sessionId: string): Promise<QueueOwnerHealth> {\n const ownerRecord = await readQueueOwnerRecord(sessionId);\n if (!ownerRecord) {\n return {\n sessionId,\n hasLease: false,\n healthy: false,\n socketReachable: false,\n pidAlive: false,\n };\n }\n\n const owner = await readQueueOwnerStatus(sessionId);\n if (!owner) {\n return {\n sessionId,\n hasLease: false,\n healthy: false,\n socketReachable: false,\n pidAlive: false,\n };\n }\n\n const pidAlive = owner.alive;\n let socketReachable = false;\n try {\n const socket = await connectToQueueOwner(ownerRecord, 2);\n if (socket) {\n socketReachable = true;\n if (!socket.destroyed) {\n socket.end();\n }\n }\n } catch {\n socketReachable = false;\n }\n\n return {\n sessionId,\n hasLease: true,\n healthy: socketReachable,\n socketReachable,\n pidAlive,\n pid: owner.pid,\n socketPath: owner.socketPath,\n ownerGeneration: owner.ownerGeneration,\n queueDepth: owner.queueDepth,\n };\n}\n","import type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { toAcpErrorPayload } from \"../../acp/error-shapes.js\";\nimport { isAcpJsonRpcMessage } from \"../../acp/jsonrpc.js\";\nimport { isPromptInput, textPrompt } from \"../../prompt-content.js\";\nimport {\n OUTPUT_ERROR_CODES,\n OUTPUT_ERROR_ORIGINS,\n type AcpClientOptions,\n type OutputErrorAcpPayload,\n type OutputErrorCode,\n type OutputErrorOrigin,\n} from \"../../types.js\";\nimport type {\n AcpJsonRpcMessage,\n NonInteractivePermissionPolicy,\n PermissionMode,\n PromptInput,\n SessionResumePolicy,\n SessionSendResult,\n} from \"../../types.js\";\n\ntype QueueSessionOptions = NonNullable<AcpClientOptions[\"sessionOptions\"]>;\n\nexport type QueueSubmitRequest = {\n type: \"submit_prompt\";\n requestId: string;\n ownerGeneration?: number;\n message: string;\n prompt?: PromptInput;\n permissionMode: PermissionMode;\n resumePolicy?: SessionResumePolicy;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n timeoutMs?: number;\n suppressSdkConsoleErrors?: boolean;\n waitForCompletion: boolean;\n sessionOptions?: QueueSessionOptions;\n};\n\nexport type QueueCancelRequest = {\n type: \"cancel_prompt\";\n requestId: string;\n ownerGeneration?: number;\n};\n\nexport type QueueSetModeRequest = {\n type: \"set_mode\";\n requestId: string;\n ownerGeneration?: number;\n modeId: string;\n timeoutMs?: number;\n};\n\nexport type QueueSetModelRequest = {\n type: \"set_model\";\n requestId: string;\n ownerGeneration?: number;\n modelId: string;\n timeoutMs?: number;\n};\n\nexport type QueueSetConfigOptionRequest = {\n type: \"set_config_option\";\n requestId: string;\n ownerGeneration?: number;\n configId: string;\n value: string;\n timeoutMs?: number;\n};\n\nexport type QueueRequest =\n | QueueSubmitRequest\n | QueueCancelRequest\n | QueueSetModeRequest\n | QueueSetModelRequest\n | QueueSetConfigOptionRequest;\n\nexport type QueueOwnerAcceptedMessage = {\n type: \"accepted\";\n requestId: string;\n ownerGeneration?: number;\n};\n\nexport type QueueOwnerEventMessage = {\n type: \"event\";\n requestId: string;\n ownerGeneration?: number;\n message: AcpJsonRpcMessage;\n};\n\nexport type QueueOwnerResultMessage = {\n type: \"result\";\n requestId: string;\n ownerGeneration?: number;\n result: SessionSendResult;\n};\n\nexport type QueueOwnerCancelResultMessage = {\n type: \"cancel_result\";\n requestId: string;\n ownerGeneration?: number;\n cancelled: boolean;\n};\n\nexport type QueueOwnerSetModeResultMessage = {\n type: \"set_mode_result\";\n requestId: string;\n ownerGeneration?: number;\n modeId: string;\n};\n\nexport type QueueOwnerSetModelResultMessage = {\n type: \"set_model_result\";\n requestId: string;\n ownerGeneration?: number;\n modelId: string;\n};\n\nexport type QueueOwnerSetConfigOptionResultMessage = {\n type: \"set_config_option_result\";\n requestId: string;\n ownerGeneration?: number;\n response: SetSessionConfigOptionResponse;\n};\n\nexport type QueueOwnerErrorMessage = {\n type: \"error\";\n requestId: string;\n ownerGeneration?: number;\n code?: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n message: string;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n outputAlreadyEmitted?: boolean;\n};\n\nexport type QueueOwnerMessage =\n | QueueOwnerAcceptedMessage\n | QueueOwnerEventMessage\n | QueueOwnerResultMessage\n | QueueOwnerCancelResultMessage\n | QueueOwnerSetModeResultMessage\n | QueueOwnerSetModelResultMessage\n | QueueOwnerSetConfigOptionResultMessage\n | QueueOwnerErrorMessage;\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction isPermissionMode(value: unknown): value is PermissionMode {\n return value === \"approve-all\" || value === \"approve-reads\" || value === \"deny-all\";\n}\n\nfunction isSessionResumePolicy(value: unknown): value is SessionResumePolicy {\n return value === \"allow-new\" || value === \"same-session-only\";\n}\n\nfunction isNonInteractivePermissionPolicy(value: unknown): value is NonInteractivePermissionPolicy {\n return value === \"deny\" || value === \"fail\";\n}\n\nfunction isOutputErrorCode(value: unknown): value is OutputErrorCode {\n return typeof value === \"string\" && OUTPUT_ERROR_CODES.includes(value as OutputErrorCode);\n}\n\nfunction isOutputErrorOrigin(value: unknown): value is OutputErrorOrigin {\n return typeof value === \"string\" && OUTPUT_ERROR_ORIGINS.includes(value as OutputErrorOrigin);\n}\n\nfunction parseSessionOptions(value: unknown): QueueSessionOptions | null | undefined {\n if (value == null) {\n return undefined;\n }\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n const sessionOptions: QueueSessionOptions = {};\n if (record.model != null) {\n if (typeof record.model !== \"string\" || record.model.trim().length === 0) {\n return null;\n }\n sessionOptions.model = record.model;\n }\n if (record.allowedTools != null) {\n if (!Array.isArray(record.allowedTools)) {\n return null;\n }\n const allowedTools = record.allowedTools.filter(\n (tool): tool is string => typeof tool === \"string\",\n );\n if (allowedTools.length !== record.allowedTools.length) {\n return null;\n }\n sessionOptions.allowedTools = allowedTools;\n }\n if (record.maxTurns != null) {\n if (typeof record.maxTurns !== \"number\" || !Number.isFinite(record.maxTurns)) {\n return null;\n }\n sessionOptions.maxTurns = Math.max(1, Math.round(record.maxTurns));\n }\n if (record.systemPrompt != null) {\n if (typeof record.systemPrompt === \"string\") {\n sessionOptions.systemPrompt = record.systemPrompt;\n } else {\n const systemPrompt = asRecord(record.systemPrompt);\n if (!systemPrompt || typeof systemPrompt.append !== \"string\") {\n return null;\n }\n sessionOptions.systemPrompt = { append: systemPrompt.append };\n }\n }\n\n return sessionOptions;\n}\n\nfunction parseOwnerGeneration(value: unknown): number | undefined | null {\n if (value == null) {\n return undefined;\n }\n if (typeof value !== \"number\" || !Number.isInteger(value) || value <= 0) {\n return null;\n }\n return value;\n}\n\nexport function parseQueueRequest(raw: unknown): QueueRequest | null {\n const request = asRecord(raw);\n if (!request) {\n return null;\n }\n\n if (typeof request.type !== \"string\" || typeof request.requestId !== \"string\") {\n return null;\n }\n const ownerGeneration = parseOwnerGeneration(request.ownerGeneration);\n if (ownerGeneration === null) {\n return null;\n }\n\n const timeoutRaw = request.timeoutMs;\n const timeoutMs =\n typeof timeoutRaw === \"number\" && Number.isFinite(timeoutRaw) && timeoutRaw > 0\n ? Math.round(timeoutRaw)\n : undefined;\n\n if (request.type === \"submit_prompt\") {\n const resumePolicy =\n request.resumePolicy == null\n ? undefined\n : isSessionResumePolicy(request.resumePolicy)\n ? request.resumePolicy\n : null;\n const nonInteractivePermissions =\n request.nonInteractivePermissions == null\n ? undefined\n : isNonInteractivePermissionPolicy(request.nonInteractivePermissions)\n ? request.nonInteractivePermissions\n : null;\n const suppressSdkConsoleErrors =\n request.suppressSdkConsoleErrors == null\n ? undefined\n : typeof request.suppressSdkConsoleErrors === \"boolean\"\n ? request.suppressSdkConsoleErrors\n : null;\n const sessionOptions = parseSessionOptions(request.sessionOptions);\n\n const prompt =\n request.prompt == null ? undefined : isPromptInput(request.prompt) ? request.prompt : null;\n if (\n typeof request.message !== \"string\" ||\n !isPermissionMode(request.permissionMode) ||\n resumePolicy === null ||\n prompt === null ||\n nonInteractivePermissions === null ||\n suppressSdkConsoleErrors === null ||\n sessionOptions === null ||\n typeof request.waitForCompletion !== \"boolean\"\n ) {\n return null;\n }\n\n return {\n type: \"submit_prompt\",\n requestId: request.requestId,\n ownerGeneration,\n message: request.message,\n prompt: prompt ?? textPrompt(request.message),\n permissionMode: request.permissionMode,\n ...(resumePolicy !== undefined ? { resumePolicy } : {}),\n nonInteractivePermissions,\n timeoutMs,\n ...(suppressSdkConsoleErrors !== undefined ? { suppressSdkConsoleErrors } : {}),\n waitForCompletion: request.waitForCompletion,\n ...(sessionOptions !== undefined ? { sessionOptions } : {}),\n };\n }\n\n if (request.type === \"cancel_prompt\") {\n return {\n type: \"cancel_prompt\",\n requestId: request.requestId,\n ownerGeneration,\n };\n }\n\n if (request.type === \"set_mode\") {\n if (typeof request.modeId !== \"string\" || request.modeId.trim().length === 0) {\n return null;\n }\n return {\n type: \"set_mode\",\n requestId: request.requestId,\n ownerGeneration,\n modeId: request.modeId,\n timeoutMs,\n };\n }\n\n if (request.type === \"set_model\") {\n if (typeof request.modelId !== \"string\" || request.modelId.trim().length === 0) {\n return null;\n }\n return {\n type: \"set_model\",\n requestId: request.requestId,\n ownerGeneration,\n modelId: request.modelId,\n timeoutMs,\n };\n }\n\n if (request.type === \"set_config_option\") {\n if (\n typeof request.configId !== \"string\" ||\n request.configId.trim().length === 0 ||\n typeof request.value !== \"string\" ||\n request.value.trim().length === 0\n ) {\n return null;\n }\n return {\n type: \"set_config_option\",\n requestId: request.requestId,\n ownerGeneration,\n configId: request.configId,\n value: request.value,\n timeoutMs,\n };\n }\n\n return null;\n}\n\nfunction parseSessionSendResult(raw: unknown): SessionSendResult | null {\n const result = asRecord(raw);\n if (!result) {\n return null;\n }\n\n if (\n typeof result.stopReason !== \"string\" ||\n typeof result.sessionId !== \"string\" ||\n typeof result.resumed !== \"boolean\"\n ) {\n return null;\n }\n\n const permissionStats = asRecord(result.permissionStats);\n const record = asRecord(result.record);\n if (!permissionStats || !record) {\n return null;\n }\n\n const statsValid =\n typeof permissionStats.requested === \"number\" &&\n typeof permissionStats.approved === \"number\" &&\n typeof permissionStats.denied === \"number\" &&\n typeof permissionStats.cancelled === \"number\";\n if (!statsValid) {\n return null;\n }\n\n const recordValid =\n typeof record.acpxRecordId === \"string\" &&\n typeof record.acpSessionId === \"string\" &&\n typeof record.agentCommand === \"string\" &&\n typeof record.cwd === \"string\" &&\n typeof record.createdAt === \"string\" &&\n typeof record.lastUsedAt === \"string\" &&\n Array.isArray(record.messages) &&\n typeof record.updated_at === \"string\" &&\n typeof record.lastSeq === \"number\" &&\n Number.isInteger(record.lastSeq) &&\n !!record.eventLog &&\n typeof record.eventLog === \"object\";\n if (!recordValid) {\n return null;\n }\n\n return result as SessionSendResult;\n}\n\nexport function parseQueueOwnerMessage(raw: unknown): QueueOwnerMessage | null {\n const message = asRecord(raw);\n if (!message || typeof message.type !== \"string\") {\n return null;\n }\n\n if (typeof message.requestId !== \"string\") {\n return null;\n }\n const ownerGeneration = parseOwnerGeneration(message.ownerGeneration);\n if (ownerGeneration === null) {\n return null;\n }\n\n if (message.type === \"accepted\") {\n return {\n type: \"accepted\",\n requestId: message.requestId,\n ownerGeneration,\n };\n }\n\n if (message.type === \"event\") {\n if (!isAcpJsonRpcMessage(message.message)) {\n return null;\n }\n\n return {\n type: \"event\",\n requestId: message.requestId,\n ownerGeneration,\n message: message.message,\n };\n }\n\n if (message.type === \"result\") {\n const parsedResult = parseSessionSendResult(message.result);\n if (!parsedResult) {\n return null;\n }\n return {\n type: \"result\",\n requestId: message.requestId,\n ownerGeneration,\n result: parsedResult,\n };\n }\n\n if (message.type === \"cancel_result\") {\n if (typeof message.cancelled !== \"boolean\") {\n return null;\n }\n return {\n type: \"cancel_result\",\n requestId: message.requestId,\n ownerGeneration,\n cancelled: message.cancelled,\n };\n }\n\n if (message.type === \"set_mode_result\") {\n if (typeof message.modeId !== \"string\") {\n return null;\n }\n return {\n type: \"set_mode_result\",\n requestId: message.requestId,\n ownerGeneration,\n modeId: message.modeId,\n };\n }\n\n if (message.type === \"set_model_result\") {\n if (typeof message.modelId !== \"string\") {\n return null;\n }\n return {\n type: \"set_model_result\",\n requestId: message.requestId,\n ownerGeneration,\n modelId: message.modelId,\n };\n }\n\n if (message.type === \"set_config_option_result\") {\n const response = asRecord(message.response);\n if (!response || !Array.isArray(response.configOptions)) {\n return null;\n }\n return {\n type: \"set_config_option_result\",\n requestId: message.requestId,\n ownerGeneration,\n response: response as SetSessionConfigOptionResponse,\n };\n }\n\n if (message.type === \"error\") {\n if (\n typeof message.message !== \"string\" ||\n !isOutputErrorCode(message.code) ||\n !isOutputErrorOrigin(message.origin)\n ) {\n return null;\n }\n\n const detailCode =\n typeof message.detailCode === \"string\" && message.detailCode.trim().length > 0\n ? message.detailCode\n : undefined;\n const retryable = typeof message.retryable === \"boolean\" ? message.retryable : undefined;\n const acp = toAcpErrorPayload(message.acp);\n const outputAlreadyEmitted =\n typeof message.outputAlreadyEmitted === \"boolean\" ? message.outputAlreadyEmitted : undefined;\n\n return {\n type: \"error\",\n requestId: message.requestId,\n ownerGeneration,\n code: message.code,\n detailCode,\n origin: message.origin,\n message: message.message,\n retryable,\n acp,\n ...(outputAlreadyEmitted === undefined ? {} : { outputAlreadyEmitted }),\n };\n }\n\n return null;\n}\n","import net from \"node:net\";\nimport type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { normalizeOutputError } from \"../../acp/error-normalization.js\";\nimport { recordPerfDuration } from \"../../perf-metrics.js\";\nimport { textPrompt } from \"../../prompt-content.js\";\nimport type {\n AcpClientOptions,\n NonInteractivePermissionPolicy,\n PermissionMode,\n PromptInput,\n SessionResumePolicy,\n} from \"../../types.js\";\nimport {\n parseQueueRequest,\n type QueueOwnerErrorMessage,\n type QueueOwnerMessage,\n} from \"./messages.js\";\n\ntype QueueOwnerSocketLease = {\n socketPath: string;\n ownerGeneration?: number;\n};\n\nfunction makeQueueOwnerError(\n requestId: string,\n message: string,\n detailCode: string,\n options: {\n retryable?: boolean;\n } = {},\n): QueueOwnerErrorMessage {\n return {\n type: \"error\",\n requestId,\n ownerGeneration: undefined,\n code: \"RUNTIME\",\n detailCode,\n origin: \"queue\",\n retryable: options.retryable,\n message,\n };\n}\n\nfunction makeQueueOwnerErrorFromUnknown(\n requestId: string,\n error: unknown,\n detailCode: string,\n options: {\n retryable?: boolean;\n } = {},\n): QueueOwnerErrorMessage {\n const normalized = normalizeOutputError(error, {\n defaultCode: \"RUNTIME\",\n origin: \"queue\",\n detailCode,\n retryable: options.retryable,\n });\n\n return {\n type: \"error\",\n requestId,\n code: normalized.code,\n detailCode: normalized.detailCode,\n origin: normalized.origin,\n message: normalized.message,\n retryable: normalized.retryable,\n acp: normalized.acp,\n };\n}\n\nfunction writeQueueMessage(socket: net.Socket, message: QueueOwnerMessage): void {\n if (socket.destroyed || !socket.writable) {\n return;\n }\n socket.write(`${JSON.stringify(message)}\\n`);\n}\n\nexport type QueueTask = {\n requestId: string;\n message: string;\n prompt: PromptInput;\n permissionMode: PermissionMode;\n resumePolicy?: SessionResumePolicy;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n timeoutMs?: number;\n suppressSdkConsoleErrors?: boolean;\n sessionOptions?: NonNullable<AcpClientOptions[\"sessionOptions\"]>;\n waitForCompletion: boolean;\n enqueuedAt: number;\n send: (message: QueueOwnerMessage) => void;\n close: () => void;\n};\n\nexport type QueueOwnerControlHandlers = {\n cancelPrompt: () => Promise<boolean>;\n setSessionMode: (modeId: string, timeoutMs?: number) => Promise<void>;\n setSessionModel: (modelId: string, timeoutMs?: number) => Promise<void>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n timeoutMs?: number,\n ) => Promise<SetSessionConfigOptionResponse>;\n};\n\ntype SessionQueueOwnerOptions = {\n maxQueueDepth: number;\n onQueueDepthChanged?: (queueDepth: number) => void;\n};\n\nexport class SessionQueueOwner {\n private readonly server: net.Server;\n private readonly controlHandlers: QueueOwnerControlHandlers;\n private readonly ownerGeneration?: number;\n private readonly maxQueueDepth: number;\n private readonly onQueueDepthChanged?: (queueDepth: number) => void;\n private readonly pending: QueueTask[] = [];\n private readonly waiters: Array<(task: QueueTask | undefined) => void> = [];\n private closed = false;\n\n private constructor(\n server: net.Server,\n controlHandlers: QueueOwnerControlHandlers,\n lease: QueueOwnerSocketLease,\n options: SessionQueueOwnerOptions,\n ) {\n this.server = server;\n this.controlHandlers = controlHandlers;\n this.ownerGeneration = lease.ownerGeneration;\n this.maxQueueDepth = Math.max(1, Math.round(options.maxQueueDepth));\n this.onQueueDepthChanged = options.onQueueDepthChanged;\n }\n\n static async start(\n lease: QueueOwnerSocketLease,\n controlHandlers: QueueOwnerControlHandlers,\n options: SessionQueueOwnerOptions = {\n maxQueueDepth: 16,\n },\n ): Promise<SessionQueueOwner> {\n const ownerRef: { current: SessionQueueOwner | undefined } = { current: undefined };\n const server = net.createServer((socket) => {\n ownerRef.current?.handleConnection(socket);\n });\n ownerRef.current = new SessionQueueOwner(server, controlHandlers, lease, options);\n\n await new Promise<void>((resolve, reject) => {\n const onListening = () => {\n server.off(\"error\", onError);\n resolve();\n };\n const onError = (error: Error) => {\n server.off(\"listening\", onListening);\n reject(error);\n };\n\n server.once(\"listening\", onListening);\n server.once(\"error\", onError);\n server.listen(lease.socketPath);\n });\n\n return ownerRef.current;\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n for (const waiter of this.waiters.splice(0)) {\n waiter(undefined);\n }\n\n for (const task of this.pending.splice(0)) {\n if (task.waitForCompletion) {\n task.send(\n makeQueueOwnerError(\n task.requestId,\n \"Queue owner shutting down before prompt execution\",\n \"QUEUE_OWNER_SHUTTING_DOWN\",\n {\n retryable: true,\n },\n ),\n );\n }\n task.close();\n }\n this.emitQueueDepth();\n\n await new Promise<void>((resolve) => {\n this.server.close(() => resolve());\n });\n }\n\n async nextTask(timeoutMs?: number): Promise<QueueTask | undefined> {\n if (this.pending.length > 0) {\n const task = this.pending.shift();\n this.emitQueueDepth();\n if (task) {\n recordPerfDuration(\"queue.owner.wait_ms\", Date.now() - task.enqueuedAt);\n }\n return task;\n }\n if (this.closed) {\n return undefined;\n }\n\n return await new Promise<QueueTask | undefined>((resolve) => {\n const shouldTimeout = timeoutMs != null;\n const timer =\n shouldTimeout &&\n setTimeout(\n () => {\n const index = this.waiters.indexOf(waiter);\n if (index >= 0) {\n this.waiters.splice(index, 1);\n }\n resolve(undefined);\n },\n Math.max(0, timeoutMs),\n );\n\n const waiter = (task: QueueTask | undefined) => {\n if (timer) {\n clearTimeout(timer);\n }\n resolve(task);\n };\n\n this.waiters.push(waiter);\n });\n }\n\n queueDepth(): number {\n return this.pending.length;\n }\n\n private emitQueueDepth(): void {\n this.onQueueDepthChanged?.(this.pending.length);\n }\n\n private enqueue(task: QueueTask): void {\n if (this.closed) {\n if (task.waitForCompletion) {\n task.send(\n makeQueueOwnerError(\n task.requestId,\n \"Queue owner is shutting down\",\n \"QUEUE_OWNER_SHUTTING_DOWN\",\n {\n retryable: true,\n },\n ),\n );\n }\n task.close();\n return;\n }\n\n const waiter = this.waiters.shift();\n if (waiter) {\n waiter(task);\n return;\n }\n\n if (this.pending.length >= this.maxQueueDepth) {\n if (task.waitForCompletion) {\n task.send({\n ...makeQueueOwnerError(\n task.requestId,\n `Queue owner is overloaded (${this.pending.length}/${this.maxQueueDepth} queued)`,\n \"QUEUE_OWNER_OVERLOADED\",\n {\n retryable: true,\n },\n ),\n ownerGeneration: this.ownerGeneration,\n });\n }\n task.close();\n return;\n }\n\n this.pending.push(task);\n this.emitQueueDepth();\n }\n\n private handleControlRequest<TMessage extends QueueOwnerMessage>(options: {\n socket: net.Socket;\n requestId: string;\n run: () => Promise<TMessage>;\n }): void {\n writeQueueMessage(options.socket, {\n type: \"accepted\",\n requestId: options.requestId,\n ownerGeneration: this.ownerGeneration,\n });\n\n void options\n .run()\n .then((message) => {\n writeQueueMessage(options.socket, {\n ...message,\n ownerGeneration: this.ownerGeneration,\n });\n })\n .catch((error) => {\n writeQueueMessage(options.socket, {\n ...makeQueueOwnerErrorFromUnknown(\n options.requestId,\n error,\n \"QUEUE_CONTROL_REQUEST_FAILED\",\n ),\n ownerGeneration: this.ownerGeneration,\n });\n })\n .finally(() => {\n if (!options.socket.destroyed) {\n options.socket.end();\n }\n });\n }\n\n private handleConnection(socket: net.Socket): void {\n socket.setEncoding(\"utf8\");\n\n if (this.closed) {\n writeQueueMessage(\n socket,\n makeQueueOwnerError(\"unknown\", \"Queue owner is closed\", \"QUEUE_OWNER_CLOSED\", {\n retryable: true,\n }),\n );\n socket.end();\n return;\n }\n\n let buffer = \"\";\n let handled = false;\n\n const fail = (requestId: string, message: string, detailCode: string): void => {\n writeQueueMessage(socket, {\n ...makeQueueOwnerError(requestId, message, detailCode, {\n retryable: false,\n }),\n ownerGeneration: this.ownerGeneration,\n });\n socket.end();\n };\n\n const processLine = (line: string): void => {\n if (handled) {\n return;\n }\n handled = true;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n fail(\"unknown\", \"Invalid queue request payload\", \"QUEUE_REQUEST_PAYLOAD_INVALID_JSON\");\n return;\n }\n\n const request = parseQueueRequest(parsed);\n if (!request) {\n fail(\"unknown\", \"Invalid queue request\", \"QUEUE_REQUEST_INVALID\");\n return;\n }\n\n if (\n request.ownerGeneration !== undefined &&\n this.ownerGeneration !== undefined &&\n request.ownerGeneration !== this.ownerGeneration\n ) {\n fail(\n request.requestId,\n \"Queue request targeted a stale queue owner generation\",\n \"QUEUE_OWNER_GENERATION_MISMATCH\",\n );\n return;\n }\n\n if (request.type === \"cancel_prompt\") {\n this.handleControlRequest({\n socket,\n requestId: request.requestId,\n run: async () => ({\n type: \"cancel_result\",\n requestId: request.requestId,\n cancelled: await this.controlHandlers.cancelPrompt(),\n }),\n });\n return;\n }\n\n if (request.type === \"set_mode\") {\n this.handleControlRequest({\n socket,\n requestId: request.requestId,\n run: async () => {\n await this.controlHandlers.setSessionMode(request.modeId, request.timeoutMs);\n return {\n type: \"set_mode_result\",\n requestId: request.requestId,\n modeId: request.modeId,\n };\n },\n });\n return;\n }\n\n if (request.type === \"set_model\") {\n this.handleControlRequest({\n socket,\n requestId: request.requestId,\n run: async () => {\n await this.controlHandlers.setSessionModel(request.modelId, request.timeoutMs);\n return {\n type: \"set_model_result\",\n requestId: request.requestId,\n modelId: request.modelId,\n };\n },\n });\n return;\n }\n\n if (request.type === \"set_config_option\") {\n this.handleControlRequest({\n socket,\n requestId: request.requestId,\n run: async () => ({\n type: \"set_config_option_result\",\n requestId: request.requestId,\n response: await this.controlHandlers.setSessionConfigOption(\n request.configId,\n request.value,\n request.timeoutMs,\n ),\n }),\n });\n return;\n }\n\n const task: QueueTask = {\n requestId: request.requestId,\n message: request.message,\n prompt: request.prompt ?? textPrompt(request.message),\n permissionMode: request.permissionMode,\n resumePolicy: request.resumePolicy,\n nonInteractivePermissions: request.nonInteractivePermissions,\n timeoutMs: request.timeoutMs,\n suppressSdkConsoleErrors: request.suppressSdkConsoleErrors,\n sessionOptions: request.sessionOptions,\n waitForCompletion: request.waitForCompletion,\n enqueuedAt: Date.now(),\n send: (message) => {\n writeQueueMessage(socket, {\n ...message,\n ownerGeneration: this.ownerGeneration,\n });\n },\n close: () => {\n if (!socket.destroyed) {\n socket.end();\n }\n },\n };\n\n writeQueueMessage(socket, {\n type: \"accepted\",\n requestId: request.requestId,\n ownerGeneration: this.ownerGeneration,\n });\n\n if (!request.waitForCompletion) {\n task.close();\n }\n\n this.enqueue(task);\n };\n\n socket.on(\"data\", (chunk: string) => {\n buffer += chunk;\n\n let index = buffer.indexOf(\"\\n\");\n while (index >= 0) {\n const line = buffer.slice(0, index).trim();\n buffer = buffer.slice(index + 1);\n\n if (line.length > 0) {\n processLine(line);\n }\n\n index = buffer.indexOf(\"\\n\");\n }\n });\n\n socket.on(\"error\", () => {\n // no-op: queue processing continues even if client disconnects\n });\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { QueueConnectionError, QueueProtocolError } from \"../../errors.js\";\nimport { incrementPerfCounter } from \"../../perf-metrics.js\";\nimport type {\n AcpClientOptions,\n NonInteractivePermissionPolicy,\n OutputErrorEmissionPolicy,\n OutputFormatter,\n PermissionMode,\n PromptInput,\n SessionResumePolicy,\n SessionEnqueueResult,\n SessionSendOutcome,\n} from \"../../types.js\";\nimport { probeQueueOwnerHealth, type QueueOwnerHealth } from \"./ipc-health.js\";\nimport { QUEUE_CONNECT_RETRY_MS, connectToQueueOwner } from \"./ipc-transport.js\";\nimport {\n type QueueOwnerRecord,\n readQueueOwnerRecord,\n terminateQueueOwnerForSession,\n} from \"./lease-store.js\";\nimport {\n parseQueueOwnerMessage,\n type QueueCancelRequest,\n type QueueOwnerCancelResultMessage,\n type QueueOwnerMessage,\n type QueueOwnerSetConfigOptionResultMessage,\n type QueueOwnerSetModelResultMessage,\n type QueueOwnerSetModeResultMessage,\n type QueueRequest,\n type QueueSetConfigOptionRequest,\n type QueueSetModelRequest,\n type QueueSetModeRequest,\n type QueueSubmitRequest,\n} from \"./messages.js\";\n\nexport { QUEUE_CONNECT_RETRY_MS } from \"./ipc-transport.js\";\nexport const MAX_MESSAGE_BUFFER_SIZE = 10 * 1024 * 1024;\nexport {\n isProcessAlive,\n releaseQueueOwnerLease,\n terminateProcess,\n terminateQueueOwnerForSession,\n tryAcquireQueueOwnerLease,\n waitMs,\n} from \"./lease-store.js\";\nexport type { QueueOwnerLease } from \"./lease-store.js\";\n\nconst STALE_OWNER_PROTOCOL_DETAIL_CODES = new Set([\n \"QUEUE_PROTOCOL_MALFORMED_MESSAGE\",\n \"QUEUE_PROTOCOL_UNEXPECTED_RESPONSE\",\n]);\n\nasync function maybeRecoverStaleOwnerAfterProtocolMismatch(params: {\n sessionId: string;\n owner: QueueOwnerRecord;\n error: unknown;\n verbose?: boolean;\n}): Promise<boolean> {\n if (!(params.error instanceof QueueProtocolError)) {\n return false;\n }\n\n const detailCode = params.error.detailCode;\n if (!detailCode || !STALE_OWNER_PROTOCOL_DETAIL_CODES.has(detailCode)) {\n return false;\n }\n\n await terminateQueueOwnerForSession(params.sessionId).catch(() => {\n // Preserve existing behavior if cleanup fails.\n });\n incrementPerfCounter(\"queue.owner.stale_recovered\");\n\n if (params.verbose) {\n process.stderr.write(\n `[acpx] dropped stale queue owner metadata after protocol mismatch for session ${params.sessionId} (${detailCode})\\n`,\n );\n }\n\n return true;\n}\nexport { probeQueueOwnerHealth };\nexport type { QueueOwnerHealth };\nexport type { QueueOwnerMessage, QueueSubmitRequest } from \"./messages.js\";\nexport type { QueueOwnerControlHandlers, QueueTask } from \"./ipc-server.js\";\nexport { SessionQueueOwner } from \"./ipc-server.js\";\n\nfunction assertOwnerGeneration(\n owner: QueueOwnerRecord,\n message: QueueOwnerMessage,\n): QueueOwnerMessage {\n if (\n owner.ownerGeneration !== undefined &&\n message.ownerGeneration !== undefined &&\n message.ownerGeneration !== owner.ownerGeneration\n ) {\n throw new QueueProtocolError(\"Queue owner returned mismatched generation\", {\n detailCode: \"QUEUE_OWNER_GENERATION_MISMATCH\",\n origin: \"queue\",\n retryable: true,\n });\n }\n return message;\n}\n\ntype QueueOwnerRequestState = {\n acknowledged: boolean;\n};\n\ntype QueueOwnerRequestControls<TResult> = {\n state: QueueOwnerRequestState;\n resolve: (result: TResult) => void;\n reject: (error: unknown) => void;\n};\n\nfunction makeMalformedQueueMessageError(): QueueProtocolError {\n return new QueueProtocolError(\"Queue owner sent malformed message\", {\n detailCode: \"QUEUE_PROTOCOL_MALFORMED_MESSAGE\",\n origin: \"queue\",\n retryable: true,\n });\n}\n\nfunction parseQueueOwnerResponseLine(\n owner: QueueOwnerRecord,\n requestId: string,\n line: string,\n): QueueOwnerMessage {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n throw new QueueProtocolError(\"Queue owner sent invalid JSON payload\", {\n detailCode: \"QUEUE_PROTOCOL_INVALID_JSON\",\n origin: \"queue\",\n retryable: true,\n });\n }\n\n const parsedMessage = parseQueueOwnerMessage(parsed);\n if (!parsedMessage) {\n throw makeMalformedQueueMessageError();\n }\n\n const message = assertOwnerGeneration(owner, parsedMessage);\n if (message.requestId !== requestId) {\n throw makeMalformedQueueMessageError();\n }\n\n return message;\n}\n\nasync function runQueueOwnerRequest<TResult>(options: {\n owner: QueueOwnerRecord;\n request: QueueRequest;\n onAccepted?: (controls: QueueOwnerRequestControls<TResult>) => void;\n onMessage: (message: QueueOwnerMessage, controls: QueueOwnerRequestControls<TResult>) => void;\n onClose: (controls: QueueOwnerRequestControls<TResult>) => void;\n}): Promise<TResult | undefined> {\n const socket = await connectToQueueOwner(options.owner);\n if (!socket) {\n return undefined;\n }\n\n socket.setEncoding(\"utf8\");\n\n return await new Promise<TResult>((resolve, reject) => {\n let settled = false;\n let buffer = \"\";\n const state: QueueOwnerRequestState = {\n acknowledged: false,\n };\n\n const finishResolve = (result: TResult) => {\n if (settled) {\n return;\n }\n settled = true;\n socket.removeAllListeners();\n if (!socket.destroyed) {\n socket.end();\n }\n resolve(result);\n };\n\n const finishReject = (error: unknown) => {\n if (settled) {\n return;\n }\n settled = true;\n socket.removeAllListeners();\n if (!socket.destroyed) {\n socket.destroy();\n }\n reject(error);\n };\n\n const controls: QueueOwnerRequestControls<TResult> = {\n state,\n resolve: finishResolve,\n reject: finishReject,\n };\n\n const processLine = (line: string): void => {\n let message: QueueOwnerMessage;\n try {\n message = parseQueueOwnerResponseLine(options.owner, options.request.requestId, line);\n } catch (error) {\n finishReject(error);\n return;\n }\n\n if (message.type === \"accepted\") {\n state.acknowledged = true;\n options.onAccepted?.(controls);\n return;\n }\n\n options.onMessage(message, controls);\n };\n\n socket.on(\"data\", (chunk: string) => {\n buffer += chunk;\n\n if (buffer.length > MAX_MESSAGE_BUFFER_SIZE) {\n socket.destroy();\n finishReject(new Error(`Message buffer exceeded ${MAX_MESSAGE_BUFFER_SIZE} bytes`));\n return;\n }\n\n let index = buffer.indexOf(\"\\n\");\n while (index >= 0) {\n const line = buffer.slice(0, index).trim();\n buffer = buffer.slice(index + 1);\n\n if (line.length > 0) {\n processLine(line);\n }\n\n index = buffer.indexOf(\"\\n\");\n }\n });\n\n socket.once(\"error\", (error: Error) => {\n finishReject(error);\n });\n\n socket.once(\"close\", () => {\n if (settled) {\n return;\n }\n options.onClose(controls);\n });\n\n socket.write(`${JSON.stringify(options.request)}\\n`);\n });\n}\n\nexport type SubmitToQueueOwnerOptions = {\n sessionId: string;\n message: string;\n prompt?: PromptInput;\n permissionMode: PermissionMode;\n resumePolicy?: SessionResumePolicy;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n outputFormatter: OutputFormatter;\n errorEmissionPolicy?: OutputErrorEmissionPolicy;\n timeoutMs?: number;\n suppressSdkConsoleErrors?: boolean;\n waitForCompletion: boolean;\n verbose?: boolean;\n sessionOptions?: NonNullable<AcpClientOptions[\"sessionOptions\"]>;\n};\n\nasync function submitToQueueOwner(\n owner: QueueOwnerRecord,\n options: SubmitToQueueOwnerOptions,\n): Promise<SessionSendOutcome | undefined> {\n const requestId = randomUUID();\n const request: QueueSubmitRequest = {\n type: \"submit_prompt\",\n requestId,\n ownerGeneration: owner.ownerGeneration,\n message: options.message,\n prompt: options.prompt,\n permissionMode: options.permissionMode,\n resumePolicy: options.resumePolicy,\n nonInteractivePermissions: options.nonInteractivePermissions,\n timeoutMs: options.timeoutMs,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n waitForCompletion: options.waitForCompletion,\n sessionOptions: options.sessionOptions,\n };\n\n options.outputFormatter.setContext({\n sessionId: options.sessionId,\n });\n\n return await runQueueOwnerRequest<SessionSendOutcome>({\n owner,\n request,\n onAccepted: ({ resolve }) => {\n options.outputFormatter.setContext({\n sessionId: options.sessionId,\n });\n if (!options.waitForCompletion) {\n const queued: SessionEnqueueResult = {\n queued: true,\n sessionId: options.sessionId,\n requestId,\n };\n resolve(queued);\n }\n },\n onMessage: (message, { state, resolve, reject }) => {\n if (message.type === \"error\") {\n options.outputFormatter.setContext({\n sessionId: options.sessionId,\n });\n\n const queueErrorAlreadyEmitted =\n options.errorEmissionPolicy?.queueErrorAlreadyEmitted ?? true;\n const outputAlreadyEmitted = message.outputAlreadyEmitted === true;\n const shouldEmitInFormatter = !outputAlreadyEmitted || !queueErrorAlreadyEmitted;\n if (shouldEmitInFormatter) {\n options.outputFormatter.onError({\n code: message.code ?? \"RUNTIME\",\n detailCode: message.detailCode,\n origin: message.origin ?? \"queue\",\n message: message.message,\n retryable: message.retryable,\n acp: message.acp,\n });\n options.outputFormatter.flush();\n }\n reject(\n new QueueConnectionError(message.message, {\n outputCode: message.code,\n detailCode: message.detailCode,\n origin: message.origin ?? \"queue\",\n retryable: message.retryable,\n acp: message.acp,\n ...(queueErrorAlreadyEmitted ? { outputAlreadyEmitted: true } : {}),\n }),\n );\n return;\n }\n\n if (!state.acknowledged) {\n reject(\n new QueueConnectionError(\"Queue owner did not acknowledge request\", {\n detailCode: \"QUEUE_ACK_MISSING\",\n origin: \"queue\",\n retryable: true,\n }),\n );\n return;\n }\n\n if (message.type === \"event\") {\n options.outputFormatter.onAcpMessage(message.message);\n return;\n }\n\n if (message.type === \"result\") {\n options.outputFormatter.flush();\n resolve(message.result);\n return;\n }\n\n reject(\n new QueueProtocolError(\"Queue owner returned unexpected response\", {\n detailCode: \"QUEUE_PROTOCOL_UNEXPECTED_RESPONSE\",\n origin: \"queue\",\n retryable: true,\n }),\n );\n },\n onClose: ({ state, resolve, reject }) => {\n if (!state.acknowledged) {\n reject(\n new QueueConnectionError(\"Queue owner disconnected before acknowledging request\", {\n detailCode: \"QUEUE_DISCONNECTED_BEFORE_ACK\",\n origin: \"queue\",\n retryable: true,\n }),\n );\n return;\n }\n\n if (!options.waitForCompletion) {\n const queued: SessionEnqueueResult = {\n queued: true,\n sessionId: options.sessionId,\n requestId,\n };\n resolve(queued);\n return;\n }\n\n reject(\n new QueueConnectionError(\"Queue owner disconnected before prompt completion\", {\n detailCode: \"QUEUE_DISCONNECTED_BEFORE_COMPLETION\",\n origin: \"queue\",\n retryable: true,\n }),\n );\n },\n });\n}\n\nasync function submitControlToQueueOwner<TResponse extends QueueOwnerMessage>(\n owner: QueueOwnerRecord,\n request: QueueRequest,\n isExpectedResponse: (message: QueueOwnerMessage) => message is TResponse,\n): Promise<TResponse | undefined> {\n return await runQueueOwnerRequest<TResponse>({\n owner,\n request,\n onMessage: (message, { state, resolve, reject }) => {\n if (message.type === \"error\") {\n reject(\n new QueueConnectionError(message.message, {\n outputCode: message.code,\n detailCode: message.detailCode,\n origin: message.origin ?? \"queue\",\n retryable: message.retryable,\n acp: message.acp,\n }),\n );\n return;\n }\n\n if (!state.acknowledged) {\n reject(\n new QueueConnectionError(\"Queue owner did not acknowledge request\", {\n detailCode: \"QUEUE_ACK_MISSING\",\n origin: \"queue\",\n retryable: true,\n }),\n );\n return;\n }\n\n if (!isExpectedResponse(message)) {\n reject(\n new QueueProtocolError(\"Queue owner returned unexpected response\", {\n detailCode: \"QUEUE_PROTOCOL_UNEXPECTED_RESPONSE\",\n origin: \"queue\",\n retryable: true,\n }),\n );\n return;\n }\n\n resolve(message);\n },\n onClose: ({ state, reject }) => {\n if (!state.acknowledged) {\n reject(\n new QueueConnectionError(\"Queue owner disconnected before acknowledging request\", {\n detailCode: \"QUEUE_DISCONNECTED_BEFORE_ACK\",\n origin: \"queue\",\n retryable: true,\n }),\n );\n return;\n }\n\n reject(\n new QueueConnectionError(\"Queue owner disconnected before responding\", {\n detailCode: \"QUEUE_DISCONNECTED_BEFORE_COMPLETION\",\n origin: \"queue\",\n retryable: true,\n }),\n );\n },\n });\n}\n\nasync function submitCancelToQueueOwner(owner: QueueOwnerRecord): Promise<boolean | undefined> {\n const request: QueueCancelRequest = {\n type: \"cancel_prompt\",\n requestId: randomUUID(),\n ownerGeneration: owner.ownerGeneration,\n };\n const response = await submitControlToQueueOwner(\n owner,\n request,\n (message): message is QueueOwnerCancelResultMessage => message.type === \"cancel_result\",\n );\n if (!response) {\n return undefined;\n }\n if (response.requestId !== request.requestId) {\n throw new QueueProtocolError(\"Queue owner returned mismatched cancel response\", {\n detailCode: \"QUEUE_PROTOCOL_MALFORMED_MESSAGE\",\n origin: \"queue\",\n retryable: true,\n });\n }\n return response.cancelled;\n}\n\nasync function submitSetModeToQueueOwner(\n owner: QueueOwnerRecord,\n modeId: string,\n timeoutMs?: number,\n): Promise<boolean | undefined> {\n const request: QueueSetModeRequest = {\n type: \"set_mode\",\n requestId: randomUUID(),\n ownerGeneration: owner.ownerGeneration,\n modeId,\n timeoutMs,\n };\n const response = await submitControlToQueueOwner(\n owner,\n request,\n (message): message is QueueOwnerSetModeResultMessage => message.type === \"set_mode_result\",\n );\n if (!response) {\n return undefined;\n }\n if (response.requestId !== request.requestId) {\n throw new QueueProtocolError(\"Queue owner returned mismatched set_mode response\", {\n detailCode: \"QUEUE_PROTOCOL_MALFORMED_MESSAGE\",\n origin: \"queue\",\n retryable: true,\n });\n }\n return true;\n}\n\nasync function submitSetModelToQueueOwner(\n owner: QueueOwnerRecord,\n modelId: string,\n timeoutMs?: number,\n): Promise<boolean | undefined> {\n const request: QueueSetModelRequest = {\n type: \"set_model\",\n requestId: randomUUID(),\n ownerGeneration: owner.ownerGeneration,\n modelId,\n timeoutMs,\n };\n const response = await submitControlToQueueOwner(\n owner,\n request,\n (message): message is QueueOwnerSetModelResultMessage => message.type === \"set_model_result\",\n );\n if (!response) {\n return undefined;\n }\n if (response.requestId !== request.requestId) {\n throw new QueueProtocolError(\"Queue owner returned mismatched set_model response\", {\n detailCode: \"QUEUE_PROTOCOL_MALFORMED_MESSAGE\",\n origin: \"queue\",\n retryable: true,\n });\n }\n return true;\n}\n\nasync function submitSetConfigOptionToQueueOwner(\n owner: QueueOwnerRecord,\n configId: string,\n value: string,\n timeoutMs?: number,\n): Promise<SetSessionConfigOptionResponse | undefined> {\n const request: QueueSetConfigOptionRequest = {\n type: \"set_config_option\",\n requestId: randomUUID(),\n ownerGeneration: owner.ownerGeneration,\n configId,\n value,\n timeoutMs,\n };\n const response = await submitControlToQueueOwner(\n owner,\n request,\n (message): message is QueueOwnerSetConfigOptionResultMessage =>\n message.type === \"set_config_option_result\",\n );\n if (!response) {\n return undefined;\n }\n if (response.requestId !== request.requestId) {\n throw new QueueProtocolError(\"Queue owner returned mismatched set_config_option response\", {\n detailCode: \"QUEUE_PROTOCOL_MALFORMED_MESSAGE\",\n origin: \"queue\",\n retryable: true,\n });\n }\n return response.response;\n}\n\nexport async function trySubmitToRunningOwner(\n options: SubmitToQueueOwnerOptions,\n): Promise<SessionSendOutcome | undefined> {\n const owner = await readQueueOwnerRecord(options.sessionId);\n if (!owner) {\n return undefined;\n }\n\n let submitted: SessionSendOutcome | undefined;\n try {\n submitted = await submitToQueueOwner(owner, options);\n } catch (error) {\n const recovered = await maybeRecoverStaleOwnerAfterProtocolMismatch({\n sessionId: options.sessionId,\n owner,\n error,\n verbose: options.verbose,\n });\n if (recovered) {\n return undefined;\n }\n throw error;\n }\n if (submitted) {\n if (options.verbose) {\n process.stderr.write(\n `[acpx] queued prompt on active owner pid ${owner.pid} for session ${options.sessionId}\\n`,\n );\n }\n return submitted;\n }\n\n const health = await probeQueueOwnerHealth(options.sessionId);\n if (!health.hasLease) {\n return undefined;\n }\n\n throw new QueueConnectionError(\n \"Session queue owner is running but not accepting queue requests\",\n {\n detailCode: \"QUEUE_NOT_ACCEPTING_REQUESTS\",\n origin: \"queue\",\n retryable: true,\n },\n );\n}\n\nexport async function tryCancelOnRunningOwner(options: {\n sessionId: string;\n verbose?: boolean;\n}): Promise<boolean | undefined> {\n const owner = await readQueueOwnerRecord(options.sessionId);\n if (!owner) {\n return undefined;\n }\n\n const cancelled = await submitCancelToQueueOwner(owner);\n if (cancelled !== undefined) {\n if (options.verbose) {\n process.stderr.write(\n `[acpx] requested cancel on active owner pid ${owner.pid} for session ${options.sessionId}\\n`,\n );\n }\n return cancelled;\n }\n\n const health = await probeQueueOwnerHealth(options.sessionId);\n if (!health.hasLease) {\n return undefined;\n }\n\n throw new QueueConnectionError(\n \"Session queue owner is running but not accepting cancel requests\",\n {\n detailCode: \"QUEUE_NOT_ACCEPTING_REQUESTS\",\n origin: \"queue\",\n retryable: true,\n },\n );\n}\n\nexport async function trySetModeOnRunningOwner(\n sessionId: string,\n modeId: string,\n timeoutMs: number | undefined,\n verbose: boolean | undefined,\n): Promise<boolean | undefined> {\n const owner = await readQueueOwnerRecord(sessionId);\n if (!owner) {\n return undefined;\n }\n\n const submitted = await submitSetModeToQueueOwner(owner, modeId, timeoutMs);\n if (submitted) {\n if (verbose) {\n process.stderr.write(\n `[acpx] requested session/set_mode on owner pid ${owner.pid} for session ${sessionId}\\n`,\n );\n }\n return true;\n }\n\n const health = await probeQueueOwnerHealth(sessionId);\n if (!health.hasLease) {\n return undefined;\n }\n\n throw new QueueConnectionError(\n \"Session queue owner is running but not accepting set_mode requests\",\n {\n detailCode: \"QUEUE_NOT_ACCEPTING_REQUESTS\",\n origin: \"queue\",\n retryable: true,\n },\n );\n}\n\nexport async function trySetModelOnRunningOwner(\n sessionId: string,\n modelId: string,\n timeoutMs: number | undefined,\n verbose: boolean | undefined,\n): Promise<boolean | undefined> {\n const owner = await readQueueOwnerRecord(sessionId);\n if (!owner) {\n return undefined;\n }\n\n const submitted = await submitSetModelToQueueOwner(owner, modelId, timeoutMs);\n if (submitted) {\n if (verbose) {\n process.stderr.write(\n `[acpx] requested session/set_model on owner pid ${owner.pid} for session ${sessionId}\\n`,\n );\n }\n return true;\n }\n\n const health = await probeQueueOwnerHealth(sessionId);\n if (!health.hasLease) {\n return undefined;\n }\n\n throw new QueueConnectionError(\n \"Session queue owner is running but not accepting set_model requests\",\n {\n detailCode: \"QUEUE_NOT_ACCEPTING_REQUESTS\",\n origin: \"queue\",\n retryable: true,\n },\n );\n}\n\nexport async function trySetConfigOptionOnRunningOwner(\n sessionId: string,\n configId: string,\n value: string,\n timeoutMs: number | undefined,\n verbose: boolean | undefined,\n): Promise<SetSessionConfigOptionResponse | undefined> {\n const owner = await readQueueOwnerRecord(sessionId);\n if (!owner) {\n return undefined;\n }\n\n const response = await submitSetConfigOptionToQueueOwner(owner, configId, value, timeoutMs);\n if (response) {\n if (verbose) {\n process.stderr.write(\n `[acpx] requested session/set_config_option on owner pid ${owner.pid} for session ${sessionId}\\n`,\n );\n }\n return response;\n }\n\n const health = await probeQueueOwnerHealth(sessionId);\n if (!health.hasLease) {\n return undefined;\n }\n\n throw new QueueConnectionError(\n \"Session queue owner is running but not accepting set_config_option requests\",\n {\n detailCode: \"QUEUE_NOT_ACCEPTING_REQUESTS\",\n origin: \"queue\",\n retryable: true,\n },\n );\n}\n"],"mappings":"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"}