@adriane-ai/graph-sdk 0.1.0-rc.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +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","../../agents-core/src/tools.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/errors.ts","../src/rust-validator.ts","../src/builder.ts","../src/components.ts","../src/reference-graph.ts","../src/example-graphs.ts","../src/prebuilt-agents.ts","../src/embeddings.ts","../src/vector-store.ts","../src/semantic-retriever.ts","../src/catalog.ts","../src/run-catalog-graph.ts"],"names":["now","z","DEFAULT_MODEL","createDefaultPort","state","TOOL_SUBJECT_PREFIX","cachedNative","createRequire","queryText","trimmed","DEFAULT_PROVIDER","passthrough","cosineSimilarity","valueToText","channelsOf","generateRunId","components"],"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};\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\nexport const EDGE_TYPES = [\"default\", \"conditional\"] as const;\nexport type EdgeType = (typeof EDGE_TYPES)[number];\n\nexport const GRAPH_STATUSES = [\"idle\", \"running\", \"suspended\", \"completed\", \"failed\"] 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 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 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} 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 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 \"@adriane-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 \"@adriane-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 \"@adriane-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 \"@adriane-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 \"@adriane-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 GraphId,\n EdgeDefinition,\n GraphDefinition,\n GraphState,\n NodeDefinition,\n NodeId,\n RunId\n} from \"@adriane-ai/graph-core\";\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\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 this.eventBus.emit({\n type: \"node_failed\",\n runId: state.runId,\n nodeId,\n error: message,\n attempt,\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 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 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","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 { 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 \"@adriane-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\"]),\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","import Anthropic from \"@anthropic-ai/sdk\";\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/** Wraps a real Anthropic client. This is the only code that touches the SDK. */\nconst createDefaultPort = (apiKey?: string): AnthropicClientPort => {\n const client = new Anthropic(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\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 /**\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 `ADRIANE_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.ADRIANE_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 \"@adriane-ai/agents-core\";\nimport {\n InMemoryPromptRegistry,\n ModelPolicy,\n type LLMGateway,\n type LLMProvider,\n type ModelTier,\n type PromptRegistry\n} from \"@adriane-ai/llm-gateway\";\nimport { createToolNode, DynamicInterrupt, type NodeHandler } from \"@adriane-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 \"@adriane-ai/approval-engine\";\nimport type { NodeId, RunId } from \"@adriane-ai/graph-core\";\n\n/** Default channel an agent node writes its {@link import(\"@adriane-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/** Config for {@link GraphBuilder.agentNode}. */\nexport type AgentNodeConfig = {\n llm: LLMGateway;\n prompt: AgentPromptSource;\n tools?: ToolRegistry;\n provider?: LLMProvider;\n model?: string;\n /**\n * Abstract capability tier (`\"frontier\" | \"balanced\" | \"fast\" | \"creative\"`). When\n * set and no explicit {@link AgentNodeConfig.model} is given, the concrete model is\n * resolved by the {@link ModelPolicy}: on the Rust path the bridge resolves it from\n * the process env (so \"I only have Mistral\" maps every tier to the mistral column);\n * on the TS fallback path the SDK resolves it here against `availableFromEnv()` so\n * the agent runs on a consistent concrete provider+model. An explicit `model` (and\n * an explicit `provider`) always wins over the tier (the override stays `false`-\n * recommended in policy terms).\n */\n tier?: ModelTier;\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 * 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 * Route approvals through an {@link ApprovalEngine}: on suspend the node files a\n * request per gated tool; on resume it executes the tools the engine reports as\n * approved. The engine becomes the source of truth (a human resolves it out of\n * band) instead of the `__approvedTools` channel.\n */\n approvalEngine?: ApprovalEngine;\n label?: string;\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 * 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 * 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 /** Resolved system prompt string. */\n system?: string;\n toolNames: string[];\n maxIterations?: number;\n suspendForApproval: boolean;\n /** Tools (by name) requiring approval — those marked `requiresApproval`. */\n approvalToolNames: string[];\n outputChannel: string;\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 was configured\n * with a TS {@link ApprovalEngine}. The engine-backed approval flow — filing a\n * request per gated tool and reading the engine's decision on resume — lives in the\n * TS `createAgentNodeHandler`; the Rust agent path does not invoke it. So a graph\n * with an `approvalEngine` keeps its agent nodes on the TS engine under `auto`.\n */\n usesApprovalEngine: boolean;\n};\n\n/**\n * The governance binding an agent node contributes to {@link CompiledGraph}: the\n * (optional) {@link ApprovalEngine} a human resolves requests through, the principal\n * that *requests* approvals on this node's behalf (`config.name ?? nodeId`, the same\n * `requestedBy` the node files requests under), and the names of its approval-gated\n * tools. {@link CompiledGraph.approveAndResume} uses it to (a) approve the matching\n * pending engine requests before resuming on the TS path, and (b) stamp each granted\n * tool's `requestedBy` for the Rust engine's no-self-approval guard-rail.\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/** 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 * Project an {@link AgentNodeConfig} into the {@link RustAgentConfig} the Rust engine\n * bridge consumes. Resolves the system prompt to a concrete string and pulls the tool\n * names / approval flags / executes out of the registry. Pure — no LLM call.\n */\nexport const toRustAgentConfig = (nodeId: string, config: AgentNodeConfig): RustAgentConfig => {\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 return {\n provider: config.provider ?? \"anthropic\",\n model: config.model,\n tier: config.tier,\n system,\n toolNames: config.tools?.list().map((definition) => definition.name) ?? [],\n maxIterations: config.maxIterations,\n suspendForApproval: config.suspendForApproval === true,\n approvalToolNames: approvalToolNamesOf(config.tools),\n outputChannel: config.outputChannel ?? DEFAULT_AGENT_OUTPUT_CHANNEL,\n toolBindings: toolBindingsOf(config.tools),\n usesApprovalEngine: config.approvalEngine !== undefined\n };\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. This keeps the TS fallback path consistent with the\n * Rust bridge's `resolve_agent_model` — \"I only have Mistral\" resolves every tier to\n * the mistral column. With neither tier nor a usable provider, returns the config's\n * explicit values (the {@link ReActAgent} then applies its own defaults).\n */\nexport const resolveAgentModel = (\n config: Pick<AgentNodeConfig, \"provider\" | \"model\" | \"tier\">\n): { provider?: LLMProvider; model?: string } => {\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 (config.tier === undefined || config.model !== undefined) {\n return { provider: config.provider, model: config.model };\n }\n const policy = new ModelPolicy();\n const available = policy.availableFromEnv();\n const choice = policy.resolve(config.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 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: config.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 if (config.suspendForApproval === true && 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 \"@adriane-ai/graph-core\";\nimport type { RunEvent } from \"@adriane-ai/graph-runtime\";\n\nimport type { ModelTier } from \"@adriane-ai/llm-gateway\";\n\nimport type { RustAgentConfig } 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 * (`@adriane-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. When the addon is absent this loader returns `null` and\n * {@link import(\"./compiled-graph.js\").CompiledGraph} falls back to the\n * (now-deprecated) TypeScript runtime.\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\ntype NativeEngine = {\n engineRun(\n specJson: string,\n onNode: EngineNodeCallback,\n onCondition: EngineConditionCallback,\n onEvent: EngineEventCallback\n ): Promise<string>;\n engineResume(\n specJson: string,\n onNode: EngineNodeCallback,\n onCondition: EngineConditionCallback,\n onEvent: EngineEventCallback\n ): Promise<string>;\n engineApproveAndResume(\n specJson: 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\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(\"@adriane-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 /** 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 /** 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\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 system?: string;\n toolNames: string[];\n maxIterations?: number;\n suspendForApproval: boolean;\n approvalToolNames: string[];\n outputChannel: string;\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 * `adriane_components` handler natively instead of the JS seam.\n */\ntype ComponentNodeSpecWire = {\n kind: string;\n params: Record<string, unknown>;\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\n/** The `EngineSpec` shape the Rust bridge deserializes (camelCase). */\ntype EngineSpecWire = {\n graph: GraphDefinition;\n runId?: string;\n initialData?: Record<string, unknown>;\n state?: GraphState;\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 jsNodeIds: string[];\n jsToolNames: string[];\n};\n\n/** The `RunOutcome` shape the Rust bridge serializes back. */\ntype RunOutcomeWire = {\n state: GraphState;\n status: string;\n pendingApprovals: { subject: string; reason: string }[];\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\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 /** 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 private buildAgentsWire(): Record<string, AgentSpecWire> {\n const out: Record<string, AgentSpecWire> = {};\n for (const [nodeId, config] of this.parts.agents) {\n out[nodeId] = {\n provider: config.provider,\n model: config.model,\n tier: config.tier,\n system: config.system,\n toolNames: config.toolNames,\n maxIterations: config.maxIterations,\n suspendForApproval: config.suspendForApproval,\n approvalToolNames: config.approvalToolNames,\n outputChannel: config.outputChannel\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 // 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\" | \"agents\" | \"componentNodes\" | \"jsNodeIds\" | \"jsToolNames\"\n > {\n return {\n graph: this.parts.definition,\n agents: this.buildAgentsWire(),\n componentNodes: this.buildComponentsWire(),\n jsNodeIds: [...this.parts.jsNodeIds],\n jsToolNames: [...this.parts.jsToolNames]\n };\n }\n\n /** Start a fresh run on the Rust engine. */\n public async run(\n runId: RunId,\n initialData: Record<string, unknown>\n ): Promise<TypedGraphState<TState>> {\n const spec: EngineSpecWire = { ...this.baseSpec(), runId, initialData };\n const outcomeJson = await this.native.engineRun(\n JSON.stringify(spec),\n this.onNode,\n this.onCondition,\n this.onEvent\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 );\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 );\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 \"@adriane-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 \"@adriane-ai/graph-runtime\";\n\nimport type { ApprovalId, ApprovalRequest } from \"@adriane-ai/approval-engine\";\n\nimport {\n APPROVED_TOOLS_CHANNEL,\n type AgentApprovalBinding,\n type RustAgentConfig\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 /** Names of approval-gated tools the human has granted. They execute on resume. */\n approvedTools: string[];\n /**\n * The principal granting the approval — a human, NEVER the agent that requested it.\n * It is recorded as each granted tool's `resolvedBy` and carried to the Rust engine,\n * which rejects the resume if it is empty or equals the tool's requester (the\n * no-self-approval guard-rail). On the TS path, when an agent node was configured with\n * an {@link import(\"@adriane-ai/approval-engine\").ApprovalEngine}, the matching pending\n * requests are approved through the engine under this principal before resuming — so\n * the engine's own `ensureCanResolve` enforces the same invariant. Defaults to\n * `\"human\"` when omitted.\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 governance binding (the optional {@link ApprovalEngine} plus\n * the principal that requests approvals and the node's gated tool names) that\n * {@link CompiledGraph.approveAndResume} uses to approve pending engine requests on\n * the TS path and to stamp each granted tool's `requestedBy` for the Rust guard-rail.\n * 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\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\n/**\n * Engine selection for {@link CompiledGraph}. Read once from `ADRIANE_SDK_ENGINE`:\n * - `\"auto\"` (default): use the Rust engine for graphs it can run faithfully (agent\n * nodes, human gates, named conditions), else the TypeScript engine.\n * - `\"rust\"`: force the Rust engine when the native addon is present.\n * - `\"ts\"`: force the (deprecated) TypeScript engine.\n * The public SDK API is unchanged — this is an environment escape hatch only.\n */\ntype EnginePreference = \"auto\" | \"rust\" | \"ts\";\n\nconst enginePreference = (): EnginePreference => {\n const raw = process.env.ADRIANE_SDK_ENGINE?.trim().toLowerCase();\n return raw === \"rust\" || raw === \"ts\" ? raw : \"auto\";\n};\n\nlet warnedTsFallback = false;\nconst warnTsEngineOnce = (): void => {\n if (warnedTsFallback) {\n return;\n }\n warnedTsFallback = true;\n console.warn(\n \"[@adriane-ai/graph-sdk] Executing on the deprecated in-process TypeScript engine. \" +\n \"Install the native engine addon (npm install @adriane-ai/napi) to run on the Rust engine.\"\n );\n};\n\n/**\n * A validated, runnable graph. Holds the engine wiring (registries, checkpointer,\n * event bus, runtime) so callers don't touch the lower-level `@adriane-ai/graph-runtime`\n * primitives unless they want to.\n *\n * Execution runs on the **Rust engine** via `@adriane-ai/napi` when the native addon is\n * present and the graph is one Rust can run faithfully; otherwise it falls back to\n * the in-process TypeScript {@link GraphRuntime}. The public API is identical either\n * way — `run` / `resume` / `approveAndResume` / `stream` / `onEvent` behave the same.\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, when this graph runs on the Rust engine; else `null` (TS path).\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 governance binding 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 this.runtime = new GraphRuntime({\n graph: parts.definition,\n nodeRegistry,\n conditionRegistry,\n checkpointer: this.checkpointer,\n eventBus: this.eventBus\n });\n\n this.rustRunner = this.maybeCreateRustRunner(parts);\n // On the Rust path, mirror forwarded run events into the same event bus the TS\n // path uses, so `onEvent` subscribers see events from either engine identically.\n this.rustRunner?.subscribe((event) => {\n this.eventBus.emit(event);\n });\n }\n\n /**\n * Decide whether this graph runs on the Rust engine and, if so, build the runner.\n *\n * Since Phase F the napi seam **awaits** a callback's returned `Promise`, so the\n * SDK's genuinely-async JS node handlers and tool `execute` fns round-trip through\n * Rust faithfully — the old \"synchronous seam\" limitation is gone. Two boundaries\n * remain, and they shape the `\"auto\"` policy:\n *\n * 1. The Rust agent path builds its **own** LLM gateway from env (Mistral / Anthropic\n * / Ollama / a deterministic mock); it does *not* use the TS `AgentNodeConfig.llm`.\n * That is the intended \"engine on Rust\" behavior (the proven live path). The TS\n * `llm` is consulted only on the TS fallback path. Observable *structure* (final\n * status, suspend-on-approval, approve-and-resume, lifecycle events) is identical\n * across engines on the deterministic mock — proven by the fidelity test in\n * `rust-engine.test.ts`. Only the `AgentResult.reasoning` *text* differs (the two\n * mocks emit different strings), which is not part of the structural contract.\n * 2. The TS {@link import(\"@adriane-ai/approval-engine\").ApprovalEngine}-backed approval\n * flow (file a request per gated tool, read the engine's decision on resume) lives\n * in `createAgentNodeHandler`; the Rust agent path does not invoke it. So an agent\n * node configured with `approvalEngine` would not file requests on Rust.\n *\n * Therefore `\"auto\"` (the default) routes a graph to Rust when the addon is present\n * **unless** any agent node uses a TS `approvalEngine` — that one case stays on the\n * TS engine to preserve the engine-backed approval semantics. Everything else (agent\n * nodes on the Rust gateway, JS action/custom/tool nodes, human gates, named\n * conditions, channel-based `approveAndResume`) runs on Rust. When the addon is\n * absent it falls back to the TS engine. `\"rust\"` forces Rust regardless (the caller\n * accepts the Rust-gateway / no-`approvalEngine` contract); `\"ts\"` forces TypeScript.\n * The public SDK API is unchanged across engines.\n *\n * Two narrower limitations are *not* gated on (they affect both `auto` and `rust`,\n * but no SDK API surfaces them as a routing choice): a JS handler that returns a\n * routing {@link import(\"@adriane-ai/graph-core\").Command} (`{ goto }`) has its `goto`\n * dropped on Rust (the seam applies a channel update + static-edge routing — build a\n * conditional edge instead); and a {@link GraphBuilder.toolNode} whose tool is\n * `requiresApproval` *fails* rather than suspends on Rust (its handler throws a\n * `DynamicInterrupt`, which the seam surfaces as a node failure, not a clean\n * suspension). Route such graphs with `ADRIANE_SDK_ENGINE=ts` if you need them.\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\n // Under `auto`, the one case that genuinely diverges on Rust is a TS-`approvalEngine`\n // agent node (the engine-backed approval flow is TS-only). Keep such graphs on TS.\n // `rust` overrides this (the caller opted in explicitly).\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-node handlers are also registered in `parts.handlers` (so the TS path\n // works) — but on the Rust path the agent runs natively, so they are NOT JS node\n // 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 carry a TS-equivalent handler (the fallback path) but\n // run the NATIVE Rust component handler on the Rust path (the bridge routes a\n // `componentNodes` entry before the JS seam), so they are not JS node ids here.\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 nodeFns: this.buildNodeFns(jsHandlerNodeIds, parts.handlers),\n toolFns,\n conditions: this.buildConditionFns(parts.conditions),\n agents: agentConfigs,\n components: componentConfigs,\n jsNodeIds: jsHandlerNodeIds,\n jsToolNames: new Set(toolFns.keys())\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} (not a\n * plain channel update) is coerced to an empty update — the Rust seam applies a\n * channel-update map only; in-handler routing commands stay a TS-engine feature.\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 if (this.rustRunner !== null) {\n const state = await this.rustRunner.run(runId, initialData as Record<string, unknown>);\n this.captureSuspension(state);\n return state as unknown as TypedGraphState<TState>;\n }\n warnTsEngineOnce();\n const state = await this.runtime.start(runId, initialData);\n return state 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 if (this.rustRunner !== null) {\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 warnTsEngineOnce();\n const state = await this.runtime.resume(runId);\n return state 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`). On the Rust path the approved tools are\n * written into `__approvedTools` by the engine before resuming; on the TS path the\n * channel is updated directly. Either way the agent re-runs and executes the\n * 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 = options.resolvedBy ?? \"human\";\n if (this.rustRunner !== null) {\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 warnTsEngineOnce();\n // Mirror the control-plane authority on the TS path: when an agent node routes\n // approvals through an ApprovalEngine, the granted tools' pending requests are\n // resolved THROUGH the engine (under the distinct `resolvedBy` principal) before\n // resuming — so the engine's own `ensureCanResolve` enforces no-self-approval. The\n // `__approvedTools` channel is written too, covering the no-engine (channel-only)\n // case and the engine case identically.\n await this.approvePendingThroughEngines(runId, options.approvedTools, resolvedBy);\n // Sorted + de-duplicated so the channel write is deterministic regardless of the\n // caller's ordering — matching the Rust guard-rail and the control-plane writer.\n const names = [...new Set(options.approvedTools)].sort();\n await this.runtime.updateState(runId, { [APPROVED_TOOLS_CHANNEL]: names });\n return this.resume(runId);\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(approvedTools: string[], resolvedBy: string): ApprovedToolWire[] {\n return [...approvedTools]\n .sort()\n .map((name) => ({ name, requestedBy: this.requesterOfTool(name), resolvedBy }));\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 * For each agent node with an {@link ApprovalEngine}, approve the pending requests\n * whose gated tool is in `approvedTools`, through the engine, under `resolvedBy`. The\n * engine rejects a self-approval, so this is the TS-side enforcement point that\n * mirrors the Rust guard-rail.\n */\n private async approvePendingThroughEngines(\n runId: RunId,\n approvedTools: string[],\n resolvedBy: string\n ): Promise<void> {\n const granted = new Set(approvedTools);\n for (const binding of this.agentApprovals.values()) {\n const engine = binding.approvalEngine;\n if (engine === undefined) {\n continue;\n }\n const pending = await engine.getPending(runId);\n for (const request of pending) {\n const toolName = toolNameOfSubject(request);\n if (toolName !== undefined && granted.has(toolName)) {\n await engine.approve(request.id as ApprovalId, resolvedBy);\n }\n }\n }\n }\n\n /**\n * Stream events as the graph executes. See {@link StreamMode} for the available\n * shapes. The Rust engine has no incremental stream surface yet, so when running on\n * Rust this drives a full run and yields a single terminal `state_value`. On the TS\n * engine it streams natively.\n */\n public stream(\n initialData: InitialData<TState>,\n mode: StreamMode,\n options?: RunOptions\n ): AsyncIterable<StreamEvent> {\n const runId = options?.runId ?? generateRunId();\n if (this.rustRunner !== null) {\n return this.streamViaRust(runId, initialData);\n }\n warnTsEngineOnce();\n return this.runtime.stream(runId, initialData, mode);\n }\n\n /** Single-shot stream for the Rust path: run to terminal state, emit it once. */\n private async *streamViaRust(\n runId: RunId,\n initialData: InitialData<TState>\n ): AsyncIterable<StreamEvent> {\n const state = await this.rustRunner!.run(runId, initialData as Record<string, unknown>);\n this.captureSuspension(state);\n yield { type: \"state_value\", state: state as unknown as GraphState };\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 * Escape hatch for the TS engine: the underlying runtime (time-travel, manual node\n * execution). On the Rust path the runtime is present but **not** the executor; use\n * {@link CompiledGraph.usesRustEngine} to branch, and the run-handle methods\n * (`run` / `resume` / `approveAndResume`) which behave identically across engines.\n */\n public get engine(): GraphRuntime {\n return this.runtime;\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 Error(\n `No suspended state for run '${String(runId)}'. On the Rust engine, resume/approve must ` +\n \"follow a suspended run on the same CompiledGraph instance.\"\n );\n }\n return state;\n }\n}\n\nconst TOOL_SUBJECT_PREFIX = \"tool:\";\n\n/**\n * Pull the tool name back out of an approval request's subject. The gated-tool subject\n * is `{ description: \"tool:<name>\" }` (see `agent-node.ts`); anything else yields\n * `undefined` (the request is not a tool gate we can match by name).\n */\nconst toolNameOfSubject = (request: ApprovalRequest): string | undefined => {\n const description = (request.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 * 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 * 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 Rust seam applies a\n * channel-update map and routes by the graph's static edges, so an in-handler `goto`\n * is *not* honored on the Rust path (dynamic in-handler routing stays a TS-engine\n * feature; build conditional edges instead). `null` / primitives yield an empty\n * 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 type { GraphValidationError } from \"@adriane-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/** Base class for every error thrown by `@adriane-ai/graph-sdk`. */\nexport class AdrianeSdkError extends Error {\n public constructor(message: string) {\n super(message);\n this.name = \"AdrianeSdkError\";\n }\n}\n\n/** Thrown when `.compile()` is called on a graph that fails validation. */\nexport class GraphCompileError extends AdrianeSdkError {\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 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 AdrianeSdkError {\n public constructor(nodeId: string) {\n super(`A node with id '${nodeId}' was already added to this graph.`);\n this.name = \"DuplicateNodeError\";\n }\n}\n\n/** Thrown when an action node is added without an executable handler. */\nexport class MissingHandlerError extends AdrianeSdkError {\n public constructor(nodeId: string) {\n super(`Node '${nodeId}' is an action node but no handler was provided.`);\n this.name = \"MissingHandlerError\";\n }\n}\n","import { createRequire } from \"node:module\";\n\nimport { GraphValidationError, type GraphDefinition, type GraphValidationErrorCode } from \"@adriane-ai/graph-core\";\n\n/**\n * Optional bridge to the Rust engine's validator (`@adriane-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(\"@adriane-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 \"@adriane-ai/graph-core\";\nimport type { AgentResult } from \"@adriane-ai/agents-core\";\nimport type { ConditionFn, NodeHandler } from \"@adriane-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 toRustAgentConfig,\n type AgentApprovalBinding,\n type AgentNodeConfig,\n type RustAgentConfig,\n type ToolNodeConfig\n} from \"./agent-node.js\";\nimport type { ComponentDescriptor, RustComponentConfig } from \"./components.js\";\nimport { DuplicateNodeError, GraphCompileError, MissingHandlerError, type Result } 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};\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 Adriane 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 /** 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 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 };\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: {\n agent: {\n provider: rustConfig.provider,\n model: rustConfig.model,\n tier: rustConfig.tier,\n system: rustConfig.system,\n toolNames: rustConfig.toolNames,\n maxIterations: rustConfig.maxIterations,\n suspendForApproval: rustConfig.suspendForApproval,\n approvalToolNames: rustConfig.approvalToolNames,\n outputChannel: rustConfig.outputChannel\n }\n }\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 Phase C carrier (`{ kind, params }`) so it runs\n * natively on the Rust engine, *and* registers the descriptor's equivalent TS handler\n * so the TS fallback path stays faithful when the native addon is absent.\n *\n * On the Rust path the component takes precedence over the JS seam even though its id\n * is also a JS node id — the bridge routes a `componentNodes` entry to the native\n * handler. So the node always runs the same logic on either engine.\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 TS-equivalent handler (the TS fallback\n // path) AND the SHARED CARRIER on `node.metadata.component` so the persisted\n // GraphDefinition is executable by the control plane's catalog run path\n // (see run-catalog-graph.ts) and renderable in the Studio editor. The Rust path\n // runs the native component handler, keyed by the `componentConfigs` carrier below.\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 /** 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 /** 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 /** Validate and compile, returning a {@link Result} instead of throwing. */\n public safeCompile(): Result<CompiledGraph<TState>, GraphCompileError> {\n const definition = this.buildDefinition();\n // Validate via the Rust core when its native addon is present; otherwise TS.\n const errors = tryRustValidate(definition) ?? validateGraph(definition);\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 agentApprovals: this.agentApprovals,\n componentConfigs: this.componentConfigs\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","/**\n * The component library surface: pure (no-LLM) compute building blocks addressable\n * by a string `kind` plus a `params` object. Mirrors the Rust `adriane_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 \"@adriane-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 type { NodeHandler } from \"@adriane-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/** 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};\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 template.replace(/\\{\\{\\s*([^}]*?)\\s*\\}\\}/g, (_match, rawName: string) => {\n const name = rawName.trim();\n return name in channels ? valueToText(channels[name]) : \"\";\n });\n\nconst promptBuilderHandler =\n (params: PromptBuilderParams): NodeHandler =>\n async (_input, state) => ({ [params.into]: renderTemplate(params.template, channelsOf(state)) });\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 `adriane_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 query text for embedding-based re-scoring. */\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. `&amp;` is decoded last so an input\n * like `&amp;lt;` round-trips to `&lt;` rather than being double-decoded.\n * Mirrors the Rust `decode_entities`.\n */\nconst decodeEntities = (text: string): string =>\n text\n .split(\"&lt;\")\n .join(\"<\")\n .split(\"&gt;\")\n .join(\">\")\n .split(\"&quot;\")\n .join('\"')\n .split(\"&amp;\")\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/** 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 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// --- 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 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 });\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 const limited = params.k === undefined ? merged : merged.slice(0, params.k);\n\n const results = limited.map(({ id, score }) => {\n const item = representative.get(id);\n return typeof item === \"object\" && item !== null && !Array.isArray(item)\n ? { ...item, score }\n : item;\n });\n return { [params.into]: results };\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 engine\n * (Rust when the `@adriane-ai/napi` addon is present, else the TS fallback);\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. Deterministic OFFLINE (a mock gateway, no\n * keys) and live-capable (Mistral when MISTRAL_API_KEY is present — the balanced tier\n * resolves to a concrete Mistral model on the Rust path).\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 \"@adriane-ai/graph-core\";\nimport {\n DefaultLLMGateway,\n MockLLMProviderAdapter,\n type LLMGateway,\n type ModelTier\n} from \"@adriane-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 \"Adriane 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 /**\n * The LLM gateway the answerer agent runs on (TS-engine path). Defaults to a\n * deterministic mock so the graph runs end-to-end with no provider keys. The Rust\n * engine path builds its own gateway from env (Mistral when MISTRAL_API_KEY is set,\n * else a deterministic mock), independent of this.\n */\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 LLM provider slot (and the slot the default mock registers under). Defaults to `\"mistral\"`. */\n provider?: \"openai\" | \"anthropic\" | \"mistral\";\n};\n\n/** A deterministic mock gateway whose every turn is a final answer. */\nconst mockGateway = (provider: NonNullable<DocQaReferenceOptions[\"provider\"]>): LLMGateway => {\n const gateway = new DefaultLLMGateway();\n gateway.registerAdapter(\n new MockLLMProviderAdapter({\n provider,\n response: {\n content:\n \"FINAL: Adriane checkpoints after every node and resumes from the latest \" +\n \"checkpoint [checkpointing].\",\n usage: { promptTokens: 0, completionTokens: 0 },\n model: \"mock\",\n provider\n }\n })\n );\n return gateway;\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 Adriane 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 const llm = options.llm ?? mockGateway(provider);\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 llm,\n prompt: { system: RAG_SYSTEM_PROMPT },\n provider,\n tier,\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 on either engine.\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 \"@adriane-ai/graph-core\";\nimport { InMemoryToolRegistry, type ToolId } from \"@adriane-ai/agents-core\";\nimport { DefaultLLMGateway } from \"@adriane-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/** 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: \"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","/**\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 \"@adriane-ai/graph-sdk\";\n *\n * const result = await prebuilt.summarizer().run({ question: \"long text…\" });\n * console.log(result.channels.summary);\n * ```\n *\n * By default each agent runs on a deterministic mock gateway (registered under the\n * nominal provider) so a prebuilt graph runs end-to-end with no provider keys. Supply\n * `llm` to run against a real gateway, `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 \"@adriane-ai/llm-gateway\";\nimport { InMemoryToolRegistry, type ToolId, type ToolRegistry } from \"@adriane-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 * The LLM gateway the agent runs on. Defaults to a deterministic mock gateway\n * registered under the nominal provider, so the graph runs with no provider keys.\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: \"Adriane 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 Mistral embeddings API\n * (`/embeddings` with `{ model, input }` and a `Bearer` key), parsing `data[].embedding`.\n * The {@link CreateEmbeddingsOptions.transport} hook overrides the network call so a test\n * can return deterministic vectors with no real network. This is the embedding backbone\n * behind {@link import(\"./semantic-retriever.js\").semanticRetriever}.\n *\n * ```ts\n * import { createEmbeddings } from \"@adriane-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 */\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 the Mistral embeddings API returns). The real default builds this from `fetch`;\n * 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 }`). */\nexport type EmbeddingsRequestBody = {\n model: string;\n input: string[];\n};\n\n/** Options for {@link createEmbeddings}. */\nexport type CreateEmbeddingsOptions = {\n /** The embeddings provider. Only `\"mistral\"` is wired today (the default). */\n provider?: \"mistral\";\n /** API key. Defaults to `process.env.MISTRAL_API_KEY`. Required unless `transport` is injected. */\n apiKey?: string;\n /** Embedding model. Defaults to `\"mistral-embed\"`. */\n model?: string;\n /** API base URL. Defaults to `\"https://api.mistral.ai/v1\"`. */\n baseUrl?: string;\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/** The default Mistral embeddings model. */\nconst DEFAULT_MODEL = \"mistral-embed\";\n/** The default Mistral API base URL. */\nconst DEFAULT_BASE_URL = \"https://api.mistral.ai/v1\";\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() {\n super(\n \"createEmbeddings: no API key (set `apiKey` or MISTRAL_API_KEY) and no `transport` injected; \" +\n \"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 }` to\n * `{baseUrl}/embeddings` with an `Authorization: Bearer <key>` header, returning the\n * parsed JSON. Throws on a non-2xx status. Only built when no `transport` is injected.\n */\nconst createMistralTransport =\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. With the default transport it POSTs to the\n * Mistral embeddings API (`{baseUrl||'https://api.mistral.ai/v1'}/embeddings`) with\n * `{ model: model||'mistral-embed', input: texts }` and `Authorization: Bearer\n * (apiKey || process.env.MISTRAL_API_KEY)`, parsing `data[].embedding`. Inject\n * `transport` to override that for offline tests. Throws {@link MissingEmbeddingsKeyError}\n * when neither a key nor a transport is available.\n */\nexport const createEmbeddings = (options: CreateEmbeddingsOptions = {}): Embeddings => {\n const model = options.model ?? DEFAULT_MODEL;\n const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n\n let transport: EmbeddingsTransport;\n if (options.transport !== undefined) {\n transport = options.transport;\n } else {\n const apiKey = options.apiKey ?? process.env.MISTRAL_API_KEY;\n if (apiKey === undefined || apiKey.length === 0) {\n throw new MissingEmbeddingsKeyError();\n }\n transport = createMistralTransport(apiKey, baseUrl);\n }\n\n return {\n async embed(texts) {\n if (texts.length === 0) {\n return [];\n }\n const parsed = await transport({ model, input: texts });\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 \"@adriane-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 \"@adriane-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: \"Adriane is a graph runtime.\" }],\n * embeddings: fakeEmbeddings // deterministic in tests\n * }));\n * ```\n */\n\nimport type { NodeHandler } from \"@adriane-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 * `@adriane-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 \"@adriane-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","/**\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 a control plane 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 `@adriane-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 * `@adriane-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 \"@adriane-ai/graph-core\";\nimport type { RunEvent } from \"@adriane-ai/graph-runtime\";\nimport type { ModelTier } from \"@adriane-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 } from \"@adriane-ai/approval-engine\";\n\nimport type { RustAgentConfig } from \"./agent-node.js\";\nimport { APPROVAL_IDS_CHANNEL, DEFAULT_AGENT_OUTPUT_CHANNEL } from \"./agent-node.js\";\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\";\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 system?: string;\n toolNames?: string[];\n maxIterations?: number;\n suspendForApproval?: boolean;\n approvalToolNames?: string[];\n outputChannel?: string;\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\"` — the state's status. */\n status: string;\n /** True when execution ran on the Rust engine (always, since this seam requires it). */\n usedRustEngine: true;\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 * 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) and\n * the control plane only ever resumes with engine-approved tools. Absent: the run is\n * ungoverned (the legacy channel-only behaviour).\n */\n approvalEngine?: ApprovalEngine;\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 (@adriane-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/**\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 = (carrier: AgentCarrier, usesApprovalEngine: boolean): RustAgentConfig => ({\n provider: carrier.provider ?? \"anthropic\",\n model: carrier.model,\n tier: carrier.tier,\n system: carrier.system,\n toolNames: carrier.toolNames ?? [],\n maxIterations: carrier.maxIterations,\n suspendForApproval: carrier.suspendForApproval === true,\n approvalToolNames: carrier.approvalToolNames ?? [],\n outputChannel: carrier.outputChannel ?? DEFAULT_AGENT_OUTPUT_CHANNEL,\n // The catalog path carries no JS tool closures — the agent's tools are native\n // (no-op stubs in the bridge unless a name is also in jsToolNames, which it never is here).\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): RustRunnerParts<ChannelValues> => {\n const components = new Map<string, RustComponentConfig>();\n const agents = new Map<string, RustAgentConfig>();\n const jsNodeIds = new Set<string>();\n\n for (const node of definition.nodes) {\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 continue;\n }\n const agent = readAgentCarrier(node.metadata);\n if (agent !== undefined) {\n agents.set(id, carrierToAgentConfig(agent, usesApprovalEngine));\n continue;\n }\n if (node.type === \"human-gate\") {\n // The runtime suspends natively at a human gate — no handler needed.\n continue;\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 return {\n definition,\n nodeFns: new Map(jsNodeIds.size === 0 ? [] : [...jsNodeIds].map((id) => [id, async () => ({})])),\n toolFns: new Map(),\n conditions: new Map(),\n agents,\n components,\n jsNodeIds,\n jsToolNames: new Set()\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(definition, options.approvalEngine !== undefined)\n );\n if (runner === null) {\n throw new RustEngineUnavailableError();\n }\n if (options.onEvent !== undefined) {\n runner.subscribe(options.onEvent);\n }\n const runId = options.runId ?? generateRunId();\n const state = (await runner.run(runId, options.initialData ?? {})) as unknown as GraphState;\n const governed = await fileApprovalRequests(definition, state, runId, options.approvalEngine);\n return { state: governed, status: governed.status, usedRustEngine: true };\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 * Throws {@link RustEngineUnavailableError} when the native addon is absent.\n */\nexport const resumeCatalogGraph = async (\n definition: GraphDefinition,\n state: GraphState,\n options: Pick<RunCatalogGraphOptions, \"onEvent\" | \"approvalEngine\"> & {\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`. A control plane\n * is the authority on which tools were approved (drawn from the ApprovalEngine), but\n * the engine re-checks the provenance here — defence in depth on the PRODUCTION\n * resume path. 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 const runner = tryCreateRustRunner<ChannelValues>(\n assembleParts(definition, options.approvalEngine !== undefined)\n );\n if (runner === null) {\n throw new RustEngineUnavailableError();\n }\n if (options.onEvent !== undefined) {\n runner.subscribe(options.onEvent);\n }\n const resumed = (await runner.resume(state, options.approvedTools ?? [])) as unknown as GraphState;\n // A resume can itself hit a NEW approval gate; file requests for that suspension too.\n const governed = await fileApprovalRequests(\n definition,\n resumed,\n String(resumed.runId) as RunId,\n options.approvalEngine\n );\n return { state: governed, status: governed.status, usedRustEngine: true };\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 the suspended state. */\nconst readApprovalRequests = (\n state: GraphState,\n outputChannel: string\n): SurfacedApprovalRequest[] => {\n const channel = (state.channels as Record<string, unknown>)[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 * 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 * No-ops (returns the state unchanged) when no engine is given or the run is not\n * suspended. Idempotency: an agent node that already carries stashed ids (a state that\n * was governed once) is skipped, so re-driving a suspended state does not double-file.\n */\nconst fileApprovalRequests = async (\n definition: GraphDefinition,\n state: GraphState,\n runId: RunId,\n engine: ApprovalEngine | 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: string[] = [];\n for (const node of definition.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(state, outputChannel)) {\n const created = await engine.request({\n runId,\n nodeId: String(node.id) as NodeId,\n requestedBy: String(node.id),\n subject: request.subject\n });\n ids.push(String(created.id));\n }\n }\n\n if (ids.length === 0) {\n return state;\n }\n return { ...state, channels: { ...channels, [APPROVAL_IDS_CHANNEL]: ids } };\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"]}
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","../../agents-core/src/tools.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/errors.ts","../src/rust-validator.ts","../src/builder.ts","../src/components.ts","../src/reference-graph.ts","../src/example-graphs.ts","../src/prebuilt-agents.ts","../src/embeddings.ts","../src/vector-store.ts","../src/semantic-retriever.ts","../src/catalog.ts","../src/run-catalog-graph.ts"],"names":["now","z","DEFAULT_MODEL","createDefaultPort","state","TOOL_SUBJECT_PREFIX","cachedNative","createRequire","queryText","trimmed","DEFAULT_PROVIDER","passthrough","cosineSimilarity","valueToText","channelsOf","generateRunId","components"],"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};\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\nexport const EDGE_TYPES = [\"default\", \"conditional\"] as const;\nexport type EdgeType = (typeof EDGE_TYPES)[number];\n\nexport const GRAPH_STATUSES = [\"idle\", \"running\", \"suspended\", \"completed\", \"failed\"] 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 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 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} 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 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 \"@adriane-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 \"@adriane-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 \"@adriane-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 \"@adriane-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 \"@adriane-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 GraphId,\n EdgeDefinition,\n GraphDefinition,\n GraphState,\n NodeDefinition,\n NodeId,\n RunId\n} from \"@adriane-ai/graph-core\";\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\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 this.eventBus.emit({\n type: \"node_failed\",\n runId: state.runId,\n nodeId,\n error: message,\n attempt,\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 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 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","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 { 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 \"@adriane-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\"]),\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","import Anthropic from \"@anthropic-ai/sdk\";\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/** Wraps a real Anthropic client. This is the only code that touches the SDK. */\nconst createDefaultPort = (apiKey?: string): AnthropicClientPort => {\n const client = new Anthropic(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\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 /**\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 `ADRIANE_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.ADRIANE_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 \"@adriane-ai/agents-core\";\nimport {\n InMemoryPromptRegistry,\n ModelPolicy,\n type LLMGateway,\n type LLMProvider,\n type ModelTier,\n type PromptRegistry\n} from \"@adriane-ai/llm-gateway\";\nimport { createToolNode, DynamicInterrupt, type NodeHandler } from \"@adriane-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 \"@adriane-ai/approval-engine\";\nimport type { NodeId, RunId } from \"@adriane-ai/graph-core\";\n\n/** Default channel an agent node writes its {@link import(\"@adriane-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/** Config for {@link GraphBuilder.agentNode}. */\nexport type AgentNodeConfig = {\n llm: LLMGateway;\n prompt: AgentPromptSource;\n tools?: ToolRegistry;\n provider?: LLMProvider;\n model?: string;\n /**\n * Abstract capability tier (`\"frontier\" | \"balanced\" | \"fast\" | \"creative\"`). When\n * set and no explicit {@link AgentNodeConfig.model} is given, the concrete model is\n * resolved by the {@link ModelPolicy}: on the Rust path the bridge resolves it from\n * the process env (so \"I only have Mistral\" maps every tier to the mistral column);\n * on the TS fallback path the SDK resolves it here against `availableFromEnv()` so\n * the agent runs on a consistent concrete provider+model. An explicit `model` (and\n * an explicit `provider`) always wins over the tier (the override stays `false`-\n * recommended in policy terms).\n */\n tier?: ModelTier;\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 * 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 * Route approvals through an {@link ApprovalEngine}: on suspend the node files a\n * request per gated tool; on resume it executes the tools the engine reports as\n * approved. The engine becomes the source of truth (a human resolves it out of\n * band) instead of the `__approvedTools` channel.\n */\n approvalEngine?: ApprovalEngine;\n label?: string;\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 * 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 * 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 /** Resolved system prompt string. */\n system?: string;\n toolNames: string[];\n maxIterations?: number;\n suspendForApproval: boolean;\n /** Tools (by name) requiring approval — those marked `requiresApproval`. */\n approvalToolNames: string[];\n outputChannel: string;\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 was configured\n * with a TS {@link ApprovalEngine}. The engine-backed approval flow — filing a\n * request per gated tool and reading the engine's decision on resume — lives in the\n * TS `createAgentNodeHandler`; the Rust agent path does not invoke it. So a graph\n * with an `approvalEngine` keeps its agent nodes on the TS engine under `auto`.\n */\n usesApprovalEngine: boolean;\n};\n\n/**\n * The governance binding an agent node contributes to {@link CompiledGraph}: the\n * (optional) {@link ApprovalEngine} a human resolves requests through, the principal\n * that *requests* approvals on this node's behalf (`config.name ?? nodeId`, the same\n * `requestedBy` the node files requests under), and the names of its approval-gated\n * tools. {@link CompiledGraph.approveAndResume} uses it to (a) approve the matching\n * pending engine requests before resuming on the TS path, and (b) stamp each granted\n * tool's `requestedBy` for the Rust engine's no-self-approval guard-rail.\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/** 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 * Project an {@link AgentNodeConfig} into the {@link RustAgentConfig} the Rust engine\n * bridge consumes. Resolves the system prompt to a concrete string and pulls the tool\n * names / approval flags / executes out of the registry. Pure — no LLM call.\n */\nexport const toRustAgentConfig = (nodeId: string, config: AgentNodeConfig): RustAgentConfig => {\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 return {\n provider: config.provider ?? \"anthropic\",\n model: config.model,\n tier: config.tier,\n system,\n toolNames: config.tools?.list().map((definition) => definition.name) ?? [],\n maxIterations: config.maxIterations,\n suspendForApproval: config.suspendForApproval === true,\n approvalToolNames: approvalToolNamesOf(config.tools),\n outputChannel: config.outputChannel ?? DEFAULT_AGENT_OUTPUT_CHANNEL,\n toolBindings: toolBindingsOf(config.tools),\n usesApprovalEngine: config.approvalEngine !== undefined\n };\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. This keeps the TS fallback path consistent with the\n * Rust bridge's `resolve_agent_model` — \"I only have Mistral\" resolves every tier to\n * the mistral column. With neither tier nor a usable provider, returns the config's\n * explicit values (the {@link ReActAgent} then applies its own defaults).\n */\nexport const resolveAgentModel = (\n config: Pick<AgentNodeConfig, \"provider\" | \"model\" | \"tier\">\n): { provider?: LLMProvider; model?: string } => {\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 (config.tier === undefined || config.model !== undefined) {\n return { provider: config.provider, model: config.model };\n }\n const policy = new ModelPolicy();\n const available = policy.availableFromEnv();\n const choice = policy.resolve(config.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 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: config.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 if (config.suspendForApproval === true && 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 \"@adriane-ai/graph-core\";\nimport type { RunEvent } from \"@adriane-ai/graph-runtime\";\n\nimport type { ModelTier } from \"@adriane-ai/llm-gateway\";\n\nimport type { RustAgentConfig } 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 * (`@adriane-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\ntype NativeEngine = {\n engineRun(\n specJson: string,\n onNode: EngineNodeCallback,\n onCondition: EngineConditionCallback,\n onEvent: EngineEventCallback\n ): Promise<string>;\n engineResume(\n specJson: string,\n onNode: EngineNodeCallback,\n onCondition: EngineConditionCallback,\n onEvent: EngineEventCallback\n ): Promise<string>;\n engineApproveAndResume(\n specJson: 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\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(\"@adriane-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 /** 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 /** 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\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 system?: string;\n toolNames: string[];\n maxIterations?: number;\n suspendForApproval: boolean;\n approvalToolNames: string[];\n outputChannel: string;\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 * `adriane_components` handler natively instead of the JS seam.\n */\ntype ComponentNodeSpecWire = {\n kind: string;\n params: Record<string, unknown>;\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\n/** The `EngineSpec` shape the Rust bridge deserializes (camelCase). */\ntype EngineSpecWire = {\n graph: GraphDefinition;\n runId?: string;\n initialData?: Record<string, unknown>;\n state?: GraphState;\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 jsNodeIds: string[];\n jsToolNames: string[];\n};\n\n/** The `RunOutcome` shape the Rust bridge serializes back. */\ntype RunOutcomeWire = {\n state: GraphState;\n status: string;\n pendingApprovals: { subject: string; reason: string }[];\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\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 /** 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 private buildAgentsWire(): Record<string, AgentSpecWire> {\n const out: Record<string, AgentSpecWire> = {};\n for (const [nodeId, config] of this.parts.agents) {\n out[nodeId] = {\n provider: config.provider,\n model: config.model,\n tier: config.tier,\n system: config.system,\n toolNames: config.toolNames,\n maxIterations: config.maxIterations,\n suspendForApproval: config.suspendForApproval,\n approvalToolNames: config.approvalToolNames,\n outputChannel: config.outputChannel\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 // 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\" | \"agents\" | \"componentNodes\" | \"jsNodeIds\" | \"jsToolNames\"\n > {\n return {\n graph: this.parts.definition,\n agents: this.buildAgentsWire(),\n componentNodes: this.buildComponentsWire(),\n jsNodeIds: [...this.parts.jsNodeIds],\n jsToolNames: [...this.parts.jsToolNames]\n };\n }\n\n /** Start a fresh run on the Rust engine. */\n public async run(\n runId: RunId,\n initialData: Record<string, unknown>\n ): Promise<TypedGraphState<TState>> {\n const spec: EngineSpecWire = { ...this.baseSpec(), runId, initialData };\n const outcomeJson = await this.native.engineRun(\n JSON.stringify(spec),\n this.onNode,\n this.onCondition,\n this.onEvent\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 );\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 );\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 \"@adriane-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 \"@adriane-ai/graph-runtime\";\n\nimport type { ApprovalId, ApprovalRequest } from \"@adriane-ai/approval-engine\";\n\nimport {\n APPROVED_TOOLS_CHANNEL,\n type AgentApprovalBinding,\n type RustAgentConfig\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 /** Names of approval-gated tools the human has granted. They execute on resume. */\n approvedTools: string[];\n /**\n * The principal granting the approval — a human, NEVER the agent that requested it.\n * It is recorded as each granted tool's `resolvedBy` and carried to the Rust engine,\n * which rejects the resume if it is empty or equals the tool's requester (the\n * no-self-approval guard-rail). On the TS path, when an agent node was configured with\n * an {@link import(\"@adriane-ai/approval-engine\").ApprovalEngine}, the matching pending\n * requests are approved through the engine under this principal before resuming — so\n * the engine's own `ensureCanResolve` enforces the same invariant. Defaults to\n * `\"human\"` when omitted.\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 governance binding (the optional {@link ApprovalEngine} plus\n * the principal that requests approvals and the node's gated tool names) that\n * {@link CompiledGraph.approveAndResume} uses to approve pending engine requests on\n * the TS path and to stamp each granted tool's `requestedBy` for the Rust guard-rail.\n * 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\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\n/**\n * Engine selection for {@link CompiledGraph}. Read once from `ADRIANE_SDK_ENGINE`:\n * - `\"auto\"` (default): use the Rust engine for graphs it can run faithfully (agent\n * nodes, human gates, named conditions), else the TypeScript engine.\n * - `\"rust\"`: force the Rust engine when the native addon is present.\n * - `\"ts\"`: force the in-process TypeScript engine (development and tests only).\n * The public SDK API is unchanged — this is an environment escape hatch only.\n * Production runs on the Rust engine; the TypeScript engine is an internal\n * development/test path, not a supported runtime.\n */\ntype EnginePreference = \"auto\" | \"rust\" | \"ts\";\n\nconst enginePreference = (): EnginePreference => {\n const raw = process.env.ADRIANE_SDK_ENGINE?.trim().toLowerCase();\n return raw === \"rust\" || raw === \"ts\" ? raw : \"auto\";\n};\n\nlet warnedTsFallback = false;\nconst warnTsEngineOnce = (): void => {\n if (warnedTsFallback) {\n return;\n }\n warnedTsFallback = true;\n console.warn(\n \"[@adriane-ai/graph-sdk] Running on the in-process TypeScript engine (development/test path). \" +\n \"Adriane requires the Rust engine in production — install the native addon (npm install @adriane-ai/napi).\"\n );\n};\n\n/**\n * A validated, runnable graph. Holds the engine wiring (registries, checkpointer,\n * event bus, runtime) so callers don't touch the lower-level `@adriane-ai/graph-runtime`\n * primitives unless they want to.\n *\n * Execution runs on the **Rust engine** via `@adriane-ai/napi` (a required dependency).\n * An in-process TypeScript {@link GraphRuntime} backs development and tests (and\n * platforms the native addon doesn't cover); the public API is identical either way —\n * `run` / `resume` / `approveAndResume` / `stream` / `onEvent` behave the same.\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, when this graph runs on the Rust engine; else `null` (TS path).\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 governance binding 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 this.runtime = new GraphRuntime({\n graph: parts.definition,\n nodeRegistry,\n conditionRegistry,\n checkpointer: this.checkpointer,\n eventBus: this.eventBus\n });\n\n this.rustRunner = this.maybeCreateRustRunner(parts);\n // On the Rust path, mirror forwarded run events into the same event bus the TS\n // path uses, so `onEvent` subscribers see events from either engine identically.\n this.rustRunner?.subscribe((event) => {\n this.eventBus.emit(event);\n });\n }\n\n /**\n * Decide whether this graph runs on the Rust engine and, if so, build the runner.\n *\n * Since Phase F the napi seam **awaits** a callback's returned `Promise`, so the\n * SDK's genuinely-async JS node handlers and tool `execute` fns round-trip through\n * Rust faithfully — the old \"synchronous seam\" limitation is gone. Two boundaries\n * remain, and they shape the `\"auto\"` policy:\n *\n * 1. The Rust agent path builds its **own** LLM gateway from env (Mistral / Anthropic\n * / Ollama / a deterministic mock); it does *not* use the TS `AgentNodeConfig.llm`.\n * That is the intended \"engine on Rust\" behavior (the proven live path). The TS\n * `llm` is consulted only on the TS fallback path. Observable *structure* (final\n * status, suspend-on-approval, approve-and-resume, lifecycle events) is identical\n * across engines on the deterministic mock — proven by the fidelity test in\n * `rust-engine.test.ts`. Only the `AgentResult.reasoning` *text* differs (the two\n * mocks emit different strings), which is not part of the structural contract.\n * 2. The TS {@link import(\"@adriane-ai/approval-engine\").ApprovalEngine}-backed approval\n * flow (file a request per gated tool, read the engine's decision on resume) lives\n * in `createAgentNodeHandler`; the Rust agent path does not invoke it. So an agent\n * node configured with `approvalEngine` would not file requests on Rust.\n *\n * Therefore `\"auto\"` (the default) routes a graph to Rust when the addon is present\n * **unless** any agent node uses a TS `approvalEngine` — that one case stays on the\n * TS engine to preserve the engine-backed approval semantics. Everything else (agent\n * nodes on the Rust gateway, JS action/custom/tool nodes, human gates, named\n * conditions, channel-based `approveAndResume`) runs on Rust. When the addon is\n * absent it falls back to the TS engine. `\"rust\"` forces Rust regardless (the caller\n * accepts the Rust-gateway / no-`approvalEngine` contract); `\"ts\"` forces TypeScript.\n * The public SDK API is unchanged across engines.\n *\n * Two narrower limitations are *not* gated on (they affect both `auto` and `rust`,\n * but no SDK API surfaces them as a routing choice): a JS handler that returns a\n * routing {@link import(\"@adriane-ai/graph-core\").Command} (`{ goto }`) has its `goto`\n * dropped on Rust (the seam applies a channel update + static-edge routing — build a\n * conditional edge instead); and a {@link GraphBuilder.toolNode} whose tool is\n * `requiresApproval` *fails* rather than suspends on Rust (its handler throws a\n * `DynamicInterrupt`, which the seam surfaces as a node failure, not a clean\n * suspension). Route such graphs with `ADRIANE_SDK_ENGINE=ts` if you need them.\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\n // Under `auto`, the one case that genuinely diverges on Rust is a TS-`approvalEngine`\n // agent node (the engine-backed approval flow is TS-only). Keep such graphs on TS.\n // `rust` overrides this (the caller opted in explicitly).\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-node handlers are also registered in `parts.handlers` (so the TS path\n // works) — but on the Rust path the agent runs natively, so they are NOT JS node\n // 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 carry a TS-equivalent handler (the fallback path) but\n // run the NATIVE Rust component handler on the Rust path (the bridge routes a\n // `componentNodes` entry before the JS seam), so they are not JS node ids here.\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 nodeFns: this.buildNodeFns(jsHandlerNodeIds, parts.handlers),\n toolFns,\n conditions: this.buildConditionFns(parts.conditions),\n agents: agentConfigs,\n components: componentConfigs,\n jsNodeIds: jsHandlerNodeIds,\n jsToolNames: new Set(toolFns.keys())\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} (not a\n * plain channel update) is coerced to an empty update — the Rust seam applies a\n * channel-update map only; in-handler routing commands stay a TS-engine feature.\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 if (this.rustRunner !== null) {\n const state = await this.rustRunner.run(runId, initialData as Record<string, unknown>);\n this.captureSuspension(state);\n return state as unknown as TypedGraphState<TState>;\n }\n warnTsEngineOnce();\n const state = await this.runtime.start(runId, initialData);\n return state 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 if (this.rustRunner !== null) {\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 warnTsEngineOnce();\n const state = await this.runtime.resume(runId);\n return state 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`). On the Rust path the approved tools are\n * written into `__approvedTools` by the engine before resuming; on the TS path the\n * channel is updated directly. Either way the agent re-runs and executes the\n * 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 = options.resolvedBy ?? \"human\";\n if (this.rustRunner !== null) {\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 warnTsEngineOnce();\n // Mirror the control-plane authority on the TS path: when an agent node routes\n // approvals through an ApprovalEngine, the granted tools' pending requests are\n // resolved THROUGH the engine (under the distinct `resolvedBy` principal) before\n // resuming — so the engine's own `ensureCanResolve` enforces no-self-approval. The\n // `__approvedTools` channel is written too, covering the no-engine (channel-only)\n // case and the engine case identically.\n await this.approvePendingThroughEngines(runId, options.approvedTools, resolvedBy);\n // Sorted + de-duplicated so the channel write is deterministic regardless of the\n // caller's ordering — matching the Rust guard-rail and the control-plane writer.\n const names = [...new Set(options.approvedTools)].sort();\n await this.runtime.updateState(runId, { [APPROVED_TOOLS_CHANNEL]: names });\n return this.resume(runId);\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(approvedTools: string[], resolvedBy: string): ApprovedToolWire[] {\n return [...approvedTools]\n .sort()\n .map((name) => ({ name, requestedBy: this.requesterOfTool(name), resolvedBy }));\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 * For each agent node with an {@link ApprovalEngine}, approve the pending requests\n * whose gated tool is in `approvedTools`, through the engine, under `resolvedBy`. The\n * engine rejects a self-approval, so this is the TS-side enforcement point that\n * mirrors the Rust guard-rail.\n */\n private async approvePendingThroughEngines(\n runId: RunId,\n approvedTools: string[],\n resolvedBy: string\n ): Promise<void> {\n const granted = new Set(approvedTools);\n for (const binding of this.agentApprovals.values()) {\n const engine = binding.approvalEngine;\n if (engine === undefined) {\n continue;\n }\n const pending = await engine.getPending(runId);\n for (const request of pending) {\n const toolName = toolNameOfSubject(request);\n if (toolName !== undefined && granted.has(toolName)) {\n await engine.approve(request.id as ApprovalId, resolvedBy);\n }\n }\n }\n }\n\n /**\n * Stream events as the graph executes. See {@link StreamMode} for the available\n * shapes. The Rust engine has no incremental stream surface yet, so when running on\n * Rust this drives a full run and yields a single terminal `state_value`. On the TS\n * engine it streams natively.\n */\n public stream(\n initialData: InitialData<TState>,\n mode: StreamMode,\n options?: RunOptions\n ): AsyncIterable<StreamEvent> {\n const runId = options?.runId ?? generateRunId();\n if (this.rustRunner !== null) {\n return this.streamViaRust(runId, initialData);\n }\n warnTsEngineOnce();\n return this.runtime.stream(runId, initialData, mode);\n }\n\n /** Single-shot stream for the Rust path: run to terminal state, emit it once. */\n private async *streamViaRust(\n runId: RunId,\n initialData: InitialData<TState>\n ): AsyncIterable<StreamEvent> {\n const state = await this.rustRunner!.run(runId, initialData as Record<string, unknown>);\n this.captureSuspension(state);\n yield { type: \"state_value\", state: state as unknown as GraphState };\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 * Escape hatch for the TS engine: the underlying runtime (time-travel, manual node\n * execution). On the Rust path the runtime is present but **not** the executor; use\n * {@link CompiledGraph.usesRustEngine} to branch, and the run-handle methods\n * (`run` / `resume` / `approveAndResume`) which behave identically across engines.\n */\n public get engine(): GraphRuntime {\n return this.runtime;\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 Error(\n `No suspended state for run '${String(runId)}'. On the Rust engine, resume/approve must ` +\n \"follow a suspended run on the same CompiledGraph instance.\"\n );\n }\n return state;\n }\n}\n\nconst TOOL_SUBJECT_PREFIX = \"tool:\";\n\n/**\n * Pull the tool name back out of an approval request's subject. The gated-tool subject\n * is `{ description: \"tool:<name>\" }` (see `agent-node.ts`); anything else yields\n * `undefined` (the request is not a tool gate we can match by name).\n */\nconst toolNameOfSubject = (request: ApprovalRequest): string | undefined => {\n const description = (request.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 * 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 * 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 Rust seam applies a\n * channel-update map and routes by the graph's static edges, so an in-handler `goto`\n * is *not* honored on the Rust path (dynamic in-handler routing stays a TS-engine\n * feature; build conditional edges instead). `null` / primitives yield an empty\n * 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 type { GraphValidationError } from \"@adriane-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/** Base class for every error thrown by `@adriane-ai/graph-sdk`. */\nexport class AdrianeSdkError extends Error {\n public constructor(message: string) {\n super(message);\n this.name = \"AdrianeSdkError\";\n }\n}\n\n/** Thrown when `.compile()` is called on a graph that fails validation. */\nexport class GraphCompileError extends AdrianeSdkError {\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 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 AdrianeSdkError {\n public constructor(nodeId: string) {\n super(`A node with id '${nodeId}' was already added to this graph.`);\n this.name = \"DuplicateNodeError\";\n }\n}\n\n/** Thrown when an action node is added without an executable handler. */\nexport class MissingHandlerError extends AdrianeSdkError {\n public constructor(nodeId: string) {\n super(`Node '${nodeId}' is an action node but no handler was provided.`);\n this.name = \"MissingHandlerError\";\n }\n}\n","import { createRequire } from \"node:module\";\n\nimport { GraphValidationError, type GraphDefinition, type GraphValidationErrorCode } from \"@adriane-ai/graph-core\";\n\n/**\n * Optional bridge to the Rust engine's validator (`@adriane-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(\"@adriane-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 \"@adriane-ai/graph-core\";\nimport type { AgentResult } from \"@adriane-ai/agents-core\";\nimport type { ConditionFn, NodeHandler } from \"@adriane-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 toRustAgentConfig,\n type AgentApprovalBinding,\n type AgentNodeConfig,\n type RustAgentConfig,\n type ToolNodeConfig\n} from \"./agent-node.js\";\nimport type { ComponentDescriptor, RustComponentConfig } from \"./components.js\";\nimport { DuplicateNodeError, GraphCompileError, MissingHandlerError, type Result } 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};\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 Adriane 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 /** 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 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 };\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: {\n agent: {\n provider: rustConfig.provider,\n model: rustConfig.model,\n tier: rustConfig.tier,\n system: rustConfig.system,\n toolNames: rustConfig.toolNames,\n maxIterations: rustConfig.maxIterations,\n suspendForApproval: rustConfig.suspendForApproval,\n approvalToolNames: rustConfig.approvalToolNames,\n outputChannel: rustConfig.outputChannel\n }\n }\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 Phase C carrier (`{ kind, params }`) so it runs\n * natively on the Rust engine, *and* registers the descriptor's equivalent TS handler\n * so the TS fallback path stays faithful when the native addon is absent.\n *\n * On the Rust path the component takes precedence over the JS seam even though its id\n * is also a JS node id — the bridge routes a `componentNodes` entry to the native\n * handler. So the node always runs the same logic on either engine.\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 TS-equivalent handler (the TS fallback\n // path) AND the SHARED CARRIER on `node.metadata.component` so the persisted\n // GraphDefinition is executable by the control plane's catalog run path\n // (see run-catalog-graph.ts) and renderable in the Studio editor. The Rust path\n // runs the native component handler, keyed by the `componentConfigs` carrier below.\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 /** 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 /** 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 /** Validate and compile, returning a {@link Result} instead of throwing. */\n public safeCompile(): Result<CompiledGraph<TState>, GraphCompileError> {\n const definition = this.buildDefinition();\n // Validate via the Rust core when its native addon is present; otherwise TS.\n const errors = tryRustValidate(definition) ?? validateGraph(definition);\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 agentApprovals: this.agentApprovals,\n componentConfigs: this.componentConfigs\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","/**\n * The component library surface: pure (no-LLM) compute building blocks addressable\n * by a string `kind` plus a `params` object. Mirrors the Rust `adriane_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 \"@adriane-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 type { NodeHandler } from \"@adriane-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/** 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};\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 template.replace(/\\{\\{\\s*([^}]*?)\\s*\\}\\}/g, (_match, rawName: string) => {\n const name = rawName.trim();\n return name in channels ? valueToText(channels[name]) : \"\";\n });\n\nconst promptBuilderHandler =\n (params: PromptBuilderParams): NodeHandler =>\n async (_input, state) => ({ [params.into]: renderTemplate(params.template, channelsOf(state)) });\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 `adriane_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 query text for embedding-based re-scoring. */\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. `&amp;` is decoded last so an input\n * like `&amp;lt;` round-trips to `&lt;` rather than being double-decoded.\n * Mirrors the Rust `decode_entities`.\n */\nconst decodeEntities = (text: string): string =>\n text\n .split(\"&lt;\")\n .join(\"<\")\n .split(\"&gt;\")\n .join(\">\")\n .split(\"&quot;\")\n .join('\"')\n .split(\"&amp;\")\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/** 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 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// --- 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 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 });\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 const limited = params.k === undefined ? merged : merged.slice(0, params.k);\n\n const results = limited.map(({ id, score }) => {\n const item = representative.get(id);\n return typeof item === \"object\" && item !== null && !Array.isArray(item)\n ? { ...item, score }\n : item;\n });\n return { [params.into]: results };\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 engine\n * (Rust when the `@adriane-ai/napi` addon is present, else the TS fallback);\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. Deterministic OFFLINE (a mock gateway, no\n * keys) and live-capable (Mistral when MISTRAL_API_KEY is present — the balanced tier\n * resolves to a concrete Mistral model on the Rust path).\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 \"@adriane-ai/graph-core\";\nimport {\n DefaultLLMGateway,\n MockLLMProviderAdapter,\n type LLMGateway,\n type ModelTier\n} from \"@adriane-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 \"Adriane 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 /**\n * The LLM gateway the answerer agent runs on (TS-engine path). Defaults to a\n * deterministic mock so the graph runs end-to-end with no provider keys. The Rust\n * engine path builds its own gateway from env (Mistral when MISTRAL_API_KEY is set,\n * else a deterministic mock), independent of this.\n */\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 LLM provider slot (and the slot the default mock registers under). Defaults to `\"mistral\"`. */\n provider?: \"openai\" | \"anthropic\" | \"mistral\";\n};\n\n/** A deterministic mock gateway whose every turn is a final answer. */\nconst mockGateway = (provider: NonNullable<DocQaReferenceOptions[\"provider\"]>): LLMGateway => {\n const gateway = new DefaultLLMGateway();\n gateway.registerAdapter(\n new MockLLMProviderAdapter({\n provider,\n response: {\n content:\n \"FINAL: Adriane checkpoints after every node and resumes from the latest \" +\n \"checkpoint [checkpointing].\",\n usage: { promptTokens: 0, completionTokens: 0 },\n model: \"mock\",\n provider\n }\n })\n );\n return gateway;\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 Adriane 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 const llm = options.llm ?? mockGateway(provider);\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 llm,\n prompt: { system: RAG_SYSTEM_PROMPT },\n provider,\n tier,\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 on either engine.\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 \"@adriane-ai/graph-core\";\nimport { InMemoryToolRegistry, type ToolId } from \"@adriane-ai/agents-core\";\nimport { DefaultLLMGateway } from \"@adriane-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/** 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: \"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","/**\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 \"@adriane-ai/graph-sdk\";\n *\n * const result = await prebuilt.summarizer().run({ question: \"long text…\" });\n * console.log(result.channels.summary);\n * ```\n *\n * By default each agent runs on a deterministic mock gateway (registered under the\n * nominal provider) so a prebuilt graph runs end-to-end with no provider keys. Supply\n * `llm` to run against a real gateway, `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 \"@adriane-ai/llm-gateway\";\nimport { InMemoryToolRegistry, type ToolId, type ToolRegistry } from \"@adriane-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 * The LLM gateway the agent runs on. Defaults to a deterministic mock gateway\n * registered under the nominal provider, so the graph runs with no provider keys.\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: \"Adriane 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 Mistral embeddings API\n * (`/embeddings` with `{ model, input }` and a `Bearer` key), parsing `data[].embedding`.\n * The {@link CreateEmbeddingsOptions.transport} hook overrides the network call so a test\n * can return deterministic vectors with no real network. This is the embedding backbone\n * behind {@link import(\"./semantic-retriever.js\").semanticRetriever}.\n *\n * ```ts\n * import { createEmbeddings } from \"@adriane-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 */\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 the Mistral embeddings API returns). The real default builds this from `fetch`;\n * 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 }`). */\nexport type EmbeddingsRequestBody = {\n model: string;\n input: string[];\n};\n\n/** Options for {@link createEmbeddings}. */\nexport type CreateEmbeddingsOptions = {\n /** The embeddings provider. Only `\"mistral\"` is wired today (the default). */\n provider?: \"mistral\";\n /** API key. Defaults to `process.env.MISTRAL_API_KEY`. Required unless `transport` is injected. */\n apiKey?: string;\n /** Embedding model. Defaults to `\"mistral-embed\"`. */\n model?: string;\n /** API base URL. Defaults to `\"https://api.mistral.ai/v1\"`. */\n baseUrl?: string;\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/** The default Mistral embeddings model. */\nconst DEFAULT_MODEL = \"mistral-embed\";\n/** The default Mistral API base URL. */\nconst DEFAULT_BASE_URL = \"https://api.mistral.ai/v1\";\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() {\n super(\n \"createEmbeddings: no API key (set `apiKey` or MISTRAL_API_KEY) and no `transport` injected; \" +\n \"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 }` to\n * `{baseUrl}/embeddings` with an `Authorization: Bearer <key>` header, returning the\n * parsed JSON. Throws on a non-2xx status. Only built when no `transport` is injected.\n */\nconst createMistralTransport =\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. With the default transport it POSTs to the\n * Mistral embeddings API (`{baseUrl||'https://api.mistral.ai/v1'}/embeddings`) with\n * `{ model: model||'mistral-embed', input: texts }` and `Authorization: Bearer\n * (apiKey || process.env.MISTRAL_API_KEY)`, parsing `data[].embedding`. Inject\n * `transport` to override that for offline tests. Throws {@link MissingEmbeddingsKeyError}\n * when neither a key nor a transport is available.\n */\nexport const createEmbeddings = (options: CreateEmbeddingsOptions = {}): Embeddings => {\n const model = options.model ?? DEFAULT_MODEL;\n const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n\n let transport: EmbeddingsTransport;\n if (options.transport !== undefined) {\n transport = options.transport;\n } else {\n const apiKey = options.apiKey ?? process.env.MISTRAL_API_KEY;\n if (apiKey === undefined || apiKey.length === 0) {\n throw new MissingEmbeddingsKeyError();\n }\n transport = createMistralTransport(apiKey, baseUrl);\n }\n\n return {\n async embed(texts) {\n if (texts.length === 0) {\n return [];\n }\n const parsed = await transport({ model, input: texts });\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 \"@adriane-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 \"@adriane-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: \"Adriane is a graph runtime.\" }],\n * embeddings: fakeEmbeddings // deterministic in tests\n * }));\n * ```\n */\n\nimport type { NodeHandler } from \"@adriane-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 * `@adriane-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 \"@adriane-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","/**\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 a control plane 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 `@adriane-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 * `@adriane-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 \"@adriane-ai/graph-core\";\nimport type { RunEvent } from \"@adriane-ai/graph-runtime\";\nimport type { ModelTier } from \"@adriane-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 } from \"@adriane-ai/approval-engine\";\n\nimport type { RustAgentConfig } from \"./agent-node.js\";\nimport { APPROVAL_IDS_CHANNEL, DEFAULT_AGENT_OUTPUT_CHANNEL } from \"./agent-node.js\";\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\";\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 system?: string;\n toolNames?: string[];\n maxIterations?: number;\n suspendForApproval?: boolean;\n approvalToolNames?: string[];\n outputChannel?: string;\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\"` — the state's status. */\n status: string;\n /** True when execution ran on the Rust engine (always, since this seam requires it). */\n usedRustEngine: true;\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 * 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) and\n * the control plane only ever resumes with engine-approved tools. Absent: the run is\n * ungoverned (the legacy channel-only behaviour).\n */\n approvalEngine?: ApprovalEngine;\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 (@adriane-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/**\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 = (carrier: AgentCarrier, usesApprovalEngine: boolean): RustAgentConfig => ({\n provider: carrier.provider ?? \"anthropic\",\n model: carrier.model,\n tier: carrier.tier,\n system: carrier.system,\n toolNames: carrier.toolNames ?? [],\n maxIterations: carrier.maxIterations,\n suspendForApproval: carrier.suspendForApproval === true,\n approvalToolNames: carrier.approvalToolNames ?? [],\n outputChannel: carrier.outputChannel ?? DEFAULT_AGENT_OUTPUT_CHANNEL,\n // The catalog path carries no JS tool closures — the agent's tools are native\n // (no-op stubs in the bridge unless a name is also in jsToolNames, which it never is here).\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): RustRunnerParts<ChannelValues> => {\n const components = new Map<string, RustComponentConfig>();\n const agents = new Map<string, RustAgentConfig>();\n const jsNodeIds = new Set<string>();\n\n for (const node of definition.nodes) {\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 continue;\n }\n const agent = readAgentCarrier(node.metadata);\n if (agent !== undefined) {\n agents.set(id, carrierToAgentConfig(agent, usesApprovalEngine));\n continue;\n }\n if (node.type === \"human-gate\") {\n // The runtime suspends natively at a human gate — no handler needed.\n continue;\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 return {\n definition,\n nodeFns: new Map(jsNodeIds.size === 0 ? [] : [...jsNodeIds].map((id) => [id, async () => ({})])),\n toolFns: new Map(),\n conditions: new Map(),\n agents,\n components,\n jsNodeIds,\n jsToolNames: new Set()\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(definition, options.approvalEngine !== undefined)\n );\n if (runner === null) {\n throw new RustEngineUnavailableError();\n }\n if (options.onEvent !== undefined) {\n runner.subscribe(options.onEvent);\n }\n const runId = options.runId ?? generateRunId();\n const state = (await runner.run(runId, options.initialData ?? {})) as unknown as GraphState;\n const governed = await fileApprovalRequests(definition, state, runId, options.approvalEngine);\n return { state: governed, status: governed.status, usedRustEngine: true };\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 * Throws {@link RustEngineUnavailableError} when the native addon is absent.\n */\nexport const resumeCatalogGraph = async (\n definition: GraphDefinition,\n state: GraphState,\n options: Pick<RunCatalogGraphOptions, \"onEvent\" | \"approvalEngine\"> & {\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`. A control plane\n * is the authority on which tools were approved (drawn from the ApprovalEngine), but\n * the engine re-checks the provenance here — defence in depth on the PRODUCTION\n * resume path. 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 const runner = tryCreateRustRunner<ChannelValues>(\n assembleParts(definition, options.approvalEngine !== undefined)\n );\n if (runner === null) {\n throw new RustEngineUnavailableError();\n }\n if (options.onEvent !== undefined) {\n runner.subscribe(options.onEvent);\n }\n const resumed = (await runner.resume(state, options.approvedTools ?? [])) as unknown as GraphState;\n // A resume can itself hit a NEW approval gate; file requests for that suspension too.\n const governed = await fileApprovalRequests(\n definition,\n resumed,\n String(resumed.runId) as RunId,\n options.approvalEngine\n );\n return { state: governed, status: governed.status, usedRustEngine: true };\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 the suspended state. */\nconst readApprovalRequests = (\n state: GraphState,\n outputChannel: string\n): SurfacedApprovalRequest[] => {\n const channel = (state.channels as Record<string, unknown>)[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 * 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 * No-ops (returns the state unchanged) when no engine is given or the run is not\n * suspended. Idempotency: an agent node that already carries stashed ids (a state that\n * was governed once) is skipped, so re-driving a suspended state does not double-file.\n */\nconst fileApprovalRequests = async (\n definition: GraphDefinition,\n state: GraphState,\n runId: RunId,\n engine: ApprovalEngine | 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: string[] = [];\n for (const node of definition.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(state, outputChannel)) {\n const created = await engine.request({\n runId,\n nodeId: String(node.id) as NodeId,\n requestedBy: String(node.id),\n subject: request.subject\n });\n ids.push(String(created.id));\n }\n }\n\n if (ids.length === 0) {\n return state;\n }\n return { ...state, channels: { ...channels, [APPROVAL_IDS_CHANNEL]: ids } };\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"]}