@ailu-ai/graph-sdk 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/NOTICE +13 -0
- package/README.md +84 -0
- package/dist/index.d.ts +4260 -0
- package/dist/index.js +10612 -0
- package/dist/index.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../graph-core/src/types.ts","../../graph-core/src/schemas.ts","../../graph-core/src/errors.ts","../../graph-core/src/validator.ts","../../graph-runtime/src/node-registry.ts","../../graph-runtime/src/condition-registry.ts","../../graph-runtime/src/checkpointer.ts","../../graph-runtime/src/equality.ts","../../graph-runtime/src/event-bus.ts","../../graph-runtime/src/interrupt.ts","../../graph-runtime/src/time-travel.ts","../../graph-runtime/src/cycles.ts","../../graph-runtime/src/tool-node.ts","../../memory-store/src/in-memory-store.ts","../../agents-core/src/step-budget.ts","../../agents-core/src/swarm.ts","../../callbacks/src/manager.ts","../../graph-runtime/src/runtime.ts","../src/errors.ts","../src/durable.ts","../src/run-explainer.ts","../../agents-core/src/tools.ts","../../agents-core/src/todos.ts","../../agents-core/src/react-agent.ts","../../llm-gateway/src/errors.ts","../../llm-gateway/src/gateway.ts","../../llm-gateway/src/mock-adapter.ts","../../llm-gateway/src/anthropic-adapter.ts","../../llm-gateway/src/openai-compatible-adapter.ts","../../llm-gateway/src/prompt-registry.ts","../../llm-gateway/src/model-policy.ts","../src/agent-node.ts","../src/rust-engine.ts","../src/compiled-graph.ts","../src/rust-validator.ts","../src/builder.ts","../src/send.ts","../src/components.ts","../src/reference-graph.ts","../src/example-graphs.ts","../src/council.ts","../src/prebuilt-agents.ts","../src/embeddings.ts","../src/vector-store.ts","../src/semantic-retriever.ts","../src/catalog.ts","../src/llms-txt-generator.ts","../src/schema-generator.ts","../src/dev-inspector.ts","../src/observability.ts","../src/run-catalog-graph.ts","../src/verify-replay.ts","../src/final-answer.ts","../../approval-engine/src/errors.ts","../../approval-engine/src/in-memory-approval-engine.ts","../../approval-engine/src/attestation.ts","../../artifact-store/src/types.ts","../../artifact-store/src/in-memory-artifact-store.ts","../../artifact-store/src/schemas.ts","../../graph-ailu/src/parser/ref.ts","../../graph-ailu/src/parser/build-graph-ast.ts","../../graph-ailu/src/validator/validate-graph-ast.ts","../../graph-ailu/src/transformer/transform-graph.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/scalar/str.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/scalar/null_core.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/scalar/null_json.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/scalar/null_yaml11.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/scalar/bool_core.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/scalar/bool_json.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/scalar/bool_yaml11.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/scalar/int_core.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/scalar/int_json.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/scalar/int_yaml11.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/scalar/float_core.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/scalar/float_json.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/scalar/float_yaml11.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/scalar/merge.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/scalar/binary.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/scalar/timestamp.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/sequence/seq.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/common/object.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/sequence/omap.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/sequence/pairs.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/mapping/map.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/mapping/set.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/schema.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/mapping/real_map.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/tag/mapping/legacy_map.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/common/snippet.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/common/exception.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/parser/parser_scalar.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/common/tagname.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/parser/constructor.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/parser/parser.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/load.ts","../../../node_modules/.pnpm/js-yaml@5.2.3/node_modules/js-yaml/src/dump.ts","../../graph-ailu/src/compiler/compile-graph-file.ts","../../lang-ailu/src/parser/parse-yaml.ts","../../lang-ailu/src/parser/loc.ts","../../lang-ailu/src/parser/build-prompt-ast.ts","../../lang-ailu/src/parser/build-agent-ast.ts","../../lang-ailu/src/parser/build-chain-ast.ts","../../lang-ailu/src/validator/validate-prompt-ast.ts","../../lang-ailu/src/validator/validate-agent-ast.ts","../../lang-ailu/src/validator/validate-chain-ast.ts","../../lang-ailu/src/transformer/template-engine.ts","../../lang-ailu/src/transformer/transform-prompt.ts","../../lang-ailu/src/transformer/transform-agent.ts","../../lang-ailu/src/transformer/transform-chain.ts","../../lang-ailu/src/compiler/compile-file.ts","../../search/src/types.ts","../../search/src/in-memory.ts"],"names":["edge","hasCycle","now","z","DEFAULT_MODEL","model","createDefaultPort","createRequire","cachedNative","queryText","trimmed","DEFAULT_PROVIDER","passthrough","cosineSimilarity","valueToText","channelsOf","models","components","generateRunId","TOOL_SUBJECT_PREFIX","sha256Hex","createHash","cryptoSign","cryptoVerify","result","date","Schema","line","scalar","strTag","ch","renderTemplate","loc","ast","diagnostics","tokenize"],"mappings":"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","file":"index.js","sourcesContent":["import type { Message } from \"./messages\";\n\nexport type Brand<T, TBrand extends string> = T & { readonly __brand: TBrand };\n\nexport type NodeId = Brand<string, \"NodeId\">;\nexport type EdgeId = Brand<string, \"EdgeId\">;\nexport type GraphId = Brand<string, \"GraphId\">;\nexport type RunId = Brand<string, \"RunId\">;\nexport type ChannelReducer = \"replace\" | \"append\" | \"merge\";\n\nexport type ChannelDefinition<T> = {\n type: string;\n reducer: ChannelReducer;\n default?: T;\n /** ADR 0032: never emit this channel's value in run events/logs (masked; still checkpointed). */\n noLog?: boolean;\n};\n\nexport type MessagesChannelDefinition = {\n type: \"messages\";\n reducer: \"append\";\n default?: Message[];\n};\n\nexport type ChannelsSchema = Record<string, ChannelDefinition<unknown>>;\n\nexport type ResolvedChannels<TChannels extends ChannelsSchema> = {\n [K in keyof TChannels]: TChannels[K] extends ChannelDefinition<infer TValue> ? TValue : never;\n};\n\nexport const NODE_TYPES = [\"action\", \"agent\", \"tool\", \"human-gate\", \"subgraph\"] as const;\nexport type NodeType = (typeof NODE_TYPES)[number];\n\n/** ADR 0076 (product repo) — `\"error\"` routes from a node to a designated handler once its\n * `retryPolicy` is exhausted, instead of failing the whole run. Absent (the common case): failure\n * behavior is unchanged — the run terminates exactly as before this type existed. */\nexport const EDGE_TYPES = [\"default\", \"conditional\", \"error\"] as const;\nexport type EdgeType = (typeof EDGE_TYPES)[number];\n\n/** ADR 0076 — coarse classification of why a node's handler threw, attached to `node_failed`/\n * `node_error_routed` events so a governed error path can react differently to a transient\n * failure (worth a human-visible retry) vs a permanent one (worth surfacing, not retrying).\n * Derived by `graph-runtime` from a thrown error's own `failureCategory` property when present\n * (a convention, not an interface — any thrower, e.g. `llm-gateway`, can set it); defaults to\n * `\"unknown\"` for a plain `Error`/thrown value that doesn't declare one. */\nexport const FAILURE_CATEGORIES = [\"transient\", \"permanent\", \"unknown\"] as const;\nexport type FailureCategory = (typeof FAILURE_CATEGORIES)[number];\n\n/** `cancelled` (ADR 0044): terminal, reached when the embedder's cancellation seam returned\n * true at a node BOUNDARY — the run stopped before scheduling its next node, with its last\n * checkpoint durable and authoritative. Distinct from `failed` (no error occurred) and from\n * `suspended` (it is not waiting on a decision). A cancelled run stays replayable. */\nexport const GRAPH_STATUSES = [\n \"idle\",\n \"running\",\n \"suspended\",\n \"completed\",\n \"failed\",\n \"cancelled\"\n] as const;\nexport type GraphStatus = (typeof GRAPH_STATUSES)[number];\n\nexport type RetryPolicy = {\n maxAttempts: number;\n backoffMs: number;\n};\n\nexport type Command<TChannels extends ChannelsSchema = ChannelsSchema> = {\n goto: NodeId | NodeId[];\n update?: Partial<ResolvedChannels<TChannels>>;\n};\n\nexport type NodeDefinition = {\n id: NodeId;\n type: NodeType;\n label: string;\n subgraphId?: GraphId;\n inputMapping?: Record<string, string>;\n outputMapping?: Record<string, string>;\n fanOut?: { parallelTo: NodeId[]; joinAt: NodeId };\n /** ADR 0042 D2/D3 (product ADR 0068 — child workflows): dynamic N-child subgraph fan-out.\n * Present on a `type: \"subgraph\"` node ALONGSIDE its `subgraphId` (never duplicated here) —\n * `overChannel` is read as a JSON array at execution time, one child spawn per item, run\n * concurrently; results land in `joinAt` as a JSON array, input order preserved. Absent (the\n * common case): the node runs its subgraph exactly once, unchanged. */\n mapSubgraph?: { overChannel: string; joinAt: string };\n retryPolicy?: RetryPolicy;\n metadata?: Record<string, unknown>;\n};\n\nexport type EdgeDefinition = {\n id: EdgeId;\n from: NodeId;\n to: NodeId;\n type: EdgeType;\n condition?: string;\n};\n\nexport type GraphState<TChannels extends ChannelsSchema = ChannelsSchema> = {\n runId: RunId;\n graphId: GraphId;\n currentNodeId: NodeId;\n status: GraphStatus;\n channels: ResolvedChannels<TChannels>;\n version: number;\n checkpointId?: string;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type GraphDefinition<TChannels extends ChannelsSchema = ChannelsSchema> = {\n id: GraphId;\n version: string;\n name: string;\n recursionLimit?: number;\n channels: TChannels;\n nodes: NodeDefinition[];\n edges: EdgeDefinition[];\n entryNodeId: NodeId;\n metadata?: Record<string, unknown>;\n};\n\nexport const trimMessages = (\n messages: Message[],\n maxTokens: number,\n countFn: (message: Message) => number\n): Message[] => {\n if (maxTokens <= 0) {\n return [];\n }\n const reversed: Message[] = [];\n let total = 0;\n for (let i = messages.length - 1; i >= 0; i -= 1) {\n const message = messages[i];\n if (message === undefined) {\n continue;\n }\n const cost = countFn(message);\n if (total + cost > maxTokens) {\n continue;\n }\n total += cost;\n reversed.push(message);\n }\n return reversed.reverse();\n};\n\nexport const filterMessages = (messages: Message[], roles: Message[\"role\"][]): Message[] => {\n const allowed = new Set(roles);\n return messages.filter((message) => allowed.has(message.role));\n};\n","import { z } from \"zod\";\n\nimport { EDGE_TYPES, GRAPH_STATUSES, NODE_TYPES } from \"./types\";\n\nconst SemverPattern =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\nconst NodeIdSchema = z.string().min(1).brand<\"NodeId\">();\nconst EdgeIdSchema = z.string().min(1).brand<\"EdgeId\">();\nconst GraphIdSchema = z.string().min(1).brand<\"GraphId\">();\nconst RunIdSchema = z.string().min(1).brand<\"RunId\">();\n\nconst RetryPolicySchema = z.object({\n maxAttempts: z.number().int().min(1),\n backoffMs: z.number().int().min(0)\n});\n\nconst NodeTypeSchema = z.enum(NODE_TYPES);\nconst EdgeTypeSchema = z.enum(EDGE_TYPES);\nconst GraphStatusSchema = z.enum(GRAPH_STATUSES);\n\nexport const NodeDefinitionSchema = z.object({\n id: NodeIdSchema,\n type: NodeTypeSchema,\n label: z.string().min(1),\n subgraphId: GraphIdSchema.optional(),\n inputMapping: z.record(z.string(), z.string()).optional(),\n outputMapping: z.record(z.string(), z.string()).optional(),\n fanOut: z\n .object({\n parallelTo: z.array(NodeIdSchema).min(1),\n joinAt: NodeIdSchema\n })\n .optional(),\n // ADR 0042 D2/D3 (product ADR 0068 — child workflows): dynamic N-child subgraph fan-out.\n mapSubgraph: z\n .object({\n overChannel: z.string().min(1),\n joinAt: z.string().min(1)\n })\n .optional(),\n retryPolicy: RetryPolicySchema.optional(),\n metadata: z.record(z.string(), z.unknown()).optional()\n});\n\nexport const EdgeDefinitionSchema = z\n .object({\n id: EdgeIdSchema,\n from: NodeIdSchema,\n to: NodeIdSchema,\n type: EdgeTypeSchema,\n condition: z.string().optional()\n })\n .superRefine((edge, ctx) => {\n const isConditional = edge.type === \"conditional\";\n const condition = edge.condition;\n const hasCondition = typeof condition === \"string\";\n\n if (isConditional && !hasCondition) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Conditional edges require a named condition string.\",\n path: [\"condition\"]\n });\n }\n\n if (hasCondition && condition.trim().length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Condition must be a non-empty named string.\",\n path: [\"condition\"]\n });\n }\n });\n\nexport const GraphStateSchema = z.object({\n runId: RunIdSchema,\n graphId: GraphIdSchema,\n currentNodeId: NodeIdSchema,\n status: GraphStatusSchema,\n channels: z.record(z.string(), z.unknown()),\n version: z.number().int().min(0),\n checkpointId: z.string().min(1).optional(),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime()\n});\n\nexport const GraphDefinitionSchema = z.object({\n id: GraphIdSchema,\n version: z.string().regex(SemverPattern, \"Version must be a valid semver string.\"),\n name: z.string().min(1),\n recursionLimit: z.number().int().min(1).optional(),\n channels: z.record(\n z.string(),\n z.object({\n type: z.string().min(1),\n reducer: z.enum([\"replace\", \"append\", \"merge\"]),\n default: z.unknown().optional()\n })\n ),\n nodes: z.array(NodeDefinitionSchema),\n edges: z.array(EdgeDefinitionSchema),\n entryNodeId: NodeIdSchema,\n metadata: z.record(z.string(), z.unknown()).optional()\n});\n\nexport const ToolCallSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n input: z.unknown()\n});\n\nexport const BaseMessageSchema = z.object({\n id: z.string().min(1),\n createdAt: z.date(),\n metadata: z.record(z.string(), z.unknown()).optional()\n});\n\nexport const HumanMessageSchema = BaseMessageSchema.extend({\n role: z.literal(\"human\"),\n content: z.string()\n});\n\nexport const AIMessageSchema = BaseMessageSchema.extend({\n role: z.literal(\"ai\"),\n content: z.string(),\n toolCalls: z.array(ToolCallSchema).optional()\n});\n\nexport const ToolMessageSchema = BaseMessageSchema.extend({\n role: z.literal(\"tool\"),\n toolCallId: z.string().min(1),\n content: z.string()\n});\n\nexport const SystemMessageSchema = BaseMessageSchema.extend({\n role: z.literal(\"system\"),\n content: z.string()\n});\n\nexport const MessageSchema = z.discriminatedUnion(\"role\", [\n HumanMessageSchema,\n AIMessageSchema,\n ToolMessageSchema,\n SystemMessageSchema\n]);\n","export const GRAPH_VALIDATION_ERROR_CODES = {\n DUPLICATE_NODE_ID: \"DUPLICATE_NODE_ID\",\n DUPLICATE_EDGE_ID: \"DUPLICATE_EDGE_ID\",\n MISSING_ENTRY_NODE: \"MISSING_ENTRY_NODE\",\n INVALID_EDGE_REFERENCE: \"INVALID_EDGE_REFERENCE\",\n CYCLE_DETECTED: \"CYCLE_DETECTED\",\n INVALID_CONDITION_FORMAT: \"INVALID_CONDITION_FORMAT\",\n MULTIPLE_ERROR_EDGES: \"MULTIPLE_ERROR_EDGES\"\n} as const;\n\nexport type GraphValidationErrorCode =\n (typeof GRAPH_VALIDATION_ERROR_CODES)[keyof typeof GRAPH_VALIDATION_ERROR_CODES];\n\nexport type GraphValidationPath = (string | number)[];\n\nexport class GraphValidationError extends Error {\n public readonly code: GraphValidationErrorCode;\n public readonly path: GraphValidationPath;\n\n public constructor(\n code: GraphValidationErrorCode,\n message: string,\n path: GraphValidationPath = []\n ) {\n super(message);\n this.name = \"GraphValidationError\";\n this.code = code;\n this.path = path;\n }\n}\n","import { GraphDefinitionSchema } from \"./schemas\";\nimport {\n GRAPH_VALIDATION_ERROR_CODES,\n GraphValidationError,\n type GraphValidationErrorCode\n} from \"./errors\";\nimport type { GraphDefinition } from \"./types\";\n\nconst isNonEmptyCondition = (value: string | undefined): value is string =>\n typeof value === \"string\" && value.trim().length > 0;\n\nconst createError = (\n code: GraphValidationErrorCode,\n message: string,\n path: (string | number)[] = []\n): GraphValidationError => new GraphValidationError(code, message, path);\n\nexport const validateGraph = (def: GraphDefinition): GraphValidationError[] => {\n const errors: GraphValidationError[] = [];\n const schemaResult = GraphDefinitionSchema.safeParse(def);\n\n if (!schemaResult.success) {\n for (const issue of schemaResult.error.issues) {\n if (issue.path.includes(\"condition\")) {\n errors.push(\n createError(\n GRAPH_VALIDATION_ERROR_CODES.INVALID_CONDITION_FORMAT,\n issue.message,\n issue.path\n )\n );\n }\n }\n }\n\n const nodeIds = new Set<string>();\n for (let i = 0; i < def.nodes.length; i += 1) {\n const node = def.nodes[i];\n const nodeId = node?.id;\n if (node === undefined || nodeId === undefined) {\n continue;\n }\n\n if (nodeIds.has(nodeId)) {\n errors.push(\n createError(\n GRAPH_VALIDATION_ERROR_CODES.DUPLICATE_NODE_ID,\n `Duplicate node id '${nodeId}'.`,\n [\"nodes\", i, \"id\"]\n )\n );\n continue;\n }\n\n nodeIds.add(nodeId);\n\n if (node.type === \"subgraph\" && node.subgraphId === undefined) {\n errors.push(\n createError(\n GRAPH_VALIDATION_ERROR_CODES.INVALID_EDGE_REFERENCE,\n `Subgraph node '${nodeId}' must define subgraphId.`,\n [\"nodes\", i, \"subgraphId\"]\n )\n );\n }\n\n const inputMapping = node.inputMapping;\n if (inputMapping !== undefined) {\n const isValidInputMapping = Object.entries(inputMapping).every(\n ([targetKey, sourceKey]) => typeof targetKey === \"string\" && typeof sourceKey === \"string\"\n );\n if (!isValidInputMapping) {\n errors.push(\n createError(\n GRAPH_VALIDATION_ERROR_CODES.INVALID_CONDITION_FORMAT,\n `Node '${nodeId}' inputMapping must be string-to-string.`,\n [\"nodes\", i, \"inputMapping\"]\n )\n );\n }\n }\n\n const outputMapping = node.outputMapping;\n if (outputMapping !== undefined) {\n const isValidOutputMapping = Object.entries(outputMapping).every(\n ([targetKey, sourceKey]) => typeof targetKey === \"string\" && typeof sourceKey === \"string\"\n );\n if (!isValidOutputMapping) {\n errors.push(\n createError(\n GRAPH_VALIDATION_ERROR_CODES.INVALID_CONDITION_FORMAT,\n `Node '${nodeId}' outputMapping must be string-to-string.`,\n [\"nodes\", i, \"outputMapping\"]\n )\n );\n }\n }\n }\n\n const edgeIds = new Set<string>();\n for (let i = 0; i < def.edges.length; i += 1) {\n const edge = def.edges[i];\n if (edge === undefined) {\n continue;\n }\n\n if (edgeIds.has(edge.id)) {\n errors.push(\n createError(\n GRAPH_VALIDATION_ERROR_CODES.DUPLICATE_EDGE_ID,\n `Duplicate edge id '${edge.id}'.`,\n [\"edges\", i, \"id\"]\n )\n );\n } else {\n edgeIds.add(edge.id);\n }\n\n if (!nodeIds.has(edge.from)) {\n errors.push(\n createError(\n GRAPH_VALIDATION_ERROR_CODES.INVALID_EDGE_REFERENCE,\n `Edge '${edge.id}' references unknown source node '${edge.from}'.`,\n [\"edges\", i, \"from\"]\n )\n );\n }\n\n if (!nodeIds.has(edge.to)) {\n errors.push(\n createError(\n GRAPH_VALIDATION_ERROR_CODES.INVALID_EDGE_REFERENCE,\n `Edge '${edge.id}' references unknown target node '${edge.to}'.`,\n [\"edges\", i, \"to\"]\n )\n );\n }\n\n if (edge.type === \"conditional\" && !isNonEmptyCondition(edge.condition)) {\n errors.push(\n createError(\n GRAPH_VALIDATION_ERROR_CODES.INVALID_CONDITION_FORMAT,\n `Conditional edge '${edge.id}' must declare a non-empty named condition.`,\n [\"edges\", i, \"condition\"]\n )\n );\n }\n\n if (edge.condition !== undefined && !isNonEmptyCondition(edge.condition)) {\n errors.push(\n createError(\n GRAPH_VALIDATION_ERROR_CODES.INVALID_CONDITION_FORMAT,\n `Edge '${edge.id}' has an invalid condition format.`,\n [\"edges\", i, \"condition\"]\n )\n );\n }\n }\n\n const errorEdgeCountByNode = new Map<string, number>();\n for (const edge of def.edges) {\n if (edge.type !== \"error\") {\n continue;\n }\n errorEdgeCountByNode.set(edge.from, (errorEdgeCountByNode.get(edge.from) ?? 0) + 1);\n }\n for (const [nodeId, count] of errorEdgeCountByNode) {\n if (count > 1) {\n errors.push(\n createError(\n GRAPH_VALIDATION_ERROR_CODES.MULTIPLE_ERROR_EDGES,\n `Node '${nodeId}' has ${count} outgoing error edges; at most one is allowed (ambiguous routing).`,\n [\"edges\"]\n )\n );\n }\n }\n\n if (!nodeIds.has(def.entryNodeId)) {\n errors.push(\n createError(\n GRAPH_VALIDATION_ERROR_CODES.MISSING_ENTRY_NODE,\n `Entry node '${def.entryNodeId}' does not exist in nodes.`,\n [\"entryNodeId\"]\n )\n );\n }\n\n for (let i = 0; i < def.nodes.length; i += 1) {\n const node = def.nodes[i];\n if (node?.fanOut === undefined) {\n continue;\n }\n for (const fanNodeId of node.fanOut.parallelTo) {\n if (!nodeIds.has(fanNodeId)) {\n errors.push(\n createError(\n GRAPH_VALIDATION_ERROR_CODES.INVALID_EDGE_REFERENCE,\n `Fan-out node '${node.id}' references unknown parallel node '${fanNodeId}'.`,\n [\"nodes\", i, \"fanOut\", \"parallelTo\"]\n )\n );\n }\n }\n if (!nodeIds.has(node.fanOut.joinAt)) {\n errors.push(\n createError(\n GRAPH_VALIDATION_ERROR_CODES.INVALID_EDGE_REFERENCE,\n `Fan-out node '${node.id}' references unknown join node '${node.fanOut.joinAt}'.`,\n [\"nodes\", i, \"fanOut\", \"joinAt\"]\n )\n );\n }\n }\n\n const hasCycle = (() => {\n const adjacency = new Map<string, string[]>();\n for (const nodeId of nodeIds) {\n adjacency.set(nodeId, []);\n }\n for (const edge of def.edges) {\n const from = adjacency.get(edge.from);\n if (from !== undefined) {\n from.push(edge.to);\n }\n }\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const dfs = (nodeId: string): boolean => {\n if (visiting.has(nodeId)) {\n return true;\n }\n if (visited.has(nodeId)) {\n return false;\n }\n visiting.add(nodeId);\n for (const to of adjacency.get(nodeId) ?? []) {\n if (dfs(to)) {\n return true;\n }\n }\n visiting.delete(nodeId);\n visited.add(nodeId);\n return false;\n };\n for (const nodeId of nodeIds) {\n if (dfs(nodeId)) {\n return true;\n }\n }\n return false;\n })();\n\n if (hasCycle && def.recursionLimit === undefined) {\n errors.push(\n createError(\n GRAPH_VALIDATION_ERROR_CODES.CYCLE_DETECTED,\n \"Cycle detected and recursionLimit is missing. Set recursionLimit to acknowledge cyclic execution.\",\n [\"recursionLimit\"]\n )\n );\n }\n\n return errors;\n};\n","import type { NodeId } from \"@ailu-ai/graph-core\";\n\nimport type { NodeHandler, NodeRegistry } from \"./interfaces.js\";\n\nexport class InMemoryNodeRegistry implements NodeRegistry {\n private readonly handlers = new Map<NodeId, NodeHandler>();\n\n public register(nodeId: NodeId, handler: NodeHandler): void {\n this.handlers.set(nodeId, handler);\n }\n\n public resolve(nodeId: NodeId): NodeHandler | undefined {\n return this.handlers.get(nodeId);\n }\n}\n","import type { ConditionFn, ConditionRegistry } from \"./interfaces.js\";\n\nexport class InMemoryConditionRegistry implements ConditionRegistry {\n private readonly conditions = new Map<string, ConditionFn>();\n\n public register(name: string, fn: ConditionFn): void {\n this.conditions.set(name, fn);\n }\n\n public resolve(name: string): ConditionFn | undefined {\n return this.conditions.get(name);\n }\n}\n","import type { RunId } from \"@ailu-ai/graph-core\";\n\nimport type { Checkpointer } from \"./interfaces.js\";\nimport type { Checkpoint, CheckpointId } from \"./types.js\";\n\nexport class InMemoryCheckpointer implements Checkpointer {\n private readonly checkpointsById = new Map<CheckpointId, Checkpoint>();\n private readonly latestCheckpointByRunId = new Map<RunId, CheckpointId>();\n private readonly checkpointIdsByRunId = new Map<RunId, CheckpointId[]>();\n\n public async save(checkpoint: Checkpoint): Promise<void> {\n this.checkpointsById.set(checkpoint.id, checkpoint);\n this.latestCheckpointByRunId.set(checkpoint.runId, checkpoint.id);\n const ids = this.checkpointIdsByRunId.get(checkpoint.runId) ?? [];\n this.checkpointIdsByRunId.set(checkpoint.runId, [...ids, checkpoint.id]);\n }\n\n public async load(runId: RunId): Promise<Checkpoint | undefined> {\n const checkpointId = this.latestCheckpointByRunId.get(runId);\n if (checkpointId === undefined) {\n return undefined;\n }\n\n return this.checkpointsById.get(checkpointId);\n }\n\n public async loadById(id: CheckpointId): Promise<Checkpoint | undefined> {\n return this.checkpointsById.get(id);\n }\n\n public async list(runId: RunId): Promise<Checkpoint[]> {\n const ids = this.checkpointIdsByRunId.get(runId) ?? [];\n return ids\n .map((id) => this.checkpointsById.get(id))\n .filter((checkpoint): checkpoint is Checkpoint => checkpoint !== undefined);\n }\n}\n","/**\n * Cycle-safe structural equality for channel values.\n *\n * Replaces `JSON.stringify(a) === JSON.stringify(b)`, which crashes on circular\n * references and gives false negatives when object keys are in a different order.\n * Compares primitives with `Object.is` (so `NaN` equals `NaN`), `Date` by instant,\n * arrays element-wise, and plain objects by their own enumerable keys — guarding\n * against cycles and shared references with a pair map.\n */\nexport const structuralEqual = (left: unknown, right: unknown): boolean =>\n deepEqual(left, right, new WeakMap());\n\nconst deepEqual = (a: unknown, b: unknown, pairs: WeakMap<object, WeakSet<object>>): boolean => {\n if (Object.is(a, b)) {\n return true;\n }\n if (typeof a !== typeof b || a === null || b === null || typeof a !== \"object\") {\n // Different primitives (Object.is already ruled out equality) or type mismatch.\n return false;\n }\n\n if (a instanceof Date || b instanceof Date) {\n return a instanceof Date && b instanceof Date && a.getTime() === b.getTime();\n }\n\n const aObj = a as object;\n const bObj = b as object;\n\n // If we're already comparing this exact pair (a cycle, or a shared reference),\n // treat it as equal — the surrounding comparison decides the real outcome.\n const seenForA = pairs.get(aObj);\n if (seenForA?.has(bObj)) {\n return true;\n }\n if (seenForA) {\n seenForA.add(bObj);\n } else {\n pairs.set(aObj, new WeakSet([bObj]));\n }\n\n const aIsArray = Array.isArray(a);\n const bIsArray = Array.isArray(b);\n if (aIsArray !== bIsArray) {\n return false;\n }\n\n if (aIsArray && bIsArray) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i += 1) {\n if (!deepEqual(a[i], b[i], pairs)) {\n return false;\n }\n }\n return true;\n }\n\n const aRecord = a as Record<string, unknown>;\n const bRecord = b as Record<string, unknown>;\n const aKeys = Object.keys(aRecord);\n const bKeys = Object.keys(bRecord);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n for (const key of aKeys) {\n if (!Object.prototype.hasOwnProperty.call(bRecord, key)) {\n return false;\n }\n if (!deepEqual(aRecord[key], bRecord[key], pairs)) {\n return false;\n }\n }\n return true;\n};\n","import type { EventBus } from \"./interfaces.js\";\nimport type { RunEvent } from \"./types.js\";\n\nexport class InMemoryEventBus implements EventBus {\n private readonly subscribers = new Set<(event: RunEvent) => void>();\n\n public emit(event: RunEvent): void {\n for (const subscriber of this.subscribers) {\n subscriber(event);\n }\n }\n\n public subscribe(handler: (event: RunEvent) => void): () => void {\n this.subscribers.add(handler);\n return () => {\n this.subscribers.delete(handler);\n };\n }\n}\n","import type { NodeId } from \"@ailu-ai/graph-core\";\n\nexport type InterruptConfig = {\n before?: NodeId[];\n after?: NodeId[];\n};\n\nexport class DynamicInterrupt extends Error {\n public readonly reason: string;\n public readonly patch?: Record<string, unknown>;\n\n public constructor(reason: string, patch?: Record<string, unknown>) {\n super(reason);\n this.name = \"DynamicInterrupt\";\n this.reason = reason;\n this.patch = patch;\n }\n}\n\nexport const shouldInterruptBefore = (config: InterruptConfig | undefined, nodeId: NodeId): boolean =>\n config?.before?.includes(nodeId) ?? false;\n\nexport const shouldInterruptAfter = (config: InterruptConfig | undefined, nodeId: NodeId): boolean =>\n config?.after?.includes(nodeId) ?? false;\n","import type { RunId } from \"@ailu-ai/graph-core\";\n\nexport const createForkRunId = (runId: RunId): RunId =>\n `${String(runId)}:fork:${Date.now()}:${Math.random().toString(36).slice(2, 8)}` as RunId;\n","export class RecursionLimitError extends Error {\n public constructor(limit: number) {\n super(`Recursion limit exceeded (${limit}).`);\n this.name = \"RecursionLimitError\";\n }\n}\n","import type { ToolId, ToolRegistry } from \"../../agents-core/src/tools.js\";\nimport type { Message } from \"@ailu-ai/graph-core\";\n\nimport { DynamicInterrupt } from \"./interrupt.js\";\nimport type { NodeHandler } from \"./interfaces.js\";\n\ntype CreateToolNodeOptions = {\n parallel?: boolean;\n};\n\ntype ToolCallPayload = {\n id: string;\n name: string;\n input: unknown;\n};\n\ntype ToolExceptionPayload = {\n toolId: ToolId;\n originalError: unknown;\n};\n\nexport class ToolException extends Error {\n public readonly toolId: ToolId;\n public readonly originalError: unknown;\n\n public constructor(payload: ToolExceptionPayload) {\n const message =\n payload.originalError instanceof Error ? payload.originalError.message : \"Unknown tool error.\";\n super(message);\n this.name = \"ToolException\";\n this.toolId = payload.toolId;\n this.originalError = payload.originalError;\n }\n}\n\nconst now = (): Date => new Date();\n\nconst createToolMessage = (toolCallId: string, content: string): Message => ({\n id: `tool-msg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}` as Message[\"id\"],\n role: \"tool\",\n toolCallId,\n content,\n createdAt: now()\n});\n\nexport const createToolNode =\n (registry: ToolRegistry, options: CreateToolNodeOptions = {}): NodeHandler =>\n async (input) => {\n const channels = input as Record<string, unknown>;\n const messages = Array.isArray(channels.messages) ? (channels.messages as Message[]) : [];\n const lastAiMessage = [...messages].reverse().find((message) => message.role === \"ai\");\n const toolCalls = Array.isArray((lastAiMessage as { toolCalls?: unknown } | undefined)?.toolCalls)\n ? (((lastAiMessage as { toolCalls?: unknown }).toolCalls as ToolCallPayload[]) ?? [])\n : [];\n\n const executeOne = async (toolCall: ToolCallPayload): Promise<Message> => {\n const resolved = registry.resolve(toolCall.name as ToolId);\n if (resolved === undefined) {\n throw new ToolException({\n toolId: toolCall.name as ToolId,\n originalError: new Error(`Tool '${toolCall.name}' not found.`)\n });\n }\n const { definition, handler } = resolved;\n\n if (definition.requiresApproval) {\n throw new DynamicInterrupt(\"tool-approval-required\", {\n approvalRequests: [\n {\n toolId: definition.id,\n toolCallId: toolCall.id,\n reason: `Approval required for tool '${definition.name}'.`\n }\n ]\n });\n }\n\n const parsedInput = definition.inputSchema.parse(toolCall.input);\n const rawOutput = await handler(parsedInput);\n const parsedOutput = definition.outputSchema.parse(rawOutput);\n\n return createToolMessage(toolCall.id, JSON.stringify(parsedOutput));\n };\n\n try {\n const toolMessages = options.parallel\n ? await Promise.all(toolCalls.map((toolCall) => executeOne(toolCall)))\n : await toolCalls.reduce<Promise<Message[]>>(async (previous, toolCall) => {\n const acc = await previous;\n const next = await executeOne(toolCall);\n return [...acc, next];\n }, Promise.resolve([]));\n\n return { messages: toolMessages };\n } catch (error) {\n const toolError = error instanceof ToolException ? error : undefined;\n if (error instanceof DynamicInterrupt) {\n throw error;\n }\n const toolMessage = createToolMessage(\n toolError?.toolId ?? \"tool-error\",\n `Tool execution error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n return { messages: [toolMessage] };\n }\n };\n","import type { BaseStore } from \"./interfaces.js\";\nimport type { MemoryItem, MemoryKey, MemoryNamespace } from \"./types.js\";\n\nconst now = (): string => new Date().toISOString();\nconst nsToKey = (namespace: MemoryNamespace): string => namespace.join(\"|\");\n\nexport class InMemoryStore implements BaseStore {\n private readonly map = new Map<string, MemoryItem>();\n\n public async get(namespace: MemoryNamespace, key: MemoryKey): Promise<MemoryItem | undefined> {\n return this.map.get(`${nsToKey(namespace)}:${key}`);\n }\n\n public async put(namespace: MemoryNamespace, key: MemoryKey, value: unknown): Promise<MemoryItem> {\n const mapKey = `${nsToKey(namespace)}:${key}`;\n const existing = this.map.get(mapKey);\n const item: MemoryItem = {\n namespace,\n key,\n value,\n createdAt: existing?.createdAt ?? now(),\n updatedAt: now()\n };\n this.map.set(mapKey, item);\n return item;\n }\n\n public async delete(namespace: MemoryNamespace, key: MemoryKey): Promise<void> {\n this.map.delete(`${nsToKey(namespace)}:${key}`);\n }\n\n public async search(namespace: MemoryNamespace, query: string, topK: number): Promise<MemoryItem[]> {\n const q = query.toLowerCase();\n return [...this.map.values()]\n .filter((item) => nsToKey(item.namespace) === nsToKey(namespace))\n .filter((item) => JSON.stringify(item.value).toLowerCase().includes(q) || item.key.toLowerCase().includes(q))\n .slice(0, Math.max(0, topK));\n }\n\n public async list(namespace: MemoryNamespace, prefix?: string): Promise<MemoryItem[]> {\n return [...this.map.values()].filter(\n (item) =>\n nsToKey(item.namespace) === nsToKey(namespace) &&\n (prefix === undefined || item.key.startsWith(prefix))\n );\n }\n}\n","export type StepBudget = {\n maxSteps: number;\n currentSteps: number;\n};\n\nexport class StepBudgetExceededError extends Error {\n public readonly maxSteps: number;\n public readonly currentSteps: number;\n\n public constructor(budget: StepBudget) {\n super(`Step budget exceeded: ${budget.currentSteps}/${budget.maxSteps}.`);\n this.name = \"StepBudgetExceededError\";\n this.maxSteps = budget.maxSteps;\n this.currentSteps = budget.currentSteps;\n }\n}\n\nexport const checkBudget = (budget: StepBudget): void => {\n if (budget.currentSteps > budget.maxSteps) {\n throw new StepBudgetExceededError(budget);\n }\n};\n","import type { AgentId } from \"./types.js\";\n\nexport type SwarmHandoff = {\n type: \"swarm_handoff\";\n goto: AgentId;\n update: {\n reason: string;\n [key: string]: unknown;\n };\n};\n\nexport const createSwarmHandoff = (goto: AgentId, reason: string): SwarmHandoff => ({\n type: \"swarm_handoff\",\n goto,\n update: { reason }\n});\n\nexport const isSwarmHandoff = (value: unknown): value is SwarmHandoff => {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n const record = value as Record<string, unknown>;\n return record.type === \"swarm_handoff\" && typeof record.goto === \"string\";\n};\n","import type { CallbackHandler, CallbackManager } from \"./interfaces.js\";\nimport type { CallbackEvent } from \"./types.js\";\n\nexport class InMemoryCallbackManager implements CallbackManager {\n private readonly handlers = new Set<CallbackHandler>();\n\n public constructor(\n handlers: CallbackHandler[] = [],\n private readonly inheritedTags: string[] = [],\n private readonly inheritedMetadata: Record<string, unknown> = {}\n ) {\n for (const handler of handlers) {\n this.handlers.add(handler);\n }\n }\n\n public addHandler(handler: CallbackHandler): void {\n this.handlers.add(handler);\n }\n\n public removeHandler(handler: CallbackHandler): void {\n this.handlers.delete(handler);\n }\n\n public async emit(event: CallbackEvent): Promise<void> {\n const merged: CallbackEvent = {\n ...event,\n tags: [...this.inheritedTags, ...(event.tags ?? [])],\n metadata: {\n ...this.inheritedMetadata,\n ...(event.metadata ?? {})\n }\n };\n\n for (const handler of this.handlers) {\n try {\n const fn = handler[merged.type];\n if (typeof fn === \"function\") {\n await fn(merged as never);\n }\n } catch {\n // swallow callback errors by design\n }\n }\n }\n\n public createChild(tags: string[] = [], metadata: Record<string, unknown> = {}): CallbackManager {\n return new InMemoryCallbackManager(\n [...this.handlers],\n [...this.inheritedTags, ...tags],\n { ...this.inheritedMetadata, ...metadata }\n );\n }\n}\n","import type {\n ChannelDefinition,\n ChannelsSchema,\n Command,\n FailureCategory,\n GraphId,\n EdgeDefinition,\n GraphDefinition,\n GraphState,\n NodeDefinition,\n NodeId,\n RunId\n} from \"@ailu-ai/graph-core\";\n\n/** Mirrors `@ailu-ai/graph-core`'s `FAILURE_CATEGORIES` runtime array. Duplicated rather than\n * value-imported: every other `@ailu-ai/graph-core` import in this file is TYPE-ONLY (erased\n * at build time), so this stays the sole runtime dependency-free of graph-core's actual module —\n * the same \"duplicated structurally, dependency-free\" posture `graph-sdk` already uses for its\n * own `@ailu-ai/contracts` carrier types. */\nconst FAILURE_CATEGORY_VALUES: readonly FailureCategory[] = [\"transient\", \"permanent\", \"unknown\"];\n\nimport type { Checkpointer, ConditionRegistry, EventBus, NodeRegistry } from \"./interfaces.js\";\nimport { InMemoryStore } from \"../../memory-store/src/in-memory-store.js\";\nimport type { BaseStore } from \"../../memory-store/src/interfaces.js\";\nimport { checkBudget, type StepBudget } from \"../../agents-core/src/step-budget.js\";\nimport { isSwarmHandoff } from \"../../agents-core/src/swarm.js\";\nimport { InMemoryCallbackManager } from \"../../callbacks/src/manager.js\";\nimport type { CallbackManager } from \"../../callbacks/src/interfaces.js\";\nimport {\n DynamicInterrupt,\n type InterruptConfig,\n shouldInterruptAfter,\n shouldInterruptBefore\n} from \"./interrupt.js\";\nimport type { StreamEvent, StreamMode } from \"./stream.js\";\nimport { createForkRunId } from \"./time-travel.js\";\nimport { RecursionLimitError } from \"./cycles.js\";\nimport { structuralEqual } from \"./equality.js\";\nimport type { Checkpoint, CheckpointId } from \"./types.js\";\n\ntype GraphRuntimeDeps = {\n graph: GraphDefinition<ChannelsSchema>;\n nodeRegistry: NodeRegistry;\n conditionRegistry: ConditionRegistry;\n checkpointer: Checkpointer;\n eventBus: EventBus;\n callbackManager?: CallbackManager;\n memory?: BaseStore;\n stepBudget?: StepBudget;\n subgraphResolver?: (graphId: GraphId) => GraphDefinition | undefined;\n interruptConfig?: InterruptConfig;\n};\n\nconst nowIso = (): string => new Date().toISOString();\n\n/** ADR 0076 — duck-typed classification: a thrower (e.g. `llm-gateway` on a provider 429) can set\n * `failureCategory` on the error it throws; anything else classifies as `\"unknown\"`. Never throws. */\nconst classifyFailure = (error: unknown): FailureCategory => {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"failureCategory\" in error &&\n typeof (error as { failureCategory?: unknown }).failureCategory === \"string\" &&\n (FAILURE_CATEGORY_VALUES as readonly string[]).includes(\n (error as { failureCategory: string }).failureCategory\n )\n ) {\n return (error as { failureCategory: FailureCategory }).failureCategory;\n }\n return \"unknown\";\n};\n\nconst toCheckpointId = (value: string): CheckpointId => value as CheckpointId;\n\nconst createCheckpoint = (runId: RunId, graphState: GraphState): Checkpoint => ({\n id: toCheckpointId(`${String(runId)}:${Date.now()}:${Math.random().toString(36).slice(2, 8)}`),\n runId,\n graphState,\n createdAt: nowIso()\n});\n\nconst SUBGRAPH_RUNS_KEY = \"__subgraphRuns\";\nconst INTERRUPT_META_KEY = \"__interruptMeta\";\n\nexport class GraphRuntime {\n private readonly graph: GraphDefinition<ChannelsSchema>;\n private readonly nodeRegistry: NodeRegistry;\n private readonly conditionRegistry: ConditionRegistry;\n private readonly checkpointer: Checkpointer;\n private readonly eventBus: EventBus;\n private readonly callbackManager: CallbackManager;\n public readonly memory: BaseStore;\n public readonly stepBudget: StepBudget;\n private readonly nodeById: Map<NodeId, NodeDefinition>;\n private readonly subgraphResolver?: (graphId: GraphId) => GraphDefinition | undefined;\n private readonly interruptConfig?: InterruptConfig;\n private readonly stateHistoryByRunId = new Map<RunId, GraphState<ChannelsSchema>[]>();\n private readonly stepsByRunId = new Map<RunId, number>();\n private readonly inboxByRunId = new Map<RunId, Map<NodeId, unknown[]>>();\n\n public constructor(deps: GraphRuntimeDeps) {\n this.graph = deps.graph;\n this.nodeRegistry = deps.nodeRegistry;\n this.conditionRegistry = deps.conditionRegistry;\n this.checkpointer = deps.checkpointer;\n this.eventBus = deps.eventBus;\n this.callbackManager = deps.callbackManager ?? new InMemoryCallbackManager();\n this.memory = deps.memory ?? new InMemoryStore();\n this.stepBudget = deps.stepBudget ?? { maxSteps: Number.MAX_SAFE_INTEGER, currentSteps: 0 };\n this.subgraphResolver = deps.subgraphResolver;\n this.interruptConfig = deps.interruptConfig;\n this.nodeById = new Map(this.graph.nodes.map((node) => [node.id, node]));\n }\n\n public async start(runId: RunId, initialData: Record<string, unknown>): Promise<GraphState> {\n const timestamp = nowIso();\n const initialChannels = this.buildInitialChannels(initialData);\n let state: GraphState = {\n runId,\n graphId: this.graph.id,\n currentNodeId: this.graph.entryNodeId,\n status: \"running\",\n channels: initialChannels,\n version: 0,\n createdAt: timestamp,\n updatedAt: timestamp\n };\n\n state = await this.persistCheckpoint(state);\n await this.callbackManager.emit({\n type: \"onChainStart\",\n runId: String(runId),\n timestamp: nowIso(),\n input: initialData\n });\n return this.runLoop(state, false);\n }\n\n public async *stream(\n runId: RunId,\n initialData: Record<string, unknown>,\n mode: StreamMode\n ): AsyncIterable<StreamEvent> {\n const timestamp = nowIso();\n const initialChannels = this.buildInitialChannels(initialData);\n let state: GraphState = {\n runId,\n graphId: this.graph.id,\n currentNodeId: this.graph.entryNodeId,\n status: \"running\",\n channels: initialChannels,\n version: 0,\n createdAt: timestamp,\n updatedAt: timestamp\n };\n\n state = await this.persistCheckpoint(state);\n\n while (state.status === \"running\") {\n const nodeId = state.currentNodeId;\n const beforeChannels = { ...(state.channels as Record<string, unknown>) };\n const beforeCheckpointId = state.checkpointId;\n\n state = await this.executeNode(nodeId, state);\n\n const afterChannels = state.channels as Record<string, unknown>;\n const delta = this.computeDelta(beforeChannels, afterChannels);\n\n if (mode === \"values\") {\n yield { type: \"state_value\", state };\n continue;\n }\n\n if (mode === \"updates\") {\n yield { type: \"state_update\", delta, nodeId };\n continue;\n }\n\n if (mode === \"messages\") {\n for (const event of this.extractMessageEvents(nodeId, delta)) {\n yield event;\n }\n continue;\n }\n\n if (mode === \"debug\") {\n yield {\n type: \"debug\",\n nodeId,\n payload: {\n stage: \"node_started\",\n nodeId,\n input: beforeChannels\n }\n };\n yield {\n type: \"debug\",\n nodeId,\n payload: {\n stage: \"node_completed\",\n nodeId,\n output: delta\n }\n };\n yield {\n type: \"debug\",\n nodeId,\n payload: {\n stage: \"state\",\n state\n }\n };\n yield {\n type: \"debug\",\n nodeId,\n payload: {\n stage: \"checkpoint\",\n previousCheckpointId: beforeCheckpointId,\n checkpointId: state.checkpointId\n }\n };\n\n for (const toolCallEvent of this.extractToolCallEvents(nodeId, delta)) {\n yield toolCallEvent;\n }\n }\n }\n }\n\n public async resume(runId: RunId): Promise<GraphState> {\n const checkpoint = await this.checkpointer.load(runId);\n if (checkpoint === undefined) {\n throw new Error(`No checkpoint found for run '${String(runId)}'.`);\n }\n\n const suspendedNode = this.nodeById.get(checkpoint.graphState.currentNodeId);\n const interruptMeta = this.readInterruptMeta(checkpoint.graphState.channels as Record<string, unknown>);\n const shouldAdvanceFromSuspended =\n suspendedNode?.type === \"human-gate\" || interruptMeta?.when === \"after\";\n const nextNodeId =\n checkpoint.graphState.status === \"suspended\" && shouldAdvanceFromSuspended\n ? this.nextNode(checkpoint.graphState.currentNodeId, checkpoint.graphState)\n : checkpoint.graphState.currentNodeId;\n\n const resumedState: GraphState = {\n ...checkpoint.graphState,\n currentNodeId: (nextNodeId ?? checkpoint.graphState.currentNodeId) as NodeId,\n status: nextNodeId === null ? \"completed\" : \"running\",\n updatedAt: nowIso()\n };\n\n this.eventBus.emit({\n type: \"run_resumed\",\n runId,\n nodeId: resumedState.currentNodeId,\n timestamp: nowIso()\n });\n\n const persistedState = await this.persistCheckpoint(resumedState);\n return this.runLoop(persistedState, true);\n }\n\n public async executeNode(nodeId: NodeId, state: GraphState): Promise<GraphState> {\n const node = this.nodeById.get(nodeId);\n if (node === undefined) {\n throw new Error(`Node '${String(nodeId)}' is not declared in graph.`);\n }\n\n if (shouldInterruptBefore(this.interruptConfig, nodeId)) {\n return this.suspendRun(state, nodeId, \"interrupt-before\", \"before\");\n }\n\n this.consumeStepBudget();\n this.assertRecursionLimit(state.runId);\n\n this.eventBus.emit({\n type: \"node_started\",\n runId: state.runId,\n nodeId,\n timestamp: nowIso()\n });\n\n if (node.type === \"human-gate\") {\n return this.suspendRun(state, nodeId, \"human-gate\", \"after\");\n }\n\n if (node.type === \"subgraph\") {\n if (node.subgraphId === undefined || this.subgraphResolver === undefined) {\n throw new Error(`Subgraph node '${String(nodeId)}' cannot resolve subgraph.`);\n }\n const childGraph = this.subgraphResolver(node.subgraphId);\n if (childGraph === undefined) {\n throw new Error(`Subgraph '${String(node.subgraphId)}' not found.`);\n }\n\n const childRunId = this.getOrCreateSubgraphRunId(state, nodeId);\n const childRuntime = new GraphRuntime({\n graph: childGraph,\n nodeRegistry: this.nodeRegistry,\n conditionRegistry: this.conditionRegistry,\n checkpointer: this.checkpointer,\n eventBus: this.eventBus,\n callbackManager: this.callbackManager.createChild([\"subgraph\"], { parentNodeId: String(nodeId) }),\n memory: this.memory,\n stepBudget: this.stepBudget,\n subgraphResolver: this.subgraphResolver\n });\n\n const childInitialData = this.applyInputMapping(state.channels, node.inputMapping);\n const existingChildCheckpoint = await this.checkpointer.load(childRunId);\n const childState =\n existingChildCheckpoint === undefined\n ? await childRuntime.start(childRunId, childInitialData)\n : await childRuntime.resume(childRunId);\n\n if (childState.status === \"failed\") {\n throw new Error(`Subgraph '${String(node.subgraphId)}' failed.`);\n }\n\n if (childState.status === \"suspended\") {\n const channels = this.setSubgraphRunId(state.channels, nodeId, childRunId);\n return this.suspendRun(\n { ...state, channels, version: state.version + 1 },\n nodeId,\n \"human-gate\",\n \"during\"\n );\n }\n\n const mergedData = this.applyOutputMapping(\n this.setSubgraphRunId(state.channels, nodeId, childRunId),\n childState.channels,\n node.outputMapping\n );\n this.eventBus.emit({\n type: \"node_completed\",\n runId: state.runId,\n nodeId,\n output: childState.channels,\n timestamp: nowIso()\n });\n await this.callbackManager.emit({\n type: \"onNodeEnd\",\n runId: String(state.runId),\n nodeId: String(nodeId),\n timestamp: nowIso(),\n output: childState.channels\n });\n\n const nextNodeId = this.nextNode(nodeId, { ...state, channels: mergedData });\n const nextState: GraphState = {\n ...state,\n currentNodeId: (nextNodeId ?? nodeId) as NodeId,\n channels: mergedData,\n version: state.version + 1,\n status: nextNodeId === null ? \"completed\" : \"running\",\n updatedAt: nowIso()\n };\n\n return this.persistCheckpoint(nextState);\n }\n\n const handler = this.nodeRegistry.resolve(nodeId);\n if (handler === undefined) {\n throw new Error(`No node handler registered for '${String(nodeId)}'.`);\n }\n\n const retryPolicy = node.retryPolicy;\n const maxAttempts = retryPolicy?.maxAttempts ?? 1;\n const backoffMs = retryPolicy?.backoffMs ?? 0;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n try {\n const injected = this.consumeInjectedInput(state.runId, nodeId);\n const output = await handler(injected ?? state.channels, state, { memory: this.memory });\n this.eventBus.emit({\n type: \"node_completed\",\n runId: state.runId,\n nodeId,\n output,\n timestamp: nowIso()\n });\n await this.callbackManager.emit({\n type: \"onNodeEnd\",\n runId: String(state.runId),\n nodeId: String(nodeId),\n timestamp: nowIso(),\n output\n });\n\n const { goto, update } = this.resolveCommand(output as Partial<Record<string, unknown>> | Command);\n const mergedData = this.applyUpdate(state.channels, update);\n const sanitizedData =\n node.type === \"agent\"\n ? (() => {\n const next = { ...mergedData };\n delete next.__scratchpad;\n return next;\n })()\n : mergedData;\n\n const nextNodeId = this.resolveNextNode(nodeId, goto, { ...state, channels: sanitizedData });\n const nextState: GraphState = {\n ...state,\n currentNodeId: (nextNodeId ?? nodeId) as NodeId,\n channels: sanitizedData,\n version: state.version + 1,\n status: nextNodeId === null ? \"completed\" : \"running\",\n updatedAt: nowIso()\n };\n\n if (node.fanOut !== undefined) {\n return this.executeFanOut(nodeId, node.fanOut.parallelTo, node.fanOut.joinAt, nextState);\n }\n\n if (shouldInterruptAfter(this.interruptConfig, nodeId)) {\n return this.suspendRun(nextState, nodeId, \"interrupt-after\", \"after\");\n }\n\n return this.persistCheckpoint(nextState);\n } catch (error) {\n if (error instanceof DynamicInterrupt) {\n const patchedState =\n error.patch === undefined\n ? state\n : {\n ...state,\n channels: this.applyUpdate(state.channels as Record<string, unknown>, error.patch),\n version: state.version + 1\n };\n return this.suspendRun(patchedState, nodeId, error.reason, \"during\");\n }\n const message = error instanceof Error ? error.message : \"Unknown node error.\";\n const category = classifyFailure(error);\n this.eventBus.emit({\n type: \"node_failed\",\n runId: state.runId,\n nodeId,\n error: message,\n attempt,\n category,\n timestamp: nowIso()\n });\n await this.callbackManager.emit({\n type: \"onNodeError\",\n runId: String(state.runId),\n nodeId: String(nodeId),\n timestamp: nowIso(),\n error: message\n });\n\n if (attempt >= maxAttempts) {\n // ADR 0076: retries are exhausted. A node with a declared `\"error\"` outgoing edge\n // reroutes there (a real, auditable branch) instead of failing the whole run — absent\n // one, behavior is UNCHANGED from before this feature existed (rethrow, run fails).\n const errorEdge = this.findErrorEdge(nodeId);\n if (errorEdge !== undefined) {\n const routedChannels = {\n ...state.channels,\n __lastError: { nodeId: String(nodeId), message, category, attempt }\n };\n const routedState: GraphState = {\n ...state,\n currentNodeId: errorEdge.to,\n channels: routedChannels,\n version: state.version + 1,\n status: \"running\",\n updatedAt: nowIso()\n };\n this.eventBus.emit({\n type: \"node_error_routed\",\n runId: state.runId,\n nodeId,\n errorEdgeId: errorEdge.id,\n toNodeId: errorEdge.to,\n category,\n error: message,\n timestamp: nowIso()\n });\n return this.persistCheckpoint(routedState);\n }\n throw error;\n }\n\n if (backoffMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, backoffMs));\n }\n }\n }\n\n throw new Error(\"Node execution failed after retry attempts.\");\n }\n\n public nextNode(currentNodeId: NodeId, state: GraphState): NodeId | null {\n const outgoingEdges = this.graph.edges.filter((edge) => edge.from === currentNodeId);\n if (outgoingEdges.length === 0) {\n return null;\n }\n\n const selectedEdge = this.selectNextEdge(outgoingEdges, state);\n return selectedEdge?.to ?? null;\n }\n\n public async send(runId: RunId, nodeId: NodeId, input: unknown): Promise<void> {\n const queueByNode = this.inboxByRunId.get(runId) ?? new Map<NodeId, unknown[]>();\n const queue = queueByNode.get(nodeId) ?? [];\n queueByNode.set(nodeId, [...queue, input]);\n this.inboxByRunId.set(runId, queueByNode);\n }\n\n /** ADR 0076 — at most one `\"error\"` edge per node is enforced at validation time\n * (`GRAPH_VALIDATION_ERROR_CODES.MULTIPLE_ERROR_EDGES`), so the first match is unambiguous. */\n private findErrorEdge(nodeId: NodeId): EdgeDefinition | undefined {\n return this.graph.edges.find((edge) => edge.from === nodeId && edge.type === \"error\");\n }\n\n private selectNextEdge(edges: EdgeDefinition[], state: GraphState): EdgeDefinition | undefined {\n const conditionalEdges = edges.filter((edge) => edge.type === \"conditional\");\n for (const edge of conditionalEdges) {\n if (edge.condition === undefined) {\n continue;\n }\n const conditionFn = this.conditionRegistry.resolve(edge.condition);\n if (conditionFn?.(state) === true) {\n return edge;\n }\n }\n\n return edges.find((edge) => edge.type === \"default\");\n }\n\n private async runLoop(state: GraphState, resumed: boolean): Promise<GraphState> {\n let currentState = state;\n while (currentState.status === \"running\") {\n try {\n currentState = await this.executeNode(currentState.currentNodeId, currentState);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown runtime error.\";\n const failedState: GraphState = {\n ...currentState,\n status: \"failed\",\n updatedAt: nowIso()\n };\n currentState = await this.persistCheckpoint(failedState);\n this.eventBus.emit({\n type: \"run_failed\",\n runId: currentState.runId,\n error: message,\n timestamp: nowIso()\n });\n await this.callbackManager.emit({\n type: \"onChainError\",\n runId: String(currentState.runId),\n timestamp: nowIso(),\n error: message\n });\n return currentState;\n }\n }\n\n if (currentState.status === \"completed\") {\n this.eventBus.emit({\n type: \"run_completed\",\n runId: currentState.runId,\n finalState: currentState,\n timestamp: nowIso()\n });\n await this.callbackManager.emit({\n type: \"onChainEnd\",\n runId: String(currentState.runId),\n timestamp: nowIso(),\n output: currentState\n });\n }\n\n // resumed flag intentionally kept for future extension hooks.\n void resumed;\n\n return currentState;\n }\n\n private async persistCheckpoint(state: GraphState): Promise<GraphState> {\n const checkpoint = createCheckpoint(state.runId, state);\n await this.checkpointer.save(checkpoint);\n\n const persisted = {\n ...state,\n checkpointId: checkpoint.id,\n updatedAt: nowIso()\n };\n const history = this.stateHistoryByRunId.get(state.runId) ?? [];\n this.stateHistoryByRunId.set(state.runId, [...history, persisted]);\n return persisted;\n }\n\n public getHistory(runId: RunId): GraphState<ChannelsSchema>[] {\n return [...(this.stateHistoryByRunId.get(runId) ?? [])];\n }\n\n public async updateState(\n runId: RunId,\n patch: Partial<Record<string, unknown>>,\n resumeFrom?: NodeId\n ): Promise<GraphState> {\n const checkpoint = await this.checkpointer.load(runId);\n if (checkpoint === undefined) {\n throw new Error(`No checkpoint found for run '${String(runId)}'.`);\n }\n\n const nextChannels = this.applyUpdate(checkpoint.graphState.channels as Record<string, unknown>, patch);\n const nextState: GraphState = {\n ...checkpoint.graphState,\n channels: this.clearInterruptMeta(nextChannels),\n currentNodeId: (resumeFrom ?? checkpoint.graphState.currentNodeId) as NodeId,\n status: \"running\",\n version: checkpoint.graphState.version + 1,\n updatedAt: nowIso()\n };\n\n return this.persistCheckpoint(nextState);\n }\n\n public async getCheckpoints(runId: RunId): Promise<Checkpoint[]> {\n return this.checkpointer.list(runId);\n }\n\n public async replayFrom(runId: RunId, checkpointId: CheckpointId): Promise<GraphState> {\n const checkpoint = await this.checkpointer.loadById(checkpointId);\n if (checkpoint === undefined || checkpoint.runId !== runId) {\n throw new Error(`Checkpoint '${String(checkpointId)}' not found for run '${String(runId)}'.`);\n }\n\n const forkRunId = createForkRunId(runId);\n const forkedState: GraphState = {\n ...checkpoint.graphState,\n runId: forkRunId,\n status: \"running\",\n checkpointId: undefined,\n updatedAt: nowIso()\n };\n const persisted = await this.persistCheckpoint(forkedState);\n return this.runLoop(persisted, false);\n }\n\n public applyUpdate(\n channels: Record<string, unknown>,\n partialUpdate: Partial<Record<string, unknown>>\n ): Record<string, unknown> {\n const nextChannels = { ...channels };\n for (const [channelName, deltaValue] of Object.entries(partialUpdate)) {\n const definition = this.graph.channels[channelName] as ChannelDefinition<unknown> | undefined;\n const reducer = definition?.reducer ?? \"replace\";\n const currentValue = nextChannels[channelName];\n\n if (reducer === \"replace\") {\n nextChannels[channelName] = deltaValue;\n continue;\n }\n\n if (reducer === \"append\") {\n if (Array.isArray(currentValue) && Array.isArray(deltaValue)) {\n nextChannels[channelName] = [...currentValue, ...deltaValue];\n } else {\n nextChannels[channelName] = deltaValue;\n }\n continue;\n }\n\n if (\n reducer === \"merge\" &&\n currentValue !== null &&\n typeof currentValue === \"object\" &&\n deltaValue !== null &&\n typeof deltaValue === \"object\" &&\n !Array.isArray(currentValue) &&\n !Array.isArray(deltaValue)\n ) {\n nextChannels[channelName] = {\n ...(currentValue as Record<string, unknown>),\n ...(deltaValue as Record<string, unknown>)\n };\n } else {\n nextChannels[channelName] = deltaValue;\n }\n }\n\n return nextChannels;\n }\n\n private buildInitialChannels(initialData: Record<string, unknown>): Record<string, unknown> {\n const channels: Record<string, unknown> = {};\n for (const [name, definition] of Object.entries(this.graph.channels)) {\n channels[name] = name in initialData ? initialData[name] : definition.default;\n }\n for (const [name, value] of Object.entries(initialData)) {\n if (!(name in channels)) {\n channels[name] = value;\n }\n }\n return channels;\n }\n\n private applyInputMapping(\n parentData: Record<string, unknown>,\n inputMapping: Record<string, string> | undefined\n ): Record<string, unknown> {\n if (inputMapping === undefined) {\n return { ...parentData };\n }\n\n const mapped: Record<string, unknown> = {};\n for (const [childKey, parentKey] of Object.entries(inputMapping)) {\n mapped[childKey] = parentData[parentKey];\n }\n return mapped;\n }\n\n private applyOutputMapping(\n parentData: Record<string, unknown>,\n childData: Record<string, unknown>,\n outputMapping: Record<string, string> | undefined\n ): Record<string, unknown> {\n if (outputMapping === undefined) {\n return { ...parentData, ...childData };\n }\n\n const merged = { ...parentData };\n for (const [parentKey, childKey] of Object.entries(outputMapping)) {\n merged[parentKey] = childData[childKey];\n }\n return merged;\n }\n\n private setSubgraphRunId(\n data: Record<string, unknown>,\n nodeId: NodeId,\n childRunId: RunId\n ): Record<string, unknown> {\n const currentMap =\n data[SUBGRAPH_RUNS_KEY] !== null && typeof data[SUBGRAPH_RUNS_KEY] === \"object\"\n ? (data[SUBGRAPH_RUNS_KEY] as Record<string, string>)\n : {};\n\n return {\n ...data,\n [SUBGRAPH_RUNS_KEY]: {\n ...currentMap,\n [String(nodeId)]: String(childRunId)\n }\n };\n }\n\n private getOrCreateSubgraphRunId(state: GraphState, nodeId: NodeId): RunId {\n const maybeMap = (state.channels as Record<string, unknown>)[SUBGRAPH_RUNS_KEY];\n if (maybeMap !== null && typeof maybeMap === \"object\") {\n const existing = (maybeMap as Record<string, string>)[String(nodeId)];\n if (typeof existing === \"string\") {\n return existing as RunId;\n }\n }\n return `${String(state.runId)}:${String(nodeId)}` as RunId;\n }\n\n private readInterruptMeta(channels: Record<string, unknown>): { when: \"before\" | \"after\" | \"during\" } | undefined {\n const raw = channels[INTERRUPT_META_KEY];\n if (raw !== null && typeof raw === \"object\") {\n const when = (raw as Record<string, unknown>).when;\n if (when === \"before\" || when === \"after\" || when === \"during\") {\n return { when };\n }\n }\n return undefined;\n }\n\n private clearInterruptMeta(channels: Record<string, unknown>): Record<string, unknown> {\n const next = { ...channels };\n delete next[INTERRUPT_META_KEY];\n return next;\n }\n\n private async suspendRun(\n state: GraphState,\n nodeId: NodeId,\n reason: string,\n when: \"before\" | \"after\" | \"during\"\n ): Promise<GraphState> {\n const suspendedState: GraphState = {\n ...state,\n currentNodeId: nodeId,\n status: \"suspended\",\n channels: {\n ...(state.channels as Record<string, unknown>),\n [INTERRUPT_META_KEY]: { when, reason }\n },\n updatedAt: nowIso()\n };\n const persisted = await this.persistCheckpoint(suspendedState);\n this.eventBus.emit({\n type: \"run_suspended\",\n runId: state.runId,\n nodeId,\n reason,\n timestamp: nowIso()\n });\n return persisted;\n }\n\n private computeDelta(\n previousChannels: Record<string, unknown>,\n nextChannels: Record<string, unknown>\n ): Record<string, unknown> {\n const delta: Record<string, unknown> = {};\n const keys = new Set<string>([...Object.keys(previousChannels), ...Object.keys(nextChannels)]);\n for (const key of keys) {\n if (!this.areEqual(previousChannels[key], nextChannels[key])) {\n delta[key] = nextChannels[key];\n }\n }\n return delta;\n }\n\n private areEqual(left: unknown, right: unknown): boolean {\n return structuralEqual(left, right);\n }\n\n private assertRecursionLimit(runId: RunId): void {\n const current = this.stepsByRunId.get(runId) ?? 0;\n const next = current + 1;\n this.stepsByRunId.set(runId, next);\n const recursionLimit = this.graph.recursionLimit ?? 25;\n if (next > recursionLimit) {\n throw new RecursionLimitError(recursionLimit);\n }\n }\n\n private consumeStepBudget(): void {\n this.stepBudget.currentSteps += 1;\n checkBudget(this.stepBudget);\n }\n\n private consumeInjectedInput(runId: RunId, nodeId: NodeId): unknown | undefined {\n const queueByNode = this.inboxByRunId.get(runId);\n if (queueByNode === undefined) {\n return undefined;\n }\n const queue = queueByNode.get(nodeId);\n if (queue === undefined || queue.length === 0) {\n return undefined;\n }\n const [first, ...rest] = queue;\n queueByNode.set(nodeId, rest);\n return first;\n }\n\n private resolveCommand(\n output: Partial<Record<string, unknown>> | Command\n ): { goto?: NodeId | NodeId[]; update: Partial<Record<string, unknown>> } {\n if (isSwarmHandoff(output)) {\n return {\n goto: output.goto as unknown as NodeId,\n update: output.update as Partial<Record<string, unknown>>\n };\n }\n if (output !== null && typeof output === \"object\" && \"goto\" in output) {\n const cmd = output as Command;\n return {\n goto: cmd.goto,\n update: (cmd.update ?? {}) as Partial<Record<string, unknown>>\n };\n }\n return {\n update: (output ?? {}) as Partial<Record<string, unknown>>\n };\n }\n\n private resolveNextNode(\n currentNodeId: NodeId,\n goto: NodeId | NodeId[] | undefined,\n state: GraphState\n ): NodeId | null {\n if (goto === undefined) {\n return this.nextNode(currentNodeId, state);\n }\n if (Array.isArray(goto)) {\n return goto[0] ?? null;\n }\n return goto;\n }\n\n private async executeFanOut(\n fromNodeId: NodeId,\n parallelTo: NodeId[],\n joinAt: NodeId,\n baseState: GraphState\n ): Promise<GraphState> {\n const runId = baseState.runId;\n const nodeStates = await Promise.all(\n parallelTo.map(async (nodeId) => {\n const handler = this.nodeRegistry.resolve(nodeId);\n if (handler === undefined) {\n return {};\n }\n const output = await handler(baseState.channels, baseState, { memory: this.memory });\n const { update } = this.resolveCommand(output as Partial<Record<string, unknown>> | Command);\n return update;\n })\n );\n let channels = baseState.channels as Record<string, unknown>;\n for (const update of nodeStates) {\n channels = this.applyUpdate(channels, update);\n }\n const nextState: GraphState = {\n ...baseState,\n runId,\n currentNodeId: joinAt,\n channels,\n version: baseState.version + 1,\n status: \"running\",\n updatedAt: nowIso()\n };\n this.eventBus.emit({\n type: \"node_completed\",\n runId,\n nodeId: fromNodeId,\n output: nodeStates,\n timestamp: nowIso()\n });\n return this.persistCheckpoint(nextState);\n }\n\n private extractMessageEvents(nodeId: NodeId, delta: Record<string, unknown>): StreamEvent[] {\n const events: StreamEvent[] = [];\n for (const value of Object.values(delta)) {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const record = value as Record<string, unknown>;\n const kind = typeof record.type === \"string\" ? record.type.toLowerCase() : \"\";\n const messageText =\n typeof record.delta === \"string\"\n ? record.delta\n : typeof record.content === \"string\"\n ? record.content\n : undefined;\n if ((kind === \"aimessage\" || kind === \"humanmessage\" || kind === \"toolmessage\") && messageText) {\n events.push({\n type: \"message_delta\",\n delta: messageText,\n nodeId,\n messageId:\n typeof record.messageId === \"string\"\n ? record.messageId\n : `${String(nodeId)}:${Math.random().toString(36).slice(2, 8)}`\n });\n }\n }\n }\n return events;\n }\n\n private extractToolCallEvents(nodeId: NodeId, delta: Record<string, unknown>): StreamEvent[] {\n const events: StreamEvent[] = [];\n for (const value of Object.values(delta)) {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const record = value as Record<string, unknown>;\n if (typeof record.toolId === \"string\") {\n events.push({\n type: \"tool_call\",\n nodeId,\n toolId: record.toolId,\n input: record.input\n });\n }\n }\n }\n return events;\n }\n}\n","import type { GraphValidationError } from \"@ailu-ai/graph-core\";\n\n/**\n * Discriminated-union result type used across the SDK's \"safe\" entry points\n * (e.g. {@link GraphBuilder.safeCompile}). Mirrors Zod's `safeParse` ergonomics.\n */\nexport type Result<T, E> = { success: true; data: T } | { success: false; error: E };\n\n/** The \"teach\" metadata every Ailu error carries (ADR: errors-that-teach) — a stable\n * machine-readable `code`, a one-line `hint` (the fix), and a deep `docUrl`. An AI agent or a\n * human reads these to self-correct without leaving the stack trace. */\nexport type ErrorTeach = { code: string; hint?: string; docUrl?: string };\n\n/** Where the error-code catalog lives; each error deep-links to its own anchor. */\nconst ERROR_DOC_BASE =\n \"https://github.com/AI-Adriane/ailu-core/blob/main/docs-site/docs/reference/errors.md\";\n// GitHub heading anchors lowercase the text and keep underscores, so `AILU_FOO` → `#ailu_foo`.\nconst docFor = (code: string): string => `${ERROR_DOC_BASE}#${code.toLowerCase()}`;\n\n/** Base class for every error thrown by `@ailu-ai/graph-sdk`. Carries a stable `code`,\n * an actionable `hint`, and a `docUrl` — the `.message` stays exactly what was thrown\n * (so existing assertions hold); the teaching lives in the extra fields + {@link format}. */\nexport class AiluSdkError extends Error {\n public readonly code: string;\n public readonly hint?: string;\n public readonly docUrl: string;\n\n public constructor(message: string, teach: ErrorTeach) {\n super(message);\n this.name = \"AiluSdkError\";\n this.code = teach.code;\n this.hint = teach.hint;\n this.docUrl = teach.docUrl ?? docFor(teach.code);\n }\n\n /** Message + hint + doc link, for logs / CLI / an agent reading the failure to self-correct. */\n public format(): string {\n return [this.message, this.hint ? `→ ${this.hint}` : undefined, ` docs: ${this.docUrl}`]\n .filter((line): line is string => line !== undefined)\n .join(\"\\n\");\n }\n}\n\n/** Thrown when `.compile()` is called on a graph that fails validation. */\nexport class GraphCompileError extends AiluSdkError {\n public readonly errors: GraphValidationError[];\n\n public constructor(errors: GraphValidationError[]) {\n const summary = errors.map((error) => `${error.code}: ${error.message}`).join(\"; \");\n super(`Graph failed to compile: ${summary}`, {\n code: \"AILU_GRAPH_COMPILE\",\n hint: \"Fix the validation errors above — each carries its own code (e.g. a dangling edge, a missing entry node, an unknown channel).\"\n });\n this.name = \"GraphCompileError\";\n this.errors = errors;\n }\n}\n\n/** Thrown when two nodes are added under the same id. */\nexport class DuplicateNodeError extends AiluSdkError {\n public constructor(nodeId: string) {\n super(`A node with id '${nodeId}' was already added to this graph.`, {\n code: \"AILU_DUPLICATE_NODE\",\n hint: `Give the node a unique id, or remove the earlier '.node(\"${nodeId}\", …)'.`\n });\n this.name = \"DuplicateNodeError\";\n }\n}\n\n/** Thrown when an action node is added without an executable handler. */\nexport class MissingHandlerError extends AiluSdkError {\n public constructor(nodeId: string) {\n super(`Node '${nodeId}' is an action node but no handler was provided.`, {\n code: \"AILU_MISSING_HANDLER\",\n hint: `Pass a handler — '.node(\"${nodeId}\", async () => ({ … }))' — or use '.agentNode'/a component node instead.`\n });\n this.name = \"MissingHandlerError\";\n }\n}\n\n/** Thrown when a builder method references a node id that has not been added yet. */\nexport class UnknownNodeError extends AiluSdkError {\n public constructor(nodeId: string, context: string) {\n super(`${context} references node '${nodeId}', which has not been added to this graph.`, {\n code: \"AILU_UNKNOWN_NODE\",\n hint: `Add the node with '.node(\"${nodeId}\", …)' (or '.agentNode'/'.humanGate') BEFORE referencing it in an edge or condition.`\n });\n this.name = \"UnknownNodeError\";\n }\n}\n\n/**\n * Thrown when an agent's `middleware[]` names a GOVERNANCE kind (redact / approvalGate /\n * fsPolicy). The governed layer is engine-injected and sealed — a user may only append\n * EFFICIENCY middleware (compress / terse / contextBudget) — so an ungoverned stack is\n * unrepresentable (ADR 0025 phase 3d, the governed-by-construction invariant).\n */\nexport class GovernanceMiddlewareRejectedError extends AiluSdkError {\n public constructor(kind: string) {\n super(\n `Middleware kind '${kind}' is a governance middleware: it is engine-injected and cannot ` +\n `be supplied by a user. Agent middleware may only be efficiency kinds (compress, terse, contextBudget).`,\n {\n code: \"AILU_GOVERNANCE_MIDDLEWARE_REJECTED\",\n hint: \"Remove the governance kind from middleware[]; governance (redact/approvalGate/fsPolicy) is sealed and applied by the engine. Only compress/terse/contextBudget are user-supplied.\"\n }\n );\n this.name = \"GovernanceMiddlewareRejectedError\";\n }\n}\n\n/** Thrown when `resume`/`approve` is called but no suspended state exists for that run id on\n * this `CompiledGraph` instance (the Rust path keeps suspended state per-instance). */\nexport class ResumeStateNotFoundError extends AiluSdkError {\n public constructor(runId: string) {\n super(\n `No suspended state for run '${runId}'. On the Rust engine, resume/approve must follow a ` +\n \"suspended run on the same CompiledGraph instance.\",\n {\n code: \"AILU_NO_SUSPENDED_STATE\",\n hint: \"Call resume/approve on the SAME CompiledGraph that returned the suspended run, before the process restarts — or rehydrate the run from a persisted checkpoint (control plane).\"\n }\n );\n this.name = \"ResumeStateNotFoundError\";\n }\n}\n\n/** Thrown when `approveAndResume` is called without naming who approved (`resolvedBy`). */\nexport class ApproverRequiredError extends AiluSdkError {\n public constructor() {\n super(\"approveAndResume needs `resolvedBy`: the person who approved the tools.\", {\n code: \"AILU_APPROVER_REQUIRED\",\n hint: 'Pass the approver: approveAndResume(runId, { approvedTools, resolvedBy: \"alice@example.com\" }).'\n });\n this.name = \"ApproverRequiredError\";\n }\n}\n\n/**\n * Thrown by `resumeCatalogGraph` with an `approvalEngine` when the engine has not authorized the\n * resume: a request is still pending, a human gate was rejected, or a granted tool has no matching\n * approved request. `problems` lists each one; nothing ran.\n */\nexport class ApprovalNotGrantedError extends AiluSdkError {\n public readonly problems: string[];\n\n public constructor(runId: string, problems: string[]) {\n super(`Run '${runId}' can't resume yet: ${problems.join(\"; \")}.`, {\n code: \"AILU_APPROVAL_NOT_GRANTED\",\n hint: \"Resolve every request with approvalEngine.approve(id, approver) or reject(...), and grant only tools approved by that same approver.\"\n });\n this.name = \"ApprovalNotGrantedError\";\n this.problems = problems;\n }\n}\n","import type { GraphState } from \"@ailu-ai/graph-core\";\n\n/**\n * Durable-timer / external-signal helpers for node handlers (ADR 0009). A node handler\n * returns one of these to make the run SUSPEND after applying its channel update:\n * - {@link sleepUntil} — a durable timer: the run waits until an external scheduler\n * resumes it at `wakeAt` (the engine never sleeps — `wakeAt` is opaque data).\n * - {@link waitForSignal} — wait for a named external signal delivered via\n * {@link import(\"./compiled-graph.js\").CompiledGraph.signal}; optionally with a\n * timeout `wakeAt` (signal-or-timeout).\n *\n * Both are reserved-key markers the Rust engine recognises across the napi seam; they\n * run on the Rust engine (the production runtime), not the TypeScript dev fallback.\n */\n\n/** Reserved handler-return key requesting a durable-timer suspension. */\nexport const SLEEP_UNTIL_KEY = \"__sleepUntil\";\n/** Reserved handler-return key requesting a signal-wait suspension. */\nexport const WAIT_FOR_SIGNAL_KEY = \"__waitForSignal\";\n/** Channel key carrying the suspend reason + scheduler hints on a suspended run. */\nexport const SUSPEND_META_KEY = \"__suspend\";\n/** Channel key carrying delivered signal payloads, keyed by signal name. */\nexport const SIGNALS_KEY = \"__signals\";\n\n/** Why a run is suspended, with any timer / signal scheduler hints. */\nexport type SuspendMeta = {\n /** `\"human-gate\" | \"interrupt\" | \"timer\" | \"signal\"`. */\n reason: string;\n /** For a durable timer (or signal-or-timeout): when to resume. Opaque to the engine. */\n wakeAt?: string;\n /** For a signal wait: the signal name a `signal(...)` must deliver. */\n awaitingSignal?: string;\n};\n\n/**\n * Node-handler return: suspend as a **durable timer** until `wakeAt`, applying `update`\n * to the channels first. `wakeAt` is an opaque deadline (e.g. ISO-8601) — the engine\n * stores it and never reads a clock; the control-plane scheduler resumes the run then.\n * On resume the run advances past this node.\n */\nexport const sleepUntil = (\n wakeAt: string,\n update: Record<string, unknown> = {}\n): Record<string, unknown> => ({ ...update, [SLEEP_UNTIL_KEY]: wakeAt });\n\n/**\n * Node-handler return: suspend awaiting the external signal `name`, applying `update`\n * first. Deliver it with {@link import(\"./compiled-graph.js\").CompiledGraph.signal};\n * the payload lands in `__signals[name]`. Pass `wakeAt` for a signal-OR-timeout (the\n * run also wakes at `wakeAt` if the signal never arrives).\n */\nexport const waitForSignal = (\n name: string,\n options: { wakeAt?: string; update?: Record<string, unknown> } = {}\n): Record<string, unknown> => ({\n ...(options.update ?? {}),\n [WAIT_FOR_SIGNAL_KEY]: name,\n ...(options.wakeAt === undefined ? {} : { [SLEEP_UNTIL_KEY]: options.wakeAt })\n});\n\n/**\n * Read the suspend metadata off a (suspended) run state — the control-plane scheduler\n * uses `wakeAt` to know when to resume a timer and `awaitingSignal` to route a signal.\n * Returns `undefined` when the run is not suspended on a timer / signal.\n */\nexport const readSuspendMeta = (state: Pick<GraphState, \"channels\">): SuspendMeta | undefined => {\n const raw = (state.channels as Record<string, unknown>)[SUSPEND_META_KEY];\n if (raw !== null && typeof raw === \"object\" && typeof (raw as SuspendMeta).reason === \"string\") {\n return raw as SuspendMeta;\n }\n return undefined;\n};\n\n/** Read a delivered signal's payload from a run state's `__signals` channel. */\nexport const readSignal = (state: Pick<GraphState, \"channels\">, name: string): unknown => {\n const signals = (state.channels as Record<string, unknown>)[SIGNALS_KEY];\n return signals !== null && typeof signals === \"object\"\n ? (signals as Record<string, unknown>)[name]\n : undefined;\n};\n","import type { GraphState } from \"@ailu-ai/graph-core\";\nimport type { RunEvent } from \"@ailu-ai/graph-runtime\";\n\nimport { readSuspendMeta, SUSPEND_META_KEY, SIGNALS_KEY } from \"./durable.js\";\n\n/**\n * A structured, machine-readable account of where a run stands (ADR errors-that-teach / AI-DX):\n * what state it's in, why it suspended, what it's waiting for, what failed. An AI agent or a\n * human reads this to decide the next move — resume, deliver a signal, fix an input — without\n * trawling the raw event log. Channel **names** only (never values) so it never leaks payloads.\n */\nexport type RunExplanation = {\n runId: string;\n status: string;\n currentNode: string;\n /** One-line, human/agent-readable summary of the situation + the next action. */\n summary: string;\n /** Present when suspended: why, on which node, and what unblocks it. */\n suspended?: {\n reason: string;\n node: string;\n awaitingSignal?: string;\n wakeAt?: string;\n /** The concrete next action to resume. */\n nextAction: string;\n };\n /** Present when the run (or a node) failed. */\n failure?: { node?: string; error: string };\n /** The channel names present (not their values). */\n channels: string[];\n /** The last few lifecycle events, type + node only (when an event log is provided). */\n recentEvents?: { type: string; node?: string }[];\n};\n\nconst RESERVED = new Set([SUSPEND_META_KEY, SIGNALS_KEY]);\n\n/** Channel names a caller actually declared (drop the engine-internal `__*` channels). */\nfunction publicChannels(state: Pick<GraphState, \"channels\">): string[] {\n return Object.keys(state.channels as Record<string, unknown>)\n .filter((k) => !RESERVED.has(k) && !k.startsWith(\"__\"))\n .sort();\n}\n\n/** Find the most recent failure in the event log, if any. */\nfunction findFailure(events: readonly RunEvent[]): { node?: string; error: string } | undefined {\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const e = events[i];\n if (e === undefined) continue;\n if (e.type === \"node_failed\") return { node: String(e.nodeId), error: e.error };\n if (e.type === \"run_failed\") return { error: e.error };\n }\n return undefined;\n}\n\n/** The tools agents are waiting on a human to approve (`tool:<name>` approval requests). */\nconst pendingTools = (state: GraphState): string[] => {\n const names = new Set<string>();\n for (const value of Object.values(state.channels as Record<string, unknown>)) {\n const requests = (value as { approvalRequests?: unknown } | null)?.approvalRequests;\n if (!Array.isArray(requests)) continue;\n for (const request of requests) {\n const subject = (request as { subject?: unknown } | null)?.subject;\n if (typeof subject === \"string\" && subject.startsWith(\"tool:\")) names.add(subject.slice(\"tool:\".length));\n }\n }\n return [...names].sort();\n};\n\nconst nextActionFor = (\n reason: string,\n awaitingSignal?: string,\n wakeAt?: string,\n tools: string[] = []\n): string => {\n if (awaitingSignal !== undefined) return `deliver the \"${awaitingSignal}\" signal with app.signal(runId, \"${awaitingSignal}\", payload)`;\n if (wakeAt !== undefined) return `the control-plane scheduler resumes at ${wakeAt}; or call app.resume(runId)`;\n if (tools.length > 0) {\n const list = tools.map((name) => JSON.stringify(name)).join(\", \");\n return `a human approves the ${list} tool call, then call app.approveAndResume(runId, { approvedTools: [${list}], resolvedBy })`;\n }\n if (reason === \"human-gate\" || reason === \"interrupt\") return \"a human approves, then call app.resume(runId)\";\n return \"call app.resume(runId)\";\n};\n\n/**\n * Explain a run from its {@link GraphState} (and, optionally, its lifecycle event log).\n * Pure + read-only — safe to call on any state.\n */\nexport function explainRun(state: GraphState, events?: readonly RunEvent[]): RunExplanation {\n const runId = String(state.runId);\n const status = String(state.status);\n const currentNode = String(state.currentNodeId);\n const channels = publicChannels(state);\n const recentEvents = events\n ?.slice(-20)\n .map((e) => ({ type: e.type, node: \"nodeId\" in e ? String(e.nodeId) : undefined }));\n\n const explanation: RunExplanation = { runId, status, currentNode, summary: \"\", channels };\n if (recentEvents !== undefined) explanation.recentEvents = recentEvents;\n\n if (status === \"suspended\") {\n const meta = readSuspendMeta(state);\n const reason = meta?.reason ?? \"interrupt\";\n const nextAction = nextActionFor(reason, meta?.awaitingSignal, meta?.wakeAt, pendingTools(state));\n explanation.suspended = {\n reason,\n node: currentNode,\n ...(meta?.awaitingSignal !== undefined ? { awaitingSignal: meta.awaitingSignal } : {}),\n ...(meta?.wakeAt !== undefined ? { wakeAt: meta.wakeAt } : {}),\n nextAction\n };\n explanation.summary = `Suspended at \"${currentNode}\" (${reason}). To continue: ${nextAction}.`;\n return explanation;\n }\n\n if (status === \"failed\") {\n const failure = events !== undefined ? findFailure(events) : undefined;\n if (failure !== undefined) explanation.failure = failure;\n explanation.summary = failure\n ? `Failed${failure.node ? ` at \"${failure.node}\"` : \"\"}: ${failure.error}`\n : `Failed at \"${currentNode}\".`;\n return explanation;\n }\n\n explanation.summary =\n status === \"completed\"\n ? `Completed. Final channels: ${channels.join(\", \") || \"(none)\"}.`\n : `Status \"${status}\" at \"${currentNode}\".`;\n return explanation;\n}\n","export type ZodSchema<T> = {\n parse(input: unknown): T;\n};\n\nexport type ToolId = string & { readonly __brand: \"ToolId\" };\n\nexport type ToolDefinition<TInput, TOutput> = {\n id: ToolId;\n name: string;\n description: string;\n inputSchema: ZodSchema<TInput>;\n outputSchema: ZodSchema<TOutput>;\n permissions: string[];\n requiresApproval?: boolean;\n /**\n * JSON Schema for the tool's input, advertised to the LLM. `inputSchema` only\n * validates (`.parse`); this is what the provider needs to emit tool calls.\n */\n jsonSchema?: Record<string, unknown>;\n};\n\nexport type ToolHandler<TInput, TOutput> = (input: TInput) => Promise<TOutput>;\n\nexport interface ToolRegistry {\n register<TInput, TOutput>(\n definition: ToolDefinition<TInput, TOutput>,\n handler: ToolHandler<TInput, TOutput>\n ): void;\n resolve(\n id: ToolId\n ): { definition: ToolDefinition<unknown, unknown>; handler: ToolHandler<unknown, unknown> } | undefined;\n list(): ToolDefinition<unknown, unknown>[];\n}\n\ntype Entry = {\n definition: ToolDefinition<unknown, unknown>;\n handler: ToolHandler<unknown, unknown>;\n};\n\nexport class InMemoryToolRegistry implements ToolRegistry {\n private readonly entries = new Map<ToolId, Entry>();\n\n public register<TInput, TOutput>(\n definition: ToolDefinition<TInput, TOutput>,\n handler: ToolHandler<TInput, TOutput>\n ): void {\n this.entries.set(definition.id, {\n definition: definition as ToolDefinition<unknown, unknown>,\n handler: handler as ToolHandler<unknown, unknown>\n });\n }\n\n public resolve(\n id: ToolId\n ): { definition: ToolDefinition<unknown, unknown>; handler: ToolHandler<unknown, unknown> } | undefined {\n return this.entries.get(id);\n }\n\n public list(): ToolDefinition<unknown, unknown>[] {\n return [...this.entries.values()].map((entry) => entry.definition);\n }\n}\n","import type { ToolDefinition, ToolHandler, ToolId } from \"./tools.js\";\n\n/**\n * The `writeTodos` planning tool and its checkpointed state shape — phase 1 of the\n * governed deep-agent harness (ADR 0022/0023). Behaviour-identical to the Rust\n * `agents-core` `todos.rs`: a pure state-write tool the model calls to (re)emit the\n * **authoritative full** todo list. The engine (Rust) executes it and the agent\n * node persists the latest list into {@link TODOS_CHANNEL}.\n *\n * This module is the shared-shape source of truth (types + {@link normalizeTodos})\n * plus the tool definition SDK consumers reference; the real execution path is the\n * Rust engine (the SDK runs Rust-only — ADR 0016).\n */\n\nexport type TodoStatus = \"pending\" | \"in_progress\" | \"completed\";\n\nexport type TodoItem = { id: string; text: string; status: TodoStatus };\n\n/**\n * Reserved channel the agent node persists the latest todo list into. Replace\n * semantics: `writeTodos` always writes the full authoritative list, so the channel\n * must not declare an append/merge reducer. Matches the Rust `TODOS_CHANNEL`.\n */\nexport const TODOS_CHANNEL = \"__todos\";\n\n/** The `writeTodos` tool name. Matches the Rust `WRITE_TODOS_TOOL`. */\nexport const WRITE_TODOS_TOOL_NAME = \"writeTodos\";\n\nexport type WriteTodosInput = { todos: Array<{ id?: string; text: string; status: TodoStatus }> };\n\n/**\n * Normalize raw tool input into an authoritative todo list. Lenient and\n * deterministic — **byte-for-byte parity** with the Rust `normalize_todos`:\n * - iterate `input.todos` in order;\n * - drop any item whose `text` is missing or blank (after trimming);\n * - an item with a missing or blank `id` gets `todo-{n}`, where `n` is its\n * **1-based position in the incoming list** (dropped items still advance `n`);\n * - an unknown or absent `status` coerces to `pending`.\n *\n * A missing / non-array `todos` field yields an empty list.\n */\nexport function normalizeTodos(input: unknown): TodoItem[] {\n const todos = (input as { todos?: unknown } | null | undefined)?.todos;\n if (!Array.isArray(todos)) {\n return [];\n }\n const out: TodoItem[] = [];\n todos.forEach((raw, index) => {\n const row = (raw ?? {}) as Record<string, unknown>;\n const text = typeof row.text === \"string\" ? row.text.trim() : \"\";\n if (text === \"\") {\n return;\n }\n const rawId = typeof row.id === \"string\" ? row.id : \"\";\n const id = rawId.trim() !== \"\" ? rawId : `todo-${index + 1}`;\n const status: TodoStatus =\n row.status === \"in_progress\" ? \"in_progress\" : row.status === \"completed\" ? \"completed\" : \"pending\";\n out.push({ id, text, status });\n });\n return out;\n}\n\n/** JSON Schema advertised to the LLM — identical to the Rust `write_todos_tool` schema. */\nexport const writeTodosJsonSchema: Record<string, unknown> = {\n type: \"object\",\n properties: {\n todos: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n text: { type: \"string\" },\n status: { type: \"string\", enum: [\"pending\", \"in_progress\", \"completed\"] }\n },\n required: [\"text\", \"status\"]\n }\n }\n },\n required: [\"todos\"],\n additionalProperties: false\n};\n\n/**\n * The `writeTodos` tool definition + handler. `requiresApproval` is always false —\n * planning is cheap and never gated. The handler returns the normalized list.\n */\nexport const writeTodosTool: {\n definition: ToolDefinition<WriteTodosInput, TodoItem[]>;\n handler: ToolHandler<WriteTodosInput, TodoItem[]>;\n} = {\n definition: {\n id: WRITE_TODOS_TOOL_NAME as unknown as ToolId,\n name: WRITE_TODOS_TOOL_NAME,\n description:\n \"Record or update your plan as a todo list. Always re-emit the COMPLETE authoritative list \" +\n \"(every call replaces the previous one). Each item: a short `text` and a `status` of \" +\n \"pending, in_progress, or completed.\",\n inputSchema: { parse: (input: unknown) => input as WriteTodosInput },\n outputSchema: { parse: (input: unknown) => input as TodoItem[] },\n permissions: [],\n requiresApproval: false,\n jsonSchema: writeTodosJsonSchema\n },\n handler: async (input: WriteTodosInput) => normalizeTodos(input)\n};\n","import type { Agent } from \"./interfaces.js\";\nimport type { AgentId, AgentResult } from \"./types.js\";\nimport type { ToolRegistry } from \"./tools.js\";\nimport type { LLMGateway } from \"../../llm-gateway/src/interfaces.js\";\nimport type { LLMContentBlock, LLMMessage, LLMProvider, LLMToolDef } from \"../../llm-gateway/src/types.js\";\nimport type { PromptRegistry } from \"../../llm-gateway/src/prompt-registry.js\";\nimport type { BaseStore } from \"../../memory-store/src/interfaces.js\";\nimport type { CallbackManager } from \"../../callbacks/src/interfaces.js\";\nimport type { GraphState } from \"@ailu-ai/graph-core\";\nimport type { WorkingMemory } from \"./working-memory.js\";\n\nconst DEFAULT_PROVIDER: LLMProvider = \"anthropic\";\nconst DEFAULT_MODEL = \"claude-opus-4-8\";\n\ntype ReActAgentOptions = {\n id: AgentId;\n name: string;\n description: string;\n llm: LLMGateway;\n tools?: ToolRegistry;\n maxIterations?: number;\n provider?: LLMProvider;\n model?: string;\n /** System prompt source — agents reference prompts by id, never inline them. */\n promptRegistry?: PromptRegistry;\n promptId?: string;\n promptVersion?: string;\n /**\n * Names of `requiresApproval` tools that have already been granted human\n * approval (e.g. injected into state on resume). Listed tools execute instead\n * of being gated again — this is how a suspended-for-approval run continues.\n */\n approvedToolNames?: string[];\n};\n\nexport class ReActAgent<TInput> implements Agent<TInput> {\n public readonly id: AgentId;\n public readonly name: string;\n public readonly description: string;\n private readonly llm: LLMGateway;\n private readonly tools?: ToolRegistry;\n private readonly maxIterations: number;\n private readonly provider: LLMProvider;\n private readonly model: string;\n private readonly promptRegistry?: PromptRegistry;\n private readonly promptId?: string;\n private readonly promptVersion?: string;\n private readonly approvedToolNames: Set<string>;\n\n public constructor(options: ReActAgentOptions) {\n this.id = options.id;\n this.name = options.name;\n this.description = options.description;\n this.llm = options.llm;\n this.tools = options.tools;\n this.maxIterations = options.maxIterations ?? 6;\n this.provider = options.provider ?? DEFAULT_PROVIDER;\n this.model = options.model ?? DEFAULT_MODEL;\n this.promptRegistry = options.promptRegistry;\n this.promptId = options.promptId;\n this.promptVersion = options.promptVersion;\n this.approvedToolNames = new Set(options.approvedToolNames ?? []);\n }\n\n public async run(\n input: TInput,\n state: GraphState,\n context: { memory: BaseStore; workingMemory: WorkingMemory; callbacks?: CallbackManager }\n ): Promise<AgentResult> {\n const trace: string[] = [];\n const approvalRequests: AgentResult[\"approvalRequests\"] = [];\n // Static, cacheable prefix resolved from the registry; dynamic state is sent\n // in the per-turn user message so it never busts the cached prefix.\n const system = this.resolveSystemPrompt();\n const toolDefs = this.buildToolDefs();\n\n // A real multi-turn conversation: the static system/tools form the cacheable\n // prefix; tool results come back as structured `tool_result` blocks paired to\n // their `tool_use` by id, rather than being flattened into a text trace.\n const conversation: LLMMessage[] = [\n { role: \"user\", content: `Input: ${JSON.stringify(input)}\\nState: ${JSON.stringify(state.channels)}` }\n ];\n\n for (let i = 0; i < this.maxIterations; i += 1) {\n const completion = await this.llm.complete({\n provider: this.provider,\n model: this.model,\n system,\n tools: toolDefs,\n messages: conversation\n });\n const content = completion.content.trim();\n trace.push(`thought:${content}`);\n\n // Native tool-calling: when the provider surfaces structured tool_use blocks,\n // record the assistant turn, run the tools, and feed results back as\n // tool_result blocks. An approval-gated tool stops the loop (no self-approval).\n const toolCalls = completion.toolCalls ?? [];\n if (toolCalls.length > 0) {\n const assistantBlocks: LLMContentBlock[] = [];\n if (content.length > 0) {\n assistantBlocks.push({ type: \"text\", text: content });\n }\n for (const call of toolCalls) {\n assistantBlocks.push({ type: \"tool_use\", id: call.id, name: call.name, input: call.input });\n }\n conversation.push({ role: \"assistant\", content: assistantBlocks });\n\n const resultBlocks: LLMContentBlock[] = [];\n let approvalHit = false;\n for (const call of toolCalls) {\n const result = await this.executeToolCall(\n call.name,\n call.input,\n { trace, approvalRequests, callbacks: context.callbacks },\n state\n );\n if (result.status === \"approval\") {\n approvalHit = true;\n break;\n }\n resultBlocks.push({\n type: \"tool_result\",\n toolUseId: call.id,\n content: result.output,\n isError: result.status === \"not_found\"\n });\n }\n if (approvalHit) {\n break;\n }\n conversation.push({ role: \"user\", content: resultBlocks });\n continue;\n }\n\n // Record the assistant's text turn before deciding how to proceed.\n if (content.length > 0) {\n conversation.push({ role: \"assistant\", content });\n }\n\n // ACTION: text-protocol tool call — execute, feed the observation back, loop.\n if (content.startsWith(\"ACTION:\")) {\n const [, toolNameRaw, payloadRaw] = content.match(/^ACTION:\\s+(\\S+)\\s*(.*)$/) ?? [];\n const toolName = toolNameRaw ?? \"\";\n const payloadText = payloadRaw ?? \"\";\n const payload = payloadText.length > 0 ? JSON.parse(payloadText) : {};\n const result = await this.executeToolCall(\n toolName,\n payload,\n { trace, approvalRequests, callbacks: context.callbacks },\n state\n );\n if (result.status === \"approval\") {\n break;\n }\n // Feed the observation back so the next turn can use it (text protocol).\n conversation.push({ role: \"user\", content: `observation:${result.output}` });\n continue;\n }\n\n // Any tool-call-free, action-free text turn is the final answer. Honour an\n // explicit `FINAL:` marker wherever it appears (models rarely put it first),\n // otherwise take the whole text. We must NOT loop here: re-querying would\n // append an assistant-terminated conversation, which strict providers\n // (e.g. Mistral / OpenAI-compatible) reject with a 400.\n const finalIndex = content.indexOf(\"FINAL:\");\n const answer = finalIndex >= 0 ? content.slice(finalIndex + \"FINAL:\".length).trim() : content;\n trace.push(`final:${answer}`);\n break;\n }\n\n await context.memory.put([\"agent\", this.name], \"last-react-trace\", trace);\n await context.memory.put(\n [\"agent\", this.name],\n \"short-term-count\",\n context.workingMemory.shortTerm.length\n );\n\n return {\n artifacts: [],\n blockers: [],\n approvalRequests,\n confidence: 0.7,\n reasoning: trace.join(\"\\n\"),\n requiresHumanReview: approvalRequests.length > 0\n };\n }\n\n /**\n * Resolve a tool by name and either execute it or gate it. Shared by the native\n * tool_use path and the legacy ACTION: text protocol so both honour the approval\n * rule identically: a `requiresApproval` tool is never self-executed.\n */\n private async executeToolCall(\n name: string,\n input: unknown,\n sink: {\n trace: string[];\n approvalRequests: AgentResult[\"approvalRequests\"];\n callbacks?: CallbackManager;\n },\n state: GraphState\n ): Promise<{ status: \"approval\" | \"executed\" | \"not_found\"; output: string }> {\n await sink.callbacks?.emit({\n type: \"onAgentAction\",\n runId: String(state.runId),\n nodeId: String(state.currentNodeId),\n timestamp: new Date().toISOString(),\n action: name,\n payload: input\n });\n\n const resolved = this.tools?.resolve(name as never);\n if (resolved === undefined) {\n sink.trace.push(`observation:tool_not_found:${name}`);\n return { status: \"not_found\", output: `tool_not_found:${name}` };\n }\n\n // Gate sensitive tools — unless this exact tool was already approved by a human\n // (e.g. granted on resume), in which case it runs.\n if (resolved.definition.requiresApproval === true && !this.approvedToolNames.has(resolved.definition.name)) {\n sink.approvalRequests.push({\n subject: { description: `tool:${resolved.definition.name}` },\n reason: `Tool '${resolved.definition.name}' requires human approval before execution.`\n });\n sink.trace.push(`observation:approval_required:${name}`);\n return { status: \"approval\", output: \"\" };\n }\n\n const parsedInput = resolved.definition.inputSchema.parse(input);\n const toolOutput = await resolved.handler(parsedInput);\n const parsedOutput = resolved.definition.outputSchema.parse(toolOutput);\n const output = JSON.stringify(parsedOutput);\n sink.trace.push(`observation:${output}`);\n return { status: \"executed\", output };\n }\n\n private resolveSystemPrompt(): string | undefined {\n if (this.promptRegistry === undefined || this.promptId === undefined) {\n return undefined;\n }\n return this.promptRegistry.get(this.promptId, this.promptVersion).system;\n }\n\n private buildToolDefs(): LLMToolDef[] | undefined {\n if (this.tools === undefined) {\n return undefined;\n }\n const defs = this.tools\n .list()\n .filter((tool) => tool.jsonSchema !== undefined)\n .map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.jsonSchema as Record<string, unknown>\n }));\n return defs.length > 0 ? defs : undefined;\n }\n}\n","import type { LLMProvider } from \"./types.js\";\n\nexport class LLMProviderNotFoundError extends Error {\n public readonly provider: LLMProvider;\n\n public constructor(provider: LLMProvider) {\n super(`No LLM adapter registered for provider '${provider}'.`);\n this.name = \"LLMProviderNotFoundError\";\n this.provider = provider;\n }\n}\n\nexport class LLMValidationError extends Error {\n public readonly issues: string[];\n\n public constructor(issues: string[]) {\n super(\"Invalid LLM request.\");\n this.name = \"LLMValidationError\";\n this.issues = issues;\n }\n}\n\n/**\n * A provider returned a non-2xx HTTP response. Carries the status and the raw response\n * body so callers can surface the upstream error verbatim instead of a bare throw.\n */\nexport class LLMProviderError extends Error {\n public readonly status: number;\n public readonly body: string;\n\n public constructor(status: number, body: string) {\n super(`LLM provider request failed with status ${status}.`);\n this.name = \"LLMProviderError\";\n this.status = status;\n this.body = body;\n }\n}\n","import { z } from \"zod\";\n\nimport type { LLMGateway, LLMProviderAdapter } from \"./interfaces.js\";\nimport type { LLMRequest, LLMStreamChunk } from \"./types.js\";\nimport { LLMProviderNotFoundError, LLMValidationError } from \"./errors.js\";\n\nconst LLMContentBlockSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"text\"), text: z.string() }),\n z.object({ type: z.literal(\"tool_use\"), id: z.string().min(1), name: z.string().min(1), input: z.unknown() }),\n z.object({\n type: z.literal(\"tool_result\"),\n toolUseId: z.string().min(1),\n content: z.string(),\n isError: z.boolean().optional()\n })\n]);\n\nconst LLMMessageSchema = z.object({\n role: z.enum([\"system\", \"user\", \"assistant\"]),\n content: z.union([z.string().min(1), z.array(LLMContentBlockSchema).min(1)])\n});\n\nconst LLMToolDefSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n inputSchema: z.record(z.unknown())\n});\n\nconst LLMRequestSchema = z.object({\n provider: z.enum([\"openai\", \"anthropic\", \"mistral\", \"google\"]),\n model: z.string().min(1),\n messages: z.array(LLMMessageSchema).min(1),\n system: z.string().optional(),\n tools: z.array(LLMToolDefSchema).optional(),\n maxTokens: z.number().int().positive().optional(),\n temperature: z.number().min(0).max(2).optional(),\n stream: z.boolean().optional()\n});\n\nexport class DefaultLLMGateway implements LLMGateway {\n private readonly adapters = new Map<string, LLMProviderAdapter>();\n\n public registerAdapter(adapter: LLMProviderAdapter): void {\n this.adapters.set(adapter.provider, adapter);\n }\n\n public async complete(req: LLMRequest) {\n this.validateRequest(req);\n const adapter = this.adapters.get(req.provider);\n if (adapter === undefined) {\n throw new LLMProviderNotFoundError(req.provider);\n }\n\n return adapter.complete(req);\n }\n\n public async *stream(req: LLMRequest): AsyncIterable<LLMStreamChunk> {\n this.validateRequest(req);\n const adapter = this.adapters.get(req.provider);\n if (adapter === undefined) {\n throw new LLMProviderNotFoundError(req.provider);\n }\n\n for await (const chunk of adapter.stream(req)) {\n yield chunk;\n }\n }\n\n private validateRequest(req: LLMRequest): void {\n const result = LLMRequestSchema.safeParse(req);\n if (!result.success) {\n throw new LLMValidationError(result.error.issues.map((issue) => issue.message));\n }\n }\n}\n","import type { LLMProviderAdapter } from \"./interfaces.js\";\nimport type { LLMProvider, LLMResponse, LLMStreamChunk } from \"./types.js\";\n\ntype MockAdapterOptions = {\n provider: LLMProvider;\n response?: LLMResponse;\n /**\n * Scripted responses replayed one per `complete()` call (the last repeats once\n * exhausted). Lets a test drive a multi-turn agent — e.g. a `tool_use` turn\n * followed by a final-answer turn. Takes precedence over `response`.\n */\n responses?: LLMResponse[];\n chunks?: LLMStreamChunk[];\n};\n\nexport class MockLLMProviderAdapter implements LLMProviderAdapter {\n public readonly provider: LLMProvider;\n private readonly responses: LLMResponse[];\n private readonly chunks: LLMStreamChunk[];\n private index = 0;\n\n public constructor(options: MockAdapterOptions) {\n this.provider = options.provider;\n const fallback: LLMResponse = {\n content: \"mock-response\",\n usage: { promptTokens: 1, completionTokens: 1 },\n model: \"mock-model\",\n provider: options.provider\n };\n this.responses =\n options.responses ?? (options.response !== undefined ? [options.response] : [fallback]);\n this.chunks = options.chunks ?? [{ delta: \"mock-response\", done: true }];\n }\n\n public async complete(): Promise<LLMResponse> {\n const next = this.responses[Math.min(this.index, this.responses.length - 1)];\n this.index += 1;\n // `responses` is non-empty by construction, so the fallback is unreachable.\n return next ?? this.responses[this.responses.length - 1]!;\n }\n\n public async *stream(): AsyncIterable<LLMStreamChunk> {\n for (const chunk of this.chunks) {\n yield chunk;\n }\n }\n}\n","// ADR 0034 (16a): `@anthropic-ai/sdk` is a TYPE-only import here (erased at build) plus a single\n// lazy runtime `require` inside `createDefaultPort` — so importing this module (e.g. the mock\n// `DefaultLLMGateway` path) never pulls the SDK, and `@ailu-ai/graph-sdk` ships without it.\n// This is the deprecated TS fallback; the Rust engine is the real provider path.\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport { createRequire } from \"node:module\";\n\nimport type { LLMProviderAdapter } from \"./interfaces.js\";\nimport type { LLMContentBlock, LLMRequest, LLMResponse, LLMStreamChunk } from \"./types.js\";\n\nconst DEFAULT_MODEL = \"claude-opus-4-8\";\nconst DEFAULT_MAX_TOKENS = 16000;\nconst DEFAULT_STREAM_MAX_TOKENS = 64000;\n\n/**\n * Provider-shaped request the adapter assembles. This is the cache seam: the\n * `system` and `tools` blocks carry the cache_control breakpoints and must stay\n * byte-stable across calls. The default port translates this into the SDK request;\n * tests fake the port and assert on this shape directly.\n */\nexport type AnthropicCreateParams = {\n model: string;\n maxTokens: number;\n system?: Array<{ type: \"text\"; text: string; cacheable?: boolean }>;\n tools?: Array<{\n name: string;\n description?: string;\n inputSchema: Record<string, unknown>;\n cacheable?: boolean;\n }>;\n messages: Array<{ role: \"user\" | \"assistant\"; content: string | LLMContentBlock[] }>;\n};\n\n/** Structural subset of the SDK `Message` the adapter actually reads. */\nexport type AnthropicRawResponse = {\n content: Array<{ type: string; text?: string; id?: string; name?: string; input?: unknown }>;\n stop_reason?: string | null;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number | null;\n cache_creation_input_tokens?: number | null;\n };\n};\n\n/**\n * The only seam onto the Anthropic SDK. The default implementation wraps a real\n * client; tests supply a fake so the cache + accounting logic is covered without\n * a network call or an API key.\n */\nexport interface AnthropicClientPort {\n create(params: AnthropicCreateParams): Promise<AnthropicRawResponse>;\n stream(params: AnthropicCreateParams): AsyncIterable<LLMStreamChunk>;\n}\n\nexport type AnthropicAdapterOptions = {\n /** Override the model used when the request does not name a Claude model. */\n defaultModel?: string;\n /** Inject a client port (tests) or an API key (production). */\n port?: AnthropicClientPort;\n apiKey?: string;\n};\n\nexport class AnthropicProviderAdapter implements LLMProviderAdapter {\n public readonly provider = \"anthropic\" as const;\n private readonly port: AnthropicClientPort;\n private readonly defaultModel: string;\n\n public constructor(options: AnthropicAdapterOptions = {}) {\n this.defaultModel = options.defaultModel ?? DEFAULT_MODEL;\n this.port = options.port ?? createDefaultPort(options.apiKey);\n }\n\n public async complete(req: LLMRequest): Promise<LLMResponse> {\n const params = this.buildParams(req, req.maxTokens ?? DEFAULT_MAX_TOKENS);\n const raw = await this.port.create(params);\n return this.toResponse(req, params.model, raw);\n }\n\n public async *stream(req: LLMRequest): AsyncIterable<LLMStreamChunk> {\n const params = this.buildParams(req, req.maxTokens ?? DEFAULT_STREAM_MAX_TOKENS);\n yield* this.port.stream(params);\n }\n\n /**\n * Assemble the provider request. The cacheable prefix is `tools` then `system`\n * (Anthropic render order); a breakpoint on the last tool and on the system block\n * caches that prefix. Sampling params are intentionally dropped — Opus 4.7/4.8\n * reject `temperature`/`top_p`/`top_k`. No date/timestamp is added here.\n */\n private buildParams(req: LLMRequest, maxTokens: number): AnthropicCreateParams {\n const systemText = this.collectSystem(req);\n const params: AnthropicCreateParams = {\n model: this.resolveModel(req.model),\n maxTokens,\n messages: req.messages\n .filter((m) => m.role !== \"system\")\n .map((m) => ({ role: (m.role === \"assistant\" ? \"assistant\" : \"user\") as \"user\" | \"assistant\", content: m.content }))\n };\n\n if (systemText.length > 0) {\n params.system = [{ type: \"text\", text: systemText, cacheable: true }];\n }\n\n if (req.tools !== undefined && req.tools.length > 0) {\n params.tools = req.tools.map((tool, index) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n // Breakpoint on the last tool caches the whole deterministic tool list.\n cacheable: index === req.tools!.length - 1\n }));\n }\n\n return params;\n }\n\n private collectSystem(req: LLMRequest): string {\n const parts: string[] = [];\n if (req.system !== undefined && req.system.length > 0) {\n parts.push(req.system);\n }\n for (const message of req.messages) {\n if (message.role === \"system\" && typeof message.content === \"string\") {\n parts.push(message.content);\n }\n }\n return parts.join(\"\\n\\n\");\n }\n\n private resolveModel(model: string): string {\n return model.startsWith(\"claude-\") ? model : this.defaultModel;\n }\n\n private toResponse(req: LLMRequest, model: string, raw: AnthropicRawResponse): LLMResponse {\n const content = raw.content\n .filter((block) => block.type === \"text\")\n .map((block) => block.text ?? \"\")\n .join(\"\");\n\n const toolCalls = raw.content\n .filter((block) => block.type === \"tool_use\")\n .map((block) => ({\n id: block.id ?? \"\",\n name: block.name ?? \"\",\n input: block.input ?? {}\n }));\n\n return {\n content,\n ...(toolCalls.length > 0 ? { toolCalls } : {}),\n ...(raw.stop_reason != null ? { stopReason: raw.stop_reason } : {}),\n usage: {\n promptTokens: raw.usage.input_tokens,\n completionTokens: raw.usage.output_tokens,\n cacheReadTokens: raw.usage.cache_read_input_tokens ?? 0,\n cacheWriteTokens: raw.usage.cache_creation_input_tokens ?? 0\n },\n model,\n provider: req.provider\n };\n }\n}\n\nconst ephemeral: Anthropic.CacheControlEphemeral = { type: \"ephemeral\" };\n\n/** Constructor shape of the SDK default export — typed from the (erased) type import. */\ntype AnthropicCtor = new (opts?: { apiKey?: string }) => Anthropic;\n\nlet cachedAnthropicCtor: AnthropicCtor | undefined;\n\n/** Lazily load the `@anthropic-ai/sdk` constructor (ADR 0034 16a). A static `createRequire` of a\n * constant package name — not a dynamic import of a user string. Throws a clear error if the\n * optional SDK is not installed (the engine is the default path; this is the TS fallback). */\nconst anthropicCtor = (): AnthropicCtor => {\n if (cachedAnthropicCtor === undefined) {\n try {\n const requireFn = createRequire(import.meta.url);\n const mod = requireFn(\"@anthropic-ai/sdk\") as { default?: AnthropicCtor } & AnthropicCtor;\n cachedAnthropicCtor = (mod.default ?? mod) as AnthropicCtor;\n } catch {\n throw new Error(\n \"@anthropic-ai/sdk is not installed. It is an optional dependency: the TS Anthropic \" +\n \"adapter is the deprecated fallback — install @anthropic-ai/sdk to use it, or run on \" +\n \"the Rust engine (the default).\"\n );\n }\n }\n return cachedAnthropicCtor;\n};\n\n/** Wraps a real Anthropic client. This is the only code that touches the SDK (lazily). */\nconst createDefaultPort = (apiKey?: string): AnthropicClientPort => {\n const Ctor = anthropicCtor();\n const client = new Ctor(apiKey === undefined ? {} : { apiKey });\n\n const toSdkContent = (\n content: AnthropicCreateParams[\"messages\"][number][\"content\"]\n ): Anthropic.MessageParam[\"content\"] => {\n if (typeof content === \"string\") {\n return content;\n }\n return content.map((block) => {\n if (block.type === \"text\") {\n return { type: \"text\" as const, text: block.text };\n }\n if (block.type === \"tool_use\") {\n return { type: \"tool_use\" as const, id: block.id, name: block.name, input: block.input };\n }\n return {\n type: \"tool_result\" as const,\n tool_use_id: block.toolUseId,\n content: block.content,\n ...(block.isError === true ? { is_error: true } : {})\n };\n });\n };\n\n const toSdkParams = (params: AnthropicCreateParams): Anthropic.MessageCreateParamsNonStreaming => {\n const sdk: Anthropic.MessageCreateParamsNonStreaming = {\n model: params.model,\n max_tokens: params.maxTokens,\n messages: params.messages.map((m) => ({ role: m.role, content: toSdkContent(m.content) }))\n };\n if (params.system !== undefined) {\n sdk.system = params.system.map((block) => ({\n type: \"text\",\n text: block.text,\n ...(block.cacheable === true ? { cache_control: ephemeral } : {})\n }));\n }\n if (params.tools !== undefined) {\n sdk.tools = params.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: { type: \"object\" as const, ...tool.inputSchema },\n ...(tool.cacheable === true ? { cache_control: ephemeral } : {})\n }));\n }\n return sdk;\n };\n\n return {\n async create(params) {\n return client.messages.create(toSdkParams(params));\n },\n async *stream(params) {\n const live = client.messages.stream({ ...toSdkParams(params), stream: true });\n for await (const event of live) {\n if (event.type === \"content_block_delta\" && event.delta.type === \"text_delta\") {\n yield { delta: event.delta.text, done: false };\n }\n }\n yield { delta: \"\", done: true };\n }\n };\n};\n","import type { LLMProviderAdapter } from \"./interfaces.js\";\nimport type {\n LLMContentBlock,\n LLMProvider,\n LLMRequest,\n LLMResponse,\n LLMStreamChunk,\n LLMToolCall\n} from \"./types.js\";\nimport { LLMProviderError } from \"./errors.js\";\n\nconst MISTRAL_BASE_URL = \"https://api.mistral.ai/v1\";\nconst MISTRAL_DEFAULT_MODEL = \"mistral-small-latest\";\nconst OLLAMA_BASE_URL = \"http://localhost:11434/v1\";\nconst OLLAMA_DEFAULT_MODEL = \"mistral\";\n// Gemini exposes an OpenAI-compatible chat/completions surface, so it rides this same adapter,\n// registered under the first-class `google` provider (LLM_PROVIDERS). Bearer-keyed (GEMINI_API_KEY).\nconst GEMINI_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta/openai\";\nconst GEMINI_DEFAULT_MODEL = \"gemini-2.5-flash\";\nconst OPENAI_BASE_URL = \"https://api.openai.com/v1\";\nconst OPENAI_DEFAULT_MODEL = \"gpt-4o\";\n\n/**\n * The OpenAI `/v1/chat/completions` request body the adapter assembles. This is the\n * seam tests assert against directly: {@link buildRequestBody} is a pure function, so\n * the request mapping is covered without a network call or an API key.\n */\nexport type OpenAIChatRequestBody = {\n model: string;\n messages: OpenAIChatMessage[];\n tools?: Array<{\n type: \"function\";\n function: { name: string; description?: string; parameters: Record<string, unknown> };\n }>;\n temperature?: number;\n max_tokens?: number;\n};\n\n/** A single message in the OpenAI chat shape. */\nexport type OpenAIChatMessage = {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_call_id?: string;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n};\n\n/** Structural subset of the OpenAI chat completion response the adapter reads. */\nexport type OpenAIChatResponse = {\n choices: Array<{\n message: {\n content?: string | null;\n tool_calls?: Array<{\n id: string;\n type?: string;\n function: { name: string; arguments: string };\n }> | null;\n };\n finish_reason?: string | null;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n };\n};\n\n/**\n * The only seam onto the HTTP transport. The default implementation POSTs the body to\n * `baseUrl + '/chat/completions'` via global `fetch`; tests supply a fake so the\n * request/response mapping is covered without a network call.\n */\nexport interface OpenAICompatibleTransportPort {\n send(body: OpenAIChatRequestBody): Promise<OpenAIChatResponse>;\n}\n\nexport type OpenAICompatibleAdapterOptions = {\n /** Provider key this adapter registers under in the gateway map. Default `'mistral'`. */\n provider?: LLMProvider;\n /** API base, e.g. `https://api.mistral.ai/v1` or `http://localhost:11434/v1`. */\n baseUrl: string;\n /** Model used when the request does not name a model id for this provider. */\n defaultModel: string;\n /** Bearer token; omitted for keyless servers such as a local Ollama. */\n apiKey?: string;\n /** Inject a transport port (tests) instead of the default `fetch`-backed one. */\n port?: OpenAICompatibleTransportPort;\n};\n\n/**\n * One adapter for any server speaking the OpenAI `/v1/chat/completions` shape. Both\n * a local **Ollama** server (`http://localhost:11434/v1`, keyless) and **Mistral\n * cloud** (`https://api.mistral.ai/v1`, bearer key) are driven by this same class;\n * use {@link OpenAICompatibleProviderAdapter.ollama} / `.mistral` to construct them.\n */\nexport class OpenAICompatibleProviderAdapter implements LLMProviderAdapter {\n public readonly provider: LLMProvider;\n private readonly port: OpenAICompatibleTransportPort;\n private readonly baseUrl: string;\n private readonly defaultModel: string;\n\n public constructor(options: OpenAICompatibleAdapterOptions) {\n this.provider = options.provider ?? \"mistral\";\n this.baseUrl = options.baseUrl;\n this.defaultModel = options.defaultModel;\n this.port = options.port ?? createDefaultPort(options.baseUrl, options.apiKey);\n }\n\n /** Mistral cloud: bearer-keyed, hosted at `https://api.mistral.ai/v1`. */\n public static mistral(apiKey?: string, model?: string): OpenAICompatibleProviderAdapter {\n return new OpenAICompatibleProviderAdapter({\n provider: \"mistral\",\n baseUrl: MISTRAL_BASE_URL,\n defaultModel: model ?? MISTRAL_DEFAULT_MODEL,\n ...(apiKey !== undefined ? { apiKey } : {})\n });\n }\n\n /** Google Gemini via its OpenAI-compatible endpoint; registers under the `google` provider. */\n public static google(apiKey?: string, model?: string): OpenAICompatibleProviderAdapter {\n return new OpenAICompatibleProviderAdapter({\n provider: \"google\",\n baseUrl: GEMINI_BASE_URL,\n defaultModel: model ?? GEMINI_DEFAULT_MODEL,\n ...(apiKey !== undefined ? { apiKey } : {})\n });\n }\n\n /** OpenAI cloud (the canonical OpenAI-compatible API); registers under the `openai` provider. */\n public static openai(apiKey?: string, model?: string): OpenAICompatibleProviderAdapter {\n return new OpenAICompatibleProviderAdapter({\n provider: \"openai\",\n baseUrl: OPENAI_BASE_URL,\n defaultModel: model ?? OPENAI_DEFAULT_MODEL,\n ...(apiKey !== undefined ? { apiKey } : {})\n });\n }\n\n /**\n * A local Ollama server (keyless, `http://localhost:11434/v1`). Registers under the\n * `'mistral'` provider key so it routes through the same gateway slot as Mistral cloud.\n */\n public static ollama(model?: string, baseUrl?: string): OpenAICompatibleProviderAdapter {\n return new OpenAICompatibleProviderAdapter({\n provider: \"mistral\",\n baseUrl: baseUrl ?? OLLAMA_BASE_URL,\n defaultModel: model ?? OLLAMA_DEFAULT_MODEL\n });\n }\n\n public async complete(req: LLMRequest): Promise<LLMResponse> {\n const body = buildRequestBody(req, this.defaultModel);\n const raw = await this.port.send(body);\n return this.toResponse(req, body.model, raw);\n }\n\n public async *stream(req: LLMRequest): AsyncIterable<LLMStreamChunk> {\n // No incremental SSE seam here: complete once, then surface the text as a single\n // delta followed by a terminal chunk. Keeps the contract without faking streaming.\n const response = await this.complete(req);\n if (response.content.length > 0) {\n yield { delta: response.content, done: false };\n }\n yield { delta: \"\", done: true };\n }\n\n private toResponse(req: LLMRequest, model: string, raw: OpenAIChatResponse): LLMResponse {\n const choice = raw.choices[0];\n const content = choice?.message.content ?? \"\";\n\n const toolCalls: LLMToolCall[] = (choice?.message.tool_calls ?? []).map((call) => ({\n id: call.id,\n name: call.function.name,\n input: parseArguments(call.function.arguments)\n }));\n\n return {\n content,\n ...(toolCalls.length > 0 ? { toolCalls } : {}),\n ...(choice?.finish_reason != null ? { stopReason: choice.finish_reason } : {}),\n usage: {\n promptTokens: raw.usage?.prompt_tokens ?? 0,\n completionTokens: raw.usage?.completion_tokens ?? 0\n },\n model,\n provider: req.provider\n };\n }\n}\n\n/**\n * Map an {@link LLMRequest} to the OpenAI chat-completions body. Pure, so tests assert\n * on it directly. `req.system` folds in as the first `system` message; block content is\n * flattened pragmatically (text blocks joined; assistant `tool_use` blocks become\n * `tool_calls`; `tool_result` blocks become `role:'tool'` messages keyed by id).\n */\nexport const buildRequestBody = (req: LLMRequest, defaultModel: string): OpenAIChatRequestBody => {\n const messages: OpenAIChatMessage[] = [];\n\n if (req.system !== undefined && req.system.length > 0) {\n messages.push({ role: \"system\", content: req.system });\n }\n\n for (const message of req.messages) {\n messages.push(...mapMessage(message));\n }\n\n const body: OpenAIChatRequestBody = {\n model: resolveModel(req.model, defaultModel),\n messages\n };\n\n if (req.tools !== undefined && req.tools.length > 0) {\n body.tools = req.tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n ...(tool.description !== undefined ? { description: tool.description } : {}),\n parameters: tool.inputSchema\n }\n }));\n }\n\n if (req.temperature !== undefined) {\n body.temperature = req.temperature;\n }\n if (req.maxTokens !== undefined) {\n body.max_tokens = req.maxTokens;\n }\n\n return body;\n};\n\n/**\n * Expand one engine message into one or more OpenAI messages. A `tool_result` block\n * becomes its own `role:'tool'` message (OpenAI keeps tool outputs as standalone\n * messages), so a single engine turn carrying results can fan out to several.\n */\nconst mapMessage = (message: LLMRequest[\"messages\"][number]): OpenAIChatMessage[] => {\n if (typeof message.content === \"string\") {\n return [{ role: message.role, content: message.content }];\n }\n\n const toolResults = message.content.filter(\n (block): block is Extract<LLMContentBlock, { type: \"tool_result\" }> =>\n block.type === \"tool_result\"\n );\n const toolUses = message.content.filter(\n (block): block is Extract<LLMContentBlock, { type: \"tool_use\" }> => block.type === \"tool_use\"\n );\n const text = message.content\n .filter((block): block is Extract<LLMContentBlock, { type: \"text\" }> => block.type === \"text\")\n .map((block) => block.text)\n .join(\"\");\n\n const messages: OpenAIChatMessage[] = [];\n\n // tool_result blocks → standalone role:'tool' messages paired by tool_call_id.\n for (const result of toolResults) {\n messages.push({ role: \"tool\", content: result.content, tool_call_id: result.toolUseId });\n }\n\n // Assistant tool_use blocks → an assistant message carrying tool_calls.\n if (toolUses.length > 0) {\n messages.push({\n role: \"assistant\",\n content: text,\n tool_calls: toolUses.map((use) => ({\n id: use.id,\n type: \"function\" as const,\n function: { name: use.name, arguments: JSON.stringify(use.input ?? {}) }\n }))\n });\n } else if (toolResults.length === 0) {\n // Plain text-only block content: emit a single message preserving the role.\n messages.push({ role: message.role, content: text });\n } else if (text.length > 0) {\n // Mixed text alongside tool_result: keep the text as its own message.\n messages.push({ role: message.role, content: text });\n }\n\n return messages;\n};\n\n/** Keep an explicit model id; otherwise fall back to the provider default. */\nconst resolveModel = (model: string, defaultModel: string): string => {\n return looksLikeModelId(model) ? model : defaultModel;\n};\n\n/**\n * Heuristic for \"is this a real model id for this provider\" vs an agent placeholder\n * (e.g. `claude-opus-4-8`, `react-agent`). Anthropic ids and the agent's default Claude\n * model don't belong here, so route them onto the provider default instead.\n */\nconst looksLikeModelId = (model: string): boolean => {\n if (model.length === 0) return false;\n if (model.startsWith(\"claude-\")) return false;\n if (model === \"react-agent\" || model === \"mock\" || model === \"mock-model\") return false;\n return true;\n};\n\n/** Tool-call arguments arrive as a JSON string; parse defensively, default to `{}`. */\nconst parseArguments = (raw: string): unknown => {\n if (raw.length === 0) return {};\n try {\n return JSON.parse(raw);\n } catch {\n return {};\n }\n};\n\n/** Wraps global `fetch`. This is the only code that touches the network. */\nconst createDefaultPort = (baseUrl: string, apiKey?: string): OpenAICompatibleTransportPort => {\n const url = `${baseUrl.replace(/\\/$/, \"\")}/chat/completions`;\n return {\n async send(body) {\n const headers: Record<string, string> = { \"content-type\": \"application/json\" };\n if (apiKey !== undefined && apiKey.length > 0) {\n headers.authorization = `Bearer ${apiKey}`;\n }\n const res = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body)\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new LLMProviderError(res.status, text);\n }\n return (await res.json()) as OpenAIChatResponse;\n }\n };\n};\n","/**\n * Versioned prompt registry. Agents reference prompts by id (+ optional version)\n * instead of hardcoding them inline (rule 090). The `system` text is the immutable,\n * cacheable prefix — keep volatile/dynamic values out of it and pass those in the\n * per-call user message instead.\n */\nexport type PromptTemplate = {\n id: string;\n version: string;\n system: string;\n description?: string;\n};\n\nexport interface PromptRegistry {\n register(template: PromptTemplate): void;\n get(id: string, version?: string): PromptTemplate;\n list(): PromptTemplate[];\n}\n\nexport class PromptNotFoundError extends Error {\n public readonly promptId: string;\n public readonly version?: string;\n\n public constructor(promptId: string, version?: string) {\n super(\n version === undefined\n ? `No prompt registered for id '${promptId}'.`\n : `No prompt registered for id '${promptId}' at version '${version}'.`\n );\n this.name = \"PromptNotFoundError\";\n this.promptId = promptId;\n this.version = version;\n }\n}\n\nexport class InMemoryPromptRegistry implements PromptRegistry {\n private readonly byId = new Map<string, Map<string, PromptTemplate>>();\n private readonly latest = new Map<string, string>();\n\n public register(template: PromptTemplate): void {\n const versions = this.byId.get(template.id) ?? new Map<string, PromptTemplate>();\n versions.set(template.version, template);\n this.byId.set(template.id, versions);\n // Most recently registered version is the resolved default for `get` with no version.\n this.latest.set(template.id, template.version);\n }\n\n public get(id: string, version?: string): PromptTemplate {\n const versions = this.byId.get(id);\n if (versions === undefined) {\n throw new PromptNotFoundError(id);\n }\n const resolvedVersion = version ?? this.latest.get(id);\n if (resolvedVersion === undefined) {\n throw new PromptNotFoundError(id);\n }\n const template = versions.get(resolvedVersion);\n if (template === undefined) {\n throw new PromptNotFoundError(id, version);\n }\n return template;\n }\n\n public list(): PromptTemplate[] {\n return [...this.byId.values()].flatMap((versions) => [...versions.values()]);\n }\n}\n","import type { LLMProvider } from \"./types.js\";\n\n/**\n * An abstract capability tier. Wire-compatible (camelCase) with the Rust\n * `ModelTier` enum in `crates/llm-gateway`.\n */\nexport type ModelTier = \"frontier\" | \"balanced\" | \"fast\" | \"creative\";\n\n/** All four tiers, in declaration order — handy for seeding tables. */\nexport const MODEL_TIERS: readonly ModelTier[] = [\"frontier\", \"balanced\", \"fast\", \"creative\"];\n\n/**\n * The outcome of {@link ModelPolicy.resolve}: a concrete provider + model, plus\n * whether the model came from the recommended per-tier defaults (`true`) or from\n * an explicit override (`false`).\n */\nexport type ModelChoice = {\n provider: LLMProvider;\n model: string;\n recommended: boolean;\n};\n\n/** `tier -> model` for a single provider. */\nexport type TierModelTable = Record<ModelTier, string>;\n\n/** Optional override passed to {@link ModelPolicy.resolve}. */\nexport type ResolveOverride = {\n provider?: LLMProvider;\n model?: string;\n};\n\n/** The model fallback used when no provider is available at all. */\nexport const MOCK_MODEL = \"mock-model\";\n\n/**\n * The shared capability-tier contract defaults: the recommended model for each\n * provider at each tier. Mirrors the Rust `ModelPolicy::default` table exactly.\n */\nexport const DEFAULT_TIER_TABLE: Partial<Record<LLMProvider, TierModelTable>> = {\n anthropic: {\n frontier: \"claude-opus-4-8\",\n balanced: \"claude-sonnet-4-6\",\n fast: \"claude-haiku-4-5\",\n creative: \"claude-fable-5\"\n },\n mistral: {\n frontier: \"mistral-large-latest\",\n balanced: \"mistral-medium-latest\",\n fast: \"mistral-small-latest\",\n creative: \"mistral-large-latest\"\n },\n ollama: {\n frontier: \"mistral\",\n balanced: \"mistral\",\n fast: \"mistral\",\n creative: \"mistral\"\n }\n};\n\n/** The default cross-provider preference order, highest first. */\nexport const DEFAULT_PREFERENCE: readonly LLMProvider[] = [\"anthropic\", \"mistral\", \"ollama\"];\n\n/**\n * Capability-tier model policy: map an abstract capability tier\n * (`frontier` / `balanced` / `fast` / `creative`) onto a concrete\n * `{ provider, model }` choice, given which providers are actually available.\n *\n * Mirrors the Rust `crates/llm-gateway` `ModelPolicy` byte for byte in behaviour\n * and wire shape. The point: \"I only have Mistral\" -> every tier resolves to the\n * mistral column; \"only Anthropic\" -> `fast` -> haiku, `frontier` -> opus,\n * `creative` -> fable.\n */\nexport class ModelPolicy {\n private readonly table: Partial<Record<LLMProvider, TierModelTable>>;\n private readonly preference: readonly LLMProvider[];\n\n /**\n * Construct a policy. Either argument may be omitted to keep the contract\n * default for that piece.\n */\n public constructor(options?: {\n table?: Partial<Record<LLMProvider, TierModelTable>>;\n preference?: readonly LLMProvider[];\n }) {\n this.table = options?.table ?? DEFAULT_TIER_TABLE;\n this.preference = options?.preference ?? DEFAULT_PREFERENCE;\n }\n\n /**\n * Which providers are usable given the current process environment:\n * `anthropic` iff `ANTHROPIC_API_KEY` is set; `mistral` iff `MISTRAL_API_KEY`\n * is set; `ollama` iff `AILU_USE_OLLAMA=1`. Order follows the policy\n * preference so callers get a deterministic list.\n */\n public availableFromEnv(env: NodeJS.ProcessEnv = process.env): LLMProvider[] {\n const anthropic = isPresent(env.ANTHROPIC_API_KEY);\n const mistral = isPresent(env.MISTRAL_API_KEY);\n const ollama = env.AILU_USE_OLLAMA === \"1\";\n\n return this.preference.filter((p) => {\n if (p === \"anthropic\") return anthropic;\n if (p === \"mistral\") return mistral;\n if (p === \"ollama\") return ollama;\n return false;\n });\n }\n\n /**\n * Resolve a capability tier to a concrete `{ provider, model, recommended }`.\n *\n * - An explicit `override.provider` and/or `override.model` wins, with\n * `recommended = false`. When only one of the two is given, the other is\n * filled from the policy: an override provider maps the tier to that\n * provider's recommended model; an override model rides on the first\n * available provider (or the override provider if also given).\n * - Otherwise the highest-preference provider that is both available and\n * present in the table supplies its tier model, with `recommended = true`.\n * - If nothing is available, the mock provider is returned.\n */\n public resolve(\n tier: ModelTier,\n available: readonly LLMProvider[],\n override?: ResolveOverride\n ): ModelChoice {\n const overrideProvider = override?.provider;\n const overrideModel = override?.model;\n\n // An explicit override (provider and/or model) takes precedence and is never\n // flagged as a recommended default.\n if (overrideProvider !== undefined || overrideModel !== undefined) {\n const provider = overrideProvider ?? this.firstAvailable(available) ?? \"mock\";\n const model = overrideModel ?? this.modelFor(provider, tier) ?? MOCK_MODEL;\n return { provider, model, recommended: false };\n }\n\n // No override: walk the preference order and take the first available\n // provider that can serve this tier.\n for (const provider of this.preference) {\n if (available.includes(provider)) {\n const model = this.modelFor(provider, tier);\n if (model !== undefined) {\n return { provider, model, recommended: true };\n }\n }\n }\n\n // Nothing available -> mock.\n return { provider: \"mock\", model: MOCK_MODEL, recommended: false };\n }\n\n /** The recommended model for a provider+tier from the table, if present. */\n private modelFor(provider: LLMProvider, tier: ModelTier): string | undefined {\n return this.table[provider]?.[tier];\n }\n\n /** The first preference-ordered provider that is in `available`. */\n private firstAvailable(available: readonly LLMProvider[]): LLMProvider | undefined {\n return this.preference.find((p) => available.includes(p));\n }\n}\n\nfunction isPresent(value: string | undefined): boolean {\n return value !== undefined && value !== \"\";\n}\n","import { ReActAgent, type AgentId, type ToolRegistry } from \"@ailu-ai/agents-core\";\nimport {\n InMemoryPromptRegistry,\n ModelPolicy,\n type LLMGateway,\n type LLMProvider,\n type ModelTier,\n type PromptRegistry\n} from \"@ailu-ai/llm-gateway\";\nimport { assertKnownProvider, toModelSpec, type ModelLike, type ModelSpec } from \"@ailu-ai/model-core\";\nimport { createToolNode, DynamicInterrupt, type NodeHandler } from \"@ailu-ai/graph-runtime\";\n// Type-only: keeps the ApprovalEngine contract without pulling its Pg/db implementation\n// (and a `pg` dependency) into consumers such as the Studio bundle.\nimport type { ApprovalEngine, ApprovalId } from \"@ailu-ai/approval-engine\";\nimport type { NodeId, RunId } from \"@ailu-ai/graph-core\";\nimport { AiluSdkError, GovernanceMiddlewareRejectedError } from \"./errors.js\";\n\n/** Default channel an agent node writes its {@link import(\"@ailu-ai/agents-core\").AgentResult} into. */\nexport const DEFAULT_AGENT_OUTPUT_CHANNEL = \"agentResult\";\n\n/**\n * Channel holding the names of tools whose human approval has been granted. The\n * control plane writes it (see `CompiledGraph.approveAndResume`) before resuming a\n * run that suspended for approval; the agent then executes those tools.\n */\nexport const APPROVED_TOOLS_CHANNEL = \"__approvedTools\";\n\n/** Reason carried by the dynamic interrupt an agent node raises when it needs approval. */\nexport const AGENT_APPROVAL_INTERRUPT = \"agent-approval-required\";\n\n/**\n * Channel holding the ApprovalEngine request ids created when a run suspends for\n * approval. On resume the node looks each up; the ones the engine reports as\n * `approved` unlock their tools — the engine is the source of truth, not a flag.\n */\nexport const APPROVAL_IDS_CHANNEL = \"__approvalIds\";\n\nconst TOOL_SUBJECT_PREFIX = \"tool:\";\n\n/** Where an agent node gets its system prompt. */\nexport type AgentPromptSource =\n | { registry: PromptRegistry; id: string; version?: string }\n /** Inline convenience: the SDK registers this string and references it by id. */\n | { system: string };\n\n/**\n * Governed long-term memory overlay for an agent node (ADR 0026 phase 11). `namespace` is the\n * tenant-scoped memory partition; `topK`/`recall` tune retrieval. The principal is sealed by the\n * engine. The OSS engine recalls/persists in-memory; the control plane swaps a Neo4j-backed store\n * (native vector index + entity graph) behind the same seam.\n */\nexport type MemoryConfig = {\n namespace: string;\n topK?: number;\n recall?: \"vector\" | \"graph\" | \"both\";\n};\n\n/**\n * Governed skills overlay for an agent node (ADR 0035 phase 12) — progressive disclosure for deep\n * agents. The engine selects skills (explicit `required` pins by `name@version` + advisory vector\n * top-k over descriptions, capped by `advisoryK`) from this `namespace` before the run and prepends\n * their bodies to the seed. The `namespace` is tenant-scoped (sealed by the engine); a skill that\n * grants capability (`requires`) stays withheld until granted. Applies to this agent AND its\n * `mapAgents`/`taskNode` sub-agents (same build path → deepagents parity). The OSS engine selects\n * from an in-memory registry; the control plane swaps a Postgres-backed store behind the same seam.\n */\nexport type SkillConfig = {\n namespace: string;\n /** Explicit `name@version` pins — the must-apply playbooks, always loaded (when granted). */\n required?: string[];\n /** Cap on advisory (vector-selected) skills. Default 3; 0 = pins only. */\n advisoryK?: number;\n};\n\n/**\n * One skill RECORD supplied by the control plane for a run (ADR 0049 B-3) — the store contents the\n * engine builds its run-scoped `SkillStore` from. Matches Rust `Skill` (camelCase). `description` is the\n * always-resident L1 index; `body` is the on-demand L2; `requires` are approval-gated capability keys.\n * `allowedTools`/`license`/`metadata` are open-standard SKILL.md fields (ADR 0065 D1) — stored and\n * round-tripped through import/export, but `allowedTools` is NOT enforced by `SkillMiddleware` yet\n * (distinct from `requires`, which is the actual capability gate).\n */\nexport type SkillRecord = {\n name: string;\n version: string;\n namespace: string;\n description: string;\n body?: string;\n requires?: string[];\n allowedTools?: string[];\n license?: string;\n metadata?: Record<string, unknown>;\n resources?: Array<{ kind?: string; ref: string }>;\n};\n\n/** Config for {@link GraphBuilder.agentNode}. */\nexport type AgentNodeConfig = {\n /**\n * @deprecated Ignored: the engine calls the model itself. Use {@link AgentNodeConfig.model}\n * (`model.openai(\"gpt-4o\")`), and `AILU_LLM_MOCK=1` to run offline.\n */\n llm?: LLMGateway;\n prompt: AgentPromptSource;\n tools?: ToolRegistry;\n /**\n * @deprecated Use {@link AgentNodeConfig.model}: `model.openai(\"gpt-4o\")` or `\"openai:gpt-4o\"`.\n * An unknown provider throws `UnknownProviderError`.\n */\n provider?: LLMProvider;\n /**\n * The model to run: `model.openai(\"gpt-4o\")`, `model.fast`, or a `\"provider:model\"` string\n * (`\"openai:gpt-4o\"`). A bare model id without a provider runs on Anthropic. The model's\n * provider and tier win over the deprecated flat `provider`/`tier` fields.\n */\n model?: string | ModelLike;\n /**\n * @deprecated Use a tier model: `model.fast`, `model.mistral.frontier`. Capability tier\n * (`\"frontier\" | \"balanced\" | \"fast\" | \"creative\"`), resolved by the engine against the\n * provider keys present in the environment.\n */\n tier?: ModelTier;\n /**\n * A named {@link AgentProfile} (`\"fast\" | \"frontier-careful\" | \"governed-deep\"`, ADR 0025\n * phase 3d) that sets the model tier, efficiency middleware, and suspend/fs defaults in one\n * shot. Explicit fields (`tier`, `suspendForApproval`, `enableFs`, `middleware`, the flat\n * `outputStyle`/`contextBudget` knobs) always override the profile's defaults. The governed\n * layer (redaction, approval gate, fs policy) is identical regardless of profile.\n */\n profile?: AgentProfile;\n /**\n * Extra EFFICIENCY middleware to append (ADR 0025 phase 3d), e.g. `[{ kind: \"compress\" }]`.\n * Efficiency-only by type: governance kinds (redact / approval gate / fs policy) are\n * engine-injected and rejected here ({@link GovernanceMiddlewareRejectedError}), so an\n * ungoverned stack is unrepresentable. Merged after the profile + the flat knobs, with\n * an explicit entry of the same `kind` winning (dedup, last-writer).\n */\n middleware?: EfficiencyMiddlewareSpec[];\n maxIterations?: number;\n name?: string;\n description?: string;\n /** Channel that receives the agent's result. Defaults to {@link DEFAULT_AGENT_OUTPUT_CHANNEL}. */\n outputChannel?: string;\n /**\n * Token-efficiency (ADR 0014). `\"terse\"` appends a compact-output directive to the\n * system prompt — cuts output tokens on **prose** stages (lossy; not for code). Default off.\n */\n outputStyle?: \"terse\";\n /**\n * Cap (in chars) on the agent's seed message — the injected `Input: <input>\\nState:\n * <state>` dump — to avoid re-feeding an unbounded channel map to every agent. The cap\n * covers the whole seed message (ADR 0014 intent), not the `State` portion alone. Default: no cap.\n */\n contextBudget?: number;\n /**\n * Durable channel the agent's `writeTodos` list is persisted into (ADR 0022/0023,\n * phase 1). When set and the agent has the `writeTodos` tool, the engine writes the\n * authoritative todo list here in the same checkpointed update as the result, so\n * downstream nodes can read the plan. Default: no durable sink (the list still\n * appears in the result). Conventionally {@link import(\"@ailu-ai/agents-core\").TODOS_CHANNEL} (`\"__todos\"`).\n */\n todosChannel?: string;\n /**\n * Channel carrying this run's multimodal input (ADR 0030 phase 9e): a `ContentBlock[]`\n * value (`{ type: \"image\" | \"audio\" | \"file\", source }` + optional `{ type: \"text\" }`).\n * When set, the agent's seed message becomes multimodal — a text Input/State digest plus\n * the media blocks — and this channel is excluded from the stringified State (so binary\n * bytes are never re-fed as text). Seed the channel via the run's `initialData`. Default:\n * text-only seed.\n */\n inputBlocksChannel?: string;\n /** The only channels the agent is shown in its seed state (context isolation); default all. */\n visibleChannels?: string[];\n /**\n * Governed long-term memory (ADR 0026 phase 11). When set, the engine recalls from this\n * namespace before the run (vector) and persists the run's reasoning after, attributed. The\n * `namespace` is tenant-scoped (the control plane validates access) and the principal is\n * sealed by the engine — never user-routable. `topK`/`recall` tune retrieval quality.\n */\n memory?: MemoryConfig;\n /**\n * Governed skills — progressive disclosure (ADR 0035 phase 12). When set, the engine selects\n * skills (explicit `required` pins + advisory vector top-k) from this `namespace` before the run\n * and prepends their bodies to the seed. Capability-granting (`requires`) skills are withheld\n * until granted. Applies to `mapAgents`/`taskNode` sub-agents too (deepagents parity).\n */\n skills?: SkillConfig;\n /**\n * Opt this agent into the governed virtual filesystem tools (ADR 0024 phase 2b):\n * `read_file`/`ls`/`glob`/`grep`/`write_file`/`edit_file`/`delete_file`/`move_file`,\n * run-scoped over a versioned artifact store and enforced by the graph's\n * {@link GraphBuilder.fsPolicy} (fail-closed read-only by default). Default off.\n */\n enableFs?: boolean;\n /**\n * When true, the node suspends the whole run (a dynamic interrupt) the moment the\n * agent needs approval, instead of just flagging `requiresHumanReview`. Resume with\n * `CompiledGraph.approveAndResume(runId, { approvedTools })` to continue. Default false.\n */\n suspendForApproval?: boolean;\n /**\n * @deprecated Removed: a graph that sets it fails to compile. Use `suspendForApproval` with\n * `approveAndResume`, or pass the engine to the catalog runner:\n * `runCatalogGraph(app.definition, { approvalEngine })`.\n */\n approvalEngine?: ApprovalEngine;\n label?: string;\n};\n\n/**\n * A signed-off agent profile (ADR 0025 phase 3d) — a named bundle that expands to a model\n * tier, an efficiency-middleware set, and suspend/fs defaults. The GOVERNED layer (PII\n * redaction, the approval gate, fs policy) is identical across all profiles — you cannot\n * \"buy out\" of governance. Explicit `tier`/`suspendForApproval`/`enableFs`/`middleware` on\n * the config always win over the profile's defaults.\n *\n * - `fast` — `fast` tier, full efficiency (compress + terse + tight 4k context budget), no\n * suspend. For high-throughput, low-stakes prose work.\n * - `frontier-careful` — `frontier` tier, NO compression (preserve fidelity), a roomy 16k\n * budget, reflection, suspend-on-approval. For high-stakes reasoning where lossy compression\n * is unsafe.\n * - `governed-deep` — the deep-agent one-liner: `balanced` tier, full efficiency (12k budget),\n * reflection, suspend-on-approval, and the governed virtual filesystem enabled.\n */\nexport type AgentProfile = \"fast\" | \"frontier-careful\" | \"governed-deep\";\n\n/**\n * An EFFICIENCY / quality middleware a user may append to an agent (ADR 0025 phase 3d/3e). The\n * governance kinds (`redact` / `approvalGate` / `fsPolicy`) are deliberately NOT part of this\n * union — they are engine-injected and sealed, so a user cannot express an ungoverned stack\n * (the governed-by-construction invariant). `retry` / `rateLimit` stay deferred (retry belongs\n * at the gateway; a rate-limit delay would conflict with the engine's determinism).\n *\n * - `compress` — route messages through the prompt-compression service (no-op if unconfigured).\n * - `terse` — append a compact-output directive to the system prompt (lossy; prose only).\n * - `contextBudget` — cap the agent's seed message (the injected `Input`/`State` dump) to `chars` characters.\n * - `reflection` — one self-critique after the run (ADR 0025 phase 3e): a weak result is flagged in\n * the reasoning (`reflection:needs_review:<issues>`) for observability / downstream routing (a\n * conditional edge can gate on it). It does NOT set `requiresHumanReview` — that would re-suspend\n * forever on resume. Additive — the full critique→revise loop stays the standalone reflection\n * node. `threshold` (0..1, default 0.8) is the acceptance bar.\n * - `structuredOutput` — constrain the agent's output to a JSON Schema (ADR 0029 phase 8). The\n * engine sets the provider's native constraint (OpenAI `response_format`, Anthropic forced tool,\n * Gemini `responseSchema`) AND validates the result in-engine (the floor). The validated value\n * lands on `AgentResult.structuredOutput`. `mode: \"required\"` (default) fails closed with a typed\n * error after `retryCap` (default 2) deterministic re-prompts; `mode: \"lenient\"` falls back to raw\n * text. It is an EFFICIENCY kind (output-shaping), and the approval gate stays intrinsic — so it\n * cannot route around governance.\n */\nexport type EfficiencyMiddlewareSpec =\n | { kind: \"compress\" }\n | { kind: \"terse\" }\n | { kind: \"contextBudget\"; params: { chars: number } }\n | { kind: \"reflection\"; params?: { threshold?: number } }\n | {\n kind: \"structuredOutput\";\n params: {\n schema: Record<string, unknown>;\n name?: string;\n strict?: boolean;\n mode?: \"required\" | \"lenient\";\n retryCap?: number;\n };\n };\n\n/**\n * Governance middleware kinds the SDK rejects in {@link AgentNodeConfig.middleware}: they are\n * engine-injected (the GOVERNED layer), never user-supplied. Shared so the SDK throw-gate and\n * the contracts efficiency-only schema list the SAME kinds (they cannot drift). Passing one to\n * the builder throws `GovernanceMiddlewareRejectedError`. (The runtime enforcer on the Rust\n * side is independent: the bridge match only honours efficiency kinds and ignores these.)\n */\nexport const GOVERNANCE_MIDDLEWARE_KINDS = [\"redact\", \"approvalGate\", \"fsPolicy\"] as const;\n\n/** A filesystem permission verb (ADR 0024): `deny` < `read` < `gate` < `write`. */\nexport type FsPermVerb = \"deny\" | \"read\" | \"write\" | \"gate\";\n\n/**\n * A per-path filesystem permission rule (ADR 0024 phase 2b): a glob (`*` within a\n * path segment, `**` across) mapped to a verb. Compiled into the run's fail-closed\n * path policy ({@link GraphBuilder.fsPolicy}). An unmatched path resolves to `read`.\n */\nexport type FsPolicyRule = { glob: string; verb: FsPermVerb };\n\n/**\n * Config for {@link GraphBuilder.mapAgents} — a dynamic fan-out (ADR 0027 phase 4b): run\n * `subAgent` once per item in the `overChannel` array, concurrently, and write the per-item\n * results — in input order (deterministic) — into `joinAt` as an array. Each spawn gets one item\n * as its input and shares the run's channels.\n */\nexport type MapAgentNodeConfig = {\n /** Channel holding the array of items to map the sub-agent over. */\n overChannel: string;\n /** The sub-agent to run per item (its own ReAct agent config). */\n subAgent: AgentNodeConfig;\n /** Channel the array of per-item results lands in (one entry per item, in input order). */\n joinAt: string;\n /** When true, a spawn that needs approval suspends the whole map (default false). */\n suspendForApproval?: boolean;\n label?: string;\n};\n\n/** The wire projection of a {@link MapAgentNodeConfig} the Rust bridge consumes (`map_agents`). */\nexport type RustMapAgentConfig = {\n overChannel: string;\n joinAt: string;\n agent: RustAgentConfig;\n suspendForApproval: boolean;\n};\n\n/** Config for {@link GraphBuilder.toolNode}. */\nexport type ToolNodeConfig = {\n tools: ToolRegistry;\n /** Execute all tool calls concurrently instead of sequentially. */\n parallel?: boolean;\n label?: string;\n};\n\n/**\n * Config for {@link GraphBuilder.taskNode} — spawn a sub-agent in an isolated context\n * that returns a single compressed report (ADR 0022/0023, phase 1). The spawn is sugar\n * over a one-node subgraph, so it inherits the runtime's guarantees: checkpointed,\n * audited, and human-gate-preserving (a sub-agent that suspends for approval suspends\n * the whole run).\n */\nexport type TaskNodeConfig = {\n /** The sub-agent to spawn (its own ReAct agent config). */\n subAgent: AgentNodeConfig;\n /**\n * The channel that feeds the sub-agent its objective — the ONLY channel projected\n * into the child (isolation). Default `\"objective\"`.\n */\n objectiveChannel?: string;\n /**\n * The channel the sub-agent's report lands in — the ONLY channel projected back to\n * the parent (a single value out). Default `\"report\"`.\n */\n reportChannel?: string;\n /**\n * Run the sub-agent with `outputStyle: \"terse\"` so the report is a summary, not a\n * full transcript. Default true.\n */\n compress?: boolean;\n label?: string;\n};\n\n/**\n * A tool's name plus its TS `execute` fn — the data the Rust bridge needs to back a\n * `jsToolName` with a JS callback. The Rust engine never imports the tool registry;\n * it calls this `execute` over the napi seam (`on_node` with `kind:\"tool\"`).\n */\nexport type RustToolBinding = {\n name: string;\n execute: (input: unknown) => Promise<unknown>;\n};\n\n/**\n * How one of an agent's tools is advertised to the LLM (→ Rust `AgentSpec.toolSpecs`): the tool's\n * `description` and the JSON Schema of its input (`ToolDefinition.jsonSchema`). Serializable, so\n * it also rides the persisted agent carrier.\n */\nexport type RustToolSpec = {\n name: string;\n description?: string;\n jsonSchema?: Record<string, unknown>;\n};\n\n/**\n * The serializable shape of an agent node, plus its JS-backed tool executes, that\n * the Rust engine bridge consumes (see `EngineSpec.agents` / `jsToolNames`). It is a\n * pure projection of {@link AgentNodeConfig} — the system prompt is the *resolved*\n * string (never a registry reference), since the bridge has no prompt registry.\n *\n * The LLM gateway itself is **not** carried: the Rust agent path builds its own\n * gateway (env adapters or a deterministic mock). A graph whose agents rely on a\n * specific TS `AgentNodeConfig.llm` therefore keeps its semantics only on the TS\n * engine; the Rust path is opt-in for agents (see `CompiledGraph`).\n */\nexport type RustAgentConfig = {\n provider: string;\n model?: string;\n /**\n * Abstract capability tier carried to the Rust `AgentSpec.tier`. When set with no\n * explicit `model`, the Rust bridge resolves the concrete model via `ModelPolicy`\n * against the process env. An explicit `model` always wins.\n */\n tier?: ModelTier;\n /**\n * A custom OpenAI-compatible endpoint (`model.openaiCompatible({ baseURL })`). The Rust bridge\n * serves the agent through the OpenAI-wire adapter at this URL, with the key read only from\n * {@link apiKeyEnv} (never `OPENAI_API_KEY`).\n */\n baseURL?: string;\n /** Env var holding the key for {@link baseURL}; unset means a keyless endpoint. */\n apiKeyEnv?: string;\n /** Resolved system prompt string. */\n system?: string;\n toolNames: string[];\n /** What the LLM is told about each tool: its description and input JSON Schema. */\n toolSpecs?: RustToolSpec[];\n maxIterations?: number;\n suspendForApproval: boolean;\n /** Tools (by name) requiring approval — those marked `requiresApproval`. */\n approvalToolNames: string[];\n outputChannel: string;\n /** ADR 0014 — terse output directive on the system prompt. */\n outputStyle?: \"terse\";\n /** ADR 0014 — cap (chars) on the injected seed message (the `Input`/`State` dump). */\n contextBudget?: number;\n /** ADR 0022/0023 — durable channel the `writeTodos` list is persisted into. */\n todosChannel?: string;\n /** ADR 0030 phase 9e — channel carrying the run's multimodal input blocks. */\n inputBlocksChannel?: string;\n /** The only channels the agent is shown in its seed state (context isolation); default all. */\n visibleChannels?: string[];\n /** ADR 0026 phase 11 — governed long-term memory overlay. */\n memory?: MemoryConfig;\n /** ADR 0035 phase 12 — governed skills (progressive disclosure) overlay. */\n skills?: SkillConfig;\n /** ADR 0024 phase 2b — opt this agent into the governed virtual filesystem tools. */\n enableFs?: boolean;\n /**\n * ADR 0025 phase 3d — the SDK-resolved EFFICIENCY middleware list: the profile + explicit\n * `middleware[]` + the legacy `outputStyle`/`contextBudget` knobs expanded into one ordered\n * list of `{ kind, params }` data entries the Rust bridge turns into `push_efficiency`\n * calls. The governed layer is never carried here (the bridge injects it). Always present\n * (possibly empty) on the live builder path; absent on a pre-3d persisted carrier (the Rust\n * bridge then falls back to the legacy flat knobs).\n */\n resolvedMiddleware?: EfficiencyMiddlewareSpec[];\n /** JS-backed tool executes, one per tool in the registry. */\n toolBindings: RustToolBinding[];\n /**\n * SDK-only (never serialized to the wire): whether this agent node sets the removed\n * `approvalEngine` option, which makes the graph fail to compile (see `CompiledGraph`).\n */\n usesApprovalEngine: boolean;\n};\n\n/**\n * The approval binding an agent node contributes to {@link CompiledGraph}: the principal that\n * *requests* approvals on this node's behalf (`config.name ?? nodeId`) and the names of its\n * approval-gated tools. {@link CompiledGraph.approveAndResume} uses it to stamp each granted\n * tool's `requestedBy` for the engine's no-self-approval check.\n */\nexport type AgentApprovalBinding = {\n approvalEngine?: ApprovalEngine;\n requestedBy: string;\n approvalToolNames: string[];\n};\n\n/** Project an {@link AgentNodeConfig} into its {@link AgentApprovalBinding}. */\nexport const toAgentApprovalBinding = (\n nodeId: string,\n config: AgentNodeConfig\n): AgentApprovalBinding => ({\n approvalEngine: config.approvalEngine,\n requestedBy: config.name ?? nodeId,\n approvalToolNames: approvalToolNamesOf(config.tools)\n});\n\n/** Pull every tool's name + `execute` out of a registry, for the Rust tool seam. */\nconst toolBindingsOf = (tools: ToolRegistry | undefined): RustToolBinding[] => {\n if (tools === undefined) {\n return [];\n }\n return tools.list().map((definition) => {\n const resolved = tools.resolve(definition.id);\n const execute = resolved?.handler ?? (async () => ({}));\n return { name: definition.name, execute: (input: unknown) => execute(input) };\n });\n};\n\n/** Each tool's description and input JSON Schema, as the LLM should see them. */\nconst toolSpecsOf = (tools: ToolRegistry | undefined): RustToolSpec[] =>\n tools?.list().map((definition) => ({\n name: definition.name,\n description: definition.description,\n jsonSchema: definition.jsonSchema\n })) ?? [];\n\n/** Tool names whose definition is flagged `requiresApproval`. */\nconst approvalToolNamesOf = (tools: ToolRegistry | undefined): string[] => {\n if (tools === undefined) {\n return [];\n }\n return tools\n .list()\n .filter((definition) => definition.requiresApproval === true)\n .map((definition) => definition.name);\n};\n\n/**\n * The signed-off {@link AgentProfile} expansion table (ADR 0025 phase 3d). Each profile is a\n * named data bundle of a model tier, suspend/fs defaults, and an ordered efficiency-middleware\n * list. The governed layer is identical across all three. `governed-deep → balanced` is the\n * ADR-literal tier (decision confirmed 2026-06-23). Reflection is ADR phase 3e, so it is not\n * yet part of any profile's middleware.\n */\nconst PROFILES: Record<\n AgentProfile,\n {\n tier: ModelTier;\n suspendForApproval: boolean;\n enableFs: boolean;\n middleware: EfficiencyMiddlewareSpec[];\n }\n> = {\n fast: {\n tier: \"fast\",\n suspendForApproval: false,\n enableFs: false,\n middleware: [{ kind: \"compress\" }, { kind: \"terse\" }, { kind: \"contextBudget\", params: { chars: 4000 } }]\n },\n \"frontier-careful\": {\n tier: \"frontier\",\n suspendForApproval: true,\n enableFs: false,\n // No compression — lossy compression is unsafe for high-stakes reasoning. Reflection\n // escalates a weak answer to human review (ADR 0025 phase 3e).\n middleware: [{ kind: \"contextBudget\", params: { chars: 16000 } }, { kind: \"reflection\" }]\n },\n \"governed-deep\": {\n tier: \"balanced\",\n suspendForApproval: true,\n enableFs: true,\n middleware: [\n { kind: \"compress\" },\n { kind: \"terse\" },\n { kind: \"contextBudget\", params: { chars: 12000 } },\n { kind: \"reflection\" }\n ]\n }\n};\n\n/**\n * Resolve suspend-on-approval, honouring the {@link AgentProfile} default when the config\n * leaves it unset (an explicit `suspendForApproval`, including `false`, always wins). Shared\n * by {@link toRustAgentConfig} (the Rust/persisted path) and {@link createAgentNodeHandler}\n * (the TS handler) so the two cannot disagree on a profile's human-gate default.\n */\nconst resolveSuspendForApproval = (\n config: Pick<AgentNodeConfig, \"suspendForApproval\" | \"profile\">\n): boolean =>\n config.suspendForApproval ??\n (config.profile !== undefined ? PROFILES[config.profile].suspendForApproval : false);\n\n/**\n * Desugar an agent config's {@link AgentProfile} + flat `outputStyle`/`contextBudget` knobs +\n * explicit {@link AgentNodeConfig.middleware} into ONE ordered EFFICIENCY-middleware list (ADR\n * 0025 phase 3d). Precedence (most specific wins): profile → flat knobs → explicit middleware,\n * deduped by `kind` keeping the last writer. Throws {@link GovernanceMiddlewareRejectedError}\n * if an explicit entry names a governance kind — the SDK's authoritative live-path reject gate.\n */\nconst resolveMiddleware = (config: AgentNodeConfig): EfficiencyMiddlewareSpec[] => {\n // Insertion order is preserved by Map; re-`set`ting a kind updates the value in place\n // (last-writer-wins) without changing its position — order among efficiency hooks is\n // immaterial (they act on disjoint parts of the request).\n const byKind = new Map<string, EfficiencyMiddlewareSpec>();\n if (config.profile !== undefined) {\n for (const middleware of PROFILES[config.profile].middleware) {\n byKind.set(middleware.kind, middleware);\n }\n }\n if (config.outputStyle === \"terse\") {\n byKind.set(\"terse\", { kind: \"terse\" });\n }\n if (typeof config.contextBudget === \"number\") {\n byKind.set(\"contextBudget\", { kind: \"contextBudget\", params: { chars: config.contextBudget } });\n }\n for (const middleware of config.middleware ?? []) {\n if ((GOVERNANCE_MIDDLEWARE_KINDS as readonly string[]).includes(middleware.kind)) {\n throw new GovernanceMiddlewareRejectedError(middleware.kind);\n }\n byKind.set(middleware.kind, middleware);\n }\n return [...byKind.values()];\n};\n\n/**\n * Project an {@link AgentNodeConfig} into the {@link RustAgentConfig} the Rust engine\n * bridge consumes. Resolves the system prompt to a concrete string, pulls the tool\n * names / approval flags / executes out of the registry, and desugars the profile +\n * middleware into a {@link RustAgentConfig.resolvedMiddleware} list. Pure — no LLM call.\n */\nexport const toRustAgentConfig = (nodeId: string, config: AgentNodeConfig): RustAgentConfig => {\n // A provider Ailu doesn't know fails here, never a silent fallback to another provider.\n if (config.provider !== undefined && config.provider !== \"mock\") {\n assertKnownProvider(config.provider);\n }\n const { registry, id, version } = resolvePrompt(nodeId, config.prompt);\n let system: string | undefined;\n try {\n system = registry.get(id, version).system;\n } catch {\n system = undefined;\n }\n // A profile supplies tier / suspend / fs defaults; an explicit field always wins.\n const profile = config.profile !== undefined ? PROFILES[config.profile] : undefined;\n // ADR 0031: a `model` overlay (ModelSpec/Model) carries its own provider/model/tier and wins\n // over the flat provider/model/tier aliases. A `\"provider:model\"` string is parsed like\n // `model(\"provider:model\")`; a bare string without a provider stays a legacy model id.\n const spec = toAgentModelSpec(config.model);\n const modelId = spec !== undefined ? spec.model : typeof config.model === \"string\" ? config.model : undefined;\n return {\n // A model overlay names its provider, or leaves it blank for a tier-only model (`model.fast`):\n // the engine then picks the provider from the keys present. A named provider is binding.\n provider: spec !== undefined ? (spec.provider ?? config.provider ?? \"\") : (config.provider ?? \"anthropic\"),\n model: modelId,\n tier: spec?.tier ?? config.tier ?? profile?.tier,\n baseURL: spec?.baseURL,\n apiKeyEnv: spec?.apiKeyEnv,\n system,\n toolNames: config.tools?.list().map((definition) => definition.name) ?? [],\n toolSpecs: toolSpecsOf(config.tools),\n maxIterations: config.maxIterations,\n suspendForApproval: resolveSuspendForApproval(config),\n approvalToolNames: approvalToolNamesOf(config.tools),\n outputChannel: config.outputChannel ?? DEFAULT_AGENT_OUTPUT_CHANNEL,\n outputStyle: config.outputStyle,\n contextBudget: config.contextBudget,\n todosChannel: config.todosChannel,\n inputBlocksChannel: config.inputBlocksChannel,\n visibleChannels: config.visibleChannels,\n memory: config.memory,\n skills: config.skills,\n enableFs: config.enableFs ?? profile?.enableFs,\n resolvedMiddleware: resolveMiddleware(config),\n toolBindings: toolBindingsOf(config.tools),\n usesApprovalEngine: config.approvalEngine !== undefined\n };\n};\n\n/**\n * The {@link ModelSpec} an agent's `model` field declares: a model overlay, or a\n * `\"provider:model\"` / `\"provider:tier\"` string (an unknown provider fails loud). `undefined` for\n * no model or a bare legacy model id.\n */\nconst toAgentModelSpec = (value: AgentNodeConfig[\"model\"]): ModelSpec | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"object\") return toModelSpec(value);\n return value.includes(\":\") ? toModelSpec(value) : undefined;\n};\n\n/**\n * The serializable agent carrier persisted on `node.metadata.agent` (and on a `mapAgents`\n * node's `subAgent`): every wire field of the {@link RustAgentConfig}, never the tool closures,\n * so the saved GraphDefinition runs the same on the catalog path (`runCatalogGraph`).\n */\nexport const toAgentCarrier = (config: RustAgentConfig): Record<string, unknown> => ({\n provider: config.provider,\n model: config.model,\n tier: config.tier,\n baseURL: config.baseURL,\n apiKeyEnv: config.apiKeyEnv,\n system: config.system,\n toolNames: config.toolNames,\n toolSpecs: config.toolSpecs,\n maxIterations: config.maxIterations,\n suspendForApproval: config.suspendForApproval,\n approvalToolNames: config.approvalToolNames,\n outputChannel: config.outputChannel,\n outputStyle: config.outputStyle,\n contextBudget: config.contextBudget,\n todosChannel: config.todosChannel,\n inputBlocksChannel: config.inputBlocksChannel,\n visibleChannels: config.visibleChannels,\n memory: config.memory,\n skills: config.skills,\n enableFs: config.enableFs,\n resolvedMiddleware: config.resolvedMiddleware\n});\n\nconst resolvePrompt = (\n nodeId: string,\n prompt: AgentPromptSource\n): { registry: PromptRegistry; id: string; version?: string } => {\n if (\"system\" in prompt) {\n // Even inline prompts are referenced by id, never hardcoded into the agent —\n // we register the string under a deterministic id and hand back a reference.\n const registry = new InMemoryPromptRegistry();\n const id = `sdk.agent.${nodeId}.system`;\n registry.register({ id, version: \"1.0.0\", system: prompt.system });\n return { registry, id, version: \"1.0.0\" };\n }\n return { registry: prompt.registry, id: prompt.id, version: prompt.version };\n};\n\n/** Config for {@link streamAgentTokens}. */\nexport type StreamAgentConfig = {\n llm: LLMGateway;\n prompt: AgentPromptSource;\n provider?: LLMProvider;\n model?: string;\n};\n\n/**\n * Stream an agent's reply token by token through the gateway's `stream()`. This is\n * the single-turn (no-tools) path — ideal for a chat UI that wants live output.\n * Yields text deltas as they arrive and returns when the provider signals done.\n *\n * ```ts\n * for await (const delta of streamAgentTokens({ llm, prompt: { system } }, \"Bonjour ?\")) {\n * process.stdout.write(delta);\n * }\n * ```\n */\nexport async function* streamAgentTokens(config: StreamAgentConfig, input: unknown): AsyncIterable<string> {\n const { registry, id, version } = resolvePrompt(\"stream\", config.prompt);\n const system = registry.get(id, version).system;\n\n const stream = config.llm.stream({\n provider: config.provider ?? \"anthropic\",\n model: config.model ?? \"claude-opus-4-8\",\n system,\n messages: [{ role: \"user\", content: typeof input === \"string\" ? input : JSON.stringify(input) }]\n });\n\n for await (const chunk of stream) {\n if (chunk.delta.length > 0) {\n yield chunk.delta;\n }\n if (chunk.done) {\n return;\n }\n }\n}\n\n/**\n * Build the handler for an agent node: a {@link ReActAgent} driven by the given\n * LLM gateway. The agent's result is written to `outputChannel`; route on its\n * `requiresHumanReview` flag (e.g. a conditional edge into a human gate) to keep\n * sensitive actions behind approval — an agent never self-approves.\n */\nconst channelArray = (channels: Record<string, unknown>, key: string): string[] => {\n const value = channels[key];\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === \"string\") : [];\n};\n\n/** A tool subject is `{ description: \"tool:<name>\" }`; pull the tool name back out. */\nconst subjectToolName = (subject: { description: string } | { [key: string]: unknown }): string | undefined => {\n const description = (subject as { description?: unknown }).description;\n return typeof description === \"string\" && description.startsWith(TOOL_SUBJECT_PREFIX)\n ? description.slice(TOOL_SUBJECT_PREFIX.length)\n : undefined;\n};\n\n/**\n * The set of approval-gated tools the agent may now run. The channel path covers\n * `approveAndResume`; the engine path covers a real {@link ApprovalEngine} decision\n * resolved out of band — we look up the request ids stashed at suspend time.\n */\nconst resolveApprovedTools = async (\n channels: Record<string, unknown>,\n engine: ApprovalEngine | undefined\n): Promise<string[]> => {\n const approved = new Set(channelArray(channels, APPROVED_TOOLS_CHANNEL));\n if (engine !== undefined) {\n for (const rawId of channelArray(channels, APPROVAL_IDS_CHANNEL)) {\n const request = await engine.getById(rawId as ApprovalId);\n if (request?.status === \"approved\") {\n const toolName = subjectToolName(request.subject);\n if (toolName !== undefined) {\n approved.add(toolName);\n }\n }\n }\n }\n return [...approved];\n};\n\n/**\n * Resolve the concrete `{ provider, model }` an agent node runs on, honouring the\n * explicit-override precedence: an explicit `model`/`provider` always wins; a `tier`\n * (with no explicit model) maps through the {@link ModelPolicy} against the providers\n * available in the current env, like the Rust bridge's `resolve_agent_model`. Used only by\n * the legacy in-process handler; the engine resolves models itself. With neither tier nor a\n * usable provider, returns the config's explicit values.\n */\nexport const resolveAgentModel = (\n config: Pick<AgentNodeConfig, \"provider\" | \"model\" | \"tier\">\n): { provider?: LLMProvider; model?: string } => {\n // ADR 0031: normalize a `model` overlay (ModelSpec/Model) or a legacy string to a model id +\n // tier. (This is the removed TS-fallback resolver; the overlay's provider is honoured on the\n // Rust path in toRustAgentConfig — here only the flat provider feeds the legacy ModelPolicy.)\n const spec = toAgentModelSpec(config.model);\n const modelId = spec !== undefined ? spec.model : typeof config.model === \"string\" ? config.model : undefined;\n const tier = spec?.tier ?? config.tier;\n // No tier, or an explicit model already pins the choice: keep what was given so the\n // explicit override wins and the ReActAgent default applies when unset.\n if (tier === undefined || modelId !== undefined) {\n return { provider: config.provider, model: modelId };\n }\n const policy = new ModelPolicy();\n const available = policy.availableFromEnv();\n const choice = policy.resolve(tier, available, { provider: config.provider });\n return { provider: choice.provider, model: choice.model };\n};\n\nexport const createAgentNodeHandler = (nodeId: string, config: AgentNodeConfig): NodeHandler => {\n const { registry, id, version } = resolvePrompt(nodeId, config.prompt);\n const outputChannel = config.outputChannel ?? DEFAULT_AGENT_OUTPUT_CHANNEL;\n const { provider, model } = resolveAgentModel(config);\n\n return async (input, state, context) => {\n // ADR 0016/0031: this is the removed TS-fallback handler — the Rust engine runs agents\n // natively (it never invokes this), so building it must NOT require `llm`. Only if a run\n // actually routes here (the dead TS path) is a gateway required. Checked at call time so\n // `agentNode({ model })` (no llm) builds cleanly for the Rust path.\n const llm = config.llm;\n if (llm === undefined) {\n throw new AiluSdkError(\n \"This run reached the legacy TS-fallback agent handler, which needs `llm`. On the Rust \" +\n \"engine agents run natively — declare a `model` overlay (e.g. model.openai('gpt-4o')).\",\n {\n code: \"AILU_LEGACY_TS_AGENT_HANDLER\",\n hint: \"Give the agent node a `model` (e.g. model.openai('gpt-4o')) so it runs natively on the Rust engine; the `llm` gateway was only for the removed TS fallback.\"\n }\n );\n }\n const channels = state.channels as Record<string, unknown>;\n const approvedToolNames = await resolveApprovedTools(channels, config.approvalEngine);\n\n const agent = new ReActAgent<unknown>({\n id: nodeId as AgentId,\n name: config.name ?? nodeId,\n description: config.description ?? `agent node ${nodeId}`,\n llm,\n tools: config.tools,\n provider,\n model,\n maxIterations: config.maxIterations,\n promptRegistry: registry,\n promptId: id,\n promptVersion: version,\n approvedToolNames\n });\n\n const result = await agent.run(input, state, {\n memory: context.memory,\n workingMemory: { shortTerm: [], longTerm: context.memory }\n });\n\n // Native suspend-on-approval: stop the whole run cleanly (a checkpointed,\n // resumable suspension) rather than leaving routing to the caller. The pending\n // result — including its approvalRequests — is persisted to the output channel.\n // Honour the profile's suspend default (shared with toRustAgentConfig so the TS\n // handler and the Rust/persisted path agree on a profile's human-gate default).\n if (resolveSuspendForApproval(config) && result.requiresHumanReview) {\n const patch: Record<string, unknown> = { [outputChannel]: result };\n\n // File one ApprovalEngine request per gated tool and stash the ids, so resume\n // can ask the engine which were approved. The agent is the requester — a human\n // (a different principal) resolves it, which the engine enforces.\n if (config.approvalEngine !== undefined) {\n const ids: string[] = [];\n for (const request of result.approvalRequests) {\n const created = await config.approvalEngine.request({\n runId: state.runId as RunId,\n nodeId: state.currentNodeId as NodeId,\n requestedBy: config.name ?? nodeId,\n subject: request.subject\n });\n ids.push(String(created.id));\n }\n patch[APPROVAL_IDS_CHANNEL] = ids;\n }\n\n throw new DynamicInterrupt(AGENT_APPROVAL_INTERRUPT, patch);\n }\n\n return { [outputChannel]: result };\n };\n};\n\n/**\n * Build the handler for a tool node: executes the tool calls emitted by the last\n * AI message in the `messages` channel. Tools flagged `requiresApproval` suspend\n * the run via a dynamic interrupt instead of executing.\n */\nexport const createToolNodeHandler = (config: ToolNodeConfig): NodeHandler =>\n createToolNode(config.tools, { parallel: config.parallel });\n","import { createRequire } from \"node:module\";\n\nimport type { GraphDefinition, GraphState, NodeId, RunId } from \"@ailu-ai/graph-core\";\nimport type { RunEvent } from \"@ailu-ai/graph-runtime\";\n\nimport type { ModelTier } from \"@ailu-ai/llm-gateway\";\n\nimport type {\n EfficiencyMiddlewareSpec,\n FsPolicyRule,\n MemoryConfig,\n RustAgentConfig,\n RustMapAgentConfig,\n SkillConfig,\n SkillRecord\n} from \"./agent-node.js\";\nimport type { RustComponentConfig } from \"./components.js\";\nimport type { ChannelValues, TypedGraphState } from \"./typed.js\";\n\n/**\n * Optional bridge to the Rust engine's async run/resume/approve entry points\n * (`@ailu-ai/napi`). Mirrors {@link import(\"./rust-validator.js\").tryRustValidate}:\n * when the native addon is present, graph **execution** can run on the Rust engine\n * (via `engine_run`/`engine_resume`/`engine_approve_and_resume`), with the SDK's TS\n * condition predicates and node/tool seams called back from Rust over a\n * ThreadsafeFunction. The Rust engine is the required production runtime; when the\n * addon is absent (development, tests, or an uncovered platform) this loader returns\n * `null` and {@link import(\"./compiled-graph.js\").CompiledGraph} uses the in-process\n * TypeScript runtime instead.\n *\n * Boundary contract (napi 2.16, Phase F): the Rust seam now **awaits** the JS\n * callback's returned `Promise` — `call_async::<Promise<T>>(..).await?.await?` drives\n * a returned thenable to its resolved value. So `on_node` returns a `Promise<string>`\n * (channel-update / tool-result JSON) and `on_condition` returns a `Promise<string>`\n * (a boolean-ish string the Rust side reads with `parse_bool`). This is what lets the\n * SDK's genuinely-async TS node handlers and tool `execute` fns round-trip through\n * Rust without aborting the process. `on_event` stays fire-and-forget.\n */\nexport type EngineNodeCallback = (payloadJson: string) => Promise<string>;\nexport type EngineConditionCallback = (payloadJson: string) => Promise<string>;\nexport type EngineEventCallback = (payloadJson: string) => void;\n/**\n * Cooperative cancellation (ADR 0044). Polled by the Rust run loop at every node BOUNDARY;\n * resolve `\"true\"` to stop the run cleanly with status `cancelled` after its last checkpoint.\n * Deliberately shaped like `on_condition` (awaited, value-returning) rather than `on_event`\n * (fire-and-forget) — only a seam that can ANSWER can stop a run.\n */\nexport type EngineCancelCallback = () => Promise<string>;\n\ntype NativeEngine = {\n engineRun(\n specJson: string,\n onNode: EngineNodeCallback,\n onCondition: EngineConditionCallback,\n onEvent: EngineEventCallback,\n isCancelled?: EngineCancelCallback\n ): Promise<string>;\n engineResume(\n specJson: string,\n onNode: EngineNodeCallback,\n onCondition: EngineConditionCallback,\n onEvent: EngineEventCallback,\n isCancelled?: EngineCancelCallback\n ): Promise<string>;\n engineApproveAndResume(\n specJson: string,\n onNode: EngineNodeCallback,\n onCondition: EngineConditionCallback,\n onEvent: EngineEventCallback,\n isCancelled?: EngineCancelCallback\n ): Promise<string>;\n engineSignal(\n specJson: string,\n signalName: string,\n payloadJson: string,\n onNode: EngineNodeCallback,\n onCondition: EngineConditionCallback,\n onEvent: EngineEventCallback,\n isCancelled?: EngineCancelCallback\n ): Promise<string>;\n /**\n * Replay-as-evidence (ADR 0038). OPTIONAL + feature-detected: an older prebuilt addon may lack\n * it, so it is deliberately NOT part of the {@link hasEngineFns} hard guard — its absence must\n * never drop ALL Rust execution to the TS fallback (it only disables replay).\n */\n engineReplay?(\n specJson: string,\n checkpointId: string,\n onNode: EngineNodeCallback,\n onCondition: EngineConditionCallback,\n onEvent: EngineEventCallback\n ): Promise<string>;\n};\n\nlet cachedNative: NativeEngine | null | undefined;\n\nconst hasEngineFns = (mod: unknown): mod is NativeEngine =>\n typeof mod === \"object\" &&\n mod !== null &&\n typeof (mod as NativeEngine).engineRun === \"function\" &&\n typeof (mod as NativeEngine).engineResume === \"function\" &&\n typeof (mod as NativeEngine).engineApproveAndResume === \"function\" &&\n typeof (mod as NativeEngine).engineSignal === \"function\";\n\nconst loadNativeEngine = (): NativeEngine | null => {\n if (cachedNative !== undefined) {\n return cachedNative;\n }\n try {\n const requireFn = createRequire(import.meta.url);\n const mod: unknown = requireFn(\"@ailu-ai/napi\");\n cachedNative = hasEngineFns(mod) ? mod : null;\n } catch {\n cachedNative = null;\n }\n return cachedNative;\n};\n\n/** True when the native addon exposes the async run bridge (execution can use Rust). */\nexport const rustEngineAvailable = (): boolean => loadNativeEngine() !== null;\n\n/**\n * An async node-update producer for the Rust seam: given the (channels-only) typed\n * state, resolve to the channel update. The SDK adapts its async `NodeHandler` into\n * this directly — the Rust seam awaits the returned promise (Phase F), so a handler\n * that does real async work (I/O, an LLM call) round-trips faithfully.\n */\nexport type AsyncNodeFn<TState extends ChannelValues> = (\n state: TypedGraphState<TState>\n) => Promise<Record<string, unknown>>;\n\n/** An async tool `execute` for the Rust seam: input in, tool-result value out. */\nexport type AsyncToolFn = (input: unknown) => Promise<unknown>;\n\n/**\n * What the SDK passes to {@link RustGraphRunner}: the things the Rust engine cannot\n * reconstruct itself — async node-update producers (for JS node ids), async tool\n * executes (for JS tool names), and condition predicates — plus the serializable\n * agent configs and the set of JS node ids.\n */\nexport type RustRunnerParts<TState extends ChannelValues> = {\n definition: GraphDefinition;\n /**\n * Child graphs for `subgraph`-type nodes (Rust `EngineSpec.subgraphs`). Their node\n * handlers / conditions are flattened into {@link RustRunnerParts.nodeFns} /\n * {@link RustRunnerParts.conditions} (by global node id); these definitions tell the\n * Rust engine how to traverse each child. Empty for graphs with no subgraphs.\n */\n subgraphs: GraphDefinition[];\n /** Async node-update producers, keyed by node id (Rust `on_node`, `kind:\"node\"`). */\n nodeFns: Map<string, AsyncNodeFn<TState>>;\n /** Async tool executes, keyed by tool name (Rust `on_node`, `kind:\"tool\"`). */\n toolFns: Map<string, AsyncToolFn>;\n /** Named condition predicates, keyed by condition name (Rust `on_condition`). */\n conditions: Map<string, (state: TypedGraphState<TState>) => boolean>;\n /** Per-agent-node serializable config. */\n agents: Map<string, RustAgentConfig>;\n /**\n * Per-component-node serializable config (Phase C `componentNodes` carrier), keyed\n * by node id. The node runs a native Rust component handler; its id may *also* be in\n * {@link jsNodeIds} (its TS fallback handler) — Rust takes the component path.\n */\n components: Map<string, RustComponentConfig>;\n /** Per `mapAgents`-node dynamic-fan-out config (ADR 0027 phase 4b), keyed by node id. */\n mapAgents: Map<string, RustMapAgentConfig>;\n /** Node ids whose handler is a JS closure (action / custom / tool nodes). */\n jsNodeIds: Set<string>;\n /** Tool names that are backed by a JS `execute` (in {@link toolFns}). */\n jsToolNames: Set<string>;\n /**\n * Per-provider API keys injected by the control plane (ADR 0010), keyed by provider\n * slug (`openai`, `anthropic`, `mistral`, …). The Rust gateway resolves each agent's\n * provider key tenant-key-first, then process env. Omitted for runs that rely purely\n * on the host env (e.g. local dev, tests).\n */\n providerKeys?: Record<string, string>;\n /**\n * Per-path filesystem permission rules (ADR 0024 phase 2b), compiled into the run's\n * StaticPathPolicy and applied to every fs-enabled agent. Empty/omitted = fail-closed\n * read-only everywhere.\n */\n fsPolicy?: FsPolicyRule[];\n /**\n * The tenant's governed skills for this run (ADR 0049 B-3) → Rust `EngineSpec.skills`. The engine\n * builds a run-scoped, tenant-isolated skill store from these; each agent's SkillMiddleware selects\n * from it. Omitted/empty → the OSS shared in-memory store (no skills).\n */\n skills?: SkillRecord[];\n};\n\n/** The `agents` map serialized for the wire (matches Rust `AgentSpec`, camelCase). */\ntype AgentSpecWire = {\n provider: string;\n model?: string;\n /** Capability tier; the Rust bridge resolves it via `ModelPolicy` when no `model`. */\n tier?: ModelTier;\n /** Custom OpenAI-compatible endpoint (→ Rust `baseUrl`) and the env var naming its key. */\n baseUrl?: string;\n apiKeyEnv?: string;\n system?: string;\n toolNames: string[];\n /** Each tool's description + input JSON Schema, as the LLM sees them (→ Rust `toolSpecs`). */\n toolSpecs?: Array<{ name: string; description?: string; inputSchema?: Record<string, unknown> }>;\n maxIterations?: number;\n suspendForApproval: boolean;\n approvalToolNames: string[];\n outputChannel: string;\n /** ADR 0014 token-efficiency knobs (camelCase → Rust AgentSpec `outputStyle`/`contextBudget`). */\n outputStyle?: \"terse\";\n contextBudget?: number;\n /** ADR 0022/0023 — durable channel the `writeTodos` list is persisted into (→ Rust `todosChannel`). */\n todosChannel?: string;\n /** ADR 0030 phase 9e — channel carrying the run's multimodal input blocks (→ Rust `inputBlocksChannel`). */\n inputBlocksChannel?: string;\n /** The only channels the agent is shown in its seed state (→ Rust `visibleChannels`). */\n visibleChannels?: string[];\n /** ADR 0026 phase 11 — governed long-term memory overlay (→ Rust `memory`). */\n memory?: MemoryConfig;\n /** ADR 0035 phase 12 — governed skills (progressive disclosure) overlay (→ Rust `skills`). */\n skills?: SkillConfig;\n /** ADR 0024 phase 2b — opt this agent into the governed virtual filesystem tools. */\n enableFs?: boolean;\n /** ADR 0025 phase 3d — the SDK-resolved efficiency middleware list (→ Rust `resolvedMiddleware`). */\n resolvedMiddleware?: EfficiencyMiddlewareSpec[];\n};\n\n/**\n * One native component node serialized for the wire (matches Rust `ComponentNodeSpec`,\n * camelCase): a component `kind` plus its `params` object. Such a node runs the Rust\n * `ailu_components` handler natively instead of the JS seam.\n */\ntype ComponentNodeSpecWire = {\n kind: string;\n params: Record<string, unknown>;\n};\n\n/** One `mapAgents` dynamic-fan-out node serialized for the wire (matches Rust `MapAgentSpec`). */\ntype MapAgentSpecWire = {\n overChannel: string;\n joinAt: string;\n agent: AgentSpecWire;\n suspendForApproval: boolean;\n};\n\n/**\n * One granted tool on the approve path, with the governance provenance the Rust\n * guard-rail validates (matches Rust `ApprovedTool`, camelCase): the principal who\n * *requested* the approval and the (distinct) principal who *resolved* it. The bridge\n * rejects the resume if `resolvedBy` is empty or equals `requestedBy` (no self-approval).\n */\nexport type ApprovedToolWire = {\n name: string;\n requestedBy: string;\n resolvedBy: string;\n /**\n * Content-scoped grant key (ADR 0024 phase 2c): `\"<name>#<sha256(input)>\"` for a\n * guarded fs write, pinning the grant to the exact call. When set, the engine writes\n * THIS key (not the bare name) into `__approvedTools`. Omitted for a name-only grant.\n */\n key?: string;\n};\n\n/** The `EngineSpec` shape the Rust bridge deserializes (camelCase). */\ntype EngineSpecWire = {\n graph: GraphDefinition;\n /** Child graphs for `subgraph`-type nodes; the bridge registers their nodes too. */\n subgraphs: GraphDefinition[];\n /** Dynamic-message inbox to pre-queue (`send`): per node id, FIFO inputs. */\n inbox?: Record<string, unknown[]>;\n runId?: string;\n /**\n * Opt-in per-token streaming (ADR 0033 phase 13). When `true`, agent nodes drive the\n * gateway's streaming path and emit observational `token_delta` events; when absent —\n * the default — agents `complete()` and the run is byte-identical. The SDK sets it only\n * for a `messages`-mode stream, the one consumer that renders token-granular output.\n */\n streamTokens?: boolean;\n initialData?: Record<string, unknown>;\n state?: GraphState;\n /**\n * Replay-as-evidence (ADR 0038): a recorded run journal (`{ decisions, clock }` JSON) re-fed\n * on the replay path so re-execution re-serves the original LLM outputs + timestamps instead\n * of re-sampling. Set only by the replay path.\n */\n replayJournal?: string;\n approvedTools?: ApprovedToolWire[];\n agents: Record<string, AgentSpecWire>;\n /**\n * Per-node native component configuration, keyed by node id. The Phase C carrier:\n * such a node runs a Rust component handler (built at assemble time from `kind` +\n * `params`) and takes precedence over the JS seam even when its id also appears in\n * {@link EngineSpecWire.jsNodeIds}.\n */\n componentNodes: Record<string, ComponentNodeSpecWire>;\n /** Per-node `mapAgents` dynamic-fan-out config (ADR 0027 phase 4b), keyed by node id. */\n mapAgents: Record<string, MapAgentSpecWire>;\n jsNodeIds: string[];\n jsToolNames: string[];\n /**\n * Per-provider API keys (ADR 0010), keyed by provider slug. The Rust bridge resolves\n * each agent's key tenant-key-first then env; an empty map means env-only resolution.\n */\n providerKeys: Record<string, string>;\n /** Per-path filesystem permission rules (ADR 0024 phase 2b); empty = fail-closed read-only. */\n fsPolicy: FsPolicyRule[];\n /** The tenant's governed skills (ADR 0049 B-3) → Rust `EngineSpec.skills`; empty = OSS shared store. */\n skills: SkillRecord[];\n};\n\n/** The `RunOutcome` shape the Rust bridge serializes back. */\ntype RunOutcomeWire = {\n state: GraphState;\n status: string;\n /**\n * Pending approvals when suspended. For a content-scoped guarded fs write (ADR 0024\n * phase 2c) the item also carries `approvalKey` (the composite grant to send back on\n * approve) + `input` (the path/content, so a reviewer sees what is approved).\n */\n pendingApprovals: { subject: string; reason: string; approvalKey?: string; input?: unknown }[];\n /**\n * Replay-as-evidence (ADR 0038): the recorded LLM I/O + clock journal (`{ decisions, clock }`\n * JSON) when the run executed in record mode (`AILU_LLM_RECORD`); `undefined` otherwise. The\n * control plane persists it to re-feed a later replay.\n */\n replayJournal?: string;\n /**\n * Replay-as-evidence (ADR 0040): the run's ENTRY state (initial state, before the entry node\n * ran), surfaced only on a record-mode start; `undefined` otherwise. The control plane persists it\n * as the checkpoint a later verify-replay seeds `replayFrom` from, to re-derive the run from start.\n */\n entryState?: GraphState;\n};\n\n/** Payload the Rust `on_node` seam sends for a JS node handler or a JS tool. */\ntype NodePayload =\n | { kind: \"node\"; nodeId: string; input: unknown; state: Record<string, unknown> }\n | { kind: \"tool\"; name: string; input: unknown };\n\n/** Payload the Rust `on_condition` seam sends for a named predicate. */\ntype ConditionPayload = { name: string; state: Record<string, unknown> };\n\n/**\n * Drives a graph on the Rust engine through the napi bridge. One instance per\n * {@link import(\"./compiled-graph.js\").CompiledGraph}; safe to call repeatedly.\n *\n * The TS state the Rust seam hands back is **channels-only** (`{ kind, state }` where\n * `state` is the channel map). We reconstruct a {@link TypedGraphState} carrying those\n * channels so TS conditions and node fns see the same `state.channels` they would on\n * the TS engine — which is what preserves the SDK's typed-state semantics across the\n * boundary. The `GraphState` fields the seam doesn't carry are filled with inert\n * placeholders (SDK conditions and the SDK's own node logic read `state.channels`).\n */\nexport class RustGraphRunner<TState extends ChannelValues> {\n private readonly native: NativeEngine;\n private readonly parts: RustRunnerParts<TState>;\n private readonly eventSubscribers = new Set<(event: RunEvent) => void>();\n /** The last run's recorded journal (ADR 0038, record mode); `undefined` outside record mode. */\n private lastReplayJournal: string | undefined;\n /** The last record-mode run's ENTRY state (ADR 0040); `undefined` outside record mode. */\n private lastEntryState: GraphState | undefined;\n /** The last run's pending approvals (the requested subjects when it suspended on a gate). */\n private lastPendingApprovals: RunOutcomeWire[\"pendingApprovals\"] = [];\n\n /** Construct only after {@link rustEngineAvailable} returned true. */\n public constructor(native: NativeEngine, parts: RustRunnerParts<TState>) {\n this.native = native;\n this.parts = parts;\n }\n\n /** The recorded LLM I/O + clock journal from the last run, when it ran in record mode\n * (`AILU_LLM_RECORD`) — the control plane persists it to re-feed a replay (ADR 0038). */\n public recordedJournal(): string | undefined {\n return this.lastReplayJournal;\n }\n\n /** The ENTRY state of the last record-mode run (ADR 0040) — the control plane persists it as the\n * checkpoint a later verify-replay seeds `replay` from. `undefined` outside record mode. */\n public recordedEntryState(): GraphState | undefined {\n return this.lastEntryState;\n }\n\n /** The pending approvals (requested subjects) from the last run, when it suspended on a gate.\n * On a replay this is what the deterministic re-execution requested — the faithfulness signal. */\n public pendingApprovals(): RunOutcomeWire[\"pendingApprovals\"] {\n return this.lastPendingApprovals;\n }\n\n /** Whether the installed native addon supports replay (`engineReplay`) — feature-detected. */\n public canReplay(): boolean {\n return typeof this.native.engineReplay === \"function\";\n }\n\n /** Subscribe to forwarded run-lifecycle events. Returns an unsubscribe fn. */\n public subscribe(handler: (event: RunEvent) => void): () => void {\n this.eventSubscribers.add(handler);\n return () => {\n this.eventSubscribers.delete(handler);\n };\n }\n\n /** Lift the channel map the Rust seam sends into a typed (channels-only) state. */\n private liftState(channels: Record<string, unknown>): TypedGraphState<TState> {\n return {\n runId: \"\" as RunId,\n graphId: this.parts.definition.id,\n currentNodeId: \"\" as NodeId,\n status: \"running\",\n channels: channels as TState,\n version: 0,\n createdAt: \"\",\n updatedAt: \"\"\n };\n }\n\n /**\n * The `on_node` seam: dispatch to an async node fn or tool execute and resolve to\n * its JSON. The Rust side awaits this promise (Phase F), so a handler doing real\n * async work round-trips faithfully. A missing fn resolves to `\"{}\"` (an empty\n * update) rather than rejecting, matching the Rust side's tolerant `parse_update`.\n */\n private readonly onNode: EngineNodeCallback = async (payloadJson) => {\n const payload = JSON.parse(payloadJson) as NodePayload;\n if (payload.kind === \"node\") {\n const fn = this.parts.nodeFns.get(payload.nodeId);\n if (fn === undefined) {\n return \"{}\";\n }\n return JSON.stringify(await fn(this.liftState(payload.state)));\n }\n const tool = this.parts.toolFns.get(payload.name);\n if (tool === undefined) {\n return \"{}\";\n }\n return JSON.stringify(await tool(payload.input));\n };\n\n /**\n * The `on_condition` seam: evaluate a named TS predicate against the channels and\n * resolve to its boolean-ish string (`\"true\"`/`\"false\"`). The predicate is\n * synchronous (the SDK's {@link TypedCondition} contract), but the Rust side awaits\n * a `Promise<string>`, so we return one. A missing predicate resolves to `\"false\"`.\n */\n private readonly onCondition: EngineConditionCallback = async (payloadJson) => {\n const payload = JSON.parse(payloadJson) as ConditionPayload;\n const predicate = this.parts.conditions.get(payload.name);\n const value = predicate === undefined ? false : predicate(this.liftState(payload.state));\n return value ? \"true\" : \"false\";\n };\n\n /** The `on_event` seam: forward each run-lifecycle event to subscribers. */\n private readonly onEvent: EngineEventCallback = (payloadJson) => {\n const event = JSON.parse(payloadJson) as RunEvent;\n for (const subscriber of this.eventSubscribers) {\n subscriber(event);\n }\n };\n\n /**\n * Cooperative cancellation (ADR 0044). Installed by {@link cancelWhen}; `undefined` until\n * then, which is what keeps the napi call shape (and therefore engine behaviour) unchanged\n * for every caller that never asks to cancel.\n */\n private cancelCheck?: () => boolean;\n\n /**\n * Ask the Rust run loop to stop at the next node boundary whenever `check()` returns true.\n * Polled (never pre-emptive): a node already executing always runs to completion and\n * checkpoints, so cancelling can never tear a run's state.\n */\n public cancelWhen(check: () => boolean): void {\n this.cancelCheck = check;\n }\n\n /** The `is_cancelled` seam: answer the engine's boundary poll. */\n private readonly onCancelled: EngineCancelCallback = async () =>\n this.cancelCheck?.() === true ? \"true\" : \"false\";\n\n /**\n * The napi argument — `undefined` unless a check was installed, so the optional parameter is\n * simply absent on the call and an older addon sees the exact 4-argument shape it expects.\n */\n private get cancelArg(): EngineCancelCallback | undefined {\n return this.cancelCheck === undefined ? undefined : this.onCancelled;\n }\n\n private agentWire(config: RustAgentConfig): AgentSpecWire {\n return {\n provider: config.provider,\n model: config.model,\n tier: config.tier,\n baseUrl: config.baseURL,\n apiKeyEnv: config.apiKeyEnv,\n system: config.system,\n toolNames: config.toolNames,\n toolSpecs: config.toolSpecs?.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.jsonSchema\n })),\n maxIterations: config.maxIterations,\n suspendForApproval: config.suspendForApproval,\n approvalToolNames: config.approvalToolNames,\n outputChannel: config.outputChannel,\n outputStyle: config.outputStyle,\n contextBudget: config.contextBudget,\n todosChannel: config.todosChannel,\n inputBlocksChannel: config.inputBlocksChannel,\n visibleChannels: config.visibleChannels,\n memory: config.memory,\n skills: config.skills,\n enableFs: config.enableFs,\n resolvedMiddleware: config.resolvedMiddleware\n };\n }\n\n private buildAgentsWire(): Record<string, AgentSpecWire> {\n const out: Record<string, AgentSpecWire> = {};\n for (const [nodeId, config] of this.parts.agents) {\n out[nodeId] = this.agentWire(config);\n }\n return out;\n }\n\n private buildMapAgentsWire(): Record<string, MapAgentSpecWire> {\n const out: Record<string, MapAgentSpecWire> = {};\n for (const [nodeId, config] of this.parts.mapAgents) {\n out[nodeId] = {\n overChannel: config.overChannel,\n joinAt: config.joinAt,\n agent: this.agentWire(config.agent),\n suspendForApproval: config.suspendForApproval\n };\n }\n return out;\n }\n\n private buildComponentsWire(): Record<string, ComponentNodeSpecWire> {\n const out: Record<string, ComponentNodeSpecWire> = {};\n for (const [nodeId, config] of this.parts.components) {\n out[nodeId] = { kind: config.kind, params: config.params };\n }\n return out;\n }\n\n private outcomeToState(outcomeJson: string): TypedGraphState<TState> {\n const outcome = JSON.parse(outcomeJson) as RunOutcomeWire;\n // ADR 0038: capture a record-mode run's journal so callers can persist it (`recordedJournal`).\n this.lastReplayJournal = outcome.replayJournal;\n // ADR 0040: capture the entry state (record mode) + the run's pending approvals (the requested\n // subjects when it suspended on a gate) — both are inputs/outputs the verify-replay flow reads.\n this.lastEntryState = outcome.entryState;\n this.lastPendingApprovals = outcome.pendingApprovals ?? [];\n // The wire state is already a valid camelCase GraphState; channels are the typed\n // shape declared by the builder, so this cast is exact (no field reshaping).\n return outcome.state as unknown as TypedGraphState<TState>;\n }\n\n private baseSpec(): Pick<\n EngineSpecWire,\n | \"graph\"\n | \"subgraphs\"\n | \"agents\"\n | \"componentNodes\"\n | \"mapAgents\"\n | \"jsNodeIds\"\n | \"jsToolNames\"\n | \"providerKeys\"\n | \"fsPolicy\"\n | \"skills\"\n > {\n return {\n graph: this.parts.definition,\n subgraphs: this.parts.subgraphs,\n agents: this.buildAgentsWire(),\n componentNodes: this.buildComponentsWire(),\n mapAgents: this.buildMapAgentsWire(),\n jsNodeIds: [...this.parts.jsNodeIds],\n jsToolNames: [...this.parts.jsToolNames],\n providerKeys: this.parts.providerKeys ?? {},\n fsPolicy: this.parts.fsPolicy ?? [],\n skills: this.parts.skills ?? []\n };\n }\n\n /** Start a fresh run on the Rust engine. `streamTokens` opts into per-token streaming (ADR 0033). */\n public async run(\n runId: RunId,\n initialData: Record<string, unknown>,\n inbox: Record<string, unknown[]> = {},\n streamTokens = false\n ): Promise<TypedGraphState<TState>> {\n const spec: EngineSpecWire = { ...this.baseSpec(), runId, initialData, inbox, streamTokens };\n const outcomeJson = await this.native.engineRun(\n JSON.stringify(spec),\n this.onNode,\n this.onCondition,\n this.onEvent,\n this.cancelArg\n );\n return this.outcomeToState(outcomeJson);\n }\n\n /**\n * Resume a suspended run from its serialized state. Optionally carries the\n * human-granted `approvedTools` WITH their `{ name, requestedBy, resolvedBy }`\n * provenance (the production catalog resume path): the Rust bridge re-validates the\n * no-self-approval invariant per tool on `Entry::Resume` and writes only the\n * validated names into `__approvedTools` — so a self-approved (or unresolved) tool\n * aborts the resume here too, not just on the approve path. Omitted (or empty) for\n * an ordinary resume past a non-approval gate, which unlocks no tools.\n */\n public async resume(\n state: GraphState,\n approvedTools: ApprovedToolWire[] = []\n ): Promise<TypedGraphState<TState>> {\n const spec: EngineSpecWire = { ...this.baseSpec(), state, approvedTools };\n const outcomeJson = await this.native.engineResume(\n JSON.stringify(spec),\n this.onNode,\n this.onCondition,\n this.onEvent,\n this.cancelArg\n );\n return this.outcomeToState(outcomeJson);\n }\n\n /**\n * Grant the approved tools (each carrying its `{ name, requestedBy, resolvedBy }`\n * provenance), then resume. The Rust bridge re-validates the no-self-approval\n * invariant per tool and writes only the validated names into `__approvedTools`\n * before resuming — a self-approved (or unresolved) tool aborts the resume.\n */\n public async approveAndResume(\n state: GraphState,\n approvedTools: ApprovedToolWire[]\n ): Promise<TypedGraphState<TState>> {\n const spec: EngineSpecWire = { ...this.baseSpec(), state, approvedTools };\n const outcomeJson = await this.native.engineApproveAndResume(\n JSON.stringify(spec),\n this.onNode,\n this.onCondition,\n this.onEvent,\n this.cancelArg\n );\n return this.outcomeToState(outcomeJson);\n }\n\n /**\n * Deliver an external signal to a suspended run, then resume it. The Rust engine\n * injects `payload` into `__signals[name]` and advances past the node that awaited\n * the signal (a `waitForSignal` suspension is one-shot).\n */\n public async signal(\n state: GraphState,\n name: string,\n payload: unknown\n ): Promise<TypedGraphState<TState>> {\n const spec: EngineSpecWire = { ...this.baseSpec(), state };\n const outcomeJson = await this.native.engineSignal(\n JSON.stringify(spec),\n name,\n JSON.stringify(payload ?? null),\n this.onNode,\n this.onCondition,\n this.onEvent,\n this.cancelArg\n );\n return this.outcomeToState(outcomeJson);\n }\n\n /**\n * Replay-as-evidence (ADR 0038): re-execute the run from `checkpointId`, re-feeding the recorded\n * `replayJournal` (`{ decisions, clock }` JSON from a record-mode run's {@link recordedJournal})\n * so the re-derivation is deterministic — the same LLM outputs + timestamps, not a re-sample. A\n * forked, read-only run that never opens approval gates. Requires the native addon to expose\n * `engineReplay` (a newer prebuilt); guard with {@link canReplay} first.\n */\n public async replay(\n state: GraphState,\n checkpointId: string,\n replayJournal: string\n ): Promise<TypedGraphState<TState>> {\n if (this.native.engineReplay === undefined) {\n throw new Error(\n \"the installed @ailu-ai/napi addon has no replay support (engineReplay) — rebuild/upgrade it\"\n );\n }\n const spec: EngineSpecWire = { ...this.baseSpec(), state, replayJournal };\n const outcomeJson = await this.native.engineReplay(\n JSON.stringify(spec),\n checkpointId,\n this.onNode,\n this.onCondition,\n this.onEvent\n );\n return this.outcomeToState(outcomeJson);\n }\n}\n\n/** Build a {@link RustGraphRunner} if the native engine is present, else `null`. */\nexport const tryCreateRustRunner = <TState extends ChannelValues>(\n parts: RustRunnerParts<TState>\n): RustGraphRunner<TState> | null => {\n const native = loadNativeEngine();\n return native === null ? null : new RustGraphRunner<TState>(native, parts);\n};\n","import type { GraphDefinition, GraphState, NodeId, RunId } from \"@ailu-ai/graph-core\";\nimport {\n GraphRuntime,\n InMemoryCheckpointer,\n InMemoryConditionRegistry,\n InMemoryEventBus,\n InMemoryNodeRegistry,\n type Checkpointer,\n type ConditionFn,\n type EventBus,\n type NodeExecutionContext,\n type NodeHandler,\n type RunEvent,\n type StreamEvent,\n type StreamMode\n} from \"@ailu-ai/graph-runtime\";\n\nimport { AiluSdkError, ApproverRequiredError, ResumeStateNotFoundError } from \"./errors.js\";\nimport { explainRun, type RunExplanation } from \"./run-explainer.js\";\nimport {\n type AgentApprovalBinding,\n type FsPolicyRule,\n type RustAgentConfig,\n type RustMapAgentConfig\n} from \"./agent-node.js\";\nimport type { RustComponentConfig } from \"./components.js\";\nimport {\n rustEngineAvailable,\n tryCreateRustRunner,\n type ApprovedToolWire,\n type AsyncNodeFn,\n type AsyncToolFn,\n type RustGraphRunner,\n type RustRunnerParts\n} from \"./rust-engine.js\";\nimport type { ChannelValues, InitialData, TypedGraphState } from \"./typed.js\";\n\n/** Options for {@link CompiledGraph.approveAndResume}. */\nexport type ApproveAndResumeOptions = {\n /**\n * Approval-gated tools the human has granted; they execute on resume. A bare string\n * grants a tool by name; `{ name, key }` grants a CONTENT-SCOPED guarded fs write\n * (ADR 0024 phase 2c) pinned to the exact call — pass the `approvalKey` surfaced on the\n * suspended run's pending approval, so only the approved path+content unlocks.\n */\n approvedTools: Array<string | { name: string; key?: string }>;\n /**\n * Who approved: a person, never the agent that requested the tool. Required. It is\n * recorded as each granted tool's `resolvedBy` and carried to the Rust engine, which\n * rejects the resume if it equals the tool's requester (no self-approval).\n */\n resolvedBy: string;\n};\n\nconst generateRunId = (): RunId => {\n const random = globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2);\n return `run_${random}` as RunId;\n};\n\n/** Wiring assembled by {@link GraphBuilder.compile} and handed to a {@link CompiledGraph}. */\nexport type CompiledGraphParts = {\n definition: GraphDefinition;\n handlers: Map<string, NodeHandler>;\n conditions: Map<string, ConditionFn>;\n /**\n * Per agent node, the serializable config + JS tool executes the Rust engine bridge\n * needs (see {@link RustAgentConfig}). Empty for graphs with no agent nodes.\n */\n agentConfigs?: Map<string, RustAgentConfig>;\n /**\n * Per agent node, the principal that requests approvals and the node's gated tool names.\n * {@link CompiledGraph.approveAndResume} uses it to stamp each granted tool's `requestedBy`\n * for the engine's no-self-approval check. Empty for graphs with no agent nodes.\n */\n agentApprovals?: Map<string, AgentApprovalBinding>;\n /**\n * Per component node, the `{ kind, params }` carrier the Rust engine bridge needs to\n * run the native component handler (see {@link RustComponentConfig}). Empty for\n * graphs with no component nodes.\n */\n componentConfigs?: Map<string, RustComponentConfig>;\n /**\n * Per `mapAgents` node, the dynamic-fan-out carrier (over-channel, join channel, the sub-agent\n * config) the Rust bridge needs (ADR 0027 phase 4b). Empty for graphs with no mapAgents nodes.\n */\n mapAgentConfigs?: Map<string, RustMapAgentConfig>;\n /**\n * Child graphs that `subgraph`-type nodes resolve into (their node handlers /\n * conditions / agent / component configs are already merged into the maps above, by\n * global node id). Carried to the Rust engine as `EngineSpec.subgraphs`. Empty for\n * graphs with no subgraph nodes.\n */\n subgraphs?: GraphDefinition[];\n /**\n * Per-path filesystem permission rules (ADR 0024 phase 2b) applied run-wide to every\n * fs-enabled agent. Carried to the Rust engine as `EngineSpec.fsPolicy`. Empty/omitted\n * = fail-closed read-only everywhere.\n */\n fsPolicy?: FsPolicyRule[];\n};\n\n/** Options accepted by {@link CompiledGraph.run} / {@link CompiledGraph.stream}. */\nexport type RunOptions = {\n /** Provide a stable run id (e.g. to correlate with an external system). */\n runId?: RunId;\n /**\n * Pre-queue dynamic-message inputs (`send`) before the run: per node id, a FIFO list\n * each consumed by that node's next execution via the reserved `__injected` channel\n * (read it with {@link import(\"./send.js\").readInjected}). The map-reduce seam.\n */\n inbox?: Record<string, unknown[]>;\n};\n\n/**\n * `AILU_SDK_ENGINE`, read when a graph compiles. The Rust engine is the only engine:\n * - `\"auto\"` (default) and `\"rust\"`: run on the Rust engine. Under `\"auto\"`, a graph whose\n * agent node sets the removed `approvalEngine` option fails to compile instead.\n * - `\"ts\"`: removed; compiling fails with {@link RustEngineRequiredError}.\n */\ntype EnginePreference = \"auto\" | \"rust\" | \"ts\";\n\nconst enginePreference = (): EnginePreference => {\n const raw = process.env.AILU_SDK_ENGINE?.trim().toLowerCase();\n return raw === \"rust\" || raw === \"ts\" ? raw : \"auto\";\n};\n\n/**\n * Thrown at compile time when the graph cannot run on the **Rust engine**. The SDK is a thin\n * surface over the native engine and has **no TypeScript fallback** — it never silently degrades.\n */\nexport class RustEngineRequiredError extends AiluSdkError {\n public constructor(preference: EnginePreference) {\n const reason =\n preference === \"ts\"\n ? \"AILU_SDK_ENGINE=ts is no longer supported — the TypeScript engine fallback has been removed.\"\n : \"the native engine (@ailu-ai/napi) is not loaded, or this graph uses a feature only the \" +\n \"removed TS engine implemented (an ApprovalEngine-backed agent node, a JS handler returning a \" +\n \"routing Command `{ goto }`, or a `requiresApproval` tool node that suspends).\";\n super(\n `Ailu requires the Rust engine; there is no TypeScript fallback. Cannot run this graph: ${reason} ` +\n \"Build the native addon (scripts/build-napi.sh) / install @ailu-ai/napi, and use channel-based \" +\n \"routing/approvals.\",\n {\n code: \"AILU_RUST_ENGINE_REQUIRED\",\n hint: \"Install @ailu-ai/napi (it ships prebuilt for common platforms) — or, if the graph uses a removed TS-only feature, switch to channel-based routing/approvals.\"\n }\n );\n this.name = \"RustEngineRequiredError\";\n }\n}\n\n/**\n * A validated, runnable graph. Holds the engine wiring (registries, checkpointer, event bus) so\n * callers don't touch the lower-level `@ailu-ai/graph-runtime` primitives unless they want to.\n *\n * Execution runs **exclusively on the Rust engine** via `@ailu-ai/napi` (a required dependency).\n * There is **no TypeScript fallback** — {@link CompiledGraph} throws {@link RustEngineRequiredError}\n * at compile time if the native engine cannot run the graph.\n */\nexport class CompiledGraph<TState extends ChannelValues = ChannelValues> {\n public readonly definition: GraphDefinition;\n private readonly checkpointer: Checkpointer;\n private readonly eventBus: EventBus;\n private readonly runtime: GraphRuntime;\n\n /**\n * The Rust runner. Never `null` once constructed (the constructor throws otherwise).\n * Typed on `ChannelValues` (not `TState`) on purpose: the runner round-trips state as\n * serialized `GraphState`/JSON, so it never needs the precise channel shape — and\n * keeping `TState` out of every *field* keeps `CompiledGraph<TState>` variance-friendly\n * (a `CompiledGraph<Specific>` stays assignable to `CompiledGraph<ChannelValues>`,\n * e.g. when stored in a heterogeneous registry). The public methods re-narrow to\n * `TState` at their boundary.\n */\n private readonly rustRunner: RustGraphRunner<ChannelValues> | null;\n /** The last suspended state seen per run id, fed back into the Rust resume/approve. */\n private readonly suspendedStates = new Map<string, GraphState>();\n /** Per agent node, the approval principal used by {@link approveAndResume}. */\n private readonly agentApprovals: Map<string, AgentApprovalBinding>;\n\n public constructor(parts: CompiledGraphParts) {\n this.definition = parts.definition;\n this.agentApprovals = parts.agentApprovals ?? new Map<string, AgentApprovalBinding>();\n\n const nodeRegistry = new InMemoryNodeRegistry();\n for (const [nodeId, handler] of parts.handlers) {\n nodeRegistry.register(nodeId as NodeId, handler);\n }\n\n const conditionRegistry = new InMemoryConditionRegistry();\n for (const [name, fn] of parts.conditions) {\n conditionRegistry.register(name, fn);\n }\n\n this.checkpointer = new InMemoryCheckpointer();\n this.eventBus = new InMemoryEventBus();\n\n // The in-process runtime behind the deprecated `engine` getter. It does not run this\n // graph; the Rust runner below does.\n const subgraphsById = new Map<string, GraphDefinition>(\n (parts.subgraphs ?? []).map((graph) => [String(graph.id), graph])\n );\n\n this.runtime = new GraphRuntime({\n graph: parts.definition,\n nodeRegistry,\n conditionRegistry,\n checkpointer: this.checkpointer,\n eventBus: this.eventBus,\n subgraphResolver:\n subgraphsById.size === 0\n ? undefined\n : (graphId) => subgraphsById.get(String(graphId))\n });\n\n this.rustRunner = this.maybeCreateRustRunner(parts);\n // Rust-only: the SDK is a thin surface over the Rust engine — there is NO TypeScript\n // fallback. If the native engine cannot run this graph (the napi addon is absent, or the\n // graph uses a feature that only the deprecated TS engine implemented), fail loudly rather\n // than silently degrade. See RustEngineRequiredError for the reasons + remedy.\n if (this.rustRunner === null) {\n throw new RustEngineRequiredError(enginePreference());\n }\n // Mirror forwarded run events into the event bus so `onEvent` subscribers see them.\n this.rustRunner.subscribe((event) => {\n this.eventBus.emit(event);\n });\n }\n\n /**\n * Build the Rust runner, or return `null` when the graph can't run: the native addon is\n * missing, `AILU_SDK_ENGINE=ts` is set, or (under `auto`) an agent node sets the removed\n * `approvalEngine` option. The constructor turns `null` into {@link RustEngineRequiredError}.\n *\n * Agents run natively with the engine's own gateway (the `llm` option is ignored). JS node\n * handlers and tool `execute` functions are called over the napi seam, which awaits them. A\n * handler returning a routing `Command` (`{ goto }`) has its `goto` ignored: route with a\n * conditional edge instead.\n */\n private maybeCreateRustRunner(parts: CompiledGraphParts): RustGraphRunner<ChannelValues> | null {\n const preference = enginePreference();\n if (preference === \"ts\" || !rustEngineAvailable()) {\n return null;\n }\n\n const agentConfigs = parts.agentConfigs ?? new Map<string, RustAgentConfig>();\n const componentConfigs = parts.componentConfigs ?? new Map<string, RustComponentConfig>();\n const mapAgentConfigs = parts.mapAgentConfigs ?? new Map<string, RustMapAgentConfig>();\n\n // An agent node's `approvalEngine` option belonged to the removed TypeScript engine: refuse\n // the graph rather than silently skip its approvals. `rust` overrides this.\n if (preference === \"auto\") {\n const usesApprovalEngine = [...agentConfigs.values()].some((config) => config.usesApprovalEngine);\n if (usesApprovalEngine) {\n return null;\n }\n }\n\n const jsHandlerNodeIds = new Set(parts.handlers.keys());\n // Agent nodes also have an entry in `parts.handlers`, but they run natively, so they are\n // not JS node ids. Any *other* handler is a JS action/custom/tool node.\n for (const agentNodeId of agentConfigs.keys()) {\n jsHandlerNodeIds.delete(agentNodeId);\n }\n // Component nodes likewise run their native Rust handler (the bridge routes a\n // `componentNodes` entry before the JS seam), so they are not JS node ids either.\n for (const componentNodeId of componentConfigs.keys()) {\n jsHandlerNodeIds.delete(componentNodeId);\n }\n\n // JS tool `execute` fns are async and bridge by default (the seam awaits them).\n const toolFns = this.buildToolFns(agentConfigs);\n\n const runnerParts: RustRunnerParts<ChannelValues> = {\n definition: parts.definition,\n subgraphs: parts.subgraphs ?? [],\n nodeFns: this.buildNodeFns(jsHandlerNodeIds, parts.handlers),\n toolFns,\n conditions: this.buildConditionFns(parts.conditions),\n agents: agentConfigs,\n components: componentConfigs,\n mapAgents: mapAgentConfigs,\n jsNodeIds: jsHandlerNodeIds,\n jsToolNames: new Set(toolFns.keys()),\n fsPolicy: parts.fsPolicy ?? []\n };\n return tryCreateRustRunner<ChannelValues>(runnerParts);\n }\n\n /**\n * Adapt the (async) JS node handlers into the async producers the Rust seam needs.\n * The Rust side awaits the returned promise, so a handler doing real async work\n * round-trips faithfully. A handler that returns a routing {@link Command} keeps only\n * its `update` map (see {@link toUpdateObject}): the engine routes by the graph's edges.\n */\n private buildNodeFns(\n jsNodeIds: Set<string>,\n handlers: Map<string, NodeHandler>\n ): Map<string, AsyncNodeFn<ChannelValues>> {\n const out = new Map<string, AsyncNodeFn<ChannelValues>>();\n for (const nodeId of jsNodeIds) {\n const handler = handlers.get(nodeId);\n if (handler === undefined) {\n continue;\n }\n out.set(nodeId, async (state) => {\n // Match the TS runtime's call convention: the first arg is the channel map\n // (`handler(state.channels, state, ctx)` in graph-runtime). Some handlers —\n // notably the tool node from `createToolNode` — read their channels from this\n // `input` arg, not `state.channels`, so passing `null` would break them.\n const result = await handler(state.channels, state as unknown as GraphState, syntheticContext());\n return toUpdateObject(result);\n });\n }\n return out;\n }\n\n /** Async tool executes for every JS-backed tool across all agent nodes. */\n private buildToolFns(agentConfigs: Map<string, RustAgentConfig>): Map<string, AsyncToolFn> {\n const out = new Map<string, AsyncToolFn>();\n for (const config of agentConfigs.values()) {\n for (const binding of config.toolBindings) {\n out.set(binding.name, (input) => binding.execute(input));\n }\n }\n return out;\n }\n\n /** The named condition predicates, retyped for the Rust seam (already synchronous). */\n private buildConditionFns(\n conditions: Map<string, ConditionFn>\n ): Map<string, (state: TypedGraphState<ChannelValues>) => boolean> {\n const out = new Map<string, (state: TypedGraphState<ChannelValues>) => boolean>();\n for (const [name, fn] of conditions) {\n out.set(name, (state) => fn(state as unknown as GraphState));\n }\n return out;\n }\n\n /** True when this graph executes on the Rust engine. */\n public get usesRustEngine(): boolean {\n return this.rustRunner !== null;\n }\n\n /** Start a fresh run from the entry node and execute until completion or suspension. */\n public async run(\n initialData: InitialData<TState> = {} as InitialData<TState>,\n options?: RunOptions\n ): Promise<TypedGraphState<TState>> {\n const runId = options?.runId ?? generateRunId();\n const state = await this.rustRunner!.run(\n runId,\n initialData as Record<string, unknown>,\n options?.inbox ?? {}\n );\n this.captureSuspension(state);\n return state as unknown as TypedGraphState<TState>;\n }\n\n /** Resume a previously suspended run from its latest checkpoint. */\n public async resume(runId: RunId): Promise<TypedGraphState<TState>> {\n const suspended = this.requireSuspendedState(runId);\n const state = await this.rustRunner!.resume(suspended);\n this.captureSuspension(state);\n return state as unknown as TypedGraphState<TState>;\n }\n\n /**\n * Grant approval for the named tools and resume a run that suspended for approval\n * (an agent node with `suspendForApproval`). The approved tools are written into\n * `__approvedTools` by the engine before resuming, so the agent re-runs and executes\n * the now-approved tools instead of gating them again. An agent never approves its own\n * tools; this is the human seam.\n */\n public async approveAndResume(\n runId: RunId,\n options: ApproveAndResumeOptions\n ): Promise<TypedGraphState<TState>> {\n const resolvedBy = typeof options.resolvedBy === \"string\" ? options.resolvedBy.trim() : \"\";\n if (resolvedBy === \"\") {\n throw new ApproverRequiredError();\n }\n const suspended = this.requireSuspendedState(runId);\n const wire = this.toApprovedToolWire(options.approvedTools, resolvedBy);\n const state = await this.rustRunner!.approveAndResume(suspended, wire);\n this.captureSuspension(state);\n return state as unknown as TypedGraphState<TState>;\n }\n\n /**\n * Deliver an external signal to a run suspended on a `waitForSignal` node, then\n * resume it: the payload is injected into the `__signals` channel under `name` and\n * the run advances past the waiting node. The seam a control plane uses to wake a\n * run on an external event (a webhook, a message, an approval-out-of-band).\n *\n * Durable timers + external signals run natively on the **Rust engine** (the only\n * runtime). The seam a control plane uses to wake a run on an external event.\n */\n public async signal(\n runId: RunId,\n name: string,\n payload?: unknown\n ): Promise<TypedGraphState<TState>> {\n const suspended = this.requireSuspendedState(runId);\n const state = await this.rustRunner!.signal(suspended, name, payload);\n this.captureSuspension(state);\n return state as unknown as TypedGraphState<TState>;\n }\n\n /**\n * Project granted tool names into the wire shape the Rust engine validates: each\n * tool carries the principal that requested it (the owning agent node) and the\n * distinct principal granting it. Names are sorted so the wire payload is\n * deterministic regardless of the caller's ordering.\n */\n private toApprovedToolWire(\n approvedTools: Array<string | { name: string; key?: string }>,\n resolvedBy: string\n ): ApprovedToolWire[] {\n return approvedTools\n .map((grant) => (typeof grant === \"string\" ? { name: grant } : grant))\n .sort((a, b) => (a.key ?? a.name).localeCompare(b.key ?? b.name))\n .map((grant) => ({\n name: grant.name,\n key: grant.key,\n requestedBy: this.requesterOfTool(grant.name),\n resolvedBy\n }));\n }\n\n /** The agent node that declared `toolName` as approval-gated, as the request principal. */\n private requesterOfTool(toolName: string): string {\n for (const binding of this.agentApprovals.values()) {\n if (binding.approvalToolNames.includes(toolName)) {\n return binding.requestedBy;\n }\n }\n // No owning agent on record (e.g. a channel-only grant): fall back to the first\n // agent's requester, else a neutral principal. The Rust guard-rail still rejects a\n // resolver equal to whatever requester we report, so the invariant is preserved.\n const first = this.agentApprovals.values().next().value as AgentApprovalBinding | undefined;\n return first?.requestedBy ?? \"agent\";\n }\n\n /**\n * Stream events as the graph executes. See {@link StreamMode} for the available\n * shapes. The modes are projected, incrementally, over the run-event feed that crosses\n * napi:\n * - `updates` — a `state_update` per node completion (`delta` = the node's output).\n * - `values` — a full `state_value` per node completion, accumulated by replaying the\n * node deltas through the channel reducers (the SDK mirrors the engine's reducers),\n * plus a final authoritative `state_value` from the resolved run.\n * - `messages` — a `message_delta` per new entry appended to the `messages` channel,\n * plus (ADR 0033, when the run opts into `streamTokens`) a `message_delta` per LLM\n * token delta, grouped by `messageId`.\n * - `debug` — every run-lifecycle event wrapped as a `debug` payload.\n */\n public stream(\n initialData: InitialData<TState>,\n mode: StreamMode,\n options?: RunOptions\n ): AsyncIterable<StreamEvent> {\n const runId = options?.runId ?? generateRunId();\n return this.streamViaRust(runId, initialData, mode);\n }\n\n /** Seed a running channel map from the graph's channel defaults + the run's input. */\n private seedChannels(initialData: InitialData<TState>): Record<string, unknown> {\n const running: Record<string, unknown> = {};\n for (const [name, def] of Object.entries(this.definition.channels)) {\n running[name] = (initialData as Record<string, unknown>)[name] ?? def.default ?? null;\n }\n for (const [key, value] of Object.entries(initialData as Record<string, unknown>)) {\n if (!(key in running)) {\n running[key] = value;\n }\n }\n return running;\n }\n\n /** Apply a node delta to the running channels via the declared reducers (engine parity). */\n private applyDelta(running: Record<string, unknown>, delta: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(delta)) {\n const reducer = this.definition.channels[key]?.reducer ?? \"replace\";\n if (reducer === \"append\") {\n const current = running[key];\n const existing = Array.isArray(current) ? current : current == null ? [] : [current];\n running[key] = Array.isArray(value) ? [...existing, ...value] : [...existing, value];\n } else if (reducer === \"merge\" && value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const current = running[key];\n const base =\n current !== null && typeof current === \"object\" && !Array.isArray(current)\n ? (current as Record<string, unknown>)\n : {};\n running[key] = { ...base, ...(value as Record<string, unknown>) };\n } else {\n running[key] = value;\n }\n }\n }\n\n /**\n * Drive the Rust run and project its forwarded run-event feed into {@link StreamEvent}s,\n * incrementally for every mode. Events arrive via the runner's subscriber while the run\n * promise is in flight; a small wake/queue interleaves them with the run's completion.\n */\n private async *streamViaRust(\n runId: RunId,\n initialData: InitialData<TState>,\n mode: StreamMode\n ): AsyncIterable<StreamEvent> {\n const queue: StreamEvent[] = [];\n let notify: (() => void) | null = null;\n const wake = (): void => {\n const resume = notify;\n notify = null;\n resume?.();\n };\n\n // For `values`/`messages` we accumulate channel state across node deltas.\n const running = this.seedChannels(initialData);\n let seenMessages = Array.isArray(running.messages) ? running.messages.length : 0;\n\n const shape = (event: RunEvent): StreamEvent[] => {\n if (event.type === \"node_completed\") {\n const delta = (event.output ?? {}) as Record<string, unknown>;\n if (mode === \"updates\") {\n return [{ type: \"state_update\", delta, nodeId: event.nodeId }];\n }\n this.applyDelta(running, delta);\n if (mode === \"values\") {\n return [{ type: \"state_value\", state: this.syntheticState(runId, event.nodeId, running) }];\n }\n if (mode === \"messages\") {\n const messages = Array.isArray(running.messages) ? running.messages : [];\n const fresh = messages.slice(seenMessages);\n seenMessages = messages.length;\n return fresh.flatMap((message) => messageDeltas(message, event.nodeId));\n }\n }\n // ADR 0033 phase 13: per-token LLM deltas project onto the existing `message_delta`\n // stream event (no new StreamMode). `messageId` groups a turn's tokens so the client\n // concatenates them; `nodeId` is the agent node (or the `mapAgents` node for a spawn).\n if (event.type === \"token_delta\" && mode === \"messages\") {\n return [\n {\n type: \"message_delta\",\n delta: event.delta,\n nodeId: event.nodeId,\n messageId: event.messageId\n }\n ];\n }\n if (mode === \"debug\") {\n const nodeId = (\"nodeId\" in event ? event.nodeId : (\"\" as NodeId)) as NodeId;\n return [{ type: \"debug\", payload: event, nodeId }];\n }\n return [];\n };\n\n // The runner is shared by every run of this compiled graph, so its subscribers see the\n // events of all in-flight runs. Keep only this run's events and those of its child runs\n // (subgraph / map children are `<runId>:<nodeId>[:<index>]`).\n const childPrefix = `${runId}:`;\n const unsubscribe = this.rustRunner!.subscribe((event) => {\n if (event.runId !== runId && !event.runId.startsWith(childPrefix)) {\n return;\n }\n const shaped = shape(event);\n if (shaped.length > 0) {\n queue.push(...shaped);\n wake();\n }\n });\n\n let done = false;\n // ADR 0033 phase 13: `messages` mode is the token-granular consumer, so it opts the\n // run into per-token streaming. Other modes leave it off → agents stay on `complete()`.\n const runPromise = this.rustRunner!.run(\n runId,\n initialData as Record<string, unknown>,\n {},\n mode === \"messages\"\n )\n .then((state) => {\n this.captureSuspension(state);\n return state;\n })\n .finally(() => {\n done = true;\n wake();\n });\n // The rejection is re-thrown to the consumer by the `await runPromise` below. Until then the\n // generator may sit suspended at a `yield`, or the consumer may stop iterating early and never\n // reach that await — mark the promise handled so neither case is an unhandled rejection.\n runPromise.catch(() => undefined);\n\n try {\n for (;;) {\n while (queue.length > 0) {\n yield queue.shift() as StreamEvent;\n }\n if (done) {\n break;\n }\n await new Promise<void>((resolve) => {\n notify = resolve;\n });\n }\n const finalState = await runPromise;\n // A final authoritative snapshot (carries engine-internal channels the accumulator\n // can't see, e.g. __suspend) — only for `values`.\n if (mode === \"values\") {\n yield { type: \"state_value\", state: finalState as unknown as GraphState };\n }\n } finally {\n unsubscribe();\n }\n }\n\n /** A channels-only synthetic GraphState for a `values` stream step. */\n private syntheticState(\n runId: RunId,\n nodeId: NodeId,\n channels: Record<string, unknown>\n ): GraphState {\n return {\n runId,\n graphId: this.definition.id,\n currentNodeId: nodeId,\n status: \"running\",\n channels: { ...channels },\n version: 0,\n createdAt: \"\",\n updatedAt: \"\"\n };\n }\n\n /** Subscribe to the run-event lifecycle stream. Returns an unsubscribe function. */\n public onEvent(handler: (event: RunEvent) => void): () => void {\n return this.eventBus.subscribe(handler);\n }\n\n /**\n * @deprecated The in-process TypeScript runtime. It does not run this graph: the Rust engine\n * does, through `run` / `resume` / `approveAndResume` / `signal` / `stream`.\n */\n public get engine(): GraphRuntime {\n return this.runtime;\n }\n\n /**\n * Explain where a run stands (ADR AI-DX): its status, why it suspended, what unblocks it, and\n * what failed — a structured account a human or an AI agent reads to pick the next move. Reads\n * the suspended state this instance retains; an unknown run id (it completed, failed, or runs on\n * another instance) returns a `status: \"unknown\"` explanation. For an arbitrary run, pass its\n * `GraphState` to {@link explainRun} directly.\n */\n public explain(runId: RunId): RunExplanation {\n const state = this.suspendedStates.get(String(runId));\n if (state === undefined) {\n return {\n runId: String(runId),\n status: \"unknown\",\n currentNode: \"\",\n summary: `No suspended run '${String(runId)}' on this CompiledGraph instance — it has completed, failed, or runs elsewhere. Pass a live GraphState to explainRun(state) to explain any run.`,\n channels: []\n };\n }\n return explainRun(state);\n }\n\n /** Record a run's state if it suspended, so resume/approve can feed it back to Rust. */\n private captureSuspension(state: TypedGraphState<ChannelValues>): void {\n if (state.status === \"suspended\") {\n this.suspendedStates.set(String(state.runId), state as unknown as GraphState);\n } else {\n this.suspendedStates.delete(String(state.runId));\n }\n }\n\n private requireSuspendedState(runId: RunId): GraphState {\n const state = this.suspendedStates.get(String(runId));\n if (state === undefined) {\n throw new ResumeStateNotFoundError(String(runId));\n }\n return state;\n }\n}\n\n/**\n * A minimal {@link NodeExecutionContext} for the Rust seam. The channels-only state\n * the seam delivers carries no memory store, and SDK node handlers reached on the\n * Rust path read `state.channels` only; this satisfies the handler signature without\n * pulling a real store across the boundary.\n */\nconst syntheticContext = (): NodeExecutionContext =>\n ({ memory: undefined as unknown as NodeExecutionContext[\"memory\"] }) satisfies NodeExecutionContext;\n\n/**\n * Project a `messages`-channel entry into stream events for the `messages` mode: a\n * `message_delta` for string content, and a `tool_call` per tool call. Message-level\n * (one delta per whole message) — token-level deltas need gateway token streaming.\n */\nconst messageDeltas = (message: unknown, nodeId: NodeId): StreamEvent[] => {\n if (message === null || typeof message !== \"object\") {\n return [];\n }\n const msg = message as { id?: unknown; content?: unknown; toolCalls?: unknown };\n const out: StreamEvent[] = [];\n const messageId = typeof msg.id === \"string\" ? msg.id : \"\";\n if (typeof msg.content === \"string\" && msg.content.length > 0) {\n out.push({ type: \"message_delta\", delta: msg.content, nodeId, messageId });\n }\n if (Array.isArray(msg.toolCalls)) {\n for (const call of msg.toolCalls) {\n if (call !== null && typeof call === \"object\") {\n const c = call as { id?: unknown; name?: unknown; args?: unknown; input?: unknown };\n out.push({\n type: \"tool_call\",\n toolId: typeof c.id === \"string\" ? c.id : typeof c.name === \"string\" ? c.name : \"\",\n input: c.args ?? c.input ?? null,\n nodeId\n });\n }\n }\n }\n return out;\n};\n\n/**\n * Coerce a resolved node-handler result into the channel-update map the Rust seam\n * applies. A plain object is the update directly. A routing {@link Command}\n * (`{ goto, update? }`) contributes only its `update` map: the engine routes by the\n * graph's edges, so an in-handler `goto` is ignored (use a conditional edge). `null` /\n * primitives yield an empty update, matching Rust's tolerant `parse_update`.\n */\nconst toUpdateObject = (value: unknown): Record<string, unknown> => {\n if (value === null || typeof value !== \"object\") {\n return {};\n }\n const maybeCommand = value as { goto?: unknown; update?: unknown };\n if (maybeCommand.goto !== undefined) {\n return maybeCommand.update !== null && typeof maybeCommand.update === \"object\"\n ? (maybeCommand.update as Record<string, unknown>)\n : {};\n }\n return value as Record<string, unknown>;\n};\n","import { createRequire } from \"node:module\";\n\nimport { GraphValidationError, type GraphDefinition, type GraphValidationErrorCode } from \"@ailu-ai/graph-core\";\n\n/**\n * Optional bridge to the Rust engine's validator (`@ailu-ai/napi`). When the native\n * addon is present, graph validation runs in Rust — the first real consumer flipped\n * onto the Rust core per ADR 0002. When it isn't (no `.node` built), this returns\n * `null` and the SDK falls back to the TypeScript `validateGraph`. Same result either\n * way; the migration is invisible to callers.\n */\ntype NativeValidator = { validateGraphJson(definitionJson: string): string };\ntype RawValidationError = { code: string; message: string; path: (string | number)[] };\n\nlet cachedNative: NativeValidator | null | undefined;\n\nconst loadNative = (): NativeValidator | null => {\n if (cachedNative !== undefined) {\n return cachedNative;\n }\n try {\n const requireFn = createRequire(import.meta.url);\n cachedNative = requireFn(\"@ailu-ai/napi\") as NativeValidator;\n } catch {\n cachedNative = null;\n }\n return cachedNative;\n};\n\n/** True when graph validation is being served by the Rust core. */\nexport const rustValidatorActive = (): boolean => loadNative() !== null;\n\n/**\n * Validate a definition via the Rust core, or `null` if the native addon is\n * unavailable (so the caller can fall back to the TypeScript validator).\n */\nexport const tryRustValidate = (definition: GraphDefinition): GraphValidationError[] | null => {\n const native = loadNative();\n if (native === null) {\n return null;\n }\n try {\n const raw = native.validateGraphJson(JSON.stringify(definition));\n const parsed = JSON.parse(raw) as RawValidationError[];\n return parsed.map(\n (error) => new GraphValidationError(error.code as GraphValidationErrorCode, error.message, error.path)\n );\n } catch {\n // Any boundary hiccup (load, serialize, parse) → let the caller use TS.\n return null;\n }\n};\n","import {\n validateGraph,\n type ChannelDefinition,\n type ChannelReducer,\n type EdgeDefinition,\n type EdgeId,\n type GraphDefinition,\n type GraphId,\n type Message,\n type NodeDefinition,\n type NodeId,\n type NodeType,\n type RetryPolicy\n} from \"@ailu-ai/graph-core\";\nimport type { AgentResult } from \"@ailu-ai/agents-core\";\nimport type { ConditionFn, NodeHandler } from \"@ailu-ai/graph-runtime\";\n\nimport { CompiledGraph } from \"./compiled-graph.js\";\nimport {\n APPROVAL_IDS_CHANNEL,\n APPROVED_TOOLS_CHANNEL,\n createAgentNodeHandler,\n createToolNodeHandler,\n DEFAULT_AGENT_OUTPUT_CHANNEL,\n toAgentApprovalBinding,\n toAgentCarrier,\n toRustAgentConfig,\n type AgentApprovalBinding,\n type AgentNodeConfig,\n type FsPolicyRule,\n type MapAgentNodeConfig,\n type RustAgentConfig,\n type RustMapAgentConfig,\n type TaskNodeConfig,\n type ToolNodeConfig\n} from \"./agent-node.js\";\nimport type { ComponentDescriptor, RustComponentConfig } from \"./components.js\";\nimport {\n DuplicateNodeError,\n GraphCompileError,\n MissingHandlerError,\n UnknownNodeError,\n type Result\n} from \"./errors.js\";\nimport { tryRustValidate } from \"./rust-validator.js\";\nimport type { ChannelValues, EmptyChannels, TypedCondition, TypedNodeHandler } from \"./typed.js\";\n\n/** Options passed to {@link createGraph}. */\nexport type CreateGraphOptions = {\n name: string;\n /** Defaults to a slugified `name`. */\n id?: string;\n /** Semver-ish version string. Defaults to `\"0.0.0\"`. */\n version?: string;\n recursionLimit?: number;\n metadata?: Record<string, unknown>;\n};\n\n/** Channel shorthand: `reducer` defaults to `\"replace\"`. The value type is inferred from `default`. */\nexport type ChannelInput<TValue = unknown> = {\n type: string;\n reducer?: ChannelReducer;\n default?: TValue;\n /** ADR 0032: never emit this channel's value in run events/logs (masked; still checkpointed). */\n noLog?: boolean;\n};\n\n/** Config form for non-trivial nodes. A bare handler is the common case. */\nexport type NodeInput<TState extends ChannelValues> = {\n type?: NodeType;\n handler?: TypedNodeHandler<TState>;\n label?: string;\n retryPolicy?: RetryPolicy;\n metadata?: Record<string, unknown>;\n};\n\nconst slugify = (value: string): string =>\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\") || \"graph\";\n\n/**\n * Fluent builder for an Ailu graph. Add channels, nodes and edges, then\n * {@link GraphBuilder.compile} into a runnable {@link CompiledGraph}.\n *\n * The `TState` type parameter accumulates the declared channels as you call\n * `.channel(...)`, so handler state and the result of `run`/`resume` are fully\n * typed without any manual annotation.\n *\n * Conditions are always **named predicates** registered here — never `eval`'d\n * strings — which is what keeps conditional routing safe and inspectable.\n */\nexport class GraphBuilder<TState extends ChannelValues = EmptyChannels> {\n private readonly options: CreateGraphOptions;\n private readonly channels: Record<string, ChannelDefinition<unknown>> = {};\n private readonly nodes: NodeDefinition[] = [];\n private readonly edges: EdgeDefinition[] = [];\n private readonly handlers = new Map<string, NodeHandler>();\n private readonly conditions = new Map<string, ConditionFn>();\n /** Per agent node, the serializable config the Rust engine bridge needs. */\n private readonly agentConfigs = new Map<string, RustAgentConfig>();\n private readonly mapAgentConfigs = new Map<string, RustMapAgentConfig>();\n /** Per agent node, the governance binding (approval engine + requester) for resume. */\n private readonly agentApprovals = new Map<string, AgentApprovalBinding>();\n /** Per component node, the `{ kind, params }` carrier the Rust engine bridge needs. */\n private readonly componentConfigs = new Map<string, RustComponentConfig>();\n /** Child graphs registered as `subgraph` nodes, keyed by their (global) graph id. */\n private readonly subgraphDefs = new Map<string, GraphDefinition>();\n /** Per-path filesystem permission rules (ADR 0024 phase 2b), applied run-wide. */\n private readonly fsPolicyRules: FsPolicyRule[] = [];\n private entryNodeId: string | undefined;\n\n public constructor(options: CreateGraphOptions) {\n this.options = options;\n }\n\n /** Reinterpret `this` under a wider channel type after declaring a new channel. */\n private widen<TNext extends ChannelValues>(): GraphBuilder<TNext> {\n return this as unknown as GraphBuilder<TNext>;\n }\n\n /** Declare a state channel. `reducer` defaults to `\"replace\"`; value type inferred from `default`. */\n public channel<TName extends string, TValue = unknown>(\n name: TName,\n definition: ChannelInput<TValue>\n ): GraphBuilder<TState & { [K in TName]: TValue }> {\n this.channels[name] = {\n type: definition.type,\n reducer: definition.reducer ?? \"replace\",\n default: definition.default,\n ...(definition.noLog === true ? { noLog: true } : {})\n };\n return this.widen<TState & { [K in TName]: TValue }>();\n }\n\n /** Declare an append-reduced `messages` channel (the conversational default). */\n public messagesChannel<TName extends string = \"messages\">(\n name: TName = \"messages\" as TName\n ): GraphBuilder<TState & { [K in TName]: Message[] }> {\n this.channels[name] = { type: \"messages\", reducer: \"append\", default: [] };\n return this.widen<TState & { [K in TName]: Message[] }>();\n }\n\n /** Shared node-registration path: dedupe, register the handler, default the entry. */\n private pushNode(\n id: string,\n type: NodeType,\n label: string,\n handler?: NodeHandler,\n extras?: { retryPolicy?: RetryPolicy; metadata?: Record<string, unknown> }\n ): void {\n if (this.handlers.has(id) || this.nodes.some((node) => String(node.id) === id)) {\n throw new DuplicateNodeError(id);\n }\n if (handler !== undefined) {\n this.handlers.set(id, handler);\n }\n this.nodes.push({\n id: id as NodeId,\n type,\n label,\n retryPolicy: extras?.retryPolicy,\n metadata: extras?.metadata\n });\n this.entryNodeId ??= id;\n }\n\n /** Declare a channel only if it hasn't been declared yet (for node helpers that need one). */\n private ensureChannel(name: string, definition: ChannelDefinition<unknown>): void {\n if (!(name in this.channels)) {\n this.channels[name] = definition;\n }\n }\n\n /** Add a node. Pass a handler for the common action case, or a config object. */\n public node(id: string, handlerOrConfig: TypedNodeHandler<TState> | NodeInput<TState>): this {\n const config: NodeInput<TState> =\n typeof handlerOrConfig === \"function\" ? { type: \"action\", handler: handlerOrConfig } : handlerOrConfig;\n\n const type: NodeType = config.type ?? \"action\";\n if (type === \"action\" && config.handler === undefined) {\n throw new MissingHandlerError(id);\n }\n\n this.pushNode(id, type, config.label ?? id, config.handler as NodeHandler | undefined, {\n retryPolicy: config.retryPolicy,\n metadata: config.metadata\n });\n return this;\n }\n\n /** Convenience for a `human-gate` node that suspends the run for approval. */\n public humanGate(id: string, options?: { label?: string }): this {\n this.pushNode(id, \"human-gate\", options?.label ?? id);\n return this;\n }\n\n /**\n * Add an agent node: a ReAct agent driven by an LLM gateway. Its result lands in\n * `config.outputChannel` (default `\"agentResult\"`), which is auto-declared and\n * added to the typed state. Route on `result.requiresHumanReview` to gate\n * sensitive tool use.\n */\n public agentNode<TOut extends string = typeof DEFAULT_AGENT_OUTPUT_CHANNEL>(\n id: string,\n config: AgentNodeConfig & { outputChannel?: TOut }\n ): GraphBuilder<TState & { [K in TOut]: AgentResult }> {\n const outputChannel = config.outputChannel ?? DEFAULT_AGENT_OUTPUT_CHANNEL;\n // Capture the serializable projection so the Rust engine bridge can run this agent\n // node natively; the TS handler keeps the TS-engine path working.\n const rustConfig = toRustAgentConfig(id, config);\n // Also emit the SHARED CARRIER on `node.metadata.agent` (the wire-serializable\n // fields only — no LLM gateway, no tool closures) so the persisted GraphDefinition\n // is executable by the control plane's catalog run path and renderable in Studio.\n this.pushNode(id, \"agent\", config.label ?? id, createAgentNodeHandler(id, config), {\n metadata: { agent: toAgentCarrier(rustConfig) }\n });\n this.agentConfigs.set(id, rustConfig);\n this.agentApprovals.set(id, toAgentApprovalBinding(id, config));\n this.ensureChannel(outputChannel, { type: \"agentResult\", reducer: \"replace\" });\n // Channels the control plane / ApprovalEngine use to gate and resume.\n this.ensureChannel(APPROVED_TOOLS_CHANNEL, { type: \"string[]\", reducer: \"replace\", default: [] });\n this.ensureChannel(APPROVAL_IDS_CHANNEL, { type: \"string[]\", reducer: \"replace\", default: [] });\n return this.widen<TState & { [K in TOut]: AgentResult }>();\n }\n\n /**\n * Add a tool node: executes the tool calls emitted by the last AI message in the\n * `messages` channel (auto-declared as an append-reduced messages channel).\n */\n public toolNode(id: string, config: ToolNodeConfig): GraphBuilder<TState & { messages: Message[] }> {\n this.pushNode(id, \"tool\", config.label ?? id, createToolNodeHandler(config));\n this.ensureChannel(\"messages\", { type: \"messages\", reducer: \"append\", default: [] });\n return this.widen<TState & { messages: Message[] }>();\n }\n\n /**\n * Add a **component node**: a pure (no-LLM) compute building block from\n * {@link import(\"./components.js\").components} (e.g. `promptBuilder`, `router`,\n * `retriever`). The node carries the `{ kind, params }` carrier and runs natively on the\n * Rust engine: the bridge routes a `componentNodes` entry to the native handler.\n *\n * ```ts\n * createGraph({ name: \"p\" })\n * .channel(\"name\", { type: \"string\", default: \"\" })\n * .channel(\"prompt\", { type: \"string\", default: \"\" })\n * .component(\"build\", components.promptBuilder({ template: \"Hi {{name}}\", into: \"prompt\" }));\n * ```\n */\n public component(id: string, descriptor: ComponentDescriptor, options?: { label?: string }): this {\n // Push as an `action` node carrying the SHARED CARRIER on `node.metadata.component`, so\n // the persisted GraphDefinition runs on the catalog path (run-catalog-graph.ts) and\n // renders in the Studio editor. The engine runs the native component handler, keyed by\n // the `componentConfigs` carrier below; the descriptor's TS handler is not called.\n this.pushNode(id, \"action\", options?.label ?? id, descriptor.handler, {\n metadata: { component: { kind: descriptor.kind, params: descriptor.params } }\n });\n this.componentConfigs.set(id, { kind: descriptor.kind, params: descriptor.params });\n return this;\n }\n\n /**\n * Add a **subgraph node**: nest another graph (built with its own\n * {@link GraphBuilder}) as a single node. On entry the parent's channels are\n * projected into the child via `inputMapping` (`childKey → parentKey`; omit to copy\n * all parent channels); on completion the child's channels are merged back via\n * `outputMapping` (`parentKey → childKey`; omit to spread all child channels onto\n * the parent). If the child suspends (e.g. an internal human gate), the parent\n * suspends at this node and a parent `resume` re-attaches to the child.\n *\n * The child's wiring (node handlers, conditions, agent/component configs) is merged\n * into the parent — child runs share the parent's registries, keyed by GLOBAL node\n * id — so child node ids must not collide with the parent's. Declare on the parent\n * any channels the `outputMapping` writes into.\n *\n * ```ts\n * const child = createGraph({ name: \"double\", id: \"double\" })\n * .channel(\"in\", { type: \"number\", default: 0 })\n * .channel(\"out\", { type: \"number\", default: 0 })\n * .node(\"calc\", (s) => ({ out: (s.in as number) * 2 }));\n * createGraph({ name: \"parent\" })\n * .channel(\"x\", { type: \"number\", default: 21 })\n * .channel(\"y\", { type: \"number\", default: 0 })\n * .subgraph(\"sub\", child, { inputMapping: { in: \"x\" }, outputMapping: { y: \"out\" } });\n * ```\n */\n public subgraph<TChild extends ChannelValues>(\n id: string,\n child: GraphBuilder<TChild>,\n options?: {\n inputMapping?: Record<string, string>;\n outputMapping?: Record<string, string>;\n label?: string;\n }\n ): this {\n if (this.handlers.has(id) || this.nodes.some((node) => String(node.id) === id)) {\n throw new DuplicateNodeError(id);\n }\n const childParts = child.toSubgraphParts();\n\n // Merge the child's wiring into this builder. Child runs share the parent's\n // registries (the Rust bridge and the TS runtime both look handlers up by global\n // node id), so a child node id colliding with a parent node id is a hard error.\n for (const [nodeId, handler] of childParts.handlers) {\n if (this.handlers.has(nodeId)) {\n throw new DuplicateNodeError(nodeId);\n }\n this.handlers.set(nodeId, handler);\n }\n for (const [name, fn] of childParts.conditions) {\n this.conditions.set(name, fn);\n }\n for (const [nodeId, config] of childParts.agentConfigs) {\n this.agentConfigs.set(nodeId, config);\n }\n for (const [nodeId, config] of childParts.mapAgentConfigs) {\n this.mapAgentConfigs.set(nodeId, config);\n }\n for (const [nodeId, binding] of childParts.agentApprovals) {\n this.agentApprovals.set(nodeId, binding);\n }\n for (const [nodeId, config] of childParts.componentConfigs) {\n this.componentConfigs.set(nodeId, config);\n }\n // Register the child graph + any subgraphs it nested in turn.\n this.subgraphDefs.set(String(childParts.definition.id), childParts.definition);\n for (const [graphId, definition] of childParts.subgraphDefs) {\n this.subgraphDefs.set(graphId, definition);\n }\n\n this.nodes.push({\n id: id as NodeId,\n type: \"subgraph\",\n label: options?.label ?? id,\n subgraphId: childParts.definition.id,\n inputMapping: options?.inputMapping,\n outputMapping: options?.outputMapping\n });\n this.entryNodeId ??= id;\n return this;\n }\n\n /**\n * Add a **task node** (ADR 0022/0023, phase 1): spawn a sub-agent in an isolated\n * context that returns a single compressed report. It is sugar over\n * {@link GraphBuilder.subgraph} — the sub-agent runs as a one-node child graph, so\n * the spawn is a real node: **checkpointed, audited, and human-gate-preserving**.\n * If the sub-agent suspends for approval, the whole run suspends and a parent\n * `resume`/`approveAndResume` re-attaches to it. No new runtime path is added.\n *\n * Isolation: only `objectiveChannel` crosses into the child (`inputMapping`), and\n * only the child's `reportChannel` crosses back (`outputMapping`) — the sub-agent\n * never sees the parent's other channels, and the parent never sees the child's\n * intermediate work. With `compress` (default), the sub-agent runs\n * `outputStyle: \"terse\"` so the report is a summary, not a full transcript.\n *\n * ```ts\n * createGraph({ name: \"research\" })\n * .channel(\"objective\", { type: \"string\", default: \"\" })\n * .taskNode(\"dig\", { subAgent: { llm, prompt: { system: \"Research deeply.\" } } });\n * // -> state.report : AgentResult\n * ```\n */\n public taskNode<TReport extends string = \"report\">(\n id: string,\n config: TaskNodeConfig & { reportChannel?: TReport }\n ): GraphBuilder<TState & { [K in TReport]: AgentResult }> {\n const objectiveChannel = config.objectiveChannel ?? \"objective\";\n const reportChannel = (config.reportChannel ?? \"report\") as TReport;\n const compress = config.compress ?? true;\n\n // The sub-agent runs as a one-node child graph. Its id is namespaced under the task\n // node id so it cannot collide with parent node ids when the child wiring is merged.\n const childAgentId = `${id}__agent`;\n const child = createGraph({ name: `${id}-task`, id: `${id}-task` })\n .channel(objectiveChannel, { type: \"string\", default: \"\" })\n .agentNode(childAgentId, {\n ...config.subAgent,\n outputChannel: reportChannel,\n outputStyle: compress ? \"terse\" : config.subAgent.outputStyle\n });\n\n // The parent must declare the channel the outputMapping writes into; the objective\n // source channel is ensured too (idempotent) for ergonomics.\n this.ensureChannel(objectiveChannel, { type: \"string\", reducer: \"replace\", default: \"\" });\n this.ensureChannel(reportChannel, { type: \"agentResult\", reducer: \"replace\" });\n\n this.subgraph(id, child, {\n inputMapping: { [objectiveChannel]: objectiveChannel },\n outputMapping: { [reportChannel]: reportChannel },\n label: config.label ?? id\n });\n return this.widen<TState & { [K in TReport]: AgentResult }>();\n }\n\n /**\n * Add a **mapAgents node** (ADR 0027 phase 4b — dynamic fan-out): run `config.subAgent` once\n * per item in the `config.overChannel` array, **concurrently**, and write the per-item results\n * — in **input order** (deterministic, resumable) — into `config.joinAt` as an array. Each spawn\n * gets one item as its `input` and shares the run's channels. If a spawn needs approval and\n * `suspendForApproval` is set, the whole map suspends; resume re-runs it.\n *\n * ```ts\n * createGraph({ name: \"fanout\" })\n * .channel(\"items\", { type: \"json\", default: [] })\n * .mapAgents(\"research\", {\n * overChannel: \"items\",\n * subAgent: { llm, prompt: { system: \"Summarise the item.\" } },\n * joinAt: \"summaries\"\n * });\n * ```\n */\n public mapAgents<TJoin extends string>(\n id: string,\n config: MapAgentNodeConfig & { joinAt: TJoin }\n ): GraphBuilder<TState & { [K in TJoin]: AgentResult[] }> {\n // The sub-agent is projected exactly like an ordinary agent; the bridge runs it per item.\n const agent = toRustAgentConfig(`${id}__agent`, config.subAgent);\n // A native node (Rust dispatch routes it via the `mapAgents` carrier); no TS handler — the\n // SDK runs on the Rust engine. The node carries the SHARED CARRIER so the catalog/Studio path\n // can run it too.\n this.pushNode(id, \"agent\", config.label ?? id, undefined, {\n metadata: {\n mapAgents: {\n overChannel: config.overChannel,\n joinAt: config.joinAt,\n suspendForApproval: config.suspendForApproval === true,\n subAgent: toAgentCarrier(agent)\n }\n }\n });\n this.mapAgentConfigs.set(id, {\n overChannel: config.overChannel,\n joinAt: config.joinAt,\n agent,\n suspendForApproval: config.suspendForApproval === true\n });\n this.ensureChannel(config.overChannel, { type: \"json\", reducer: \"replace\", default: [] });\n this.ensureChannel(config.joinAt, { type: \"json\", reducer: \"replace\", default: [] });\n this.ensureChannel(APPROVED_TOOLS_CHANNEL, { type: \"string[]\", reducer: \"replace\", default: [] });\n return this.widen<TState & { [K in TJoin]: AgentResult[] }>();\n }\n\n /**\n * @internal Extract this builder's wiring so it can be nested as a subgraph by a\n * parent {@link GraphBuilder.subgraph}. Returns live maps (the parent merges them);\n * not part of the public authoring API.\n */\n public toSubgraphParts(): {\n definition: GraphDefinition;\n handlers: Map<string, NodeHandler>;\n conditions: Map<string, ConditionFn>;\n agentConfigs: Map<string, RustAgentConfig>;\n mapAgentConfigs: Map<string, RustMapAgentConfig>;\n agentApprovals: Map<string, AgentApprovalBinding>;\n componentConfigs: Map<string, RustComponentConfig>;\n subgraphDefs: Map<string, GraphDefinition>;\n } {\n return {\n definition: this.buildDefinition(),\n handlers: this.handlers,\n conditions: this.conditions,\n agentConfigs: this.agentConfigs,\n mapAgentConfigs: this.mapAgentConfigs,\n agentApprovals: this.agentApprovals,\n componentConfigs: this.componentConfigs,\n subgraphDefs: this.subgraphDefs\n };\n }\n\n /**\n * Fan out from an existing node to a fixed set of branch nodes that run\n * **concurrently** on the Rust engine, then join at `joinAt`. Each branch executes\n * from the same pre-fan-out state snapshot and the branch updates are merged in the\n * declared `parallelTo` order (deterministic, regardless of which branch finishes\n * first — ADR 0015). The `from` node runs first (its handler/agent), then its branches\n * scatter; control resumes at `joinAt` once every branch completes.\n *\n * This is the supported way to run **N parallel LLM calls** (each branch an\n * {@link GraphBuilder.agentNode}) on the public SDK — no static edges are needed for\n * the fan-out itself (it is its own routing). `parallelTo` is a fixed set declared at\n * build time; dynamic per-item map over a runtime-sized list is a separate primitive.\n *\n * `from` must already be added; `parallelTo` and `joinAt` are validated at compile.\n */\n public fanOut(from: string, parallelTo: string[], joinAt: string): this {\n const node = this.nodes.find((candidate) => String(candidate.id) === from);\n if (node === undefined) {\n throw new UnknownNodeError(from, \"fanOut(from, …)\");\n }\n node.fanOut = {\n parallelTo: parallelTo.map((id) => id as NodeId),\n joinAt: joinAt as NodeId\n };\n return this;\n }\n\n /** Add an unconditional edge from one node to another. */\n public edge(from: string, to: string): this {\n this.edges.push({\n id: `e_${from}_${to}_${this.edges.length}` as EdgeId,\n from: from as NodeId,\n to: to as NodeId,\n type: \"default\"\n });\n return this;\n }\n\n /**\n * Add a conditional edge guarded by a named predicate. The predicate is\n * registered under `conditionName` and evaluated against the live (typed) state.\n */\n public conditionalEdge(\n from: string,\n to: string,\n conditionName: string,\n predicate: TypedCondition<TState>\n ): this {\n this.conditions.set(conditionName, predicate as ConditionFn);\n this.edges.push({\n id: `e_${from}_${to}_${this.edges.length}` as EdgeId,\n from: from as NodeId,\n to: to as NodeId,\n type: \"conditional\",\n condition: conditionName\n });\n return this;\n }\n\n /**\n * ADR 0076 — governed error branch: once `from`'s `retryPolicy` is exhausted, the run reroutes\n * to `to` instead of failing (`node_error_routed` event, `channels.__lastError` populated)\n * rather than the run terminating (`run_failed`). At most one per node (enforced at compile via\n * `validateGraph`). Implemented in BOTH the Rust engine (`crates/graph-core`/`graph-runtime`,\n * the path every catalog/native run takes) and the TS legacy `@ailu-ai/graph-runtime` —\n * this builder always compiles to Rust, so this edge type works end to end here.\n */\n public errorEdge(from: string, to: string): this {\n this.edges.push({\n id: `e_${from}_${to}_${this.edges.length}` as EdgeId,\n from: from as NodeId,\n to: to as NodeId,\n type: \"error\"\n });\n return this;\n }\n\n /** Override the entry node (defaults to the first node added). */\n public entry(nodeId: string): this {\n this.entryNodeId = nodeId;\n return this;\n }\n\n private buildDefinition(): GraphDefinition {\n return {\n id: (this.options.id ?? slugify(this.options.name)) as GraphId,\n version: this.options.version ?? \"0.0.0\",\n name: this.options.name,\n recursionLimit: this.options.recursionLimit,\n channels: this.channels,\n nodes: this.nodes,\n edges: this.edges,\n entryNodeId: (this.entryNodeId ?? \"\") as NodeId,\n metadata: this.options.metadata\n };\n }\n\n /**\n * Declare per-path filesystem permission rules (ADR 0024 phase 2b) applied run-wide\n * to every agent created with `enableFs: true`. Verbs: `deny|read|write|gate`;\n * resolution is most-specific-glob-wins, fail-closed — an unmatched path resolves to\n * `read`, so writes need an explicit `write` rule (`gate` is enforced from phase 2c).\n * Repeated calls append. `*` matches within a path segment, `**` across segments.\n *\n * ```ts\n * createGraph({ name: \"deep\" })\n * .fsPolicy([{ glob: \"scratch/**\", verb: \"write\" }, { glob: \"secret/**\", verb: \"deny\" }])\n * .agentNode(\"worker\", { llm, prompt: { system: \"...\" }, enableFs: true });\n * ```\n */\n public fsPolicy(rules: FsPolicyRule[]): this {\n this.fsPolicyRules.push(...rules);\n return this;\n }\n\n /** Validate and compile, returning a {@link Result} instead of throwing. */\n public safeCompile(): Result<CompiledGraph<TState>, GraphCompileError> {\n const definition = this.buildDefinition();\n const subgraphs = [...this.subgraphDefs.values()];\n // Validate the parent AND every registered subgraph (each is a standalone graph),\n // via the Rust core when its native addon is present; otherwise TS.\n const errors = [definition, ...subgraphs].flatMap(\n (graph) => tryRustValidate(graph) ?? validateGraph(graph)\n );\n if (errors.length > 0) {\n return { success: false, error: new GraphCompileError(errors) };\n }\n\n return {\n success: true,\n data: new CompiledGraph<TState>({\n definition,\n handlers: this.handlers,\n conditions: this.conditions,\n agentConfigs: this.agentConfigs,\n mapAgentConfigs: this.mapAgentConfigs,\n agentApprovals: this.agentApprovals,\n componentConfigs: this.componentConfigs,\n subgraphs,\n fsPolicy: this.fsPolicyRules\n })\n };\n }\n\n /** Validate and compile into a runnable graph. Throws {@link GraphCompileError} on failure. */\n public compile(): CompiledGraph<TState> {\n const result = this.safeCompile();\n if (!result.success) {\n throw result.error;\n }\n return result.data;\n }\n}\n\n/** Entry point: start building a graph. */\nexport const createGraph = (options: CreateGraphOptions): GraphBuilder<EmptyChannels> =>\n new GraphBuilder<EmptyChannels>(options);\n","import type { GraphState } from \"@ailu-ai/graph-core\";\n\n/**\n * Dynamic-message (`send`) helpers. Pre-queue inputs for a node via\n * {@link import(\"./compiled-graph.js\").RunOptions.inbox}; each node execution consumes\n * the next queued input, exposed under the reserved `__injected` channel. A node handler\n * reads it with {@link readInjected}. The map-reduce / dynamic-dispatch seam.\n */\n\n/** Reserved channel exposing a `send`-injected input to a node handler (per execution). */\nexport const INJECTED_KEY = \"__injected\";\n\n/**\n * Read the `send`-injected input from a node's state, if the node consumed a queued\n * input this execution; `undefined` otherwise. The value is visible to the handler only\n * and is never persisted into the run's channels.\n */\nexport const readInjected = (state: Pick<GraphState, \"channels\">): unknown =>\n (state.channels as Record<string, unknown>)[INJECTED_KEY];\n","/**\n * The component library surface: pure (no-LLM) compute building blocks addressable\n * by a string `kind` plus a `params` object. Mirrors the Rust `ailu_components`\n * library (`crates/components`) one-for-one in kind, params and behaviour.\n *\n * Each factory in {@link components} returns a {@link ComponentDescriptor}: the Phase\n * C carrier the Rust engine needs (`{ kind, params }`, surfaced as the graph's\n * `componentNodes` map) **and** a faithful TypeScript `handler` for the fallback path\n * when the native addon is absent. The components are simple and pure, so the two\n * implementations agree byte-for-byte on ASCII input.\n *\n * Use {@link GraphBuilder.component} to push a node carrying both:\n *\n * ```ts\n * import { createGraph, components } from \"@ailu-ai/graph-sdk\";\n *\n * const app = createGraph({ name: \"prompt\" })\n * .channel(\"name\", { type: \"string\", default: \"\" })\n * .channel(\"prompt\", { type: \"string\", default: \"\" })\n * .component(\"build\", components.promptBuilder({ template: \"Hi {{name}}\", into: \"prompt\" }))\n * .compile();\n * ```\n */\n\nimport { createHash } from \"node:crypto\";\n\nimport type { NodeHandler } from \"@ailu-ai/graph-runtime\";\n\n/** The component kinds the library knows, matching `ComponentRegistry::kinds()`. */\nexport type ComponentKind =\n | \"promptBuilder\"\n | \"jsonValidator\"\n | \"outputParser\"\n | \"router\"\n | \"retriever\"\n | \"reranker\"\n | \"textCleaner\"\n | \"documentSplitter\"\n | \"htmlToText\"\n | \"csvParser\"\n | \"documentJoiner\"\n | \"deduplicator\"\n | \"truncator\"\n | \"regexExtractor\"\n | \"answerBuilder\"\n | \"fieldMapper\"\n | \"fieldExtractor\"\n // --- wave two: Haystack-gap coverage (all pure, deterministic) ---\n | \"bm25Retriever\"\n | \"keywordRetriever\"\n | \"sentenceWindowSplitter\"\n | \"languageDetector\"\n | \"metadataFilter\"\n | \"listJoiner\"\n | \"mergeRanker\"\n | \"evaluator\"\n | \"chatMessageBuilder\"\n | \"conditionalRouter\"\n | \"documentWriter\";\n\n/**\n * The serializable projection of a component node the Rust engine bridge consumes\n * (the Phase C `componentNodes` carrier, camelCase): a component `kind` plus its\n * validated `params` object. Pure data — no closures.\n */\nexport type RustComponentConfig = {\n kind: ComponentKind;\n params: Record<string, unknown>;\n};\n\n/**\n * What a component factory returns: the Phase C carrier (`kind` + `params`) so the\n * node runs natively on Rust, plus an equivalent TS {@link NodeHandler} for the\n * fallback path. {@link GraphBuilder.component} pushes a node from this descriptor.\n */\nexport type ComponentDescriptor = RustComponentConfig & {\n /** The faithful TS-equivalent handler used when the native addon is absent. */\n handler: NodeHandler;\n};\n\n/**\n * What an **integration component** factory returns (the vendor-I/O pattern, e.g.\n * {@link components.httpFetch} / {@link components.webSearch}). Unlike a\n * {@link ComponentDescriptor}, an integration component is **not** a Rust component:\n * it has no `kind`/`params` carrier and is **not** registered in `componentNodes`.\n * It is a plain `NodeHandler` (an injectable closure over an injected I/O impl) added\n * as a regular JS node via {@link import(\"./builder.js\").GraphBuilder.node}; on the\n * Rust engine it runs over the async JS seam (`on_node`) like any other JS handler.\n *\n * ```ts\n * createGraph({ name: \"fetch\" })\n * .channel(\"body\", { type: \"json\", default: null })\n * .node(\"get\", components.httpFetch({ url: \"https://x\", into: \"body\", fetchImpl: fake }));\n * ```\n */\nexport type IntegrationComponentHandler = NodeHandler;\n\n// --- shared text/value helpers (mirror the Rust `value_to_text`) -------------\n\n/**\n * Coerce a channel value to text the way the Rust `value_to_text` does: strings pass\n * through unquoted, `null`/`undefined` become the empty string, everything else is\n * compact JSON.\n */\nconst valueToText = (value: unknown): string => {\n if (typeof value === \"string\") {\n return value;\n }\n if (value === null || value === undefined) {\n return \"\";\n }\n return JSON.stringify(value);\n};\n\nconst channelsOf = (state: { channels: unknown }): Record<string, unknown> =>\n (state.channels ?? {}) as Record<string, unknown>;\n\n// --- promptBuilder -----------------------------------------------------------\n\n/** ADR 0044 D3 (ailu#578) capsule-assembly config for {@link components.promptBuilder}.\n * `chunksFrom`/`queryFrom` are required, `discardedFrom` is optional (defaults to none) — a\n * capsule-assembly node needs to be told explicitly which upstream channel holds the query and\n * which channels hold this pipeline's discarded candidates (they can be scattered across several\n * stages — D2's `{into}Discarded` channels are stage-local, not a single sibling of `chunksFrom`). */\nexport type PromptBuilderCapsuleConfig = {\n into: string;\n chunksFrom: string;\n queryFrom: string;\n discardedFrom?: string[];\n};\n\n/** Params for {@link components.promptBuilder}. */\nexport type PromptBuilderParams = {\n /** Template with `{{var}}` placeholders filled from the channels. */\n template: string;\n /** Channel the rendered string is written into. */\n into: string;\n /** Optional retrieval-proof-capsule assembly (ADR 0044 D3) — captures the exact set that\n * influenced the model, hashed at the ONE node that knows what text was actually templated. */\n capsule?: PromptBuilderCapsuleConfig;\n};\n\n/**\n * Render every `{{ name }}` placeholder from the channels (whitespace inside the\n * braces tolerated; unknown placeholders render empty). Mirrors `render_template`.\n */\nconst renderTemplate = (template: string, channels: Record<string, unknown>): string =>\n // One brace-free repetition (the name is trimmed below): linear, unlike `\\s*([^}]*?)\\s*`.\n template.replace(/\\{\\{([^{}]*)\\}\\}/g, (_match, rawName: string) => {\n const name = rawName.trim();\n return name in channels ? valueToText(channels[name]) : \"\";\n });\n\nconst sha256Hex = (input: string): string => createHash(\"sha256\").update(input).digest(\"hex\");\n\n/** Assemble the `RetrievalCapsule` (ADR 0044 D3). Mirrors `build_retrieval_capsule` in Rust. */\nconst buildRetrievalCapsule = (\n cfg: PromptBuilderCapsuleConfig,\n channels: Record<string, unknown>,\n rendered: string\n): unknown => {\n const chunksArr = Array.isArray(channels[cfg.chunksFrom]) ? (channels[cfg.chunksFrom] as unknown[]) : [];\n const asRecord = (item: unknown): Record<string, unknown> =>\n typeof item === \"object\" && item !== null && !Array.isArray(item) ? (item as Record<string, unknown>) : {};\n const order = chunksArr.map((item) => asRecord(item).id ?? null);\n const chunks = chunksArr.map((item) => {\n const record = asRecord(item);\n return { id: record.id ?? null, provenance: record.provenance ?? [] };\n });\n\n const discarded = (cfg.discardedFrom ?? []).flatMap((name) =>\n Array.isArray(channels[name]) ? (channels[name] as unknown[]) : []\n );\n\n const queryText = cfg.queryFrom in channels ? valueToText(channels[cfg.queryFrom]) : \"\";\n\n return {\n order,\n chunks,\n discarded,\n renderedHash: sha256Hex(rendered),\n queryHash: sha256Hex(queryText)\n };\n};\n\nconst promptBuilderHandler =\n (params: PromptBuilderParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const rendered = renderTemplate(params.template, channels);\n const update: Record<string, unknown> = { [params.into]: rendered };\n if (params.capsule !== undefined) {\n update[params.capsule.into] = buildRetrievalCapsule(params.capsule, channels, rendered);\n }\n return update;\n };\n\n// --- jsonValidator -----------------------------------------------------------\n\n/** Params for {@link components.jsonValidator}. */\nexport type JsonValidatorParams = {\n /** Channel whose value is validated. */\n from: string;\n /** Required object keys to assert present. */\n requiredKeys?: string[];\n /** Expected JSON type (`\"object\" | \"array\" | \"string\" | ...`). */\n expectType?: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"null\";\n /** Channel receiving the `boolean` validity flag. */\n okInto: string;\n /** Channel receiving the `string[]` of validation errors. */\n errorsInto: string;\n};\n\n/** The JSON type name of a value, matching the Rust `json_type_name` vocabulary. */\nconst jsonTypeName = (value: unknown): JsonValidatorParams[\"expectType\"] => {\n if (value === null) {\n return \"null\";\n }\n if (Array.isArray(value)) {\n return \"array\";\n }\n switch (typeof value) {\n case \"boolean\":\n return \"boolean\";\n case \"number\":\n return \"number\";\n case \"string\":\n return \"string\";\n case \"object\":\n return \"object\";\n default:\n // `undefined`/`function`/`symbol` aren't JSON; treat as null, matching the\n // Rust path where an absent channel reads as `Value::Null`.\n return \"null\";\n }\n};\n\nconst jsonValidatorHandler =\n (params: JsonValidatorParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const value = params.from in channels ? channels[params.from] : null;\n const errors: string[] = [];\n\n if (params.expectType !== undefined) {\n const actual = jsonTypeName(value);\n if (actual !== params.expectType) {\n errors.push(`expected type \\`${params.expectType}\\` but got \\`${actual}\\``);\n }\n }\n\n const requiredKeys = params.requiredKeys ?? [];\n if (requiredKeys.length > 0) {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n for (const key of requiredKeys) {\n if (!(key in obj)) {\n errors.push(`missing required key \\`${key}\\``);\n }\n }\n } else {\n errors.push(\"expected an object to check required keys\");\n }\n }\n\n return { [params.okInto]: errors.length === 0, [params.errorsInto]: errors };\n };\n\n// --- outputParser ------------------------------------------------------------\n\n/** Params for {@link components.outputParser}. */\nexport type OutputParserParams = {\n /** Text channel to extract the first JSON value from. */\n from: string;\n /** Channel receiving the parsed value (or `null` when none is found). */\n into: string;\n};\n\n/**\n * Find the first balanced JSON object or array in `text` and parse it, skipping over\n * string literals (and escaped quotes) so braces inside strings don't confuse depth.\n * Mirrors the Rust `extract_first_json`. Returns `null` when nothing parses.\n */\nconst extractFirstJson = (text: string): unknown => {\n const startMatch = /[{[]/.exec(text);\n if (startMatch === null) {\n return null;\n }\n const start = startMatch.index;\n const open = text[start];\n const close = open === \"{\" ? \"}\" : \"]\";\n\n let depth = 0;\n let inString = false;\n let escaped = false;\n for (let i = start; i < text.length; i += 1) {\n const ch = text[i];\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (ch === \"\\\\\") {\n escaped = true;\n } else if (ch === '\"') {\n inString = false;\n }\n } else if (ch === '\"') {\n inString = true;\n } else if (ch === open) {\n depth += 1;\n } else if (ch === close) {\n depth -= 1;\n if (depth === 0) {\n const candidate = text.slice(start, i + 1);\n try {\n return JSON.parse(candidate) as unknown;\n } catch {\n return null;\n }\n }\n }\n }\n return null;\n};\n\nconst outputParserHandler =\n (params: OutputParserParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const raw = params.from in channels ? valueToText(channels[params.from]) : \"\";\n return { [params.into]: extractFirstJson(raw) };\n };\n\n// --- router ------------------------------------------------------------------\n\n/** One routing rule for {@link components.router}. */\nexport type RouterRule = {\n /** Exact match against the textual form of the `from` value. */\n equals?: string;\n /** Substring match against the textual form of the `from` value. */\n contains?: string;\n /** The route string emitted when this rule matches. */\n route: string;\n};\n\n/** Params for {@link components.router}. */\nexport type RouterParams = {\n /** Channel whose value is matched against the rules. */\n from: string;\n /** Ordered rules; the first match wins. */\n rules: RouterRule[];\n /** Route emitted when no rule matches. */\n defaultRoute: string;\n /** Channel the chosen route string is written into. */\n into: string;\n};\n\n/**\n * Whether a rule matches: `equals` checks exact text equality; `contains` checks for\n * a substring; both must hold when both are set; neither set never matches. Mirrors\n * the Rust `rule_matches`.\n */\nconst ruleMatches = (rule: RouterRule, text: string): boolean => {\n let hadPredicate = false;\n if (rule.equals !== undefined) {\n hadPredicate = true;\n if (text !== rule.equals) {\n return false;\n }\n }\n if (rule.contains !== undefined) {\n hadPredicate = true;\n if (!text.includes(rule.contains)) {\n return false;\n }\n }\n return hadPredicate;\n};\n\nconst routerHandler =\n (params: RouterParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const value = params.from in channels ? channels[params.from] : null;\n const text = valueToText(value);\n const chosen = params.rules.find((rule) => ruleMatches(rule, text))?.route ?? params.defaultRoute;\n return { [params.into]: chosen };\n };\n\n// --- retriever / reranker shared embedding ----------------------------------\n\n/**\n * The deterministic 4-bucket count vector used by `ailu_rag_pipeline`'s mock\n * embedder: bucket `codePoint % 4` is incremented per character. Mirrors the Rust\n * `mock_embed` (which uses `ch as u32`), so iterate by code point.\n */\nconst mockEmbed = (text: string): number[] => {\n const counts = [0, 0, 0, 0];\n for (const char of text) {\n const idx = (char.codePointAt(0) ?? 0) % counts.length;\n counts[idx] = (counts[idx] ?? 0) + 1;\n }\n return counts;\n};\n\n/** Cosine similarity of two equal-length vectors; mirrors `cosine_similarity`. */\nconst cosineSimilarity = (a: number[], b: number[]): number => {\n let dot = 0;\n let normA = 0;\n let normB = 0;\n for (let i = 0; i < a.length; i += 1) {\n const av = a[i] ?? 0;\n const bv = b[i] ?? 0;\n dot += av * bv;\n normA += av * av;\n normB += bv * bv;\n }\n if (normA === 0 || normB === 0) {\n return 0;\n }\n return dot / (Math.sqrt(normA) * Math.sqrt(normB));\n};\n\n// --- retriever ---------------------------------------------------------------\n\n/** A candidate document for {@link components.retriever}. */\nexport type RetrieverDoc = { id: string; content: string };\n\n/** Params for {@link components.retriever}. */\nexport type RetrieverParams = {\n /** Channel holding the query text (falls back to this literal when the channel is empty). */\n query: string;\n /** Channel receiving the top-`k` `{ id, content, score }` array. */\n into: string;\n /** Number of results to keep (default 4). */\n k?: number;\n /** The corpus to score against. */\n docs: RetrieverDoc[];\n};\n\nconst retrieverHandler =\n (params: RetrieverParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const channelText = params.query in channels ? valueToText(channels[params.query]) : \"\";\n const queryText = channelText.length > 0 ? channelText : params.query;\n const queryVec = mockEmbed(queryText);\n const k = params.k ?? 4;\n\n const scored = params.docs.map((doc, index) => ({\n doc,\n index,\n score: cosineSimilarity(queryVec, mockEmbed(doc.content))\n }));\n // Descending by score; stable so input order breaks ties (matches the Rust\n // stable sort over input order).\n scored.sort((a, b) => (b.score - a.score === 0 ? a.index - b.index : b.score - a.score));\n\n const results = scored\n .slice(0, k)\n .map(({ doc, score }) => ({ id: doc.id, content: doc.content, score }));\n return { [params.into]: results };\n };\n\n// --- reranker ----------------------------------------------------------------\n\n/** Params for {@link components.reranker}. */\nexport type RerankerParams = {\n /** Channel holding the retrieval-result array to reorder. */\n from: string;\n /** Channel receiving the reordered array. */\n into: string;\n /** Optional channel holding the query text the cross-encoder (`AILU_RERANK_ENDPOINT`)\n * re-scores against. Without an endpoint, items keep their upstream order (by `score`). */\n query?: string;\n};\n\nconst rerankerHandler =\n (params: RerankerParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const fromValue = params.from in channels ? channels[params.from] : undefined;\n const items: Record<string, unknown>[] = Array.isArray(fromValue)\n ? (fromValue as Record<string, unknown>[])\n : [];\n\n // Optional query text for embedding-based rescoring.\n let queryVec: number[] | undefined;\n if (params.query !== undefined && params.query in channels) {\n const text = valueToText(channels[params.query]);\n if (text.length > 0) {\n queryVec = mockEmbed(text);\n }\n }\n\n const scored = items.map((item, index) => {\n let score: number;\n if (queryVec !== undefined) {\n const content = valueToText((item as { content?: unknown }).content);\n score = cosineSimilarity(queryVec, mockEmbed(content));\n } else {\n const existing = (item as { score?: unknown }).score;\n score = typeof existing === \"number\" ? existing : 0;\n }\n return { item, index, score };\n });\n scored.sort((a, b) => (b.score - a.score === 0 ? a.index - b.index : b.score - a.score));\n\n const reordered = scored.map(({ item, score }) =>\n typeof item === \"object\" && item !== null && !Array.isArray(item)\n ? { ...item, score }\n : item\n );\n return { [params.into]: reordered };\n };\n\n// --- textCleaner -------------------------------------------------------------\n\n/** Params for {@link components.textCleaner}. */\nexport type TextCleanerParams = {\n /** Channel whose text is normalised. */\n from: string;\n /** Channel receiving the cleaned text. */\n into: string;\n /** Lowercase the text. Defaults to `false`. */\n lowercase?: boolean;\n /** Strip `<…>` HTML tags. Defaults to `false`. */\n stripHtml?: boolean;\n /** Collapse runs of whitespace to a single space. Defaults to `false`. */\n collapseWhitespace?: boolean;\n /** Trim leading/trailing whitespace. Defaults to `false`. */\n trim?: boolean;\n};\n\n/**\n * Remove anything between `<` and the next `>` (a simple, deterministic tag\n * stripper — it does not parse nested or malformed markup beyond this rule).\n * Mirrors the Rust `strip_html_tags`.\n */\nconst stripHtmlTags = (text: string): string => {\n let out = \"\";\n let inTag = false;\n for (const ch of text) {\n if (ch === \"<\") {\n inTag = true;\n } else if (ch === \">\") {\n inTag = false;\n } else if (!inTag) {\n out += ch;\n }\n }\n return out;\n};\n\n/** Collapse every run of whitespace into a single space. Mirrors `collapse_ws`. */\nconst collapseWs = (text: string): string => text.split(/\\s+/).filter((s) => s.length > 0).join(\" \");\n\nconst textCleanerHandler =\n (params: TextCleanerParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n let text = params.from in channels ? valueToText(channels[params.from]) : \"\";\n // Fixed order so the result is deterministic regardless of param order:\n // stripHtml -> lowercase -> collapseWhitespace -> trim.\n if (params.stripHtml === true) {\n text = stripHtmlTags(text);\n }\n if (params.lowercase === true) {\n text = text.toLowerCase();\n }\n if (params.collapseWhitespace === true) {\n text = collapseWs(text);\n }\n if (params.trim === true) {\n text = text.trim();\n }\n return { [params.into]: text };\n };\n\n// --- documentSplitter --------------------------------------------------------\n\n/** Params for {@link components.documentSplitter}. */\nexport type DocumentSplitterParams = {\n /** Channel holding the text to split. */\n from: string;\n /** Channel receiving the `string[]` of chunks. */\n into: string;\n /** Split unit: `\"chars\"` sliding windows or greedy `\"sentences\"` packing. */\n by: \"chars\" | \"sentences\";\n /** Window size in characters (`by:\"chars\"`) or sentences (`by:\"sentences\"`). Must be > 0. */\n size: number;\n /** Overlap repeated at the start of each next chunk. Must be smaller than `size`. Defaults to 0. */\n overlap?: number;\n};\n\n/** Slice `text` into windows of `size` chars, stepping by `size - overlap`. Mirrors `split_by_chars`. */\nconst splitByChars = (text: string, size: number, overlap: number): string[] => {\n const chars = [...text];\n if (chars.length === 0) {\n return [];\n }\n const step = size - overlap;\n const chunks: string[] = [];\n let start = 0;\n while (start < chars.length) {\n const end = Math.min(start + size, chars.length);\n chunks.push(chars.slice(start, end).join(\"\"));\n if (end === chars.length) {\n break;\n }\n start += step;\n }\n return chunks;\n};\n\n/**\n * Split text into trimmed, non-empty sentences on `.`/`!`/`?` terminators,\n * keeping the terminator attached to its sentence. Mirrors `segment_sentences`.\n */\nconst segmentSentences = (text: string): string[] => {\n const sentences: string[] = [];\n let current = \"\";\n for (const ch of text) {\n current += ch;\n if (ch === \".\" || ch === \"!\" || ch === \"?\") {\n const trimmed = current.trim();\n if (trimmed.length > 0) {\n sentences.push(trimmed);\n }\n current = \"\";\n }\n }\n const trimmed = current.trim();\n if (trimmed.length > 0) {\n sentences.push(trimmed);\n }\n return sentences;\n};\n\n/**\n * Segment `text` into sentences, then pack `size` sentences per chunk with\n * `overlap` sentences repeated at the start of each subsequent chunk. Mirrors\n * `split_by_sentences`.\n */\nconst splitBySentences = (text: string, size: number, overlap: number): string[] => {\n const sentences = segmentSentences(text);\n if (sentences.length === 0) {\n return [];\n }\n const step = size - overlap;\n const chunks: string[] = [];\n let start = 0;\n while (start < sentences.length) {\n const end = Math.min(start + size, sentences.length);\n chunks.push(sentences.slice(start, end).join(\" \"));\n if (end === sentences.length) {\n break;\n }\n start += step;\n }\n return chunks;\n};\n\nconst documentSplitterHandler =\n (params: DocumentSplitterParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const text = params.from in channels ? valueToText(channels[params.from]) : \"\";\n const overlap = params.overlap ?? 0;\n const chunks =\n params.by === \"chars\"\n ? splitByChars(text, params.size, overlap)\n : splitBySentences(text, params.size, overlap);\n return { [params.into]: chunks };\n };\n\n// --- htmlToText --------------------------------------------------------------\n\n/** Params for {@link components.htmlToText}. */\nexport type HtmlToTextParams = {\n /** Channel holding the HTML text. */\n from: string;\n /** Channel receiving the tag-stripped, entity-decoded text. */\n into: string;\n};\n\n/**\n * Decode the common named HTML entities. `&` is decoded last so an input\n * like `&lt;` round-trips to `<` rather than being double-decoded.\n * Mirrors the Rust `decode_entities`.\n */\nconst decodeEntities = (text: string): string =>\n text\n .split(\"<\")\n .join(\"<\")\n .split(\">\")\n .join(\">\")\n .split(\""\")\n .join('\"')\n .split(\"&\")\n .join(\"&\");\n\nconst htmlToTextHandler =\n (params: HtmlToTextParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const raw = params.from in channels ? valueToText(channels[params.from]) : \"\";\n return { [params.into]: decodeEntities(stripHtmlTags(raw)) };\n };\n\n// --- csvParser ---------------------------------------------------------------\n\n/** Params for {@link components.csvParser}. */\nexport type CsvParserParams = {\n /** Channel holding the CSV text. */\n from: string;\n /** Channel receiving the parsed rows array. */\n into: string;\n /** Single-character cell delimiter. Defaults to `\",\"`. */\n delimiter?: string;\n /** When `true` (default) the first row supplies object keys; otherwise rows are arrays. */\n header?: boolean;\n};\n\nconst csvParserHandler =\n (params: CsvParserParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const text = params.from in channels ? valueToText(channels[params.from]) : \"\";\n const delimiter = params.delimiter ?? \",\";\n const header = params.header ?? true;\n\n // Simple line/char splitter: rows on `\\n`, cells on the delimiter (no quoted\n // cells / embedded newlines), skipping blank lines. Mirrors the Rust parser.\n const rows = text\n .split(\"\\n\")\n .filter((line) => line.trim().length > 0)\n .map((line) => line.split(delimiter).map((cell) => cell.trim()));\n\n let parsed: unknown[];\n if (header) {\n const headers = rows[0] ?? [];\n parsed = rows.slice(1).map((cells) => {\n const obj: Record<string, string> = {};\n headers.forEach((name, i) => {\n obj[name] = cells[i] ?? \"\";\n });\n return obj;\n });\n } else {\n parsed = rows.map((cells) => [...cells]);\n }\n return { [params.into]: parsed };\n };\n\n// --- shared dedupe -----------------------------------------------------------\n\n/**\n * De-duplicate `items`, keeping the first occurrence and preserving order. The\n * dedupe identity is: if `key` is set and the item is an object with that field,\n * the text form of that field; otherwise the item's value text. Mirrors the Rust\n * `dedupe_array` (strings dedupe by their unquoted text).\n */\nconst dedupeArray = (items: unknown[], key?: string): unknown[] => {\n const seen = new Set<string>();\n const out: unknown[] = [];\n for (const item of items) {\n let identity: string;\n if (\n key !== undefined &&\n typeof item === \"object\" &&\n item !== null &&\n !Array.isArray(item) &&\n key in (item as Record<string, unknown>)\n ) {\n identity = valueToText((item as Record<string, unknown>)[key]);\n } else {\n identity = valueToText(item);\n }\n if (!seen.has(identity)) {\n seen.add(identity);\n out.push(item);\n }\n }\n return out;\n};\n\n// --- documentJoiner ----------------------------------------------------------\n\n/** Params for {@link components.documentJoiner}. */\nexport type DocumentJoinerParams = {\n /** Channels whose array values are concatenated in order. */\n fromChannels: string[];\n /** Channel receiving the merged array. */\n into: string;\n /** Optional object field to de-duplicate the merged items by. */\n dedupeBy?: string;\n};\n\nconst documentJoinerHandler =\n (params: DocumentJoinerParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n let merged: unknown[] = [];\n for (const name of params.fromChannels) {\n const value = name in channels ? channels[name] : undefined;\n if (Array.isArray(value)) {\n merged = merged.concat(value);\n }\n }\n if (params.dedupeBy !== undefined) {\n merged = dedupeArray(merged, params.dedupeBy);\n }\n return { [params.into]: merged };\n };\n\n// --- deduplicator ------------------------------------------------------------\n\n/** Params for {@link components.deduplicator}. */\nexport type DeduplicatorParams = {\n /** Channel holding the array to de-duplicate. */\n from: string;\n /** Channel receiving the de-duplicated array. */\n into: string;\n /** Optional object field to compare items by (else whole-value compare). */\n key?: string;\n};\n\nconst deduplicatorHandler =\n (params: DeduplicatorParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const value = params.from in channels ? channels[params.from] : undefined;\n const items: unknown[] = Array.isArray(value) ? value : [];\n return { [params.into]: dedupeArray(items, params.key) };\n };\n\n// --- truncator ---------------------------------------------------------------\n\n/** Params for {@link components.truncator}. */\nexport type TruncatorParams = {\n /** Channel holding the text to truncate. */\n from: string;\n /** Channel receiving the (possibly truncated) text. */\n into: string;\n /** Maximum character length (the ellipsis counts against this budget). */\n maxChars: number;\n /** Suffix appended when truncated. Defaults to `\"…\"`. */\n ellipsis?: string;\n};\n\nconst truncatorHandler =\n (params: TruncatorParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const text = params.from in channels ? valueToText(channels[params.from]) : \"\";\n const ellipsis = params.ellipsis ?? \"…\";\n const chars = [...text];\n let truncated: string;\n if (chars.length <= params.maxChars) {\n truncated = text;\n } else {\n const ellipsisLen = [...ellipsis].length;\n if (ellipsisLen >= params.maxChars) {\n truncated = chars.slice(0, params.maxChars).join(\"\");\n } else {\n const keep = params.maxChars - ellipsisLen;\n truncated = chars.slice(0, keep).join(\"\") + ellipsis;\n }\n }\n return { [params.into]: truncated };\n };\n\n// --- regexExtractor ----------------------------------------------------------\n\n/** Params for {@link components.regexExtractor}. */\nexport type RegexExtractorParams = {\n /** Channel holding the text to match against. */\n from: string;\n /** Channel receiving the match (or matches when `all`). */\n into: string;\n /**\n * Literal-substring pattern with optional leading `^` (start) and trailing `$`\n * (end) anchors. No character classes / quantifiers / capture groups.\n */\n pattern: string;\n /** Accepted for forward-compat; only `0` (the whole match) is supported. Defaults to 0. */\n group?: number;\n /** When `true`, return every non-overlapping occurrence as an array. Defaults to `false`. */\n all?: boolean;\n};\n\n/**\n * Find literal `pattern` occurrences in `text`, honouring leading `^` (start\n * anchor) and trailing `$` (end anchor). Mirrors the Rust `literal_matches`.\n */\nconst literalMatches = (text: string, pattern: string, all: boolean): string[] => {\n const anchoredStart = pattern.startsWith(\"^\");\n const anchoredEnd = pattern.endsWith(\"$\");\n const startTrim = anchoredStart ? 1 : 0;\n const endTrim = anchoredEnd ? 1 : 0;\n if (startTrim + endTrim >= pattern.length) {\n // Pattern is only anchors with no literal body.\n return [];\n }\n const literal = pattern.slice(startTrim, pattern.length - endTrim);\n\n if (anchoredStart && anchoredEnd) {\n return text === literal ? [literal] : [];\n }\n if (anchoredStart) {\n return text.startsWith(literal) ? [literal] : [];\n }\n if (anchoredEnd) {\n return text.endsWith(literal) ? [literal] : [];\n }\n\n // Unanchored: scan for non-overlapping occurrences.\n const out: string[] = [];\n let rest = text;\n let pos = rest.indexOf(literal);\n while (pos !== -1) {\n out.push(literal);\n if (!all) {\n break;\n }\n rest = rest.slice(pos + literal.length);\n pos = rest.indexOf(literal);\n }\n return out;\n};\n\nconst regexExtractorHandler =\n (params: RegexExtractorParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const text = params.from in channels ? valueToText(channels[params.from]) : \"\";\n const group = params.group ?? 0;\n const all = params.all ?? false;\n // Only the whole-match group (0) is supported by the literal matcher.\n const matches = group === 0 ? literalMatches(text, params.pattern, all) : [];\n const value = all ? matches : (matches[0] ?? null);\n return { [params.into]: value };\n };\n\n// --- answerBuilder -----------------------------------------------------------\n\n/** Params for {@link components.answerBuilder}. */\nexport type AnswerBuilderParams = {\n /** Channel supplying the core answer text. */\n from: string;\n /** Channel receiving the assembled answer. */\n into: string;\n /** Optional channel holding a retrieval-result array rendered as numbered citations. */\n contextFrom?: string;\n /** Optional `{{answer}}`/`{{citations}}` template controlling the layout. */\n template?: string;\n};\n\n/**\n * Render a retrieval-result array into a numbered citation block: one\n * `\"[n] <id>: <content>\"` line per item (id omitted when absent). Mirrors the\n * Rust `render_citations`.\n */\nconst renderCitations = (items: unknown[]): string => {\n const lines: string[] = [];\n items.forEach((item, index) => {\n const n = index + 1;\n const obj = typeof item === \"object\" && item !== null ? (item as Record<string, unknown>) : {};\n const idValue = obj.id;\n const id = typeof idValue === \"string\" ? idValue : undefined;\n const content = \"content\" in obj ? valueToText(obj.content) : valueToText(item);\n lines.push(id !== undefined ? `[${n}] ${id}: ${content}` : `[${n}] ${content}`);\n });\n return lines.join(\"\\n\");\n};\n\nconst answerBuilderHandler =\n (params: AnswerBuilderParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const answer = params.from in channels ? valueToText(channels[params.from]) : \"\";\n\n let citations = \"\";\n if (params.contextFrom !== undefined) {\n const value = params.contextFrom in channels ? channels[params.contextFrom] : undefined;\n if (Array.isArray(value)) {\n citations = renderCitations(value);\n }\n }\n\n let result: string;\n if (params.template !== undefined) {\n result = renderTemplate(params.template, { answer, citations });\n } else if (citations.length === 0) {\n result = answer;\n } else {\n result = `${answer}\\n\\nSources:\\n${citations}`;\n }\n return { [params.into]: result };\n };\n\n// --- fieldMapper -------------------------------------------------------------\n\n/** Params for {@link components.fieldMapper}. */\nexport type FieldMapperParams = {\n /** Channel holding the source object. */\n from: string;\n /** Channel receiving the remapped object. */\n into: string;\n /** `{ outKey: inKeyPath }` map; `inKeyPath` is a dotted path into the source. */\n mapping: Record<string, string>;\n};\n\n/**\n * Resolve a dotted path (`\"a.b.c\"`) into a JSON value, descending through\n * objects. Returns `undefined` if any segment is missing or a non-object is hit.\n * Mirrors the Rust `resolve_path`.\n */\nconst resolvePath = (value: unknown, path: string): unknown => {\n let current: unknown = value;\n for (const segment of path.split(\".\")) {\n if (typeof current === \"object\" && current !== null && !Array.isArray(current) && segment in (current as Record<string, unknown>)) {\n current = (current as Record<string, unknown>)[segment];\n } else {\n return undefined;\n }\n }\n return current;\n};\n\nconst fieldMapperHandler =\n (params: FieldMapperParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const source = params.from in channels ? channels[params.from] : null;\n const obj: Record<string, unknown> = {};\n for (const [outKey, path] of Object.entries(params.mapping)) {\n const resolved = resolvePath(source, path);\n obj[outKey] = resolved === undefined ? null : resolved;\n }\n return { [params.into]: obj };\n };\n\n// --- fieldExtractor ----------------------------------------------------------\n\n/** Params for {@link components.fieldExtractor}. */\nexport type FieldExtractorParams = {\n /** Channel holding the source value. */\n from: string;\n /** Channel receiving the extracted scalar. */\n into: string;\n /** Optional dotted path descended into the `from` value (else the whole value). */\n path?: string;\n /**\n * When `true`, if the resulting value is a string containing a `\"final:\"` marker,\n * return only the text after the **last** `\"final:\"` (trimmed) — reduces an\n * agent reasoning trace to its final answer. Non-strings pass through. Defaults to `false`.\n */\n finalOnly?: boolean;\n};\n\n/**\n * Return only the text after the **last** `\"final:\"` marker (trimmed); if the\n * marker is absent, return the text unchanged. Mirrors the Rust `extract_final_answer`.\n */\nconst extractFinalAnswer = (text: string): string => {\n const pos = text.lastIndexOf(\"final:\");\n return pos === -1 ? text : text.slice(pos + \"final:\".length).trim();\n};\n\nconst fieldExtractorHandler =\n (params: FieldExtractorParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const source = params.from in channels ? channels[params.from] : null;\n let value: unknown;\n if (params.path !== undefined) {\n const resolved = resolvePath(source, params.path);\n value = resolved === undefined ? null : resolved;\n } else {\n value = source;\n }\n if (params.finalOnly === true && typeof value === \"string\") {\n value = extractFinalAnswer(value);\n }\n return { [params.into]: value };\n };\n\n// --- shared lexical helpers (mirror the Rust `tokenize` / `query_text`) -------\n\n/**\n * Tokenize text into lowercase alphanumeric word tokens, dropping punctuation\n * and empty runs. Mirrors the Rust `tokenize` (split on non-alphanumeric).\n */\nconst tokenize = (text: string): string[] =>\n text\n .split(/[^\\p{L}\\p{N}]+/u)\n .filter((w) => w.length > 0)\n .map((w) => w.toLowerCase());\n\n/**\n * Read the query text for a retriever: prefer the `query` channel's text,\n * falling back to the literal `query` param value when the channel is empty.\n * Mirrors the Rust `query_text`.\n */\nconst queryText = (channels: Record<string, unknown>, queryParam: string): string => {\n const channelText = queryParam in channels ? valueToText(channels[queryParam]) : \"\";\n return channelText.length > 0 ? channelText : queryParam;\n};\n\n/** Read an array channel, returning `[]` for a missing / non-array channel. */\nconst arrayChannel = (channels: Record<string, unknown>, name: string): unknown[] => {\n const value = name in channels ? channels[name] : undefined;\n return Array.isArray(value) ? value : [];\n};\n\n// --- bm25Retriever -----------------------------------------------------------\n\n/** A candidate document for the lexical retrievers. */\nexport type LexicalDoc = { id: string; content: string };\n\n/** One stage's score in a candidate's retrieval lineage (ADR 0044, ailu-engine, issue #578) —\n * additive: each retrieval/fusion/rerank stage APPENDS its own step instead of overwriting the\n * top-level `score` it inherited, so a candidate's full history (which stage scored it what, with\n * which algorithm/version) survives all the way to the prompt that gets templated from it. The\n * top-level `score` field on a result still mirrors the LAST step's score, unchanged, for any\n * caller that only cares about the current ranking. */\nexport type ProvenanceStep = {\n stage: string;\n algorithm: string;\n algorithmVersion: string | null;\n score: number;\n};\n\n/** `item.provenance` when present and well-formed, else `[]` — every stage reads whatever lineage\n * an upstream stage already attached (or none, if it's the first stage a candidate passes\n * through) before appending its own step. */\nconst priorProvenance = (item: unknown): ProvenanceStep[] =>\n typeof item === \"object\" && item !== null && !Array.isArray(item) && Array.isArray((item as { provenance?: unknown }).provenance)\n ? ((item as { provenance: unknown[] }).provenance as ProvenanceStep[])\n : [];\n\n/** Params for {@link components.bm25Retriever}. */\nexport type Bm25RetrieverParams = {\n /** Channel holding the query text (falls back to this literal when empty). */\n query: string;\n /** Channel receiving the top-`k` `{ id, content, score }` array. */\n into: string;\n /** Number of results to keep (default 4). */\n k?: number;\n /** The corpus to rank. */\n docs: LexicalDoc[];\n /** BM25 term-frequency saturation. Defaults to 1.2. */\n k1?: number;\n /** BM25 length-normalization. Defaults to 0.75. */\n b?: number;\n};\n\nconst bm25RetrieverHandler =\n (params: Bm25RetrieverParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const qTokens = tokenize(queryText(channels, params.query));\n const k = params.k ?? 4;\n const k1 = params.k1 ?? 1.2;\n const b = params.b ?? 0.75;\n\n const docTokens = params.docs.map((d) => tokenize(d.content));\n const docCount = Math.max(docTokens.length, 1);\n const avgLen =\n docTokens.length === 0\n ? 0\n : docTokens.reduce((sum, t) => sum + t.length, 0) / docTokens.length;\n const df = new Map<string, number>();\n for (const tokens of docTokens) {\n for (const tok of new Set(tokens)) {\n df.set(tok, (df.get(tok) ?? 0) + 1);\n }\n }\n\n const scored = params.docs.map((doc, index) => {\n const tokens = docTokens[index] ?? [];\n const len = tokens.length;\n let score = 0;\n for (const q of qTokens) {\n const f = tokens.filter((t) => t === q).length;\n if (f === 0) {\n continue;\n }\n const nQ = df.get(q) ?? 0;\n const idf = Math.log((docCount - nQ + 0.5) / (nQ + 0.5) + 1.0);\n const denom = f + k1 * (1 - b + b * (len / Math.max(avgLen, 1)));\n score += (idf * (f * (k1 + 1))) / denom;\n }\n return { doc, index, score };\n });\n scored.sort((a, b2) => (b2.score - a.score === 0 ? a.index - b2.index : b2.score - a.score));\n\n // ADR 0044 D2 (ailu#578): everything past `k` used to be dropped with zero trace — split\n // instead of slicing-and-discarding, so the loser half survives on `{into}Discarded`.\n const discardedAt = String(Date.now());\n const provenanceStep = (score: number): ProvenanceStep => ({\n stage: \"bm25\",\n algorithm: \"bm25\",\n algorithmVersion: `k1=${k1},b=${b}`,\n score\n });\n const kept = scored.slice(0, k).map(({ doc, score }) => ({\n id: doc.id,\n content: doc.content,\n score,\n provenance: [provenanceStep(score)] satisfies ProvenanceStep[]\n }));\n const discarded = scored.slice(k).map(({ doc, score }) => ({\n id: doc.id,\n content: doc.content,\n score,\n provenance: [provenanceStep(score)] satisfies ProvenanceStep[],\n discardedAt,\n reason: \"bm25_rank_below_k\"\n }));\n return { [params.into]: kept, [`${params.into}Discarded`]: discarded };\n };\n\n// --- keywordRetriever --------------------------------------------------------\n\n/** Params for {@link components.keywordRetriever}. */\nexport type KeywordRetrieverParams = {\n /** Channel holding the query text (falls back to this literal when empty). */\n query: string;\n /** Channel receiving the top-`k` `{ id, content, score }` array. */\n into: string;\n /** Number of results to keep (default 4). */\n k?: number;\n /** The corpus to rank. */\n docs: LexicalDoc[];\n};\n\nconst keywordRetrieverHandler =\n (params: KeywordRetrieverParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const qTerms = [...new Set(tokenize(queryText(channels, params.query)))];\n const denom = Math.max(qTerms.length, 1);\n const k = params.k ?? 4;\n\n const docSets = params.docs.map((d) => new Set(tokenize(d.content)));\n const scored = params.docs.map((doc, index) => {\n const set = docSets[index] ?? new Set<string>();\n const matched = qTerms.filter((t) => set.has(t)).length;\n return { doc, index, score: matched / denom };\n });\n scored.sort((a, b) => (b.score - a.score === 0 ? a.index - b.index : b.score - a.score));\n\n const results = scored\n .slice(0, k)\n .map(({ doc, score }) => ({ id: doc.id, content: doc.content, score }));\n return { [params.into]: results };\n };\n\n// --- sentenceWindowSplitter --------------------------------------------------\n\n/** Params for {@link components.sentenceWindowSplitter}. */\nexport type SentenceWindowSplitterParams = {\n /** Channel holding the text to split. */\n from: string;\n /** Channel receiving the `string[]` of overlapping sentence windows. */\n into: string;\n /** Sentences per window. Defaults to 3. */\n windowSize?: number;\n /** Sentences advanced between windows (`1 <= stride <= windowSize`). Defaults to 1. */\n stride?: number;\n};\n\nconst sentenceWindowSplitterHandler =\n (params: SentenceWindowSplitterParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const text = params.from in channels ? valueToText(channels[params.from]) : \"\";\n const windowSize = params.windowSize ?? 3;\n const stride = params.stride ?? 1;\n const sentences = segmentSentences(text);\n const windows: string[] = [];\n if (sentences.length > 0) {\n let start = 0;\n for (;;) {\n const end = Math.min(start + windowSize, sentences.length);\n windows.push(sentences.slice(start, end).join(\" \"));\n if (end === sentences.length) {\n break;\n }\n start += stride;\n }\n }\n return { [params.into]: windows };\n };\n\n// --- languageDetector --------------------------------------------------------\n\n/** Params for {@link components.languageDetector}. */\nexport type LanguageDetectorParams = {\n /** Channel holding the text to classify. */\n from: string;\n /** Channel receiving the detected language code (`\"en\" | \"fr\" | ... | \"und\"`). */\n into: string;\n /** Optional channel receiving the winning language's share of hits in `[0, 1]`. */\n confidenceInto?: string;\n};\n\n/** Fixed language order doubles as the deterministic tie-break order. Mirrors the Rust table. */\nconst LANGUAGE_STOPWORDS: ReadonlyArray<readonly [string, readonly string[]]> = [\n [\"en\", [\"the\", \"and\", \"is\", \"of\", \"to\", \"in\", \"that\", \"it\"]],\n [\"fr\", [\"le\", \"la\", \"les\", \"et\", \"est\", \"un\", \"une\", \"des\"]],\n [\"es\", [\"el\", \"la\", \"los\", \"y\", \"es\", \"un\", \"una\", \"de\"]],\n [\"de\", [\"der\", \"die\", \"das\", \"und\", \"ist\", \"ein\", \"eine\", \"nicht\"]],\n [\"it\", [\"il\", \"la\", \"che\", \"di\", \"e\", \"un\", \"una\", \"per\"]]\n];\n\nconst languageDetectorHandler =\n (params: LanguageDetectorParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const text = params.from in channels ? valueToText(channels[params.from]) : \"\";\n const tokens = tokenize(text);\n\n const scores = LANGUAGE_STOPWORDS.map(\n ([, stops]) => tokens.filter((t) => stops.includes(t)).length\n );\n const total = scores.reduce((sum, n) => sum + n, 0);\n\n let bestIndex = 0;\n let best = scores[0] ?? 0;\n for (let i = 1; i < scores.length; i += 1) {\n const s = scores[i] ?? 0;\n // Strictly greater keeps the earliest language on ties (matches the Rust order).\n if (s > best) {\n best = s;\n bestIndex = i;\n }\n }\n const detected = best === 0 ? \"und\" : (LANGUAGE_STOPWORDS[bestIndex]?.[0] ?? \"und\");\n\n const update: Record<string, unknown> = { [params.into]: detected };\n if (params.confidenceInto !== undefined) {\n update[params.confidenceInto] = total === 0 ? 0 : best / total;\n }\n return update;\n };\n\n// --- metadataFilter / conditionalRouter shared predicate ---------------------\n\n/** A predicate operator shared by {@link components.metadataFilter} and {@link components.conditionalRouter}. */\nexport type PredicateOp =\n | \"equals\"\n | \"notEquals\"\n | \"contains\"\n | \"exists\"\n | \"absent\"\n | \"gt\"\n | \"gte\"\n | \"lt\"\n | \"lte\";\n\n/**\n * Evaluate a single field/op/value predicate against a JSON root, resolving\n * `field` as a dotted path. Mirrors the Rust `predicate_holds`.\n */\nconst predicateHolds = (root: unknown, field: string, op: PredicateOp, value: unknown): boolean => {\n const resolved = resolvePath(root, field);\n switch (op) {\n case \"exists\":\n return resolved !== undefined;\n case \"absent\":\n return resolved === undefined;\n case \"equals\":\n return resolved !== undefined && valueToText(resolved) === valueToText(value);\n case \"notEquals\":\n return resolved === undefined || valueToText(resolved) !== valueToText(value);\n case \"contains\":\n return resolved !== undefined && valueToText(resolved).includes(valueToText(value));\n default: {\n const n = typeof resolved === \"number\" ? resolved : undefined;\n const target = typeof value === \"number\" ? value : undefined;\n if (n === undefined || target === undefined) {\n return false;\n }\n switch (op) {\n case \"gt\":\n return n > target;\n case \"gte\":\n return n >= target;\n case \"lt\":\n return n < target;\n case \"lte\":\n return n <= target;\n default:\n return false;\n }\n }\n }\n};\n\n/** Params for {@link components.metadataFilter}. */\nexport type MetadataFilterParams = {\n /** Channel holding the array to filter. */\n from: string;\n /** Channel receiving the filtered array. */\n into: string;\n /** Dotted path into each item compared by the predicate. */\n field: string;\n /** The predicate operator. */\n op: PredicateOp;\n /** The comparison value (required except for `exists`/`absent`). */\n value?: unknown;\n};\n\nconst metadataFilterHandler =\n (params: MetadataFilterParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const items = arrayChannel(channels, params.from);\n const kept = items.filter((item) => predicateHolds(item, params.field, params.op, params.value));\n return { [params.into]: kept };\n };\n\n// --- listJoiner --------------------------------------------------------------\n\n/** Params for {@link components.listJoiner}. */\nexport type ListJoinerParams = {\n /** Channels whose array values are combined. */\n fromChannels: string[];\n /** Channel receiving the combined array. */\n into: string;\n /** Combine mode: `\"concat\"` (default), `\"union\"` (dedupe), or `\"interleave\"`. */\n mode?: \"concat\" | \"union\" | \"interleave\";\n};\n\nconst listJoinerHandler =\n (params: ListJoinerParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const lists = params.fromChannels.map((name) => arrayChannel(channels, name));\n const mode = params.mode ?? \"concat\";\n\n let merged: unknown[];\n if (mode === \"interleave\") {\n merged = [];\n const max = lists.reduce((m, list) => Math.max(m, list.length), 0);\n for (let i = 0; i < max; i += 1) {\n for (const list of lists) {\n if (i < list.length) {\n merged.push(list[i]);\n }\n }\n }\n } else {\n merged = lists.flat();\n if (mode === \"union\") {\n merged = dedupeArray(merged);\n }\n }\n return { [params.into]: merged };\n };\n\n// --- mergeRanker -------------------------------------------------------------\n\n/** Params for {@link components.mergeRanker}. */\nexport type MergeRankerParams = {\n /** Channels each holding a retrieval-result array to fuse. */\n fromChannels: string[];\n /** Channel receiving the fused `{ id, content, score }` array. */\n into: string;\n /** Object field identifying items across lists. Defaults to `\"id\"`. */\n idKey?: string;\n /** Keep only the top-`k` fused results (default: keep all). */\n k?: number;\n /** Reciprocal Rank Fusion constant. Defaults to 60. */\n rrfK?: number;\n};\n\nconst mergeRankerHandler =\n (params: MergeRankerParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const idKey = params.idKey ?? \"id\";\n const rrfK = params.rrfK ?? 60;\n\n const scores = new Map<string, number>();\n const representative = new Map<string, unknown>();\n const firstSeen = new Map<string, number>();\n // ADR 0044: a candidate seen in MULTIPLE `fromChannels` (e.g. both the vector and lexical leg)\n // must keep every leg's provenance, not just whichever channel happened to be processed first\n // (the pre-ADR-0044 `representative` map silently dropped every other leg's lineage).\n const provenanceById = new Map<string, ProvenanceStep[]>();\n let counter = 0;\n\n for (const name of params.fromChannels) {\n const items = arrayChannel(channels, name);\n items.forEach((item, rank) => {\n const idValue =\n typeof item === \"object\" && item !== null && !Array.isArray(item)\n ? (item as Record<string, unknown>)[idKey]\n : undefined;\n const id = idValue !== undefined ? valueToText(idValue) : valueToText(item);\n scores.set(id, (scores.get(id) ?? 0) + 1 / (rrfK + rank));\n if (!representative.has(id)) {\n representative.set(id, item);\n }\n if (!firstSeen.has(id)) {\n firstSeen.set(id, counter);\n counter += 1;\n }\n const existing = provenanceById.get(id) ?? [];\n provenanceById.set(id, [...existing, ...priorProvenance(item)]);\n });\n }\n\n const merged = [...scores.entries()]\n .map(([id, score]) => ({ id, score, order: firstSeen.get(id) ?? 0 }))\n .sort((a, b) => (b.score - a.score === 0 ? a.order - b.order : b.score - a.score));\n // ADR 0044 D2 (ailu#578): RRF losers past `k` used to be dropped with zero trace — split\n // instead of slicing, so they survive on `{into}Discarded`.\n const discardedAt = String(Date.now());\n const splitAt = params.k === undefined ? merged.length : params.k;\n const kept = merged.slice(0, splitAt);\n const discarded = merged.slice(splitAt);\n\n const buildItem = (id: string, score: number, extra: boolean) => {\n const item = representative.get(id);\n const step: ProvenanceStep = { stage: \"rrf\", algorithm: \"rrf\", algorithmVersion: `k=${rrfK}`, score };\n const provenance = [...(provenanceById.get(id) ?? []), step];\n if (typeof item !== \"object\" || item === null || Array.isArray(item)) return item;\n return extra\n ? { ...item, score, provenance, discardedAt, reason: \"rrf_rank_below_k\" }\n : { ...item, score, provenance };\n };\n const results = kept.map(({ id, score }) => buildItem(id, score, false));\n const discardedResults = discarded.map(({ id, score }) => buildItem(id, score, true));\n return { [params.into]: results, [`${params.into}Discarded`]: discardedResults };\n };\n\n// --- evaluator ---------------------------------------------------------------\n\n/** Params for {@link components.evaluator}. */\nexport type EvaluatorParams = {\n /** Channel holding the expected/reference text. */\n expectedFrom: string;\n /** Channel holding the actual/candidate text. */\n actualFrom: string;\n /** Channel receiving the numeric score in `[0, 1]`. */\n into: string;\n /** Scoring metric. Defaults to `\"tokenF1\"`. */\n metric?: \"tokenF1\" | \"overlap\" | \"exact\";\n /** Optional channel receiving a boolean `score >= threshold`. */\n passInto?: string;\n /** Pass threshold for `passInto`. Defaults to 0.5. */\n threshold?: number;\n};\n\n/**\n * Token-overlap F1 of two token multisets. Two empty inputs score `1.0`; one\n * empty side scores `0.0`. Mirrors the Rust `token_f1`.\n */\nconst tokenF1 = (expected: string[], actual: string[]): number => {\n if (expected.length === 0 && actual.length === 0) {\n return 1;\n }\n if (expected.length === 0 || actual.length === 0) {\n return 0;\n }\n const expectedCounts = new Map<string, number>();\n for (const t of expected) {\n expectedCounts.set(t, (expectedCounts.get(t) ?? 0) + 1);\n }\n let matched = 0;\n for (const t of actual) {\n const count = expectedCounts.get(t) ?? 0;\n if (count > 0) {\n expectedCounts.set(t, count - 1);\n matched += 1;\n }\n }\n if (matched === 0) {\n return 0;\n }\n const precision = matched / actual.length;\n const recall = matched / expected.length;\n return (2 * precision * recall) / (precision + recall);\n};\n\nconst evaluatorHandler =\n (params: EvaluatorParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const expected = params.expectedFrom in channels ? valueToText(channels[params.expectedFrom]) : \"\";\n const actual = params.actualFrom in channels ? valueToText(channels[params.actualFrom]) : \"\";\n const metric = params.metric ?? \"tokenF1\";\n\n let score: number;\n if (metric === \"exact\") {\n score = expected.trim() === actual.trim() ? 1 : 0;\n } else if (metric === \"overlap\") {\n const e = new Set(tokenize(expected));\n const a = new Set(tokenize(actual));\n if (e.size === 0 && a.size === 0) {\n score = 1;\n } else {\n const inter = [...e].filter((t) => a.has(t)).length;\n const union = new Set([...e, ...a]).size;\n score = union === 0 ? 0 : inter / union;\n }\n } else {\n score = tokenF1(tokenize(expected), tokenize(actual));\n }\n\n const update: Record<string, unknown> = { [params.into]: score };\n if (params.passInto !== undefined) {\n update[params.passInto] = score >= (params.threshold ?? 0.5);\n }\n return update;\n };\n\n// --- chatMessageBuilder ------------------------------------------------------\n\n/** One message spec for {@link components.chatMessageBuilder}. */\nexport type ChatMessageSpec = {\n /** The message role. */\n role: \"system\" | \"user\" | \"assistant\";\n /** A literal body, rendered through the `{{var}}` template engine. */\n content?: string;\n /** A channel name whose value supplies the body verbatim. */\n contentFrom?: string;\n};\n\n/** Params for {@link components.chatMessageBuilder}. */\nexport type ChatMessageBuilderParams = {\n /** Channel receiving the `[{ role, content }]` array. */\n into: string;\n /** The ordered message specs. */\n messages: ChatMessageSpec[];\n /** Optional channel prepended as a leading system message when non-empty. */\n systemFrom?: string;\n};\n\nconst chatMessageBuilderHandler =\n (params: ChatMessageBuilderParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const messages: { role: string; content: string }[] = [];\n if (params.systemFrom !== undefined) {\n const system = params.systemFrom in channels ? valueToText(channels[params.systemFrom]) : \"\";\n if (system.length > 0) {\n messages.push({ role: \"system\", content: system });\n }\n }\n for (const spec of params.messages) {\n let content: string;\n if (spec.content !== undefined) {\n content = renderTemplate(spec.content, channels);\n } else if (spec.contentFrom !== undefined) {\n content = spec.contentFrom in channels ? valueToText(channels[spec.contentFrom]) : \"\";\n } else {\n content = \"\";\n }\n messages.push({ role: spec.role, content });\n }\n return { [params.into]: messages };\n };\n\n// --- conditionalRouter -------------------------------------------------------\n\n/** One branch for {@link components.conditionalRouter}. */\nexport type ConditionalRouterBranch = {\n /** The predicate evaluated against the channels (`field` is a dotted path). */\n when: { field: string; op: PredicateOp; value?: unknown };\n /** The route string emitted when `when` holds. */\n route: string;\n};\n\n/** Params for {@link components.conditionalRouter}. */\nexport type ConditionalRouterParams = {\n /** Channel the chosen route string is written into. */\n into: string;\n /** Route emitted when no branch matches. */\n defaultRoute: string;\n /** Ordered branches; the first matching branch wins. */\n branches: ConditionalRouterBranch[];\n};\n\nconst conditionalRouterHandler =\n (params: ConditionalRouterParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const chosen =\n params.branches.find((branch) =>\n predicateHolds(channels, branch.when.field, branch.when.op, branch.when.value)\n )?.route ?? params.defaultRoute;\n return { [params.into]: chosen };\n };\n\n// --- documentWriter ----------------------------------------------------------\n\n/** Params for {@link components.documentWriter}. */\nexport type DocumentWriterParams = {\n /** Channel holding the incoming documents array to append. */\n from: string;\n /** Channel receiving the accumulated store array. */\n into: string;\n /** Channel holding the current store. Defaults to `into`. */\n store?: string;\n /** Optional object field to de-duplicate the merged store by. */\n dedupeBy?: string;\n};\n\nconst documentWriterHandler =\n (params: DocumentWriterParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const storeChannel = params.store ?? params.into;\n let docs = [...arrayChannel(channels, storeChannel), ...arrayChannel(channels, params.from)];\n if (params.dedupeBy !== undefined) {\n docs = dedupeArray(docs, params.dedupeBy);\n }\n return { [params.into]: docs };\n };\n\n// --- integration components (httpFetch / webSearch) --------------------------\n\n/**\n * The result of an HTTP fetch surfaced into the `into` channel.\n *\n * The default impl never throws on a non-2xx response or a transport error — a\n * failure is surfaced as data so a graph degrades gracefully instead of crashing\n * the run:\n * - on a completed response: `{ status, ok, body, json }` (`json` is the parsed\n * body when the `content-type` is JSON, else `undefined`; `ok` mirrors\n * `Response.ok`, i.e. a 2xx status);\n * - on a transport error / timeout: `{ ok: false, error }` (`status`/`body` absent).\n */\nexport type HttpFetchResult = {\n /** The HTTP status code, when a response was received. */\n status?: number;\n /** `true` for a 2xx response; `false` on a non-2xx response or a transport error. */\n ok: boolean;\n /** The response body as text, when a response was received. */\n body?: string;\n /** The parsed JSON body, present only when the response `content-type` was JSON. */\n json?: unknown;\n /** The error message, present only on a transport error / timeout. */\n error?: string;\n};\n\n/**\n * The transport an {@link HttpFetchImpl} is invoked with: the resolved URL plus the\n * request options the default impl assembled from the params (method/headers/body/\n * the abort `signal` driving the timeout). Mirrors the `(input, init)` shape of the\n * WHATWG `fetch`, so `globalThis.fetch` is itself a valid impl.\n */\nexport type HttpFetchRequestInit = {\n method: string;\n headers?: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n};\n\n/**\n * An injectable fetch implementation. Receives the resolved URL and the assembled\n * request init, and must resolve to something `Response`-shaped (`status`, `ok`,\n * `text()`, `headers.get()`). The real `globalThis.fetch` satisfies this — the\n * default impl simply calls it — so a test can inject a fake `Response`-like object.\n */\nexport type HttpFetchImpl = (\n url: string,\n init: HttpFetchRequestInit\n) => Promise<HttpFetchResponseLike> | HttpFetchResponseLike;\n\n/** The minimal `Response`-shaped surface the default httpFetch impl consumes. */\nexport type HttpFetchResponseLike = {\n status: number;\n ok: boolean;\n text(): Promise<string> | string;\n headers: { get(name: string): string | null };\n};\n\n/** Params for {@link components.httpFetch}. */\nexport type HttpFetchParams = {\n /** A literal URL to fetch (mutually exclusive with `urlFrom`). */\n url?: string;\n /** A channel whose value supplies the URL (takes precedence when its channel is set). */\n urlFrom?: string;\n /** Channel receiving the {@link HttpFetchResult}. */\n into: string;\n /** HTTP method. Defaults to `\"GET\"`. */\n method?: string;\n /** Request headers sent with the call. */\n headers?: Record<string, string>;\n /** Request body (sent verbatim) for non-GET methods. */\n body?: string;\n /** Abort the request after this many milliseconds (drives an `AbortController`). */\n timeoutMs?: number;\n /**\n * The transport to call. Defaults to the real `globalThis.fetch`. Inject a fake\n * (a `Response`-like returning function) to keep a test offline, or to point the\n * call at a stub transport.\n */\n fetchImpl?: HttpFetchImpl;\n};\n\n/**\n * Whether a `content-type` header denotes JSON (so the body should be parsed):\n * `application/json` or any `+json` suffix (e.g. `application/ld+json`).\n */\nconst isJsonContentType = (contentType: string | null): boolean => {\n if (contentType === null) {\n return false;\n }\n const lower = contentType.toLowerCase();\n return lower.includes(\"application/json\") || lower.includes(\"+json\");\n};\n\nconst httpFetchHandler =\n (params: HttpFetchParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const fromChannel =\n params.urlFrom !== undefined && params.urlFrom in channels\n ? valueToText(channels[params.urlFrom])\n : \"\";\n const url = fromChannel.length > 0 ? fromChannel : (params.url ?? \"\");\n const impl = params.fetchImpl ?? (globalThis.fetch as HttpFetchImpl);\n\n // Drive the timeout with an AbortController so a hung request never wedges the run.\n const controller = new AbortController();\n let timer: ReturnType<typeof setTimeout> | undefined;\n if (params.timeoutMs !== undefined && params.timeoutMs > 0) {\n timer = setTimeout(() => controller.abort(), params.timeoutMs);\n }\n\n const init: HttpFetchRequestInit = {\n method: params.method ?? \"GET\",\n signal: controller.signal\n };\n if (params.headers !== undefined) {\n init.headers = params.headers;\n }\n if (params.body !== undefined) {\n init.body = params.body;\n }\n\n try {\n const response = await impl(url, init);\n const text = await response.text();\n const contentType = response.headers.get(\"content-type\");\n let json: unknown;\n if (isJsonContentType(contentType)) {\n try {\n json = JSON.parse(text) as unknown;\n } catch {\n json = undefined;\n }\n }\n const result: HttpFetchResult = { status: response.status, ok: response.ok, body: text };\n if (json !== undefined) {\n result.json = json;\n }\n return { [params.into]: result };\n } catch (error) {\n // Never throw: surface the failure as data so the graph degrades gracefully.\n const message = error instanceof Error ? error.message : String(error);\n const result: HttpFetchResult = { ok: false, error: message };\n return { [params.into]: result };\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n };\n\n/** One web-search result: a title, a url and a snippet. */\nexport type WebSearchResult = { title: string; url: string; snippet: string };\n\n/**\n * What the web-search connector writes into the `into` channel: the normalized\n * `results` plus an optional `note`. The default connector populates `note` when it\n * degrades gracefully (e.g. no `TAVILY_API_KEY`), leaving `results` empty so a graph\n * runs without crashing.\n */\nexport type WebSearchOutcome = { results: WebSearchResult[]; note?: string };\n\n/**\n * An injectable web-search implementation. Receives the query + `k`, returns either a\n * bare `WebSearchResult[]` (which is wrapped as `{ results }`) or a full\n * {@link WebSearchOutcome} (so an impl can attach its own `note`).\n */\nexport type WebSearchImpl = (\n query: string,\n k: number\n) => Promise<WebSearchResult[] | WebSearchOutcome> | WebSearchResult[] | WebSearchOutcome;\n\n/**\n * The minimal transport the default Tavily connector posts through: a function with\n * the WHATWG `fetch` `(url, init)` shape resolving to a `Response`-like object. The\n * real `globalThis.fetch` satisfies it; a test injects a fake to stay offline.\n */\nexport type WebSearchTransport = (\n url: string,\n init: { method: string; headers: Record<string, string>; body: string }\n) => Promise<HttpFetchResponseLike> | HttpFetchResponseLike;\n\n/** Params for {@link components.webSearch}. */\nexport type WebSearchParams = {\n /** A literal query (mutually exclusive with `queryFrom`). */\n query?: string;\n /** A channel whose value supplies the query (takes precedence when its channel is set). */\n queryFrom?: string;\n /** Channel receiving the {@link WebSearchOutcome}. */\n into: string;\n /** Number of results to request. Defaults to 3. */\n k?: number;\n /**\n * The search implementation to call. Defaults to a real Tavily connector behind the\n * `TAVILY_API_KEY` env var: when the key is set it POSTs to the Tavily API; when it\n * is absent it degrades gracefully (no network, empty results + a note). Inject a\n * fake to keep a test offline or to point at another provider.\n */\n searchImpl?: WebSearchImpl;\n /**\n * The HTTP transport the default Tavily connector posts through. Defaults to the real\n * `globalThis.fetch`. Inject a fake to exercise the connector offline. Ignored when\n * `searchImpl` is supplied.\n */\n transport?: WebSearchTransport;\n};\n\n/** The Tavily search endpoint the default connector POSTs to. */\nconst TAVILY_SEARCH_URL = \"https://api.tavily.com/search\";\n\n/** The graceful-degradation note emitted when no `TAVILY_API_KEY` is configured. */\nconst NO_SEARCH_KEY_NOTE = \"no TAVILY_API_KEY; web search disabled\";\n\n/** Coerce one raw Tavily result object into a normalized {@link WebSearchResult}. */\nconst normalizeTavilyResult = (raw: unknown): WebSearchResult => {\n const obj = typeof raw === \"object\" && raw !== null ? (raw as Record<string, unknown>) : {};\n const title = typeof obj.title === \"string\" ? obj.title : \"\";\n const url = typeof obj.url === \"string\" ? obj.url : \"\";\n const snippet = typeof obj.content === \"string\" ? obj.content : \"\";\n return { title, url, snippet };\n};\n\n/**\n * The default web-search connector: a real Tavily connector behind `TAVILY_API_KEY`.\n *\n * HONEST FALLBACK — when no key is configured it makes **no** network call and returns\n * `{ results: [], note }` so a graph degrades gracefully. When the key is present it\n * POSTs `{ api_key, query, max_results }` to the Tavily API through `transport`\n * (default `globalThis.fetch`) and normalizes `results -> [{ title, url, snippet }]`.\n * On a non-2xx response or a transport error it surfaces `{ results: [], note }`\n * rather than throwing.\n */\nconst tavilySearch = async (\n query: string,\n k: number,\n transport: WebSearchTransport\n): Promise<WebSearchOutcome> => {\n const apiKey = process.env.TAVILY_API_KEY;\n if (apiKey === undefined || apiKey.length === 0) {\n return { results: [], note: NO_SEARCH_KEY_NOTE };\n }\n try {\n const response = await transport(TAVILY_SEARCH_URL, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ api_key: apiKey, query, max_results: k })\n });\n if (!response.ok) {\n return { results: [], note: `tavily search failed with status ${response.status}` };\n }\n const text = await response.text();\n const parsed = JSON.parse(text) as unknown;\n const rawResults =\n typeof parsed === \"object\" && parsed !== null && Array.isArray((parsed as { results?: unknown }).results)\n ? ((parsed as { results: unknown[] }).results)\n : [];\n return { results: rawResults.slice(0, k).map(normalizeTavilyResult) };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { results: [], note: `tavily search error: ${message}` };\n }\n};\n\nconst webSearchHandler =\n (params: WebSearchParams): NodeHandler =>\n async (_input, state) => {\n const channels = channelsOf(state);\n const fromChannel =\n params.queryFrom !== undefined && params.queryFrom in channels\n ? valueToText(channels[params.queryFrom])\n : \"\";\n const query = fromChannel.length > 0 ? fromChannel : (params.query ?? \"\");\n const k = params.k ?? 3;\n\n let outcome: WebSearchResult[] | WebSearchOutcome;\n if (params.searchImpl !== undefined) {\n outcome = await params.searchImpl(query, k);\n } else {\n const transport = params.transport ?? (globalThis.fetch as WebSearchTransport);\n outcome = await tavilySearch(query, k, transport);\n }\n // A bare array is wrapped as `{ results }`; a full outcome passes through.\n const normalized: WebSearchOutcome = Array.isArray(outcome) ? { results: outcome } : outcome;\n return { [params.into]: normalized };\n };\n\n// --- the surface -------------------------------------------------------------\n\n/**\n * The component factory surface. Each factory validates nothing here (the Rust\n * `ComponentRegistry::build_handler` validates `params` at graph-build time, and the\n * TS handlers tolerate the same shapes), returning a {@link ComponentDescriptor}\n * carrying both the native carrier and a faithful TS handler.\n */\nexport const components = {\n /** Render `{{var}}` placeholders from the channels into a target channel. */\n promptBuilder(params: PromptBuilderParams): ComponentDescriptor {\n return { kind: \"promptBuilder\", params: { ...params }, handler: promptBuilderHandler(params) };\n },\n /** Validate a channel value's type / required keys, writing an ok flag + errors. */\n jsonValidator(params: JsonValidatorParams): ComponentDescriptor {\n return { kind: \"jsonValidator\", params: { ...params }, handler: jsonValidatorHandler(params) };\n },\n /** Extract the first JSON object/array from a text channel into a target channel. */\n outputParser(params: OutputParserParams): ComponentDescriptor {\n return { kind: \"outputParser\", params: { ...params }, handler: outputParserHandler(params) };\n },\n /** Pick a route string from a channel value (pairs with a conditional edge). */\n router(params: RouterParams): ComponentDescriptor {\n return { kind: \"router\", params: { ...params }, handler: routerHandler(params) };\n },\n /** Score candidate docs against a query and keep the top-`k`. */\n retriever(params: RetrieverParams): ComponentDescriptor {\n return { kind: \"retriever\", params: { ...params }, handler: retrieverHandler(params) };\n },\n /** Reorder a retrieval-result array, optionally re-scoring against a query. */\n reranker(params: RerankerParams): ComponentDescriptor {\n return { kind: \"reranker\", params: { ...params }, handler: rerankerHandler(params) };\n },\n /** Normalise a text channel: strip HTML, lowercase, collapse whitespace, trim. */\n textCleaner(params: TextCleanerParams): ComponentDescriptor {\n return { kind: \"textCleaner\", params: { ...params }, handler: textCleanerHandler(params) };\n },\n /** Split a text channel into an array of chunk strings by chars or sentences. */\n documentSplitter(params: DocumentSplitterParams): ComponentDescriptor {\n return {\n kind: \"documentSplitter\",\n params: { ...params },\n handler: documentSplitterHandler(params)\n };\n },\n /** Strip HTML tags from a text channel and decode the common named entities. */\n htmlToText(params: HtmlToTextParams): ComponentDescriptor {\n return { kind: \"htmlToText\", params: { ...params }, handler: htmlToTextHandler(params) };\n },\n /** Parse a CSV text channel into an array of row objects (or arrays). */\n csvParser(params: CsvParserParams): ComponentDescriptor {\n return { kind: \"csvParser\", params: { ...params }, handler: csvParserHandler(params) };\n },\n /** Concatenate the array values across several channels into one merged array. */\n documentJoiner(params: DocumentJoinerParams): ComponentDescriptor {\n return { kind: \"documentJoiner\", params: { ...params }, handler: documentJoinerHandler(params) };\n },\n /** De-duplicate an array channel, keeping the first occurrence and order. */\n deduplicator(params: DeduplicatorParams): ComponentDescriptor {\n return { kind: \"deduplicator\", params: { ...params }, handler: deduplicatorHandler(params) };\n },\n /** Truncate a text channel to at most `maxChars` characters with an ellipsis. */\n truncator(params: TruncatorParams): ComponentDescriptor {\n return { kind: \"truncator\", params: { ...params }, handler: truncatorHandler(params) };\n },\n /** Extract literal-pattern matches (with `^`/`$` anchors) from a text channel. */\n regexExtractor(params: RegexExtractorParams): ComponentDescriptor {\n return { kind: \"regexExtractor\", params: { ...params }, handler: regexExtractorHandler(params) };\n },\n /** Assemble a final answer string, optionally appending numbered citations. */\n answerBuilder(params: AnswerBuilderParams): ComponentDescriptor {\n return { kind: \"answerBuilder\", params: { ...params }, handler: answerBuilderHandler(params) };\n },\n /** Remap an object channel's fields (by dotted path) into a new object. */\n fieldMapper(params: FieldMapperParams): ComponentDescriptor {\n return { kind: \"fieldMapper\", params: { ...params }, handler: fieldMapperHandler(params) };\n },\n /** Extract a scalar from a channel (optional dotted path; finalOnly reduces an agent trace to its final answer). */\n fieldExtractor(params: FieldExtractorParams): ComponentDescriptor {\n return { kind: \"fieldExtractor\", params: { ...params }, handler: fieldExtractorHandler(params) };\n },\n /** Lexical BM25 ranking of a corpus against a query; keep the top-`k`. */\n bm25Retriever(params: Bm25RetrieverParams): ComponentDescriptor {\n return { kind: \"bm25Retriever\", params: { ...params }, handler: bm25RetrieverHandler(params) };\n },\n /** Keyword-overlap ranking of a corpus against a query; keep the top-`k`. */\n keywordRetriever(params: KeywordRetrieverParams): ComponentDescriptor {\n return {\n kind: \"keywordRetriever\",\n params: { ...params },\n handler: keywordRetrieverHandler(params)\n };\n },\n /** Split text into overlapping windows of whole sentences. */\n sentenceWindowSplitter(params: SentenceWindowSplitterParams): ComponentDescriptor {\n return {\n kind: \"sentenceWindowSplitter\",\n params: { ...params },\n handler: sentenceWindowSplitterHandler(params)\n };\n },\n /** Heuristic language detection over a small set of common languages. */\n languageDetector(params: LanguageDetectorParams): ComponentDescriptor {\n return {\n kind: \"languageDetector\",\n params: { ...params },\n handler: languageDetectorHandler(params)\n };\n },\n /** Filter an array channel by a dotted-path metadata predicate. */\n metadataFilter(params: MetadataFilterParams): ComponentDescriptor {\n return { kind: \"metadataFilter\", params: { ...params }, handler: metadataFilterHandler(params) };\n },\n /** Combine several array channels by concat / union / interleave. */\n listJoiner(params: ListJoinerParams): ComponentDescriptor {\n return { kind: \"listJoiner\", params: { ...params }, handler: listJoinerHandler(params) };\n },\n /** Fuse several retrieval streams into one ranking with Reciprocal Rank Fusion. */\n mergeRanker(params: MergeRankerParams): ComponentDescriptor {\n return { kind: \"mergeRanker\", params: { ...params }, handler: mergeRankerHandler(params) };\n },\n /** Score actual vs expected text (token-F1 / overlap / exact), with an optional pass flag. */\n evaluator(params: EvaluatorParams): ComponentDescriptor {\n return { kind: \"evaluator\", params: { ...params }, handler: evaluatorHandler(params) };\n },\n /** Assemble a role-tagged chat-message array an LLM generator consumes. */\n chatMessageBuilder(params: ChatMessageBuilderParams): ComponentDescriptor {\n return {\n kind: \"chatMessageBuilder\",\n params: { ...params },\n handler: chatMessageBuilderHandler(params)\n };\n },\n /** Multi-branch rule routing over the channels (pairs with a conditional edge). */\n conditionalRouter(params: ConditionalRouterParams): ComponentDescriptor {\n return {\n kind: \"conditionalRouter\",\n params: { ...params },\n handler: conditionalRouterHandler(params)\n };\n },\n /** Append documents into an in-state document store array (optionally de-duplicating). */\n documentWriter(params: DocumentWriterParams): ComponentDescriptor {\n return { kind: \"documentWriter\", params: { ...params }, handler: documentWriterHandler(params) };\n },\n /**\n * **Integration component (vendor I/O).** Perform an HTTP request, writing an\n * {@link HttpFetchResult} (`{ status, ok, body, json }`) to `into`. This is **not**\n * a Rust component: it returns a plain {@link NodeHandler} added with\n * {@link import(\"./builder.js\").GraphBuilder.node} and runs over the JS seam on the\n * Rust engine. The default transport is the real `globalThis.fetch` (supports\n * `method`/`headers`/`body`/`timeoutMs` via an `AbortController`); it never throws —\n * a non-2xx is surfaced via `ok`/`status`, and an error/timeout writes\n * `{ ok: false, error }`. Inject `fetchImpl` to override the transport (e.g. offline\n * in tests).\n */\n httpFetch(params: HttpFetchParams): IntegrationComponentHandler {\n return httpFetchHandler(params);\n },\n /**\n * **Integration component (vendor I/O).** Run a web search, writing a\n * {@link WebSearchOutcome} (`{ results, note? }`) to `into`. This is **not** a Rust\n * component: it returns a plain {@link NodeHandler} added with\n * {@link import(\"./builder.js\").GraphBuilder.node} and runs over the JS seam on the\n * Rust engine. The default is a real Tavily connector behind `TAVILY_API_KEY`\n * (POSTs to `https://api.tavily.com/search`, normalizing results to\n * `[{ title, url, snippet }]`); when the key is absent it degrades gracefully with\n * **no** network call (empty results + a note). Inject `searchImpl` to override the\n * provider, or `transport` to keep the Tavily connector offline.\n */\n webSearch(params: WebSearchParams): IntegrationComponentHandler {\n return webSearchHandler(params);\n }\n} as const;\n","/**\n * The Doc-QA REFERENCE GRAPH — a complete input → output retrieval-augmented\n * question-answering pipeline, composed entirely from the catalog (pure components +\n * one prebuilt-style agent), authored once and runnable two ways:\n *\n * 1. as a {@link CompiledGraph} via {@link buildDocQaReference} — runs on the Rust engine;\n * 2. as a plain {@link GraphDefinition} via {@link docQaReferenceDefinition} — every\n * node carries the shared `node.metadata.component` / `node.metadata.agent`\n * carrier, so the control plane can persist it, the Studio can render it, and the\n * catalog run path (`runCatalogGraph`) can execute it on the Rust engine.\n *\n * ── THE PIPELINE ──────────────────────────────────────────────────────────────\n * INPUT { question, documents }\n * → clean (textCleaner) normalise the raw documents text\n * → split (documentSplitter) chunk it into passages\n * → retrieve (retriever) deterministic mock-embedding top-k over the corpus\n * → rerank (reranker) reorder the hits against the question\n * → prompt (promptBuilder) build a grounded prompt from context + question\n * → answer (AGENT, balanced) a grounded RAG answerer writes its AgentResult\n * → extract (fieldExtractor) reduce AgentResult.reasoning to the final answer text\n * → assemble (answerBuilder) answer text + numbered citations → OUTPUT { answer }\n * OUTPUT { answer }\n *\n * Single input set, single output channel. Runs on Mistral's balanced-tier model\n * (`MISTRAL_API_KEY`), or offline and deterministic with `AILU_LLM_MOCK=1`.\n *\n * The retriever scores against a fixed corpus baked into its params (the Rust\n * `retriever` component's `docs` are configuration, not a channel). The `documents`\n * INPUT channel feeds the clean → split ingestion-prep stages so the graph exercises a\n * real document-preparation front-end; the corpus the retriever ranks is the same\n * knowledge the documents describe, kept in params so the run is fully reproducible.\n */\n\nimport type { GraphDefinition } from \"@ailu-ai/graph-core\";\nimport type { LLMGateway, ModelTier } from \"@ailu-ai/llm-gateway\";\n\nimport { createGraph } from \"./builder.js\";\nimport type { CompiledGraph } from \"./compiled-graph.js\";\nimport { components, type RetrieverDoc } from \"./components.js\";\n\n/** A grounded prompt template: the retrieved context, then the question. */\nconst PROMPT_TEMPLATE =\n \"Answer the question using ONLY the context below. Cite the passage ids you rely \" +\n \"on. If the context does not contain the answer, say you do not know.\\n\\n\" +\n \"Context:\\n{{ranked}}\\n\\nQuestion: {{question}}\\n\\nAnswer:\";\n\n/** The grounded RAG answerer's system prompt (mirrors the prebuilt `ragAnswerer`). */\nconst RAG_SYSTEM_PROMPT =\n \"You are a retrieval-augmented answerer. You are given a question and a set of \" +\n \"retrieved context passages. Answer the question using only the provided context. \" +\n \"If the context does not contain the answer, say you do not know. Cite the passage \" +\n \"ids you relied on. Respond with the answer only.\";\n\n/** The default knowledge corpus the retriever ranks against. */\nexport const DEFAULT_REFERENCE_CORPUS: RetrieverDoc[] = [\n {\n id: \"checkpointing\",\n content:\n \"Ailu checkpoints a run after every node completion and state mutation, so a \" +\n \"crashed or suspended run resumes from the latest checkpoint and continues exactly \" +\n \"where it stopped.\"\n },\n {\n id: \"human-gates\",\n content:\n \"A human-gate node suspends the run cleanly until a person approves. Agents never \" +\n \"approve their own outputs; approval is always a different principal.\"\n },\n {\n id: \"determinism\",\n content:\n \"Graphs execute deterministically by default: same definition, same inputs, same \" +\n \"path. Conditions are named predicates, never eval'd code.\"\n },\n {\n id: \"channels\",\n content:\n \"State flows through declared channels with reducers, replace or append. Channel \" +\n \"value types flow through the builder into the results of run and resume.\"\n },\n {\n id: \"events\",\n content:\n \"The runtime emits a lifecycle event for every node transition, so every run is \" +\n \"fully observable and auditable.\"\n }\n];\n\n/** Options for {@link buildDocQaReference} / {@link docQaReferenceDefinition}. */\nexport type DocQaReferenceOptions = {\n /** @deprecated Ignored: the engine calls the model itself. Use `AILU_LLM_MOCK=1` to run offline. */\n llm?: LLMGateway;\n /** The corpus the retriever ranks against. Defaults to {@link DEFAULT_REFERENCE_CORPUS}. */\n corpus?: RetrieverDoc[];\n /** How many documents the retriever keeps before reranking. Defaults to 3. */\n k?: number;\n /** The answerer's capability tier. Defaults to `\"balanced\"`. */\n tier?: ModelTier;\n /** The answerer's provider. Defaults to `\"mistral\"`. */\n provider?: \"openai\" | \"anthropic\" | \"mistral\";\n};\n\n/**\n * Build the Doc-QA reference graph as a runnable {@link CompiledGraph}. Drive it with\n * a single input set and read the single output channel:\n *\n * ```ts\n * const app = buildDocQaReference();\n * const out = await app.run({ question: \"How does Ailu resume after a crash?\", documents: \"…\" });\n * console.log(out.channels.answer);\n * ```\n */\nexport const buildDocQaReference = (options: DocQaReferenceOptions = {}): CompiledGraph => {\n const corpus = options.corpus ?? DEFAULT_REFERENCE_CORPUS;\n const k = options.k ?? 3;\n const tier = options.tier ?? \"balanced\";\n const provider = options.provider ?? \"mistral\";\n\n return createGraph({ name: \"doc-qa-reference\", id: \"doc-qa-reference\" })\n // INPUT channels.\n .channel(\"question\", { type: \"string\", default: \"\" })\n .channel(\"documents\", { type: \"string\", default: \"\" })\n // Intermediate channels (the pipeline's working state).\n .channel(\"cleaned\", { type: \"string\", default: \"\" })\n .channel(\"chunks\", { type: \"json\", default: [] })\n .channel(\"retrieved\", { type: \"json\", default: [] })\n .channel(\"ranked\", { type: \"json\", default: [] })\n .channel(\"prompt\", { type: \"string\", default: \"\" })\n .channel(\"ragResult\", { type: \"agentResult\", reducer: \"replace\" })\n .channel(\"finalAnswer\", { type: \"string\", default: \"\" })\n // OUTPUT channel.\n .channel(\"answer\", { type: \"string\", default: \"\" })\n // 1. Normalise the raw documents text.\n .component(\n \"clean\",\n components.textCleaner({\n from: \"documents\",\n into: \"cleaned\",\n stripHtml: true,\n collapseWhitespace: true,\n trim: true\n })\n )\n // 2. Chunk the cleaned text into passages.\n .component(\n \"split\",\n components.documentSplitter({ from: \"cleaned\", into: \"chunks\", by: \"sentences\", size: 2 })\n )\n // 3. Deterministic mock-embedding retrieval over the corpus, ranked by the question.\n .component(\n \"retrieve\",\n components.retriever({ query: \"question\", into: \"retrieved\", k, docs: corpus })\n )\n // 4. Rerank the hits against the question.\n .component(\n \"rerank\",\n components.reranker({ from: \"retrieved\", into: \"ranked\", query: \"question\" })\n )\n // 5. Build a grounded prompt: the reranked context block + the question.\n .component(\n \"prompt\",\n components.promptBuilder({ template: PROMPT_TEMPLATE, into: \"prompt\" })\n )\n // 6. The grounded RAG answerer (balanced tier) writes its AgentResult to `ragResult`.\n .agentNode(\"answer\", {\n model: { provider, tier },\n prompt: { system: RAG_SYSTEM_PROMPT },\n name: \"ragAnswerer\",\n description: \"Answers a question grounded in the retrieved, reranked context.\",\n outputChannel: \"ragResult\"\n })\n // 7. Reduce the agent's AgentResult to a CLEAN final-answer string. The agent\n // wrote a full AgentResult object to `ragResult`; its `reasoning` field is a\n // trace whose final line is `final:<answer>`. The pure `fieldExtractor` follows\n // the `reasoning` path and, with `finalOnly`, keeps only the text after the last\n // `final:` marker — turning the object into the human-readable answer text. Pure\n // and deterministic.\n .component(\n \"extract\",\n components.fieldExtractor({\n from: \"ragResult\",\n into: \"finalAnswer\",\n path: \"reasoning\",\n finalOnly: true\n })\n )\n // 8. Assemble the clean answer text + numbered citations into the OUTPUT channel.\n // answerBuilder renders `finalAnswer` as `{{answer}}` and the reranked passages\n // as a numbered `{{citations}}` block — a grounded, cited, human-readable answer\n // in the single `answer` output channel (no raw AgentResult JSON dump).\n .component(\n \"assemble\",\n components.answerBuilder({\n from: \"finalAnswer\",\n into: \"answer\",\n contextFrom: \"ranked\",\n template: \"{{answer}}\\n\\nSources:\\n{{citations}}\"\n })\n )\n .edge(\"clean\", \"split\")\n .edge(\"split\", \"retrieve\")\n .edge(\"retrieve\", \"rerank\")\n .edge(\"rerank\", \"prompt\")\n .edge(\"prompt\", \"answer\")\n .edge(\"answer\", \"extract\")\n .edge(\"extract\", \"assemble\")\n .entry(\"clean\")\n .compile();\n};\n\n/**\n * The Doc-QA reference graph as a plain {@link GraphDefinition} carrying the shared\n * `node.metadata.component` / `node.metadata.agent` carrier on every node. This is the\n * form the control plane persists, the Studio renders, and `runCatalogGraph` executes\n * on the Rust engine. Pure data — no handler closures, no LLM gateway.\n */\nexport const docQaReferenceDefinition = (options: DocQaReferenceOptions = {}): GraphDefinition =>\n buildDocQaReference(options).definition;\n","import type { GraphDefinition } from \"@ailu-ai/graph-core\";\nimport { InMemoryToolRegistry, type ToolId } from \"@ailu-ai/agents-core\";\nimport { DefaultLLMGateway } from \"@ailu-ai/llm-gateway\";\n\nimport { createGraph } from \"./builder.js\";\nimport { docQaReferenceDefinition } from \"./reference-graph.js\";\n\n/**\n * Canonical example graphs authored with the SDK. Shipped so the Studio can render\n * them and the control plane can seed them — one source of truth for both. Only the\n * `.definition` (plain data) is meant to cross boundaries.\n */\nexport type ExampleGraph = {\n slug: string;\n name: string;\n description: string;\n definition: GraphDefinition;\n};\n\nconst passthrough = { parse: (value: unknown) => value };\n\nconst publishFlow = (): GraphDefinition =>\n createGraph({ name: \"publish-flow\" })\n .channel(\"draft\", { type: \"string\", default: \"\" })\n .channel(\"approved\", { type: \"boolean\", default: false })\n .node(\"write\", async () => ({ draft: \"…\" }))\n .humanGate(\"review\")\n .node(\"publish\", async () => ({ approved: true }))\n .edge(\"write\", \"review\")\n .edge(\"review\", \"publish\")\n .compile().definition;\n\nconst supportAgent = (): GraphDefinition => {\n const tools = new InMemoryToolRegistry();\n tools.register(\n {\n id: \"refund\" as ToolId,\n name: \"refund\",\n description: \"Issues a customer refund. Sensitive.\",\n inputSchema: passthrough,\n outputSchema: passthrough,\n permissions: [\"payments:write\"],\n requiresApproval: true,\n jsonSchema: { type: \"object\" }\n },\n async () => ({ ok: true })\n );\n\n return createGraph({ name: \"support-agent\" })\n .agentNode(\"assistant\", {\n llm: new DefaultLLMGateway(),\n prompt: { system: \"You are a support agent. Use tools when needed.\" },\n tools,\n suspendForApproval: true\n })\n .compile().definition;\n};\n\n/**\n * A deliberately minimal, DETERMINISTIC demo of an explicit-approval gate that works\n * on the TS fallback path (no Rust addon required). A single `assistant` agent node\n * carries an approval-gated `refund` tool. Driven by the control plane's offline mock\n * LLM (which scripts a first turn that CALLS `refund`), the agent surfaces an approval\n * request and the run suspends — filing exactly ONE pending approval through the\n * ApprovalEngine. A human (a different principal) resolves it, then the run resumes\n * and the now-unlocked tool executes to completion.\n *\n * The carrier `node.metadata.agent.approvalToolNames` persists `[\"refund\"]`, which is\n * what the TS run path reconstructs the gated tool from across the DB boundary.\n */\nconst approvalDemo = (): GraphDefinition => {\n const tools = new InMemoryToolRegistry();\n tools.register(\n {\n id: \"refund\" as ToolId,\n name: \"refund\",\n description: \"Issues a customer refund. Sensitive — requires explicit human approval.\",\n inputSchema: passthrough,\n outputSchema: passthrough,\n permissions: [\"payments:write\"],\n requiresApproval: true,\n jsonSchema: { type: \"object\" }\n },\n async () => ({ ok: true, refunded: true })\n );\n\n return createGraph({ name: \"approval-demo\" })\n .agentNode(\"assistant\", {\n llm: new DefaultLLMGateway(),\n prompt: {\n system:\n \"You are a billing agent. Always issue the refund the customer asks for by \" +\n \"calling the `refund` tool.\"\n },\n tools,\n suspendForApproval: true\n })\n .compile().definition;\n};\n\n/** Build the example graph definitions. Pure — no LLM call, no I/O. */\nexport const exampleGraphs = (): ExampleGraph[] => [\n {\n slug: \"publish-flow\",\n name: \"Publish flow\",\n description: \"Un flux humain-dans-la-boucle : rédaction, porte d'approbation, publication.\",\n definition: publishFlow()\n },\n {\n slug: \"support-agent\",\n name: \"Support agent\",\n description: \"Un agent ReAct qui suspend le run pour approbation avant un outil sensible.\",\n definition: supportAgent()\n },\n {\n slug: \"approval-demo\",\n name: \"Approval demo\",\n description:\n \"Démo déterministe d'une porte d'approbation explicite (chemin TS, sans addon Rust) : \" +\n \"un agentNode appelle un outil `refund` gaté, le run suspend en créant UNE approbation \" +\n \"PENDING ; un humain l'approuve, puis le run reprend et l'outil s'exécute.\",\n definition: approvalDemo()\n },\n {\n slug: \"doc-qa-reference\",\n name: \"Doc QA (reference)\",\n description:\n \"Pipeline RAG complet entrée → sortie : textCleaner → documentSplitter → retriever \" +\n \"→ reranker → promptBuilder → agent (ragAnswerer, balanced) → answerBuilder. \" +\n \"Chaque nœud porte le carrier catalog (node.metadata), donc le control plane \" +\n \"l'exécute sur le moteur Rust.\",\n definition: docQaReferenceDefinition()\n }\n];\n","// LLM Council — governed deliberation (ADR 0013 / ADR 0061). A council dispatches a query to N member\n// agents (fan-out), has reviewers rank the ANONYMIZED field, aggregates the ranks, and a chair\n// synthesizes the final answer. This module holds the two DETERMINISTIC pure steps — anonymize+shuffle\n// and aggregate-ranks — no model, no I/O, replay-faithful (the \"not an ensemble trick\" core of ADR\n// 0013) — plus the `council(...)` graph builder that wires them between the agent fan-outs.\n\nimport type { EdgeId, GraphDefinition, GraphId, NodeId } from \"@ailu-ai/graph-core\";\n\nimport { toAgentCarrier, toRustAgentConfig, type AgentNodeConfig } from \"./agent-node.js\";\n\n/** One member's answer to the query. */\nexport type MemberAnswer = { memberId: string; content: string };\n\n/** An answer stripped of its author, relabeled + shuffled so a reviewer can't favour its own. */\nexport type AnonymizedAnswer = { label: string; content: string; memberId: string };\n\n/** Deterministic 32-bit hash (FNV-1a) — for a replay-faithful shuffle. */\nconst hash = (text: string): number => {\n let h = 2166136261;\n for (let i = 0; i < text.length; i += 1) {\n h ^= text.charCodeAt(i);\n h = Math.imul(h, 16777619);\n }\n return h >>> 0;\n};\n\nconst LABELS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\n/**\n * Strip authorship, relabel `A,B,C,…`, and shuffle deterministically by `seed` (so the same run\n * replays identically). Reviewers see only `{ label, content }`; the `memberId` is retained so the\n * control plane can de-anonymize the audit trail after ranking — never shown to a reviewer.\n */\nexport const anonymizeAndShuffle = (answers: MemberAnswer[], seed: string): AnonymizedAnswer[] => {\n const ordered = [...answers].sort((a, b) => {\n const ha = hash(`${seed}:${a.memberId}`);\n const hb = hash(`${seed}:${b.memberId}`);\n return ha === hb ? a.memberId.localeCompare(b.memberId) : ha - hb;\n });\n return ordered.map((answer, index) => ({\n label: LABELS[index] ?? `M${index}`,\n content: answer.content,\n memberId: answer.memberId\n }));\n};\n\n/**\n * Aggregate reviewer rankings into a consensus order (Borda count). Each ranking is an ordered list\n * of labels, best-first; a label at position `p` of `n` scores `n - p`. Unranked labels score 0.\n * Returns the labels best-first; ties break by label asc (deterministic). A ranking's duplicate or\n * unknown labels are ignored.\n */\nexport const aggregateRanks = (rankings: string[][], labels: string[]): string[] => {\n const valid = new Set(labels);\n const scores = new Map<string, number>(labels.map((l) => [l, 0]));\n for (const ranking of rankings) {\n const seen = new Set<string>();\n const clean = ranking.filter((l) => valid.has(l) && !seen.has(l));\n for (const l of clean) seen.add(l);\n const n = clean.length;\n clean.forEach((label, position) => {\n scores.set(label, (scores.get(label) ?? 0) + (n - position));\n });\n }\n return [...labels].sort((a, b) => {\n const sa = scores.get(a) ?? 0;\n const sb = scores.get(b) ?? 0;\n return sb === sa ? a.localeCompare(b) : sb - sa;\n });\n};\n\n/**\n * Parse a reviewer's free-text reply into an ordered list of labels (the labels it names, in order,\n * deduped) — tolerant of prose like \"I rank B first, then A, then C\". Only whole words exactly equal\n * to a label count (case-sensitive, so the article \"a\" is not label A; \"Answer\" is not label A\n * either). Unknown labels are dropped.\n */\nexport const parseRanking = (text: string, labels: string[]): string[] => {\n const valid = new Set(labels);\n const seen = new Set<string>();\n const out: string[] = [];\n for (const token of text.split(/[^A-Za-z0-9]+/)) {\n if (valid.has(token) && !seen.has(token)) {\n seen.add(token);\n out.push(token);\n }\n }\n return out;\n};\n\n/** A council seat (member / reviewer / chair) — an agent-node config minus its output channel. */\nexport type CouncilSeat = Omit<AgentNodeConfig, \"outputChannel\">;\n\nexport type CouncilOptions = {\n /** Channel holding the query text. Default `\"query\"`. */\n queryChannel?: string;\n /** The member agents (fixed N). Each answers the query independently, in parallel. */\n members: CouncilSeat[];\n /** Reviewers that rank the anonymized field. Default: one reviewer per member. */\n reviewers?: CouncilSeat[];\n /** The chair that synthesizes the final answer from the aggregated field (writes `answer`). */\n chair: CouncilSeat;\n /** Suspend on a human gate before the chair synthesizes (high-stakes). Default false. */\n humanGate?: boolean;\n /** Seed for the deterministic anonymize-shuffle (replay). Default `\"council\"`. */\n seed?: string;\n};\n\nconst memberChannel = (i: number): string => `member_${i}`;\nconst reviewChannel = (i: number): string => `review_${i}`;\n\ntype CouncilNode = GraphDefinition[\"nodes\"][number];\n\n/** An agent seat that sees only `visibleChannels`: never another seat's channel or the audit key. */\nconst agentSeatNode = (\n id: string,\n seat: CouncilSeat,\n outputChannel: string,\n visibleChannels: string[]\n): CouncilNode => ({\n id: id as NodeId,\n type: \"agent\",\n label: id,\n metadata: { agent: toAgentCarrier(toRustAgentConfig(id, { ...seat, outputChannel, visibleChannels })) }\n});\n\nconst componentNode = (\n id: string,\n kind: string,\n params: Record<string, unknown>\n): CouncilNode => ({\n id: id as NodeId,\n type: \"action\",\n label: id,\n metadata: { component: { kind, params } }\n});\n\nconst edge = (from: string, to: string): GraphDefinition[\"edges\"][number] => ({\n id: `e_${from}_${to}` as EdgeId,\n from: from as NodeId,\n to: to as NodeId,\n type: \"default\"\n});\n\n/**\n * Build a governed LLM Council (ADR 0013 / ADR 0061) as a native **catalog** GraphDefinition: dispatch\n * → members (fan-out) → `councilAnonymize` → reviewers (fan-out, rank the field) → `councilAggregate` →\n * [optional human gate] → chair synthesis. Members/reviewers/chair are agent-carrier nodes, each\n * shown only the channels it needs: a reviewer ranks labelled answers without seeing who wrote them\n * (the label → member key goes to `fieldKey`, for the audit trail); anonymize/aggregate are Rust catalog components\n * (their deterministic logic mirrors the exported pure helpers). Every node carries a `component`/\n * `agent` carrier, so the graph runs on the Rust engine via `runCatalogGraph` — no JS handlers. Fixed N\n * (the member list length) via the runtime fan-out. Returns the definition; run it with\n * `runCatalogGraph(council(...))`.\n */\nexport const council = (options: CouncilOptions): GraphDefinition => {\n const query = options.queryChannel ?? \"query\";\n const reviewers = options.reviewers ?? options.members;\n const seed = options.seed ?? \"council\";\n const memberIds = options.members.map((_, i) => memberChannel(i));\n const reviewIds = reviewers.map((_, i) => reviewChannel(i));\n\n const channels: GraphDefinition[\"channels\"] = {\n [query]: { type: \"string\", reducer: \"replace\", default: \"\" },\n _dispatch: { type: \"string\", reducer: \"replace\", default: \"\" },\n field: { type: \"json\", reducer: \"replace\", default: [] },\n fieldKey: { type: \"json\", reducer: \"replace\", default: [] },\n aggregate: { type: \"json\", reducer: \"replace\", default: [] },\n answer: { type: \"agentResult\", reducer: \"replace\" }\n };\n for (const id of [...memberIds, ...reviewIds]) {\n channels[id] = { type: \"agentResult\", reducer: \"replace\" };\n }\n\n const dispatch: CouncilNode = {\n ...componentNode(\"dispatch\", \"textCleaner\", { from: query, into: \"_dispatch\" }),\n fanOut: { parallelTo: memberIds as NodeId[], joinAt: \"anonymize\" as NodeId }\n };\n const anonymize: CouncilNode = {\n ...componentNode(\"anonymize\", \"councilAnonymize\", {\n fromChannels: memberIds,\n into: \"field\",\n keyInto: \"fieldKey\",\n seed\n }),\n fanOut: { parallelTo: reviewIds as NodeId[], joinAt: \"aggregate\" as NodeId }\n };\n const gate: CouncilNode[] =\n options.humanGate === true ? [{ id: \"gate\" as NodeId, type: \"human-gate\", label: \"gate\" }] : [];\n\n const nodes: CouncilNode[] = [\n dispatch,\n // Members see only the query; reviewers the query and the anonymized field (no authors); the\n // chair the field and its ranking. `fieldKey` (label → member) stays for the audit trail.\n ...options.members.map((seat, i) => agentSeatNode(memberChannel(i), seat, memberChannel(i), [query])),\n anonymize,\n ...reviewers.map((seat, i) =>\n agentSeatNode(reviewChannel(i), seat, reviewChannel(i), [query, \"field\"])\n ),\n componentNode(\"aggregate\", \"councilAggregate\", {\n reviewsFrom: reviewIds,\n fieldFrom: \"field\",\n into: \"aggregate\"\n }),\n ...gate,\n agentSeatNode(\"chair\", options.chair, \"answer\", [query, \"field\", \"aggregate\"])\n ];\n\n const edges = [\n edge(\"dispatch\", memberChannel(0)),\n edge(\"anonymize\", reviewChannel(0)),\n ...(options.humanGate === true\n ? [edge(\"aggregate\", \"gate\"), edge(\"gate\", \"chair\")]\n : [edge(\"aggregate\", \"chair\")])\n ];\n\n return {\n id: \"council\" as GraphId,\n version: \"0.0.0\",\n name: \"council\",\n channels,\n nodes,\n edges,\n entryNodeId: \"dispatch\" as NodeId\n };\n};\n","/**\n * Prebuilt, tier-tagged micro-agent graphs. Each factory returns a runnable\n * {@link CompiledGraph} pre-wired with its capability {@link ModelTier} (matching the\n * Rust `PrebuiltAgent` definitions in `crates/components`), so the concrete model is\n * resolved by the {@link ModelPolicy} from the providers actually available — on Rust\n * by the bridge, on the TS fallback path by the SDK.\n *\n * A prebuilt agent is a one-agent graph, except {@link prebuilt.ragAnswerer}, which\n * composes the `retriever` + `reranker` components with an agent step.\n *\n * ```ts\n * import { prebuilt } from \"@ailu-ai/graph-sdk\";\n *\n * const result = await prebuilt.summarizer().run({ question: \"long text…\" });\n * console.log(result.channels.summary);\n * ```\n *\n * Each agent reads its provider's API key from the environment and fails with an error\n * naming the variable when none is set; `AILU_LLM_MOCK=1` runs it on the engine's\n * deterministic offline mock instead. Supply `model` to pin a concrete model, or\n * `tierOverride` to change the capability tier.\n */\n\nimport {\n DefaultLLMGateway,\n MockLLMProviderAdapter,\n type LLMGateway,\n type LLMProvider,\n type ModelTier\n} from \"@ailu-ai/llm-gateway\";\nimport { InMemoryToolRegistry, type ToolId, type ToolRegistry } from \"@ailu-ai/agents-core\";\n\nimport { createGraph } from \"./builder.js\";\nimport { components, type RetrieverDoc } from \"./components.js\";\nimport type { CompiledGraph } from \"./compiled-graph.js\";\n\n/** Light options accepted by every prebuilt-agent factory. */\nexport type PrebuiltOptions = {\n /**\n * @deprecated Ignored: the Rust engine builds the gateway from the model and the\n * environment's API keys (`AILU_LLM_MOCK=1` for the offline mock).\n */\n llm?: LLMGateway;\n /** Override the capability tier the agent's model is resolved from. */\n tierOverride?: ModelTier;\n /**\n * Pin a concrete model, bypassing tier resolution (the explicit-override\n * precedence: an explicit model always wins over the tier).\n */\n model?: string;\n /**\n * The provider slot for the request (and the slot the default mock gateway\n * registers under). Defaults to `\"anthropic\"`. The actual adapter is the mock\n * unless a custom `llm` is supplied.\n */\n provider?: LLMProvider;\n};\n\n/** A prebuilt micro-agent definition mirrored from the Rust `PrebuiltAgent` table. */\ntype PrebuiltDef = {\n name: string;\n description: string;\n tier: ModelTier;\n systemPrompt: string;\n toolNames: string[];\n suspendForApproval: boolean;\n outputChannel: string;\n};\n\n/**\n * The prebuilt definitions, mirroring `crates/components/src/prebuilt.rs` exactly\n * (name, tier, system prompt, tools, suspend flag, output channel).\n */\nconst DEFS: Record<string, PrebuiltDef> = {\n summarizer: {\n name: \"summarizer\",\n description: \"Condenses input text into a short, faithful summary.\",\n tier: \"fast\",\n systemPrompt:\n \"You are a precise summarizer. Read the user's text and produce a concise \" +\n \"summary that preserves the key facts and intent. Do not add information \" +\n \"that is not present. Respond with the summary only, no preamble.\",\n toolNames: [],\n suspendForApproval: false,\n outputChannel: \"summary\"\n },\n classifier: {\n name: \"classifier\",\n description: \"Assigns the input to exactly one label from a fixed set.\",\n tier: \"fast\",\n systemPrompt:\n 'You are a text classifier. Classify the user\\'s input into exactly one of ' +\n 'the following labels: \"positive\", \"negative\", \"neutral\", \"question\", ' +\n '\"spam\". Respond with the single label only, lowercase, no punctuation or ' +\n \"explanation.\",\n toolNames: [],\n suspendForApproval: false,\n outputChannel: \"label\"\n },\n extractor: {\n name: \"extractor\",\n description: \"Extracts structured fields from unstructured text as JSON.\",\n tier: \"fast\",\n systemPrompt:\n \"You extract structured data from text. Return a single JSON object that \" +\n 'matches this schema: { \"name\": string | null, \"email\": string | null, ' +\n '\"organization\": string | null, \"intent\": string | null }. Use null for ' +\n \"any field not present in the text. Respond with the JSON object only, no \" +\n \"code fences and no commentary.\",\n toolNames: [],\n suspendForApproval: false,\n outputChannel: \"extracted\"\n },\n sqlGenerator: {\n name: \"sqlGenerator\",\n description: \"Generates a SQL query from a natural-language request and schema.\",\n tier: \"balanced\",\n systemPrompt:\n \"You are a SQL generator. Given a natural-language request and an optional \" +\n \"schema description, produce a single, syntactically valid SQL query that \" +\n \"answers the request. Prefer standard SQL. Do not modify data unless the \" +\n \"request explicitly asks for it. Respond with the SQL query only, no code \" +\n \"fences and no explanation.\",\n toolNames: [],\n suspendForApproval: false,\n outputChannel: \"sql\"\n },\n ragAnswerer: {\n name: \"ragAnswerer\",\n description:\n \"Answers a question grounded in retrieved documents. Composed as a graph: \" +\n \"the `retriever` component fetches candidate documents, the `reranker` \" +\n \"component reorders them, and this agent step writes a grounded answer \" +\n \"citing the supplied context.\",\n tier: \"balanced\",\n systemPrompt:\n \"You are a retrieval-augmented answerer. You are given a question and a set \" +\n \"of retrieved context passages. Answer the question using only the \" +\n \"provided context. If the context does not contain the answer, say you do \" +\n \"not know. Cite the passage ids you relied on. Respond with the answer \" +\n \"only.\",\n toolNames: [],\n suspendForApproval: false,\n outputChannel: \"answer\"\n },\n refundApprover: {\n name: \"refundApprover\",\n description:\n \"Decides whether to issue a refund and routes the action through a human \" +\n \"approval gate before calling the `refund` tool.\",\n tier: \"balanced\",\n systemPrompt:\n \"You are a refund assistant. Review the customer's request and the order \" +\n \"details, decide whether a refund is warranted, and if so prepare a call \" +\n \"to the `refund` tool with the order id and amount. You may not issue a \" +\n \"refund without human approval. Explain your reasoning before requesting \" +\n \"the tool.\",\n toolNames: [\"refund\"],\n suspendForApproval: true,\n outputChannel: \"refundDecision\"\n },\n translator: {\n name: \"translator\",\n description: \"Translates the input text into a target language, preserving meaning.\",\n tier: \"fast\",\n systemPrompt:\n \"You are a translator. Translate the user's text into the requested target \" +\n \"language, preserving meaning, tone, and formatting. If no target language \" +\n \"is given, translate into English. Do not add explanations. Respond with \" +\n \"the translated text only.\",\n toolNames: [],\n suspendForApproval: false,\n outputChannel: \"translation\"\n },\n sentimentAnalyzer: {\n name: \"sentimentAnalyzer\",\n description: \"Classifies the emotional tone of the input text.\",\n tier: \"fast\",\n systemPrompt:\n \"You are a sentiment analyzer. Read the user's text and classify its \" +\n 'overall sentiment as exactly one of: \"positive\", \"negative\", \"neutral\", ' +\n '\"mixed\". Respond with the single label only, lowercase, no punctuation or ' +\n \"explanation.\",\n toolNames: [],\n suspendForApproval: false,\n outputChannel: \"sentiment\"\n },\n entityExtractor: {\n name: \"entityExtractor\",\n description: \"Extracts named entities from text as a JSON array.\",\n tier: \"fast\",\n systemPrompt:\n \"You extract named entities from text. Return a single JSON array where \" +\n 'each element is an object { \"text\": string, \"type\": one of \"person\" | ' +\n '\"organization\" | \"location\" | \"date\" | \"other\" }. Return an empty array if ' +\n \"there are no entities. Respond with the JSON array only, no code fences and \" +\n \"no commentary.\",\n toolNames: [],\n suspendForApproval: false,\n outputChannel: \"entities\"\n },\n piiRedactor: {\n name: \"piiRedactor\",\n description: \"Redacts personally identifiable information from the input text.\",\n tier: \"fast\",\n systemPrompt:\n \"You are a PII redactor. Rewrite the user's text replacing any personally \" +\n \"identifiable information (names, emails, phone numbers, addresses, \" +\n \"government ids, payment details) with a bracketed placeholder such as \" +\n \"[REDACTED_EMAIL] or [REDACTED_NAME]. Preserve all other text exactly. \" +\n \"Respond with the redacted text only.\",\n toolNames: [],\n suspendForApproval: false,\n outputChannel: \"redacted\"\n },\n intentClassifier: {\n name: \"intentClassifier\",\n description: \"Maps the input to a single conversational intent label.\",\n tier: \"fast\",\n systemPrompt:\n \"You are an intent classifier. Classify the user's message into exactly \" +\n 'one intent label: \"question\", \"request\", \"complaint\", \"feedback\", ' +\n '\"chitchat\", \"other\". Respond with the single label only, lowercase, no ' +\n \"punctuation or explanation.\",\n toolNames: [],\n suspendForApproval: false,\n outputChannel: \"intent\"\n },\n titleGenerator: {\n name: \"titleGenerator\",\n description: \"Generates a short, descriptive title for the input text.\",\n tier: \"fast\",\n systemPrompt:\n \"You generate titles. Read the user's text and produce a single concise, \" +\n \"descriptive title of at most ten words that captures its main topic. Use \" +\n \"title case. Respond with the title only, no quotation marks and no \" +\n \"explanation.\",\n toolNames: [],\n suspendForApproval: false,\n outputChannel: \"title\"\n },\n keywordExtractor: {\n name: \"keywordExtractor\",\n description: \"Extracts the key terms from the input text as a JSON array.\",\n tier: \"fast\",\n systemPrompt:\n \"You extract keywords. Read the user's text and return a single JSON array \" +\n \"of the most important keywords or key phrases (lowercase strings), most \" +\n \"significant first, with no duplicates. Respond with the JSON array only, \" +\n \"no code fences and no commentary.\",\n toolNames: [],\n suspendForApproval: false,\n outputChannel: \"keywords\"\n },\n questionAnswerer: {\n name: \"questionAnswerer\",\n description: \"Answers a question directly and concisely from its own knowledge.\",\n tier: \"balanced\",\n systemPrompt:\n \"You are a question answerer. Read the user's question and answer it \" +\n \"directly, accurately, and concisely. If you are not certain of the \" +\n \"answer, say so rather than guessing. Respond with the answer only.\",\n toolNames: [],\n suspendForApproval: false,\n outputChannel: \"answer\"\n },\n codeReviewer: {\n name: \"codeReviewer\",\n description: \"Reviews a code snippet or diff for correctness, security, and quality.\",\n tier: \"frontier\",\n systemPrompt:\n \"You are a senior code reviewer. Review the supplied code or diff for \" +\n \"correctness bugs, security issues, performance problems, and readability. \" +\n \"Be specific and reference concrete lines or constructs. Prioritise \" +\n \"high-impact findings; do not invent issues. Respond with a concise, \" +\n \"ordered list of findings, each with a short rationale and a suggested \" +\n \"fix.\",\n toolNames: [],\n suspendForApproval: false,\n outputChannel: \"review\"\n },\n copyEditor: {\n name: \"copyEditor\",\n description: \"Polishes prose for clarity, grammar, flow, and tone.\",\n tier: \"creative\",\n systemPrompt:\n \"You are a copy editor. Rewrite the user's text to improve clarity, \" +\n \"grammar, flow, and tone while preserving the original meaning and voice. \" +\n \"Do not change the language or invent facts. Respond with the edited text \" +\n \"only, no commentary.\",\n toolNames: [],\n suspendForApproval: false,\n outputChannel: \"edited\"\n }\n};\n\n/** The provider slot a prebuilt agent uses unless overridden. */\nconst DEFAULT_PROVIDER: LLMProvider = \"anthropic\";\n\n/**\n * The gateway a prebuilt agent runs on: the caller's `llm` if given, else a\n * deterministic mock gateway registered under the nominal provider (so the graph runs\n * end-to-end with no provider keys).\n *\n * For an approval-gated agent (e.g. `refundApprover`), the default mock scripts an\n * `ACTION: <tool> {}` turn so the agent reaches for its gated tool and the\n * suspend-for-approval gate fires — matching the Rust definition's intent. Other\n * agents get a plain final-answer turn.\n */\nconst resolveGateway = (options: PrebuiltOptions, provider: LLMProvider, def: PrebuiltDef): LLMGateway => {\n if (options.llm !== undefined) {\n return options.llm;\n }\n const firstTool = def.toolNames[0];\n const content =\n def.suspendForApproval && firstTool !== undefined ? `ACTION: ${firstTool} {}` : \"mock-response\";\n const gateway = new DefaultLLMGateway();\n gateway.registerAdapter(\n new MockLLMProviderAdapter({\n provider,\n response: { content, usage: { promptTokens: 0, completionTokens: 0 }, model: \"mock\", provider }\n })\n );\n return gateway;\n};\n\n/**\n * A tool registry for a prebuilt agent's `toolNames`. Each tool is a no-op stub whose\n * `requiresApproval` matches the definition's `suspendForApproval` (e.g. `refund`),\n * so the suspend-for-approval gate behaves the same as the Rust definition.\n */\nconst buildToolRegistry = (def: PrebuiltDef): ToolRegistry | undefined => {\n if (def.toolNames.length === 0) {\n return undefined;\n }\n const passthrough = { parse: (value: unknown) => value };\n const registry = new InMemoryToolRegistry();\n for (const name of def.toolNames) {\n registry.register(\n {\n id: name as ToolId,\n name,\n description: `${name} tool for the ${def.name} prebuilt agent`,\n inputSchema: passthrough,\n outputSchema: passthrough,\n permissions: [],\n requiresApproval: def.suspendForApproval,\n jsonSchema: { type: \"object\" }\n },\n async () => ({ ok: true })\n );\n }\n return registry;\n};\n\n/** Build the one-agent graph for a simple prebuilt definition. */\nconst buildAgentGraph = (def: PrebuiltDef, options: PrebuiltOptions): CompiledGraph => {\n const provider = options.provider ?? DEFAULT_PROVIDER;\n const tier = options.tierOverride ?? def.tier;\n return createGraph({ name: `prebuilt-${def.name}` })\n .agentNode(def.name, {\n llm: resolveGateway(options, provider, def),\n prompt: { system: def.systemPrompt },\n provider,\n tier,\n model: options.model,\n tools: buildToolRegistry(def),\n suspendForApproval: def.suspendForApproval,\n name: def.name,\n description: def.description,\n outputChannel: def.outputChannel\n })\n .compile();\n};\n\n/** Default corpus for {@link prebuilt.ragAnswerer} when the caller supplies none. */\nconst DEFAULT_RAG_DOCS: RetrieverDoc[] = [\n { id: \"d1\", content: \"Ailu is a stateful, resumable agent graph runtime.\" },\n { id: \"d2\", content: \"The runtime checkpoints after every node and emits lifecycle events.\" },\n { id: \"d3\", content: \"Human-gate nodes suspend the run cleanly for approval.\" }\n];\n\n/** Options for {@link prebuilt.ragAnswerer}: the simple options plus its retrieval corpus. */\nexport type RagAnswererOptions = PrebuiltOptions & {\n /** The corpus the retriever scores against. Defaults to a small built-in set. */\n docs?: RetrieverDoc[];\n /** How many documents the retriever keeps before reranking. Defaults to 4. */\n k?: number;\n /** Channel the question is read from (the retriever query). Defaults to `\"question\"`. */\n questionChannel?: string;\n};\n\n/**\n * Build the composed RAG graph: a `retriever` component fetches candidate documents,\n * a `reranker` component reorders them against the question, and an agent step writes\n * a grounded answer. Wired as `retrieve -> rerank -> answer`.\n */\nconst buildRagGraph = (options: RagAnswererOptions): CompiledGraph => {\n const def = DEFS.ragAnswerer!;\n const provider = options.provider ?? DEFAULT_PROVIDER;\n const tier = options.tierOverride ?? def.tier;\n const questionChannel = options.questionChannel ?? \"question\";\n const docs = options.docs ?? DEFAULT_RAG_DOCS;\n\n return createGraph({ name: \"prebuilt-ragAnswerer\" })\n .channel(questionChannel, { type: \"string\", default: \"\" })\n .channel(\"retrieved\", { type: \"json\", default: [] })\n .channel(\"ranked\", { type: \"json\", default: [] })\n .component(\n \"retrieve\",\n components.retriever({ query: questionChannel, into: \"retrieved\", k: options.k ?? 4, docs })\n )\n .component(\n \"rerank\",\n components.reranker({ from: \"retrieved\", into: \"ranked\", query: questionChannel })\n )\n .agentNode(\"answer\", {\n llm: resolveGateway(options, provider, def),\n prompt: { system: def.systemPrompt },\n provider,\n tier,\n model: options.model,\n name: def.name,\n description: def.description,\n outputChannel: def.outputChannel\n })\n .edge(\"retrieve\", \"rerank\")\n .edge(\"rerank\", \"answer\")\n .entry(\"retrieve\")\n .compile();\n};\n\n/**\n * The prebuilt micro-agent surface. Each factory returns a runnable\n * {@link CompiledGraph} pre-wired with the agent's tier (matching the Rust\n * `PrebuiltAgent` definitions).\n */\nexport const prebuilt = {\n /** Condense input text into a short, faithful summary (writes `summary`). */\n summarizer(options: PrebuiltOptions = {}): CompiledGraph {\n return buildAgentGraph(DEFS.summarizer!, options);\n },\n /** Assign the input to one label from a fixed set (writes `label`). */\n classifier(options: PrebuiltOptions = {}): CompiledGraph {\n return buildAgentGraph(DEFS.classifier!, options);\n },\n /** Extract structured fields from text as JSON (writes `extracted`). */\n extractor(options: PrebuiltOptions = {}): CompiledGraph {\n return buildAgentGraph(DEFS.extractor!, options);\n },\n /** Generate a SQL query from a natural-language request (writes `sql`). */\n sqlGenerator(options: PrebuiltOptions = {}): CompiledGraph {\n return buildAgentGraph(DEFS.sqlGenerator!, options);\n },\n /** Answer a question grounded in retrieved documents (retriever + reranker + agent). */\n ragAnswerer(options: RagAnswererOptions = {}): CompiledGraph {\n return buildRagGraph(options);\n },\n /** Decide on a refund, gated behind human approval before the `refund` tool runs. */\n refundApprover(options: PrebuiltOptions = {}): CompiledGraph {\n return buildAgentGraph(DEFS.refundApprover!, options);\n },\n /** Translate input text into a target language (fast; writes `translation`). */\n translator(options: PrebuiltOptions = {}): CompiledGraph {\n return buildAgentGraph(DEFS.translator!, options);\n },\n /** Classify the emotional tone of the input (fast; writes `sentiment`). */\n sentimentAnalyzer(options: PrebuiltOptions = {}): CompiledGraph {\n return buildAgentGraph(DEFS.sentimentAnalyzer!, options);\n },\n /** Extract named entities from text as a JSON array (fast; writes `entities`). */\n entityExtractor(options: PrebuiltOptions = {}): CompiledGraph {\n return buildAgentGraph(DEFS.entityExtractor!, options);\n },\n /** Redact personally identifiable information from text (fast; writes `redacted`). */\n piiRedactor(options: PrebuiltOptions = {}): CompiledGraph {\n return buildAgentGraph(DEFS.piiRedactor!, options);\n },\n /** Map the input to a single conversational intent label (fast; writes `intent`). */\n intentClassifier(options: PrebuiltOptions = {}): CompiledGraph {\n return buildAgentGraph(DEFS.intentClassifier!, options);\n },\n /** Generate a short, descriptive title for the input (fast; writes `title`). */\n titleGenerator(options: PrebuiltOptions = {}): CompiledGraph {\n return buildAgentGraph(DEFS.titleGenerator!, options);\n },\n /** Extract the key terms from the input as a JSON array (fast; writes `keywords`). */\n keywordExtractor(options: PrebuiltOptions = {}): CompiledGraph {\n return buildAgentGraph(DEFS.keywordExtractor!, options);\n },\n /** Answer a question directly and concisely (balanced; writes `answer`). */\n questionAnswerer(options: PrebuiltOptions = {}): CompiledGraph {\n return buildAgentGraph(DEFS.questionAnswerer!, options);\n },\n /** Review a code snippet or diff for correctness and quality (frontier; writes `review`). */\n codeReviewer(options: PrebuiltOptions = {}): CompiledGraph {\n return buildAgentGraph(DEFS.codeReviewer!, options);\n },\n /** Polish prose for clarity, grammar, flow, and tone (creative; writes `edited`). */\n copyEditor(options: PrebuiltOptions = {}): CompiledGraph {\n return buildAgentGraph(DEFS.copyEditor!, options);\n }\n} as const;\n","/**\n * Real text embeddings as an exported SDK helper (NOT a catalog component kind).\n *\n * {@link createEmbeddings} returns an {@link Embeddings} whose `embed` turns a batch of\n * texts into dense vectors. The default transport POSTs to the provider's embeddings API\n * (`/embeddings` with `{ model, input }` and a `Bearer` key), parsing `data[].embedding` —\n * both Mistral and OpenAI's embeddings APIs share this exact response shape, so ONE parser\n * and ONE transport builder serve both. The {@link CreateEmbeddingsOptions.transport} hook\n * overrides the network call so a test can return deterministic vectors with no real\n * network. This is the embedding backbone behind\n * {@link import(\"./semantic-retriever.js\").semanticRetriever}.\n *\n * ```ts\n * import { createEmbeddings } from \"@ailu-ai/graph-sdk\";\n *\n * const embeddings = createEmbeddings({ apiKey: process.env.MISTRAL_API_KEY });\n * const [a, b] = await embeddings.embed([\"hello\", \"world\"]);\n *\n * // A second provider (issue #541 — product-side gap: only one provider was ever wired):\n * const openai = createEmbeddings({ provider: \"openai\", apiKey: process.env.OPENAI_API_KEY });\n * ```\n */\n\n/** An embedder: turn a batch of texts into one dense vector each (order-preserving). */\nexport type Embeddings = {\n /** Embed `texts` into a `number[][]` of the same length and order. */\n embed(texts: string[]): Promise<number[][]>;\n};\n\n/**\n * The transport an embeddings client posts through: it receives the assembled request\n * body and must resolve to the parsed JSON response (the `{ data: [{ embedding }] }`\n * shape both Mistral's and OpenAI's embeddings APIs return). The real default builds this\n * from `fetch`; a test injects a fake to stay offline.\n */\nexport type EmbeddingsTransport = (body: EmbeddingsRequestBody) => Promise<unknown> | unknown;\n\n/** The request body POSTed to the embeddings endpoint (`{ model, input }`). `dimensions` is\n * OpenAI-specific (its `text-embedding-3-*` models support down-projecting via this field);\n * omitted from the body entirely when not set, so it's a no-op for a provider that ignores it. */\nexport type EmbeddingsRequestBody = {\n model: string;\n input: string[];\n dimensions?: number;\n};\n\n/** The embeddings providers `createEmbeddings` knows how to reach directly. */\nexport type EmbeddingsProvider = \"mistral\" | \"openai\";\n\ntype ProviderDefaults = { model: string; baseUrl: string; envVar: string };\n\nconst PROVIDER_DEFAULTS: Record<EmbeddingsProvider, ProviderDefaults> = {\n mistral: { model: \"mistral-embed\", baseUrl: \"https://api.mistral.ai/v1\", envVar: \"MISTRAL_API_KEY\" },\n openai: {\n model: \"text-embedding-3-small\",\n baseUrl: \"https://api.openai.com/v1\",\n envVar: \"OPENAI_API_KEY\"\n }\n};\n\n/** Options for {@link createEmbeddings}. */\nexport type CreateEmbeddingsOptions = {\n /** The embeddings provider. Defaults to `\"mistral\"` (unchanged from before this option existed). */\n provider?: EmbeddingsProvider;\n /** API key. Defaults to `process.env.MISTRAL_API_KEY`/`OPENAI_API_KEY` per `provider`. Required\n * unless `transport` is injected. */\n apiKey?: string;\n /** Embedding model. Defaults to the provider's own default (`mistral-embed` / `text-embedding-3-small`). */\n model?: string;\n /** API base URL. Defaults to the provider's own default. */\n baseUrl?: string;\n /** Down-project the output vectors to this many dimensions (OpenAI `text-embedding-3-*` only —\n * a provider that doesn't support it silently ignores an unset field, never sent unless set). */\n dimensions?: number;\n /**\n * An injectable transport overriding the default `fetch`-based call. Receives the\n * request body and returns the parsed JSON response. Inject a fake to keep a test\n * offline (or to point at a stub) — when set, no API key is required.\n */\n transport?: EmbeddingsTransport;\n};\n\n/** Raised when no API key and no transport were supplied, so a real call is impossible. */\nexport class MissingEmbeddingsKeyError extends Error {\n public constructor(provider: EmbeddingsProvider = \"mistral\", envVar: string = \"MISTRAL_API_KEY\") {\n super(\n `createEmbeddings: no API key (set \\`apiKey\\` or ${envVar}) and no \\`transport\\` injected for ` +\n `provider \"${provider}\"; supply one to make a real call, or inject \\`transport\\` for offline use.`\n );\n this.name = \"MissingEmbeddingsKeyError\";\n }\n}\n\n/** Raised when the embeddings response doesn't carry the expected `data[].embedding` shape. */\nexport class EmbeddingsResponseError extends Error {\n public constructor(detail: string) {\n super(`createEmbeddings: malformed embeddings response: ${detail}`);\n this.name = \"EmbeddingsResponseError\";\n }\n}\n\n/**\n * Parse a `{ data: [{ embedding: number[] }, …] }` response into a `number[][]`,\n * preserving order. Throws an {@link EmbeddingsResponseError} when the shape is wrong.\n */\nconst parseEmbeddingsResponse = (parsed: unknown): number[][] => {\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new EmbeddingsResponseError(\"response is not an object\");\n }\n const data = (parsed as { data?: unknown }).data;\n if (!Array.isArray(data)) {\n throw new EmbeddingsResponseError(\"`data` is not an array\");\n }\n return data.map((entry, index) => {\n const embedding =\n typeof entry === \"object\" && entry !== null\n ? (entry as { embedding?: unknown }).embedding\n : undefined;\n if (!Array.isArray(embedding) || !embedding.every((n) => typeof n === \"number\")) {\n throw new EmbeddingsResponseError(`\\`data[${index}].embedding\\` is not a number[]`);\n }\n return embedding as number[];\n });\n};\n\n/**\n * The default `fetch`-based transport: POST `{ model, input, dimensions? }` to\n * `{baseUrl}/embeddings` with an `Authorization: Bearer <key>` header, returning the\n * parsed JSON. Identical wire shape for Mistral and OpenAI (both accept/return the same\n * `{model, input}` request / `{data: [{embedding}]}` response — `dimensions` is simply\n * unknown-and-ignored by a provider that doesn't support it). Throws on a non-2xx status.\n * Only built when no `transport` is injected.\n */\nconst createBearerJsonTransport =\n (apiKey: string, baseUrl: string): EmbeddingsTransport =>\n async (body) => {\n const response = await globalThis.fetch(`${baseUrl}/embeddings`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${apiKey}`\n },\n body: JSON.stringify(body)\n });\n const text = await response.text();\n if (!response.ok) {\n throw new EmbeddingsResponseError(`status ${response.status}: ${text}`);\n }\n return JSON.parse(text) as unknown;\n };\n\n/**\n * Create an {@link Embeddings} client for `options.provider` (defaults to `\"mistral\"`,\n * unchanged from before this option existed). With the default transport it POSTs to the\n * provider's own base URL with `{ model, input: texts, dimensions? }` and `Authorization:\n * Bearer (apiKey || process.env[<provider's env var>])`, parsing `data[].embedding` (the\n * same response shape for both wired providers). Inject `transport` to override that for\n * offline tests. Throws {@link MissingEmbeddingsKeyError} when neither a key nor a\n * transport is available.\n */\nexport const createEmbeddings = (options: CreateEmbeddingsOptions = {}): Embeddings => {\n const provider = options.provider ?? \"mistral\";\n const defaults = PROVIDER_DEFAULTS[provider];\n const model = options.model ?? defaults.model;\n const baseUrl = options.baseUrl ?? defaults.baseUrl;\n const dimensions = options.dimensions;\n\n let transport: EmbeddingsTransport;\n if (options.transport !== undefined) {\n transport = options.transport;\n } else {\n const apiKey = options.apiKey ?? process.env[defaults.envVar];\n if (apiKey === undefined || apiKey.length === 0) {\n throw new MissingEmbeddingsKeyError(provider, defaults.envVar);\n }\n transport = createBearerJsonTransport(apiKey, baseUrl);\n }\n\n return {\n async embed(texts) {\n if (texts.length === 0) {\n return [];\n }\n const parsed = await transport({\n model,\n input: texts,\n ...(dimensions !== undefined ? { dimensions } : {})\n });\n return parseEmbeddingsResponse(parsed);\n }\n };\n};\n","/**\n * A small embedding-backed vector store as an exported SDK helper (NOT a catalog\n * component kind). {@link createVectorStore} keeps `{ id, content, embedding, metadata? }`\n * items and answers nearest-neighbour {@link VectorStore.query} calls by cosine\n * similarity (descending). In-memory by default; when `persistPath` is set the store is\n * persisted to / loaded from a round-trippable JSON file (synchronous `fs`). The exported\n * {@link cosineSimilarity} powers the ranking and is reusable on its own.\n *\n * ```ts\n * import { createVectorStore } from \"@ailu-ai/graph-sdk\";\n *\n * const store = createVectorStore();\n * store.upsert([{ id: \"a\", content: \"hello\", embedding: [1, 0] }]);\n * const hits = store.query([1, 0], 1); // [{ id: \"a\", content: \"hello\", score: 1 }]\n * ```\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\n/** An item stored in the vector store: an id, its text, its embedding and optional metadata. */\nexport type VectorStoreItem = {\n id: string;\n content: string;\n embedding: number[];\n metadata?: Record<string, unknown>;\n};\n\n/** A single nearest-neighbour result: the item (minus its embedding) plus a cosine score. */\nexport type VectorStoreMatch = {\n id: string;\n content: string;\n score: number;\n metadata?: Record<string, unknown>;\n};\n\n/** The vector store surface returned by {@link createVectorStore}. */\nexport type VectorStore = {\n /** Insert or replace items by `id` (last write wins); persists when `persistPath` is set. */\n upsert(items: VectorStoreItem[]): void;\n /** Return the top-`k` items by cosine similarity to `embedding`, highest score first. */\n query(embedding: number[], k: number): VectorStoreMatch[];\n /** The number of items currently held. */\n size(): number;\n};\n\n/** Options for {@link createVectorStore}. */\nexport type CreateVectorStoreOptions = {\n /**\n * When set, the store loads its items from this JSON file on creation (if present) and\n * rewrites it on every {@link VectorStore.upsert}. The file is a round-trippable JSON\n * array of {@link VectorStoreItem}. Omit for a purely in-memory store.\n */\n persistPath?: string;\n};\n\n/**\n * Cosine similarity of two vectors. Compares over the shorter length (missing\n * components count as 0) and returns `0` when either vector has zero magnitude, so a\n * degenerate input never produces `NaN`.\n */\nexport const cosineSimilarity = (a: number[], b: number[]): number => {\n const len = Math.min(a.length, b.length);\n let dot = 0;\n let normA = 0;\n let normB = 0;\n for (let i = 0; i < len; i += 1) {\n const av = a[i] ?? 0;\n const bv = b[i] ?? 0;\n dot += av * bv;\n normA += av * av;\n normB += bv * bv;\n }\n // Account for the magnitude of any tail components beyond the common prefix so two\n // different-length vectors still differ in norm.\n for (let i = len; i < a.length; i += 1) {\n const av = a[i] ?? 0;\n normA += av * av;\n }\n for (let i = len; i < b.length; i += 1) {\n const bv = b[i] ?? 0;\n normB += bv * bv;\n }\n if (normA === 0 || normB === 0) {\n return 0;\n }\n return dot / (Math.sqrt(normA) * Math.sqrt(normB));\n};\n\n/** Validate one parsed JSON entry into a {@link VectorStoreItem}, or `undefined` if malformed. */\nconst coerceItem = (raw: unknown): VectorStoreItem | undefined => {\n if (typeof raw !== \"object\" || raw === null) {\n return undefined;\n }\n const obj = raw as Record<string, unknown>;\n if (typeof obj.id !== \"string\" || typeof obj.content !== \"string\") {\n return undefined;\n }\n if (!Array.isArray(obj.embedding) || !obj.embedding.every((n) => typeof n === \"number\")) {\n return undefined;\n }\n const item: VectorStoreItem = {\n id: obj.id,\n content: obj.content,\n embedding: obj.embedding as number[]\n };\n if (typeof obj.metadata === \"object\" && obj.metadata !== null && !Array.isArray(obj.metadata)) {\n item.metadata = obj.metadata as Record<string, unknown>;\n }\n return item;\n};\n\n/** Load persisted items from `path` (returns `[]` when the file is absent or unparseable). */\nconst loadItems = (path: string): VectorStoreItem[] => {\n if (!existsSync(path)) {\n return [];\n }\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf8\")) as unknown;\n if (!Array.isArray(parsed)) {\n return [];\n }\n const items: VectorStoreItem[] = [];\n for (const raw of parsed) {\n const item = coerceItem(raw);\n if (item !== undefined) {\n items.push(item);\n }\n }\n return items;\n } catch {\n return [];\n }\n};\n\n/** Persist `items` to `path` as a JSON array, creating the parent directory if needed. */\nconst persistItems = (path: string, items: VectorStoreItem[]): void => {\n const dir = dirname(path);\n if (dir.length > 0 && !existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, JSON.stringify(items), \"utf8\");\n};\n\n/**\n * Create a {@link VectorStore}. In-memory by default; with `persistPath` it loads any\n * existing JSON file on creation and rewrites it on every upsert (round-trippable).\n */\nexport const createVectorStore = (options: CreateVectorStoreOptions = {}): VectorStore => {\n const persistPath = options.persistPath;\n // Keyed by id so upsert is last-write-wins; a Map preserves first-seen order for ties.\n const items = new Map<string, VectorStoreItem>();\n if (persistPath !== undefined) {\n for (const item of loadItems(persistPath)) {\n items.set(item.id, item);\n }\n }\n\n const flush = (): void => {\n if (persistPath !== undefined) {\n persistItems(persistPath, [...items.values()]);\n }\n };\n\n return {\n upsert(incoming) {\n for (const item of incoming) {\n // Defensively copy the embedding so a later mutation of the caller's array\n // can't perturb stored vectors.\n const stored: VectorStoreItem = {\n id: item.id,\n content: item.content,\n embedding: [...item.embedding]\n };\n if (item.metadata !== undefined) {\n stored.metadata = item.metadata;\n }\n items.set(item.id, stored);\n }\n flush();\n },\n query(embedding, k) {\n const scored = [...items.values()].map((item, index) => ({\n item,\n index,\n score: cosineSimilarity(embedding, item.embedding)\n }));\n // Descending by score; stable so insertion order breaks ties deterministically.\n scored.sort((a, b) => (b.score - a.score === 0 ? a.index - b.index : b.score - a.score));\n return scored.slice(0, Math.max(0, k)).map(({ item, score }) => {\n const match: VectorStoreMatch = { id: item.id, content: item.content, score };\n if (item.metadata !== undefined) {\n match.metadata = item.metadata;\n }\n return match;\n });\n },\n size() {\n return items.size;\n }\n };\n};\n","/**\n * A semantic (vector-store) retrieval connector as an exported SDK helper — the \"real\n * embeddings\" sibling of the deterministic mock `components.retriever`. It is NOT a new\n * catalog component kind: {@link semanticRetriever} returns a plain {@link NodeHandler}\n * added with {@link import(\"./builder.js\").GraphBuilder.node} (the same vendor-I/O shape\n * as `components.httpFetch` / `components.webSearch`), so on the Rust engine it runs over\n * the async JS seam (`on_node`) like any other JS node.\n *\n * On each run it (optionally) embeds `docs` into the {@link VectorStore}, embeds the\n * query, then writes the top-`k` `{ id, content, score }` matches to the `into` channel.\n * `embeddings` defaults to a real Mistral client ({@link createEmbeddings}); inject a\n * fake {@link Embeddings} to keep a test offline and deterministic.\n *\n * ```ts\n * import { createGraph, semanticRetriever } from \"@ailu-ai/graph-sdk\";\n *\n * createGraph({ name: \"semantic\" })\n * .channel(\"q\", { type: \"string\", default: \"\" })\n * .channel(\"hits\", { type: \"json\", default: [] })\n * .node(\"retrieve\", semanticRetriever({\n * queryFrom: \"q\",\n * into: \"hits\",\n * k: 3,\n * docs: [{ id: \"d1\", content: \"Ailu is a graph runtime.\" }],\n * embeddings: fakeEmbeddings // deterministic in tests\n * }));\n * ```\n */\n\nimport type { NodeHandler } from \"@ailu-ai/graph-runtime\";\n\nimport { createEmbeddings, type Embeddings } from \"./embeddings.js\";\nimport { createVectorStore, type VectorStore, type VectorStoreMatch } from \"./vector-store.js\";\n\n/** A candidate document to embed into the store before querying. */\nexport type SemanticRetrieverDoc = { id: string; content: string };\n\n/** Params for {@link semanticRetriever}. */\nexport type SemanticRetrieverParams = {\n /** A literal query (mutually exclusive with `queryFrom`). */\n query?: string;\n /** A channel whose value supplies the query (takes precedence when its channel is set). */\n queryFrom?: string;\n /** Channel receiving the top-`k` `{ id, content, score }` array. */\n into: string;\n /** Number of results to keep. Defaults to 4. */\n k?: number;\n /**\n * Documents to embed into the store before querying. Each run embeds and upserts these\n * (idempotent by id). Omit to query against an already-populated injected `store`.\n */\n docs?: SemanticRetrieverDoc[];\n /**\n * The vector store to upsert into / query. Defaults to a fresh in-memory store created\n * per factory call. Inject a shared/persistent store to reuse embeddings across runs.\n */\n store?: VectorStore;\n /**\n * The embeddings client. Defaults to a real Mistral client ({@link createEmbeddings}).\n * Inject a fake (deterministic vectors) to keep a test offline.\n */\n embeddings?: Embeddings;\n};\n\n/**\n * Coerce a channel value to text the way the rest of the SDK does: strings pass through,\n * `null`/`undefined` become the empty string, everything else is compact JSON.\n */\nconst valueToText = (value: unknown): string => {\n if (typeof value === \"string\") {\n return value;\n }\n if (value === null || value === undefined) {\n return \"\";\n }\n return JSON.stringify(value);\n};\n\nconst channelsOf = (state: { channels: unknown }): Record<string, unknown> =>\n (state.channels ?? {}) as Record<string, unknown>;\n\n/**\n * Build the semantic-retriever node handler. Each invocation embeds any supplied `docs`\n * into the store, embeds the resolved query, and writes the top-`k`\n * {@link VectorStoreMatch} array (`{ id, content, score }`) to `into`. Throws no special\n * error class — it surfaces the underlying embeddings error if the real client can't run\n * (no key / no transport), which is the honest failure mode for a real connector.\n */\nexport const semanticRetriever = (params: SemanticRetrieverParams): NodeHandler => {\n // Default the store/embeddings once at factory time so repeated runs of the same node\n // reuse the same in-memory store (embeddings are upserted idempotently by id).\n const store = params.store ?? createVectorStore();\n const embeddings = params.embeddings ?? createEmbeddings();\n\n return async (_input, state) => {\n const channels = channelsOf(state);\n const fromChannel =\n params.queryFrom !== undefined && params.queryFrom in channels\n ? valueToText(channels[params.queryFrom])\n : \"\";\n const query = fromChannel.length > 0 ? fromChannel : (params.query ?? \"\");\n const k = params.k ?? 4;\n\n const docs = params.docs ?? [];\n if (docs.length > 0) {\n const vectors = await embeddings.embed(docs.map((doc) => doc.content));\n store.upsert(\n docs.map((doc, index) => ({\n id: doc.id,\n content: doc.content,\n embedding: vectors[index] ?? []\n }))\n );\n }\n\n const [queryVector] = await embeddings.embed([query]);\n const matches: VectorStoreMatch[] =\n queryVector === undefined ? [] : store.query(queryVector, k);\n // Project to the public `{ id, content, score }` shape (drop metadata for the channel).\n const results = matches.map((match) => ({ id: match.id, content: match.content, score: match.score }));\n return { [params.into]: results };\n };\n};\n","/**\n * The static catalog metadata that backs the API's `/catalog` endpoint: one entry per\n * component, prebuilt agent and capability tier. This is the SDK's source of truth for\n * the building-block library; the API validates these arrays against the\n * `@ailu-ai/contracts` catalog DTOs and forwards them to Studio unchanged.\n *\n * The arrays mirror, one-for-one:\n * - the 30 component factories in {@link import(\"./components.js\").components} (28 pure\n * Rust-backed components + 2 vendor-I/O integration components), with their real\n * factory params;\n * - the 16 prebuilt micro-agent definitions (the Rust `PrebuiltAgent` table);\n * - the 4 capability tiers, each carrying the {@link DEFAULT_TIER_TABLE} per-provider\n * recommended models.\n *\n * The shapes are deliberately plain data (no closures) so they map 1:1 onto the\n * contracts DTOs and serialize over the wire as-is.\n */\n\nimport { DEFAULT_TIER_TABLE, MODEL_TIERS, type ModelTier } from \"@ailu-ai/llm-gateway\";\n\nimport type { ComponentKind } from \"./components.js\";\n\n/** The category buckets a component falls into in the library. */\nexport type ComponentCategory =\n | \"prompt\"\n | \"validation\"\n | \"parsing\"\n | \"routing\"\n | \"retrieval\"\n | \"text\"\n | \"data\"\n | \"integration\"\n // --- wave two: Haystack-gap categories ---\n | \"splitter\"\n | \"generation\"\n | \"evaluation\"\n | \"writer\";\n\n/** A single parameter a component factory accepts. */\nexport type ComponentParamMeta = {\n name: string;\n type: string;\n required: boolean;\n description: string;\n};\n\n/** One entry in the component library: a `kind` plus its presentation + params. */\nexport type ComponentCatalogEntry = {\n /** The component kind — a {@link ComponentKind} for pure components, or an integration name. */\n kind: ComponentKind | \"httpFetch\" | \"webSearch\";\n title: string;\n category: ComponentCategory;\n description: string;\n params: ComponentParamMeta[];\n /** `true` for the vendor-I/O integration components (httpFetch / webSearch). */\n integration: boolean;\n};\n\n/** One entry in the prebuilt-agent catalog, mirroring the Rust `PrebuiltAgent` table. */\nexport type PrebuiltAgentCatalogEntry = {\n name: string;\n title: string;\n description: string;\n tier: ModelTier;\n tools: string[];\n suspendForApproval: boolean;\n outputChannel: string;\n};\n\n/** Describes one capability tier plus its recommended per-provider models. */\nexport type ModelTierInfo = {\n tier: ModelTier;\n description: string;\n /** `provider -> model` recommended defaults for this tier. */\n models: Record<string, string>;\n};\n\n/**\n * The 30 component catalog entries: 28 pure Rust-backed components (whose `kind`\n * matches {@link ComponentKind} / `ComponentRegistry::kinds()`) plus 2 vendor-I/O\n * integration components. Params mirror the real factory `*Params` types in\n * `./components.ts`.\n */\nexport const componentCatalog: readonly ComponentCatalogEntry[] = [\n {\n kind: \"promptBuilder\",\n title: \"Prompt Builder\",\n category: \"prompt\",\n description: \"Render every {{var}} placeholder from the channels into a target channel.\",\n params: [\n { name: \"template\", type: \"string\", required: true, description: \"Template with {{var}} placeholders filled from the channels.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel the rendered string is written into.\" }\n ],\n integration: false\n },\n {\n kind: \"jsonValidator\",\n title: \"JSON Validator\",\n category: \"validation\",\n description: \"Validate a channel value's type and required keys, writing an ok flag and an errors list.\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel whose value is validated.\" },\n { name: \"requiredKeys\", type: \"string[]\", required: false, description: \"Required object keys to assert present.\" },\n { name: \"expectType\", type: '\"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"null\"', required: false, description: \"Expected JSON type.\" },\n { name: \"okInto\", type: \"string\", required: true, description: \"Channel receiving the boolean validity flag.\" },\n { name: \"errorsInto\", type: \"string\", required: true, description: \"Channel receiving the string[] of validation errors.\" }\n ],\n integration: false\n },\n {\n kind: \"outputParser\",\n title: \"Output Parser\",\n category: \"parsing\",\n description: \"Extract the first balanced JSON object or array from a text channel.\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Text channel to extract the first JSON value from.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the parsed value (or null when none is found).\" }\n ],\n integration: false\n },\n {\n kind: \"router\",\n title: \"Router\",\n category: \"routing\",\n description: \"Pick a route string from a channel value by ordered match rules (pairs with a conditional edge).\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel whose value is matched against the rules.\" },\n { name: \"rules\", type: \"RouterRule[]\", required: true, description: \"Ordered rules ({ equals?, contains?, route }); the first match wins.\" },\n { name: \"defaultRoute\", type: \"string\", required: true, description: \"Route emitted when no rule matches.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel the chosen route string is written into.\" }\n ],\n integration: false\n },\n {\n kind: \"retriever\",\n title: \"Retriever\",\n category: \"retrieval\",\n description: \"Score candidate documents against a query and keep the top-k by similarity.\",\n params: [\n { name: \"query\", type: \"string\", required: true, description: \"Channel holding the query text (falls back to this literal when the channel is empty).\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the top-k { id, content, score } array.\" },\n { name: \"k\", type: \"number\", required: false, description: \"Number of results to keep (default 4).\" },\n { name: \"docs\", type: \"RetrieverDoc[]\", required: true, description: \"The corpus ({ id, content }[]) to score against.\" }\n ],\n integration: false\n },\n {\n kind: \"reranker\",\n title: \"Reranker\",\n category: \"retrieval\",\n description: \"Reorder a retrieval-result array, optionally re-scoring against a query embedding.\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel holding the retrieval-result array to reorder.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the reordered array.\" },\n { name: \"query\", type: \"string\", required: false, description: \"Optional channel holding query text for embedding-based re-scoring.\" }\n ],\n integration: false\n },\n {\n kind: \"textCleaner\",\n title: \"Text Cleaner\",\n category: \"text\",\n description: \"Normalise a text channel: strip HTML, lowercase, collapse whitespace, trim.\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel whose text is normalised.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the cleaned text.\" },\n { name: \"lowercase\", type: \"boolean\", required: false, description: \"Lowercase the text. Defaults to false.\" },\n { name: \"stripHtml\", type: \"boolean\", required: false, description: \"Strip <...> HTML tags. Defaults to false.\" },\n { name: \"collapseWhitespace\", type: \"boolean\", required: false, description: \"Collapse runs of whitespace to a single space. Defaults to false.\" },\n { name: \"trim\", type: \"boolean\", required: false, description: \"Trim leading/trailing whitespace. Defaults to false.\" }\n ],\n integration: false\n },\n {\n kind: \"documentSplitter\",\n title: \"Document Splitter\",\n category: \"text\",\n description: \"Split a text channel into an array of chunk strings by chars or sentences.\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel holding the text to split.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the string[] of chunks.\" },\n { name: \"by\", type: '\"chars\" | \"sentences\"', required: true, description: \"Split unit: sliding char windows or greedy sentence packing.\" },\n { name: \"size\", type: \"number\", required: true, description: \"Window size in chars or sentences. Must be > 0.\" },\n { name: \"overlap\", type: \"number\", required: false, description: \"Overlap repeated at the start of each next chunk. Defaults to 0.\" }\n ],\n integration: false\n },\n {\n kind: \"htmlToText\",\n title: \"HTML to Text\",\n category: \"text\",\n description: \"Strip HTML tags from a text channel and decode the common named entities.\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel holding the HTML text.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the tag-stripped, entity-decoded text.\" }\n ],\n integration: false\n },\n {\n kind: \"csvParser\",\n title: \"CSV Parser\",\n category: \"parsing\",\n description: \"Parse a CSV text channel into an array of row objects (or arrays).\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel holding the CSV text.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the parsed rows array.\" },\n { name: \"delimiter\", type: \"string\", required: false, description: 'Single-character cell delimiter. Defaults to \",\".' },\n { name: \"header\", type: \"boolean\", required: false, description: \"When true (default) the first row supplies object keys; otherwise rows are arrays.\" }\n ],\n integration: false\n },\n {\n kind: \"documentJoiner\",\n title: \"Document Joiner\",\n category: \"data\",\n description: \"Concatenate the array values across several channels into one merged array.\",\n params: [\n { name: \"fromChannels\", type: \"string[]\", required: true, description: \"Channels whose array values are concatenated in order.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the merged array.\" },\n { name: \"dedupeBy\", type: \"string\", required: false, description: \"Optional object field to de-duplicate the merged items by.\" }\n ],\n integration: false\n },\n {\n kind: \"deduplicator\",\n title: \"Deduplicator\",\n category: \"data\",\n description: \"De-duplicate an array channel, keeping the first occurrence and preserving order.\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel holding the array to de-duplicate.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the de-duplicated array.\" },\n { name: \"key\", type: \"string\", required: false, description: \"Optional object field to compare items by (else whole-value compare).\" }\n ],\n integration: false\n },\n {\n kind: \"truncator\",\n title: \"Truncator\",\n category: \"text\",\n description: \"Truncate a text channel to at most maxChars characters with an ellipsis.\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel holding the text to truncate.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the (possibly truncated) text.\" },\n { name: \"maxChars\", type: \"number\", required: true, description: \"Maximum character length (the ellipsis counts against this budget).\" },\n { name: \"ellipsis\", type: \"string\", required: false, description: 'Suffix appended when truncated. Defaults to \"…\".' }\n ],\n integration: false\n },\n {\n kind: \"regexExtractor\",\n title: \"Regex Extractor\",\n category: \"parsing\",\n description: \"Extract literal-pattern matches (with ^/$ anchors) from a text channel.\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel holding the text to match against.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the match (or matches when all).\" },\n { name: \"pattern\", type: \"string\", required: true, description: \"Literal-substring pattern with optional leading ^ and trailing $ anchors.\" },\n { name: \"group\", type: \"number\", required: false, description: \"Accepted for forward-compat; only 0 (the whole match) is supported. Defaults to 0.\" },\n { name: \"all\", type: \"boolean\", required: false, description: \"When true, return every non-overlapping occurrence as an array. Defaults to false.\" }\n ],\n integration: false\n },\n {\n kind: \"answerBuilder\",\n title: \"Answer Builder\",\n category: \"text\",\n description: \"Assemble a final answer string, optionally appending numbered citations.\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel supplying the core answer text.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the assembled answer.\" },\n { name: \"contextFrom\", type: \"string\", required: false, description: \"Optional channel holding a retrieval-result array rendered as numbered citations.\" },\n { name: \"template\", type: \"string\", required: false, description: \"Optional {{answer}}/{{citations}} template controlling the layout.\" }\n ],\n integration: false\n },\n {\n kind: \"fieldMapper\",\n title: \"Field Mapper\",\n category: \"data\",\n description: \"Remap an object channel's fields (by dotted path) into a new object.\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel holding the source object.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the remapped object.\" },\n { name: \"mapping\", type: \"Record<string, string>\", required: true, description: \"{ outKey: inKeyPath } map; inKeyPath is a dotted path into the source.\" }\n ],\n integration: false\n },\n {\n kind: \"fieldExtractor\",\n title: \"Field Extractor\",\n category: \"data\",\n description: \"Extract a scalar from a channel: follow an optional dotted path, and (finalOnly) reduce an agent reasoning trace to the text after the last \\\"final:\\\" marker.\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel holding the source value.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the extracted scalar.\" },\n { name: \"path\", type: \"string\", required: false, description: \"Optional dotted path descended into the from value (else the whole value).\" },\n { name: \"finalOnly\", type: \"boolean\", required: false, description: \"When true, if the result is a string with a \\\"final:\\\" marker, keep only the text after the last marker (trimmed). Defaults to false.\" }\n ],\n integration: false\n },\n {\n kind: \"bm25Retriever\",\n title: \"BM25 Retriever\",\n category: \"retrieval\",\n description: \"Lexical BM25 ranking of a corpus against a query; keep the top-k by score.\",\n params: [\n { name: \"query\", type: \"string\", required: true, description: \"Channel holding the query text (falls back to this literal when the channel is empty).\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the top-k { id, content, score } array.\" },\n { name: \"k\", type: \"number\", required: false, description: \"Number of results to keep (default 4).\" },\n { name: \"docs\", type: \"LexicalDoc[]\", required: true, description: \"The corpus ({ id, content }[]) to rank.\" },\n { name: \"k1\", type: \"number\", required: false, description: \"BM25 term-frequency saturation. Defaults to 1.2.\" },\n { name: \"b\", type: \"number\", required: false, description: \"BM25 length-normalization. Defaults to 0.75.\" }\n ],\n integration: false\n },\n {\n kind: \"keywordRetriever\",\n title: \"Keyword Retriever\",\n category: \"retrieval\",\n description: \"Lexical keyword-overlap ranking: score each doc by the fraction of distinct query terms it contains.\",\n params: [\n { name: \"query\", type: \"string\", required: true, description: \"Channel holding the query text (falls back to this literal when the channel is empty).\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the top-k { id, content, score } array.\" },\n { name: \"k\", type: \"number\", required: false, description: \"Number of results to keep (default 4).\" },\n { name: \"docs\", type: \"LexicalDoc[]\", required: true, description: \"The corpus ({ id, content }[]) to rank.\" }\n ],\n integration: false\n },\n {\n kind: \"sentenceWindowSplitter\",\n title: \"Sentence Window Splitter\",\n category: \"splitter\",\n description: \"Split text into overlapping windows of whole sentences (a sliding window with an explicit stride).\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel holding the text to split.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the string[] of sentence windows.\" },\n { name: \"windowSize\", type: \"number\", required: false, description: \"Sentences per window. Defaults to 3.\" },\n { name: \"stride\", type: \"number\", required: false, description: \"Sentences advanced between windows (1 <= stride <= windowSize). Defaults to 1.\" }\n ],\n integration: false\n },\n {\n kind: \"languageDetector\",\n title: \"Language Detector\",\n category: \"text\",\n description: \"Heuristic language detection (en/fr/es/de/it/und) by stop-word hits, with an optional confidence score.\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel holding the text to classify.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the detected language code (or \\\"und\\\").\" },\n { name: \"confidenceInto\", type: \"string\", required: false, description: \"Optional channel receiving the winning language's share of hits in [0, 1].\" }\n ],\n integration: false\n },\n {\n kind: \"metadataFilter\",\n title: \"Metadata Filter\",\n category: \"data\",\n description: \"Keep the items of an array channel whose dotted-path field satisfies a predicate.\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel holding the array to filter.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the filtered array.\" },\n { name: \"field\", type: \"string\", required: true, description: \"Dotted path into each item compared by the predicate.\" },\n { name: \"op\", type: '\"equals\" | \"notEquals\" | \"contains\" | \"exists\" | \"absent\" | \"gt\" | \"gte\" | \"lt\" | \"lte\"', required: true, description: \"The predicate operator.\" },\n { name: \"value\", type: \"unknown\", required: false, description: \"The comparison value (required except for exists/absent).\" }\n ],\n integration: false\n },\n {\n kind: \"listJoiner\",\n title: \"List Joiner\",\n category: \"data\",\n description: \"Combine several array channels into one list by concat, union (dedupe) or interleave.\",\n params: [\n { name: \"fromChannels\", type: \"string[]\", required: true, description: \"Channels whose array values are combined.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the combined array.\" },\n { name: \"mode\", type: '\"concat\" | \"union\" | \"interleave\"', required: false, description: 'Combine mode. Defaults to \"concat\".' }\n ],\n integration: false\n },\n {\n kind: \"mergeRanker\",\n title: \"Merge Ranker\",\n category: \"retrieval\",\n description: \"Fuse several retrieval-result streams into one ranking with Reciprocal Rank Fusion (RRF).\",\n params: [\n { name: \"fromChannels\", type: \"string[]\", required: true, description: \"Channels each holding a retrieval-result array to fuse.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the fused { id, content, score } array.\" },\n { name: \"idKey\", type: \"string\", required: false, description: 'Object field identifying items across lists. Defaults to \"id\".' },\n { name: \"k\", type: \"number\", required: false, description: \"Keep only the top-k fused results (default: keep all).\" },\n { name: \"rrfK\", type: \"number\", required: false, description: \"Reciprocal Rank Fusion constant. Defaults to 60.\" }\n ],\n integration: false\n },\n {\n kind: \"evaluator\",\n title: \"Evaluator\",\n category: \"evaluation\",\n description: \"Score actual vs expected text (token-F1 / set overlap / exact match), with an optional pass flag.\",\n params: [\n { name: \"expectedFrom\", type: \"string\", required: true, description: \"Channel holding the expected/reference text.\" },\n { name: \"actualFrom\", type: \"string\", required: true, description: \"Channel holding the actual/candidate text.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the numeric score in [0, 1].\" },\n { name: \"metric\", type: '\"tokenF1\" | \"overlap\" | \"exact\"', required: false, description: 'Scoring metric. Defaults to \"tokenF1\".' },\n { name: \"passInto\", type: \"string\", required: false, description: \"Optional channel receiving a boolean score >= threshold.\" },\n { name: \"threshold\", type: \"number\", required: false, description: \"Pass threshold for passInto. Defaults to 0.5.\" }\n ],\n integration: false\n },\n {\n kind: \"chatMessageBuilder\",\n title: \"Chat Message Builder\",\n category: \"generation\",\n description: \"Assemble a role-tagged chat-message array ([{ role, content }]) an LLM generator consumes.\",\n params: [\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the [{ role, content }] array.\" },\n { name: \"messages\", type: \"ChatMessageSpec[]\", required: true, description: \"Ordered specs ({ role, content?|contentFrom? }); content is rendered through the {{var}} template engine.\" },\n { name: \"systemFrom\", type: \"string\", required: false, description: \"Optional channel prepended as a leading system message when non-empty.\" }\n ],\n integration: false\n },\n {\n kind: \"conditionalRouter\",\n title: \"Conditional Router\",\n category: \"routing\",\n description: \"Multi-branch rule routing over the channels by dotted-path predicates (pairs with a conditional edge).\",\n params: [\n { name: \"into\", type: \"string\", required: true, description: \"Channel the chosen route string is written into.\" },\n { name: \"defaultRoute\", type: \"string\", required: true, description: \"Route emitted when no branch matches.\" },\n { name: \"branches\", type: \"ConditionalRouterBranch[]\", required: true, description: \"Ordered branches ({ when: { field, op, value? }, route }); the first match wins.\" }\n ],\n integration: false\n },\n {\n kind: \"documentWriter\",\n title: \"Document Writer\",\n category: \"writer\",\n description: \"Append documents into an in-state document store array (optionally de-duplicating by a field).\",\n params: [\n { name: \"from\", type: \"string\", required: true, description: \"Channel holding the incoming documents array to append.\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the accumulated store array.\" },\n { name: \"store\", type: \"string\", required: false, description: \"Channel holding the current store. Defaults to into.\" },\n { name: \"dedupeBy\", type: \"string\", required: false, description: \"Optional object field to de-duplicate the merged store by.\" }\n ],\n integration: false\n },\n {\n kind: \"httpFetch\",\n title: \"HTTP Fetch\",\n category: \"integration\",\n description:\n \"Integration (vendor I/O): perform a real HTTP request via global fetch, writing { status, ok, body, json }. Never throws — non-2xx is surfaced via status/ok; an error/timeout writes { ok: false, error }.\",\n params: [\n { name: \"url\", type: \"string\", required: false, description: \"A literal URL to fetch (mutually exclusive with urlFrom).\" },\n { name: \"urlFrom\", type: \"string\", required: false, description: \"A channel whose value supplies the URL (takes precedence when its channel is set).\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the { status, ok, body, json } result.\" },\n { name: \"method\", type: \"string\", required: false, description: 'HTTP method. Defaults to \"GET\".' },\n { name: \"headers\", type: \"Record<string, string>\", required: false, description: \"Request headers sent with the call.\" },\n { name: \"body\", type: \"string\", required: false, description: \"Request body (sent verbatim) for non-GET methods.\" },\n { name: \"timeoutMs\", type: \"number\", required: false, description: \"Abort the request after this many milliseconds (drives an AbortController).\" },\n { name: \"fetchImpl\", type: \"HttpFetchImpl\", required: false, description: \"The transport to call. Defaults to the real globalThis.fetch; inject a fake to stay offline.\" }\n ],\n integration: true\n },\n {\n kind: \"webSearch\",\n title: \"Web Search\",\n category: \"integration\",\n description:\n \"Integration (vendor I/O): run a real web search (default: Tavily connector behind TAVILY_API_KEY), writing { results, note? }. Degrades gracefully with no network call (empty results + note) when the key is absent.\",\n params: [\n { name: \"query\", type: \"string\", required: false, description: \"A literal query (mutually exclusive with queryFrom).\" },\n { name: \"queryFrom\", type: \"string\", required: false, description: \"A channel whose value supplies the query (takes precedence when its channel is set).\" },\n { name: \"into\", type: \"string\", required: true, description: \"Channel receiving the { results, note? } outcome.\" },\n { name: \"k\", type: \"number\", required: false, description: \"Number of results to request. Defaults to 3.\" },\n { name: \"searchImpl\", type: \"WebSearchImpl\", required: false, description: \"The search implementation to call. Defaults to a real Tavily connector behind TAVILY_API_KEY (no network when the key is absent).\" },\n { name: \"transport\", type: \"WebSearchTransport\", required: false, description: \"HTTP transport the default Tavily connector posts through. Defaults to globalThis.fetch; inject a fake to stay offline. Ignored when searchImpl is supplied.\" }\n ],\n integration: true\n }\n] as const;\n\n/**\n * The 16 prebuilt micro-agent catalog entries, mirroring the Rust `PrebuiltAgent`\n * table (`crates/components/src/prebuilt.rs`) and the SDK `prebuilt-agents.ts` `DEFS`:\n * name, tier, description, tools, suspend flag and output channel.\n */\nexport const prebuiltCatalog: readonly PrebuiltAgentCatalogEntry[] = [\n {\n name: \"summarizer\",\n title: \"Summarizer\",\n description: \"Condenses input text into a short, faithful summary.\",\n tier: \"fast\",\n tools: [],\n suspendForApproval: false,\n outputChannel: \"summary\"\n },\n {\n name: \"classifier\",\n title: \"Classifier\",\n description: \"Assigns the input to exactly one label from a fixed set.\",\n tier: \"fast\",\n tools: [],\n suspendForApproval: false,\n outputChannel: \"label\"\n },\n {\n name: \"extractor\",\n title: \"Extractor\",\n description: \"Extracts structured fields from unstructured text as JSON.\",\n tier: \"fast\",\n tools: [],\n suspendForApproval: false,\n outputChannel: \"extracted\"\n },\n {\n name: \"sqlGenerator\",\n title: \"SQL Generator\",\n description: \"Generates a SQL query from a natural-language request and schema.\",\n tier: \"balanced\",\n tools: [],\n suspendForApproval: false,\n outputChannel: \"sql\"\n },\n {\n name: \"ragAnswerer\",\n title: \"RAG Answerer\",\n description:\n \"Answers a question grounded in retrieved documents. Composed as a graph: the \" +\n \"retriever component fetches candidate documents, the reranker component reorders \" +\n \"them, and this agent step writes a grounded answer citing the supplied context.\",\n tier: \"balanced\",\n tools: [],\n suspendForApproval: false,\n outputChannel: \"answer\"\n },\n {\n name: \"refundApprover\",\n title: \"Refund Approver\",\n description:\n \"Decides whether to issue a refund and routes the action through a human approval \" +\n \"gate before calling the refund tool.\",\n tier: \"balanced\",\n tools: [\"refund\"],\n suspendForApproval: true,\n outputChannel: \"refundDecision\"\n },\n {\n name: \"translator\",\n title: \"Translator\",\n description: \"Translates the input text into a target language, preserving meaning.\",\n tier: \"fast\",\n tools: [],\n suspendForApproval: false,\n outputChannel: \"translation\"\n },\n {\n name: \"sentimentAnalyzer\",\n title: \"Sentiment Analyzer\",\n description: \"Classifies the emotional tone of the input text.\",\n tier: \"fast\",\n tools: [],\n suspendForApproval: false,\n outputChannel: \"sentiment\"\n },\n {\n name: \"entityExtractor\",\n title: \"Entity Extractor\",\n description: \"Extracts named entities from text as a JSON array.\",\n tier: \"fast\",\n tools: [],\n suspendForApproval: false,\n outputChannel: \"entities\"\n },\n {\n name: \"piiRedactor\",\n title: \"PII Redactor\",\n description: \"Redacts personally identifiable information from the input text.\",\n tier: \"fast\",\n tools: [],\n suspendForApproval: false,\n outputChannel: \"redacted\"\n },\n {\n name: \"intentClassifier\",\n title: \"Intent Classifier\",\n description: \"Maps the input to a single conversational intent label.\",\n tier: \"fast\",\n tools: [],\n suspendForApproval: false,\n outputChannel: \"intent\"\n },\n {\n name: \"titleGenerator\",\n title: \"Title Generator\",\n description: \"Generates a short, descriptive title for the input text.\",\n tier: \"fast\",\n tools: [],\n suspendForApproval: false,\n outputChannel: \"title\"\n },\n {\n name: \"keywordExtractor\",\n title: \"Keyword Extractor\",\n description: \"Extracts the key terms from the input text as a JSON array.\",\n tier: \"fast\",\n tools: [],\n suspendForApproval: false,\n outputChannel: \"keywords\"\n },\n {\n name: \"questionAnswerer\",\n title: \"Question Answerer\",\n description: \"Answers a question directly and concisely from its own knowledge.\",\n tier: \"balanced\",\n tools: [],\n suspendForApproval: false,\n outputChannel: \"answer\"\n },\n {\n name: \"codeReviewer\",\n title: \"Code Reviewer\",\n description: \"Reviews a code snippet or diff for correctness, security, and quality.\",\n tier: \"frontier\",\n tools: [],\n suspendForApproval: false,\n outputChannel: \"review\"\n },\n {\n name: \"copyEditor\",\n title: \"Copy Editor\",\n description: \"Polishes prose for clarity, grammar, flow, and tone.\",\n tier: \"creative\",\n tools: [],\n suspendForApproval: false,\n outputChannel: \"edited\"\n }\n] as const;\n\n/** A human-readable blurb for each capability tier. */\nconst TIER_DESCRIPTIONS: Record<ModelTier, string> = {\n frontier:\n \"Highest-capability models for the hardest reasoning, code and analysis tasks where quality outweighs cost.\",\n balanced:\n \"A balanced default trading capability against latency and cost for everyday agentic work.\",\n fast: \"Lowest-latency, lowest-cost models for high-volume, well-scoped tasks (classification, extraction, summarisation).\",\n creative:\n \"Models tuned for fluent, stylistic prose — writing, editing and tone-sensitive rewriting.\"\n};\n\n/**\n * The 4 capability tiers, each carrying its description and the per-provider\n * recommended models from {@link DEFAULT_TIER_TABLE} (anthropic / mistral / ollama).\n * Derived from the gateway table so the catalog tracks the source of truth.\n */\nexport const tierCatalog: readonly ModelTierInfo[] = MODEL_TIERS.map((tier) => {\n const models: Record<string, string> = {};\n for (const [provider, table] of Object.entries(DEFAULT_TIER_TABLE)) {\n if (table !== undefined) {\n models[provider] = table[tier];\n }\n }\n return { tier, description: TIER_DESCRIPTIONS[tier], models };\n});\n","import { componentCatalog, prebuiltCatalog, tierCatalog } from \"./catalog.js\";\n\n/**\n * Generate `llms.txt` (the [llmstxt.org](https://llmstxt.org) convention): a single, accurate\n * ground-truth file an AI coding agent reads to use Ailu **without hallucinating the API**.\n * Built from the same catalogs the engine validates against, so it cannot drift. Pure — no I/O.\n */\nexport function generateLlmsTxt(): string {\n const components = componentCatalog\n .map((c) => `- \\`${c.kind}\\` (${c.category}${c.integration ? \", integration\" : \"\"}) — ${c.description}`)\n .join(\"\\n\");\n const prebuilts = prebuiltCatalog\n .map((p) => `- \\`${p.name}\\` — ${p.description} (tier: ${p.tier}${p.suspendForApproval ? \", suspends for approval\" : \"\"})`)\n .join(\"\\n\");\n const tiers = tierCatalog\n .map((t) => `- \\`${t.tier}\\` — ${t.description}`)\n .join(\"\\n\");\n\n return `# Ailu\n\n> The open framework for stateful, resumable, **governed** agent graphs. A Rust execution engine\n> driven by a thin TypeScript SDK (\\`@ailu-ai/graph-sdk\\`). Every run is deterministic, checkpointed\n> after each node, and resumable — including across process restarts and human approvals. There is\n> **no TypeScript execution fallback**: graphs run on the Rust engine (shipped prebuilt).\n\n## Install\n\n\\`\\`\\`bash\nnpm install @ailu-ai/graph-sdk\n\\`\\`\\`\nThe Rust engine ships prebuilt (macOS/Linux-glibc/Windows) — no toolchain to install.\n\n## Core API (import from \\`@ailu-ai/graph-sdk\\`)\n\n- \\`createGraph({ name }) -> GraphBuilder\\` — fluent, typed builder. Channel value types flow through.\n- \\`.channel(name, { type, default? })\\` — declare a typed state channel.\n- \\`.node(id, async (input, state) => partialChannels)\\` — an action node.\n- \\`.agentNode(id, { model, prompt, tools?, middleware?, maxIterations? })\\` — a ReAct agent node.\n- \\`.humanGate(id)\\` — suspends the run for human approval; \\`app.resume(runId)\\` continues from the checkpoint.\n- \\`.edge(from, to)\\` and \\`.conditionalEdge(from, to, name, (state) => boolean)\\` — routing. Conditions are\n **named predicates**, never eval'd strings.\n- \\`.compile() -> CompiledGraph\\` (throws \\`GraphCompileError\\` on invalid) / \\`.safeCompile() -> Result\\`.\n- \\`app.run(initialData?) -> GraphState\\`, \\`app.resume(runId)\\`, \\`app.signal(runId, name, payload)\\`.\n- \\`app.approveAndResume(runId, { approvedTools, resolvedBy })\\` — grant gated tools; \\`resolvedBy\\` (the human approver) is required.\n- \\`app.stream(initialData, mode)\\` — \\`mode\\` ∈ \\`values | updates | messages | debug\\`; \\`messages\\` streams per-token.\n- \\`app.explain(runId) -> RunExplanation\\` — why a run suspended / what it awaits / what failed.\n\n## Picking a model (the \\`model\\` surface)\n\n\\`\\`\\`ts\nimport { model } from \"@ailu-ai/graph-sdk\";\nawait model.invoke(\"hi\"); // zero-config: provider from env keys, fails loud if none\nawait model.openai(\"gpt-4o\").invoke(\"hi\"); // provider is the method\nawait model.fast.invoke(\"classify\"); // tiers are properties: fast|balanced|frontier|creative\nmodel.openaiCompatible({ baseURL, model }); // any OpenAI-wire endpoint\nmodel.openai(\"gpt-4o\").output(schema) // typed structured output (JSON Schema → the engine)\n\\`\\`\\`\nProviders: openai, anthropic, gemini, mistral, ollama, openrouter, minimax, huggingface, lmstudio.\nKeys come from the environment (\\`OPENAI_API_KEY\\`, …); a missing key fails loud with the exact var.\n\n## Capability tiers\n\n${tiers}\n\n## Component nodes (\\`.component(id, components.<kind>({ ...params }))\\` — run natively in Rust)\n\n${components}\n\n## Prebuilt agents\n\n${prebuilts}\n\n## Errors\n\nEvery error carries a stable \\`code\\`, a one-line \\`hint\\` (the fix), and a \\`docUrl\\`. SDK errors also\noffer \\`.format()\\` (message + hint + docs). Codes include \\`AILU_GRAPH_COMPILE\\`, \\`AILU_UNKNOWN_NODE\\`,\n\\`AILU_GOVERNANCE_MIDDLEWARE_REJECTED\\`, \\`AILU_RUST_ENGINE_REQUIRED\\`, \\`AILU_UNKNOWN_PROVIDER\\`,\n\\`AILU_MISSING_PROVIDER_KEY\\`, \\`AILU_NO_PROVIDER_IN_ENV\\`, \\`AILU_APPROVER_REQUIRED\\`, \\`AILU_APPROVAL_NOT_GRANTED\\`.\n\n## Invariants (governed by construction)\n\n- Deterministic + resumable: checkpoint after every node; resume from the latest checkpoint.\n- Human-in-the-loop: \\`humanGate\\` nodes suspend cleanly and resume on approval.\n- Safe: no eval / new Function / dynamic import of user strings; conditions are named predicates;\n agents cannot approve their own outputs; sensitive actions route through approval gates.\n- A governed resume (\\`resumeCatalogGraph(definition, state, { approvalEngine })\\`) refuses to continue until\n the engine has approved what the run waits on.\n- Governance is engine-sealed: a user may only add efficiency middleware (compress/terse/contextBudget).\n`;\n}\n","import {\n componentCatalog,\n type ComponentCatalogEntry,\n type ComponentParamMeta\n} from \"./catalog.js\";\n\n/**\n * A minimal JSON Schema (the subset we emit). Enough for an AI agent or a validator to know a\n * component's parameter shape before compiling a graph (ADR AI-DX). Generated from the catalog's\n * declared param `type` strings — the single source of truth, so it can't drift from the docs.\n */\nexport type JsonSchema = {\n type?: string;\n enum?: string[];\n items?: JsonSchema;\n description?: string;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n additionalProperties?: boolean;\n};\n\n/** Map a catalog param `type` string (a TS-ish annotation) to a JSON Schema fragment. */\nexport function paramTypeToJsonSchema(type: string): JsonSchema {\n const t = type.trim();\n // A union of string literals — `\"a\" | \"b\" | \"c\"` → an enum.\n if (t.includes(\"|\") && /^(\"[^\"]*\"\\s*\\|\\s*)+\"[^\"]*\"$/.test(t)) {\n const values = t.split(\"|\").map((s) => s.trim().replace(/^\"|\"$/g, \"\"));\n return { type: \"string\", enum: values };\n }\n // Array types — `string[]`, `number[]`, `RouterRule[]`, …\n if (t.endsWith(\"[]\")) {\n const inner = t.slice(0, -2).trim();\n const itemSchema = scalar(inner);\n return itemSchema !== undefined ? { type: \"array\", items: itemSchema } : { type: \"array\" };\n }\n return scalar(t) ?? {}; // unknown/complex object type → unconstrained\n}\n\n/** Scalar primitives only; returns undefined for anything structural. */\nfunction scalar(t: string): JsonSchema | undefined {\n switch (t) {\n case \"string\":\n return { type: \"string\" };\n case \"number\":\n return { type: \"number\" };\n case \"boolean\":\n return { type: \"boolean\" };\n default:\n return undefined;\n }\n}\n\nfunction paramsToObjectSchema(params: readonly ComponentParamMeta[]): JsonSchema {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n for (const p of params) {\n properties[p.name] = { ...paramTypeToJsonSchema(p.type), description: p.description };\n if (p.required) required.push(p.name);\n }\n return {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n additionalProperties: false\n };\n}\n\n/** One component's identity + its parameter JSON Schema. */\nexport type ComponentSchema = {\n kind: string;\n title: string;\n category: string;\n description: string;\n integration: boolean;\n paramsSchema: JsonSchema;\n};\n\n/** The JSON Schema of one catalog entry's params. */\nexport function componentSchema(entry: ComponentCatalogEntry): ComponentSchema {\n return {\n kind: entry.kind,\n title: entry.title,\n category: entry.category,\n description: entry.description,\n integration: entry.integration,\n paramsSchema: paramsToObjectSchema(entry.params)\n };\n}\n\n/** Per-node JSON Schemas for the whole component library — what `list_catalog_with_schemas`\n * (MCP) and the docs reference emit. Keyed by `kind`. */\nexport function componentSchemas(): Record<string, ComponentSchema> {\n const out: Record<string, ComponentSchema> = {};\n for (const entry of componentCatalog) {\n out[entry.kind] = componentSchema(entry);\n }\n return out;\n}\n","import { randomBytes, timingSafeEqual } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\n\nimport type { RunEvent } from \"@ailu-ai/graph-runtime\";\n\nimport type { CompiledGraph } from \"./compiled-graph.js\";\nimport type { ChannelValues, InitialData } from \"./typed.js\";\n\n/**\n * `ailu dev` — the local run inspector (ADR DX batch 4). Run a graph and **watch it think** in\n * the browser: a live node-by-node timeline, the lifecycle-event stream, each node's output, and a\n * **governance lens** that marks exactly where the run suspended (human gate / approval) and why —\n * with `explain()` and a one-click resume. Dependency-free (node:http only) and self-contained\n * (the page is inline HTML/JS — no CDN, no build step), so it drops into any project.\n *\n * v1 streams a single run live. The replay-from-checkpoint primitive now exists —\n * {@link replayCatalogGraph} forks a deterministic re-execution from any checkpoint (ADR 0038) and\n * {@link verifyReplayDecisions} proves it reproduces the attested decisions. Wiring that into a\n * one-click \"rewind & replay\" governance lens in this page is the remaining v2 surface.\n */\nexport type InspectorHandle = {\n /** The URL the inspector is served at. */\n url: string;\n /** A promise that resolves when the inspected run settles (completed / failed / suspended). */\n done: Promise<void>;\n /** Shut the server down. */\n close: () => Promise<void>;\n};\n\nexport type InspectorOptions = {\n /** Port to listen on (default 4517; 0 picks a free port). */\n port?: number;\n /** Host to bind (default 127.0.0.1 — local only). */\n host?: string;\n};\n\ntype Frame =\n | { kind: \"event\"; event: RunEvent }\n | { kind: \"explain\"; explanation: unknown }\n | { kind: \"run\"; status: string };\n\n/** Serve a live inspector for a single run of `app`. Drives `app.run(initialData)`, streaming\n * every lifecycle event to the page over SSE; surfaces `explain()` on suspend/settle. */\nexport function serveInspector<TState extends ChannelValues>(\n app: CompiledGraph<TState>,\n initialData: InitialData<TState>,\n options: InspectorOptions = {}\n): Promise<InspectorHandle> {\n const host = options.host ?? \"127.0.0.1\";\n const port = options.port ?? 4517;\n\n const frames: Frame[] = []; // replay buffer for late-joining clients\n const clients = new Set<ServerResponse>();\n let runId: string | undefined;\n // The resume action crosses a human gate, so only this page may trigger it: the page carries a\n // per-process token and sends it in a header. A cross-site page cannot read the token, and a\n // custom header forces a CORS preflight this server never answers.\n const resumeToken = randomBytes(24).toString(\"hex\");\n let allowedHosts = new Set<string>();\n\n const push = (frame: Frame): void => {\n frames.push(frame);\n const line = `data: ${JSON.stringify(frame)}\\n\\n`;\n for (const res of clients) res.write(line);\n };\n\n const unsubscribe = app.onEvent((event) => {\n if (runId === undefined && \"runId\" in event) runId = String(event.runId);\n push({ kind: \"event\", event });\n });\n\n const server: Server = createServer((req: IncomingMessage, res: ServerResponse) => {\n // DNS rebinding: a hostile domain resolved to this address would otherwise be same-origin\n // with the inspector and could read the run's data and the resume token. Only the bound\n // address (and its loopback aliases) is served.\n if (!allowedHosts.has((req.headers.host ?? \"\").toLowerCase())) {\n res.writeHead(403).end();\n return;\n }\n const url = req.url ?? \"/\";\n if (url === \"/\" || url.startsWith(\"/?\")) {\n res.writeHead(200, {\n \"content-type\": \"text/html; charset=utf-8\",\n \"content-security-policy\": \"default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'; connect-src 'self'\",\n \"x-content-type-options\": \"nosniff\"\n });\n res.end(INSPECTOR_HTML.replace(\"__RESUME_TOKEN__\", resumeToken));\n return;\n }\n if (url === \"/events\") {\n res.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\"\n });\n for (const frame of frames) res.write(`data: ${JSON.stringify(frame)}\\n\\n`); // replay\n clients.add(res);\n req.on(\"close\", () => clients.delete(res));\n return;\n }\n if (url.startsWith(\"/resume\") && req.method === \"POST\") {\n const sent = Buffer.from(String(req.headers[\"x-inspector-token\"] ?? \"\"));\n const expected = Buffer.from(resumeToken);\n if (sent.length !== expected.length || !timingSafeEqual(sent, expected)) {\n res.writeHead(403).end();\n return;\n }\n if (runId !== undefined) {\n void app.resume(runId as never).then(\n (state) => {\n push({ kind: \"explain\", explanation: app.explain(String(state.runId) as never) });\n push({ kind: \"run\", status: String(state.status) });\n },\n (err: unknown) => push({ kind: \"run\", status: `resume-error: ${String(err)}` })\n );\n }\n res.writeHead(202).end();\n return;\n }\n res.writeHead(404).end();\n });\n\n return new Promise<InspectorHandle>((resolve) => {\n server.listen(port, host, () => {\n const addr = server.address();\n const boundPort = typeof addr === \"object\" && addr !== null ? addr.port : port;\n const url = `http://${host}:${boundPort}/`;\n allowedHosts = new Set(\n [host, \"localhost\", \"127.0.0.1\", \"[::1]\"].map((name) => `${name}:${boundPort}`.toLowerCase())\n );\n\n // Drive the run; stream settles to the page.\n const done = app\n .run(initialData)\n .then((state) => {\n runId = String(state.runId);\n push({ kind: \"explain\", explanation: app.explain(runId as never) });\n push({ kind: \"run\", status: String(state.status) });\n })\n .catch((err: unknown) => {\n push({ kind: \"run\", status: `error: ${String(err)}` });\n });\n\n const close = async (): Promise<void> => {\n unsubscribe();\n for (const res of clients) res.end();\n clients.clear();\n await new Promise<void>((r) => server.close(() => r()));\n };\n\n resolve({ url, done, close });\n });\n });\n}\n\n/** The inline inspector page — a dependency-free timeline + event log + governance lens. */\nconst INSPECTOR_HTML = `<!doctype html><meta charset=\"utf-8\"><meta name=\"inspector-token\" content=\"__RESUME_TOKEN__\"><title>Ailu dev — run inspector</title>\n<style>\n :root{color-scheme:dark}\n body{margin:0;font:14px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace;background:#0b0d10;color:#d7dce2}\n header{padding:12px 16px;border-bottom:1px solid #1c2128;display:flex;gap:12px;align-items:center}\n header b{color:#fff;font-size:15px} #status{margin-left:auto;padding:2px 10px;border-radius:99px;background:#1c2128}\n #status.suspended{background:#3a2d00;color:#ffd479} #status.completed{background:#0f3a23;color:#7ee2a8}\n #status.failed{background:#3a1418;color:#ff8a8a}\n main{display:grid;grid-template-columns:1fr 1fr;gap:0;height:calc(100vh - 49px)}\n section{overflow:auto;padding:14px 16px} #timeline{border-right:1px solid #1c2128}\n h2{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:#6b7785;margin:0 0 10px}\n .node{padding:8px 10px;border:1px solid #1c2128;border-radius:8px;margin-bottom:8px}\n .node .id{color:#fff;font-weight:600} .node.done{border-color:#1f5e3a} .node.failed{border-color:#5e1f24}\n .node.gate{border-color:#5e4a1f;background:#161310}\n .node pre{margin:6px 0 0;color:#9aa6b2;white-space:pre-wrap;word-break:break-word;font-size:12.5px}\n .ev{color:#8b97a3;font-size:12.5px;padding:2px 0} .ev .t{color:#5b6b7b}\n #explain{margin-top:14px;padding:10px 12px;border:1px solid #2a2f37;border-radius:8px;background:#0f1216}\n #explain .s{color:#ffd479} button{font:inherit;background:#1f6feb;color:#fff;border:0;border-radius:7px;padding:6px 14px;cursor:pointer}\n button[disabled]{opacity:.4;cursor:default}\n</style>\n<header><b>Ailu</b> run inspector <span id=\"run\"></span><span id=\"status\">connecting…</span></header>\n<main>\n <section id=\"timeline\"><h2>Nodes</h2><div id=\"nodes\"></div>\n <div id=\"explain\" hidden><div class=\"s\" id=\"esummary\"></div><div id=\"enext\"></div>\n <p><button id=\"resume\" hidden>▶ Resume run</button></p></div>\n </section>\n <section id=\"log\"><h2>Events</h2><div id=\"events\"></div></section>\n</main>\n<script>\nconst nodes=document.getElementById(\"nodes\"),events=document.getElementById(\"events\"),\n statusEl=document.getElementById(\"status\"),runEl=document.getElementById(\"run\"),\n explainEl=document.getElementById(\"explain\"),esum=document.getElementById(\"esummary\"),\n enext=document.getElementById(\"enext\"),resumeBtn=document.getElementById(\"resume\");\nconst seen={};\n// Node ids, outputs and errors are run data (possibly LLM- or user-controlled): always inserted\n// as text, never as HTML.\nfunction el(tag,cls,text){const d=document.createElement(tag);if(cls)d.className=cls;\n if(text!==undefined)d.textContent=String(text);return d;}\nfunction node(id){if(seen[id])return seen[id];const d=el(\"div\",\"node\");\n d.appendChild(el(\"div\",\"id\",id));nodes.appendChild(d);seen[id]=d;return d;}\nfunction log(t,id,error){const d=el(\"div\",\"ev\");d.appendChild(el(\"span\",\"t\",t));\n if(id){d.appendChild(document.createTextNode(\" \"));d.appendChild(el(\"b\",\"\",id));}\n if(error){d.appendChild(document.createTextNode(\" — \"+error));}\n events.appendChild(d);events.scrollTop=1e9;}\nconst es=new EventSource(\"/events\");\nes.onmessage=function(m){const f=JSON.parse(m.data);\n if(f.kind===\"event\"){const e=f.event,id=e.nodeId;\n if(e.type===\"node_started\"){node(id);}\n if(e.type===\"node_completed\"){const n=node(id);n.classList.add(\"done\");\n if(e.output)n.appendChild(el(\"pre\",\"\",JSON.stringify(e.output,null,1)));}\n if(e.type===\"node_failed\"){node(id).classList.add(\"failed\");}\n if(e.type===\"run_suspended\"){node(id).classList.add(\"gate\");}\n log(e.type,id,e.error);}\n if(f.kind===\"run\"){statusEl.textContent=f.status;statusEl.className=f.status;}\n if(f.kind===\"explain\"){const x=f.explanation;explainEl.hidden=false;esum.textContent=x.summary||\"\";\n enext.textContent=x.suspended?(\"→ \"+x.suspended.nextAction):\"\";\n if(x.status===\"suspended\"){resumeBtn.hidden=false;}else{resumeBtn.hidden=true;}}\n};\nresumeBtn.onclick=function(){resumeBtn.disabled=true;statusEl.textContent=\"resuming…\";\n fetch(\"/resume\",{method:\"POST\",headers:{\"x-inspector-token\":document.querySelector('meta[name=\"inspector-token\"]').content}});};\n</script>`;\n","/**\n * Observability (ADR 0028 phase 7): turn a run's lifecycle events into **OTLP spans** and ship\n * them to any OpenTelemetry endpoint — LangSmith, Langfuse, Phoenix, Datadog, Grafana, … — plus\n * a **cost** mapping from the token usage the engine now reports on `AgentResult.usage`.\n *\n * This lives in the SDK, not the engine: the engine already emits a `RunEvent` per node\n * transition (the audit journal) and `AgentResult.usage` per agent — observability is a *read\n * view* over that, an integration concern. The engine stays lean; nothing here can alter a run.\n *\n * ```ts\n * const stop = exportTracesToOtlp(app, { endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT });\n * await app.run({ … });\n * stop(); // flushes + unsubscribes (also auto-flushes on run_completed / run_failed)\n * ```\n */\n\nimport type { RunEvent } from \"@ailu-ai/graph-runtime\";\n\nimport type { CompiledGraph } from \"./compiled-graph.js\";\n\n// ── Cost ────────────────────────────────────────────────────────────────────────────────────\n\n/** Price of a model, in US dollars per 1,000,000 tokens. */\nexport type ModelPrice = { inPerMtok: number; outPerMtok: number };\n\n/** A price table keyed by model id (the `AgentResult.usage` carries the model on its calls). */\nexport type PriceBook = Record<string, ModelPrice>;\n\n/** Token usage shape (matches `AgentResult.usage` / the engine's `LlmUsage`). */\nexport type TokenUsage = {\n promptTokens: number;\n completionTokens: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n};\n\n/**\n * A small default price book ($/Mtok, indicative — prices drift; supply your own to override).\n * Keys are model ids; an unknown model costs `0` (and is reported as such, never guessed).\n */\nexport const DEFAULT_PRICE_BOOK: PriceBook = {\n \"claude-opus-4-8\": { inPerMtok: 15, outPerMtok: 75 },\n \"claude-sonnet-4-6\": { inPerMtok: 3, outPerMtok: 15 },\n \"claude-haiku-4-5\": { inPerMtok: 1, outPerMtok: 5 },\n \"gpt-4o\": { inPerMtok: 2.5, outPerMtok: 10 },\n \"gpt-4o-mini\": { inPerMtok: 0.15, outPerMtok: 0.6 },\n \"gemini-2.5-pro\": { inPerMtok: 1.25, outPerMtok: 10 },\n \"gemini-2.5-flash\": { inPerMtok: 0.3, outPerMtok: 2.5 },\n \"mistral-large-latest\": { inPerMtok: 2, outPerMtok: 6 }\n};\n\n/**\n * Compute the US-dollar cost of a usage record against a price book. Cache-read tokens (when\n * priced separately) are not modelled here — they fold into prompt tokens at the input rate, a\n * conservative upper bound. Returns `0` for an unknown model (never a guess).\n */\nexport function computeCost(\n usage: TokenUsage,\n model: string,\n book: PriceBook = DEFAULT_PRICE_BOOK\n): number {\n const price = book[model];\n if (price === undefined) {\n return 0;\n }\n const inTokens = usage.promptTokens + (usage.cacheReadTokens ?? 0);\n return (inTokens / 1e6) * price.inPerMtok + (usage.completionTokens / 1e6) * price.outPerMtok;\n}\n\n// ── OTLP export ─────────────────────────────────────────────────────────────────────────────\n\n/** Minimal `fetch` shape, so the exporter is injectable for tests (no real network). */\nexport type OtlpFetch = (\n url: string,\n init: { method: string; headers: Record<string, string>; body: string }\n) => Promise<{ ok: boolean; status: number }>;\n\nexport type OtelExporterOptions = {\n /** OTLP/HTTP traces endpoint. Defaults to `AILU_OTEL_EXPORTER_URL` env. */\n endpoint?: string;\n /** `service.name` resource attribute. Default `\"ailu\"`. */\n serviceName?: string;\n /** Extra headers (e.g. an API key for LangSmith / Langfuse). */\n headers?: Record<string, string>;\n /** Price book for the `ailu.cost.usd` span attribute. Default {@link DEFAULT_PRICE_BOOK}. */\n priceBook?: PriceBook;\n /** Injected `fetch` (tests). Defaults to the global `fetch`. */\n fetchImpl?: OtlpFetch;\n};\n\ntype OpenSpan = { spanId: string; name: string; startNano: string; nodeId?: string };\ntype FinishedSpan = OpenSpan & {\n endNano: string;\n status: 0 | 1 | 2; // UNSET | OK | ERROR\n attributes: Record<string, string | number | boolean>;\n};\n\nconst toNano = (iso: string): string => {\n const ms = Date.parse(iso);\n return `${(Number.isNaN(ms) ? 0 : ms) * 1_000_000}`;\n};\n\n/** Deterministic hex id of `bytes` bytes from a seed string (FNV-1a, repeated). Not crypto. */\nconst hexId = (seed: string, bytes: number): string => {\n let out = \"\";\n let h = 0x811c9dc5;\n for (let i = 0; out.length < bytes * 2; i += 1) {\n for (const ch of `${seed}#${i}`) {\n h = Math.imul(h ^ ch.charCodeAt(0), 0x01000193) >>> 0;\n }\n out += h.toString(16).padStart(8, \"0\");\n }\n return out.slice(0, bytes * 2);\n};\n\nconst attrValue = (v: string | number | boolean): Record<string, unknown> => {\n if (typeof v === \"number\") return Number.isInteger(v) ? { intValue: v } : { doubleValue: v };\n if (typeof v === \"boolean\") return { boolValue: v };\n return { stringValue: v };\n};\n\n/**\n * Build the OTLP/HTTP-JSON `traces` payload for one run: a root span for the run plus one span\n * per completed/failed node, each tagged with `ailu.run_id` / `ailu.node_id`, and agent\n * nodes additionally with token usage + computed cost.\n */\nexport function buildOtlpPayload(\n runId: string,\n spans: FinishedSpan[],\n serviceName: string\n): string {\n const traceId = hexId(runId, 16);\n return JSON.stringify({\n resourceSpans: [\n {\n resource: { attributes: [{ key: \"service.name\", value: { stringValue: serviceName } }] },\n scopeSpans: [\n {\n scope: { name: \"ailu\" },\n spans: spans.map((s) => ({\n traceId,\n spanId: s.spanId,\n name: s.name,\n kind: 1,\n startTimeUnixNano: s.startNano,\n endTimeUnixNano: s.endNano,\n status: { code: s.status },\n attributes: Object.entries(s.attributes).map(([key, value]) => ({\n key,\n value: attrValue(value)\n }))\n }))\n }\n ]\n }\n ]\n });\n}\n\n/**\n * Subscribe to `app`'s run-lifecycle events and export each run as an OTLP trace. Returns an\n * unsubscribe fn; the run is flushed automatically on `run_completed` / `run_failed` (and on the\n * returned fn). **Fail-open**: an export error is swallowed (best-effort observability never\n * fails a run). A missing endpoint disables export (the returned fn is a no-op).\n */\nexport function exportTracesToOtlp(\n app: CompiledGraph,\n options: OtelExporterOptions = {}\n): () => void {\n const endpoint = options.endpoint ?? process.env.AILU_OTEL_EXPORTER_URL;\n if (endpoint === undefined || endpoint === \"\") {\n return () => {};\n }\n const serviceName = options.serviceName ?? \"ailu\";\n const priceBook = options.priceBook ?? DEFAULT_PRICE_BOOK;\n const doFetch: OtlpFetch =\n options.fetchImpl ??\n ((url, init) => fetch(url, init).then((r) => ({ ok: r.ok, status: r.status })));\n\n // One trace per root run. The exporter subscribes to the app's shared event feed, which carries\n // the events of every in-flight run, so spans are grouped by run id; a child run's events\n // (`<rootRunId>:<nodeId>[:<index>]`) are folded into the root run's trace, as before.\n type RunTrace = { open: Map<string, OpenSpan>; finished: FinishedSpan[]; startNano: string };\n const traces = new Map<string, RunTrace>();\n\n const traceIdOf = (eventRunId: string): string => {\n if (traces.has(eventRunId)) return eventRunId;\n for (const rootId of traces.keys()) {\n if (eventRunId.startsWith(`${rootId}:`)) return rootId;\n }\n return eventRunId;\n };\n\n const flush = (runId: string, endNano: string, status: 0 | 1 | 2): void => {\n const trace = traces.get(runId);\n if (trace === undefined) return;\n traces.delete(runId);\n const all: FinishedSpan[] = [\n {\n spanId: hexId(`${runId}#run`, 8),\n name: \"run\",\n startNano: trace.startNano || endNano,\n endNano,\n status,\n nodeId: undefined,\n attributes: { \"ailu.run_id\": runId }\n },\n ...trace.finished\n ];\n const body = buildOtlpPayload(runId, all, serviceName);\n void doFetch(endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", ...(options.headers ?? {}) },\n body\n }).catch(() => {\n /* fail-open: observability never breaks a run */\n });\n };\n\n const unsubscribe = app.onEvent((event: RunEvent) => {\n const runId = traceIdOf(String(event.runId));\n switch (event.type) {\n case \"node_started\": {\n let trace = traces.get(runId);\n if (trace === undefined) {\n trace = { open: new Map(), finished: [], startNano: toNano(event.timestamp) };\n traces.set(runId, trace);\n }\n trace.open.set(String(event.nodeId), {\n spanId: hexId(`${runId}#${String(event.nodeId)}`, 8),\n name: String(event.nodeId),\n startNano: toNano(event.timestamp),\n nodeId: String(event.nodeId)\n });\n break;\n }\n case \"node_completed\": {\n const trace = traces.get(runId);\n const span = trace?.open.get(String(event.nodeId));\n if (trace !== undefined && span !== undefined) {\n trace.open.delete(String(event.nodeId));\n trace.finished.push({\n ...span,\n endNano: toNano(event.timestamp),\n status: 1,\n attributes: nodeAttributes(runId, String(event.nodeId), event.output, priceBook)\n });\n }\n break;\n }\n case \"node_failed\": {\n const trace = traces.get(runId);\n const span = trace?.open.get(String(event.nodeId));\n if (trace !== undefined && span !== undefined) {\n trace.open.delete(String(event.nodeId));\n trace.finished.push({\n ...span,\n endNano: toNano(event.timestamp),\n status: 2,\n attributes: { \"ailu.run_id\": runId, \"ailu.node_id\": String(event.nodeId), error: String(event.error) }\n });\n }\n break;\n }\n // Only the root run's terminal event closes its trace; a child run completing mid-way\n // must not flush the parent's spans early.\n case \"run_completed\":\n if (String(event.runId) === runId) flush(runId, toNano(event.timestamp), 1);\n break;\n case \"run_failed\":\n if (String(event.runId) === runId) flush(runId, toNano(event.timestamp), 2);\n break;\n default:\n break;\n }\n });\n\n return () => {\n const now = `${Date.now() * 1_000_000}`;\n for (const runId of [...traces.keys()]) {\n flush(runId, now, 0);\n }\n unsubscribe();\n };\n}\n\n/** Span attributes for a completed node: run/node ids, plus token usage + cost for agent nodes. */\nfunction nodeAttributes(\n runId: string,\n nodeId: string,\n output: unknown,\n priceBook: PriceBook\n): Record<string, string | number | boolean> {\n const attrs: Record<string, string | number | boolean> = {\n \"ailu.run_id\": runId,\n \"ailu.node_id\": nodeId\n };\n // An agent node's output (in its output channel) is an AgentResult carrying `usage`.\n const result = extractAgentResult(output);\n if (result?.usage !== undefined) {\n const u = result.usage;\n attrs[\"gen_ai.usage.input_tokens\"] = u.promptTokens;\n attrs[\"gen_ai.usage.output_tokens\"] = u.completionTokens;\n if (result.model !== undefined) {\n attrs[\"gen_ai.response.model\"] = result.model;\n attrs[\"ailu.cost.usd\"] = computeCost(u, result.model, priceBook);\n }\n }\n return attrs;\n}\n\n/** Pull the first `AgentResult`-shaped value (one carrying `usage`) out of a node output map. */\nfunction extractAgentResult(\n output: unknown\n): { usage?: TokenUsage; model?: string } | undefined {\n if (output === null || typeof output !== \"object\") return undefined;\n for (const value of Object.values(output as Record<string, unknown>)) {\n if (value !== null && typeof value === \"object\" && \"usage\" in value) {\n const usage = (value as { usage?: unknown }).usage;\n if (usage !== null && typeof usage === \"object\" && \"promptTokens\" in usage) {\n return value as { usage?: TokenUsage; model?: string };\n }\n }\n }\n return undefined;\n}\n","/**\n * Run a **catalog graph** on the Rust engine.\n *\n * A catalog graph is a plain {@link GraphDefinition} (e.g. one authored in the Studio\n * graph editor, persisted as data, with no in-process TS handlers) whose nodes carry\n * the SHARED CARRIER in `node.metadata`:\n *\n * - a COMPONENT node carries `node.metadata.component = { kind, params }`\n * - an AGENT node carries `node.metadata.agent = { provider?, model?, tier?, system?,\n * toolNames?, maxIterations?, suspendForApproval?, approvalToolNames?, outputChannel? }`\n *\n * This is the seam the control plane (`apps/api`) uses to EXECUTE a graph built from\n * the catalog: it reads each node's metadata, assembles the engine's\n * `EngineSpec.componentNodes` + `agents` maps + the `jsNodeIds` for plain\n * action/tool nodes, and drives the run on the **Rust engine** via `@ailu-ai/napi`.\n *\n * Unlike {@link import(\"./builder.js\").GraphBuilder}, there are no TS handler closures\n * here — components and agents run **natively** in Rust, and plain action/tool nodes\n * are inert JS seams (they return an empty channel update). The carrier IS the wiring.\n *\n * The carrier readers below mirror the canonical Zod schema in\n * `@ailu-ai/contracts` (`node-metadata.ts`); the SDK stays dependency-free of the\n * contracts package, so the narrowing is duplicated structurally here. The control\n * plane is free to validate the carrier with the contracts schema before handing the\n * definition to this runner.\n */\n\nimport type { GraphDefinition, GraphState, NodeId, RunId } from \"@ailu-ai/graph-core\";\nimport type { RunEvent } from \"@ailu-ai/graph-runtime\";\nimport type { ModelTier } from \"@ailu-ai/llm-gateway\";\n// Type-only: keeps the ApprovalEngine contract without pulling its Pg/db implementation\n// (and a `pg` dependency) into consumers such as the Studio bundle.\nimport type { ApprovalEngine, ApprovalId, ApprovalRequest } from \"@ailu-ai/approval-engine\";\n\nimport type {\n EfficiencyMiddlewareSpec,\n FsPolicyRule,\n RustAgentConfig,\n RustMapAgentConfig,\n RustToolBinding,\n RustToolSpec,\n SkillRecord\n} from \"./agent-node.js\";\nimport { APPROVAL_IDS_CHANNEL, DEFAULT_AGENT_OUTPUT_CHANNEL } from \"./agent-node.js\";\n\n/** Mirrors the Rust bridge's `SUBGRAPH_RUNS_KEY` (`runtime.rs`) — `{ <nodeId>: <childRunId> }`. */\nconst SUBGRAPH_RUNS_CHANNEL = \"__subgraphRuns\";\n/** Mirrors the Rust bridge's `SUBGRAPH_STATES_KEY` (`runtime.rs`) — `{ <childRunId>: <GraphState> }`. */\nconst SUBGRAPH_STATES_CHANNEL = \"__subgraphStates\";\nimport type { RustComponentConfig, ComponentKind } from \"./components.js\";\nimport {\n rustEngineAvailable,\n tryCreateRustRunner,\n type ApprovedToolWire,\n type RustRunnerParts\n} from \"./rust-engine.js\";\nimport type { ChannelValues } from \"./typed.js\";\nimport { ApprovalNotGrantedError } from \"./errors.js\";\n\n/** The component carrier on `node.metadata.component`. Mirrors the contracts schema. */\nexport type ComponentCarrier = {\n kind: string;\n params: Record<string, unknown>;\n};\n\n/** The agent carrier on `node.metadata.agent`. Mirrors the contracts schema. */\nexport type AgentCarrier = {\n provider?: string;\n model?: string;\n tier?: ModelTier;\n /** A custom OpenAI-compatible endpoint, and the env var naming its key (`model.openaiCompatible`). */\n baseURL?: string;\n apiKeyEnv?: string;\n system?: string;\n toolNames?: string[];\n /** Each tool's description + input JSON Schema, as the LLM sees them. */\n toolSpecs?: RustToolSpec[];\n maxIterations?: number;\n suspendForApproval?: boolean;\n approvalToolNames?: string[];\n outputChannel?: string;\n /** ADR 0014 — terse output directive on the system prompt. */\n outputStyle?: \"terse\";\n /** ADR 0014 — cap (chars) on the agent's seed message (the injected `Input`/`State` dump). */\n contextBudget?: number;\n /** ADR 0022/0023 — durable channel the agent's `writeTodos` list is persisted into. */\n todosChannel?: string;\n /** ADR 0030 phase 9e — channel carrying the run's multimodal input blocks. */\n inputBlocksChannel?: string;\n /** The only channels the agent is shown in its seed state (context isolation). */\n visibleChannels?: string[];\n /** ADR 0026 phase 11 — governed long-term memory overlay. */\n memory?: { namespace: string; topK?: number; recall?: \"vector\" | \"graph\" | \"both\" };\n /** ADR 0035 phase 12 — governed skills (progressive disclosure) overlay. */\n skills?: { namespace: string; required?: string[]; advisoryK?: number };\n /** ADR 0024 — opt this agent into the governed virtual filesystem tools. */\n enableFs?: boolean;\n /**\n * ADR 0075 (issue #566 G3) — attach an external MCP server's tools to this agent, mid-run. The\n * control plane resolves this to a connection, discovers the server's tools, and merges them into\n * `toolNames`/`approvalToolNames` before the run reaches this carrier — the Rust engine itself\n * never resolves an MCP connection.\n */\n mcpConnectionId?: string;\n /**\n * Issue #566 G19 — governed action-tool connectors, keyed by provider id (\"slack\" first).\n * Resolved the same way as `mcpConnectionId`; generalized to a map so future providers don't\n * need a new engine field/release each time.\n */\n actionConnections?: Record<string, string>;\n /**\n * ADR 0025 phase 3d — the resolved efficiency middleware list. Present on graphs built by\n * the phase-3d SDK; absent on a pre-3d persisted node (the Rust bridge then falls back to\n * the legacy `outputStyle`/`contextBudget` knobs above, so old graphs keep their behaviour).\n */\n resolvedMiddleware?: EfficiencyMiddlewareSpec[];\n};\n\n/**\n * The mapAgents carrier on `node.metadata.mapAgents` (ADR 0027 phase 4b — dynamic fan-out). Mirrors\n * the contracts schema: run `subAgent` once per item in `overChannel` and collect the per-item results\n * (input order) into `joinAt`. The sub-agent is a full agent carrier → skills/memory/fs/planning apply.\n */\nexport type MapAgentCarrier = {\n overChannel: string;\n joinAt: string;\n subAgent: AgentCarrier;\n suspendForApproval?: boolean;\n};\n\n/** Outcome of a catalog-graph run: the terminal/suspended state and a flat status. */\nexport type CatalogRunOutcome = {\n /** The final (or suspended) graph state, channels included. */\n state: GraphState;\n /** `\"running\" | \"suspended\" | \"completed\" | \"failed\" | \"cancelled\"` — the state's status.\n * `\"cancelled\"` (ADR 0044) means the run stopped at a node boundary because `options.signal`\n * was aborted; its last checkpoint is durable, so it stays resumable and replayable. */\n status: string;\n /** True when execution ran on the Rust engine (always, since this seam requires it). */\n usedRustEngine: true;\n /**\n * Replay-as-evidence (ADR 0038): the recorded LLM I/O + clock journal (`{ decisions, clock }`\n * JSON) when the run executed in record mode (`AILU_LLM_RECORD`); `undefined` otherwise. The\n * control plane persists it to re-feed a later replay (`verify-replay`).\n */\n replayJournal?: string;\n /**\n * Replay-as-evidence (ADR 0040): the run's ENTRY state (initial state, before the entry node ran),\n * surfaced only on a record-mode run; `undefined` otherwise. The control plane persists it as the\n * checkpoint a later `verify-replay` seeds {@link replayCatalogGraph} from.\n */\n entryState?: GraphState;\n /**\n * The pending approvals — the subjects the run requested when it suspended on a gate (empty if it\n * completed without gating). On a {@link replayCatalogGraph} this is what the deterministic\n * re-execution requested: the faithfulness signal `verify-replay` compares to the attested chain.\n */\n pendingApprovals?: { subject: string; reason: string; approvalKey?: string; input?: unknown }[];\n};\n\n/** Options for {@link runCatalogGraph} / {@link resumeCatalogGraph}. */\nexport type RunCatalogGraphOptions = {\n /** A stable run id. Defaults to a generated one. */\n runId?: RunId;\n /** Initial channel data seeding the run. */\n initialData?: Record<string, unknown>;\n /** Subscribe to forwarded run-lifecycle events (every node transition). */\n onEvent?: (event: RunEvent) => void;\n /**\n * Cooperative cancellation (ADR 0044) — the kill switch. Abort this signal and the engine\n * stops the run at the **next node boundary**: it finishes the node it is on, writes that\n * node's checkpoint, emits a `run_cancelled` event and returns a terminal\n * {@link CatalogRunOutcome} with `status: \"cancelled\"`.\n *\n * It is **cooperative, never pre-emptive**. A node already executing (an agent mid-LLM-call,\n * a tool mid-HTTP-request) always runs to completion — so cancelling can never tear state,\n * and the last checkpoint always remains authoritative. That also means cancellation is not\n * instantaneous: its latency is the duration of the node in flight. A caller that needs a\n * *bounded* stop must impose its own deadline around this call; the engine deliberately\n * offers no hard abort, because killing a run mid-node is precisely what would break the\n * checkpoint-per-node guarantee everything else depends on.\n *\n * An ALREADY-aborted signal stops the run before its first node executes. Omit for the\n * previous behaviour (a run that can only complete, suspend or fail).\n */\n signal?: AbortSignal;\n /**\n * Opt into per-token streaming (ADR 0033 phase 13 / ADR 0060). When true, an agent node's LLM call\n * streams real provider deltas, surfaced as `token_delta` {@link RunEvent}s over {@link onEvent} — so\n * a catalog run (e.g. Governed Ask) can stream its answer token-by-token, not just return a final\n * result. The assembled state is byte-identical either way (deltas bypass the checkpoint/journal —\n * observational only). Default false (the run returns its terminal state with no token events).\n */\n streamTokens?: boolean;\n /**\n * Route the run's approvals through an {@link ApprovalEngine}. When present, the\n * agents run natively on Rust as usual, but the moment the run suspends for approval\n * the seam files one request per gated tool (`requestedBy = nodeId`, the agent's own\n * subject) and stashes the engine ids in the `__approvalIds` channel of the returned\n * state — so a human resolves them out of band (the engine forbids self-approval).\n * Pass the same engine to {@link resumeCatalogGraph}: it refuses to resume until the\n * engine has approved what the run waits on. Absent: the run is ungoverned.\n */\n approvalEngine?: ApprovalEngine;\n /**\n * Per-provider API keys injected by the control plane (ADR 0010), keyed by provider\n * slug (`openai`, `anthropic`, `mistral`, …). Threaded into the Rust `EngineSpec` so\n * the gateway resolves each agent's key tenant-key-first then host env. Omit to rely\n * purely on the host env (local dev, tests).\n */\n providerKeys?: Record<string, string>;\n /**\n * Per-path filesystem permission rules (ADR 0024 phase 2d) the control plane resolved\n * for this run (from its owner-only `fs_path_policy` table), compiled into the engine's\n * `EngineSpec.fsPolicy` and applied to every fs-enabled agent. Omit for fail-closed\n * read-only everywhere.\n */\n fsPolicy?: FsPolicyRule[];\n /**\n * The tenant's governed skills for this run (ADR 0049 B-3) — the control plane's skill store. The\n * engine builds a run-scoped, tenant-isolated store from these and each agent's SkillMiddleware\n * selects from it. Omit/empty → the OSS shared in-memory store (no skills).\n */\n skills?: SkillRecord[];\n /**\n * Host tools for this run (ADR 0041 D1): JS-backed `{ name, execute }` bindings made callable by\n * ANY catalog agent whose `toolNames` includes the name — through the same napi host-tool seam the\n * in-process builder path uses (`on_node` `kind:\"tool\"`). Names NOT bound here keep the no-op stub\n * behaviour, so a graph remains pure data and existing runs are untouched. Supplied per CALL, never\n * persisted with the graph. NOTE (ADR 0041 E2): until the replay journal records host-tool results,\n * the caller must not combine `tools` with record-mode replay evidence — a replayed run would\n * re-execute the tools and may diverge.\n */\n tools?: RustToolBinding[];\n /**\n * Child graph definitions for `subgraph`-type nodes (ADR 0042, product ADR 0068 — child\n * workflows). A catalog node with `type: \"subgraph\"` + `subgraphId` resolves against this list,\n * exactly like the in-process builder path (`GraphBuilder.subgraph()` → `CompiledGraph`) already\n * does — `execute_subgraph` (the Rust engine) recursively starts/resumes the child sharing this\n * run's checkpointer, propagates the child's suspension to the parent, and propagates a child\n * failure as the parent's own error. Omit/empty for a graph with no subgraph nodes (today's\n * behaviour, unchanged).\n */\n subgraphs?: GraphDefinition[];\n};\n\n/** Raised when the native engine is unavailable — catalog graphs require it. */\nexport class RustEngineUnavailableError extends Error {\n public constructor() {\n super(\n \"Catalog graphs execute on the Rust engine, but the native addon (@ailu-ai/napi) \" +\n \"is not available. Build it with scripts/build-napi.sh.\"\n );\n this.name = \"RustEngineUnavailableError\";\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n/** Narrow a node's open metadata bag to its COMPONENT carrier, if present and valid. */\nexport const readComponentCarrier = (\n metadata: Record<string, unknown> | undefined\n): ComponentCarrier | undefined => {\n const component = metadata?.component;\n if (!isRecord(component)) {\n return undefined;\n }\n const { kind, params } = component;\n if (typeof kind !== \"string\" || kind.length === 0) {\n return undefined;\n }\n return { kind, params: isRecord(params) ? params : {} };\n};\n\n/** Narrow a node's open metadata bag to its AGENT carrier, if present and valid. */\nexport const readAgentCarrier = (\n metadata: Record<string, unknown> | undefined\n): AgentCarrier | undefined => {\n const agent = metadata?.agent;\n if (!isRecord(agent)) {\n return undefined;\n }\n return agent as AgentCarrier;\n};\n\n/** Narrow a node's open metadata bag to its mapAgents (dynamic fan-out) carrier, if present + valid. */\nexport const readMapAgentCarrier = (\n metadata: Record<string, unknown> | undefined\n): MapAgentCarrier | undefined => {\n const map = metadata?.mapAgents;\n if (!isRecord(map)) {\n return undefined;\n }\n const { overChannel, joinAt, subAgent } = map;\n if (typeof overChannel !== \"string\" || overChannel.length === 0) return undefined;\n if (typeof joinAt !== \"string\" || joinAt.length === 0) return undefined;\n if (!isRecord(subAgent)) return undefined;\n return {\n overChannel,\n joinAt,\n subAgent: subAgent as AgentCarrier,\n suspendForApproval: map.suspendForApproval === true\n };\n};\n\n/**\n * Project an {@link AgentCarrier} into the wire {@link RustAgentConfig} the bridge\n * consumes. `usesApprovalEngine` reflects whether the run was given an\n * {@link ApprovalEngine}: on the catalog path the agent still executes natively on Rust\n * (the flag does not re-route it), but the run is governed — the seam files a request\n * per gated tool when the run suspends (see {@link fileApprovalRequests}).\n */\nconst carrierToAgentConfig = (\n carrier: AgentCarrier,\n usesApprovalEngine: boolean\n): RustAgentConfig => ({\n provider: carrier.provider ?? \"anthropic\",\n model: carrier.model,\n tier: carrier.tier,\n baseURL: carrier.baseURL,\n apiKeyEnv: carrier.apiKeyEnv,\n system: carrier.system,\n toolNames: carrier.toolNames ?? [],\n toolSpecs: carrier.toolSpecs,\n maxIterations: carrier.maxIterations,\n suspendForApproval: carrier.suspendForApproval === true,\n approvalToolNames: carrier.approvalToolNames ?? [],\n outputChannel: carrier.outputChannel ?? DEFAULT_AGENT_OUTPUT_CHANNEL,\n // ADR 0014 token-efficiency knobs + ADR 0022/0023 durable todos channel: carried on\n // the persisted node so the catalog/Studio run path reaches parity with the in-process\n // SDK builder path (toRustAgentConfig), which forwards the same fields.\n outputStyle: carrier.outputStyle,\n contextBudget: carrier.contextBudget,\n todosChannel: carrier.todosChannel,\n inputBlocksChannel: carrier.inputBlocksChannel,\n visibleChannels: carrier.visibleChannels,\n memory: carrier.memory,\n skills: carrier.skills,\n // ADR 0024 — fs enablement carried on the persisted node; the run's fs policy is\n // supplied separately by the control plane (RunCatalogGraphOptions.fsPolicy).\n enableFs: carrier.enableFs,\n // ADR 0025 phase 3d — forward the resolved efficiency list (already desugared at build\n // time); a pre-3d carrier has none, and the Rust bridge falls back to the flat knobs.\n resolvedMiddleware: carrier.resolvedMiddleware,\n // Per-agent tool closures are a builder-path concept; on the catalog path host tools are\n // supplied PER RUN via RunCatalogGraphOptions.tools (ADR 0041 D1) and dispatched through the\n // spec-level jsToolNames — an agent's toolName not bound there stays a native/no-op stub.\n toolBindings: [],\n usesApprovalEngine\n});\n\nconst generateRunId = (): RunId => {\n const random = globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2);\n return `run_${random}` as RunId;\n};\n\n/**\n * Assemble the {@link RustRunnerParts} for a catalog graph from its node-metadata\n * carriers. Component and agent nodes are routed to native Rust handlers; every other\n * non-human-gate node becomes an inert JS node (an empty channel update) so a graph\n * that mixes catalog nodes with plain action/tool nodes still runs end-to-end.\n */\nconst assembleParts = (\n definition: GraphDefinition,\n usesApprovalEngine: boolean,\n providerKeys: Record<string, string> | undefined,\n fsPolicy: FsPolicyRule[] | undefined,\n skills: SkillRecord[] | undefined,\n tools: RustToolBinding[] | undefined,\n subgraphs: GraphDefinition[] | undefined\n): RustRunnerParts<ChannelValues> => {\n const components = new Map<string, RustComponentConfig>();\n const agents = new Map<string, RustAgentConfig>();\n const mapAgents = new Map<string, RustMapAgentConfig>();\n const jsNodeIds = new Set<string>();\n\n // Classifies ONE node into the shared maps above. Applied to the parent's own nodes AND\n // (ADR 0042) each subgraph's nodes — mirrors what GraphBuilder.subgraph() does at TS build\n // time on the builder path (flattening a child's handlers/agents/components into the SAME\n // maps as the parent, since `execute_subgraph` shares the parent runtime's registries; see\n // compiled-graph.ts's \"child runs share these registries\" comment). Without this, a subgraph's\n // OWN action/agent/component nodes would have no registered handler and the Rust bridge would\n // fail with \"no node handler registered\" the moment it tried to execute one.\n const classifyNode = (node: GraphDefinition[\"nodes\"][number]): void => {\n const id = String(node.id);\n const component = readComponentCarrier(node.metadata);\n if (component !== undefined) {\n components.set(id, { kind: component.kind as ComponentKind, params: component.params });\n return;\n }\n // A mapAgents carrier takes precedence over a plain agent carrier (a fan-out node is not itself a\n // top-level agent) — the bridge routes it via EngineSpec.map_agents, keyed by node id.\n const mapAgent = readMapAgentCarrier(node.metadata);\n if (mapAgent !== undefined) {\n mapAgents.set(id, {\n overChannel: mapAgent.overChannel,\n joinAt: mapAgent.joinAt,\n agent: carrierToAgentConfig(mapAgent.subAgent, usesApprovalEngine),\n suspendForApproval: mapAgent.suspendForApproval === true\n });\n return;\n }\n // A node that CARRIES a mapAgents key but fails to parse (missing overChannel/joinAt/subAgent) would\n // otherwise fall through to an inert JS node and silently never fan out. Surface it — no silent caps.\n if (isRecord(node.metadata?.mapAgents)) {\n console.warn(\n `[ailu] node \"${id}\" has a malformed mapAgents carrier (needs overChannel, joinAt, subAgent) — it will NOT fan out.`\n );\n }\n const agent = readAgentCarrier(node.metadata);\n if (agent !== undefined) {\n agents.set(id, carrierToAgentConfig(agent, usesApprovalEngine));\n return;\n }\n if (node.type === \"human-gate\" || node.type === \"subgraph\") {\n // The runtime handles both natively (a human gate suspends; a nested subgraph recurses via\n // execute_subgraph, resolved against the SAME `subgraphs` list) — no JS handler needed.\n return;\n }\n // A plain action / tool / custom node with no carrier: an inert JS seam. The\n // catalog path has no TS handler closures, so it produces an empty update.\n jsNodeIds.add(id);\n };\n\n for (const node of definition.nodes) {\n classifyNode(node);\n }\n for (const subgraph of subgraphs ?? []) {\n for (const node of subgraph.nodes) {\n classifyNode(node);\n }\n }\n\n return {\n definition,\n // ADR 0042 (product ADR 0068 — child workflows): child graphs for `subgraph`-type nodes,\n // supplied per CALL like `tools`/`skills` — the same wire field the builder path\n // (`CompiledGraph`) already populates. Empty for a graph with no subgraph nodes.\n subgraphs: subgraphs ?? [],\n nodeFns: new Map(\n jsNodeIds.size === 0 ? [] : [...jsNodeIds].map((id) => [id, async () => ({})])\n ),\n // ADR 0041 D1 — per-run host tools: the same seam the builder path wires (`toolFns` backs the\n // napi `on_node` `kind:\"tool\"` dispatch; `jsToolNames` tells the bridge which names are real).\n // No bindings → today's behaviour exactly (every agent toolName is a native or no-op stub).\n toolFns: new Map((tools ?? []).map((binding) => [binding.name, binding.execute])),\n conditions: new Map(),\n agents,\n components,\n // ADR 0027 phase 4b / ADR 0049 — the catalog path now reads a `mapAgents` carrier (a dynamic\n // fan-out node), at parity with the in-process builder path.\n mapAgents,\n jsNodeIds,\n jsToolNames: new Set((tools ?? []).map((binding) => binding.name)),\n providerKeys,\n fsPolicy,\n skills\n };\n};\n\n/**\n * Run a catalog {@link GraphDefinition} (whose nodes carry `node.metadata.component`\n * and `node.metadata.agent`) to completion or suspension on the **Rust engine**.\n *\n * Throws {@link RustEngineUnavailableError} when the native addon is absent.\n */\nexport const runCatalogGraph = async (\n definition: GraphDefinition,\n options: RunCatalogGraphOptions = {}\n): Promise<CatalogRunOutcome> => {\n if (!rustEngineAvailable()) {\n throw new RustEngineUnavailableError();\n }\n const runner = tryCreateRustRunner<ChannelValues>(\n assembleParts(\n definition,\n options.approvalEngine !== undefined,\n options.providerKeys,\n options.fsPolicy,\n options.skills,\n options.tools,\n options.subgraphs\n )\n );\n if (runner === null) {\n throw new RustEngineUnavailableError();\n }\n if (options.onEvent !== undefined) {\n runner.subscribe(options.onEvent);\n }\n // ADR 0044: the engine polls this at every node boundary. Captured in a local so the closure\n // reads the caller's signal directly — an abort mid-run is observed at the very next boundary.\n const cancelSignal = options.signal;\n if (cancelSignal !== undefined) {\n runner.cancelWhen(() => cancelSignal.aborted);\n }\n const runId = options.runId ?? generateRunId();\n const state = (await runner.run(\n runId,\n options.initialData ?? {},\n {},\n options.streamTokens ?? false\n )) as unknown as GraphState;\n const governed = await fileApprovalRequests(\n definition,\n state,\n runId,\n options.approvalEngine,\n options.subgraphs\n );\n return {\n state: governed,\n status: governed.status,\n usedRustEngine: true,\n replayJournal: runner.recordedJournal(),\n entryState: runner.recordedEntryState(),\n pendingApprovals: runner.pendingApprovals()\n };\n};\n\n/**\n * Resume a previously-suspended catalog run (e.g. past a human gate) from its\n * serialized {@link GraphState}, on the **Rust engine**. The bridge seeds its\n * checkpointer with this state and resumes from it.\n *\n * With an `approvalEngine`, the resume first checks the engine: every request the run\n * waits on must be decided, no human gate may be rejected, and every granted tool must\n * match an approved request. Otherwise it throws {@link ApprovalNotGrantedError} and\n * nothing runs.\n *\n * Throws {@link RustEngineUnavailableError} when the native addon is absent.\n */\nexport const resumeCatalogGraph = async (\n definition: GraphDefinition,\n state: GraphState,\n options: Pick<\n RunCatalogGraphOptions,\n | \"onEvent\"\n | \"approvalEngine\"\n | \"providerKeys\"\n | \"fsPolicy\"\n | \"skills\"\n | \"tools\"\n | \"subgraphs\"\n // ADR 0044: a resumed run is just as cancellable as a fresh one — the run loop it re-enters\n // is the same one, so it polls the same seam at the same node boundaries.\n | \"signal\"\n > & {\n /**\n * Human-granted tools to unlock on resume, each carrying its `{ name, requestedBy,\n * resolvedBy }` provenance. Passed straight through to the Rust bridge, which\n * re-validates the no-self-approval invariant per tool on `Entry::Resume` and writes\n * only the validated names into `__approvedTools`. With an `approvalEngine`, each\n * grant must also match a request the engine records as approved by `resolvedBy`.\n * Omitted/empty: an ordinary resume that unlocks no tools.\n */\n approvedTools?: ApprovedToolWire[];\n } = {}\n): Promise<CatalogRunOutcome> => {\n if (!rustEngineAvailable()) {\n throw new RustEngineUnavailableError();\n }\n if (options.approvalEngine !== undefined) {\n await ensureApprovalsGranted(\n definition,\n state,\n options.approvalEngine,\n options.approvedTools ?? [],\n options.subgraphs\n );\n }\n const runner = tryCreateRustRunner<ChannelValues>(\n assembleParts(\n definition,\n options.approvalEngine !== undefined,\n options.providerKeys,\n options.fsPolicy,\n options.skills,\n // A resumed run needs its host tools again — a tool-using agent past the gate would\n // otherwise silently degrade to stubs (ADR 0041 D1).\n options.tools,\n // A resumed run needs its subgraph definitions again — a subgraph node resuming past\n // its own child's suspension would otherwise fail to resolve `subgraphId` (ADR 0042).\n options.subgraphs\n )\n );\n if (runner === null) {\n throw new RustEngineUnavailableError();\n }\n if (options.onEvent !== undefined) {\n runner.subscribe(options.onEvent);\n }\n // ADR 0044 — same cooperative cancellation seam as `runCatalogGraph`.\n const cancelSignal = options.signal;\n if (cancelSignal !== undefined) {\n runner.cancelWhen(() => cancelSignal.aborted);\n }\n const resumed = (await runner.resume(\n state,\n options.approvedTools ?? []\n )) as unknown as GraphState;\n // A resume can itself hit a NEW approval gate; file requests for that suspension too. The ids\n // stashed for the previous suspension ride along in the state, so drop them when the run now\n // waits on something else — otherwise the new gate would never be filed.\n const governed = await fileApprovalRequests(\n definition,\n suspensionKey(resumed) === suspensionKey(state) ? resumed : withoutApprovalIds(resumed),\n String(resumed.runId) as RunId,\n options.approvalEngine,\n options.subgraphs\n );\n return {\n state: governed,\n status: governed.status,\n usedRustEngine: true,\n replayJournal: runner.recordedJournal()\n };\n};\n\n/**\n * Replay-as-evidence (ADR 0038): re-execute a recorded catalog run from `checkpointId`, re-feeding\n * its `replayJournal` (LLM outputs + timestamps from a record-mode {@link runCatalogGraph}) on the\n * Rust engine so the re-derivation is deterministic. A forked, READ-ONLY run — it never files\n * approval requests or opens gates. Returns the replayed state; the caller compares its governed\n * decisions to the attested chain via {@link verifyReplayDecisions}. Requires a native addon with\n * replay support (`engineReplay`); throws otherwise.\n */\nexport const replayCatalogGraph = async (\n definition: GraphDefinition,\n state: GraphState,\n checkpointId: string,\n replayJournal: string,\n options: Pick<\n RunCatalogGraphOptions,\n \"onEvent\" | \"providerKeys\" | \"fsPolicy\" | \"skills\" | \"subgraphs\"\n > = {}\n): Promise<CatalogRunOutcome> => {\n if (!rustEngineAvailable()) {\n throw new RustEngineUnavailableError();\n }\n // No approval engine on replay — it is read-only EVIDENCE and must never open a new gate.\n // No host tools either (ADR 0041): a replay must never RE-EXECUTE a tool — bound names degrade\n // to stubs until E2 re-serves recorded tool results from the journal.\n // Subgraphs (ADR 0042/0043 D3): a replayed subgraph node recurses via `execute_subgraph` exactly\n // like a normal run, re-feeding each child's own LLM calls from the SAME journal. This depends on\n // the journal being able to tell a parent's calls apart from a concurrent child's — which ADR 0043\n // D1 (LlmRequest.run_id, tagged with the deterministic `{run_id}:{node_id}[:{index}]` convention)\n // + D2 (ReplayGateway's existing request-equality match now discriminates by run_id for free) +\n // the fork-invariant fix (a replay's forked run_id is normalized back to the record run_id before\n // tagging) now provide. Previously this option was dropped here (`undefined`) specifically because\n // that proof didn't exist yet; a `subgraphId` node with no `subgraphs` supplied still fails loudly\n // (`SubgraphNotFound`) rather than silently diverging.\n const runner = tryCreateRustRunner<ChannelValues>(\n assembleParts(\n definition,\n false,\n options.providerKeys,\n options.fsPolicy,\n options.skills,\n undefined,\n options.subgraphs\n )\n );\n if (runner === null) {\n throw new RustEngineUnavailableError();\n }\n if (options.onEvent !== undefined) {\n runner.subscribe(options.onEvent);\n }\n const replayed = (await runner.replay(\n state,\n checkpointId,\n replayJournal\n )) as unknown as GraphState;\n // The replay re-suspends at the first gate (no approvals seeded): `pendingApprovals` are the\n // subjects the deterministic re-execution requested — what verify-replay compares to the chain.\n return {\n state: replayed,\n status: replayed.status,\n usedRustEngine: true,\n pendingApprovals: runner.pendingApprovals()\n };\n};\n\n/** One approval request the seam files, normalized to the `{ description }` subject. */\ntype SurfacedApprovalRequest = { subject: { description: string } };\n\n/**\n * Normalize one surfaced `approvalRequests` entry's subject to `{ description }`. The\n * Rust agent emits a FLAT string subject (`\"tool:<name>\"`, see agents-core\n * `ApprovalRequestItem`); the TS handler emits a `{ description: \"tool:<name>\" }`\n * object. Accept both, returning `undefined` for anything else.\n */\nconst normalizeSubject = (request: unknown): SurfacedApprovalRequest | undefined => {\n if (!isRecord(request)) {\n return undefined;\n }\n const subject = (request as { subject?: unknown }).subject;\n if (typeof subject === \"string\") {\n return { subject: { description: subject } };\n }\n if (isRecord(subject) && typeof (subject as { description?: unknown }).description === \"string\") {\n return { subject: { description: (subject as { description: string }).description } };\n }\n return undefined;\n};\n\n/** Read + normalize an agent output channel's `approvalRequests` off a channel bag. */\nconst readApprovalRequests = (\n channels: Record<string, unknown>,\n outputChannel: string\n): SurfacedApprovalRequest[] => {\n const channel = channels[outputChannel];\n if (channel === null || typeof channel !== \"object\") {\n return [];\n }\n const requests = (channel as { approvalRequests?: unknown }).approvalRequests;\n if (!Array.isArray(requests)) {\n return [];\n }\n return requests\n .map(normalizeSubject)\n .filter((request): request is SurfacedApprovalRequest => request !== undefined);\n};\n\n/**\n * Read a subgraph node's child run id off `__subgraphRuns[nodeId]` (recorded by the\n * engine once the child has actually started), falling back to the same deterministic\n * `<runId>:<nodeId>` the Rust bridge computes (`subgraph_run_id`, `runtime.rs`) for a\n * child that hasn't recorded one yet (e.g. still on its first, not-yet-suspended pass).\n */\nconst readSubgraphRunId = (\n channels: Record<string, unknown>,\n runId: string,\n nodeId: string\n): string => {\n const runs = channels[SUBGRAPH_RUNS_CHANNEL];\n if (isRecord(runs)) {\n const existing = runs[nodeId];\n if (typeof existing === \"string\") {\n return existing;\n }\n }\n return `${runId}:${nodeId}`;\n};\n\n/** Read a child run's round-trip snapshot off `__subgraphStates[childRunId]`, if present. */\nconst readSubgraphChildState = (\n channels: Record<string, unknown>,\n childRunId: string\n): { channels: Record<string, unknown>; status: unknown; currentNodeId: unknown } | undefined => {\n const states = channels[SUBGRAPH_STATES_CHANNEL];\n if (!isRecord(states)) {\n return undefined;\n }\n const child = states[childRunId];\n if (!isRecord(child) || !isRecord(child.channels)) {\n return undefined;\n }\n return { channels: child.channels, status: child.status, currentNodeId: child.currentNodeId };\n};\n\n/**\n * Subject prefix for a `human-gate` node's own {@link ApprovalEngine} request (issue\n * #496), distinct from {@link TOOL_SUBJECT_PREFIX}-style tool subjects an agent files —\n * the control plane uses this to tell a rejected GATE apart from a rejected TOOL when\n * deciding whether a run becomes `\"rejected\"` (a tool rejection just leaves a tool\n * unlocked; a gate rejection must block `resume()` outright).\n */\nexport const GATE_SUBJECT_PREFIX = \"gate:\";\n\n/**\n * File one {@link ApprovalEngine} request for a suspended `human-gate` node, if the\n * node at `currentNodeId` is one — a structural gate has no `approvalRequests` payload\n * of its own (unlike an agent's gated tool call), so this reads the node type directly\n * rather than a channel. Returns 0 or 1 created ids (a run/child suspends at exactly one\n * node at a time).\n */\nconst fileGateRequestIfSuspended = async (\n nodes: GraphDefinition[\"nodes\"],\n currentNodeId: unknown,\n runId: RunId,\n idPrefix: string,\n engine: ApprovalEngine\n): Promise<string[]> => {\n const node = nodes.find(\n (candidate) => String(candidate.id) === String(currentNodeId) && candidate.type === \"human-gate\"\n );\n if (node === undefined) {\n return [];\n }\n const created = await engine.request({\n runId,\n nodeId: `${idPrefix}${String(node.id)}` as NodeId,\n requestedBy: `${idPrefix}${String(node.id)}`,\n subject: { description: `${GATE_SUBJECT_PREFIX}${idPrefix}${String(node.id)}` }\n });\n return [String(created.id)];\n};\n\n/**\n * File one {@link ApprovalEngine} request per gated tool surfaced by ONE graph's own\n * agent nodes (the top-level run, or — recursively — one direct child's own nodes),\n * reading from `channels` (the run's own `state.channels`, or a child's nested\n * `__subgraphStates[childRunId].channels`). `runId` is the run this request is genuinely\n * FILED under — the top-level run's own id for a top-level node, or the CHILD's own\n * deterministic run id for a child's node (never the parent's — a request filed under\n * the wrong runId is not attributable to the run that actually raised it: a later\n * `ApprovalEngine.getPending(childRunId)`/`loadAttestationChain(childRunId)` must find\n * it). `idPrefix` (empty for the top level; `\"<childRunId>:\"` for a child) only\n * qualifies `nodeId`/`requestedBy` for human-readability — it is not what makes the\n * request child-attributable; `runId` is.\n */\nconst fileForGraphNodes = async (\n nodes: GraphDefinition[\"nodes\"],\n channels: Record<string, unknown>,\n runId: RunId,\n idPrefix: string,\n engine: ApprovalEngine\n): Promise<string[]> => {\n const ids: string[] = [];\n for (const node of nodes) {\n const agent = readAgentCarrier(node.metadata);\n if (agent === undefined) {\n continue;\n }\n const outputChannel = agent.outputChannel ?? DEFAULT_AGENT_OUTPUT_CHANNEL;\n for (const request of readApprovalRequests(channels, outputChannel)) {\n const created = await engine.request({\n runId,\n nodeId: `${idPrefix}${String(node.id)}` as NodeId,\n requestedBy: `${idPrefix}${String(node.id)}`,\n subject: request.subject\n });\n ids.push(String(created.id));\n }\n }\n return ids;\n};\n\n/**\n * File one {@link ApprovalEngine} request per gated tool surfaced by a suspended\n * catalog run, and stash the returned ids in the `__approvalIds` channel of the\n * returned state — mirroring the TS `createAgentNodeHandler` emission pattern\n * (`requestedBy = nodeId`, the agent's own subject). The agent is the requester; a\n * human (a different principal) resolves it out of band, which the engine enforces.\n *\n * ADR 0042 (product ADR 0068 D5.4, ailu-engine#177): also recurses into a DIRECT\n * child's own nodes when that child itself suspended for approval — `execute_subgraph`\n * propagates the child's suspension to the parent, but the child's own\n * `approvalRequests` live in its nested `__subgraphStates[childRunId].channels`\n * snapshot, invisible to the top-level walk alone. Scoped identically to D5.3's own\n * run-gate injection: a single, non-fan-out `subgraphId` reference only (a\n * deterministic `<runId>:<nodeId>` child id exists for that case); a nested subgraph\n * inside that child, or `mapSubgraph`'s dynamic N-child fan-out, is NOT walked here —\n * same \"no precomputable id at this point\" reasoning D5 already established, left for a\n * follow-up rather than expanding this fix's scope.\n *\n * ADR 0068 issue #496: also files ONE request when the suspended node itself is a\n * `human-gate` (top-level or a direct child's own) — `execute_node` suspends a\n * `human-gate` unconditionally, with NO `ApprovalEngine` involvement of its own kind\n * (unlike an agent's `suspendForApproval`, it carries no `approvalRequests` payload).\n * Without this, `ensureNoPendingApprovals` (the control plane's ONLY resume gate) sees\n * nothing pending and a `human-gate` — including D5.3's own injected `__run_gate` node —\n * delays a resume but never actually authorizes one.\n *\n * No-ops (returns the state unchanged) when no engine is given or the run is not\n * suspended. Idempotency: a run that already carries stashed ids (a state that was\n * governed once) is skipped entirely, so re-driving a suspended state does not\n * double-file — for the parent's own gate, a child's, or a human-gate node.\n */\n/** What a suspended run waits on: its node and the approval subjects its agents requested. */\nconst suspensionKey = (state: GraphState): string => {\n if (state.status !== \"suspended\") return \"\";\n const subjects: string[] = [];\n for (const value of Object.values(state.channels as Record<string, unknown>)) {\n const requests = (value as { approvalRequests?: unknown } | null)?.approvalRequests;\n if (!Array.isArray(requests)) continue;\n for (const request of requests) {\n subjects.push(JSON.stringify((request as { subject?: unknown } | null)?.subject ?? null));\n }\n }\n return `${String(state.currentNodeId)}|${subjects.sort().join(\",\")}`;\n};\n\nconst withoutApprovalIds = (state: GraphState): GraphState => ({\n ...state,\n channels: { ...(state.channels as Record<string, unknown>), [APPROVAL_IDS_CHANNEL]: [] }\n});\n\nconst fileApprovalRequests = async (\n definition: GraphDefinition,\n state: GraphState,\n runId: RunId,\n engine: ApprovalEngine | undefined,\n subgraphs: GraphDefinition[] | undefined\n): Promise<GraphState> => {\n if (engine === undefined || state.status !== \"suspended\") {\n return state;\n }\n const channels = { ...(state.channels as Record<string, unknown>) };\n const alreadyStashed = Array.isArray(channels[APPROVAL_IDS_CHANNEL])\n ? (channels[APPROVAL_IDS_CHANNEL] as unknown[]).length > 0\n : false;\n if (alreadyStashed) {\n return state;\n }\n\n const ids = await fileForGraphNodes(definition.nodes, channels, runId, \"\", engine);\n ids.push(\n ...(await fileGateRequestIfSuspended(definition.nodes, state.currentNodeId, runId, \"\", engine))\n );\n\n const subgraphsById = new Map((subgraphs ?? []).map((subgraph) => [subgraph.id, subgraph]));\n for (const node of definition.nodes) {\n if (node.type !== \"subgraph\" || node.subgraphId === undefined || node.mapSubgraph !== undefined) {\n // Not a direct single-child subgraph reference — mapSubgraph fan-out and\n // anything without a resolvable subgraphId are out of scope here (see doc above).\n continue;\n }\n const child = subgraphsById.get(node.subgraphId);\n if (child === undefined) {\n continue;\n }\n const childRunId = readSubgraphRunId(channels, String(runId), String(node.id));\n const childState = readSubgraphChildState(channels, childRunId);\n if (childState === undefined || childState.status !== \"suspended\") {\n continue;\n }\n const idPrefix = `${childRunId}:`;\n ids.push(\n ...(await fileForGraphNodes(\n child.nodes,\n childState.channels,\n childRunId as RunId,\n idPrefix,\n engine\n )),\n ...(await fileGateRequestIfSuspended(\n child.nodes,\n childState.currentNodeId,\n childRunId as RunId,\n idPrefix,\n engine\n ))\n );\n }\n\n if (ids.length === 0) {\n return state;\n }\n return { ...state, channels: { ...channels, [APPROVAL_IDS_CHANNEL]: ids } };\n};\n\nconst TOOL_SUBJECT_PREFIX = \"tool:\";\n\nconst subjectOf = (request: ApprovalRequest): string =>\n \"description\" in request.subject && typeof request.subject.description === \"string\"\n ? request.subject.description\n : \"\";\n\n/**\n * An {@link ApprovalEngine} that records nothing: it tells whether a suspended state waits on\n * approvals ({@link fileApprovalRequests} would file one) without touching the real engine.\n */\nconst dryRunEngine = (): ApprovalEngine => {\n let next = 0;\n const unused = (): never => {\n throw new Error(\"dry-run approval engine\");\n };\n return {\n request: async (params) =>\n ({\n ...params,\n id: `dry-${next++}` as ApprovalId,\n status: \"pending\",\n createdAt: new Date(0)\n }) as ApprovalRequest,\n approve: async () => unused(),\n reject: async () => unused(),\n getPending: async () => [],\n getById: async () => undefined\n };\n};\n\n/**\n * Refuse a governed resume the engine has not authorized: a request the run waits on is still\n * pending or unknown, a human gate was rejected, a granted tool has no matching approved request,\n * or the state comes from a run started without the engine (its approvals were never recorded).\n */\nconst ensureApprovalsGranted = async (\n definition: GraphDefinition,\n state: GraphState,\n engine: ApprovalEngine,\n approvedTools: ApprovedToolWire[],\n subgraphs: GraphDefinition[] | undefined\n): Promise<void> => {\n if (state.status !== \"suspended\") {\n return;\n }\n const runId = String(state.runId);\n const stashed = (state.channels as Record<string, unknown>)[APPROVAL_IDS_CHANNEL];\n const ids = Array.isArray(stashed) ? stashed.map(String) : [];\n if (ids.length === 0) {\n const waitsOnApproval = await fileApprovalRequests(\n definition,\n state,\n state.runId,\n dryRunEngine(),\n subgraphs\n );\n if (waitsOnApproval !== state) {\n throw new ApprovalNotGrantedError(runId, [\n \"the run waits on an approval that was never recorded: start it with the same approvalEngine\"\n ]);\n }\n return;\n }\n\n const problems: string[] = [];\n const approvedToolRequests: ApprovalRequest[] = [];\n for (const id of ids) {\n const request = await engine.getById(id as ApprovalId);\n if (request === undefined) {\n problems.push(`request ${id} is unknown to the approval engine`);\n continue;\n }\n const subject = subjectOf(request);\n if (request.status === \"pending\") {\n problems.push(`request ${id} (${subject}) is still pending`);\n } else if (request.status === \"rejected\" && subject.startsWith(GATE_SUBJECT_PREFIX)) {\n problems.push(`request ${id} (${subject}) was rejected by ${request.resolvedBy ?? \"a reviewer\"}`);\n } else if (request.status === \"approved\" && subject.startsWith(TOOL_SUBJECT_PREFIX)) {\n approvedToolRequests.push(request);\n }\n }\n for (const grant of approvedTools) {\n const match = approvedToolRequests.some(\n (request) =>\n subjectOf(request) === `${TOOL_SUBJECT_PREFIX}${grant.name}` &&\n request.resolvedBy === grant.resolvedBy\n );\n if (!match) {\n problems.push(\n `tool '${grant.name}' has no request approved by '${grant.resolvedBy}' in the approval engine`\n );\n }\n }\n if (problems.length > 0) {\n throw new ApprovalNotGrantedError(runId, problems);\n }\n};\n\n/** Type guard a node carries either catalog carrier. Useful to decide the run path. */\nexport const isCatalogGraph = (definition: GraphDefinition): boolean =>\n definition.nodes.some(\n (node) =>\n readComponentCarrier(node.metadata) !== undefined ||\n readAgentCarrier(node.metadata) !== undefined\n );\n","//! Replay-as-evidence (ADR 0038): the FAITHFULNESS check — does a deterministic replay reproduce\n//! the SAME governed decisions the run was attested for?\n//!\n//! This is deliberately SEPARATE from `verifyChain` (the tamper-evidence check over the Ed25519\n//! hash-chained attestation). Two independent guarantees:\n//! - `verifyChain` — the attested records were not altered (tamper-evidence).\n//! - `verifyReplayDecisions` — the signed decisions are the ones the run reproduces (faithfulness).\n//!\n//! A decision is its `{ status, subject }`. The caller derives `subject` the SAME way the\n//! attestation does (the description, else canonical JSON of the subject) for both sides, so this\n//! helper is a pure ordered-equivalence over strings — it does NOT re-derive subjects or touch\n//! crypto. `decidedAt` / `resolvedBy` / `approvalId` are intentionally NOT compared: they are\n//! wall-clock / human / random facts a re-execution cannot (and should not) reproduce.\n\n/** One governance decision, reduced to what a replay can faithfully reproduce. */\nexport type ReplayDecision = {\n /** `\"approved\" | \"rejected\"`. */\n status: string;\n /** The decision subject, derived identically to the attestation (`description || canonicalJson`). */\n subject: string;\n};\n\n/** The result of comparing the attested decisions to the replayed ones, in order. */\nexport type VerifyReplayResult = {\n /** True iff every attested decision is reproduced, in the same order, by the replay. */\n ok: boolean;\n attested: ReplayDecision[];\n replayed: ReplayDecision[];\n /** Per-position divergences (missing on either side, or a status/subject differs). */\n mismatches: { index: number; attested?: ReplayDecision; replayed?: ReplayDecision }[];\n};\n\n/**\n * Compare the ordered `{ status, subject }` decision sets of the attested chain and a replayed run.\n * Order matters (a dropped, reordered, or status-flipped decision is a mismatch). Pure + crypto-free.\n */\nexport const verifyReplayDecisions = (\n attested: ReplayDecision[],\n replayed: ReplayDecision[]\n): VerifyReplayResult => {\n const mismatches: VerifyReplayResult[\"mismatches\"] = [];\n const length = Math.max(attested.length, replayed.length);\n for (let index = 0; index < length; index += 1) {\n const a = attested[index];\n const r = replayed[index];\n if (a === undefined || r === undefined || a.status !== r.status || a.subject !== r.subject) {\n mismatches.push({ index, attested: a, replayed: r });\n }\n }\n return { ok: mismatches.length === 0, attested, replayed, mismatches };\n};\n","import type { AgentResult } from \"@ailu-ai/agents-core\";\n\n/**\n * The final answer of an agent run: the text after the last `final:` marker in its `reasoning`\n * (the whole `reasoning` when there is no marker). An empty string for a missing result.\n *\n * ```ts\n * const out = await app.run({ question: \"What is a checkpoint?\" });\n * console.log(finalAnswer(out.channels.agentResult));\n * ```\n *\n * For a typed answer, run the agent with a `structuredOutput` middleware and read\n * `result.structuredOutput` instead.\n */\nexport const finalAnswer = (result: Pick<AgentResult, \"reasoning\"> | undefined): string => {\n const reasoning = result?.reasoning ?? \"\";\n const marker = reasoning.toLowerCase().lastIndexOf(\"final:\");\n return (marker === -1 ? reasoning : reasoning.slice(marker + \"final:\".length)).trim();\n};\n","import type { ApprovalId } from \"./types.js\";\n\nexport class ApprovalSelfApprovalError extends Error {\n public constructor(approvalId: ApprovalId) {\n super(`Self-approval is forbidden for approval '${String(approvalId)}'.`);\n this.name = \"ApprovalSelfApprovalError\";\n }\n}\n\nexport class ApprovalAlreadyResolvedError extends Error {\n public constructor(approvalId: ApprovalId) {\n super(`Approval '${String(approvalId)}' has already been resolved.`);\n this.name = \"ApprovalAlreadyResolvedError\";\n }\n}\n\nexport class ApprovalNotFoundError extends Error {\n public constructor(approvalId: ApprovalId) {\n super(`Approval '${String(approvalId)}' was not found.`);\n this.name = \"ApprovalNotFoundError\";\n }\n}\n","import type { RunId } from \"@ailu-ai/graph-core\";\n\nimport type { ApprovalEngine, RequestApprovalParams } from \"./interfaces.js\";\nimport type { ApprovalId, ApprovalRequest } from \"./types.js\";\nimport {\n ApprovalAlreadyResolvedError,\n ApprovalNotFoundError,\n ApprovalSelfApprovalError\n} from \"./errors.js\";\n\nconst createApprovalId = (): ApprovalId =>\n `approval-${Date.now()}-${Math.random().toString(36).slice(2, 8)}` as ApprovalId;\n\nexport class InMemoryApprovalEngine implements ApprovalEngine {\n private readonly approvals = new Map<ApprovalId, ApprovalRequest>();\n\n public async request(params: RequestApprovalParams): Promise<ApprovalRequest> {\n const approval: ApprovalRequest = {\n id: createApprovalId(),\n runId: params.runId,\n nodeId: params.nodeId,\n requestedBy: params.requestedBy,\n subject: params.subject,\n status: \"pending\",\n createdAt: new Date(),\n tenantId: params.tenantId\n };\n\n this.approvals.set(approval.id, approval);\n return approval;\n }\n\n public async approve(id: ApprovalId, resolvedBy: string): Promise<ApprovalRequest> {\n const approval = this.getOrThrow(id);\n this.ensureCanResolve(approval, resolvedBy);\n\n const resolved: ApprovalRequest = {\n ...approval,\n status: \"approved\",\n resolvedBy,\n resolvedAt: new Date(),\n rejectionReason: undefined\n };\n\n this.approvals.set(id, resolved);\n return resolved;\n }\n\n public async reject(id: ApprovalId, resolvedBy: string, reason: string): Promise<ApprovalRequest> {\n const approval = this.getOrThrow(id);\n this.ensureCanResolve(approval, resolvedBy);\n\n const resolved: ApprovalRequest = {\n ...approval,\n status: \"rejected\",\n resolvedBy,\n resolvedAt: new Date(),\n rejectionReason: reason\n };\n\n this.approvals.set(id, resolved);\n return resolved;\n }\n\n public async getPending(runId?: RunId): Promise<ApprovalRequest[]> {\n const pending = [...this.approvals.values()].filter((approval) => approval.status === \"pending\");\n if (runId === undefined) {\n return pending;\n }\n\n return pending.filter((approval) => approval.runId === runId);\n }\n\n public async getById(id: ApprovalId): Promise<ApprovalRequest | undefined> {\n return this.approvals.get(id);\n }\n\n private getOrThrow(id: ApprovalId): ApprovalRequest {\n const approval = this.approvals.get(id);\n if (approval === undefined) {\n throw new ApprovalNotFoundError(id);\n }\n\n return approval;\n }\n\n private ensureCanResolve(approval: ApprovalRequest, resolvedBy: string): void {\n if (approval.status !== \"pending\") {\n throw new ApprovalAlreadyResolvedError(approval.id);\n }\n\n if (approval.requestedBy === resolvedBy) {\n throw new ApprovalSelfApprovalError(approval.id);\n }\n }\n}\n","import {\n createHash,\n generateKeyPairSync,\n sign as cryptoSign,\n verify as cryptoVerify,\n type KeyObject\n} from \"node:crypto\";\n\nimport type { ApprovalRequest } from \"./types.js\";\n\n/**\n * Tamper-evident attestation of approval decisions.\n *\n * Each resolved approval is hashed (over a canonical, key-sorted view) and signed\n * with Ed25519. Records are chained — every signature covers the previous record's\n * hash — so neither a single field nor the ordering of decisions can be altered\n * after the fact without breaking verification. This is the audit primitive a\n * regulated environment needs: \"what did the agents do, and who approved it\" becomes\n * cryptographically verifiable.\n */\nexport type AttestationView = {\n approvalId: string;\n runId: string;\n status: \"approved\" | \"rejected\";\n resolvedBy: string;\n subject: string;\n decidedAt: string;\n};\n\nexport type AttestationRecord = AttestationView & {\n algorithm: \"ed25519\";\n /** SHA-256 (hex) of the canonical {@link AttestationView}. */\n payloadHash: string;\n /** Previous record's `payloadHash`, linking the chain. `null` for the first. */\n prevHash: string | null;\n /** Base64 SPKI/DER public key that verifies `signature`. */\n publicKey: string;\n /** Base64 Ed25519 signature over the chain hash. */\n signature: string;\n};\n\n/** Deterministic JSON: object keys sorted recursively so the hash is stable. */\nexport const canonicalJson = (value: unknown): string => {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value) ?? \"null\";\n }\n if (Array.isArray(value)) {\n return `[${value.map((entry) => canonicalJson(entry)).join(\",\")}]`;\n }\n const record = value as Record<string, unknown>;\n const body = Object.keys(record)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`)\n .join(\",\");\n return `{${body}}`;\n};\n\nconst sha256Hex = (input: string): string => createHash(\"sha256\").update(input).digest(\"hex\");\n\n/** Hash of the decision payload — changes if any attested field changes. */\nexport const hashAttestationView = (view: AttestationView): string => sha256Hex(canonicalJson(view));\n\n/** The value actually signed: binds the payload to its position in the chain. */\nconst chainHash = (payloadHash: string, prevHash: string | null): string =>\n sha256Hex(`${prevHash ?? \"\"}:${payloadHash}`);\n\nconst toView = (request: ApprovalRequest): AttestationView => {\n if (request.status === \"pending\") {\n throw new Error(`Cannot attest a pending approval '${String(request.id)}'.`);\n }\n const subject =\n \"description\" in request.subject && typeof request.subject.description === \"string\"\n ? request.subject.description\n : canonicalJson(request.subject);\n return {\n approvalId: String(request.id),\n runId: String(request.runId),\n status: request.status,\n resolvedBy: request.resolvedBy ?? \"unknown\",\n subject,\n decidedAt: (request.resolvedAt ?? request.createdAt).toISOString()\n };\n};\n\n/** Signs approval decisions with an Ed25519 key pair. */\nexport class Ed25519Attestor {\n private readonly privateKey: KeyObject;\n private readonly publicKeyB64: string;\n\n public constructor(keys?: { privateKey: KeyObject; publicKey: KeyObject }) {\n const pair = keys ?? generateKeyPairSync(\"ed25519\");\n this.privateKey = pair.privateKey;\n this.publicKeyB64 = pair.publicKey.export({ type: \"spki\", format: \"der\" }).toString(\"base64\");\n }\n\n /** Sign a resolved approval, chaining it after `prevHash`. */\n public attest(request: ApprovalRequest, prevHash: string | null = null): AttestationRecord {\n const view = toView(request);\n const payloadHash = hashAttestationView(view);\n const signature = cryptoSign(null, Buffer.from(chainHash(payloadHash, prevHash)), this.privateKey);\n return {\n ...view,\n algorithm: \"ed25519\",\n payloadHash,\n prevHash,\n publicKey: this.publicKeyB64,\n signature: signature.toString(\"base64\")\n };\n }\n}\n\n/** Verify a single record: its payload hash is intact and the signature is valid. */\nexport const verifyAttestation = (record: AttestationRecord): boolean => {\n const view: AttestationView = {\n approvalId: record.approvalId,\n runId: record.runId,\n status: record.status,\n resolvedBy: record.resolvedBy,\n subject: record.subject,\n decidedAt: record.decidedAt\n };\n if (hashAttestationView(view) !== record.payloadHash) {\n return false;\n }\n const publicKey = {\n key: Buffer.from(record.publicKey, \"base64\"),\n type: \"spki\" as const,\n format: \"der\" as const\n };\n return cryptoVerify(\n null,\n Buffer.from(chainHash(record.payloadHash, record.prevHash)),\n publicKey,\n Buffer.from(record.signature, \"base64\")\n );\n};\n\n/** Verify a full chain: every record valid and correctly linked to its predecessor. */\nexport const verifyChain = (records: AttestationRecord[]): boolean => {\n let prev: string | null = null;\n for (const record of records) {\n if (record.prevHash !== prev) {\n return false;\n }\n if (!verifyAttestation(record)) {\n return false;\n }\n prev = record.payloadHash;\n }\n return true;\n};\n","import type { NodeId, RunId } from \"@ailu-ai/graph-core\";\n\nexport type ArtifactId = string & { readonly __brand: \"ArtifactId\" };\nexport type ArtifactVersion = number;\n\nexport const ARTIFACT_MEDIA_TYPES = [\n \"application/json\",\n \"text/plain\",\n \"text/markdown\",\n \"application/octet-stream\"\n] as const;\nexport type ArtifactMediaType = (typeof ARTIFACT_MEDIA_TYPES)[number];\n\nexport type Artifact = {\n id: ArtifactId;\n runId: RunId;\n nodeId: NodeId;\n name: string;\n mediaType: ArtifactMediaType;\n version: ArtifactVersion;\n content: unknown;\n createdAt: Date;\n metadata?: Record<string, unknown>;\n};\n\nexport type ArtifactRef = {\n id: ArtifactId;\n version: ArtifactVersion;\n};\n","import type { RunId } from \"@ailu-ai/graph-core\";\n\nimport type { ArtifactStore } from \"./interfaces.js\";\nimport type { Artifact, ArtifactId, ArtifactVersion } from \"./types.js\";\n\ntype ArtifactWriteInput = Omit<Artifact, \"id\" | \"version\" | \"createdAt\">;\ntype ArtifactKey = `${string}:${string}`;\n\nconst makeKey = (runId: RunId, name: string): ArtifactKey => `${String(runId)}:${name}`;\nconst createArtifactId = (runId: RunId, name: string): ArtifactId =>\n `${String(runId)}:${name}` as ArtifactId;\n\nexport class InMemoryArtifactStore implements ArtifactStore {\n private readonly artifactsById = new Map<ArtifactId, Artifact[]>();\n private readonly latestIdByRunAndName = new Map<ArtifactKey, ArtifactId>();\n\n public async write(artifact: ArtifactWriteInput): Promise<Artifact> {\n const key = makeKey(artifact.runId, artifact.name);\n const artifactId = this.latestIdByRunAndName.get(key) ?? createArtifactId(artifact.runId, artifact.name);\n const versions = this.artifactsById.get(artifactId) ?? [];\n const nextVersion = (versions.at(-1)?.version ?? 0) + 1;\n\n const nextArtifact: Artifact = {\n ...artifact,\n id: artifactId,\n version: nextVersion,\n createdAt: new Date()\n };\n\n versions.push(nextArtifact);\n this.artifactsById.set(artifactId, versions);\n this.latestIdByRunAndName.set(key, artifactId);\n\n return nextArtifact;\n }\n\n public async read(id: ArtifactId): Promise<Artifact | undefined> {\n return this.artifactsById.get(id)?.at(-1);\n }\n\n public async readVersion(\n id: ArtifactId,\n version: ArtifactVersion\n ): Promise<Artifact | undefined> {\n return this.artifactsById.get(id)?.find((artifact) => artifact.version === version);\n }\n\n public async listByRun(runId: RunId): Promise<Artifact[]> {\n const runArtifacts: Artifact[] = [];\n for (const versions of this.artifactsById.values()) {\n for (const artifact of versions) {\n if (artifact.runId === runId) {\n runArtifacts.push(artifact);\n }\n }\n }\n\n return runArtifacts;\n }\n\n public async listVersions(id: ArtifactId): Promise<Artifact[]> {\n return [...(this.artifactsById.get(id) ?? [])];\n }\n}\n","import { z } from \"zod\";\n\nimport { ARTIFACT_MEDIA_TYPES } from \"./types.js\";\n\nexport const ArtifactMediaTypeSchema = z.enum(ARTIFACT_MEDIA_TYPES);\n\nexport const ArtifactSchema = z.object({\n id: z.string().min(1).brand<\"ArtifactId\">(),\n runId: z.string().min(1).brand<\"RunId\">(),\n nodeId: z.string().min(1).brand<\"NodeId\">(),\n name: z.string().min(1),\n mediaType: ArtifactMediaTypeSchema,\n version: z.number().int().min(1),\n content: z.unknown(),\n createdAt: z.date(),\n metadata: z.record(z.string(), z.unknown()).optional()\n});\n\nexport const ArtifactRefSchema = z.object({\n id: z.string().min(1).brand<\"ArtifactId\">(),\n version: z.number().int().min(1)\n});\n","import type { VersionedRef } from \"../ast/types\";\n\nconst REF_REGEX = /^([^@]+)@(\\d+\\.\\d+\\.\\d+)$/;\n\nexport const parseVersionedRef = (value: string): VersionedRef | undefined => {\n const match = REF_REGEX.exec(value.trim());\n if (match === null) {\n return undefined;\n }\n const id = match[1];\n const version = match[2];\n if (id === undefined || version === undefined) {\n return undefined;\n }\n return { id, version };\n};\n\nexport const isValidSemver = (version: string): boolean => /^\\d+\\.\\d+\\.\\d+$/.test(version);\n","import type { GraphAst } from \"../ast/types\";\nimport { parseVersionedRef } from \"./ref\";\n\nconst loc = (file: string) => ({ line: 1, col: 1, file });\n\nexport const buildGraphAST = (raw: unknown, file: string): GraphAst => {\n const input = (raw ?? {}) as Record<string, unknown>;\n const nodesRaw = Array.isArray(input.nodes) ? input.nodes : [];\n const edgesRaw = Array.isArray(input.edges) ? input.edges : [];\n const channelsRaw =\n input.channels !== null && typeof input.channels === \"object\" && !Array.isArray(input.channels)\n ? (input.channels as Record<string, unknown>)\n : {};\n\n const normalizeReducer = (value: unknown): \"replace\" | \"append\" | \"merge\" => {\n if (value === \"append\" || value === \"merge\" || value === \"replace\") {\n return value;\n }\n return \"replace\";\n };\n const normalizeNodeType = (\n value: unknown\n ): \"action\" | \"agent\" | \"tool\" | \"human-gate\" | \"subgraph\" => {\n if (value === \"agent\" || value === \"tool\" || value === \"human-gate\" || value === \"subgraph\" || value === \"action\") {\n return value;\n }\n return \"action\";\n };\n const normalizeEdgeType = (value: unknown): \"default\" | \"conditional\" =>\n value === \"conditional\" ? \"conditional\" : \"default\";\n\n const channels = Object.entries(channelsRaw).map(([name, definition]) => {\n const def = (definition ?? {}) as Record<string, unknown>;\n return {\n name,\n type: typeof def.type === \"string\" ? def.type : \"unknown\",\n reducer: normalizeReducer(def.reducer),\n default: def.default,\n _loc: loc(file)\n };\n });\n\n const nodes = nodesRaw.map((nodeRaw) => {\n const node = (nodeRaw ?? {}) as Record<string, unknown>;\n const subgraph = typeof node.graph === \"string\" ? parseVersionedRef(node.graph) : undefined;\n return {\n id: typeof node.id === \"string\" ? node.id : \"\",\n type: normalizeNodeType(node.type),\n label: typeof node.label === \"string\" ? node.label : \"\",\n subgraph,\n _loc: loc(file)\n };\n });\n\n const edges = edgesRaw.map((edgeRaw) => {\n const edge = (edgeRaw ?? {}) as Record<string, unknown>;\n const condition = typeof edge.condition === \"string\" ? { value: edge.condition, _loc: loc(file) } : undefined;\n return {\n id: typeof edge.id === \"string\" ? edge.id : \"\",\n from: typeof edge.from === \"string\" ? edge.from : \"\",\n to: typeof edge.to === \"string\" ? edge.to : \"\",\n type: normalizeEdgeType(edge.type),\n condition,\n _loc: loc(file)\n };\n });\n\n return {\n id: typeof input.id === \"string\" ? input.id : \"\",\n version: typeof input.version === \"string\" ? input.version : \"\",\n name: typeof input.name === \"string\" ? input.name : \"\",\n recursionLimit: typeof input.recursionLimit === \"number\" ? input.recursionLimit : undefined,\n entryNodeId: typeof input.entryNodeId === \"string\" ? input.entryNodeId : \"\",\n channels,\n nodes,\n edges,\n _loc: loc(file)\n };\n};\n","import type { GraphAst } from \"../ast/types\";\nimport { isValidSemver } from \"../parser/ref\";\nimport type { Diagnostic } from \"./types\";\n\nconst hasCycle = (ast: GraphAst): boolean => {\n const adj = new Map<string, string[]>();\n for (const node of ast.nodes) {\n adj.set(node.id, []);\n }\n for (const edge of ast.edges) {\n const list = adj.get(edge.from) ?? [];\n list.push(edge.to);\n adj.set(edge.from, list);\n }\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const dfs = (id: string): boolean => {\n if (visiting.has(id)) {\n return true;\n }\n if (visited.has(id)) {\n return false;\n }\n visiting.add(id);\n for (const next of adj.get(id) ?? []) {\n if (dfs(next)) {\n return true;\n }\n }\n visiting.delete(id);\n visited.add(id);\n return false;\n };\n for (const node of ast.nodes) {\n if (dfs(node.id)) {\n return true;\n }\n }\n return false;\n};\n\nexport const validateGraphAST = (ast: GraphAst): Diagnostic[] => {\n const diagnostics: Diagnostic[] = [];\n const nodeIds = new Set(ast.nodes.map((node) => node.id));\n\n if (!nodeIds.has(ast.entryNodeId)) {\n diagnostics.push({\n code: \"ENTRY_NODE_NOT_FOUND\",\n message: `Entry node '${ast.entryNodeId}' does not exist.`,\n loc: ast._loc,\n severity: \"error\"\n });\n }\n\n for (const edge of ast.edges) {\n if (!nodeIds.has(edge.from) || !nodeIds.has(edge.to)) {\n diagnostics.push({\n code: \"EDGE_NODE_NOT_FOUND\",\n message: `Edge '${edge.id}' references unknown nodes.`,\n loc: edge._loc,\n severity: \"error\"\n });\n }\n if (edge.condition !== undefined && edge.condition.value.trim().length === 0) {\n diagnostics.push({\n code: \"EDGE_CONDITION_EMPTY\",\n message: `Edge '${edge.id}' has an empty condition.`,\n loc: edge.condition._loc,\n severity: \"error\"\n });\n }\n }\n\n for (const node of ast.nodes) {\n if (node.type === \"subgraph\") {\n if (node.subgraph === undefined) {\n diagnostics.push({\n code: \"SUBGRAPH_REF_REQUIRED\",\n message: `Subgraph node '${node.id}' requires a graph reference.`,\n loc: node._loc,\n severity: \"error\"\n });\n } else if (!isValidSemver(node.subgraph.version)) {\n diagnostics.push({\n code: \"SUBGRAPH_REF_VERSION_INVALID\",\n message: `Subgraph ref version '${node.subgraph.version}' is invalid semver.`,\n loc: node._loc,\n severity: \"error\"\n });\n }\n }\n }\n\n for (const channel of ast.channels) {\n if (!(channel.reducer === \"replace\" || channel.reducer === \"append\" || channel.reducer === \"merge\")) {\n diagnostics.push({\n code: \"CHANNEL_REDUCER_INVALID\",\n message: `Channel '${channel.name}' has invalid reducer '${String(channel.reducer)}'.`,\n loc: channel._loc,\n severity: \"error\"\n });\n }\n }\n\n if (hasCycle(ast) && ast.recursionLimit === undefined) {\n diagnostics.push({\n code: \"CYCLE_WITHOUT_RECURSION_LIMIT\",\n message: \"Graph contains cycles but recursionLimit is missing.\",\n loc: ast._loc,\n severity: \"warning\"\n });\n }\n\n return diagnostics;\n};\n","import type { GraphDefinition } from \"@ailu-ai/graph-core\";\n\nimport type { GraphAst } from \"../ast/types\";\n\nexport const transformGraph = (ast: GraphAst): GraphDefinition => ({\n id: ast.id as GraphDefinition[\"id\"],\n version: ast.version,\n name: ast.name,\n recursionLimit: ast.recursionLimit,\n entryNodeId: ast.entryNodeId as GraphDefinition[\"entryNodeId\"],\n channels: Object.fromEntries(\n ast.channels.map((channel) => [\n channel.name,\n {\n type: channel.type,\n reducer: channel.reducer,\n default: channel.default\n }\n ])\n ),\n nodes: ast.nodes.map((node) => ({\n id: node.id as GraphDefinition[\"nodes\"][number][\"id\"],\n type: node.type,\n label: node.label,\n subgraphId: node.subgraph?.id as GraphDefinition[\"id\"] | undefined\n })),\n edges: ast.edges.map((edge) => ({\n id: edge.id as GraphDefinition[\"edges\"][number][\"id\"],\n from: edge.from as GraphDefinition[\"nodes\"][number][\"id\"],\n to: edge.to as GraphDefinition[\"nodes\"][number][\"id\"],\n type: edge.type,\n condition: edge.condition?.value\n }))\n});\n","const NOT_RESOLVED: unique symbol = Symbol('NOT_RESOLVED')\nconst MERGE_KEY: unique symbol = Symbol('MERGE_KEY')\n\ntype ScalarRepresent = (data: any) => string\ntype SequenceRepresent = (data: any) => ArrayLike<unknown>\ntype MappingRepresent = (data: any) => Map<unknown, unknown>\n\ntype IdentifyFn = (data: any) => boolean\ntype RepresentTagNameFn = (data: any) => string\n\ninterface ScalarTagDefinition<Result = unknown> {\n tagName: string\n nodeKind: 'scalar'\n implicit: boolean\n matchByTagPrefix: boolean\n // Set of `source.charAt(0)` keys for which `resolve` may succeed (a superset of\n // what it really matches). A key is either a single character or '' (empty\n // source). `null` means \"no constraint, always try\". Used by the composer to\n // dispatch implicit scalars by first character without running every resolver.\n implicitFirstChars: readonly string[] | null\n // `isExplicit` is true for an explicit tag (`!!tag`), false for implicit plain\n // scalar resolution.\n resolve: (source: string, isExplicit: boolean, tagName: string) => Result | typeof NOT_RESOLVED\n identify: IdentifyFn | null\n // A scalar's printed form is text, so `represent` always yields a string. The\n // factory supplies a `String(data)` default when a tag omits it.\n represent: ScalarRepresent\n representTagName: RepresentTagNameFn | null\n}\n\ninterface SequenceTagDefinition<Carrier = unknown, Result = Carrier> {\n tagName: string\n nodeKind: 'sequence'\n implicit: false\n matchByTagPrefix: boolean\n create: (tagName: string) => Carrier\n addItem: (carrier: Carrier, item: unknown, index: number) => void | string\n finalize: (carrier: Carrier) => Result\n carrierIsResult: boolean\n identify: IdentifyFn | null\n represent: SequenceRepresent\n representTagName: RepresentTagNameFn | null\n}\n\ninterface MappingTagDefinition<Carrier = unknown, Result = Carrier> {\n tagName: string\n nodeKind: 'mapping'\n implicit: false\n matchByTagPrefix: boolean\n create: (tagName: string) => Carrier\n // Writes a pair. Returns '' on success, a non-empty error message otherwise\n // (key does not fit the representation, value rejected, ...). Always a string\n // so the hot path never allocates an exception wrapper.\n addPair: (carrier: Carrier, key: unknown, value: unknown) => string\n // Read side, mirrors `Map` — defining a representation means defining how to\n // read it back. `has` is the hot dedup probe (membership without fetching the\n // value); `keys`/`get` are used only on the cold merge path (`<<`).\n has: (carrier: Carrier, key: unknown) => boolean\n keys: (result: Result) => Iterable<unknown>\n get: (result: Result, key: unknown) => unknown\n finalize: (carrier: Carrier) => Result\n carrierIsResult: boolean\n identify: IdentifyFn | null\n represent: MappingRepresent\n representTagName: RepresentTagNameFn | null\n}\n\ntype TagDefinition =\n | ScalarTagDefinition<any>\n | SequenceTagDefinition<any, any>\n | MappingTagDefinition<any, any>\n\ninterface ScalarTagOptions<Result> {\n implicit?: boolean\n matchByTagPrefix?: boolean\n implicitFirstChars?: readonly string[] | null\n resolve: ScalarTagDefinition<Result>['resolve']\n identify?: ScalarTagDefinition<Result>['identify']\n represent?: ScalarTagDefinition<Result>['represent']\n representTagName?: ScalarTagDefinition<Result>['representTagName']\n}\n\ntype RepresentOptions<Container, Canonical, Represent> =\n | {\n identify?: null\n represent?: Represent\n representTagName?: RepresentTagNameFn | null\n }\n | (Container extends Canonical\n ? {\n identify?: IdentifyFn | null\n represent?: Represent\n representTagName?: RepresentTagNameFn | null\n }\n : {\n identify: IdentifyFn\n represent: Represent\n representTagName?: RepresentTagNameFn | null\n })\n\ntype SequenceTagOptions<Carrier, Result = Carrier> = {\n matchByTagPrefix?: boolean\n create: SequenceTagDefinition<Carrier, Result>['create']\n addItem: SequenceTagDefinition<Carrier, Result>['addItem']\n finalize?: SequenceTagDefinition<Carrier, Result>['finalize']\n} & RepresentOptions<Result, ArrayLike<unknown>, SequenceRepresent>\n\ntype MappingTagOptions<Carrier, Result = Carrier> = {\n matchByTagPrefix?: boolean\n create: MappingTagDefinition<Carrier, Result>['create']\n addPair: MappingTagDefinition<Carrier, Result>['addPair']\n has: MappingTagDefinition<Carrier, Result>['has']\n keys: MappingTagDefinition<Carrier, Result>['keys']\n get: MappingTagDefinition<Carrier, Result>['get']\n finalize?: MappingTagDefinition<Carrier, Result>['finalize']\n} & RepresentOptions<Result, Map<unknown, unknown>, MappingRepresent>\n\nfunction defineScalarTag<Result> (tagName: string, options: ScalarTagOptions<Result>): ScalarTagDefinition<Result> {\n return {\n tagName,\n nodeKind: 'scalar',\n implicit: options.implicit ?? false,\n matchByTagPrefix: options.matchByTagPrefix ?? false,\n implicitFirstChars: options.implicitFirstChars ?? null,\n resolve: options.resolve,\n identify: options.identify ?? null,\n represent: options.represent ?? (data => String(data)),\n representTagName: options.representTagName ?? null\n }\n}\n\nfunction defineSequenceTag<Carrier, Result = Carrier> (tagName: string, options: SequenceTagOptions<Carrier, Result>): SequenceTagDefinition<Carrier, Result> {\n const carrierIsResult = options.finalize === undefined\n\n return {\n tagName,\n nodeKind: 'sequence',\n implicit: false,\n matchByTagPrefix: options.matchByTagPrefix ?? false,\n create: options.create,\n addItem: options.addItem,\n finalize: options.finalize ?? (carrier => carrier as unknown as Result),\n carrierIsResult,\n identify: options.identify ?? null,\n represent: options.represent ?? (data => data as ArrayLike<unknown>),\n representTagName: options.representTagName ?? null\n }\n}\n\nfunction defineMappingTag<Carrier, Result = Carrier> (tagName: string, options: MappingTagOptions<Carrier, Result>): MappingTagDefinition<Carrier, Result> {\n const carrierIsResult = options.finalize === undefined\n\n return {\n tagName,\n nodeKind: 'mapping',\n implicit: false,\n matchByTagPrefix: options.matchByTagPrefix ?? false,\n create: options.create,\n addPair: options.addPair,\n has: options.has,\n keys: options.keys,\n get: options.get,\n finalize: options.finalize ?? (carrier => carrier as unknown as Result),\n carrierIsResult,\n identify: options.identify ?? null,\n represent: options.represent ?? (data => data as Map<unknown, unknown>),\n representTagName: options.representTagName ?? null\n }\n}\n\nexport {\n NOT_RESOLVED,\n MERGE_KEY,\n defineScalarTag,\n defineSequenceTag,\n defineMappingTag,\n\n type ScalarTagDefinition,\n type SequenceTagDefinition,\n type MappingTagDefinition,\n type TagDefinition,\n type ScalarTagOptions,\n type SequenceTagOptions,\n type MappingTagOptions,\n type ScalarRepresent,\n type SequenceRepresent,\n type MappingRepresent\n}\n","import { defineScalarTag } from '../../tag.ts'\n\nconst strTag = defineScalarTag('tag:yaml.org,2002:str', {\n resolve: (source) => source,\n identify: (data) => typeof data === 'string'\n})\n\nexport { strTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst NULL_VALUES = ['', '~', 'null', 'Null', 'NULL']\n\nconst nullCoreTag = defineScalarTag('tag:yaml.org,2002:null', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: '' (empty), '~', 'null'/'Null'/'NULL'.\n implicitFirstChars: ['', '~', 'n', 'N'],\n resolve: (source) => {\n if (NULL_VALUES.indexOf(source) !== -1) return null\n\n return NOT_RESOLVED\n },\n identify: (object) => object === null,\n represent: () => 'null'\n})\n\nexport { nullCoreTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst nullJsonTag = defineScalarTag('tag:yaml.org,2002:null', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: null.\n implicitFirstChars: ['n'],\n resolve: (source, isExplicit) => {\n if (source === 'null' || (isExplicit && source === '')) return null\n\n return NOT_RESOLVED\n },\n identify: (object) => object === null,\n represent: () => 'null'\n})\n\nexport { nullJsonTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst NULL_VALUES = ['', '~', 'null', 'Null', 'NULL']\n\nconst nullYaml11Tag = defineScalarTag('tag:yaml.org,2002:null', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: '' (empty), '~', 'null'/'Null'/'NULL'.\n implicitFirstChars: ['', '~', 'n', 'N'],\n resolve: (source) => {\n if (NULL_VALUES.indexOf(source) !== -1) return null\n\n return NOT_RESOLVED\n },\n identify: (object) => object === null,\n represent: () => 'null'\n})\n\nexport { nullYaml11Tag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst TRUE_VALUES = ['true', 'True', 'TRUE']\nconst FALSE_VALUES = ['false', 'False', 'FALSE']\n\nconst boolCoreTag = defineScalarTag('tag:yaml.org,2002:bool', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: true/True/TRUE, false/False/FALSE.\n implicitFirstChars: ['t', 'T', 'f', 'F'],\n resolve: (source) => {\n if (TRUE_VALUES.indexOf(source) !== -1) return true\n if (FALSE_VALUES.indexOf(source) !== -1) return false\n\n return NOT_RESOLVED\n },\n identify: (object) => Object.prototype.toString.call(object) === '[object Boolean]',\n represent: (object) => object ? 'true' : 'false'\n})\n\nexport { boolCoreTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst TRUE_VALUES = ['true']\nconst FALSE_VALUES = ['false']\n\nconst boolJsonTag = defineScalarTag('tag:yaml.org,2002:bool', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: true, false.\n implicitFirstChars: ['t', 'f'],\n resolve: (source) => {\n if (TRUE_VALUES.indexOf(source) !== -1) return true\n if (FALSE_VALUES.indexOf(source) !== -1) return false\n\n return NOT_RESOLVED\n },\n identify: (object) => Object.prototype.toString.call(object) === '[object Boolean]',\n represent: (object) => object ? 'true' : 'false'\n})\n\nexport { boolJsonTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst TRUE_VALUES = ['true', 'True', 'TRUE', 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON']\nconst FALSE_VALUES = ['false', 'False', 'FALSE', 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF']\n\nconst boolYaml11Tag = defineScalarTag('tag:yaml.org,2002:bool', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs.\n implicitFirstChars: ['y', 'Y', 'n', 'N', 't', 'T', 'f', 'F', 'o', 'O'],\n resolve: (source) => {\n if (TRUE_VALUES.indexOf(source) !== -1) return true\n if (FALSE_VALUES.indexOf(source) !== -1) return false\n\n return NOT_RESOLVED\n },\n identify: (object) => Object.prototype.toString.call(object) === '[object Boolean]',\n represent: (object) => object ? 'true' : 'false'\n})\n\nexport { boolYaml11Tag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\n// YAML 1.2 Core schema implicit resolution:\n// [-+]? [0-9]+ | 0o [0-7]+ | 0x [0-9a-fA-F]+\nconst YAML_INTEGER_IMPLICIT_PATTERN = new RegExp(\n // 0o123\n '^(?:0o[0-7]+' +\n // 0x1A\n '|0x[0-9a-fA-F]+' +\n // 12345\n '|[-+]?[0-9]+)$')\n\n// Explicit `!!int` validation is separate from Core implicit resolution.\nconst YAML_INTEGER_EXPLICIT_PATTERN = new RegExp(\n // 0b1010\n '^(?:[-+]?0b[0-1]+' +\n // 0o123\n '|[-+]?0o[0-7]+' +\n // 0x1A\n '|[-+]?0x[0-9a-fA-F]+' +\n // 12345\n '|[-+]?[0-9]+)$')\n\nfunction parseYamlInteger (source: string) {\n let value = source\n let sign = 1\n\n if (value[0] === '-' || value[0] === '+') {\n if (value[0] === '-') sign = -1\n value = value.slice(1)\n }\n\n if (value.startsWith('0b')) return sign * parseInt(value.slice(2), 2)\n if (value.startsWith('0o')) return sign * parseInt(value.slice(2), 8)\n if (value.startsWith('0x')) return sign * parseInt(value.slice(2), 16)\n\n return sign * parseInt(value, 10)\n}\n\nfunction resolveYamlInteger (source: string, isExplicit: boolean) {\n if (isExplicit) {\n if (!YAML_INTEGER_EXPLICIT_PATTERN.test(source)) return NOT_RESOLVED\n } else if (!YAML_INTEGER_IMPLICIT_PATTERN.test(source)) {\n return NOT_RESOLVED\n }\n\n const result = parseYamlInteger(source)\n return Number.isFinite(result) ? result : NOT_RESOLVED\n}\n\nconst intCoreTag = defineScalarTag('tag:yaml.org,2002:int', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: optional sign + decimal digit.\n implicitFirstChars: ['-', '+', ...'0123456789'],\n resolve: resolveYamlInteger,\n identify: (object) =>\n // No ancient boxed numbers support\n Number.isInteger(object) &&\n // Negative zero => !!float\n !Object.is(object, -0) &&\n // Exponential form => !!float, round-trip for !!int 1e21 will be broken\n object.toString(10).indexOf('e') < 0,\n represent: (object: number) => object.toString(10)\n})\n\nexport { intCoreTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\n// YAML 1.2 JSON schema implicit resolution:\n// -? ( 0 | [1-9] [0-9]* )\nconst YAML_INTEGER_IMPLICIT_PATTERN = new RegExp(\n '^-?(?:0|[1-9][0-9]*)$')\n\n// Explicit `!!int` validation is separate from JSON implicit resolution.\nconst YAML_INTEGER_EXPLICIT_PATTERN = new RegExp(\n // 0b1010\n '^(?:[-+]?0b[0-1]+' +\n // 0o123\n '|[-+]?0o[0-7]+' +\n // 0x1A\n '|[-+]?0x[0-9a-fA-F]+' +\n // 12345\n '|[-+]?[0-9]+)$')\n\nfunction parseYamlInteger (source: string) {\n let value = source\n let sign = 1\n\n if (value[0] === '-' || value[0] === '+') {\n if (value[0] === '-') sign = -1\n value = value.slice(1)\n }\n\n if (value.startsWith('0b')) return sign * parseInt(value.slice(2), 2)\n if (value.startsWith('0o')) return sign * parseInt(value.slice(2), 8)\n if (value.startsWith('0x')) return sign * parseInt(value.slice(2), 16)\n\n return sign * parseInt(value, 10)\n}\n\nfunction resolveYamlInteger (source: string, isExplicit: boolean) {\n if (isExplicit) {\n if (!YAML_INTEGER_EXPLICIT_PATTERN.test(source)) return NOT_RESOLVED\n } else if (!YAML_INTEGER_IMPLICIT_PATTERN.test(source)) {\n return NOT_RESOLVED\n }\n\n const result = parseYamlInteger(source)\n return Number.isFinite(result) ? result : NOT_RESOLVED\n}\n\nconst intJsonTag = defineScalarTag('tag:yaml.org,2002:int', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: optional '-' or digit.\n implicitFirstChars: ['-', ...'0123456789'],\n resolve: resolveYamlInteger,\n identify: (object) =>\n // No ancient boxed numbers support\n Number.isInteger(object) &&\n // Negative zero => !!float\n !Object.is(object, -0) &&\n // Exponential form => !!float, round-trip for !!int 1e21 will be broken\n object.toString(10).indexOf('e') < 0,\n represent: (object: number) => object.toString(10)\n})\n\nexport { intJsonTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst YAML_INTEGER_PATTERN = new RegExp(\n // 0b1010\n '^(?:[-+]?0b[0-1_]+' +\n // 0123\n '|[-+]?0[0-7_]+' +\n // 0x1A\n '|[-+]?0x[0-9a-fA-F_]+' +\n // 1:23\n '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+' +\n // 12345\n '|[-+]?(?:0|[1-9][0-9_]*))$')\n\nfunction parseYamlInteger (source: string) {\n let value = source.replace(/_/g, '')\n let sign = 1\n\n if (value[0] === '-' || value[0] === '+') {\n if (value[0] === '-') sign = -1\n value = value.slice(1)\n }\n\n if (value.startsWith('0b')) return sign * parseInt(value.slice(2), 2)\n if (value.startsWith('0x')) return sign * parseInt(value.slice(2), 16)\n\n if (value.includes(':')) {\n let result = 0\n for (const part of value.split(':')) result = result * 60 + Number(part)\n return sign * result\n }\n\n if (value !== '0' && value[0] === '0') return sign * parseInt(value, 8)\n\n return sign * parseInt(value, 10)\n}\n\nfunction resolveYamlInteger (source: string) {\n if (!YAML_INTEGER_PATTERN.test(source)) return NOT_RESOLVED\n\n const result = parseYamlInteger(source)\n return Number.isFinite(result) ? result : NOT_RESOLVED\n}\n\nconst intYaml11Tag = defineScalarTag('tag:yaml.org,2002:int', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: optional sign + decimal digit.\n implicitFirstChars: ['-', '+', ...'0123456789'],\n resolve: resolveYamlInteger,\n identify: (object) =>\n // No ancient boxed numbers support\n Number.isInteger(object) &&\n // Negative zero => !!float\n !Object.is(object, -0) &&\n // Exponential form => !!float, round-trip for !!int 1e21 will be broken\n object.toString(10).indexOf('e') < 0,\n represent: (object: number) => object.toString(10)\n})\n\nexport { intYaml11Tag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?[0-9]+(?:\\\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n '|[-+]?\\\\.[0-9]+(?:[eE][-+]?[0-9]+)?' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$')\n\nconst YAML_FLOAT_SPECIAL_PATTERN = new RegExp(\n '^(?:' +\n // .inf\n '[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$')\n\nfunction resolveYamlFloat (source: string) {\n if (!YAML_FLOAT_PATTERN.test(source)) return NOT_RESOLVED\n\n let value = source.toLowerCase()\n const sign = value[0] === '-' ? -1 : 1\n\n if ('+-'.includes(value[0])) value = value.slice(1)\n\n if (value === '.inf') return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY\n if (value === '.nan') return NaN\n\n const result = sign * parseFloat(value)\n\n if (Number.isFinite(result) || YAML_FLOAT_SPECIAL_PATTERN.test(source)) return result\n return NOT_RESOLVED\n}\n\nfunction representYamlFloat (object: number) {\n if (isNaN(object)) return '.nan'\n if (object === Number.POSITIVE_INFINITY) return '.inf'\n if (object === Number.NEGATIVE_INFINITY) return '-.inf'\n if (Object.is(object, -0)) return '-0.0'\n\n const result = object.toString(10)\n return /^[-+]?[0-9]+e/.test(result) ? result.replace('e', '.e') : result\n}\n\nconst floatCoreTag = defineScalarTag('tag:yaml.org,2002:float', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: optional sign, '.', or digit\n // ('.inf'/'.nan' start with '.').\n implicitFirstChars: ['-', '+', '.', ...'0123456789'],\n resolve: resolveYamlFloat,\n identify: (object) =>\n // No ancient boxed numbers support\n typeof object === 'number' &&\n (\n // We land here all numbers, not handled (declined) by !!int `.identify`\n // The same condition as for !!int, but reversed.\n\n // Filter out integers...\n !Number.isInteger(object) ||\n // but allow negative zero\n Object.is(object, -0) ||\n // and integers with exponential form\n object.toString(10).indexOf('e') >= 0\n ),\n represent: representYamlFloat\n})\n\nexport { floatCoreTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\n// YAML 1.2 JSON schema implicit resolution:\n// -? ( 0 | [1-9] [0-9]* ) ( \\. [0-9]* )? ( [eE] [-+]? [0-9]+ )?\nconst YAML_FLOAT_IMPLICIT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^-?(?:0|[1-9][0-9]*)(?:\\\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$')\n\n// Explicit `!!float` validation is separate from JSON implicit resolution.\nconst YAML_FLOAT_EXPLICIT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?[0-9]+(?:\\\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n '|[-+]?\\\\.[0-9]+(?:[eE][-+]?[0-9]+)?' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$')\n\nfunction resolveYamlFloat (source: string, isExplicit: boolean) {\n if (isExplicit) {\n if (!YAML_FLOAT_EXPLICIT_PATTERN.test(source)) return NOT_RESOLVED\n\n let value = source.toLowerCase()\n const sign = value[0] === '-' ? -1 : 1\n\n if ('+-'.includes(value[0])) value = value.slice(1)\n\n if (value === '.inf') return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY\n if (value === '.nan') return NaN\n\n const result = sign * parseFloat(value)\n return Number.isFinite(result) ? result : NOT_RESOLVED\n }\n\n if (!YAML_FLOAT_IMPLICIT_PATTERN.test(source)) return NOT_RESOLVED\n\n const result = Number(source)\n\n if (Number.isFinite(result)) return result\n return NOT_RESOLVED\n}\n\nfunction representYamlFloat (object: number) {\n if (isNaN(object)) return '.nan'\n if (object === Number.POSITIVE_INFINITY) return '.inf'\n if (object === Number.NEGATIVE_INFINITY) return '-.inf'\n if (Object.is(object, -0)) return '-0.0'\n\n const result = object.toString(10)\n return /^[-+]?[0-9]+e/.test(result) ? result.replace('e', '.e') : result\n}\n\nconst floatJsonTag = defineScalarTag('tag:yaml.org,2002:float', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: optional '-' or digit.\n implicitFirstChars: ['-', ...'0123456789'],\n resolve: resolveYamlFloat,\n identify: (object) =>\n // No ancient boxed numbers support\n typeof object === 'number' &&\n (\n // We land here all numbers, not handled (declined) by !!int `.identify`\n // The same condition as for !!int, but reversed.\n\n // Filter out integers...\n !Number.isInteger(object) ||\n // but allow negative zero\n Object.is(object, -0) ||\n // and integers with exponential form\n object.toString(10).indexOf('e') >= 0\n ),\n represent: representYamlFloat\n})\n\nexport { floatJsonTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?(?:(?:[0-9][0-9_]*)?\\\\.[0-9_]*)(?:[eE][-+][0-9]+)?' +\n // 190:20:30.15\n '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$')\n\nconst YAML_FLOAT_SPECIAL_PATTERN = new RegExp(\n '^(?:' +\n // .inf\n '[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$')\n\nfunction resolveYamlFloat (source: string) {\n if (!YAML_FLOAT_PATTERN.test(source)) return NOT_RESOLVED\n\n let value = source.toLowerCase().replace(/_/g, '')\n const sign = value[0] === '-' ? -1 : 1\n\n if ('+-'.includes(value[0])) value = value.slice(1)\n\n if (value === '.inf') return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY\n if (value === '.nan') return NaN\n\n let result = 0\n\n if (value.includes(':')) {\n for (const part of value.split(':')) result = result * 60 + Number(part)\n result *= sign\n } else {\n result = sign * parseFloat(value)\n }\n\n if (Number.isFinite(result) || YAML_FLOAT_SPECIAL_PATTERN.test(source)) return result\n return NOT_RESOLVED\n}\n\nfunction representYamlFloat (object: number) {\n if (isNaN(object)) return '.nan'\n if (object === Number.POSITIVE_INFINITY) return '.inf'\n if (object === Number.NEGATIVE_INFINITY) return '-.inf'\n if (Object.is(object, -0)) return '-0.0'\n\n const result = object.toString(10)\n return /^[-+]?[0-9]+e/.test(result) ? result.replace('e', '.e') : result\n}\n\nconst floatYaml11Tag = defineScalarTag('tag:yaml.org,2002:float', {\n implicit: true,\n // Superset of source.charAt(0) over all matched inputs: optional sign, '.', or digit\n // ('.inf'/'.nan' start with '.').\n implicitFirstChars: ['-', '+', '.', ...'0123456789'],\n resolve: resolveYamlFloat,\n identify: (object) =>\n // No ancient boxed numbers support\n typeof object === 'number' &&\n (\n // We land here all numbers, not handled (declined) by !!int `.identify`\n // The same condition as for !!int, but reversed.\n\n // Filter out integers...\n !Number.isInteger(object) ||\n // but allow negative zero\n Object.is(object, -0) ||\n // and integers with exponential form\n object.toString(10).indexOf('e') >= 0\n ),\n represent: representYamlFloat\n})\n\nexport { floatYaml11Tag }\n","import { defineScalarTag, MERGE_KEY, NOT_RESOLVED } from '../../tag.ts'\n\nconst mergeTag = defineScalarTag('tag:yaml.org,2002:merge', {\n implicit: true,\n // source.charAt(0) over matched implicit inputs: '<' ('<<').\n implicitFirstChars: ['<'],\n resolve: (source, isExplicit) => {\n if (source === '<<' || (isExplicit && source === '')) return MERGE_KEY\n return NOT_RESOLVED\n }\n})\n\nexport { mergeTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst BASE64_PATTERN = /^[A-Za-z0-9+/]*={0,2}$/\n\nfunction resolveYamlBinary (source: string) {\n // Strip allowed whitespace first, so validation stays a plain base64 check.\n const input = source.replace(/\\s/g, '')\n if (input.length % 4 !== 0 || !BASE64_PATTERN.test(input)) return NOT_RESOLVED\n\n const binary = atob(input)\n const result = new Uint8Array(binary.length)\n for (let index = 0; index < binary.length; index++) {\n result[index] = binary.charCodeAt(index)\n }\n return result\n}\n\nfunction representYamlBinary (object: Uint8Array) {\n let binary = ''\n for (let index = 0; index < object.length; index++) {\n binary += String.fromCharCode(object[index])\n }\n return btoa(binary)\n}\n\nconst binaryTag = defineScalarTag('tag:yaml.org,2002:binary', {\n resolve: resolveYamlBinary,\n identify: (object) => Object.prototype.toString.call(object) === '[object Uint8Array]',\n represent: representYamlBinary\n})\n\nexport { binaryTag }\n","import { defineScalarTag, NOT_RESOLVED } from '../../tag.ts'\n\nconst YAML_DATE_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$')\n\nconst YAML_TIMESTAMP_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' +\n '-([0-9][0-9]?)' +\n '-([0-9][0-9]?)' +\n '(?:[Tt]|[ \\\\t]+)' +\n '([0-9][0-9]?)' +\n ':([0-9][0-9])' +\n ':([0-9][0-9])' +\n '(?:\\\\.([0-9]*))?' +\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' +\n '(?::([0-9][0-9]))?))?$')\n\nfunction makeUtcDate (\n year: number,\n month: number,\n day: number,\n hour = 0,\n minute = 0,\n second = 0,\n fraction = 0\n) {\n const date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction))\n\n // Date.UTC() treats years 0..99 as 1900..1999. Restore the parsed YAML year\n // before validating calendar normalization, e.g. reject 0001-02-29.\n date.setUTCFullYear(year, month, day)\n\n return date\n}\n\nfunction resolveYamlTimestamp (source: string) {\n let match = YAML_DATE_REGEXP.exec(source)\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(source)\n if (match === null) return NOT_RESOLVED\n\n const year = +(match[1])\n const month = +(match[2]) - 1\n const day = +(match[3])\n\n // Date-only form (`YYYY-MM-DD`) has no time captures.\n if (!match[4]) {\n const date = makeUtcDate(year, month, day)\n // Reject dates that JS would normalize, e.g. 2023-02-29 -> 2023-03-01.\n if (date.getUTCFullYear() !== year || date.getUTCMonth() !== month || date.getUTCDate() !== day) {\n return NOT_RESOLVED\n }\n return date\n }\n\n const hour = +(match[4])\n const minute = +(match[5])\n const second = +(match[6])\n let fraction = 0\n\n // Reject times that JS would normalize into the next minute/hour/day.\n if (hour > 23 || minute > 59 || second > 59) return NOT_RESOLVED\n\n if (match[7]) {\n let value = match[7].slice(0, 3)\n while (value.length < 3) value += '0'\n fraction = +value\n }\n\n const date = makeUtcDate(year, month, day, hour, minute, second, fraction)\n\n // Reject invalid calendar dates before applying timezone offset.\n if (date.getUTCFullYear() !== year || date.getUTCMonth() !== month || date.getUTCDate() !== day) {\n return NOT_RESOLVED\n }\n\n if (match[9]) {\n const offsetHour = +(match[10])\n const offsetMinute = +(match[11] || 0)\n // Reject timezone offsets that JS date arithmetic would otherwise accept.\n if (offsetHour > 23 || offsetMinute > 59) return NOT_RESOLVED\n\n const offset = (offsetHour * 60 + offsetMinute) * 60000\n date.setTime(date.getTime() - (match[9] === '-' ? -offset : offset))\n }\n\n return date\n}\n\nconst timestampTag = defineScalarTag('tag:yaml.org,2002:timestamp', {\n implicit: true,\n // Both patterns start with a 4-digit year, so source.charAt(0) is always a digit.\n implicitFirstChars: [...'0123456789'],\n resolve: resolveYamlTimestamp,\n identify: (object) => object instanceof Date,\n represent: (object: Date) => object.toISOString()\n})\n\nexport { timestampTag }\n","import { defineSequenceTag } from '../../tag.ts'\n\nconst seqTag = defineSequenceTag('tag:yaml.org,2002:seq', {\n create: () => [] as unknown[],\n addItem: (container, item) => {\n container.push(item)\n },\n identify: Array.isArray\n})\n\nexport { seqTag }\n","function isPlainObject (data: unknown): boolean {\n if (data === null || typeof data !== 'object' || Array.isArray(data)) return false\n const prototype = Object.getPrototypeOf(data)\n return prototype === null || prototype === Object.prototype\n}\n\n// Project `object` onto `keys`. Absent keys are skipped (so the result can be\n// safely spread over defaults without clobbering them with `undefined`), hence\n// the `Partial` return.\nfunction pick<T extends object, K extends keyof T> (object: T, keys: readonly K[]): Partial<Pick<T, K>> {\n const result: Partial<Pick<T, K>> = {}\n for (const key of keys) {\n if (object[key] !== undefined) result[key] = object[key]\n }\n return result\n}\n\nexport {\n isPlainObject,\n pick\n}\n","import { defineSequenceTag } from '../../tag.ts'\nimport { isPlainObject } from '../../common/object.ts'\n\ninterface OmapCarrier {\n list: unknown[]\n seen: Set<unknown>\n}\n\nconst omapTag = defineSequenceTag('tag:yaml.org,2002:omap', {\n create: (): OmapCarrier => ({ list: [], seen: new Set() }),\n addItem: (carrier, item) => {\n let key: unknown\n\n if (item instanceof Map) {\n if (item.size !== 1) return 'cannot resolve an ordered map item'\n key = item.keys().next().value\n } else if (isPlainObject(item)) {\n const itemKeys = Object.keys(item as Record<string, unknown>)\n if (itemKeys.length !== 1) return 'cannot resolve an ordered map item'\n key = itemKeys[0]\n } else {\n return 'cannot resolve an ordered map item'\n }\n\n if (carrier.seen.has(key)) return 'duplicate key in ordered map'\n carrier.seen.add(key)\n carrier.list.push(item)\n return ''\n },\n finalize: (carrier): unknown[] => carrier.list\n})\n\nexport { omapTag }\n","import { defineSequenceTag } from '../../tag.ts'\n\ntype Pair = [unknown, unknown]\n\nconst pairsTag = defineSequenceTag('tag:yaml.org,2002:pairs', {\n create: () => [] as Pair[],\n addItem: (container, item) => {\n if (item instanceof Map) {\n if (item.size !== 1) return 'cannot resolve a pairs item'\n\n container.push(item.entries().next().value!)\n return ''\n }\n\n if (Object.prototype.toString.call(item) !== '[object Object]') {\n return 'cannot resolve a pairs item'\n }\n\n const object = item as Record<string, unknown>\n const keys = Object.keys(object)\n\n if (keys.length !== 1) return 'cannot resolve a pairs item'\n\n container.push([keys[0], object[keys[0]]] satisfies Pair)\n return ''\n }\n})\n\nexport { pairsTag }\n","import { defineMappingTag } from '../../tag.ts'\nimport { isPlainObject } from '../../common/object.ts'\n\ntype StringMapping = Record<string, unknown>\n\nconst mapTag = defineMappingTag('tag:yaml.org,2002:map', {\n create: (): StringMapping => ({}),\n identify: isPlainObject,\n // Dump side: wrap the plain object into the canonical `Map` form the writer\n // walks. Shallow — keys/values stay references to the originals.\n represent: (o: StringMapping) => {\n const map = new Map<string, unknown>()\n for (const key of Object.keys(o)) map.set(key, o[key])\n return map\n },\n addPair: (container, key, value) => {\n if (key !== null && typeof key === 'object') {\n return 'object-based map does not support complex keys'\n }\n const normalizedKey = String(key)\n if (normalizedKey === '__proto__') {\n // Define as an own data property so a literal `__proto__` key stays data\n // and never invokes the prototype setter.\n Object.defineProperty(container, normalizedKey, {\n value, enumerable: true, configurable: true, writable: true\n })\n } else {\n container[normalizedKey] = value\n }\n return ''\n },\n // hasOwn, not `in`: a plain object inherits `toString` and friends.\n has: (container, key) => {\n if (key !== null && typeof key === 'object') return false\n return Object.prototype.hasOwnProperty.call(container, String(key))\n },\n keys: (container) => Object.keys(container),\n get: (container, key) => {\n const normalizedKey = String(key)\n // key is from `keys()` only. Strong check is not needed, but leave for sure.\n if (!Object.prototype.hasOwnProperty.call(container, normalizedKey)) return null\n return container[normalizedKey]\n }\n})\n\nexport { mapTag, isPlainObject, type StringMapping }\n","import { defineMappingTag } from '../../tag.ts'\n\nconst setTag = defineMappingTag('tag:yaml.org,2002:set', {\n create: () => new Set<unknown>(),\n identify: (data) => data instanceof Set,\n represent: (data: Set<unknown>) => {\n const map = new Map<unknown, null>()\n for (const key of data) map.set(key, null)\n return map\n },\n addPair: (container, key, value) => {\n if (value !== null) return 'cannot resolve a set item'\n container.add(key)\n return ''\n },\n has: (container, key) => container.has(key),\n keys: (container) => container.keys(),\n get: () => null\n})\n\nexport { setTag }\n","import {\n type MappingTagDefinition,\n type ScalarTagDefinition,\n type SequenceTagDefinition,\n type TagDefinition\n} from './tag.ts'\nimport { strTag } from './tag/scalar/str.ts'\nimport { nullCoreTag } from './tag/scalar/null_core.ts'\nimport { nullJsonTag } from './tag/scalar/null_json.ts'\nimport { nullYaml11Tag } from './tag/scalar/null_yaml11.ts'\nimport { boolCoreTag } from './tag/scalar/bool_core.ts'\nimport { boolJsonTag } from './tag/scalar/bool_json.ts'\nimport { boolYaml11Tag } from './tag/scalar/bool_yaml11.ts'\nimport { intCoreTag } from './tag/scalar/int_core.ts'\nimport { intJsonTag } from './tag/scalar/int_json.ts'\nimport { intYaml11Tag } from './tag/scalar/int_yaml11.ts'\nimport { floatCoreTag } from './tag/scalar/float_core.ts'\nimport { floatJsonTag } from './tag/scalar/float_json.ts'\nimport { floatYaml11Tag } from './tag/scalar/float_yaml11.ts'\nimport { mergeTag } from './tag/scalar/merge.ts'\nimport { binaryTag } from './tag/scalar/binary.ts'\nimport { timestampTag } from './tag/scalar/timestamp.ts'\nimport { seqTag } from './tag/sequence/seq.ts'\nimport { omapTag } from './tag/sequence/omap.ts'\nimport { pairsTag } from './tag/sequence/pairs.ts'\nimport { mapTag } from './tag/mapping/map.ts'\nimport { setTag } from './tag/mapping/set.ts'\n\ninterface TagDefinitionMap {\n scalar: Record<string, ScalarTagDefinition>\n sequence: Record<string, SequenceTagDefinition>\n mapping: Record<string, MappingTagDefinition>\n}\n\ninterface TagDefinitionListMap {\n scalar: ScalarTagDefinition[]\n sequence: SequenceTagDefinition[]\n mapping: MappingTagDefinition[]\n}\n\nfunction createTagDefinitionMap (): TagDefinitionMap {\n return {\n scalar: Object.create(null),\n sequence: Object.create(null),\n mapping: Object.create(null)\n }\n}\n\nfunction createTagDefinitionListMap (): TagDefinitionListMap {\n return {\n scalar: [],\n sequence: [],\n mapping: []\n }\n}\n\nfunction compileTags (tags: readonly TagDefinition[]) {\n const result: TagDefinition[] = []\n\n for (const tag of tags) {\n let index = result.length\n\n for (let previousIndex = 0; previousIndex < result.length; previousIndex++) {\n const previous = result[previousIndex]\n\n if (previous.nodeKind === tag.nodeKind &&\n previous.tagName === tag.tagName &&\n previous.matchByTagPrefix === tag.matchByTagPrefix) {\n index = previousIndex\n break\n }\n }\n\n result[index] = tag\n }\n\n return result\n}\n\nclass Schema {\n readonly tags: readonly TagDefinition[]\n readonly implicitScalarTags: readonly ScalarTagDefinition[]\n // Dispatch implicit scalar resolvers by `source.charAt(0)`. Each bucket holds the\n // resolvers that may match that key, in schema order; a key absent from the map\n // uses `implicitScalarAnyFirstChar` (resolvers that declared no first-char\n // constraint, so they apply to any first character).\n readonly implicitScalarByFirstChar: ReadonlyMap<string, readonly ScalarTagDefinition[]>\n readonly implicitScalarAnyFirstChar: readonly ScalarTagDefinition[]\n // The default scalar tag (`!!str`), resolved once so the composer's fallback for\n // unresolved plain scalars avoids a keyed lookup per scalar.\n readonly defaultScalarTag: ScalarTagDefinition\n // The default container tags (`!!seq` / `!!map`), used by the dumper: when a\n // value is identified by its default tag, the tag is implicit and not printed.\n // Undefined if the schema does not define them (then such values can't be dumped).\n readonly defaultSequenceTag: SequenceTagDefinition | undefined\n readonly defaultMappingTag: MappingTagDefinition | undefined\n readonly exact: TagDefinitionMap\n readonly prefix: TagDefinitionListMap\n\n constructor (tags: readonly TagDefinition[]) {\n const compiledTags = compileTags(tags)\n const implicitScalarTags: ScalarTagDefinition[] = []\n const exact = createTagDefinitionMap()\n const prefix = createTagDefinitionListMap()\n\n for (const tag of compiledTags) {\n if (tag.nodeKind === 'scalar' && tag.implicit) {\n if (tag.matchByTagPrefix) {\n throw new Error('Implicit scalar tags cannot match by tag prefix')\n }\n\n implicitScalarTags.push(tag)\n }\n\n switch (tag.nodeKind) {\n case 'scalar':\n if (tag.matchByTagPrefix) prefix.scalar.push(tag)\n else exact.scalar[tag.tagName] = tag\n break\n case 'sequence':\n if (tag.matchByTagPrefix) prefix.sequence.push(tag)\n else exact.sequence[tag.tagName] = tag\n break\n case 'mapping':\n if (tag.matchByTagPrefix) prefix.mapping.push(tag)\n else exact.mapping[tag.tagName] = tag\n break\n }\n }\n\n const implicitScalarAnyFirstChar = implicitScalarTags.filter(tag => tag.implicitFirstChars === null)\n\n const keys = new Set<string>()\n for (const tag of implicitScalarTags) {\n if (tag.implicitFirstChars !== null) {\n for (const key of tag.implicitFirstChars) keys.add(key)\n }\n }\n\n const implicitScalarByFirstChar = new Map<string, ScalarTagDefinition[]>()\n for (const key of keys) {\n implicitScalarByFirstChar.set(key, implicitScalarTags.filter(tag =>\n tag.implicitFirstChars === null || tag.implicitFirstChars.indexOf(key) !== -1))\n }\n\n const defaultScalarTag = exact.scalar['tag:yaml.org,2002:str']\n if (!defaultScalarTag) throw new Error('schema does not define the default scalar tag (tag:yaml.org,2002:str)')\n\n this.tags = compiledTags\n this.implicitScalarTags = implicitScalarTags\n this.implicitScalarByFirstChar = implicitScalarByFirstChar\n this.implicitScalarAnyFirstChar = implicitScalarAnyFirstChar\n this.defaultScalarTag = defaultScalarTag\n this.defaultSequenceTag = exact.sequence['tag:yaml.org,2002:seq']\n this.defaultMappingTag = exact.mapping['tag:yaml.org,2002:map']\n this.exact = exact\n this.prefix = prefix\n }\n\n withTags (...tags: Array<TagDefinition | readonly TagDefinition[]>): Schema {\n let flatTags: TagDefinition[] = []\n for (const tag of tags) flatTags = flatTags.concat(tag)\n\n return new Schema([...this.tags, ...flatTags])\n }\n}\n\nconst FAILSAFE_SCHEMA = new Schema([\n strTag,\n seqTag,\n mapTag\n])\n\nconst JSON_SCHEMA = new Schema([\n ...FAILSAFE_SCHEMA.tags,\n nullJsonTag,\n boolJsonTag,\n intJsonTag,\n floatJsonTag\n])\n\nconst CORE_SCHEMA = new Schema([\n ...FAILSAFE_SCHEMA.tags,\n nullCoreTag,\n boolCoreTag,\n intCoreTag,\n floatCoreTag\n])\n\nconst YAML11_SCHEMA = new Schema([\n ...FAILSAFE_SCHEMA.tags,\n nullYaml11Tag,\n boolYaml11Tag,\n intYaml11Tag,\n floatYaml11Tag,\n timestampTag,\n mergeTag,\n binaryTag,\n omapTag,\n pairsTag,\n setTag\n])\n\nexport {\n Schema,\n FAILSAFE_SCHEMA,\n JSON_SCHEMA,\n CORE_SCHEMA,\n YAML11_SCHEMA,\n\n type TagDefinitionMap,\n type TagDefinitionListMap\n}\n","import { defineMappingTag } from '../../tag.ts'\nimport { isPlainObject } from '../../common/object.ts'\n\ntype RealMapping = Map<unknown, unknown>\n\n// A mapping represented as a real `Map`: keys keep their constructed type,\n// nothing is stringified. Drop-in replacement for the default `!!map` tag\n// (same tag name) — `CORE_SCHEMA.withTags(realMapTag)`.\nconst realMapTag = defineMappingTag('tag:yaml.org,2002:map', {\n create: () => new Map<unknown, unknown>(),\n addPair: (container: RealMapping, key, value) => {\n container.set(key, value)\n return ''\n },\n has: (container: RealMapping, key) => container.has(key),\n keys: (container: RealMapping) => container.keys(),\n get: (container: RealMapping, key) => container.get(key),\n // Dump side: handle both a real `Map` and a plain object, so this tag fully\n // replaces the default map representation when dumping too.\n identify: (data) => data instanceof Map || isPlainObject(data),\n // Dump side: the canonical mapping form is a `Map`. A real `Map` passes\n // through untouched (keys keep their type); a plain object is wrapped\n // shallowly. Lossless — nothing is stringified.\n represent: (data) => {\n if (data instanceof Map) return data\n const map = new Map<unknown, unknown>()\n const obj = data as Record<string, unknown>\n for (const key of Object.keys(obj)) map.set(key, obj[key])\n return map\n }\n})\n\nexport { realMapTag }\n","import { defineMappingTag } from '../../tag.ts'\nimport { isPlainObject } from '../../common/object.ts'\n\ntype StringMapping = Record<string, unknown>\n\n// Coerce a constructed key into the string identity a `{}` representation uses.\n// Returns null for a nested array key (an array element that is itself an\n// array), which would otherwise blow up exponentially when stringified via\n// aliases.\nfunction normalizeKey (key: unknown): string | null {\n if (Array.isArray(key)) {\n const array = Array.prototype.slice.call(key) as unknown[]\n\n for (let index = 0; index < array.length; index++) {\n if (Array.isArray(array[index])) return null\n\n if (typeof array[index] === 'object' &&\n Object.prototype.toString.call(array[index]) === '[object Object]') {\n array[index] = '[object Object]'\n }\n }\n\n return String(array)\n }\n\n if (typeof key === 'object' &&\n Object.prototype.toString.call(key) === '[object Object]') {\n return '[object Object]'\n }\n\n return String(key)\n}\n\nconst legacyMapTag = defineMappingTag('tag:yaml.org,2002:map', {\n create: (): StringMapping => ({}),\n identify: isPlainObject,\n // Dump side: wrap the plain object into the canonical `Map` form the writer\n // walks. Shallow — keys/values stay references to the originals.\n represent: (o: StringMapping) => {\n const map = new Map<string, unknown>()\n for (const key of Object.keys(o)) map.set(key, o[key])\n return map\n },\n addPair: (container, key, value) => {\n const normalizedKey = normalizeKey(key)\n if (normalizedKey === null) return 'nested arrays are not supported inside keys'\n if (normalizedKey === '__proto__') {\n // Define as an own data property so a literal `__proto__` key stays data\n // and never invokes the prototype setter.\n Object.defineProperty(container, normalizedKey, {\n value, enumerable: true, configurable: true, writable: true\n })\n } else {\n container[normalizedKey] = value\n }\n return ''\n },\n // hasOwn, not `in`: a plain object inherits `toString` and friends.\n has: (container, key) => {\n const normalizedKey = normalizeKey(key)\n return normalizedKey !== null && Object.prototype.hasOwnProperty.call(container, normalizedKey)\n },\n keys: (container) => Object.keys(container),\n get: (container, key) => {\n const normalizedKey = String(key)\n // key is from `keys()` only. Strong check is not needed, but leave for sure.\n if (!Object.prototype.hasOwnProperty.call(container, normalizedKey)) return null\n return container[normalizedKey]\n }\n})\n\nexport { legacyMapTag, isPlainObject, type StringMapping }\n","export interface SnippetMark {\n name?: string | null\n buffer: string\n position: number\n line: number\n column: number\n snippet?: string | null\n}\n\ninterface SnippetOptions {\n maxLength?: number\n indent?: number\n linesBefore?: number\n linesAfter?: number\n}\n\nconst DEFAULT_SNIPPET_OPTIONS: Required<SnippetOptions> = {\n maxLength: 79,\n indent: 1,\n linesBefore: 3,\n linesAfter: 2\n}\n\n// get snippet for a single line, respecting maxLength\nfunction getLine (buffer: string, lineStart: number, lineEnd: number, position: number, maxLineLength: number) {\n let head = ''\n let tail = ''\n const maxHalfLength = Math.floor(maxLineLength / 2) - 1\n\n if (position - lineStart > maxHalfLength) {\n head = ' ... '\n lineStart = position - maxHalfLength + head.length\n }\n\n if (lineEnd - position > maxHalfLength) {\n tail = ' ...'\n lineEnd = position + maxHalfLength - tail.length\n }\n\n return {\n str: head + buffer.slice(lineStart, lineEnd).replace(/\\t/g, '→') + tail,\n pos: position - lineStart + head.length // relative position\n }\n}\n\nfunction padStart (string: string, max: number) {\n // max() protects from negativa value, to avoid exception.\n return ' '.repeat(Math.max(max - string.length, 0)) + string\n}\n\nfunction makeSnippet (mark: SnippetMark, options?: SnippetOptions) {\n if (!mark.buffer) return null\n\n const opts = { ...DEFAULT_SNIPPET_OPTIONS, ...options }\n\n const re = /\\r?\\n|\\r|\\0/g\n const lineStarts = [0]\n const lineEnds: number[] = []\n let match: RegExpExecArray | null\n let foundLineNo = -1\n\n while ((match = re.exec(mark.buffer))) {\n lineEnds.push(match.index)\n lineStarts.push(match.index + match[0].length)\n\n if (mark.position <= match.index && foundLineNo < 0) {\n foundLineNo = lineStarts.length - 2\n }\n }\n\n if (foundLineNo < 0) foundLineNo = lineStarts.length - 1\n\n let result = ''\n const lineNoLength = Math.min(mark.line + opts.linesAfter, lineEnds.length).toString().length\n const maxLineLength = opts.maxLength - (opts.indent + lineNoLength + 3)\n\n for (let i = 1; i <= opts.linesBefore; i++) {\n if (foundLineNo - i < 0) break\n const line = getLine(\n mark.buffer,\n lineStarts[foundLineNo - i],\n lineEnds[foundLineNo - i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),\n maxLineLength\n )\n result = `${' '.repeat(opts.indent)}${padStart((mark.line - i + 1).toString(), lineNoLength)} | ${line.str}\\n${result}`\n }\n\n const line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength)\n result += `${' '.repeat(opts.indent)}${padStart((mark.line + 1).toString(), lineNoLength)} | ${line.str}\\n`\n result += `${'-'.repeat(opts.indent + lineNoLength + 3 + line.pos)}^\\n`\n\n for (let i = 1; i <= opts.linesAfter; i++) {\n if (foundLineNo + i >= lineEnds.length) break\n const line = getLine(\n mark.buffer,\n lineStarts[foundLineNo + i],\n lineEnds[foundLineNo + i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),\n maxLineLength\n )\n result += `${' '.repeat(opts.indent)}${padStart((mark.line + i + 1).toString(), lineNoLength)} | ${line.str}\\n`\n }\n\n return result.replace(/\\n$/, '')\n}\n\nexport default makeSnippet\n","import makeSnippet, { type SnippetMark } from './snippet.ts'\n\n// YAML error class. http://stackoverflow.com/questions/8458984\n//\nfunction formatError (exception: YAMLException, compact?: boolean) {\n let where = ''\n\n if (!exception.mark) return exception.reason\n\n if (exception.mark.name) {\n where += `in \"${exception.mark.name}\" `\n }\n\n where += `(${exception.mark.line + 1}:${exception.mark.column + 1})`\n\n if (!compact && exception.mark.snippet) {\n where += `\\n\\n${exception.mark.snippet}`\n }\n\n return `${exception.reason} ${where}`\n}\n\nclass YAMLException extends Error {\n reason: string\n mark?: SnippetMark\n\n constructor (reason: string, mark?: SnippetMark) {\n super()\n\n this.name = 'YAMLException'\n this.reason = reason\n this.mark = mark\n this.message = formatError(this, false)\n\n // Guard for ancient browsers\n if (Error.captureStackTrace) {\n // Include stack trace in error object,\n Error.captureStackTrace(this, this.constructor)\n }\n }\n\n toString (compact?: boolean) {\n return `${this.name}: ${formatError(this, compact)}`\n }\n}\n\n// Build a YAMLException with a source snippet and throw it. `source` is the\n// raw input text (no parser sentinel); `position` is an offset into it.\nfunction throwErrorAt (source: string, position: number, message: string, filename = ''): never {\n let line = 0\n let lineStart = 0\n\n for (let index = 0; index < position; index++) {\n const ch = source.charCodeAt(index)\n\n if (ch === 0x0A/* LF */) {\n line++\n lineStart = index + 1\n } else if (ch === 0x0D/* CR */) {\n line++\n if (source.charCodeAt(index + 1) === 0x0A/* LF */) index++\n lineStart = index + 1\n }\n }\n\n const mark: SnippetMark = {\n name: filename,\n buffer: source,\n position,\n line,\n column: position - lineStart\n }\n\n mark.snippet = makeSnippet(mark)\n throw new YAMLException(message, mark)\n}\n\nexport { YAMLException, throwErrorAt }\n","import {\n SCALAR_STYLE_SINGLE_QUOTED,\n SCALAR_STYLE_DOUBLE_QUOTED,\n SCALAR_STYLE_LITERAL_BLOCK,\n SCALAR_STYLE_FOLDED_BLOCK,\n CHOMPING_STRIP,\n CHOMPING_KEEP,\n type ScalarEvent\n} from './events.ts'\n\nconst NO_RANGE = -1\n\n// --- character helpers (mirrors src/loader.ts, kept self-contained here) ---\n\nfunction simpleEscapeSequence (c: number) {\n switch (c) {\n case 0x30/* 0 */: return '\\x00'\n case 0x61/* a */: return '\\x07'\n case 0x62/* b */: return '\\x08'\n case 0x74/* t */: return '\\x09'\n case 0x09/* Tab */: return '\\x09'\n case 0x6E/* n */: return '\\x0A'\n case 0x76/* v */: return '\\x0B'\n case 0x66/* f */: return '\\x0C'\n case 0x72/* r */: return '\\x0D'\n case 0x65/* e */: return '\\x1B'\n case 0x20/* Space */: return ' '\n case 0x22/* \" */: return '\\x22'\n case 0x2F/* / */: return '/'\n case 0x5C/* \\ */: return '\\x5C'\n case 0x4E/* N */: return '\\x85'\n case 0x5F/* _ */: return '\\xA0'\n case 0x4C/* L */: return '\\u2028'\n case 0x50/* P */: return '\\u2029'\n default: return ''\n }\n}\n\nconst simpleEscapeCheck = new Array(256)\nconst simpleEscapeMap = new Array(256)\nfor (let i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0\n simpleEscapeMap[i] = simpleEscapeSequence(i)\n}\n\nfunction charFromCodepoint (c: number) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c)\n }\n return String.fromCharCode(\n ((c - 0x010000) >> 10) + 0xD800,\n ((c - 0x010000) & 0x03FF) + 0xDC00\n )\n}\n\nfunction fromHexCode (c: number) {\n if (c >= 0x30/* 0 */ && c <= 0x39/* 9 */) return c - 0x30\n const lc = c | 0x20\n // Double-quoted scalar ranges are validated by parser.ts before cooking.\n return lc - 0x61 + 10\n}\n\nfunction escapedHexLen (c: number) {\n if (c === 0x78/* x */) return 2\n if (c === 0x75/* u */) return 4\n // Double-quoted scalar ranges are validated by parser.ts before cooking.\n return 8\n}\n\n// --- line folding helpers ---\n\n// Skip a run of line breaks plus the leading whitespace of the following\n// lines, returning the number of line breaks consumed and the new position.\nfunction skipFoldedBreaks (input: string, position: number, end: number) {\n let breaks = 0\n\n while (position < end) {\n const ch = input.charCodeAt(position)\n\n if (ch === 0x0A/* LF */) {\n breaks++\n position++\n } else if (ch === 0x0D/* CR */) {\n breaks++\n position++\n if (input.charCodeAt(position) === 0x0A/* LF */) position++\n } else if (ch === 0x20/* Space */ || ch === 0x09/* Tab */) {\n position++\n } else {\n break\n }\n }\n\n return { position, breaks }\n}\n\n// Folding of line breaks between content chunks: a single break becomes a\n// space, several breaks become (count - 1) newlines.\nfunction foldedBreaks (count: number) {\n if (count === 1) return ' '\n // Called only after skipFoldedBreaks() consumed at least one line break.\n return '\\n'.repeat(count - 1)\n}\n\n// --- per-style extractors ---\n\nfunction getPlainValue (input: string, start: number, end: number) {\n let result = ''\n let position = start\n let captureStart = start\n let captureEnd = start\n\n while (position < end) {\n const ch = input.charCodeAt(position)\n\n if (ch === 0x0A/* LF */ || ch === 0x0D/* CR */) {\n result += input.slice(captureStart, captureEnd)\n const fold = skipFoldedBreaks(input, position, end)\n result += foldedBreaks(fold.breaks)\n position = captureStart = captureEnd = fold.position\n } else {\n position++\n if (ch !== 0x20/* Space */ && ch !== 0x09/* Tab */) captureEnd = position\n }\n }\n\n return result + input.slice(captureStart, captureEnd)\n}\n\nfunction getSingleQuotedValue (input: string, start: number, end: number) {\n let result = ''\n let position = start\n let captureStart = start\n let captureEnd = start\n\n while (position < end) {\n const ch = input.charCodeAt(position)\n\n if (ch === 0x27/* ' */) {\n // Within the stored range every quote is part of an escaped '' pair.\n result += input.slice(captureStart, position) + \"'\"\n position += 2\n captureStart = captureEnd = position\n } else if (ch === 0x0A/* LF */ || ch === 0x0D/* CR */) {\n result += input.slice(captureStart, captureEnd)\n const fold = skipFoldedBreaks(input, position, end)\n result += foldedBreaks(fold.breaks)\n position = captureStart = captureEnd = fold.position\n } else {\n position++\n if (ch !== 0x20/* Space */ && ch !== 0x09/* Tab */) captureEnd = position\n }\n }\n\n // Whitespace right before the closing quote is significant (it is only\n // stripped when followed by a line break).\n return result + input.slice(captureStart, end)\n}\n\nfunction getDoubleQuotedValue (input: string, start: number, end: number) {\n let result = ''\n let position = start\n let captureStart = start\n let captureEnd = start\n\n while (position < end) {\n const ch = input.charCodeAt(position)\n\n if (ch === 0x5C/* \\ */) {\n result += input.slice(captureStart, position)\n position++\n const escaped = input.charCodeAt(position)\n\n if (escaped === 0x0A/* LF */ || escaped === 0x0D/* CR */) {\n // Escaped line break: a line continuation that joins with nothing.\n position = skipFoldedBreaks(input, position, end).position\n } else if (escaped < 256 && simpleEscapeCheck[escaped]) {\n result += simpleEscapeMap[escaped]\n position++\n } else {\n // parser.ts has already rejected unknown escapes and invalid hex digits.\n let hexLength = escapedHexLen(escaped)\n let hexResult = 0\n\n for (; hexLength > 0; hexLength--) {\n position++\n const digit = fromHexCode(input.charCodeAt(position))\n hexResult = (hexResult << 4) + digit\n }\n\n result += charFromCodepoint(hexResult)\n position++\n }\n\n captureStart = captureEnd = position\n } else if (ch === 0x0A/* LF */ || ch === 0x0D/* CR */) {\n result += input.slice(captureStart, captureEnd)\n const fold = skipFoldedBreaks(input, position, end)\n result += foldedBreaks(fold.breaks)\n position = captureStart = captureEnd = fold.position\n } else {\n position++\n if (ch !== 0x20/* Space */ && ch !== 0x09/* Tab */) captureEnd = position\n }\n }\n\n return result + input.slice(captureStart, end)\n}\n\nfunction getBlockValue (\n input: string,\n start: number,\n end: number,\n indent: number,\n chomping: number,\n folded: boolean\n) {\n const textIndent = indent < 0 ? 0 : indent\n // The range starts at column 0 of the first line and includes every line\n // break, including those of trailing blank lines.\n const region = input.slice(start, end).replace(/\\r\\n?/g, '\\n')\n // An empty range is a block with no lines at all (e.g. an empty `|+`) and\n // must stay empty; a naive split would invent a phantom blank line. Otherwise\n // a trailing line break leaves a trailing '' from split() that is not a real\n // line (just the terminator of the last one), so drop it. Interior blank\n // lines are kept.\n const lines = region === ''\n ? []\n : (region.endsWith('\\n') ? region.slice(0, -1) : region).split('\\n')\n\n let result = ''\n let didReadContent = false\n let emptyLines = 0\n let atMoreIndented = false\n\n for (const line of lines) {\n // Whitespace beyond the content indentation is part of the content, so the\n // indentation scan stops at textIndent. A line is empty only when nothing\n // remains after the (capped) indentation.\n // indent < 0 means no content line was detected (a wholly blank block), so\n // every line is an empty line.\n let column = 0\n while (column < textIndent && line.charCodeAt(column) === 0x20/* Space */) column++\n\n if (indent < 0 || column >= line.length) {\n emptyLines++\n continue\n }\n\n const content = line.slice(textIndent)\n const first = content.charCodeAt(0)\n\n if (folded) {\n if (first === 0x20/* Space */ || first === 0x09/* Tab */) {\n // More-indented lines are not folded.\n atMoreIndented = true\n result += '\\n'.repeat(didReadContent ? 1 + emptyLines : emptyLines)\n } else if (atMoreIndented) {\n atMoreIndented = false\n result += '\\n'.repeat(emptyLines + 1)\n } else if (emptyLines === 0) {\n if (didReadContent) result += ' '\n } else {\n result += '\\n'.repeat(emptyLines)\n }\n } else {\n result += '\\n'.repeat(didReadContent ? 1 + emptyLines : emptyLines)\n }\n\n result += content\n didReadContent = true\n emptyLines = 0\n }\n\n if (chomping === CHOMPING_KEEP) {\n result += '\\n'.repeat(didReadContent ? 1 + emptyLines : emptyLines)\n } else if (chomping !== CHOMPING_STRIP) {\n if (didReadContent) result += '\\n'\n }\n\n return result\n}\n\nfunction getScalarValue (input: string, scalar: ScalarEvent): string {\n if (scalar.valueStart === NO_RANGE) return ''\n\n const { valueStart, valueEnd } = scalar\n\n // Fast path: the parser marked this scalar as a verbatim slice of the input\n // (single-line plain / quoted with no escapes or folded breaks), so the\n // per-style char loop below would just reproduce the slice.\n if (scalar.fast) return input.slice(valueStart, valueEnd)\n\n switch (scalar.style) {\n case SCALAR_STYLE_SINGLE_QUOTED:\n return getSingleQuotedValue(input, valueStart, valueEnd)\n case SCALAR_STYLE_DOUBLE_QUOTED:\n return getDoubleQuotedValue(input, valueStart, valueEnd)\n case SCALAR_STYLE_LITERAL_BLOCK:\n return getBlockValue(input, valueStart, valueEnd, scalar.indent, scalar.chomping, false)\n case SCALAR_STYLE_FOLDED_BLOCK:\n return getBlockValue(input, valueStart, valueEnd, scalar.indent, scalar.chomping, true)\n default:\n return getPlainValue(input, valueStart, valueEnd)\n }\n}\n\nexport {\n getScalarValue\n}\n","const DEFAULT_TAG_HANDLERS: Readonly<Record<string, string>> = Object.assign(\n Object.create(null),\n {\n '!': '!',\n '!!': 'tag:yaml.org,2002:'\n }\n)\n\nfunction tagPercentEncode (source: string) {\n return encodeURI(source).replace(/!/g, '%21')\n}\n\nfunction tagNameFull (rawTag: string, tagHandlers?: Readonly<Record<string, string>>) {\n if (rawTag.startsWith('!<') && rawTag.endsWith('>')) {\n return decodeURIComponent(rawTag.slice(2, -1))\n }\n\n const handleEnd = rawTag.indexOf('!', 1)\n const handle = handleEnd === -1 ? '!' : rawTag.slice(0, handleEnd + 1)\n const prefix = tagHandlers?.[handle] ?? DEFAULT_TAG_HANDLERS[handle] ?? handle\n\n return decodeURIComponent(prefix) + decodeURIComponent(rawTag.slice(handle.length))\n}\n\nfunction tagNameShort (fullTag: string) {\n let tag = fullTag\n\n if (tag.charCodeAt(0) === 0x21) {\n tag = tag.slice(1)\n return `!${tagPercentEncode(tag)}`\n }\n\n if (tag.slice(0, 18) === 'tag:yaml.org,2002:') {\n return `!!${tagPercentEncode(tag.slice(18))}`\n }\n\n return `!<${tagPercentEncode(tag)}>`\n}\n\nexport {\n tagNameFull,\n tagNameShort\n}\n","import {\n EVENT_ALIAS,\n EVENT_DOCUMENT,\n EVENT_MAPPING,\n EVENT_POP,\n EVENT_SCALAR,\n EVENT_SEQUENCE,\n SCALAR_STYLE_PLAIN,\n type Event,\n type TagHandlers,\n type MappingEvent,\n type ScalarEvent,\n type SequenceEvent\n} from './events.ts'\nimport { getScalarValue } from './parser_scalar.ts'\nimport { CORE_SCHEMA, type Schema } from '../schema.ts'\nimport {\n MERGE_KEY,\n NOT_RESOLVED,\n type MappingTagDefinition,\n type ScalarTagDefinition,\n type SequenceTagDefinition\n} from '../tag.ts'\nimport { YAMLException, throwErrorAt } from '../common/exception.ts'\nimport { tagNameFull } from '../common/tagname.ts'\n\nconst NO_RANGE = -1\n\ninterface DocumentFrame {\n kind: 'document'\n position: number\n value: unknown\n hasValue: boolean\n}\n\ninterface SequenceFrame {\n kind: 'sequence'\n position: number\n value: any\n tag: SequenceTagDefinition<any, any>\n anchor: Anchor | null\n index: number\n // True when this sequence is the source list of a `<<` merge (`<<: [...]`).\n // Each element is validated as a mapping on arrival; the materialized list is\n // then delivered to the target mapping, which folds the elements in.\n merge: boolean\n}\n\ninterface MappingFrame {\n kind: 'mapping'\n position: number\n value: any\n tag: MappingTagDefinition<any, any>\n anchor: Anchor | null\n key: unknown\n keyPosition: number\n hasKey: boolean\n // Keys brought in by a merge that an explicit pair is still allowed to\n // override. Lazily allocated: stays null for mappings without `<<`.\n overridable: Set<unknown> | null\n}\n\ntype Frame = DocumentFrame | SequenceFrame | MappingFrame\n\ntype AnyTag = ScalarTagDefinition | SequenceTagDefinition<any, any> | MappingTagDefinition<any, any>\n\ninterface ValueAndTag {\n value: unknown\n tag: AnyTag\n}\n\ninterface Anchor {\n value: unknown\n tag: AnyTag\n isValueFinal: boolean\n}\n\ninterface ConstructorOptions {\n source: string\n filename?: string\n schema?: Schema\n json?: boolean\n maxTotalMergeKeys?: number\n maxAliases?: number\n}\n\n// `source` is input data, not config — so it has no default here.\nconst DEFAULT_CONSTRUCTOR_OPTIONS: Required<Omit<ConstructorOptions, 'source'>> = {\n filename: '',\n schema: CORE_SCHEMA,\n json: false,\n maxTotalMergeKeys: 10000,\n maxAliases: -1\n}\n\ninterface ConstructorState extends Required<ConstructorOptions> {\n events: Event[]\n documents: unknown[]\n eventIndex: number\n position: number\n frames: Frame[]\n anchors: Map<string, Anchor>\n tagHandlers: TagHandlers\n totalMergeKeys: number\n aliasCount: number\n}\n\nfunction eventPosition (event: Event) {\n if ('tagStart' in event && event.tagStart !== NO_RANGE) return event.tagStart\n if ('anchorStart' in event && event.anchorStart !== NO_RANGE) return event.anchorStart\n if ('valueStart' in event && event.valueStart !== NO_RANGE) return event.valueStart\n if ('start' in event) return event.start\n return 0\n}\n\nfunction throwError (state: ConstructorState, message: string): never {\n throwErrorAt(state.source, state.position, message, state.filename)\n}\n\nfunction finalizeCollection (\n state: ConstructorState,\n position: number,\n tag: SequenceTagDefinition<any, any> | MappingTagDefinition<any, any>,\n carrier: unknown\n) {\n try {\n return tag.finalize(carrier)\n } catch (error) {\n if (error instanceof YAMLException) throw error\n throwErrorAt(\n state.source,\n position,\n error instanceof Error ? error.message : String(error),\n state.filename\n )\n }\n}\n\nfunction lookupTag<T extends ScalarTagDefinition | SequenceTagDefinition | MappingTagDefinition> (\n exact: Record<string, T>,\n prefix: readonly T[],\n tagName: string\n): T | undefined {\n const exactTag = exact[tagName]\n if (exactTag) return exactTag\n\n for (const tag of prefix) {\n if (tagName.startsWith(tag.tagName)) return tag\n }\n\n return undefined\n}\n\nfunction findExplicitTag<T extends ScalarTagDefinition | SequenceTagDefinition | MappingTagDefinition> (\n state: ConstructorState,\n exact: Record<string, T>,\n prefix: readonly T[],\n tagName: string,\n nodeKind: T['nodeKind']\n) {\n const tag = lookupTag(exact, prefix, tagName)\n if (tag) return tag\n\n throwError(state, `unknown ${nodeKind} tag !<${tagName}>`)\n}\n\nfunction constructScalar (\n state: ConstructorState,\n event: ScalarEvent\n): ValueAndTag {\n const source = getScalarValue(state.source, event)\n const rawTag = event.tagStart === NO_RANGE\n ? ''\n : state.source.slice(event.tagStart, event.tagEnd)\n const strTag = state.schema.defaultScalarTag\n\n if (rawTag !== '') {\n if (rawTag === '!') return { value: source, tag: strTag }\n\n const tagName = tagNameFull(rawTag, state.tagHandlers)\n const scalarTag = lookupTag(state.schema.exact.scalar, state.schema.prefix.scalar, tagName)\n\n if (scalarTag) {\n const result = scalarTag.resolve(source, true, tagName)\n\n if (result === NOT_RESOLVED) {\n throwError(state, `cannot resolve a node with !<${tagName}> explicit tag`)\n }\n\n return { value: result, tag: scalarTag }\n }\n\n // An empty node carrying a collection tag (e.g. `!!map`, `!!seq`) is emitted\n // by the parser as a scalar event, since there is no collection syntax to key\n // off. Resolve it here by the explicit tag's kind into an empty collection.\n const collectionTagDef =\n lookupTag(state.schema.exact.mapping, state.schema.prefix.mapping, tagName) ??\n lookupTag(state.schema.exact.sequence, state.schema.prefix.sequence, tagName)\n\n if (collectionTagDef) {\n if (source !== '') {\n throwError(state, `cannot resolve a node with !<${tagName}> explicit tag`)\n }\n\n const carrier = collectionTagDef.create(tagName)\n const value = collectionTagDef.carrierIsResult\n ? carrier\n : finalizeCollection(state, state.position, collectionTagDef, carrier)\n return { value, tag: collectionTagDef }\n }\n\n throwError(state, `unknown scalar tag !<${tagName}>`)\n }\n\n if (event.style === SCALAR_STYLE_PLAIN) {\n // charAt(0) (not source[0]) yields '' for an empty source, which is the key\n // the null tag declares; source[0] would be undefined and miss that bucket.\n const candidates = state.schema.implicitScalarByFirstChar.get(source.charAt(0)) ??\n state.schema.implicitScalarAnyFirstChar\n for (const tag of candidates) {\n const result = tag.resolve(source, false, tag.tagName)\n if (result !== NOT_RESOLVED) return { value: result, tag }\n }\n }\n\n return { value: strTag.resolve(source, false, strTag.tagName), tag: strTag }\n}\n\nfunction collectionTag<Tag extends SequenceTagDefinition | MappingTagDefinition> (\n state: ConstructorState,\n event: SequenceEvent | MappingEvent,\n exact: Record<string, Tag>,\n prefix: readonly Tag[],\n defaultTagName: string,\n nodeKind: Tag['nodeKind']\n) {\n const rawTag = event.tagStart === NO_RANGE\n ? ''\n : state.source.slice(event.tagStart, event.tagEnd)\n const tagName = rawTag === '' || rawTag === '!'\n ? defaultTagName\n : tagNameFull(rawTag, state.tagHandlers)\n\n return {\n tagName,\n tag: findExplicitTag(state, exact, prefix, tagName, nodeKind)\n }\n}\n\n// A merge source must be a mapping; every mapping tag exposes the read side.\nfunction isMappingTag (tag: AnyTag): tag is MappingTagDefinition<any, any> {\n return tag.nodeKind === 'mapping'\n}\n\n// Fold the keys of one mapping source into the target frame, honoring merge\n// precedence: an already-present key (explicit or from an earlier source) wins.\nfunction mergeKeys (state: ConstructorState, frame: MappingFrame, source: unknown, sourceTag: MappingTagDefinition<any, any>) {\n for (const sourceKey of sourceTag.keys(source)) {\n if (state.maxTotalMergeKeys !== -1 && ++state.totalMergeKeys > state.maxTotalMergeKeys) {\n throwError(state, `merge keys exceeded maxTotalMergeKeys (${state.maxTotalMergeKeys})`)\n }\n\n if (frame.tag.has(frame.value, sourceKey)) continue\n\n const err = frame.tag.addPair(frame.value, sourceKey, sourceTag.get(source, sourceKey))\n if (err) throwError(state, err)\n ;(frame.overridable ??= new Set()).add(sourceKey)\n }\n}\n\n// The value of a `<<` key: either a mapping (fold its keys) or a sequence of\n// mappings (fold each). A merge sequence has already had every element validated\n// as a mapping on arrival (see addValue), and its elements were built by the\n// target's own mapping tag, so they are read back with it.\nfunction mergeSource (state: ConstructorState, frame: MappingFrame, source: unknown, sourceTag: AnyTag) {\n state.position = frame.keyPosition\n\n if (isMappingTag(sourceTag)) {\n mergeKeys(state, frame, source, sourceTag)\n } else if (sourceTag.nodeKind === 'sequence' && Array.isArray(source)) {\n for (const element of source) {\n mergeKeys(state, frame, element, frame.tag)\n }\n } else {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable')\n }\n}\n\nfunction addMappingValue (state: ConstructorState, frame: MappingFrame, key: unknown, value: unknown, tag: AnyTag) {\n state.position = frame.keyPosition\n\n // `<<` is intercepted before dedup, so a repeated merge key is allowed.\n if (key === MERGE_KEY) {\n mergeSource(state, frame, value, tag)\n return\n }\n\n if (!state.json && frame.tag.has(frame.value, key) && !frame.overridable?.has(key)) {\n throwError(state, 'duplicated mapping key')\n }\n\n const err = frame.tag.addPair(frame.value, key, value)\n if (err) throwError(state, err)\n frame.overridable?.delete(key)\n}\n\nfunction addValue (state: ConstructorState, value: unknown, tag: AnyTag) {\n const frame = state.frames[state.frames.length - 1]!\n\n if (frame.kind === 'document') {\n frame.value = value\n frame.hasValue = true\n } else if (frame.kind === 'sequence') {\n if (frame.merge) {\n // Element of a `<<: [...]` list: validate it is a mapping, then collect\n // it like any other item for the target to fold in.\n if (!isMappingTag(tag)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable')\n }\n }\n const err = frame.tag.addItem(frame.value, value, frame.index++)\n if (err) throwError(state, err)\n } else if (frame.hasKey) {\n const key = frame.key\n frame.key = undefined\n frame.hasKey = false\n addMappingValue(state, frame, key, value, tag)\n } else {\n frame.key = value\n frame.keyPosition = state.position\n frame.hasKey = true\n }\n}\n\nfunction storeAnchor (\n state: ConstructorState,\n event: ScalarEvent | SequenceEvent | MappingEvent,\n value: unknown,\n tag: AnyTag,\n isValueFinal: boolean\n): Anchor | null {\n if (event.anchorStart !== NO_RANGE) {\n const anchor = {\n value,\n tag,\n isValueFinal\n }\n state.anchors.set(state.source.slice(event.anchorStart, event.anchorEnd), anchor)\n return anchor\n }\n\n return null\n}\n\nfunction constructFromEvents (events: Event[], options: ConstructorOptions): unknown[] {\n const state: ConstructorState = {\n ...DEFAULT_CONSTRUCTOR_OPTIONS,\n ...options,\n events,\n documents: [],\n eventIndex: 0,\n position: 0,\n frames: [],\n anchors: new Map(),\n tagHandlers: Object.create(null),\n totalMergeKeys: 0,\n aliasCount: 0\n }\n\n while (state.eventIndex < state.events.length) {\n const event = state.events[state.eventIndex++]\n state.position = eventPosition(event)\n\n switch (event.type) {\n case EVENT_DOCUMENT:\n state.anchors = new Map()\n state.aliasCount = 0\n state.tagHandlers = Object.create(null)\n for (const directive of event.directives) {\n if (directive.kind === 'tag') state.tagHandlers[directive.handle] = directive.prefix\n }\n state.frames.push({ kind: 'document', position: state.position, value: undefined, hasValue: false })\n break\n\n case EVENT_SCALAR: {\n const { value, tag } = constructScalar(state, event)\n storeAnchor(state, event, value, tag, true)\n addValue(state, value, tag)\n break\n }\n\n case EVENT_SEQUENCE: {\n const definition = collectionTag(\n state,\n event,\n state.schema.exact.sequence,\n state.schema.prefix.sequence,\n 'tag:yaml.org,2002:seq',\n 'sequence'\n )\n const value = definition.tag.create(definition.tagName)\n const anchor = storeAnchor(state, event, value, definition.tag, definition.tag.carrierIsResult)\n\n // `<<: [...]` — the parent mapping is waiting on a merge key, so this\n // sequence is a list of merge sources: its elements must be mappings.\n // It is still built and delivered as a normal value; the target folds it.\n const parent = state.frames[state.frames.length - 1]\n const merge = parent !== undefined && parent.kind === 'mapping' &&\n parent.hasKey && parent.key === MERGE_KEY\n\n state.frames.push({\n kind: 'sequence', position: state.position, value, tag: definition.tag, anchor, index: 0, merge\n })\n break\n }\n\n case EVENT_MAPPING: {\n const definition = collectionTag(\n state,\n event,\n state.schema.exact.mapping,\n state.schema.prefix.mapping,\n 'tag:yaml.org,2002:map',\n 'mapping'\n )\n const value = definition.tag.create(definition.tagName)\n const anchor = storeAnchor(state, event, value, definition.tag, definition.tag.carrierIsResult)\n state.frames.push({\n kind: 'mapping',\n position: state.position,\n value,\n tag: definition.tag,\n anchor,\n key: undefined,\n keyPosition: state.position,\n hasKey: false,\n overridable: null\n })\n break\n }\n\n case EVENT_ALIAS: {\n if (state.maxAliases !== -1 && ++state.aliasCount > state.maxAliases) {\n throwError(state, `aliases exceeded maxAliases (${state.maxAliases})`)\n }\n\n const name = state.source.slice(event.anchorStart, event.anchorEnd)\n const anchor = state.anchors.get(name)\n if (!anchor) {\n throwError(state, `unidentified alias \"${name}\"`)\n }\n if (!anchor.isValueFinal) {\n throwError(state, `recursive alias \"${name}\" is not supported for tag ${anchor.tag.tagName} because it uses finalize()`)\n }\n addValue(state, anchor.value, anchor.tag)\n break\n }\n\n case EVENT_POP: {\n const frame = state.frames.pop()!\n\n if (frame.kind === 'mapping' && frame.hasKey) {\n state.position = frame.keyPosition\n throwError(state, 'incomplete mapping pair in event stream')\n }\n\n if (frame.kind === 'document') {\n state.documents.push(frame.value)\n } else {\n const value = frame.tag.carrierIsResult\n ? frame.value\n : finalizeCollection(state, frame.position, frame.tag, frame.value)\n if (frame.anchor) {\n frame.anchor.value = value\n frame.anchor.isValueFinal = true\n }\n addValue(state, value, frame.tag)\n }\n break\n }\n }\n }\n\n return state.documents\n}\n\nexport {\n constructFromEvents,\n DEFAULT_CONSTRUCTOR_OPTIONS,\n type ConstructorOptions\n}\n","import {\n EVENT_DOCUMENT,\n EVENT_SEQUENCE,\n EVENT_MAPPING,\n EVENT_SCALAR,\n EVENT_ALIAS,\n EVENT_POP,\n SCALAR_STYLE_PLAIN,\n SCALAR_STYLE_SINGLE_QUOTED,\n SCALAR_STYLE_DOUBLE_QUOTED,\n SCALAR_STYLE_LITERAL_BLOCK,\n SCALAR_STYLE_FOLDED_BLOCK,\n COLLECTION_STYLE_BLOCK,\n COLLECTION_STYLE_FLOW,\n CHOMPING_CLIP,\n CHOMPING_STRIP,\n CHOMPING_KEEP,\n type Event,\n type ScalarStyle,\n type CollectionStyle,\n type Chomping,\n type DocumentDirective,\n type TagHandlers\n} from './events.ts'\nimport { throwErrorAt } from '../common/exception.ts'\n\nconst NO_RANGE = -1\nconst HAS_OWN = Object.prototype.hasOwnProperty\n\nconst CONTEXT_FLOW_IN = 1\nconst CONTEXT_FLOW_OUT = 2\nconst CONTEXT_BLOCK_IN = 3\nconst CONTEXT_BLOCK_OUT = 4\n\n// eslint-disable-next-line no-control-regex\nconst PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/\n// eslint-disable-next-line no-useless-escape\nconst PATTERN_FLOW_INDICATORS = /[,\\[\\]{}]/\n// YAML 1.2.2, [91] c-tag-handle.\n// eslint-disable-next-line no-useless-escape\nconst PATTERN_TAG_HANDLE = /^(?:!|!!|![0-9A-Za-z-]+!)$/\n// YAML 1.2.2, [39] ns-uri-char.\n// eslint-disable-next-line no-useless-escape\nconst NS_URI_CHAR = String.raw`(?:%[0-9A-Fa-f]{2}|[0-9A-Za-z\\-#;/?:@&=+$,_.!~*'()\\[\\]])`\n// YAML 1.2.2, [40] ns-tag-char = ns-uri-char - \"!\" - c-flow-indicator.\n// eslint-disable-next-line no-useless-escape\nconst NS_TAG_CHAR = String.raw`(?:%[0-9A-Fa-f]{2}|[0-9A-Za-z\\-#;/?:@&=+$.~*'()_])`\nconst PATTERN_TAG_URI = new RegExp(`^(?:${NS_URI_CHAR})*$`)\n// YAML 1.2.2, [99] c-ns-shorthand-tag suffix part.\nconst PATTERN_TAG_SUFFIX = new RegExp(`^(?:${NS_TAG_CHAR})+$`)\n// YAML 1.2.2, [93] ns-tag-prefix.\nconst PATTERN_TAG_PREFIX = new RegExp(`^(?:!(?:${NS_URI_CHAR})*|${NS_TAG_CHAR}(?:${NS_URI_CHAR})*)$`)\n\ntype NodeContext =\n typeof CONTEXT_FLOW_IN | typeof CONTEXT_FLOW_OUT |\n typeof CONTEXT_BLOCK_IN | typeof CONTEXT_BLOCK_OUT\n\ninterface NodeProperties {\n anchorStart: number\n anchorEnd: number\n tagStart: number\n tagEnd: number\n}\n\ninterface ParserSnapshot {\n position: number\n line: number\n lineStart: number\n lineIndent: number\n firstTabInLine: number\n eventsLength: number\n}\n\ninterface ParserOptions {\n filename?: string\n maxDepth?: number\n}\n\nconst DEFAULT_PARSER_OPTIONS: Required<ParserOptions> = {\n filename: '',\n maxDepth: 100\n}\n\ninterface ParserState extends Required<ParserOptions> {\n input: string\n length: number\n position: number\n line: number\n lineStart: number\n lineIndent: number\n firstTabInLine: number\n depth: number\n directives: DocumentDirective[]\n tagHandlers: TagHandlers\n events: Event[]\n}\n\nfunction addDocumentEvent (\n state: ParserState,\n explicitStart: boolean,\n explicitEnd: boolean\n) {\n state.events.push({\n type: EVENT_DOCUMENT,\n explicitStart,\n explicitEnd,\n directives: state.directives\n })\n}\n\nfunction addSequenceEvent (\n state: ParserState,\n start: number,\n anchorStart: number,\n anchorEnd: number,\n tagStart: number,\n tagEnd: number,\n style: CollectionStyle\n) {\n state.events.push({\n type: EVENT_SEQUENCE,\n start,\n anchorStart,\n anchorEnd,\n tagStart,\n tagEnd,\n style\n })\n}\n\nfunction addMappingEvent (\n state: ParserState,\n start: number,\n anchorStart: number,\n anchorEnd: number,\n tagStart: number,\n tagEnd: number,\n style: CollectionStyle\n) {\n state.events.push({\n type: EVENT_MAPPING,\n start,\n anchorStart,\n anchorEnd,\n tagStart,\n tagEnd,\n style\n })\n}\n\nfunction insertFlowPairMappingEvent (state: ParserState, snapshot: ParserSnapshot) {\n state.events.splice(snapshot.eventsLength, 0, {\n type: EVENT_MAPPING,\n start: snapshot.position,\n anchorStart: NO_RANGE,\n anchorEnd: NO_RANGE,\n tagStart: NO_RANGE,\n tagEnd: NO_RANGE,\n style: COLLECTION_STYLE_FLOW\n })\n}\n\nfunction addScalarEvent (\n state: ParserState,\n valueStart: number,\n valueEnd: number,\n anchorStart: number,\n anchorEnd: number,\n tagStart: number,\n tagEnd: number,\n style: ScalarStyle,\n chomping: Chomping = CHOMPING_CLIP,\n indent = -1,\n fast = false\n) {\n state.events.push({\n type: EVENT_SCALAR,\n valueStart,\n valueEnd,\n anchorStart,\n anchorEnd,\n tagStart,\n tagEnd,\n style,\n chomping,\n indent,\n fast\n })\n}\n\nfunction addAliasEvent (\n state: ParserState,\n anchorStart: number,\n anchorEnd: number\n) {\n state.events.push({\n type: EVENT_ALIAS,\n anchorStart,\n anchorEnd\n })\n}\n\nfunction addPopEvent (state: ParserState) {\n state.events.push({ type: EVENT_POP })\n}\n\nfunction addEmptyScalarEvent (state: ParserState) {\n addScalarEvent(\n state,\n NO_RANGE,\n NO_RANGE,\n NO_RANGE,\n NO_RANGE,\n NO_RANGE,\n NO_RANGE,\n SCALAR_STYLE_PLAIN\n )\n}\n\nfunction emptyProperties (): NodeProperties {\n return {\n anchorStart: NO_RANGE,\n anchorEnd: NO_RANGE,\n tagStart: NO_RANGE,\n tagEnd: NO_RANGE\n }\n}\n\nfunction snapshotState (state: ParserState): ParserSnapshot {\n return {\n position: state.position,\n line: state.line,\n lineStart: state.lineStart,\n lineIndent: state.lineIndent,\n firstTabInLine: state.firstTabInLine,\n eventsLength: state.events.length\n }\n}\n\nfunction restoreState (state: ParserState, snapshot: ParserSnapshot) {\n state.position = snapshot.position\n state.line = snapshot.line\n state.lineStart = snapshot.lineStart\n state.lineIndent = snapshot.lineIndent\n state.firstTabInLine = snapshot.firstTabInLine\n state.events.length = snapshot.eventsLength\n}\n\nfunction throwError (state: ParserState, message: string): never {\n throwErrorAt(state.input.slice(0, state.length), state.position, message, state.filename)\n}\n\nfunction isEol (c: number) {\n return c === 0x0A/* LF */ || c === 0x0D/* CR */\n}\n\nfunction isWhiteSpace (c: number) {\n return c === 0x09/* Tab */ || c === 0x20/* Space */\n}\n\nfunction isWsOrEol (c: number) {\n return isWhiteSpace(c) || isEol(c)\n}\n\nfunction isWsOrEolOrEnd (c: number) {\n return c === 0 || isWsOrEol(c)\n}\n\nfunction isFlowIndicator (c: number) {\n return c === 0x2C/* , */ ||\n c === 0x5B/* [ */ ||\n c === 0x5D/* ] */ ||\n c === 0x7B/* { */ ||\n c === 0x7D/* } */\n}\n\nfunction fromDecimalCode (c: number) {\n return c >= 0x30/* 0 */ && c <= 0x39/* 9 */ ? c - 0x30 : -1\n}\n\nfunction fromHexCode (c: number) {\n if (c >= 0x30/* 0 */ && c <= 0x39/* 9 */) return c - 0x30\n const lc = c | 0x20\n if (lc >= 0x61/* a */ && lc <= 0x66/* f */) return lc - 0x61 + 10\n return -1\n}\n\nfunction escapedHexLen (c: number) {\n if (c === 0x78/* x */) return 2\n if (c === 0x75/* u */) return 4\n if (c === 0x55/* U */) return 8\n return 0\n}\n\nfunction isSimpleEscape (c: number) {\n return c === 0x30/* 0 */ ||\n c === 0x61/* a */ ||\n c === 0x62/* b */ ||\n c === 0x74/* t */ ||\n c === 0x09/* Tab */ ||\n c === 0x6E/* n */ ||\n c === 0x76/* v */ ||\n c === 0x66/* f */ ||\n c === 0x72/* r */ ||\n c === 0x65/* e */ ||\n c === 0x20/* Space */ ||\n c === 0x22/* \" */ ||\n c === 0x2F/* / */ ||\n c === 0x5C/* \\ */ ||\n c === 0x4E/* N */ ||\n c === 0x5F/* _ */ ||\n c === 0x4C/* L */ ||\n c === 0x50/* P */\n}\n\n// Precondition: state.position points at LF or CR.\nfunction consumeLineBreak (state: ParserState) {\n const ch = state.input.charCodeAt(state.position)\n\n if (ch === 0x0A/* LF */) {\n state.position++\n } else {\n state.position++\n if (state.input.charCodeAt(state.position) === 0x0A/* LF */) state.position++\n }\n\n state.line++\n state.lineStart = state.position\n state.lineIndent = 0\n state.firstTabInLine = -1\n}\n\nfunction skipSeparationSpace (state: ParserState, allowComments: boolean) {\n let lineBreaks = 0\n let ch = state.input.charCodeAt(state.position)\n let hasSeparation = state.position === state.lineStart ||\n isWsOrEol(state.input.charCodeAt(state.position - 1))\n\n while (ch !== 0) {\n while (isWhiteSpace(ch)) {\n hasSeparation = true\n if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {\n state.firstTabInLine = state.position\n }\n ch = state.input.charCodeAt(++state.position)\n }\n\n if (allowComments && hasSeparation && ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position) }\n while (!isEol(ch) && ch !== 0)\n }\n\n if (!isEol(ch)) break\n\n consumeLineBreak(state)\n lineBreaks++\n hasSeparation = true\n ch = state.input.charCodeAt(state.position)\n\n while (ch === 0x20/* Space */) {\n state.lineIndent++\n ch = state.input.charCodeAt(++state.position)\n }\n }\n\n return lineBreaks\n}\n\nfunction testDocumentSeparator (state: ParserState, position = state.position) {\n const ch = state.input.charCodeAt(position)\n\n if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&\n ch === state.input.charCodeAt(position + 1) &&\n ch === state.input.charCodeAt(position + 2)) {\n const following = state.input.charCodeAt(position + 3)\n return following === 0 || isWsOrEol(following)\n }\n\n return false\n}\n\nfunction skipUntilLineEnd (state: ParserState) {\n let ch = state.input.charCodeAt(state.position)\n\n while (ch !== 0 && !isEol(ch)) {\n ch = state.input.charCodeAt(++state.position)\n }\n}\n\nfunction checkPrintable (state: ParserState, start: number, end: number) {\n if (PATTERN_NON_PRINTABLE.test(state.input.slice(start, end))) {\n throwError(state, 'the stream contains non-printable characters')\n }\n}\n\nfunction readTagProperty (state: ParserState, props: NodeProperties, inFlow: boolean) {\n if (state.input.charCodeAt(state.position) !== 0x21/* ! */) return false\n if (props.tagStart !== NO_RANGE) throwError(state, 'duplication of a tag property')\n\n const start = state.position\n let isVerbatim = false\n let isNamed = false\n let tagHandle = '!'\n let ch = state.input.charCodeAt(++state.position)\n\n if (ch === 0x3C/* < */) {\n isVerbatim = true\n ch = state.input.charCodeAt(++state.position)\n } else if (ch === 0x21/* ! */) {\n isNamed = true\n tagHandle = '!!'\n ch = state.input.charCodeAt(++state.position)\n }\n\n let suffixStart = state.position\n let tagName\n\n if (isVerbatim) {\n while (ch !== 0 && ch !== 0x3E/* > */) ch = state.input.charCodeAt(++state.position)\n if (ch !== 0x3E/* > */) throwError(state, 'unexpected end of the stream within a verbatim tag')\n tagName = state.input.slice(suffixStart, state.position)\n state.position++\n } else {\n while (ch !== 0 && !isWsOrEol(ch) && !(inFlow && isFlowIndicator(ch))) {\n if (ch === 0x21/* ! */) {\n if (!isNamed) {\n tagHandle = state.input.slice(suffixStart - 1, state.position + 1)\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) throwError(state, 'named tag handle cannot contain such characters')\n isNamed = true\n suffixStart = state.position + 1\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks')\n }\n }\n\n ch = state.input.charCodeAt(++state.position)\n }\n\n tagName = state.input.slice(suffixStart, state.position)\n if (PATTERN_FLOW_INDICATORS.test(tagName)) throwError(state, 'tag suffix cannot contain flow indicator characters')\n }\n\n if (tagName && !(isVerbatim ? PATTERN_TAG_URI.test(tagName) : PATTERN_TAG_SUFFIX.test(tagName))) {\n throwError(state, `tag name cannot contain such characters: ${tagName}`)\n }\n try {\n decodeURIComponent(tagName)\n } catch {\n throwError(state, `tag name is malformed: ${tagName}`)\n }\n\n if (!isVerbatim && tagHandle !== '!' && tagHandle !== '!!' && !HAS_OWN.call(state.tagHandlers, tagHandle)) {\n throwError(state, `undeclared tag handle \"${tagHandle}\"`)\n }\n\n props.tagStart = start\n props.tagEnd = state.position\n return true\n}\n\nfunction readAnchorProperty (state: ParserState, props: NodeProperties) {\n if (state.input.charCodeAt(state.position) !== 0x26/* & */) return false\n if (props.anchorStart !== NO_RANGE) throwError(state, 'duplication of an anchor property')\n\n state.position++\n const start = state.position\n\n while (state.input.charCodeAt(state.position) !== 0 && !isWsOrEol(state.input.charCodeAt(state.position)) && !isFlowIndicator(state.input.charCodeAt(state.position))) {\n state.position++\n }\n\n if (state.position === start) throwError(state, 'name of an anchor node must contain at least one character')\n\n props.anchorStart = start\n props.anchorEnd = state.position\n return true\n}\n\nfunction readAlias (state: ParserState, props: NodeProperties) {\n if (state.input.charCodeAt(state.position) !== 0x2A/* * */) return false\n if (props.anchorStart !== NO_RANGE || props.tagStart !== NO_RANGE) {\n throwError(state, 'alias node should not have any properties')\n }\n\n state.position++\n const start = state.position\n\n while (state.input.charCodeAt(state.position) !== 0 && !isWsOrEol(state.input.charCodeAt(state.position)) && !isFlowIndicator(state.input.charCodeAt(state.position))) {\n state.position++\n }\n\n if (state.position === start) throwError(state, 'name of an alias node must contain at least one character')\n\n addAliasEvent(state, start, state.position)\n return true\n}\n\nfunction readFlowScalarBreak (state: ParserState, nodeIndent: number) {\n skipSeparationSpace(state, false)\n\n if (state.lineIndent < nodeIndent) {\n throwError(state, 'deficient indentation')\n }\n}\n\nfunction readSingleQuotedScalar (state: ParserState, nodeIndent: number, props: NodeProperties) {\n if (state.input.charCodeAt(state.position) !== 0x27/* ' */) return false\n\n state.position++\n const start = state.position\n // A single-quoted scalar is sliceable verbatim when it has no '' escape pairs\n // and no folded line breaks (see getScalarValue fast path).\n let simple = true\n\n while (state.input.charCodeAt(state.position) !== 0) {\n const ch = state.input.charCodeAt(state.position)\n\n if (ch === 0x27/* ' */) {\n if (state.input.charCodeAt(state.position + 1) === 0x27/* ' */) {\n simple = false\n state.position += 2\n continue\n }\n\n const end = state.position\n state.position++\n addScalarEvent(state, start, end, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, SCALAR_STYLE_SINGLE_QUOTED, CHOMPING_CLIP, -1, simple)\n return true\n }\n\n if (isEol(ch)) {\n simple = false\n readFlowScalarBreak(state, nodeIndent)\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar')\n } else if (ch !== 0x09/* Tab */ && ch < 0x20) {\n throwError(state, 'expected valid JSON character')\n } else {\n state.position++\n }\n }\n\n throwError(state, 'unexpected end of the stream within a single quoted scalar')\n}\n\nfunction readDoubleQuotedScalar (state: ParserState, nodeIndent: number, props: NodeProperties) {\n if (state.input.charCodeAt(state.position) !== 0x22/* \" */) return false\n\n state.position++\n const start = state.position\n // A double-quoted scalar is sliceable verbatim when it has no \\ escapes and\n // no folded line breaks (see getScalarValue fast path).\n let simple = true\n\n while (state.input.charCodeAt(state.position) !== 0) {\n const ch = state.input.charCodeAt(state.position)\n\n if (ch === 0x22/* \" */) {\n const end = state.position\n state.position++\n addScalarEvent(state, start, end, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, SCALAR_STYLE_DOUBLE_QUOTED, CHOMPING_CLIP, -1, simple)\n return true\n }\n\n if (ch === 0x5C/* \\ */) {\n simple = false\n const escaped = state.input.charCodeAt(++state.position)\n\n if (isEol(escaped)) {\n readFlowScalarBreak(state, nodeIndent)\n } else if (isSimpleEscape(escaped)) {\n state.position++\n } else {\n let hexLength = escapedHexLen(escaped)\n\n if (hexLength === 0) throwError(state, 'unknown escape sequence')\n\n while (hexLength-- > 0) {\n state.position++\n if (fromHexCode(state.input.charCodeAt(state.position)) < 0) {\n throwError(state, 'expected hexadecimal character')\n }\n }\n state.position++\n }\n } else if (isEol(ch)) {\n simple = false\n readFlowScalarBreak(state, nodeIndent)\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar')\n } else if (ch !== 0x09/* Tab */ && ch < 0x20) {\n throwError(state, 'expected valid JSON character')\n } else {\n state.position++\n }\n }\n\n throwError(state, 'unexpected end of the stream within a double quoted scalar')\n}\n\nfunction readBlockScalar (state: ParserState, parentIndent: number, props: NodeProperties) {\n const ch = state.input.charCodeAt(state.position)\n let chomping: Chomping = CHOMPING_CLIP\n let indent = -1\n let detectedIndent = false\n\n if (ch !== 0x7C/* | */ && ch !== 0x3E/* > */) return false\n\n const style = ch === 0x7C/* | */ ? SCALAR_STYLE_LITERAL_BLOCK : SCALAR_STYLE_FOLDED_BLOCK\n state.position++\n\n while (state.input.charCodeAt(state.position) !== 0) {\n const current = state.input.charCodeAt(state.position)\n const digit = fromDecimalCode(current)\n\n if (current === 0x2B/* + */ || current === 0x2D/* - */) {\n if (chomping !== CHOMPING_CLIP) throwError(state, 'repeat of a chomping mode identifier')\n chomping = current === 0x2B/* + */ ? CHOMPING_KEEP : CHOMPING_STRIP\n state.position++\n } else if (digit >= 0) {\n if (digit === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one')\n }\n if (detectedIndent) throwError(state, 'repeat of an indentation width identifier')\n indent = parentIndent + digit - 1\n detectedIndent = true\n state.position++\n } else {\n break\n }\n }\n\n let hadWhitespace = false\n while (isWhiteSpace(state.input.charCodeAt(state.position))) {\n hadWhitespace = true\n state.position++\n }\n if (hadWhitespace && state.input.charCodeAt(state.position) === 0x23/* # */) skipUntilLineEnd(state)\n\n if (isEol(state.input.charCodeAt(state.position))) {\n consumeLineBreak(state)\n } else if (state.input.charCodeAt(state.position) !== 0) {\n throwError(state, 'a line break is expected')\n }\n\n let contentIndent = detectedIndent ? indent : -1\n let maxLeadingIndent = 0\n const valueStart = state.position\n let valueEnd = state.position\n\n while (state.input.charCodeAt(state.position) !== 0) {\n const linePosition = state.position\n let column = 0\n\n while (state.input.charCodeAt(linePosition + column) === 0x20/* Space */) column++\n\n const first = state.input.charCodeAt(linePosition + column)\n if (first === 0) {\n // End of input acts as a line terminator, but there is no line break to\n // include here. A final all-spaces line still counts: when the block has a\n // content indent, the spaces beyond it are real content; in a wholly blank\n // block (contentIndent < 0) the spaces form a blank line that chomping must\n // see, exactly as it would if the line ended with a break. Capture the line\n // in both cases; otherwise the block ends at the start of this empty line.\n if (contentIndent >= 0) {\n if (column > contentIndent) valueEnd = linePosition + column\n } else if (column > 0) {\n valueEnd = linePosition + column\n }\n break\n }\n if (linePosition === state.lineStart && testDocumentSeparator(state, linePosition)) break\n\n if (!detectedIndent && contentIndent === -1 && isEol(first)) {\n maxLeadingIndent = Math.max(maxLeadingIndent, column)\n }\n\n if (!detectedIndent && contentIndent === -1 && !isEol(first)) {\n if (first === 0x09/* Tab */ && column < parentIndent) {\n state.position = linePosition + column\n throwError(state, 'tab characters must not be used in indentation')\n }\n if (column < maxLeadingIndent) {\n state.position = linePosition + column\n throwError(state, 'bad indentation of a mapping entry')\n }\n }\n\n if (contentIndent === -1 && first !== 0 && !isEol(first) && column < parentIndent) {\n state.lineIndent = column\n state.position = linePosition + column\n break\n }\n\n if (!detectedIndent && first !== 0 && !isEol(first) && contentIndent === -1) {\n contentIndent = column\n }\n\n const requiredIndent = contentIndent === -1 ? parentIndent + 1 : contentIndent\n if (first !== 0 && !isEol(first) && column < requiredIndent) {\n state.lineIndent = column\n state.position = linePosition + column\n break\n }\n\n skipUntilLineEnd(state)\n valueEnd = state.position\n if (isEol(state.input.charCodeAt(state.position))) {\n consumeLineBreak(state)\n // Include the line break in the range so trailing blank lines are\n // preserved. This is what lets cook tell apart an empty `|+` (range \"\",\n // value \"\") from a `|+` with one blank line (range \"\\n\", value \"\\n\").\n // De-indent and chomping are applied later in getScalarValue.\n valueEnd = state.position\n }\n }\n\n checkPrintable(state, valueStart, valueEnd)\n addScalarEvent(\n state,\n valueStart,\n valueEnd,\n props.anchorStart,\n props.anchorEnd,\n props.tagStart,\n props.tagEnd,\n style,\n chomping,\n contentIndent\n )\n return true\n}\n\nfunction canStartPlainScalar (state: ParserState, nodeContext: NodeContext) {\n const ch = state.input.charCodeAt(state.position)\n const inFlow = nodeContext === CONTEXT_FLOW_IN\n\n if (ch === 0 ||\n isWsOrEol(ch) ||\n ch === 0x23/* # */ ||\n ch === 0x26/* & */ ||\n ch === 0x2A/* * */ ||\n ch === 0x21/* ! */ ||\n ch === 0x7C/* | */ ||\n ch === 0x3E/* > */ ||\n ch === 0x27/* ' */ ||\n ch === 0x22/* \" */ ||\n ch === 0x25/* % */ ||\n ch === 0x40/* @ */ ||\n ch === 0x60/* ` */ ||\n (inFlow && isFlowIndicator(ch))) {\n return false\n }\n\n if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {\n const following = state.input.charCodeAt(state.position + 1)\n if (isWsOrEolOrEnd(following) || (inFlow && isFlowIndicator(following))) return false\n }\n\n return true\n}\n\nfunction readPlainScalar (state: ParserState, nodeIndent: number, nodeContext: NodeContext, props: NodeProperties) {\n if (!canStartPlainScalar(state, nodeContext)) return false\n\n const start = state.position\n let end = state.position\n let ch = state.input.charCodeAt(state.position)\n const inFlow = nodeContext === CONTEXT_FLOW_IN\n // A single-line plain scalar is sliceable verbatim: the parser already trims\n // trailing whitespace from the range, so no folding is needed (see\n // getScalarValue fast path). Folded line breaks make it non-simple.\n let multiline = false\n\n while (ch !== 0) {\n if (state.position === state.lineStart && testDocumentSeparator(state)) break\n\n if (ch === 0x3A/* : */) {\n const following = state.input.charCodeAt(state.position + 1)\n if (isWsOrEolOrEnd(following) || (inFlow && isFlowIndicator(following))) break\n } else if (ch === 0x23/* # */) {\n const preceding = state.input.charCodeAt(state.position - 1)\n if (isWsOrEol(preceding)) break\n } else if (inFlow && isFlowIndicator(ch)) {\n break\n } else if (isEol(ch)) {\n const savedPosition = state.position\n const savedLine = state.line\n const savedLineStart = state.lineStart\n const savedLineIndent = state.lineIndent\n\n skipSeparationSpace(state, false)\n\n if (state.lineIndent >= nodeIndent) {\n multiline = true\n ch = state.input.charCodeAt(state.position)\n continue\n }\n\n state.position = savedPosition\n state.line = savedLine\n state.lineStart = savedLineStart\n state.lineIndent = savedLineIndent\n break\n }\n\n if (!isWhiteSpace(ch)) end = state.position + 1\n ch = state.input.charCodeAt(++state.position)\n }\n\n if (end === start) return false\n\n checkPrintable(state, start, end)\n addScalarEvent(state, start, end, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, SCALAR_STYLE_PLAIN, CHOMPING_CLIP, -1, !multiline)\n return true\n}\n\nfunction findBlockMappingColon (state: ParserState) {\n let position = state.position\n let flowLevel = 0\n\n while (position < state.length) {\n const ch = state.input.charCodeAt(position)\n\n if (isEol(ch)) return -1\n if (ch === 0x23/* # */ && isWsOrEol(state.input.charCodeAt(position - 1))) return -1\n\n if ((ch === 0x2A/* * */ || ch === 0x26/* & */) && position === state.position) {\n do { position++ }\n while (state.input.charCodeAt(position) !== 0 &&\n !isWsOrEol(state.input.charCodeAt(position)) &&\n !isFlowIndicator(state.input.charCodeAt(position)))\n continue\n }\n\n if (ch === 0x5B/* [ */ || ch === 0x7B/* { */) {\n flowLevel++\n } else if (ch === 0x5D/* ] */ || ch === 0x7D/* } */) {\n if (flowLevel > 0) flowLevel--\n } else if (flowLevel === 0 && ch === 0x3A/* : */ && isWsOrEol(state.input.charCodeAt(position + 1))) {\n return position\n }\n\n if ((flowLevel > 0 || position === state.position) &&\n (ch === 0x27/* ' */ || ch === 0x22/* \" */)) {\n const quote = ch\n position++\n\n while (position < state.length && state.input.charCodeAt(position) !== quote) {\n if (state.input.charCodeAt(position) === 0x5C/* \\ */ && quote === 0x22/* \" */) position++\n position++\n }\n }\n\n position++\n }\n\n return -1\n}\n\nfunction skipFlowSeparationSpace (state: ParserState, nodeIndent: number) {\n const startLine = state.line\n skipSeparationSpace(state, true)\n\n if ((state.line > startLine && state.lineIndent < nodeIndent) ||\n (state.firstTabInLine !== -1 && state.lineIndent < nodeIndent)) {\n throwError(state, 'deficient indentation')\n }\n}\n\nfunction readFlowCollection (state: ParserState, nodeIndent: number, props: NodeProperties) {\n const ch = state.input.charCodeAt(state.position)\n const isMapping = ch === 0x7B/* { */\n const start = state.position\n let readNext = true\n\n if (ch !== 0x5B/* [ */ && ch !== 0x7B/* { */) return false\n\n const terminator = isMapping ? 0x7D/* } */ : 0x5D/* ] */\n\n if (isMapping) {\n addMappingEvent(state, start, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, COLLECTION_STYLE_FLOW)\n } else {\n addSequenceEvent(state, start, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, COLLECTION_STYLE_FLOW)\n }\n\n state.position++\n\n while (state.input.charCodeAt(state.position) !== 0) {\n skipFlowSeparationSpace(state, nodeIndent)\n\n let ch = state.input.charCodeAt(state.position)\n\n if (ch === terminator) {\n state.position++\n addPopEvent(state)\n return true\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries')\n } else if (ch === 0x2C/* , */) {\n throwError(state, \"expected the node content, but found ','\")\n }\n\n let isPair = false\n let isExplicitPair = false\n\n if (ch === 0x3F/* ? */ && isWsOrEol(state.input.charCodeAt(state.position + 1))) {\n isPair = isExplicitPair = true\n state.position += 1\n skipFlowSeparationSpace(state, nodeIndent)\n }\n\n const entryLine = state.line\n const entryStart = snapshotState(state)\n\n const keyWasRead = parseNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true)\n skipFlowSeparationSpace(state, nodeIndent)\n\n ch = state.input.charCodeAt(state.position)\n\n if ((isMapping || isExplicitPair || state.line === entryLine) && ch === 0x3A/* : */) {\n isPair = true\n state.position++\n skipFlowSeparationSpace(state, nodeIndent)\n if (!isMapping) {\n insertFlowPairMappingEvent(state, entryStart)\n if (!keyWasRead) addEmptyScalarEvent(state)\n } else if (!keyWasRead) {\n addEmptyScalarEvent(state)\n }\n if (!parseNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true)) {\n addEmptyScalarEvent(state)\n }\n skipFlowSeparationSpace(state, nodeIndent)\n if (!isMapping) addPopEvent(state)\n } else if (isMapping && isPair) {\n if (!keyWasRead) addEmptyScalarEvent(state)\n addEmptyScalarEvent(state)\n } else if (isMapping) {\n addEmptyScalarEvent(state)\n } else if (isPair) {\n insertFlowPairMappingEvent(state, entryStart)\n if (!keyWasRead) addEmptyScalarEvent(state)\n addEmptyScalarEvent(state)\n addPopEvent(state)\n }\n\n ch = state.input.charCodeAt(state.position)\n\n if (ch === 0x2C/* , */) {\n readNext = true\n state.position++\n } else {\n readNext = false\n }\n }\n\n throwError(state, 'unexpected end of the stream within a flow collection')\n}\n\nfunction readBlockSequence (state: ParserState, nodeIndent: number, props: NodeProperties) {\n if (state.firstTabInLine !== -1 || state.input.charCodeAt(state.position) !== 0x2D/* - */ || !isWsOrEolOrEnd(state.input.charCodeAt(state.position + 1))) {\n return false\n }\n\n addSequenceEvent(state, state.position, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, COLLECTION_STYLE_BLOCK)\n\n while (state.input.charCodeAt(state.position) === 0x2D/* - */ && isWsOrEolOrEnd(state.input.charCodeAt(state.position + 1))) {\n if (state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine\n throwError(state, 'tab characters must not be used in indentation')\n }\n\n const entryLine = state.line\n state.position++\n\n const hadBreak = skipSeparationSpace(state, true) > 0\n if (state.firstTabInLine !== -1 &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n isWsOrEolOrEnd(state.input.charCodeAt(state.position + 1))) {\n throwError(state, 'bad indentation of a sequence entry')\n }\n\n if (hadBreak && state.lineIndent <= nodeIndent) {\n addEmptyScalarEvent(state)\n } else {\n parseNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true)\n }\n\n skipSeparationSpace(state, true)\n\n if (state.lineIndent < nodeIndent || state.position >= state.length) break\n if (state.lineIndent > nodeIndent) throwError(state, 'bad indentation of a sequence entry')\n if (state.line === entryLine &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n isWsOrEolOrEnd(state.input.charCodeAt(state.position + 1))) {\n throwError(state, 'bad indentation of a sequence entry')\n }\n }\n\n addPopEvent(state)\n return true\n}\n\nfunction readBlockMapping (state: ParserState, nodeIndent: number, flowIndent: number, props: NodeProperties) {\n let atExplicitKey = false\n let detected = false\n let mappingOpened = false\n let pendingExplicitKey = false\n\n if (state.firstTabInLine !== -1) return false\n\n let ch = state.input.charCodeAt(state.position)\n\n while (ch !== 0) {\n if (!atExplicitKey && state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine\n throwError(state, 'tab characters must not be used in indentation')\n }\n\n const following = state.input.charCodeAt(state.position + 1)\n const entryLine = state.line\n\n if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && isWsOrEolOrEnd(following)) {\n if (!mappingOpened) {\n addMappingEvent(state, state.position, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, COLLECTION_STYLE_BLOCK)\n mappingOpened = true\n }\n\n if (ch === 0x3F/* ? */) {\n if (atExplicitKey) addEmptyScalarEvent(state)\n detected = true\n atExplicitKey = true\n } else if (atExplicitKey) {\n atExplicitKey = false\n } else {\n addEmptyScalarEvent(state)\n detected = true\n atExplicitKey = false\n }\n\n state.position += 1\n pendingExplicitKey = true\n } else {\n // An explicit key awaiting its value, followed by an implicit key, means\n // the explicit key's value is empty. Emit it now (append-only) so it is\n // ordered before the implicit key node read just below.\n if (atExplicitKey) {\n addEmptyScalarEvent(state)\n atExplicitKey = false\n }\n\n const beforeKey = snapshotState(state)\n\n if (!parseNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n break\n }\n\n if (state.line === entryLine) {\n ch = state.input.charCodeAt(state.position)\n\n while (isWhiteSpace(ch)) {\n ch = state.input.charCodeAt(++state.position)\n }\n\n if (ch === 0x3A/* : */) {\n ch = state.input.charCodeAt(++state.position)\n\n if (!isWsOrEolOrEnd(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping')\n }\n\n if (!mappingOpened) {\n restoreState(state, beforeKey)\n addMappingEvent(state, beforeKey.position, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, COLLECTION_STYLE_BLOCK)\n mappingOpened = true\n // The key, the `:` and the space after it were already validated\n // above, before the rollback. Re-reading the same input cannot\n // fail, so just consume it again without error checks.\n parseNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)\n\n ch = state.input.charCodeAt(state.position)\n while (isWhiteSpace(ch)) {\n ch = state.input.charCodeAt(++state.position)\n }\n\n state.position++\n }\n\n detected = true\n atExplicitKey = false\n pendingExplicitKey = false\n } else if (detected) {\n throwError(state, \"expected ':' after a mapping key\")\n } else {\n // Not a mapping. If outer properties are pending, roll back so the\n // caller re-reads this node with them attached (events are append-only).\n if (props.anchorStart !== NO_RANGE || props.tagStart !== NO_RANGE) {\n restoreState(state, beforeKey)\n return false\n }\n return true\n }\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key')\n } else {\n if (props.anchorStart !== NO_RANGE || props.tagStart !== NO_RANGE) {\n restoreState(state, beforeKey)\n return false\n }\n return true\n }\n }\n\n if (parseNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, pendingExplicitKey)) {\n pendingExplicitKey = false\n }\n\n if (!atExplicitKey) {\n if (pendingExplicitKey) {\n addEmptyScalarEvent(state)\n pendingExplicitKey = false\n }\n }\n\n skipSeparationSpace(state, true)\n ch = state.input.charCodeAt(state.position)\n\n if ((state.line === entryLine || state.lineIndent > nodeIndent) && ch !== 0) {\n throwError(state, 'bad indentation of a mapping entry')\n } else if (state.lineIndent < nodeIndent) {\n break\n }\n }\n\n if (!detected) return false\n if (atExplicitKey) addEmptyScalarEvent(state)\n if (mappingOpened) addPopEvent(state)\n return true\n}\n\nfunction parseNode (\n state: ParserState,\n parentIndent: number,\n nodeContext: NodeContext,\n allowToSeek: boolean,\n allowCompact: boolean,\n allowPropertyMapping = true\n): boolean {\n if (state.depth >= state.maxDepth) {\n throwError(state, `nesting exceeded maxDepth (${state.maxDepth})`)\n }\n\n state.depth++\n\n let indentStatus = 1\n let atNewLine = false\n let hasContent = false\n let propertyStart: ParserSnapshot | null = null\n const props = emptyProperties()\n\n let allowBlockScalars = nodeContext === CONTEXT_BLOCK_OUT || nodeContext === CONTEXT_BLOCK_IN\n let allowBlockCollections = allowBlockScalars\n const allowBlockStyles = allowBlockScalars\n\n if (allowToSeek && skipSeparationSpace(state, true)) {\n atNewLine = true\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0\n } else {\n indentStatus = -1\n }\n }\n\n if (indentStatus === 1) {\n while (true) {\n const ch = state.input.charCodeAt(state.position)\n const propertyState = snapshotState(state)\n\n if (atNewLine &&\n indentStatus !== 1 &&\n (ch === 0x21/* ! */ || ch === 0x26/* & */)) {\n break\n }\n\n if (atNewLine &&\n allowBlockStyles &&\n (props.tagStart !== NO_RANGE || props.anchorStart !== NO_RANGE) &&\n (ch === 0x21/* ! */ || ch === 0x26/* & */)) {\n const fallbackState = snapshotState(state)\n const flowIndent = parentIndent + 1\n const mappingIndent = state.position - state.lineStart\n\n if (readBlockMapping(state, mappingIndent, flowIndent, props) &&\n state.events[fallbackState.eventsLength]?.type === EVENT_MAPPING) {\n state.depth--\n return true\n }\n\n restoreState(state, fallbackState)\n }\n\n if (atNewLine &&\n ((ch === 0x21/* ! */ && props.tagStart !== NO_RANGE) ||\n (ch === 0x26/* & */ && props.anchorStart !== NO_RANGE))) {\n break\n }\n\n if (!readTagProperty(state, props, nodeContext === CONTEXT_FLOW_IN) && !readAnchorProperty(state, props)) {\n break\n }\n\n if (propertyStart === null) propertyStart = propertyState\n\n if (skipSeparationSpace(state, true)) {\n atNewLine = true\n allowBlockCollections = allowBlockStyles\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0\n } else {\n indentStatus = -1\n }\n } else {\n allowBlockCollections = false\n }\n }\n }\n\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact\n }\n\n if (indentStatus === 1 || nodeContext === CONTEXT_BLOCK_OUT) {\n const flowIndent = nodeContext === CONTEXT_FLOW_IN || nodeContext === CONTEXT_FLOW_OUT\n ? parentIndent\n : parentIndent + 1\n const blockIndent = state.position - state.lineStart\n\n if (indentStatus === 1) {\n if ((allowBlockCollections &&\n (readBlockSequence(state, blockIndent, props) ||\n readBlockMapping(state, blockIndent, flowIndent, props))) ||\n readFlowCollection(state, flowIndent, props)) {\n hasContent = true\n } else {\n const ch = state.input.charCodeAt(state.position)\n\n if (propertyStart !== null && allowPropertyMapping && allowBlockStyles && !allowBlockCollections &&\n ch !== 0x7C/* | */ && ch !== 0x3E/* > */) {\n const fallbackState = snapshotState(state)\n const propertyIndent = propertyStart.position - propertyStart.lineStart\n\n restoreState(state, propertyStart)\n\n if (readBlockMapping(state, propertyIndent, flowIndent, emptyProperties()) &&\n state.events[fallbackState.eventsLength]?.type === EVENT_MAPPING) {\n hasContent = true\n } else {\n restoreState(state, fallbackState)\n }\n }\n\n if (!hasContent &&\n ((allowBlockScalars && readBlockScalar(state, flowIndent, props)) ||\n readSingleQuotedScalar(state, flowIndent, props) ||\n readDoubleQuotedScalar(state, flowIndent, props) ||\n readAlias(state, props) ||\n readPlainScalar(state, flowIndent, nodeContext, props))) {\n hasContent = true\n }\n }\n } else if (indentStatus === 0) {\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent, props)\n }\n }\n\n allowBlockScalars = allowBlockScalars && !hasContent\n\n if (!hasContent && (props.anchorStart !== NO_RANGE || props.tagStart !== NO_RANGE || allowBlockScalars)) {\n addScalarEvent(\n state,\n NO_RANGE,\n NO_RANGE,\n props.anchorStart,\n props.anchorEnd,\n props.tagStart,\n props.tagEnd,\n SCALAR_STYLE_PLAIN\n )\n hasContent = true\n }\n\n state.depth--\n return hasContent || props.anchorStart !== NO_RANGE || props.tagStart !== NO_RANGE\n}\n\nfunction readDirective (state: ParserState) {\n if (state.lineIndent > 0 || state.input.charCodeAt(state.position) !== 0x25/* % */) return false\n\n state.position++\n const nameStart = state.position\n\n while (state.input.charCodeAt(state.position) !== 0 && !isWsOrEol(state.input.charCodeAt(state.position))) state.position++\n\n const name = state.input.slice(nameStart, state.position)\n const args: string[] = []\n\n if (name.length === 0) throwError(state, 'directive name must not be less than one character in length')\n\n while (state.input.charCodeAt(state.position) !== 0 && !isEol(state.input.charCodeAt(state.position))) {\n while (isWhiteSpace(state.input.charCodeAt(state.position))) state.position++\n if (state.input.charCodeAt(state.position) === 0x23/* # */ || isEol(state.input.charCodeAt(state.position)) || state.input.charCodeAt(state.position) === 0) break\n\n const start = state.position\n while (state.input.charCodeAt(state.position) !== 0 && !isWsOrEol(state.input.charCodeAt(state.position))) state.position++\n args.push(state.input.slice(start, state.position))\n }\n\n if (isEol(state.input.charCodeAt(state.position))) consumeLineBreak(state)\n\n if (name === 'YAML') {\n if (state.directives.some(directive => directive.kind === 'yaml')) throwError(state, 'duplication of %YAML directive')\n if (args.length !== 1) throwError(state, 'YAML directive accepts exactly one argument')\n\n const match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0])\n if (match === null) throwError(state, 'ill-formed argument of the YAML directive')\n if (parseInt(match[1], 10) !== 1) throwError(state, 'unacceptable YAML version of the document')\n\n state.directives.push({ kind: 'yaml', version: args[0] })\n } else if (name === 'TAG') {\n if (args.length !== 2) throwError(state, 'TAG directive accepts exactly two arguments')\n\n const [handle, prefix] = args\n if (!PATTERN_TAG_HANDLE.test(handle)) throwError(state, 'ill-formed tag handle (first argument) of the TAG directive')\n if (HAS_OWN.call(state.tagHandlers, handle)) throwError(state, `there is a previously declared suffix for \"${handle}\" tag handle`)\n if (!PATTERN_TAG_PREFIX.test(prefix)) throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive')\n try {\n decodeURIComponent(prefix)\n } catch {\n throwError(state, `tag prefix is malformed: ${prefix}`)\n }\n\n state.tagHandlers[handle] = prefix\n state.directives.push({ kind: 'tag', handle, prefix })\n }\n\n return true\n}\n\nfunction readDocument (state: ParserState) {\n state.directives = []\n state.tagHandlers = Object.create(null)\n let hasDirectives = false\n\n skipSeparationSpace(state, true)\n\n while (readDirective(state)) {\n hasDirectives = true\n skipSeparationSpace(state, true)\n }\n\n let explicitStart = false\n let explicitEnd = false\n let allowCompact = true\n\n if (state.lineIndent === 0 &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 2) === 0x2D/* - */ &&\n isWsOrEolOrEnd(state.input.charCodeAt(state.position + 3))) {\n explicitStart = true\n const markerLine = state.line\n state.position += 3\n skipSeparationSpace(state, true)\n allowCompact = state.line > markerLine\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected')\n }\n\n const documentEventIndex = state.events.length\n if (!explicitStart &&\n state.position === state.lineStart &&\n state.input.charCodeAt(state.position) === 0x2E/* . */ &&\n testDocumentSeparator(state)) {\n state.position += 3\n skipSeparationSpace(state, true)\n return\n }\n\n addDocumentEvent(state, explicitStart, false)\n if (!parseNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, allowCompact, allowCompact)) {\n addEmptyScalarEvent(state)\n }\n skipSeparationSpace(state, true)\n\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n explicitEnd = state.input.charCodeAt(state.position) === 0x2E/* . */\n if (explicitEnd) {\n const markerLine = state.line\n state.position += 3\n skipSeparationSpace(state, true)\n if (state.line === markerLine && state.position < state.length) {\n throwError(state, 'end of the stream or a document separator is expected')\n }\n }\n }\n\n const documentEvent = state.events[documentEventIndex]\n if (documentEvent?.type === EVENT_DOCUMENT) documentEvent.explicitEnd = explicitEnd\n\n addPopEvent(state)\n\n if (!explicitEnd &&\n state.position < state.length &&\n !(state.position === state.lineStart && testDocumentSeparator(state))) {\n throwError(state, 'end of the stream or a document separator is expected')\n }\n}\n\nfunction parseEvents (input: string, options: ParserOptions): Event[] {\n const length = input.length\n const state: ParserState = {\n ...DEFAULT_PARSER_OPTIONS,\n ...options,\n input: `${input}\\0`,\n length,\n position: 0,\n line: 0,\n lineStart: 0,\n lineIndent: 0,\n firstTabInLine: -1,\n depth: 0,\n directives: [],\n tagHandlers: Object.create(null),\n events: []\n }\n\n const nullpos = input.indexOf('\\0')\n if (nullpos !== -1) throwErrorAt(input, nullpos, 'null byte is not allowed in input', state.filename)\n\n if (state.input.charCodeAt(state.position) === 0xFEFF) state.position++\n\n while (state.position < state.length) {\n skipSeparationSpace(state, true)\n if (state.position >= state.length) break\n const documentStart = state.position\n readDocument(state)\n if (state.position === documentStart) {\n // Internal progress guard: if readDocument() ever returns without\n // consuming input, stop here instead of looping forever.\n /* c8 ignore next */\n throwError(state, 'can not read a document')\n }\n }\n\n return state.events\n}\n\nexport {\n parseEvents,\n DEFAULT_PARSER_OPTIONS,\n type ParserOptions\n}\n","import { YAMLException } from './common/exception.ts'\nimport { pick } from './common/object.ts'\nimport {\n constructFromEvents,\n DEFAULT_CONSTRUCTOR_OPTIONS,\n type ConstructorOptions\n} from './parser/constructor.ts'\nimport {\n parseEvents,\n DEFAULT_PARSER_OPTIONS,\n type ParserOptions\n} from './parser/parser.ts'\n\n// `source` is supplied by `loadDocuments` itself, not by the public caller.\ninterface LoadOptions extends ParserOptions, Omit<ConstructorOptions, 'source'> {}\n\ntype LoadAllIterator = (document: unknown) => void\n\nconst DEFAULT_LOAD_OPTIONS: Required<LoadOptions> = {\n ...DEFAULT_PARSER_OPTIONS,\n ...DEFAULT_CONSTRUCTOR_OPTIONS\n}\n\nfunction loadDocuments (input: string, options: LoadOptions = {}) {\n const opts = { ...DEFAULT_LOAD_OPTIONS, ...options }\n const source = String(input)\n\n const PARSER_OPT_KEYS = Object.keys(DEFAULT_PARSER_OPTIONS) as\n (keyof typeof DEFAULT_PARSER_OPTIONS)[]\n const CONSTRUCTOR_OPT_KEYS = Object.keys(DEFAULT_CONSTRUCTOR_OPTIONS) as\n (keyof typeof DEFAULT_CONSTRUCTOR_OPTIONS)[]\n\n const events = parseEvents(source, pick(opts, PARSER_OPT_KEYS))\n return constructFromEvents(events, { ...pick(opts, CONSTRUCTOR_OPT_KEYS), source })\n}\n\n// Signatures with iterator are deprecated. Will be removed in the next versions.\nfunction loadAll (input: string, options?: LoadOptions): unknown[]\nfunction loadAll (input: string, iterator: null, options?: LoadOptions): unknown[]\nfunction loadAll (input: string, iterator: LoadAllIterator, options?: LoadOptions): void\nfunction loadAll (\n input: string,\n iteratorOrOptions?: LoadAllIterator | LoadOptions | null,\n options?: LoadOptions\n) {\n let iterator: LoadAllIterator | null = null\n\n if (typeof iteratorOrOptions === 'function') {\n iterator = iteratorOrOptions\n } else if (iteratorOrOptions !== null && typeof iteratorOrOptions === 'object') {\n options = iteratorOrOptions\n }\n\n const documents = loadDocuments(input, options)\n\n if (iterator === null) return documents\n for (const document of documents) iterator(document)\n}\n\nfunction load (input: string, options?: LoadOptions) {\n const documents = loadDocuments(input, options)\n\n if (documents.length === 0) throw new YAMLException('expected a document, but the input is empty')\n if (documents.length === 1) return documents[0]\n\n throw new YAMLException('expected a single document in the stream, but found more')\n}\n\nexport {\n load,\n loadAll,\n type LoadOptions\n}\n","import { YAML11_SCHEMA, type Schema } from './schema.ts'\nimport { jsToAst } from './ast/from_js.ts'\nimport { visit, VISIT_SKIP } from './ast/visit.ts'\nimport { type Document } from './ast/nodes.ts'\nimport {\n DEFAULT_PRESENTER_OPTIONS,\n present,\n type PresenterOptions\n} from './ast/presenter.ts'\nimport { pick } from './common/object.ts'\nimport { NOT_RESOLVED } from './tag.ts'\nimport { intCoreTag } from './tag/scalar/int_core.ts'\nimport { intYaml11Tag } from './tag/scalar/int_yaml11.ts'\nimport { floatCoreTag } from './tag/scalar/float_core.ts'\nimport { floatYaml11Tag } from './tag/scalar/float_yaml11.ts'\n\ninterface DumpOptions extends Omit<PresenterOptions, 'schema'> {\n schema?: Schema\n skipInvalid?: boolean\n noRefs?: boolean\n flowLevel?: number\n transform?: (documents: Document[]) => void\n}\n\n// YAML 1.1 misses YAML 1.2 `0o...` ints and exponent-only floats.\n// Combine resolvers so all possible collisions are quoted.\nconst DEFAULT_DUMP_SCHEMA = YAML11_SCHEMA.withTags(\n {\n ...intYaml11Tag,\n resolve: (source, isExplicit, tagName) => {\n const result = intYaml11Tag.resolve(source, isExplicit, tagName)\n return result === NOT_RESOLVED ? intCoreTag.resolve(source, isExplicit, tagName) : result\n }\n },\n {\n ...floatYaml11Tag,\n resolve: (source, isExplicit, tagName) => {\n const result = floatYaml11Tag.resolve(source, isExplicit, tagName)\n return result === NOT_RESOLVED ? floatCoreTag.resolve(source, isExplicit, tagName) : result\n }\n }\n)\n\nconst DEFAULT_DUMP_OPTIONS: Required<DumpOptions> = {\n ...DEFAULT_PRESENTER_OPTIONS,\n schema: DEFAULT_DUMP_SCHEMA,\n skipInvalid: false,\n noRefs: false,\n flowLevel: -1,\n transform: () => {}\n}\n\n// Options that need the JS value (tags, format, dedup) go to `jsToAst`; purely\n// presentational ones go to `present`.\nfunction dump (input: any, options: DumpOptions = {}) {\n const opts = { ...DEFAULT_DUMP_OPTIONS, ...options }\n\n const documents = jsToAst(input, opts.schema, {\n noRefs: opts.noRefs,\n skipInvalid: opts.skipInvalid\n })\n\n // flowLevel: every node at this depth switches to flow; the presenter forces\n // everything below into flow too, so the walk stops there.\n if (opts.flowLevel >= 0) {\n visit(documents, (node, ctx) => {\n if (ctx.depth < opts.flowLevel) return\n node.style.flow = true\n return VISIT_SKIP\n })\n }\n\n opts.transform(documents)\n\n const PRESENTER_OPT_KEYS = Object.keys(DEFAULT_PRESENTER_OPTIONS) as\n (keyof typeof DEFAULT_PRESENTER_OPTIONS)[]\n\n return present(documents, { ...pick(opts, PRESENTER_OPT_KEYS), schema: opts.schema })\n}\n\nexport {\n dump,\n\n type DumpOptions\n}\n","import { load } from \"js-yaml\";\nimport type { GraphDefinition } from \"@ailu-ai/graph-core\";\n\nimport { buildGraphAST } from \"../parser/build-graph-ast\";\nimport { transformGraph } from \"../transformer/transform-graph\";\nimport { validateGraphAST } from \"../validator/validate-graph-ast\";\nimport type { Diagnostic } from \"../validator/types\";\n\nexport const compileGraphFile = (\n content: string,\n file: string\n): { result?: GraphDefinition; diagnostics: Diagnostic[] } => {\n const raw = load(content);\n const ast = buildGraphAST(raw, file);\n const diagnostics = validateGraphAST(ast);\n if (diagnostics.some((diagnostic) => diagnostic.severity === \"error\")) {\n return { diagnostics };\n }\n return {\n result: transformGraph(ast),\n diagnostics\n };\n};\n","import { load } from \"js-yaml\";\n\nexport const parseYaml = (content: string, file: string): unknown => {\n try {\n return load(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown YAML parse error.\";\n throw new Error(`Invalid YAML in ${file}: ${message}`);\n }\n};\n","import type { Loc } from \"../ast/types.js\";\n\nexport const createLoc = (file: string, line = 1, col = 1): Loc => ({\n line,\n col,\n file\n});\n","import type { PromptAST } from \"../ast/types.js\";\nimport { createLoc } from \"./loc.js\";\n\nexport const buildPromptAST = (raw: unknown, file: string): PromptAST => {\n const input = (raw ?? {}) as Record<string, unknown>;\n return {\n _kind: \"prompt\",\n _loc: createLoc(file),\n name: typeof input.name === \"string\" ? input.name : \"\",\n template: typeof input.template === \"string\" ? input.template : \"\",\n variables: Array.isArray(input.variables) ? input.variables.filter((v): v is string => typeof v === \"string\") : []\n };\n};\n","import type { AgentAST } from \"../ast/types.js\";\nimport { createLoc } from \"./loc.js\";\n\nexport const buildAgentAST = (raw: unknown, file: string): AgentAST => {\n const input = (raw ?? {}) as Record<string, unknown>;\n return {\n _kind: \"agent\",\n _loc: createLoc(file),\n id: typeof input.id === \"string\" ? input.id : \"\",\n description: typeof input.description === \"string\" ? input.description : \"\",\n prompt: typeof input.prompt === \"string\" ? input.prompt : \"\",\n tools: Array.isArray(input.tools) ? input.tools.filter((v): v is string => typeof v === \"string\") : []\n };\n};\n","import type { ChainAST, ChainStepAST } from \"../ast/types.js\";\nimport { createLoc } from \"./loc.js\";\n\nexport const buildChainAST = (raw: unknown, file: string): ChainAST => {\n const input = (raw ?? {}) as Record<string, unknown>;\n const stepsRaw = Array.isArray(input.steps) ? input.steps : [];\n const steps: ChainStepAST[] = stepsRaw.map((stepRaw) => {\n const step = (stepRaw ?? {}) as Record<string, unknown>;\n return {\n _kind: \"chain_step\",\n _loc: createLoc(file),\n agentId: typeof step.agentId === \"string\" ? step.agentId : \"\",\n input:\n step.input !== null && typeof step.input === \"object\" && !Array.isArray(step.input)\n ? (step.input as Record<string, unknown>)\n : undefined\n };\n });\n\n return {\n _kind: \"chain\",\n _loc: createLoc(file),\n id: typeof input.id === \"string\" ? input.id : \"\",\n steps\n };\n};\n","import type { PromptAST } from \"../ast/types.js\";\nimport type { Diagnostic } from \"./types.js\";\n\nexport const validatePromptAST = (ast: PromptAST): Diagnostic[] => {\n const diagnostics: Diagnostic[] = [];\n if (ast.name.trim().length === 0) {\n diagnostics.push({\n code: \"PROMPT_NAME_REQUIRED\",\n message: \"Prompt name is required.\",\n loc: ast._loc,\n severity: \"error\"\n });\n }\n if (ast.template.trim().length === 0) {\n diagnostics.push({\n code: \"PROMPT_TEMPLATE_REQUIRED\",\n message: \"Prompt template is required.\",\n loc: ast._loc,\n severity: \"error\"\n });\n }\n return diagnostics;\n};\n","import type { AgentAST } from \"../ast/types.js\";\nimport type { Diagnostic } from \"./types.js\";\n\nexport const validateAgentAST = (ast: AgentAST): Diagnostic[] => {\n const diagnostics: Diagnostic[] = [];\n if (ast.id.trim().length === 0) {\n diagnostics.push({\n code: \"AGENT_ID_REQUIRED\",\n message: \"Agent id is required.\",\n loc: ast._loc,\n severity: \"error\"\n });\n }\n if (ast.prompt.trim().length === 0) {\n diagnostics.push({\n code: \"AGENT_PROMPT_REQUIRED\",\n message: \"Agent prompt reference is required.\",\n loc: ast._loc,\n severity: \"error\"\n });\n }\n return diagnostics;\n};\n","import type { ChainAST } from \"../ast/types.js\";\nimport type { Diagnostic } from \"./types.js\";\n\nexport const validateChainAST = (ast: ChainAST): Diagnostic[] => {\n const diagnostics: Diagnostic[] = [];\n if (ast.id.trim().length === 0) {\n diagnostics.push({\n code: \"CHAIN_ID_REQUIRED\",\n message: \"Chain id is required.\",\n loc: ast._loc,\n severity: \"error\"\n });\n }\n if (ast.steps.length === 0) {\n diagnostics.push({\n code: \"CHAIN_STEPS_REQUIRED\",\n message: \"Chain must contain at least one step.\",\n loc: ast._loc,\n severity: \"error\"\n });\n }\n for (const step of ast.steps) {\n if (step.agentId.trim().length === 0) {\n diagnostics.push({\n code: \"CHAIN_STEP_AGENT_REQUIRED\",\n message: \"Each chain step must reference an agentId.\",\n loc: step._loc,\n severity: \"error\"\n });\n }\n }\n return diagnostics;\n};\n","import type { Loc } from \"../ast/types.js\";\nimport type { Diagnostic } from \"../validator/types.js\";\n\n// `{{ expr }}`. The expression is trimmed by the callers, so the pattern has a single\n// repetition that cannot match a brace: no ambiguous whitespace quantifiers (which made the\n// old pattern backtrack polynomially on inputs like \"{{\" followed by many spaces).\nconst TOKEN_REGEX = /\\{\\{([^{}]*)\\}\\}/g;\n\nconst truncate = (value: string, max: number): string => (value.length <= max ? value : value.slice(0, max));\n\nexport const renderTemplate = (\n template: string,\n variables: Record<string, unknown>,\n loc: Loc\n): { content: string; diagnostics: Diagnostic[] } => {\n const diagnostics: Diagnostic[] = [];\n const content = template.replace(TOKEN_REGEX, (_full, rawExpr: string) => {\n const expr = rawExpr.trim();\n const [namePart, filterPart] = expr.split(\"|\").map((part) => part.trim());\n if (namePart === undefined || namePart.length === 0) {\n return \"\";\n }\n const rawValue = variables[namePart];\n if (rawValue === undefined) {\n diagnostics.push({\n code: \"UNRESOLVED_VARIABLE\",\n message: `Variable '${namePart}' is not resolved.`,\n loc,\n severity: \"warning\"\n });\n return \"\";\n }\n let value = String(rawValue);\n if (filterPart?.startsWith(\"truncate:\")) {\n const amountRaw = filterPart.slice(\"truncate:\".length).trim();\n const amount = Number.parseInt(amountRaw, 10);\n if (Number.isFinite(amount) && amount >= 0) {\n value = truncate(value, amount);\n }\n }\n return value;\n });\n return { content, diagnostics };\n};\n\nexport const detectUnresolvedTemplateVariables = (\n template: string,\n declaredVariables: string[],\n loc: Loc\n): Diagnostic[] => {\n const declared = new Set(declaredVariables);\n const diagnostics: Diagnostic[] = [];\n for (const match of template.matchAll(TOKEN_REGEX)) {\n const rawExpr = match[1];\n if (rawExpr === undefined) {\n continue;\n }\n const name = rawExpr.split(\"|\")[0]?.trim();\n if (name !== undefined && name.length > 0 && !declared.has(name)) {\n diagnostics.push({\n code: \"UNDECLARED_TEMPLATE_VARIABLE\",\n message: `Variable '${name}' is used but not declared in prompt variables.`,\n loc,\n severity: \"warning\"\n });\n }\n }\n return diagnostics;\n};\n","import type { PromptAST } from \"../ast/types.js\";\nimport type { PromptTemplate } from \"./types.js\";\nimport { detectUnresolvedTemplateVariables, renderTemplate } from \"./template-engine.js\";\n\nexport const transformPrompt = (ast: PromptAST): PromptTemplate => ({\n name: ast.name,\n template: ast.template,\n diagnostics: detectUnresolvedTemplateVariables(ast.template, ast.variables, ast._loc),\n render: (variables) => renderTemplate(ast.template, variables, ast._loc)\n});\n","import type { AgentAST } from \"../ast/types.js\";\nimport type { AgentConfig } from \"./types.js\";\n\nexport const transformAgent = (ast: AgentAST): AgentConfig => ({\n id: ast.id,\n description: ast.description,\n prompt: ast.prompt,\n tools: ast.tools\n});\n","import type { ChainAST } from \"../ast/types.js\";\nimport type { ChainDefinition } from \"./types.js\";\n\nexport const transformChain = (ast: ChainAST): ChainDefinition => ({\n id: ast.id,\n steps: ast.steps.map((step) => ({\n agentId: step.agentId,\n input: step.input\n }))\n});\n","import type { AgentAST, ChainAST, PromptAST } from \"../ast/types.js\";\nimport { buildAgentAST } from \"../parser/build-agent-ast.js\";\nimport { buildChainAST } from \"../parser/build-chain-ast.js\";\nimport { buildPromptAST } from \"../parser/build-prompt-ast.js\";\nimport { parseYaml } from \"../parser/parse-yaml.js\";\nimport { transformAgent } from \"../transformer/transform-agent.js\";\nimport { transformChain } from \"../transformer/transform-chain.js\";\nimport { transformPrompt } from \"../transformer/transform-prompt.js\";\nimport type { AgentConfig, ChainDefinition, PromptTemplate } from \"../transformer/types.js\";\nimport { validateAgentAST } from \"../validator/validate-agent-ast.js\";\nimport { validateChainAST } from \"../validator/validate-chain-ast.js\";\nimport { validatePromptAST } from \"../validator/validate-prompt-ast.js\";\nimport type { Diagnostic } from \"../validator/types.js\";\n\ntype CompileResult = PromptTemplate | AgentConfig | ChainDefinition;\n\nconst detectKind = (raw: unknown): \"prompt\" | \"agent\" | \"chain\" => {\n const input = (raw ?? {}) as Record<string, unknown>;\n if (typeof input._kind === \"string\" && (input._kind === \"prompt\" || input._kind === \"agent\" || input._kind === \"chain\")) {\n return input._kind;\n }\n if (\"template\" in input) {\n return \"prompt\";\n }\n if (\"steps\" in input) {\n return \"chain\";\n }\n return \"agent\";\n};\n\nexport const compileFile = (\n content: string,\n file: string\n): { result?: CompileResult; diagnostics: Diagnostic[] } => {\n const raw = parseYaml(content, file);\n const kind = detectKind(raw);\n if (kind === \"prompt\") {\n const ast: PromptAST = buildPromptAST(raw, file);\n const diagnostics = validatePromptAST(ast);\n if (diagnostics.some((diag) => diag.severity === \"error\")) {\n return { diagnostics };\n }\n const result = transformPrompt(ast);\n return { result, diagnostics: [...diagnostics, ...result.diagnostics] };\n }\n if (kind === \"chain\") {\n const ast: ChainAST = buildChainAST(raw, file);\n const diagnostics = validateChainAST(ast);\n if (diagnostics.some((diag) => diag.severity === \"error\")) {\n return { diagnostics };\n }\n return { result: transformChain(ast), diagnostics };\n }\n const ast: AgentAST = buildAgentAST(raw, file);\n const diagnostics = validateAgentAST(ast);\n if (diagnostics.some((diag) => diag.severity === \"error\")) {\n return { diagnostics };\n }\n return { result: transformAgent(ast), diagnostics };\n};\n","/**\n * Resource-search seam types (ADR 0011). A `SearchDocument` is what a producer (graphs, KB,\n * agent-types) pushes into the index; a `SearchHit` is what a query returns. These are the\n * wire-neutral shapes the engine owns — the control plane maps them to/from contracts DTOs.\n */\n\n/** The kinds of resource the unified search indexes. */\nexport type SearchResourceType = \"graph\" | \"agent\" | \"kb\";\n\n/** One indexable resource. `tenantId === null` marks a global resource (catalog graph, agent\n * type) visible to every tenant. `namespace` is carried for KB docs (used in the href / display). */\nexport interface SearchDocument {\n type: SearchResourceType;\n /** Unique within its `type` (e.g. a graph id, a `namespace:path` for KB). */\n id: string;\n tenantId: string | null;\n namespace?: string;\n /** Short, high-weight label shown as the result title. */\n title: string;\n /** Full searchable body (description, content, labels…). */\n text: string;\n /** Studio route to open the resource. */\n href: string;\n /** ISO-8601 last-updated, for tie-breaking / display. */\n updatedAt?: string;\n}\n\n/** One ranked result. */\nexport interface SearchHit {\n type: SearchResourceType;\n id: string;\n tenantId: string | null;\n namespace?: string;\n title: string;\n /** A short excerpt around the match (or the title when the body did not match). */\n snippet: string;\n href: string;\n /** Higher is more relevant. Backend-specific scale; only the ordering is meaningful. */\n score: number;\n}\n\n/** Query scoping. `tenantId` is mandatory — a search is always tenant-scoped (global docs are\n * additionally included). `types` restricts to a subset; omitted means all. */\nexport interface SearchQueryOptions {\n tenantId: string;\n types?: SearchResourceType[];\n limit?: number;\n}\n\n/**\n * Pluggable search backend. The engine ships {@link InMemorySearchProvider}; the control plane\n * provides an Elasticsearch implementation behind the same interface (ADR 0011).\n */\nexport interface SearchProvider {\n /** Idempotent one-time setup (create the ES index/mapping). No-op for in-memory. */\n ensureReady(): Promise<void>;\n /** Upsert documents (keyed by `type` + `id`). */\n index(documents: SearchDocument[]): Promise<void>;\n /** Remove one document by `type` + `id`. Missing ids are ignored. */\n remove(type: SearchResourceType, id: string): Promise<void>;\n /** Tenant-scoped ranked search. Returns at most `opts.limit` hits (default 10). */\n search(query: string, opts: SearchQueryOptions): Promise<SearchHit[]>;\n}\n\n/** Default result cap when a query omits `limit`. */\nexport const DEFAULT_SEARCH_LIMIT = 10;\n","import {\n DEFAULT_SEARCH_LIMIT,\n type SearchDocument,\n type SearchHit,\n type SearchProvider,\n type SearchQueryOptions,\n type SearchResourceType\n} from \"./types.js\";\n\n/** Composite index key: a document is unique per (type, id). */\nconst keyOf = (type: SearchResourceType, id: string): string => `${type}\u0000${id}`;\n\n/** Lowercase word tokens, length ≥ 2, deduped. */\nconst tokenize = (text: string): string[] => {\n const seen = new Set<string>();\n for (const raw of text.toLowerCase().split(/[^a-z0-9]+/u)) {\n if (raw.length >= 2) {\n seen.add(raw);\n }\n }\n return [...seen];\n};\n\n/** A short excerpt of `text` around the first occurrence of any query token. */\nconst snippetFor = (text: string, queryTokens: string[], max = 160): string => {\n const haystack = text.replace(/\\s+/gu, \" \").trim();\n if (haystack.length === 0) {\n return \"\";\n }\n const lower = haystack.toLowerCase();\n let at = -1;\n for (const token of queryTokens) {\n const found = lower.indexOf(token);\n if (found !== -1 && (at === -1 || found < at)) {\n at = found;\n }\n }\n if (at === -1) {\n return haystack.length <= max ? haystack : `${haystack.slice(0, max)}…`;\n }\n const start = Math.max(0, at - 40);\n const end = Math.min(haystack.length, start + max);\n return `${start > 0 ? \"…\" : \"\"}${haystack.slice(start, end)}${end < haystack.length ? \"…\" : \"\"}`;\n};\n\n/**\n * Dependency-free {@link SearchProvider}: token-overlap scoring over an in-memory map, with\n * tenant + type filtering and snippeting. The OSS default and the dev/test/no-Elasticsearch\n * backend (ADR 0011). Title matches weigh more than body matches.\n */\nexport class InMemorySearchProvider implements SearchProvider {\n private readonly docs = new Map<string, SearchDocument>();\n\n public async ensureReady(): Promise<void> {\n // Nothing to set up for the in-memory backend.\n }\n\n public async index(documents: SearchDocument[]): Promise<void> {\n for (const doc of documents) {\n this.docs.set(keyOf(doc.type, doc.id), doc);\n }\n }\n\n public async remove(type: SearchResourceType, id: string): Promise<void> {\n this.docs.delete(keyOf(type, id));\n }\n\n public async search(query: string, opts: SearchQueryOptions): Promise<SearchHit[]> {\n const tokens = tokenize(query);\n if (tokens.length === 0) {\n return [];\n }\n const typeFilter =\n opts.types !== undefined && opts.types.length > 0 ? new Set(opts.types) : null;\n const limit = opts.limit ?? DEFAULT_SEARCH_LIMIT;\n\n const scored: SearchHit[] = [];\n for (const doc of this.docs.values()) {\n // Tenancy: the caller's own docs plus global (tenantId === null) docs.\n if (doc.tenantId !== null && doc.tenantId !== opts.tenantId) {\n continue;\n }\n if (typeFilter !== null && !typeFilter.has(doc.type)) {\n continue;\n }\n const titleLower = doc.title.toLowerCase();\n const textLower = doc.text.toLowerCase();\n let score = 0;\n for (const token of tokens) {\n if (titleLower.includes(token)) {\n score += 3;\n }\n if (textLower.includes(token)) {\n score += 1;\n }\n }\n if (score === 0) {\n continue;\n }\n scored.push({\n type: doc.type,\n id: doc.id,\n tenantId: doc.tenantId,\n namespace: doc.namespace,\n title: doc.title,\n snippet: snippetFor(doc.text.length > 0 ? doc.text : doc.title, tokens),\n href: doc.href,\n score\n });\n }\n\n scored.sort((a, b) => b.score - a.score || a.title.localeCompare(b.title));\n return scored.slice(0, limit);\n }\n}\n"]}
|