@kortyx/agent 0.21.0 → 0.22.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/CHANGELOG.md +25 -0
- package/dist/index.d.ts +9 -8
- package/dist/index.js +382 -227
- package/dist/index.js.map +1 -1
- package/package.json +8 -7
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../hooks/src/index.ts","../../hooks/src/complete-response.ts","../../hooks/src/context.ts","../../hooks/src/interrupt.ts","../../hooks/src/reason/checkpoint.ts","../../hooks/src/validation.ts","../../hooks/src/reason/use-reason.ts","../../hooks/src/structured.ts","../../hooks/src/structured-path.ts","../../hooks/src/reason/engine.ts","../../hooks/src/reason-engine.ts","../../hooks/src/reason/output-format.ts","../../hooks/src/reason/structured-stream.ts","../../hooks/src/reason/output-stream.ts","../../hooks/src/reason/parsing.ts","../../hooks/src/reason/prompting.ts","../../hooks/src/reason/result.ts","../../hooks/src/reason/tools.ts","../../hooks/src/hooks.ts","../../hooks/src/parallel.ts","../../hooks/src/workflow.ts","../../hooks/src/workflow-telemetry.ts","../src/index.ts","../src/adapters/http.ts","../src/adapters/http-client.ts","../src/chat/create-agent.ts","../src/execution/execute.ts","../src/interrupt/resume-handler.ts","../src/orchestrator.ts","../src/execution/contracts.ts","../src/execution/types.ts","../src/stream/response-lifecycle.ts","../src/stream/transform-graph-stream-for-ui.ts","../src/telemetry/events.ts","../src/telemetry/topology.ts","../src/interrupt/discovery.ts","../src/telemetry/workflow-call-branch.ts","../src/chat/process-chat.ts","../src/utils/extract-latest-message.ts"],"sourcesContent":["// release-test: 2026-01-22\n/**\n * @kortyx/hooks\n *\n * Internal hook implementations resolved via async-local context.\n */\n\nexport {\n type CompleteResponseOptions,\n completeResponse,\n} from \"./complete-response\";\nexport type { HookRuntimeContext } from \"./context\";\nexport { runWithHookContext } from \"./context\";\nexport type {\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonResult,\n UseReasonStep,\n UseReasonToolExecution,\n UseStructuredDataArgs,\n} from \"./hooks\";\nexport {\n useAbortSignal,\n useInterrupt,\n useNodeState,\n useReason,\n useRuntimeContext,\n useStructuredData,\n useWorkflowState,\n} from \"./hooks\";\nexport { ParallelError, parallel } from \"./parallel\";\nexport type {\n EnsureWorkflowTopologyRequest,\n EnsureWorkflowTopologyResponse,\n KortyxTelemetryConfig,\n KortyxTelemetryContentCapture,\n KortyxTelemetryCorrelation,\n KortyxTelemetryEvent,\n KortyxTelemetryEventType,\n KortyxTelemetryPrompt,\n KortyxTelemetryReporter,\n KortyxTelemetryService,\n KortyxTraceAdapter,\n KortyxTraceMetadata,\n ReasonTraceAdapter,\n ReasonTraceAttributes,\n ReasonTraceSpan,\n ReasonTraceSpanEndArgs,\n ReasonTraceSpanStartArgs,\n} from \"./tracing\";\nexport type { WorkflowCallOutcome, WorkflowCallService } from \"./workflow\";\nexport {\n createWorkflowHooks,\n useWorkflow,\n WorkflowCallError,\n workflowCallFingerprint,\n} from \"./workflow\";\nexport { emitWorkflowCall } from \"./workflow-telemetry\";\n","import { z } from \"zod\";\nimport { getHookContext, snapshotHookState } from \"./context\";\n\nexport type CompleteResponseOptions = {\n message?: string | undefined;\n data?: unknown;\n};\n\nconst optionsSchema = z\n .object({\n message: z.string().optional(),\n data: z.json().optional(),\n })\n .strict();\n\n/** Finish client delivery, leaving the node and workflow execution running. */\nexport async function completeResponse(\n options: CompleteResponseOptions = {},\n): Promise<void> {\n const ctx = getHookContext();\n const parsed = optionsSchema.parse(options);\n if (!ctx.node.completeResponse) {\n throw new Error(\n \"completeResponse requires an agent-managed root workflow.\",\n );\n }\n await ctx.node.completeResponse(parsed, snapshotHookState());\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type {\n GraphState,\n InterruptInput,\n InterruptResult,\n NodeConfig,\n TokenUsage,\n} from \"@kortyx/core\";\nimport type { KortyxUsage } from \"@kortyx/providers\";\nimport type { ParallelGroup, WorkflowTask } from \"./parallel\";\nimport type { KortyxTelemetryConfig, ReasonTraceAdapter } from \"./tracing\";\nimport type { WorkflowCallService } from \"./workflow\";\n\ntype NodeStateStore = {\n byIndex: unknown[];\n byKey: Record<string, unknown>;\n};\n\ntype HookRuntimeState = {\n nodeState?: Record<string, unknown>;\n workflowState?: Record<string, unknown>;\n};\n\ntype StoredNodeStateEnvelope = {\n nodeId?: unknown;\n state?: unknown;\n};\n\ntype HookStatePatchedError = {\n __kortyxHookStatePatch?: Record<string, unknown>;\n};\n\nexport type HookNodeRuntimeContext = {\n completeResponse?:\n | ((\n options: import(\"./complete-response\").CompleteResponseOptions,\n state: GraphState,\n ) => Promise<void>)\n | undefined;\n /** Transient execution control; never part of checkpointed state. */\n abortSignal?: AbortSignal | undefined;\n consumeExecution?:\n | ((limit: import(\"@kortyx/core\").ExecutionLimit) => void)\n | undefined;\n graph: {\n name: string;\n node: string;\n };\n config: NodeConfig;\n emit: (event: string, payload: unknown) => void;\n awaitInterrupt: (args: InterruptInput) => InterruptResult;\n callWorkflow?: WorkflowCallService;\n workflowCallTelemetry?: KortyxTelemetryConfig | undefined;\n};\n\nexport type HookRuntimeContext = {\n node: HookNodeRuntimeContext;\n state: GraphState;\n reasonTrace?: ReasonTraceAdapter | undefined;\n};\n\ntype HookInternalContext = HookRuntimeContext & {\n workflowCallActive: boolean;\n workflowCallIds: Set<string>;\n workflowTasks: WorkflowTask[];\n parallelJoins: Promise<unknown>[];\n parallelGroup: ParallelGroup | undefined;\n parallelIndex: number;\n workflowControlError?: unknown;\n workflowContextClosed: boolean;\n nodeStateIndex: number;\n reasonCallIndex: number;\n currentNodeState: NodeStateStore;\n workflowState: Record<string, unknown>;\n tokenUsage?: TokenUsage | undefined;\n stateDirty: boolean;\n runtimeDirty: boolean;\n};\n\nconst storage = new AsyncLocalStorage<HookInternalContext>();\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst normalizeNodeState = (value: unknown): NodeStateStore => {\n if (Array.isArray(value)) {\n return { byIndex: [...value], byKey: {} };\n }\n\n if (isRecord(value)) {\n const byIndex = Array.isArray(value.byIndex) ? [...value.byIndex] : [];\n const byKey = isRecord(value.byKey) ? { ...value.byKey } : {};\n return { byIndex, byKey };\n }\n\n return { byIndex: [], byKey: {} };\n};\n\nconst cloneWorkflowState = (value: unknown): Record<string, unknown> =>\n isRecord(value) ? { ...value } : {};\n\nconst cloneTokenUsage = (value: unknown): TokenUsage | undefined => {\n if (!isRecord(value)) return undefined;\n const input = typeof value.input === \"number\" ? value.input : undefined;\n const output = typeof value.output === \"number\" ? value.output : undefined;\n const total = typeof value.total === \"number\" ? value.total : undefined;\n if (input === undefined && output === undefined && total === undefined) {\n return undefined;\n }\n return {\n input: input ?? 0,\n output: output ?? 0,\n total: total ?? 0,\n };\n};\n\nconst getHookRuntimeState = (state: GraphState): HookRuntimeState => {\n const runtime = (state.runtime ?? {}) as Record<string, unknown>;\n const internal = isRecord(runtime.__kortyx) ? runtime.__kortyx : undefined;\n const result: HookRuntimeState = {};\n if (isRecord(internal?.nodeState)) result.nodeState = internal?.nodeState;\n if (isRecord(internal?.workflowState)) {\n result.workflowState = internal?.workflowState;\n }\n return result;\n};\n\nconst createInternalContext = (\n ctx: HookRuntimeContext,\n): HookInternalContext => {\n const hookRuntimeState = getHookRuntimeState(ctx.state);\n const nodeId = ctx.node.graph.node;\n const storedNodeState = isRecord(hookRuntimeState.nodeState)\n ? (hookRuntimeState.nodeState as StoredNodeStateEnvelope)\n : undefined;\n const storedNodeId =\n typeof storedNodeState?.nodeId === \"string\"\n ? String(storedNodeState.nodeId)\n : \"\";\n const storedState = storedNodeState?.state;\n const currentNodeState =\n storedNodeId && storedNodeId === nodeId\n ? normalizeNodeState(storedState)\n : { byIndex: [], byKey: {} };\n\n return {\n ...ctx,\n workflowCallActive: false,\n workflowCallIds: new Set(),\n workflowTasks: [],\n parallelJoins: [],\n parallelGroup: undefined,\n parallelIndex: 0,\n workflowContextClosed: false,\n nodeStateIndex: 0,\n reasonCallIndex: 0,\n currentNodeState,\n workflowState: cloneWorkflowState(hookRuntimeState.workflowState),\n tokenUsage: cloneTokenUsage(ctx.state.runtime?.tokenUsage),\n stateDirty: false,\n runtimeDirty: false,\n };\n};\n\nconst buildRuntimeStateUpdates = (ctx: HookInternalContext) => {\n const updates: Record<string, unknown> = {};\n\n if (ctx.stateDirty) {\n updates.__kortyx = {\n nodeState: {\n nodeId: ctx.node.graph.node,\n state: ctx.currentNodeState,\n },\n workflowState: ctx.workflowState,\n };\n }\n\n if (ctx.runtimeDirty && ctx.tokenUsage) {\n updates.tokenUsage = ctx.tokenUsage;\n }\n\n return Object.keys(updates).length > 0 ? updates : null;\n};\n\nconst cleanupCompletedReasonCheckpoints = (ctx: HookInternalContext): void => {\n let changed = false;\n\n for (const [key, value] of Object.entries(ctx.currentNodeState.byKey)) {\n if (!key.startsWith(\"__useReason:\")) continue;\n if (!isRecord(value) || value.status !== \"completed\") continue;\n delete ctx.currentNodeState.byKey[key];\n changed = true;\n }\n\n if (changed) ctx.stateDirty = true;\n};\n\nconst toTokenUsageDelta = (\n usage: KortyxUsage | undefined,\n): TokenUsage | undefined => {\n if (!usage) return undefined;\n\n const input = usage.input ?? 0;\n const output = usage.output ?? 0;\n const total =\n usage.total ??\n input +\n output +\n (usage.outputIncludesReasoning ? 0 : (usage.reasoning ?? 0));\n\n if (input === 0 && output === 0 && total === 0) {\n return undefined;\n }\n\n return {\n input,\n output,\n total,\n };\n};\n\nexport function accumulateTokenUsage(usage: KortyxUsage | undefined): void {\n const delta = toTokenUsageDelta(usage);\n if (!delta) return;\n\n const ctx = getHookContext();\n const current = ctx.tokenUsage ?? {\n input: 0,\n output: 0,\n total: 0,\n };\n\n ctx.tokenUsage = {\n input: current.input + delta.input,\n output: current.output + delta.output,\n total: current.total + delta.total,\n };\n ctx.runtimeDirty = true;\n}\n\nexport function getReasonTraceAdapter(): ReasonTraceAdapter | undefined {\n return getHookContext().reasonTrace;\n}\n\nexport async function runWithHookContext<T>(\n ctx: HookRuntimeContext,\n fn: () => Promise<T>,\n): Promise<{ result: T; runtimeUpdates: Record<string, unknown> | null }> {\n const internal = createInternalContext(ctx);\n try {\n const result = await storage.run(internal, async () => {\n const drain = async () => {\n let drained = -1;\n while (\n drained !==\n internal.parallelJoins.length + internal.workflowTasks.length\n ) {\n drained =\n internal.parallelJoins.length + internal.workflowTasks.length;\n await Promise.allSettled(internal.parallelJoins);\n await Promise.all(internal.workflowTasks.map((task) => task.done));\n }\n internal.workflowContextClosed = true;\n };\n try {\n const result = await fn();\n await drain();\n if (internal.workflowControlError) throw internal.workflowControlError;\n return result;\n } catch (error) {\n await drain();\n throw internal.workflowControlError ?? error;\n }\n });\n cleanupCompletedReasonCheckpoints(internal);\n for (const key of Object.keys(internal.currentNodeState.byKey)) {\n if (\n key.startsWith(\"__useWorkflow:\") ||\n key.startsWith(\"__parallel:\") ||\n key === \"__useWorkflowActivation\"\n ) {\n internal.currentNodeState.byKey[key] = null;\n internal.stateDirty = true;\n }\n }\n return { result, runtimeUpdates: buildRuntimeStateUpdates(internal) };\n } catch (err) {\n const runtimeUpdates = buildRuntimeStateUpdates(internal);\n if (runtimeUpdates) {\n const currentRuntime = isRecord(internal.state.runtime)\n ? (internal.state.runtime as Record<string, unknown>)\n : {};\n internal.state.runtime = {\n ...currentRuntime,\n ...runtimeUpdates,\n } as unknown as GraphState[\"runtime\"];\n if (err && typeof err === \"object\") {\n (err as HookStatePatchedError).__kortyxHookStatePatch = runtimeUpdates;\n }\n }\n throw err;\n }\n}\n\nexport function getHookContext(): HookInternalContext {\n const ctx = storage.getStore();\n if (!ctx) {\n throw new Error(\"Hooks can only be used while a node is executing.\");\n }\n return ctx;\n}\n\n/** Include hook state already written in this node, excluding future node returns. */\nexport function snapshotHookState(): GraphState {\n const ctx = getHookContext();\n return {\n ...ctx.state,\n lastNode: ctx.node.graph.node,\n runtime: { ...ctx.state.runtime, ...buildRuntimeStateUpdates(ctx) },\n };\n}\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { throwIfExecutionAborted } from \"@kortyx/core\";\nimport { getHookContext } from \"./context\";\nimport { resolveHookStatePatch } from \"./reason/checkpoint\";\nimport type { UseInterruptArgs } from \"./types\";\nimport { parseWithSchema } from \"./validation\";\n\nexport const awaitInterruptInternal = <\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(\n args: UseInterruptArgs<TRequest, TResponse>,\n): Promise<TResponse> => {\n const ctx = getHookContext();\n throwIfExecutionAborted(ctx.node.abortSignal);\n\n const request = parseWithSchema(\n args.requestSchema,\n args.request,\n \"useInterrupt request\",\n );\n const userMeta =\n args.meta && typeof args.meta === \"object\" && !Array.isArray(args.meta)\n ? args.meta\n : {};\n const resumeStatePatch = resolveHookStatePatch({\n nodeId: ctx.node.graph.node,\n currentNodeState: ctx.currentNodeState,\n workflowState: ctx.workflowState,\n });\n\n const enrichedRequest = {\n ...request,\n ...(typeof args.schemaId === \"string\" && args.schemaId.length > 0\n ? { schemaId: args.schemaId }\n : {}),\n ...(typeof args.schemaVersion === \"string\" && args.schemaVersion.length > 0\n ? { schemaVersion: args.schemaVersion }\n : {}),\n ...(typeof args.id === \"string\" && args.id.length > 0\n ? { id: args.id }\n : {}),\n meta: {\n ...userMeta,\n __kortyxResumeStatePatch: {\n ...resumeStatePatch,\n ...(ctx.tokenUsage ? { tokenUsage: ctx.tokenUsage } : {}),\n },\n },\n } as InterruptInput;\n\n const raw = ctx.node.awaitInterrupt(enrichedRequest);\n const response = parseWithSchema(\n args.responseSchema,\n raw,\n \"useInterrupt response\",\n );\n\n return Promise.resolve(response);\n};\n","import type { InterruptInput } from \"@kortyx/core\";\nimport type {\n KortyxFinishReason,\n KortyxProviderMetadata,\n KortyxUsage,\n KortyxWarning,\n} from \"@kortyx/providers\";\nimport type { UseReasonResult } from \"../types\";\n\nexport type ReasonInterruptCheckpoint = {\n status: \"awaiting_interrupt\";\n request: InterruptInput;\n firstText: string;\n firstRaw?: unknown;\n firstUsage?: KortyxUsage;\n firstFinishReason?: KortyxFinishReason;\n firstProviderMetadata?: KortyxProviderMetadata;\n firstWarnings?: KortyxWarning[];\n firstOutput?: unknown;\n};\n\nexport type ReasonCompletedCheckpoint = {\n status: \"completed\";\n result: UseReasonResult<unknown, unknown>;\n};\n\nexport const resolveReasonCheckpointKey = (args: {\n id?: string;\n autoIndex: number;\n}): string =>\n typeof args.id === \"string\" && args.id.length > 0\n ? `__useReason:${args.id}`\n : `__useReason:auto:${args.autoIndex}`;\n\nexport const readReasonCheckpoint = (\n raw: unknown,\n): ReasonInterruptCheckpoint | undefined => {\n if (!raw || typeof raw !== \"object\") return undefined;\n const value = raw as Record<string, unknown>;\n if (value.status !== \"awaiting_interrupt\") return undefined;\n if (typeof value.firstText !== \"string\") return undefined;\n if (!value.request || typeof value.request !== \"object\") return undefined;\n return {\n status: \"awaiting_interrupt\",\n request: value.request as InterruptInput,\n firstText: value.firstText,\n ...(Object.hasOwn(value, \"firstRaw\") ? { firstRaw: value.firstRaw } : {}),\n ...(Object.hasOwn(value, \"firstUsage\")\n ? { firstUsage: value.firstUsage as KortyxUsage }\n : {}),\n ...(Object.hasOwn(value, \"firstFinishReason\")\n ? { firstFinishReason: value.firstFinishReason as KortyxFinishReason }\n : {}),\n ...(Object.hasOwn(value, \"firstProviderMetadata\")\n ? {\n firstProviderMetadata:\n value.firstProviderMetadata as KortyxProviderMetadata,\n }\n : {}),\n ...(Object.hasOwn(value, \"firstWarnings\")\n ? { firstWarnings: value.firstWarnings as KortyxWarning[] }\n : {}),\n ...(Object.hasOwn(value, \"firstOutput\")\n ? { firstOutput: value.firstOutput }\n : {}),\n };\n};\n\nexport const readReasonCompletedCheckpoint = (\n raw: unknown,\n): ReasonCompletedCheckpoint | undefined => {\n if (!raw || typeof raw !== \"object\") return undefined;\n const value = raw as Record<string, unknown>;\n if (value.status !== \"completed\") return undefined;\n if (!value.result || typeof value.result !== \"object\") return undefined;\n return {\n status: \"completed\",\n result: value.result as UseReasonResult<unknown, unknown>,\n };\n};\n\nexport const resolveHookStatePatch = (args: {\n nodeId: string;\n currentNodeState: unknown;\n workflowState: Record<string, unknown>;\n}): Record<string, unknown> => ({\n __kortyx: {\n nodeState: {\n nodeId: args.nodeId,\n state: args.currentNodeState,\n },\n workflowState: args.workflowState,\n },\n});\n","import type { SchemaLike } from \"./types\";\n\nexport const parseWithSchema = <T>(\n schema: SchemaLike<T> | undefined,\n value: unknown,\n label: string,\n): T => {\n if (!schema) return value as T;\n\n const parsed = schema.safeParse(value);\n if (parsed.success) return parsed.data;\n\n const parsedError =\n \"error\" in parsed && parsed.error ? parsed.error : undefined;\n const reason =\n typeof parsedError?.message === \"string\" && parsedError.message.length > 0\n ? parsedError.message\n : \"invalid payload\";\n throw new Error(`${label} validation failed: ${reason}`);\n};\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { combineAbortSignals, throwIfExecutionAborted } from \"@kortyx/core\";\nimport type {\n KortyxFinishReason,\n KortyxProviderMetadata,\n KortyxUsage,\n KortyxWarning,\n} from \"@kortyx/providers\";\nimport {\n accumulateTokenUsage,\n getHookContext,\n getReasonTraceAdapter,\n} from \"../context\";\nimport { awaitInterruptInternal } from \"../interrupt\";\nimport { emitStructuredData, shouldStreamStructured } from \"../structured\";\nimport type { ReasonTraceSpan } from \"../tracing\";\nimport type { SchemaLike, UseReasonArgs, UseReasonResult } from \"../types\";\nimport { parseWithSchema } from \"../validation\";\nimport {\n type ReasonInterruptCheckpoint,\n readReasonCheckpoint,\n readReasonCompletedCheckpoint,\n resolveHookStatePatch,\n resolveReasonCheckpointKey,\n} from \"./checkpoint\";\nimport { createRuntimeId, reasonEngine } from \"./engine\";\nimport { inferOutputFormat } from \"./output-format\";\nimport { createStructuredOutputStreamer } from \"./output-stream\";\nimport {\n parseInterruptFirstPassResult,\n parseReasonOutputWithSchema,\n} from \"./parsing\";\nimport {\n defaultContinuationInput,\n defaultInterruptFirstPassInput,\n withOutputGuardrails,\n withStructuredStreamHints,\n} from \"./prompting\";\nimport {\n emitReasonStructuredOutput,\n mergeProviderMetadata,\n mergeUsage,\n mergeWarnings,\n} from \"./result\";\nimport {\n extractCompletedArrayItemGroups,\n extractCompletedFieldValues,\n extractStreamingStringValues,\n resolveAppendFieldPaths,\n resolveSetFieldPaths,\n resolveTextDeltaFieldPaths,\n} from \"./structured-stream\";\nimport { runReasonToolLoop } from \"./tools\";\n\nconst shouldStreamReasonStructured = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): boolean => (args.emit ?? true) && shouldStreamStructured(args.structured);\n\nconst resolveEffectiveReasoningIncludeThoughts = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): boolean =>\n args.reasoning?.includeThoughts ??\n args.model.options?.reasoning?.includeThoughts ??\n false;\n\nconst resolveEffectiveResponseFormatType = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): \"text\" | \"json\" | undefined =>\n args.responseFormat?.type ?? args.model.options?.responseFormat?.type;\n\nconst assertReasoningThoughtsCompatibility = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): void => {\n if (!resolveEffectiveReasoningIncludeThoughts(args)) return;\n\n const usesStructuredOutput =\n Boolean(args.outputSchema) ||\n Boolean(args.interrupt) ||\n Boolean(args.structured) ||\n resolveEffectiveResponseFormatType(args) === \"json\";\n\n if (!usesStructuredOutput) return;\n\n throw new Error(\n \"useReason does not support reasoning.includeThoughts with structured output, interrupt mode, or JSON responseFormat. Disable includeThoughts for this call.\",\n );\n};\n\nexport async function useReason<\n TOutput = unknown,\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): Promise<UseReasonResult<TOutput, TResponse>> {\n assertReasoningThoughtsCompatibility(args);\n const ctx = getHookContext();\n const abortSignal = combineAbortSignals(\n ctx.node.abortSignal,\n args.abortSignal,\n args.model.options?.abortSignal,\n );\n throwIfExecutionAborted(abortSignal);\n const allowValidatedToolOutput = Boolean(\n args.outputSchema &&\n !(args.responseFormat ?? args.model.options?.responseFormat),\n );\n const inferred = inferOutputFormat(\n args.outputSchema,\n args.responseFormat ?? args.model.options?.responseFormat,\n );\n args = {\n ...args,\n abortSignal,\n ...(!args.interrupt && inferred.responseFormat\n ? { responseFormat: inferred.responseFormat }\n : {}),\n };\n const id =\n typeof args.id === \"string\" && args.id.length > 0 ? args.id : undefined;\n const opId = createRuntimeId();\n const checkpointKey = resolveReasonCheckpointKey({\n ...(id ? { id } : {}),\n autoIndex: ctx.reasonCallIndex++,\n });\n const existingCompleted = readReasonCompletedCheckpoint(\n ctx.currentNodeState.byKey[checkpointKey],\n );\n\n if (existingCompleted) {\n return existingCompleted.result as UseReasonResult<TOutput, TResponse>;\n }\n\n const existingCheckpoint = readReasonCheckpoint(\n ctx.currentNodeState.byKey[checkpointKey],\n );\n\n const reasonMeta =\n typeof id === \"string\" ? ({ id, opId } as const) : ({ opId } as const);\n const traceSpan: ReasonTraceSpan | undefined =\n getReasonTraceAdapter()?.startSpan({\n name: \"useReason\",\n attributes: {\n ...(id ? { id } : {}),\n opId,\n nodeId: ctx.node.graph.node,\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n stream: args.stream ?? args.model.options?.streaming ?? true,\n emit: args.emit ?? true,\n ...(args.telemetry?.operation\n ? { operation: args.telemetry.operation }\n : {}),\n ...(args.telemetry?.prompt?.name\n ? { promptName: args.telemetry.prompt.name }\n : {}),\n ...(args.telemetry?.prompt?.version !== undefined\n ? { promptVersion: args.telemetry.prompt.version }\n : {}),\n ...(args.telemetry?.prompt?.type\n ? { promptType: args.telemetry.prompt.type }\n : {}),\n hasOutputSchema: Boolean(args.outputSchema),\n hasInterrupt: Boolean(args.interrupt),\n hasStructured: Boolean(args.structured),\n hasTools: Boolean(args.tools?.length),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n input: args.telemetry?.input ?? args.input,\n },\n });\n\n if (args.tools?.length) {\n return runReasonToolLoop({\n useReasonArgs: args,\n allowValidatedToolOutput,\n checkpointKey,\n initialWarnings: inferred.warnings,\n ...(id ? { id } : {}),\n opId,\n ...(traceSpan ? { traceSpan } : {}),\n });\n }\n const suppressTextStream = Boolean(args.outputSchema || args.interrupt);\n const setFieldPaths = resolveSetFieldPaths(args.structured);\n const appendFieldPaths = resolveAppendFieldPaths(args.structured);\n const textDeltaFieldPaths = resolveTextDeltaFieldPaths(args.structured);\n const useStructuredIncrementalStreaming = Boolean(\n args.outputSchema &&\n !args.interrupt &&\n (setFieldPaths.length > 0 ||\n appendFieldPaths.length > 0 ||\n textDeltaFieldPaths.length > 0) &&\n args.stream !== false &&\n shouldStreamReasonStructured(args),\n );\n\n let firstText = \"\";\n let firstRaw: unknown;\n let firstOutput: TOutput | undefined;\n let firstInterruptRequest: TRequest | undefined;\n let firstInterruptRequired = false;\n\n let finalText = \"\";\n let finalRaw: unknown;\n let finalOutput: TOutput | undefined;\n let aggregatedUsage: KortyxUsage | undefined;\n let finalFinishReason: KortyxFinishReason | undefined;\n let aggregatedProviderMetadata: KortyxProviderMetadata | undefined;\n let aggregatedWarnings: KortyxWarning[] | undefined = inferred.warnings;\n\n if (existingCheckpoint) {\n firstText = existingCheckpoint.firstText;\n firstRaw = existingCheckpoint.firstRaw;\n firstOutput = existingCheckpoint.firstOutput as TOutput | undefined;\n finalText = firstText;\n finalRaw = firstRaw;\n finalOutput = firstOutput;\n aggregatedUsage = existingCheckpoint.firstUsage;\n finalFinishReason = existingCheckpoint.firstFinishReason;\n aggregatedProviderMetadata = existingCheckpoint.firstProviderMetadata;\n aggregatedWarnings = existingCheckpoint.firstWarnings;\n traceSpan?.addEvent?.(\"useReason.resume\", {\n checkpointKey,\n });\n } else {\n const first = await reasonEngine(\n {\n ...args,\n emit: suppressTextStream ? false : args.emit,\n stream: useStructuredIncrementalStreaming\n ? true\n : suppressTextStream\n ? false\n : args.stream,\n ...(useStructuredIncrementalStreaming\n ? {\n onTextChunk: createStructuredOutputStreamer(args, id, opId),\n }\n : {}),\n },\n reasonMeta,\n args.interrupt\n ? defaultInterruptFirstPassInput({\n input: args.input,\n requestSchema: args.interrupt.requestSchema,\n mode: args.interrupt.mode ?? \"required\",\n ...(args.outputSchema\n ? { outputSchema: args.outputSchema as SchemaLike<unknown> }\n : {}),\n })\n : args.outputSchema\n ? withOutputGuardrails(\n withStructuredStreamHints(args.input, {\n ...(setFieldPaths.length > 0 ? { setFieldPaths } : {}),\n ...(appendFieldPaths.length > 0 ? { appendFieldPaths } : {}),\n ...(textDeltaFieldPaths.length > 0\n ? { textDeltaFieldPaths }\n : {}),\n }),\n args.outputSchema as SchemaLike<unknown>,\n )\n : undefined,\n );\n firstRaw = first.raw;\n finalRaw = first.raw;\n accumulateTokenUsage(first.usage);\n aggregatedUsage = mergeUsage(aggregatedUsage, first.usage);\n finalFinishReason = first.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n first.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, first.warnings);\n traceSpan?.addEvent?.(\"useReason.first-pass.complete\", {\n textLength: first.text.length,\n hasInterrupt: Boolean(args.interrupt),\n });\n\n if (args.interrupt) {\n const firstPass = parseInterruptFirstPassResult<TRequest, TOutput>({\n text: first.text,\n requestSchema: args.interrupt.requestSchema,\n ...(first.finishReason ? { finishReason: first.finishReason } : {}),\n ...(args.outputSchema\n ? { outputSchema: args.outputSchema as SchemaLike<TOutput> }\n : {}),\n mode: args.interrupt.mode ?? \"required\",\n });\n firstText = firstPass.draftText;\n finalText = firstPass.draftText;\n firstInterruptRequired = firstPass.interruptRequired;\n firstInterruptRequest = firstPass.request;\n firstOutput = firstPass.output;\n finalOutput = firstPass.output;\n } else {\n firstText = first.text;\n finalText = first.text;\n if (args.outputSchema) {\n firstOutput = parseReasonOutputWithSchema({\n text: first.text,\n schema: args.outputSchema,\n ...(first.finishReason ? { finishReason: first.finishReason } : {}),\n label: \"useReason output\",\n });\n }\n finalOutput = firstOutput;\n }\n }\n\n let interruptResponse: TResponse | undefined;\n\n if (args.interrupt && (existingCheckpoint || firstInterruptRequired)) {\n const requestSchema = args.interrupt.requestSchema;\n\n const interruptRequest = existingCheckpoint\n ? parseWithSchema(\n requestSchema,\n existingCheckpoint.request,\n \"useReason interrupt.request\",\n )\n : firstInterruptRequest;\n\n if (!interruptRequest) {\n throw new Error(\n \"useReason interrupt request is missing; first pass did not produce a valid interrupt payload.\",\n );\n }\n\n if (!existingCheckpoint) {\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"awaiting_interrupt\",\n request: interruptRequest,\n firstText,\n ...(firstRaw !== undefined ? { firstRaw } : {}),\n ...(aggregatedUsage !== undefined\n ? { firstUsage: aggregatedUsage }\n : {}),\n ...(finalFinishReason !== undefined\n ? { firstFinishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { firstProviderMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { firstWarnings: aggregatedWarnings }\n : {}),\n ...(firstOutput !== undefined ? { firstOutput } : {}),\n } satisfies ReasonInterruptCheckpoint;\n ctx.stateDirty = true;\n }\n\n const resumeStatePatch = resolveHookStatePatch({\n nodeId: ctx.node.graph.node,\n currentNodeState: ctx.currentNodeState,\n workflowState: ctx.workflowState,\n });\n\n interruptResponse = await awaitInterruptInternal<TRequest, TResponse>({\n request: interruptRequest,\n requestSchema,\n responseSchema: args.interrupt.responseSchema,\n ...(args.interrupt.schemaId ? { schemaId: args.interrupt.schemaId } : {}),\n ...(args.interrupt.schemaVersion\n ? { schemaVersion: args.interrupt.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n meta: {\n __kortyxResumeStatePatch: resumeStatePatch,\n },\n });\n traceSpan?.addEvent?.(\"useReason.interrupt.resolved\", {\n checkpointKey,\n });\n\n if (Object.hasOwn(ctx.currentNodeState.byKey, checkpointKey)) {\n delete ctx.currentNodeState.byKey[checkpointKey];\n ctx.stateDirty = true;\n }\n\n const continuationInput = defaultContinuationInput({\n input: args.input,\n draftText: firstText,\n ...(firstOutput !== undefined ? { draftOutput: firstOutput } : {}),\n request: interruptRequest,\n response: interruptResponse,\n });\n\n const second = await reasonEngine(\n {\n ...args,\n ...(inferred.responseFormat\n ? { responseFormat: inferred.responseFormat }\n : {}),\n emit: suppressTextStream ? false : args.emit,\n stream: suppressTextStream ? false : args.stream,\n },\n reasonMeta,\n args.outputSchema\n ? withOutputGuardrails(\n continuationInput,\n args.outputSchema as SchemaLike<unknown>,\n )\n : continuationInput,\n );\n finalText = second.text;\n finalRaw = second.raw;\n accumulateTokenUsage(second.usage);\n aggregatedUsage = mergeUsage(aggregatedUsage, second.usage);\n finalFinishReason = second.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n second.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, second.warnings);\n traceSpan?.addEvent?.(\"useReason.continuation.complete\", {\n textLength: second.text.length,\n });\n\n if (args.outputSchema) {\n finalOutput = parseReasonOutputWithSchema({\n text: finalText,\n schema: args.outputSchema,\n ...(second.finishReason ? { finishReason: second.finishReason } : {}),\n label: \"useReason output\",\n });\n }\n }\n\n if (finalOutput !== undefined) {\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: finalOutput,\n structured: args.structured,\n emit: args.emit ?? true,\n });\n }\n\n const result = {\n ...(id ? { id } : {}),\n opId,\n text: finalText,\n ...(finalRaw !== undefined ? { raw: finalRaw } : {}),\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n ...(finalOutput !== undefined ? { output: finalOutput } : {}),\n ...(interruptResponse !== undefined ? { interruptResponse } : {}),\n };\n\n if (args.interrupt) {\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"completed\",\n result,\n };\n ctx.stateDirty = true;\n }\n\n traceSpan?.end?.({\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n attributes: {\n textLength: finalText.length,\n resumedFromCheckpoint: Boolean(existingCheckpoint),\n interrupted: Boolean(interruptResponse !== undefined),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n output: args.telemetry?.output ?? finalOutput ?? finalText,\n },\n });\n\n return result;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { getHookContext } from \"./context\";\nimport { assertStructuredPath } from \"./structured-path\";\nimport type { UseReasonStructuredConfig, UseStructuredDataArgs } from \"./types\";\nimport { parseWithSchema } from \"./validation\";\n\nconst createStructuredStreamId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nexport const emitStructuredData = <TData = unknown>(\n args: UseStructuredDataArgs<TData>,\n): void => {\n const ctx = getHookContext();\n const streamId =\n typeof args.streamId === \"string\" && args.streamId.length > 0\n ? args.streamId\n : createStructuredStreamId();\n const dataType =\n typeof args.dataType === \"string\" && args.dataType.length > 0\n ? args.dataType\n : \"generic\";\n\n const base = {\n node: ctx.node.graph.node,\n streamId,\n dataType,\n ...(typeof args.schemaId === \"string\" && args.schemaId.length > 0\n ? { schemaId: args.schemaId }\n : {}),\n ...(typeof args.schemaVersion === \"string\" && args.schemaVersion.length > 0\n ? { schemaVersion: args.schemaVersion }\n : {}),\n ...(typeof args.id === \"string\" && args.id.length > 0\n ? { id: args.id }\n : {}),\n };\n\n if (args.kind === \"set\") {\n assertStructuredPath(args.path, \"useStructuredData\");\n const value = parseWithSchema(\n args.valueSchema,\n args.value,\n \"useStructuredData value\",\n );\n ctx.node.emit(\"structured_data\", {\n ...base,\n kind: \"set\",\n path: args.path,\n value,\n });\n return;\n }\n\n if (args.kind === \"append\") {\n assertStructuredPath(args.path, \"useStructuredData\");\n const items = args.items.map((item) =>\n parseWithSchema(args.itemSchema, item, \"useStructuredData append item\"),\n );\n ctx.node.emit(\"structured_data\", {\n ...base,\n kind: \"append\",\n path: args.path,\n items,\n });\n return;\n }\n\n if (args.kind === \"text-delta\") {\n assertStructuredPath(args.path, \"useStructuredData\");\n ctx.node.emit(\"structured_data\", {\n ...base,\n kind: \"text-delta\",\n path: args.path,\n delta: args.delta,\n });\n return;\n }\n\n const validated = parseWithSchema(\n args.dataSchema,\n args.data,\n \"useStructuredData data\",\n );\n\n ctx.node.emit(\"structured_data\", {\n ...base,\n kind: \"final\",\n data: validated,\n });\n};\n\nexport const shouldEmitStructured = (\n cfg: UseReasonStructuredConfig | undefined,\n): boolean => Boolean(cfg);\n\nexport const shouldStreamStructured = (\n cfg: UseReasonStructuredConfig | undefined,\n): boolean => Boolean(cfg) && (cfg?.stream ?? true);\n","export const parseStructuredPath = (path: string, source: string): string[] => {\n if (path.length === 0) {\n throw new Error(`${source} path must be a non-empty dot-separated string.`);\n }\n\n const parts = path.split(\".\");\n if (parts.some((part) => part.length === 0)) {\n throw new Error(\n `${source} path \"${path}\" must not contain empty segments.`,\n );\n }\n\n return parts;\n};\n\nexport const assertStructuredPath = (path: string, source: string): void => {\n parseStructuredPath(path, source);\n};\n","import { randomUUID } from \"node:crypto\";\nimport { combineAbortSignals, throwIfExecutionAborted } from \"@kortyx/core\";\nimport type {\n KortyxPromptMessage,\n KortyxReasoningOptions,\n KortyxResponseFormat,\n KortyxToolDefinition,\n ProviderModelRef,\n} from \"@kortyx/providers\";\nimport { accumulateTokenUsage, getHookContext } from \"../context\";\nimport type { RunReasonEngineResult } from \"../reason-engine\";\nimport { runReasonEngine } from \"../reason-engine\";\nimport type { KortyxTraceMetadata } from \"../tracing\";\n\nexport type ReasonEngineInput = {\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | undefined;\n maxOutputTokens?: number | undefined;\n stopSequences?: string[] | undefined;\n abortSignal?: AbortSignal | undefined;\n reasoning?: KortyxReasoningOptions | undefined;\n responseFormat?: KortyxResponseFormat | undefined;\n providerOptions?: Record<string, unknown> | undefined;\n tools?: KortyxToolDefinition[] | undefined;\n messages?: KortyxPromptMessage[] | undefined;\n emit?: boolean | undefined;\n stream?: boolean | undefined;\n onTextChunk?: ((text: string) => void) | undefined;\n telemetry?: KortyxTraceMetadata | undefined;\n};\n\nexport const createRuntimeId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nexport async function reasonEngine(\n args: ReasonEngineInput,\n meta: { id?: string; opId: string },\n inputOverride?: string,\n): Promise<RunReasonEngineResult> {\n const ctx = getHookContext();\n const abortSignal = combineAbortSignals(\n ctx.node.abortSignal,\n args.abortSignal,\n args.model.options?.abortSignal,\n );\n throwIfExecutionAborted(abortSignal);\n ctx.node.consumeExecution?.(\"maxModelPasses\");\n\n try {\n return await runReasonEngine({\n model: args.model,\n input: inputOverride ?? args.input,\n system: args.system,\n temperature: args.temperature,\n maxOutputTokens: args.maxOutputTokens,\n stopSequences: args.stopSequences,\n abortSignal,\n reasoning: args.reasoning,\n responseFormat: args.responseFormat,\n providerOptions: args.providerOptions,\n tools: args.tools,\n messages: args.messages,\n defaultTemperature: ctx.node.config?.model?.temperature,\n stream: args.stream,\n emit: args.emit,\n onTextChunk: args.onTextChunk,\n telemetry: args.telemetry,\n nodeId: ctx.node.graph.node,\n emitEvent: ctx.node.emit,\n reasonTrace: ctx.reasonTrace,\n id: meta.id,\n opId: meta.opId,\n });\n } catch (error) {\n const usage = (error as Partial<RunReasonEngineResult> | undefined)?.usage;\n if (usage) accumulateTokenUsage(usage);\n throw error;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport {\n createExecutionCancelledError,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport type {\n KortyxContinuation,\n KortyxFinishReason,\n KortyxPromptMessage,\n KortyxProviderMetadata,\n KortyxReasoningOptions,\n KortyxResponseFormat,\n KortyxToolCall,\n KortyxToolDefinition,\n KortyxUsage,\n KortyxWarning,\n ProviderModelRef,\n} from \"@kortyx/providers\";\nimport type {\n KortyxTraceMetadata,\n ReasonTraceAdapter,\n ReasonTraceSpan,\n} from \"./tracing\";\n\nexport interface RunReasonEngineArgs {\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | undefined;\n maxOutputTokens?: number | undefined;\n stopSequences?: string[] | undefined;\n abortSignal?: AbortSignal | undefined;\n reasoning?: KortyxReasoningOptions | undefined;\n responseFormat?: KortyxResponseFormat | undefined;\n providerOptions?: Record<string, unknown> | undefined;\n tools?: KortyxToolDefinition[] | undefined;\n messages?: KortyxPromptMessage[] | undefined;\n defaultTemperature?: number | undefined;\n stream?: boolean | undefined;\n emit?: boolean | undefined;\n nodeId?: string | undefined;\n emitEvent?: ((event: string, payload: unknown) => void) | undefined;\n onTextChunk?: ((text: string) => void) | undefined;\n id?: string | undefined;\n opId?: string | undefined;\n segmentId?: string | undefined;\n telemetry?: KortyxTraceMetadata | undefined;\n reasonTrace?: ReasonTraceAdapter | undefined;\n}\n\nexport interface RunReasonEngineResult {\n continuation?: KortyxContinuation;\n text: string;\n raw?: unknown;\n usage?: KortyxUsage;\n finishReason?: KortyxFinishReason;\n toolCalls?: KortyxToolCall[];\n providerMetadata?: KortyxProviderMetadata;\n warnings?: KortyxWarning[];\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\nconst createRuntimeId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nconst emitNodeEvent = (\n emitEvent: RunReasonEngineArgs[\"emitEvent\"],\n nodeId: string | undefined,\n event: string,\n payload: Record<string, unknown>,\n): void => {\n if (!emitEvent) return;\n emitEvent(event, {\n ...payload,\n ...(typeof nodeId === \"string\" && nodeId.length > 0\n ? { node: nodeId }\n : {}),\n });\n};\n\nexport const resolveProviderOptions = (\n defaults: Record<string, unknown> | undefined,\n overrides: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined => {\n const providerOptions =\n defaults || overrides ? { ...defaults, ...overrides } : undefined;\n // Provider namespaces inherit model defaults (including transport) while\n // allowing individual call settings to override them.\n for (const [key, value] of Object.entries(overrides ?? {})) {\n const previous = defaults?.[key];\n if (\n previous &&\n value &&\n typeof previous === \"object\" &&\n typeof value === \"object\" &&\n !Array.isArray(previous) &&\n !Array.isArray(value)\n ) {\n if (providerOptions) providerOptions[key] = { ...previous, ...value };\n }\n }\n return providerOptions;\n};\n\nexport async function runReasonEngine(\n args: RunReasonEngineArgs,\n): Promise<RunReasonEngineResult> {\n let stream = args.stream ?? args.model.options?.streaming ?? true;\n const emit = args.emit ?? true;\n const temperature =\n args.temperature ??\n args.model.options?.temperature ??\n args.defaultTemperature;\n const maxOutputTokens =\n args.maxOutputTokens ?? args.model.options?.maxOutputTokens;\n const stopSequences = args.stopSequences ?? args.model.options?.stopSequences;\n const abortSignal = args.abortSignal ?? args.model.options?.abortSignal;\n const reasoning = args.reasoning ?? args.model.options?.reasoning;\n const responseFormat =\n args.responseFormat ?? args.model.options?.responseFormat;\n const providerOptions = resolveProviderOptions(\n args.model.options?.providerOptions,\n args.providerOptions,\n );\n const tools = args.tools ?? args.model.options?.tools;\n\n throwIfExecutionAborted(abortSignal);\n const model = args.model.provider.getModel(args.model.modelId, {\n ...(temperature !== undefined ? { temperature } : {}),\n streaming: stream,\n ...(maxOutputTokens !== undefined ? { maxOutputTokens } : {}),\n ...(stopSequences !== undefined ? { stopSequences } : {}),\n ...(abortSignal !== undefined ? { abortSignal } : {}),\n ...(reasoning !== undefined ? { reasoning } : {}),\n ...(responseFormat !== undefined ? { responseFormat } : {}),\n ...(tools !== undefined ? { tools } : {}),\n ...(providerOptions !== undefined ? { providerOptions } : {}),\n });\n\n if (tools?.length && !model.supportsToolStreaming) stream = false;\n\n const messages: KortyxPromptMessage[] =\n args.messages !== undefined\n ? args.messages\n : [\n ...(typeof args.system === \"string\" && args.system.length > 0\n ? [{ role: \"system\" as const, content: args.system }]\n : []),\n { role: \"user\" as const, content: String(args.input ?? \"\") },\n ];\n\n const opId =\n typeof args.opId === \"string\" && args.opId.length > 0\n ? args.opId\n : createRuntimeId();\n const segmentId =\n typeof args.segmentId === \"string\" && args.segmentId.length > 0\n ? args.segmentId\n : createRuntimeId();\n\n const commonMeta: Record<string, unknown> = {\n ...(typeof args.id === \"string\" && args.id.length > 0\n ? { id: args.id }\n : {}),\n opId,\n segmentId,\n };\n const traceSpan = args.reasonTrace?.startSpan({\n name: \"runReasonEngine\",\n attributes: {\n ...commonMeta,\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n stream,\n emit,\n ...(args.telemetry?.operation\n ? { operation: args.telemetry.operation }\n : {}),\n ...(args.telemetry?.prompt?.name\n ? { promptName: args.telemetry.prompt.name }\n : {}),\n ...(args.telemetry?.prompt?.version !== undefined\n ? { promptVersion: args.telemetry.prompt.version }\n : {}),\n ...(args.telemetry?.prompt?.type\n ? { promptType: args.telemetry.prompt.type }\n : {}),\n ...(typeof args.nodeId === \"string\" && args.nodeId.length > 0\n ? { nodeId: args.nodeId }\n : {}),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n input:\n args.telemetry?.input ??\n messages.map(\n ({ continuation: _continuation, raw: _raw, ...message }) => message,\n ),\n },\n });\n const modelRequestStartedAt = Date.now();\n let firstTextTokenAt: number | undefined;\n let lastTextTokenAt: number | undefined;\n\n const generationTimingAttributes = (): Record<string, number> =>\n firstTextTokenAt === undefined || lastTextTokenAt === undefined\n ? {}\n : {\n ttftMs: Math.max(0, firstTextTokenAt - modelRequestStartedAt),\n streamDurationMs: Math.max(0, lastTextTokenAt - firstTextTokenAt),\n timeToLastTokenMs: Math.max(\n 0,\n lastTextTokenAt - modelRequestStartedAt,\n ),\n };\n\n const endTrace = (\n span: ReasonTraceSpan | undefined,\n result: RunReasonEngineResult,\n ): void => {\n span?.end?.({\n ...(result.usage !== undefined ? { usage: result.usage } : {}),\n ...(result.finishReason !== undefined\n ? { finishReason: result.finishReason }\n : {}),\n ...(result.providerMetadata !== undefined\n ? { providerMetadata: result.providerMetadata }\n : {}),\n ...(result.warnings !== undefined ? { warnings: result.warnings } : {}),\n attributes: {\n textLength: result.text.length,\n ...generationTimingAttributes(),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n output: args.telemetry?.output ?? result.text,\n },\n });\n };\n\n const failTrace = (\n span: ReasonTraceSpan | undefined,\n error: unknown,\n ): void => {\n const detail = error as Partial<RunReasonEngineResult> | undefined;\n span?.fail?.(error, {\n ...(detail?.usage ? { usage: detail.usage } : {}),\n ...(detail?.finishReason ? { finishReason: detail.finishReason } : {}),\n ...(detail?.providerMetadata\n ? { providerMetadata: detail.providerMetadata }\n : {}),\n attributes: {\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n },\n });\n };\n\n try {\n if (stream) {\n let continuation: KortyxContinuation | undefined;\n let final = \"\";\n let raw: unknown;\n let usage: KortyxUsage | undefined;\n let finishReason: KortyxFinishReason | undefined;\n let toolCalls: KortyxToolCall[] | undefined;\n let providerMetadata: KortyxProviderMetadata | undefined;\n let warnings: KortyxWarning[] | undefined;\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-start\", {\n ...commonMeta,\n });\n }\n\n const response = await model.stream(messages);\n for await (const chunk of response) {\n throwIfExecutionAborted(abortSignal);\n switch (chunk.type) {\n case \"text-delta\": {\n if (chunk.delta.length === 0) break;\n const tokenAt = Date.now();\n firstTextTokenAt ??= tokenAt;\n lastTextTokenAt = tokenAt;\n final += chunk.delta;\n args.onTextChunk?.(chunk.delta);\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: chunk.delta,\n });\n }\n break;\n }\n case \"finish\": {\n continuation = chunk.continuation;\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.usage !== undefined) {\n usage = chunk.usage;\n }\n if (chunk.finishReason !== undefined) {\n finishReason = chunk.finishReason;\n }\n if (chunk.toolCalls !== undefined) {\n toolCalls = chunk.toolCalls;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (chunk.warnings !== undefined) {\n warnings = chunk.warnings;\n }\n break;\n }\n case \"raw\": {\n raw = chunk.raw;\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n break;\n }\n case \"error\": {\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (chunk.warnings !== undefined) {\n warnings = chunk.warnings;\n }\n throw toError(chunk.error);\n }\n }\n }\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n const result = {\n text: final,\n ...(continuation ? { continuation } : {}),\n ...(raw !== undefined ? { raw } : {}),\n ...(usage !== undefined ? { usage } : {}),\n ...(finishReason !== undefined ? { finishReason } : {}),\n ...(toolCalls !== undefined ? { toolCalls } : {}),\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n ...(warnings !== undefined ? { warnings } : {}),\n };\n throwIfExecutionAborted(abortSignal);\n endTrace(traceSpan, result);\n return result;\n }\n\n const response = await model.invoke(messages);\n throwIfExecutionAborted(abortSignal);\n if (response.content) args.onTextChunk?.(response.content);\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-start\", {\n ...commonMeta,\n });\n if (response.content) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: response.content,\n });\n }\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n const result = {\n text: response.content,\n ...(response.continuation ? { continuation: response.continuation } : {}),\n ...(response.raw !== undefined ? { raw: response.raw } : {}),\n ...(response.usage !== undefined ? { usage: response.usage } : {}),\n ...(response.finishReason !== undefined\n ? { finishReason: response.finishReason }\n : {}),\n ...(response.toolCalls !== undefined\n ? { toolCalls: response.toolCalls }\n : {}),\n ...(response.providerMetadata !== undefined\n ? { providerMetadata: response.providerMetadata }\n : {}),\n ...(response.warnings !== undefined\n ? { warnings: response.warnings }\n : {}),\n };\n endTrace(traceSpan, result);\n return result;\n } catch (error) {\n const failure = abortSignal?.aborted\n ? createExecutionCancelledError()\n : error;\n failTrace(traceSpan, failure);\n throw failure;\n }\n}\n","import type { KortyxResponseFormat, KortyxWarning } from \"@kortyx/providers\";\nimport { toJSONSchema } from \"zod\";\nimport type { SchemaLike } from \"../types\";\n\n/** Infer the wire schema only when the caller did not choose a format. */\nexport function inferOutputFormat(\n schema: SchemaLike<unknown> | undefined,\n explicit: KortyxResponseFormat | undefined,\n): {\n responseFormat?: KortyxResponseFormat;\n warnings?: KortyxWarning[];\n} {\n if (explicit) return { responseFormat: explicit };\n if (!schema) return {};\n try {\n const json = toJSONSchema(schema as never) as Record<string, unknown>;\n const clean = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(clean);\n if (!value || typeof value !== \"object\") return value;\n const object = value as Record<string, unknown>;\n if (\n [\n \"allOf\",\n \"not\",\n \"dependentRequired\",\n \"dependentSchemas\",\n \"if\",\n \"then\",\n \"else\",\n \"prefixItems\",\n ].some((key) => key in object)\n )\n throw new Error(\n \"Schema composition requires an explicit provider schema\",\n );\n if (object.type === \"object\") {\n if (object.additionalProperties !== false)\n throw new Error(\n \"Dynamic properties require an explicit provider schema\",\n );\n const properties = object.properties as\n | Record<string, unknown>\n | undefined;\n const required = object.required as string[] | undefined;\n if (\n properties &&\n Object.keys(properties).some((key) => !required?.includes(key))\n ) {\n throw new Error(\n \"Optional properties require an explicit provider schema\",\n );\n }\n }\n return Object.fromEntries(\n Object.entries(object)\n .filter(([key]) => key !== \"$schema\" && key !== \"default\")\n .map(([key, child]) => {\n // Property and definition names are user data, not schema keywords.\n if (\n (key === \"properties\" ||\n key === \"$defs\" ||\n key === \"definitions\") &&\n child &&\n typeof child === \"object\"\n )\n return [\n key,\n Object.fromEntries(\n Object.entries(child).map(([name, definition]) => [\n name,\n clean(definition),\n ]),\n ),\n ];\n return [\n key,\n key === \"enum\" || key === \"const\" ? child : clean(child),\n ];\n }),\n );\n };\n if (json.type !== \"object\")\n throw new Error(\"The provider schema must have an object root\");\n return { responseFormat: { type: \"json\", schema: clean(json) } };\n } catch {\n return {\n responseFormat: { type: \"json\" },\n warnings: [\n {\n type: \"compatibility\",\n feature: \"outputSchema\",\n details:\n \"This validator cannot be inferred as a strict provider JSON schema. Kortyx still validates the final output locally. Supply responseFormat.schema to enforce a wire schema.\",\n },\n ],\n };\n }\n}\n","import { assertStructuredPath, parseStructuredPath } from \"../structured-path\";\nimport type { UseReasonStructuredConfig } from \"../types\";\n\nexport const resolveAppendFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const appendPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"append\")\n .map(([path]) => path);\n\n for (const path of appendPaths) {\n assertStructuredPath(path, \"useReason structured append\");\n }\n\n return appendPaths;\n};\n\nexport const resolveSetFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const setPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"set\")\n .map(([path]) => path);\n\n for (const path of setPaths) {\n assertStructuredPath(path, \"useReason structured set\");\n }\n\n return setPaths;\n};\n\nexport const resolveTextDeltaFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const textPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"text-delta\")\n .map(([path]) => path);\n\n for (const path of textPaths) {\n assertStructuredPath(path, \"useReason structured text-delta\");\n }\n\n return textPaths;\n};\n\nconst extractCompletedStringValueAt = (args: {\n text: string;\n start: number;\n}): { complete: boolean; value?: string } => {\n let value = \"\";\n\n for (let i = args.start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (ch === '\"') {\n return {\n complete: true,\n value,\n };\n }\n\n if (ch !== \"\\\\\") {\n value += ch;\n continue;\n }\n\n const next = args.text[i + 1];\n if (!next) {\n return {\n complete: false,\n };\n }\n\n if (\n next === '\"' ||\n next === \"\\\\\" ||\n next === \"/\" ||\n next === \"b\" ||\n next === \"f\" ||\n next === \"n\" ||\n next === \"r\" ||\n next === \"t\"\n ) {\n value +=\n next === \"b\"\n ? \"\\b\"\n : next === \"f\"\n ? \"\\f\"\n : next === \"n\"\n ? \"\\n\"\n : next === \"r\"\n ? \"\\r\"\n : next === \"t\"\n ? \"\\t\"\n : next;\n i += 1;\n continue;\n }\n\n if (next === \"u\") {\n const hex = args.text.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n return {\n complete: false,\n };\n }\n value += String.fromCharCode(Number.parseInt(hex, 16));\n i += 5;\n continue;\n }\n\n return {\n complete: false,\n };\n }\n\n return {\n complete: false,\n };\n};\n\nconst skipWhitespace = (text: string, start: number): number => {\n let i = start;\n while (i < text.length && /\\s/.test(text[i] ?? \"\")) i += 1;\n return i;\n};\n\nconst pathSegmentMatches = (patternPart: string, actualPart: string): boolean =>\n patternPart === \"*\" || patternPart === actualPart;\n\nconst pathMatchesPattern = (\n actualParts: string[],\n patternParts: string[],\n): boolean =>\n actualParts.length === patternParts.length &&\n actualParts.every((part, index) =>\n pathSegmentMatches(patternParts[index] ?? \"\", part),\n );\n\nconst isPathPrefix = (prefix: string[], full: string[]): boolean =>\n prefix.length <= full.length &&\n prefix.every((part, index) => pathSegmentMatches(full[index] ?? \"\", part));\n\nconst parseStringToken = (\n text: string,\n start: number,\n): { complete: boolean; end?: number; value?: string } => {\n if (text[start] !== '\"') return { complete: false };\n\n const parsed = extractCompletedStringValueAt({ text, start: start + 1 });\n if (!parsed.complete || parsed.value === undefined)\n return { complete: false };\n\n let inEscape = false;\n for (let i = start + 1; i < text.length; i += 1) {\n const ch = text[i];\n if (ch === undefined) break;\n\n if (inEscape) {\n inEscape = false;\n if (ch === \"u\") i += 4;\n continue;\n }\n\n if (ch === \"\\\\\") {\n inEscape = true;\n continue;\n }\n\n if (ch === '\"') {\n return {\n complete: true,\n end: i + 1,\n value: parsed.value,\n };\n }\n }\n\n return { complete: false };\n};\n\nconst skipNestedValue = (\n text: string,\n start: number,\n): { complete: boolean; end?: number } => {\n const opener = text[start];\n const closer = opener === \"{\" ? \"}\" : \"]\";\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n\n for (let i = start; i < text.length; i += 1) {\n const ch = text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === opener) {\n nesting += 1;\n continue;\n }\n\n if (ch === closer) {\n nesting -= 1;\n if (nesting === 0) {\n return { complete: true, end: i + 1 };\n }\n }\n }\n\n return { complete: false };\n};\n\nconst skipCompleteValue = (\n text: string,\n start: number,\n): { complete: boolean; end?: number } => {\n const i = skipWhitespace(text, start);\n const first = text[i];\n if (!first) return { complete: false };\n\n if (first === '\"') {\n const parsed = parseStringToken(text, i);\n return parsed.complete && parsed.end !== undefined\n ? { complete: true, end: parsed.end }\n : { complete: false };\n }\n\n if (first === \"{\" || first === \"[\") {\n return skipNestedValue(text, i);\n }\n\n for (let j = i; j < text.length; j += 1) {\n const ch = text[j];\n if (ch !== \",\" && ch !== \"}\" && ch !== \"]\") continue;\n\n const raw = text.slice(i, j).trim();\n if (!raw) return { complete: false };\n\n try {\n JSON.parse(raw);\n return { complete: true, end: j };\n } catch {\n return { complete: false };\n }\n }\n\n return { complete: false };\n};\n\nconst locateValueStart = (args: {\n text: string;\n path: string;\n}): { found: boolean; start?: number } => {\n const [first] = locateValueStarts(args);\n return first\n ? {\n found: true,\n start: first.start,\n }\n : {\n found: false,\n };\n};\n\nconst locateValueStarts = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; start: number }> => {\n const targetParts = parseStructuredPath(\n args.path,\n \"useReason structured field\",\n );\n const matches: Array<{ path: string; start: number }> = [];\n\n const visitValue = (start: number, currentParts: string[]): void => {\n const valueStart = skipWhitespace(args.text, start);\n if (pathMatchesPattern(currentParts, targetParts)) {\n matches.push({\n path: currentParts.join(\".\"),\n start: valueStart,\n });\n return;\n }\n\n if (!isPathPrefix(currentParts, targetParts)) {\n return;\n }\n\n const first = args.text[valueStart];\n if (first === \"{\") visitObject(valueStart + 1, currentParts);\n if (first === \"[\") visitArray(valueStart + 1, currentParts);\n };\n\n const visitObject = (start: number, currentParts: string[]): void => {\n let i = skipWhitespace(args.text, start);\n\n while (i < args.text.length) {\n const ch = args.text[i];\n if (ch === \"}\") return;\n if (ch === \",\") {\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (ch !== '\"') return;\n\n const key = parseStringToken(args.text, i);\n if (!key.complete || key.end === undefined || key.value === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, key.end);\n if (args.text[i] !== \":\") return;\n\n const valueStart = skipWhitespace(args.text, i + 1);\n const childParts = [...currentParts, key.value];\n if (pathMatchesPattern(childParts, targetParts)) {\n matches.push({\n path: childParts.join(\".\"),\n start: valueStart,\n });\n } else if (isPathPrefix(childParts, targetParts)) {\n visitValue(valueStart, childParts);\n }\n\n const skipped = skipCompleteValue(args.text, valueStart);\n if (!skipped.complete || skipped.end === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, skipped.end);\n if (args.text[i] === \",\") {\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (args.text[i] === \"}\") return;\n return;\n }\n };\n\n const visitArray = (start: number, currentParts: string[]): void => {\n let i = skipWhitespace(args.text, start);\n let index = 0;\n\n while (i < args.text.length) {\n if (args.text[i] === \"]\") return;\n\n const childParts = [...currentParts, String(index)];\n if (pathMatchesPattern(childParts, targetParts)) {\n matches.push({\n path: childParts.join(\".\"),\n start: i,\n });\n } else if (isPathPrefix(childParts, targetParts)) {\n visitValue(i, childParts);\n }\n\n const skipped = skipCompleteValue(args.text, i);\n if (!skipped.complete || skipped.end === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, skipped.end);\n if (args.text[i] === \",\") {\n index += 1;\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (args.text[i] === \"]\") return;\n return;\n }\n };\n\n visitValue(0, []);\n return matches;\n};\n\nconst extractCompletedValueAt = (args: {\n text: string;\n start: number;\n}): { complete: boolean; value?: unknown } => {\n const start = skipWhitespace(args.text, args.start);\n const first = args.text[start];\n if (!first) return { complete: false };\n\n if (first === '\"') {\n const parsed = extractCompletedStringValueAt({\n text: args.text,\n start: start + 1,\n });\n return parsed.complete\n ? {\n complete: true,\n value: parsed.value,\n }\n : {\n complete: false,\n };\n }\n\n if (first === \"{\") {\n return extractCompletedNestedValueAt({\n text: args.text,\n start,\n opener: \"{\",\n closer: \"}\",\n });\n }\n\n if (first === \"[\") {\n return extractCompletedNestedValueAt({\n text: args.text,\n start,\n opener: \"[\",\n closer: \"]\",\n });\n }\n\n for (let i = start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n if (ch !== \",\" && ch !== \"}\" && ch !== \"]\") continue;\n\n const raw = args.text.slice(start, i).trim();\n if (!raw) return { complete: false };\n\n try {\n return {\n complete: true,\n value: JSON.parse(raw),\n };\n } catch {\n return { complete: false };\n }\n }\n\n return { complete: false };\n};\n\nconst extractCompletedNestedValueAt = (args: {\n text: string;\n start: number;\n opener: \"{\" | \"[\";\n closer: \"}\" | \"]\";\n}): { complete: boolean; value?: unknown } => {\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n\n for (let i = args.start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === args.opener) {\n nesting += 1;\n continue;\n }\n\n if (ch === args.closer) {\n nesting -= 1;\n if (nesting === 0) {\n const raw = args.text.slice(args.start, i + 1);\n try {\n return {\n complete: true,\n value: JSON.parse(raw),\n };\n } catch {\n return {\n complete: false,\n };\n }\n }\n }\n }\n\n return {\n complete: false,\n };\n};\n\nexport const extractCompletedFieldValue = (args: {\n text: string;\n path: string;\n}): { found: boolean; complete: boolean; value?: unknown } => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) {\n return {\n found: located.found,\n complete: false,\n };\n }\n\n const parsed = extractCompletedValueAt({\n text: args.text,\n start: located.start,\n });\n return parsed.complete\n ? {\n found: true,\n complete: true,\n value: parsed.value,\n }\n : {\n found: true,\n complete: false,\n };\n};\n\nexport const extractCompletedFieldValues = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; value: unknown }> => {\n const located = locateValueStarts(args);\n const values: Array<{ path: string; value: unknown }> = [];\n\n for (const match of located) {\n const parsed = extractCompletedValueAt({\n text: args.text,\n start: match.start,\n });\n if (!parsed.complete) continue;\n\n values.push({\n path: match.path,\n value: parsed.value,\n });\n }\n\n return values;\n};\n\nexport const extractCompletedArrayItems = (args: {\n text: string;\n path: string;\n}): unknown[] => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) return [];\n\n const arrayStart = skipWhitespace(args.text, located.start);\n if (args.text[arrayStart] !== \"[\") return [];\n const start = arrayStart + 1;\n\n const items: unknown[] = [];\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n let itemStart = -1;\n\n for (let i = start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n if (itemStart < 0) itemStart = i;\n continue;\n }\n\n if (itemStart < 0) {\n if (/\\s/.test(ch) || ch === \",\") continue;\n if (ch === \"]\") break;\n itemStart = i;\n if (ch === \"{\" || ch === \"[\") {\n nesting = 1;\n } else {\n nesting = 0;\n }\n continue;\n }\n\n if (ch === \"{\" || ch === \"[\") {\n nesting += 1;\n continue;\n }\n\n if (ch === \"}\" || ch === \"]\") {\n if (nesting > 0) {\n nesting -= 1;\n continue;\n }\n }\n\n if (nesting === 0 && (ch === \",\" || ch === \"]\")) {\n const raw = args.text.slice(itemStart, i).trim();\n if (raw) {\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n itemStart = -1;\n if (ch === \"]\") break;\n }\n }\n\n return items;\n};\n\nexport const extractCompletedArrayItemGroups = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; items: unknown[] }> => {\n return locateValueStarts(args).flatMap((match) => {\n const items = extractCompletedArrayItems({\n text: args.text,\n path: match.path,\n });\n return items.length > 0\n ? [\n {\n path: match.path,\n items,\n },\n ]\n : [];\n });\n};\n\nexport const extractStreamingStringValue = (args: {\n text: string;\n path: string;\n}): { found: boolean; complete: boolean; value: string } => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) {\n return {\n found: located.found,\n complete: false,\n value: \"\",\n };\n }\n\n const stringStart = skipWhitespace(args.text, located.start);\n if (args.text[stringStart] !== '\"') {\n return {\n found: true,\n complete: false,\n value: \"\",\n };\n }\n\n let value = \"\";\n\n for (let i = stringStart + 1; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (ch === '\"') {\n return {\n found: true,\n complete: true,\n value,\n };\n }\n\n if (ch !== \"\\\\\") {\n value += ch;\n continue;\n }\n\n const next = args.text[i + 1];\n if (!next) {\n return {\n found: true,\n complete: false,\n value,\n };\n }\n\n if (\n next === '\"' ||\n next === \"\\\\\" ||\n next === \"/\" ||\n next === \"b\" ||\n next === \"f\" ||\n next === \"n\" ||\n next === \"r\" ||\n next === \"t\"\n ) {\n value +=\n next === \"b\"\n ? \"\\b\"\n : next === \"f\"\n ? \"\\f\"\n : next === \"n\"\n ? \"\\n\"\n : next === \"r\"\n ? \"\\r\"\n : next === \"t\"\n ? \"\\t\"\n : next;\n i += 1;\n continue;\n }\n\n if (next === \"u\") {\n const hex = args.text.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n return {\n found: true,\n complete: false,\n value,\n };\n }\n value += String.fromCharCode(Number.parseInt(hex, 16));\n i += 5;\n continue;\n }\n\n return {\n found: true,\n complete: false,\n value,\n };\n }\n\n return {\n found: true,\n complete: false,\n value,\n };\n};\n\nexport const extractStreamingStringValues = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; complete: boolean; value: string }> => {\n return locateValueStarts(args).flatMap((match) => {\n const current = extractStreamingStringValue({\n text: args.text,\n path: match.path,\n });\n return current.found\n ? [\n {\n path: match.path,\n complete: current.complete,\n value: current.value,\n },\n ]\n : [];\n });\n};\n","import { emitStructuredData } from \"../structured\";\nimport type { UseReasonStructuredConfig } from \"../types\";\nimport {\n extractCompletedArrayItemGroups,\n extractCompletedFieldValues,\n extractStreamingStringValues,\n resolveAppendFieldPaths,\n resolveSetFieldPaths,\n resolveTextDeltaFieldPaths,\n} from \"./structured-stream\";\n\nexport function createStructuredOutputStreamer(\n args: { structured?: UseReasonStructuredConfig | undefined },\n id: string | undefined,\n opId: string,\n) {\n let firstText = \"\";\n const setFieldPaths = resolveSetFieldPaths(args.structured);\n const appendFieldPaths = resolveAppendFieldPaths(args.structured);\n const textDeltaFieldPaths = resolveTextDeltaFieldPaths(args.structured);\n const emittedSetValues = new Map<string, string>();\n const emittedAppendCounts = new Map<string, number>();\n const emittedTextValues = new Map<string, string>();\n return (delta: string) => {\n firstText += delta;\n\n for (const fieldPath of setFieldPaths) {\n const values = extractCompletedFieldValues({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, value } of values) {\n const nextSerialized = JSON.stringify(value);\n if (emittedSetValues.get(path) === nextSerialized) continue;\n\n emittedSetValues.set(path, nextSerialized);\n emitStructuredData({\n kind: \"set\",\n path,\n value,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n\n for (const fieldPath of appendFieldPaths) {\n const groups = extractCompletedArrayItemGroups({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, items } of groups) {\n const emittedAppendCount = emittedAppendCounts.get(path) ?? 0;\n if (items.length <= emittedAppendCount) continue;\n\n const nextItems = items.slice(emittedAppendCount);\n emittedAppendCounts.set(path, items.length);\n emitStructuredData({\n kind: \"append\",\n path,\n items: nextItems,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n\n for (const fieldPath of textDeltaFieldPaths) {\n const values = extractStreamingStringValues({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, value } of values) {\n const emittedTextValue = emittedTextValues.get(path) ?? \"\";\n if (\n value.length <= emittedTextValue.length ||\n !value.startsWith(emittedTextValue)\n ) {\n continue;\n }\n\n const nextDelta = value.slice(emittedTextValue.length);\n emittedTextValues.set(path, value);\n if (nextDelta.length === 0) continue;\n\n emitStructuredData({\n kind: \"text-delta\",\n path,\n delta: nextDelta,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n };\n}\n","import type { InterruptInput } from \"@kortyx/core\";\nimport type { KortyxFinishReason } from \"@kortyx/providers\";\nimport type { SchemaLike } from \"../types\";\nimport { parseWithSchema } from \"../validation\";\n\nconst tryJsonParse = (\n value: string,\n):\n | { ok: true; value: unknown; error?: never }\n | { ok: false; error: string } => {\n try {\n return { ok: true, value: JSON.parse(value) };\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n};\n\nconst extractJsonCodeBlock = (value: string): string | null => {\n const match = value.match(/```(?:json)?\\s*([\\s\\S]*?)```/i);\n if (!match || typeof match[1] !== \"string\") return null;\n const inner = match[1].trim();\n return inner.length > 0 ? inner : null;\n};\n\nconst tryStringify = (value: unknown): string => {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nexport const resolveOutputCandidate = (text: string): unknown => {\n const trimmed = text.trim();\n if (!trimmed) return text;\n\n const direct = tryJsonParse(trimmed);\n if (direct.ok) return direct.value;\n\n const block = extractJsonCodeBlock(trimmed);\n if (block) {\n const parsedBlock = tryJsonParse(block);\n if (parsedBlock.ok) return parsedBlock.value;\n }\n\n return text;\n};\n\nconst looksLikeStructuredJsonAttempt = (value: string): boolean => {\n const trimmed = value.trim();\n if (!trimmed) return false;\n\n return (\n trimmed.startsWith(\"{\") ||\n trimmed.startsWith(\"[\") ||\n /^```(?:json)?/i.test(trimmed)\n );\n};\n\nconst isLikelyTruncatedStructuredOutput = (text: string): boolean => {\n const trimmed = text.trim();\n if (!looksLikeStructuredJsonAttempt(trimmed)) return false;\n\n const direct = tryJsonParse(trimmed);\n if (!direct.ok && direct.error) return true;\n\n const block = extractJsonCodeBlock(trimmed);\n if (!block) return false;\n\n const parsedBlock = tryJsonParse(block);\n return !parsedBlock.ok && Boolean(parsedBlock.error);\n};\n\nconst createTruncatedStructuredOutputError = (label: string): Error =>\n new Error(\n `${label} was truncated before producing valid structured output. The model stopped due to output length. Increase maxOutputTokens or simplify the requested output.`,\n );\n\nconst createInvalidStructuredOutputError = (label: string): Error =>\n new Error(\n `${label} did not produce valid structured output. The model returned text instead of the expected JSON payload. This often happens when output is truncated or the provider does not follow JSON mode. Increase maxOutputTokens or simplify the requested output.`,\n );\n\nexport const parseReasonOutputWithSchema = <TOutput>(args: {\n text: string;\n schema: SchemaLike<TOutput>;\n finishReason?: KortyxFinishReason;\n label: string;\n}): TOutput => {\n const candidate = resolveOutputCandidate(args.text);\n\n try {\n return parseWithSchema(args.schema, candidate, args.label);\n } catch (error) {\n if (\n args.finishReason?.unified === \"length\" ||\n isLikelyTruncatedStructuredOutput(args.text)\n ) {\n throw createTruncatedStructuredOutputError(args.label);\n }\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\n throw createInvalidStructuredOutputError(args.label);\n }\n throw error;\n }\n};\n\nexport const parseInterruptFirstPassResult = <\n TRequest extends InterruptInput = InterruptInput,\n TOutput = unknown,\n>(args: {\n text: string;\n requestSchema: SchemaLike<TRequest>;\n outputSchema?: SchemaLike<TOutput>;\n finishReason?: KortyxFinishReason;\n mode?: \"required\" | \"optional\" | undefined;\n}):\n | {\n draftText: string;\n interruptRequired: boolean;\n request: TRequest;\n output?: TOutput;\n }\n | {\n draftText: string;\n interruptRequired: false;\n request?: undefined;\n output?: TOutput;\n } => {\n const candidate = resolveOutputCandidate(args.text);\n if (!isRecord(candidate)) {\n if (\n args.finishReason?.unified === \"length\" ||\n isLikelyTruncatedStructuredOutput(args.text)\n ) {\n throw createTruncatedStructuredOutputError(\"useReason output\");\n }\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\n throw createInvalidStructuredOutputError(\"useReason output\");\n }\n throw new Error(\n \"useReason first pass with interrupt must return a JSON object.\",\n );\n }\n\n const mode = args.mode ?? \"required\";\n let interruptRequired = true;\n if (mode === \"optional\") {\n if (\n candidate.decision !== \"continue\" &&\n candidate.decision !== \"interrupt\"\n ) {\n throw new Error(\n 'useReason optional interrupt first pass must include decision \"continue\" or \"interrupt\".',\n );\n }\n interruptRequired = candidate.decision === \"interrupt\";\n\n if (!interruptRequired) {\n const hasUnexpectedRequest = [\n candidate.interruptRequest,\n candidate.request,\n candidate.interrupt,\n ].some((value) => value !== null && value !== undefined);\n\n if (hasUnexpectedRequest) {\n throw new Error(\n 'useReason optional interrupt first pass with decision \"continue\" must not include an interrupt request.',\n );\n }\n }\n }\n\n let request: TRequest | undefined;\n if (interruptRequired) {\n const requestCandidates: unknown[] = [\n candidate.interruptRequest,\n candidate.request,\n candidate.interrupt,\n mode === \"required\" ? candidate : undefined,\n ];\n const requestPayload = requestCandidates.find(\n (value) => value !== null && value !== undefined,\n );\n\n request = parseWithSchema(\n args.requestSchema,\n requestPayload,\n \"useReason interrupt.request\",\n );\n }\n\n let output: TOutput | undefined;\n if (args.outputSchema) {\n const outputPayload = Object.hasOwn(candidate, \"output\")\n ? candidate.output\n : candidate;\n try {\n output = parseWithSchema(\n args.outputSchema,\n outputPayload,\n \"useReason output\",\n );\n } catch (error) {\n if (\n args.finishReason?.unified === \"length\" ||\n isLikelyTruncatedStructuredOutput(args.text)\n ) {\n throw createTruncatedStructuredOutputError(\"useReason output\");\n }\n if (\n typeof outputPayload === \"string\" &&\n outputPayload.trim().length > 0\n ) {\n throw createInvalidStructuredOutputError(\"useReason output\");\n }\n throw error;\n }\n }\n\n const explicitDraft =\n typeof candidate.draftText === \"string\" && candidate.draftText.length > 0\n ? candidate.draftText\n : typeof candidate.text === \"string\" && candidate.text.length > 0\n ? candidate.text\n : undefined;\n\n if (!args.outputSchema && !explicitDraft) {\n throw new Error(\n \"useReason first pass with interrupt requires `draftText` when outputSchema is not provided.\",\n );\n }\n\n const draftText =\n explicitDraft ??\n (output !== undefined ? tryStringify(output) : String(args.text ?? \"\"));\n\n if (!interruptRequired) {\n return {\n draftText,\n interruptRequired: false,\n ...(output !== undefined ? { output } : {}),\n };\n }\n\n return {\n draftText,\n interruptRequired: true,\n request: request as TRequest,\n ...(output !== undefined ? { output } : {}),\n };\n};\n","import type { InterruptInput } from \"@kortyx/core\";\nimport { toJSONSchema } from \"zod\";\nimport type { SchemaLike } from \"../types\";\n\nconst tryStringify = (value: unknown): string => {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nconst tryGetSchemaHint = (schema: unknown): string | undefined => {\n try {\n const hint = toJSONSchema(schema as never);\n return JSON.stringify(hint, null, 2);\n } catch {\n return undefined;\n }\n};\n\nconst withSchemaHint = (\n input: string,\n label: string,\n schema: unknown,\n): string => {\n const hint = tryGetSchemaHint(schema);\n if (!hint) return input;\n return `${input}\\n\\n${label}:\\n${hint}`;\n};\n\nexport const defaultInterruptFirstPassInput = (args: {\n input: string;\n requestSchema: SchemaLike<unknown>;\n outputSchema?: SchemaLike<unknown>;\n mode?: \"required\" | \"optional\" | undefined;\n}): string => {\n const mode = args.mode ?? \"required\";\n const base =\n mode === \"optional\"\n ? args.outputSchema\n ? [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: decision, output, interruptRequest, draftText.\",\n '- decision must be either \"continue\" or \"interrupt\".',\n '- Use decision \"continue\" when you can produce the final output without asking the user.',\n '- Use decision \"interrupt\" only when user input is needed before finalizing.',\n \"- output must match the expected output JSON schema.\",\n '- When decision is \"interrupt\", interruptRequest must match the expected interrupt request JSON schema and must be a non-null object.',\n '- When decision is \"continue\", interruptRequest must be null.',\n \"- draftText should be a concise plain-language summary of output.\",\n ].join(\"\\n\\n\")\n : [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: decision, draftText, interruptRequest.\",\n '- decision must be either \"continue\" or \"interrupt\".',\n '- Use decision \"continue\" when you can produce the final answer without asking the user.',\n '- Use decision \"interrupt\" only when user input is needed before finalizing.',\n \"- draftText should be the current answer text.\",\n '- When decision is \"interrupt\", interruptRequest must match the expected interrupt request JSON schema and must be a non-null object.',\n '- When decision is \"continue\", interruptRequest must be null.',\n ].join(\"\\n\\n\")\n : args.outputSchema\n ? [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: output, interruptRequest, draftText.\",\n \"- output must match the expected output JSON schema.\",\n \"- interruptRequest must match the expected interrupt request JSON schema.\",\n \"- interruptRequest must be a non-null object.\",\n \"- draftText should be a concise plain-language summary of output.\",\n \"- If uncertain, still return a valid interruptRequest with safe default options.\",\n ].join(\"\\n\\n\")\n : [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: draftText, interruptRequest.\",\n \"- draftText should be the current draft answer text.\",\n \"- interruptRequest must match the expected interrupt request JSON schema.\",\n \"- interruptRequest must be a non-null object.\",\n \"- If uncertain, still return a valid interruptRequest with safe default options.\",\n ].join(\"\\n\\n\");\n\n const withInterruptSchema = withSchemaHint(\n base,\n \"Expected interrupt request JSON schema (for `interruptRequest`)\",\n args.requestSchema,\n );\n\n if (!args.outputSchema) return withInterruptSchema;\n const withOutputSchema = withSchemaHint(\n withInterruptSchema,\n \"Expected output JSON schema (for `output`)\",\n args.outputSchema,\n );\n return [\n withOutputSchema,\n \"JSON template:\",\n mode === \"optional\"\n ? '{ \"decision\": \"continue\", \"output\": { ... }, \"interruptRequest\": null, \"draftText\": \"...\" }'\n : '{ \"output\": { ... }, \"interruptRequest\": { ... }, \"draftText\": \"...\" }',\n ].join(\"\\n\\n\");\n};\n\nexport const defaultContinuationInput = (args: {\n input: string;\n draftText: string;\n draftOutput?: unknown;\n request: InterruptInput;\n response: unknown;\n}): string =>\n [\n \"You are continuing a paused reasoning task after user input.\",\n \"Update the previous result using the user response and return the final answer only.\",\n \"If the previous output was JSON, return JSON in the same schema.\",\n \"\",\n `Original request:\\n${args.input}`,\n `Draft answer text:\\n${args.draftText}`,\n `Draft output object:\\n${tryStringify(args.draftOutput ?? args.draftText)}`,\n `Interrupt request shown to user:\\n${tryStringify(args.request)}`,\n `User response:\\n${tryStringify(args.response)}`,\n ].join(\"\\n\\n\");\n\nexport const withOutputGuardrails = (\n input: string,\n schema?: SchemaLike<unknown>,\n): string => {\n const base = [\n input,\n \"Output rules:\",\n \"- Return only JSON, no markdown fences.\",\n \"- Ensure the response conforms to the expected output schema.\",\n \"- Do not include explanatory text outside the JSON object.\",\n ].join(\"\\n\\n\");\n return withSchemaHint(base, \"Expected output JSON schema\", schema);\n};\n\nexport const withStructuredStreamHints = (\n input: string,\n args: {\n setFieldPaths?: string[];\n appendFieldPaths?: string[];\n textDeltaFieldPaths?: string[];\n },\n): string => {\n const rules: string[] = [];\n\n for (const path of args.setFieldPaths ?? []) {\n rules.push(\n `- For the field path pattern \\`${path}\\`, write one stable final value and do not rewrite it after it is complete.`,\n );\n }\n\n for (const path of args.appendFieldPaths ?? []) {\n rules.push(\n `- For the array field path pattern \\`${path}\\`, write items in final order and finish each item before starting the next.`,\n );\n rules.push(\n `- Once an item in \\`${path}\\` is complete, do not rewrite or reorder earlier items.`,\n );\n }\n\n for (const path of args.textDeltaFieldPaths ?? []) {\n rules.push(\n `- For the string field path pattern \\`${path}\\`, write the value progressively by appending text to the end.`,\n );\n rules.push(\n `- Do not rewrite or replace the earlier prefix of \\`${path}\\` once emitted.`,\n );\n }\n\n if (rules.length === 0) return input;\n\n return [\n input,\n \"Streaming rules:\",\n ...rules,\n \"- Keep the overall response as valid JSON.\",\n ].join(\"\\n\\n\");\n};\n","import type {\n KortyxFinishReason,\n KortyxProviderMetadata,\n KortyxUsage,\n KortyxWarning,\n} from \"@kortyx/providers\";\nimport { emitStructuredData, shouldEmitStructured } from \"../structured\";\nimport type { UseReasonArgs } from \"../types\";\n\nexport const mergeUsage = (\n left: KortyxUsage | undefined,\n right: KortyxUsage | undefined,\n): KortyxUsage | undefined => {\n if (!left) return right;\n if (!right) return left;\n\n const sum = (\n a: number | undefined,\n b: number | undefined,\n ): number | undefined =>\n a === undefined && b === undefined ? undefined : (a ?? 0) + (b ?? 0);\n\n const raw =\n left.raw || right.raw\n ? {\n ...(left.raw ?? {}),\n ...(right.raw ?? {}),\n }\n : undefined;\n const input = sum(left.input, right.input);\n const output = sum(left.output, right.output);\n const total = sum(left.total, right.total);\n const reasoning = sum(left.reasoning, right.reasoning);\n const cacheRead = sum(left.cacheRead, right.cacheRead);\n const cacheWrite = sum(left.cacheWrite, right.cacheWrite);\n const merged: KortyxUsage = {\n ...(right.outputIncludesReasoning !== undefined\n ? { outputIncludesReasoning: right.outputIncludesReasoning }\n : {}),\n ...(right.inputIncludesCacheWrite !== undefined\n ? { inputIncludesCacheWrite: right.inputIncludesCacheWrite }\n : {}),\n ...(right.inputIncludesCacheRead !== undefined\n ? { inputIncludesCacheRead: right.inputIncludesCacheRead }\n : {}),\n };\n\n if (input !== undefined) merged.input = input;\n if (output !== undefined) merged.output = output;\n if (total !== undefined) merged.total = total;\n if (reasoning !== undefined) merged.reasoning = reasoning;\n if (cacheRead !== undefined) merged.cacheRead = cacheRead;\n if (cacheWrite !== undefined) merged.cacheWrite = cacheWrite;\n if (raw) merged.raw = raw;\n\n return merged;\n};\n\nexport const mergeWarnings = (\n left: KortyxWarning[] | undefined,\n right: KortyxWarning[] | undefined,\n): KortyxWarning[] | undefined => {\n if (!left?.length) return right;\n if (!right?.length) return left;\n\n const seen = new Set<string>();\n const merged: KortyxWarning[] = [];\n for (const warning of [...left, ...right]) {\n const key = JSON.stringify(warning);\n if (seen.has(key)) continue;\n seen.add(key);\n merged.push(warning);\n }\n return merged;\n};\n\nexport const mergeProviderMetadata = (\n left: KortyxProviderMetadata | undefined,\n right: KortyxProviderMetadata | undefined,\n): KortyxProviderMetadata | undefined => {\n if (!left) return right;\n if (!right) return left;\n return {\n ...left,\n ...right,\n };\n};\n\nexport const emitReasonStructuredOutput = <TOutput>(args: {\n id?: string;\n opId: string;\n output: TOutput;\n structured: UseReasonArgs<TOutput>[\"structured\"];\n emit: boolean;\n}): void => {\n if (!args.emit || !shouldEmitStructured(args.structured)) return;\n\n emitStructuredData<TOutput>({\n dataType: args.structured?.dataType ?? \"reason-output\",\n data: args.output,\n kind: \"final\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(args.id ? { id: args.id } : {}),\n streamId: args.opId,\n });\n};\n\nexport type ReasonResultAggregation = {\n usage?: KortyxUsage | undefined;\n finishReason?: KortyxFinishReason | undefined;\n providerMetadata?: KortyxProviderMetadata | undefined;\n warnings?: KortyxWarning[] | undefined;\n};\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport {\n combineAbortSignals,\n isExecutionCancelled,\n isExecutionLimitReached,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport type {\n KortyxExecutableTool,\n KortyxFinishReason,\n KortyxPromptMessage,\n KortyxProviderMetadata,\n KortyxToolCall,\n KortyxToolDefinition,\n KortyxToolResult,\n KortyxUsage,\n KortyxWarning,\n} from \"@kortyx/providers\";\nimport { accumulateTokenUsage, getHookContext } from \"../context\";\nimport { awaitInterruptInternal } from \"../interrupt\";\nimport {\n type RunReasonEngineResult,\n resolveProviderOptions,\n} from \"../reason-engine\";\nimport { shouldStreamStructured } from \"../structured\";\nimport type { ReasonTraceSpan } from \"../tracing\";\nimport type { UseReasonArgs, UseReasonResult, UseReasonStep } from \"../types\";\nimport { reasonEngine } from \"./engine\";\nimport { createStructuredOutputStreamer } from \"./output-stream\";\nimport { parseReasonOutputWithSchema } from \"./parsing\";\nimport { withOutputGuardrails } from \"./prompting\";\nimport {\n emitReasonStructuredOutput,\n mergeProviderMetadata,\n mergeUsage,\n mergeWarnings,\n} from \"./result\";\n\nconst toErrorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst toToolDefinitions = (\n tools: KortyxExecutableTool[],\n): KortyxToolDefinition[] =>\n tools.map((tool) => ({\n name: tool.name,\n ...(tool.title ? { title: tool.title } : {}),\n ...(tool.description ? { description: tool.description } : {}),\n inputSchema: tool.inputSchema,\n ...(tool.outputSchema !== undefined\n ? { outputSchema: tool.outputSchema }\n : {}),\n ...(tool.annotations !== undefined\n ? { annotations: tool.annotations }\n : {}),\n ...(tool.metadata !== undefined ? { metadata: tool.metadata } : {}),\n }));\n\nconst resolveToolExecutionBoolean = (\n value: boolean | Record<string, boolean> | undefined,\n toolName: string,\n fallback: boolean,\n): boolean => {\n if (typeof value === \"boolean\") return value;\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value[toolName] ?? fallback;\n }\n return fallback;\n};\n\nconst normalizeToolResult = (\n toolCall: KortyxToolCall,\n value: KortyxToolResult | unknown,\n): KortyxToolResult => {\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n \"toolCallId\" in value &&\n \"name\" in value &&\n \"content\" in value\n ) {\n return value as KortyxToolResult;\n }\n\n let content: string;\n try {\n content = typeof value === \"string\" ? value : JSON.stringify(value);\n } catch {\n content = String(value);\n }\n\n return {\n toolCallId: toolCall.id,\n name: toolCall.name,\n content,\n ...(value !== undefined &&\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ? { structuredContent: value }\n : {}),\n };\n};\n\nconst closeOwnedTools = async (\n tools: KortyxExecutableTool[],\n): Promise<void> => {\n const closeFns = new Set<NonNullable<KortyxExecutableTool[\"close\"]>>();\n for (const tool of tools) {\n if (tool.closeAfterUse === false || !tool.close) continue;\n closeFns.add(tool.close);\n }\n\n await Promise.all(\n [...closeFns].map(async (close) => {\n await close();\n }),\n );\n};\n\nconst createInitialMessages = (args: {\n system?: string | undefined;\n input: string;\n}): KortyxPromptMessage[] => [\n ...(typeof args.system === \"string\" && args.system.length > 0\n ? [{ role: \"system\" as const, content: args.system }]\n : []),\n { role: \"user\" as const, content: String(args.input ?? \"\") },\n];\n\nexport const runReasonToolLoop = async <\n TOutput,\n TRequest extends InterruptInput,\n TResponse = InterruptResult,\n>(args: {\n useReasonArgs: UseReasonArgs<TOutput, TRequest, TResponse>;\n id?: string | undefined;\n opId: string;\n traceSpan?: ReasonTraceSpan | undefined;\n checkpointKey: string;\n initialWarnings?: KortyxWarning[] | undefined;\n allowValidatedToolOutput?: boolean;\n}): Promise<UseReasonResult<TOutput, TResponse>> => {\n const { useReasonArgs, id, traceSpan, checkpointKey } = args;\n const ctx = getHookContext();\n const abortSignal = combineAbortSignals(\n ctx.node.abortSignal,\n useReasonArgs.abortSignal,\n useReasonArgs.model.options?.abortSignal,\n );\n const saved = ctx.currentNodeState.byKey[checkpointKey] as\n | ToolLoopCheckpoint\n | undefined;\n const checkpoint = saved?.status === \"tool_loop\" ? saved : undefined;\n const opId = checkpoint?.opId ?? args.opId;\n const tools = useReasonArgs.tools ?? [];\n const toolByName = new Map<string, KortyxExecutableTool>();\n let validationCompleted = false;\n let separateOutput = false;\n\n try {\n for (const tool of tools) {\n if (toolByName.has(tool.name)) {\n throw new Error(\n `useReason received duplicate tool name \"${tool.name}\".`,\n );\n }\n toolByName.set(tool.name, tool);\n }\n\n if (useReasonArgs.interrupt) {\n throw new Error(\n \"useReason tools cannot be combined with useReason interrupt mode yet. Use toolExecution.approval for tool approval.\",\n );\n }\n\n separateOutput = Boolean(\n useReasonArgs.model.provider.getModel(useReasonArgs.model.modelId, {\n ...useReasonArgs.model.options,\n ...(useReasonArgs.reasoning !== undefined\n ? { reasoning: useReasonArgs.reasoning }\n : {}),\n ...(useReasonArgs.responseFormat\n ? { responseFormat: useReasonArgs.responseFormat }\n : {}),\n providerOptions:\n resolveProviderOptions(\n useReasonArgs.model.options?.providerOptions,\n useReasonArgs.providerOptions,\n ) ?? {},\n }).requiresSeparateStructuredOutput,\n );\n validationCompleted = true;\n } finally {\n if (!validationCompleted) {\n await closeOwnedTools(tools);\n }\n }\n\n const toolDefinitions = toToolDefinitions(tools);\n let finalizing = checkpoint?.finalizing ?? false;\n let completed = false;\n const maxSteps = Math.max(1, useReasonArgs.toolExecution?.maxSteps ?? 3);\n const messages =\n checkpoint?.messages ??\n createInitialMessages({\n system: useReasonArgs.system,\n input: useReasonArgs.outputSchema\n ? withOutputGuardrails(useReasonArgs.input, useReasonArgs.outputSchema)\n : useReasonArgs.input,\n });\n const steps: UseReasonStep[] = checkpoint?.steps ?? [];\n const allToolCalls: KortyxToolCall[] = steps.flatMap(\n (step) => step.toolCalls,\n );\n const allToolResults: KortyxToolResult[] = steps.flatMap(\n (step) => step.toolResults,\n );\n let finalText = \"\";\n let finalRaw: unknown;\n let finalOutput: TOutput | undefined;\n let aggregatedUsage = steps.reduce<KortyxUsage | undefined>(\n (usage, step) => mergeUsage(usage, step.usage),\n undefined,\n );\n let finalFinishReason: KortyxFinishReason | undefined;\n let aggregatedProviderMetadata: KortyxProviderMetadata | undefined;\n let aggregatedWarnings = steps.reduce<KortyxWarning[] | undefined>(\n (warnings, step) => mergeWarnings(warnings, step.warnings),\n args.initialWarnings,\n );\n let pending = checkpoint?.pending;\n const approvedCalls = checkpoint?.approvedCalls ?? [];\n const save = () => {\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"tool_loop\",\n opId,\n messages,\n steps,\n approvedCalls,\n finalizing,\n ...(pending ? { pending } : {}),\n } satisfies ToolLoopCheckpoint;\n ctx.stateDirty = true;\n };\n\n const emitToolEvent = (\n event: string,\n payload: Record<string, unknown>,\n ): void => {\n ctx.node.emit(event, {\n ...payload,\n node: ctx.node.graph.node,\n ...(id ? { id } : {}),\n opId,\n });\n };\n\n try {\n for (\n let stepIndex = pending ? steps.length - 1 : steps.length;\n stepIndex < maxSteps;\n stepIndex += 1\n ) {\n throwIfExecutionAborted(abortSignal);\n traceSpan?.addEvent?.(\"useReason.tool-step.start\", {\n stepIndex,\n toolCount: toolDefinitions.length,\n });\n\n const reused = Boolean(pending);\n const stream =\n useReasonArgs.stream ?? useReasonArgs.model.options?.streaming ?? true;\n const emit = useReasonArgs.emit ?? true;\n let textStarted = false;\n const structuredChunk =\n useReasonArgs.outputSchema &&\n (!separateOutput || finalizing) &&\n stream &&\n emit &&\n shouldStreamStructured(useReasonArgs.structured)\n ? createStructuredOutputStreamer(useReasonArgs, id, opId)\n : undefined;\n const step =\n pending ??\n (await reasonEngine(\n {\n ...useReasonArgs,\n tools: finalizing ? [] : toolDefinitions,\n ...(separateOutput && !finalizing\n ? { responseFormat: { type: \"text\" as const } }\n : {}),\n messages,\n emit: false,\n stream,\n onTextChunk: (delta) => {\n if (structuredChunk) structuredChunk(delta);\n if (!emit || useReasonArgs.outputSchema || !delta) return;\n if (!textStarted) {\n emitToolEvent(\"text-start\", {});\n textStarted = true;\n }\n emitToolEvent(\"text-delta\", { delta });\n },\n },\n { ...(id ? { id } : {}), opId },\n ));\n\n if (textStarted) emitToolEvent(\"text-end\", {});\n finalText = step.text;\n finalRaw = step.raw;\n if (!reused) {\n aggregatedUsage = mergeUsage(aggregatedUsage, step.usage);\n accumulateTokenUsage(step.usage);\n }\n finalFinishReason = step.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n step.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, step.warnings);\n\n const toolCalls = step.toolCalls ?? [];\n const toolResults: KortyxToolResult[] = reused\n ? (steps[stepIndex]?.toolResults ?? [])\n : [];\n if (!reused)\n steps.push({\n stepIndex,\n text: step.text,\n toolCalls,\n toolResults,\n ...(step.usage ? { usage: step.usage } : {}),\n ...(step.finishReason ? { finishReason: step.finishReason } : {}),\n ...(step.providerMetadata\n ? { providerMetadata: step.providerMetadata }\n : {}),\n ...(step.warnings ? { warnings: step.warnings } : {}),\n });\n\n if (toolCalls.length === 0) {\n if (separateOutput && !finalizing) {\n if (args.allowValidatedToolOutput && useReasonArgs.outputSchema) {\n try {\n finalOutput = parseReasonOutputWithSchema({\n text: step.text,\n schema: useReasonArgs.outputSchema,\n ...(step.finishReason\n ? { finishReason: step.finishReason }\n : {}),\n label: \"useReason output\",\n });\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, [\n {\n type: \"compatibility\",\n feature: \"responseFormat\",\n details:\n \"Reused locally validated tool-phase output without an extra native-schema request. Set responseFormat.schema explicitly to require provider schema enforcement.\",\n },\n ]);\n completed = true;\n break;\n } catch {\n // A schema-only pass can repair a nonconforming draft, within the existing limits.\n }\n }\n messages.push({\n role: \"assistant\",\n content: step.text,\n ...(step.continuation ? { continuation: step.continuation } : {}),\n });\n messages.push({\n role: \"user\",\n content:\n \"Return the final answer using the requested output schema and the tool results above.\",\n });\n finalizing = true;\n pending = undefined;\n save();\n continue;\n }\n completed = true;\n break;\n }\n if (finalizing)\n throw new Error(\n \"Provider requested a tool during schema-only finalization.\",\n );\n\n if (!reused) {\n allToolCalls.push(...toolCalls);\n messages.push({\n role: \"assistant\",\n content: step.text,\n toolCalls,\n ...(step.continuation ? { continuation: step.continuation } : {}),\n });\n }\n pending = step;\n save();\n\n for (const toolCall of toolCalls) {\n if (toolResults.some((result) => result.toolCallId === toolCall.id))\n continue;\n throwIfExecutionAborted(abortSignal);\n const tool = toolByName.get(toolCall.name);\n if (!tool) {\n throw new Error(\n `Model requested unknown tool \"${toolCall.name}\" from useReason.`,\n );\n }\n\n const shouldEmitTool = resolveToolExecutionBoolean(\n useReasonArgs.toolExecution?.emit,\n tool.name,\n false,\n );\n const shouldApproveTool = resolveToolExecutionBoolean(\n useReasonArgs.toolExecution?.approval,\n tool.name,\n false,\n );\n\n traceSpan?.addEvent?.(\"useReason.tool-call.start\", {\n stepIndex,\n tool: tool.name,\n toolCallId: toolCall.id,\n });\n\n if (shouldEmitTool) {\n emitToolEvent(\"tool-call-start\", {\n tool: tool.name,\n toolCallId: toolCall.id,\n input: toolCall.input,\n });\n }\n\n if (shouldApproveTool && !approvedCalls.includes(toolCall.id)) {\n const approval = await awaitInterruptInternal({\n id: `tool:${toolCall.id}`,\n request: {\n kind: \"choice\",\n question: `Approve ${tool.name}?`,\n options: [\n { id: \"approve\", label: \"Approve\" },\n { id: \"deny\", label: \"Deny\" },\n ],\n meta: {\n tool: tool.name,\n toolCallId: toolCall.id,\n input: toolCall.input,\n },\n },\n });\n\n const approved = Array.isArray(approval)\n ? approval.includes(\"approve\")\n : approval === \"approve\";\n\n if (!approved) {\n const denied = {\n toolCallId: toolCall.id,\n name: tool.name,\n content: \"Tool call denied by user.\",\n isError: true,\n } satisfies KortyxToolResult;\n toolResults.push(denied);\n allToolResults.push(denied);\n if (shouldEmitTool) {\n emitToolEvent(\"tool-call-result\", {\n tool: tool.name,\n toolCallId: toolCall.id,\n content: denied.content,\n isError: true,\n });\n }\n messages.push({\n role: \"tool\",\n content: denied.content,\n toolCallId: denied.toolCallId,\n name: denied.name,\n isError: true,\n });\n save();\n continue;\n }\n approvedCalls.push(toolCall.id);\n save();\n }\n\n try {\n throwIfExecutionAborted(abortSignal);\n ctx.node.consumeExecution?.(\"maxToolCalls\");\n const rawResult = await tool.execute(toolCall.input, {\n toolCallId: toolCall.id,\n ...(abortSignal ? { abortSignal } : {}),\n });\n throwIfExecutionAborted(abortSignal);\n const result = normalizeToolResult(toolCall, rawResult);\n toolResults.push(result);\n allToolResults.push(result);\n if (shouldEmitTool) {\n emitToolEvent(\"tool-call-result\", {\n tool: result.name,\n toolCallId: result.toolCallId,\n content: result.content,\n ...(result.structuredContent !== undefined\n ? { structuredContent: result.structuredContent }\n : {}),\n ...(result.isError !== undefined\n ? { isError: result.isError }\n : {}),\n });\n }\n traceSpan?.addEvent?.(\"useReason.tool-call.complete\", {\n stepIndex,\n tool: result.name,\n toolCallId: result.toolCallId,\n isError: Boolean(result.isError),\n });\n } catch (error) {\n throwIfExecutionAborted(abortSignal);\n if (isExecutionLimitReached(error) || isExecutionCancelled(error))\n throw error;\n const result = {\n toolCallId: toolCall.id,\n name: tool.name,\n content: toErrorMessage(error),\n isError: true,\n } satisfies KortyxToolResult;\n toolResults.push(result);\n allToolResults.push(result);\n if (shouldEmitTool) {\n emitToolEvent(\"tool-call-error\", {\n tool: tool.name,\n toolCallId: toolCall.id,\n message: result.content,\n });\n }\n traceSpan?.addEvent?.(\"useReason.tool-call.error\", {\n stepIndex,\n tool: tool.name,\n toolCallId: toolCall.id,\n message: result.content,\n });\n }\n const completed = toolResults.at(-1);\n if (completed)\n messages.push({\n role: \"tool\",\n content: completed.content,\n toolCallId: completed.toolCallId,\n name: completed.name,\n ...(completed.isError !== undefined\n ? { isError: completed.isError }\n : {}),\n });\n save();\n }\n\n pending = undefined;\n save();\n }\n\n if (!completed) {\n throw new Error(\n `useReason tool loop reached maxSteps (${maxSteps}) before producing a final response.`,\n );\n }\n\n if (useReasonArgs.outputSchema && finalOutput === undefined) {\n finalOutput = parseReasonOutputWithSchema({\n text: finalText,\n schema: useReasonArgs.outputSchema,\n ...(finalFinishReason ? { finishReason: finalFinishReason } : {}),\n label: \"useReason output\",\n });\n }\n\n if (finalOutput !== undefined) {\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: finalOutput,\n structured: useReasonArgs.structured,\n emit: useReasonArgs.emit ?? true,\n });\n }\n\n const result = {\n ...(id ? { id } : {}),\n opId,\n text: finalText,\n ...(finalRaw !== undefined ? { raw: finalRaw } : {}),\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n ...(finalOutput !== undefined ? { output: finalOutput } : {}),\n toolCalls: allToolCalls,\n toolResults: allToolResults,\n steps,\n } satisfies UseReasonResult<TOutput, TResponse>;\n\n traceSpan?.end?.({\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n attributes: {\n textLength: finalText.length,\n toolCallCount: allToolCalls.length,\n toolResultCount: allToolResults.length,\n toolStepCount: steps.length,\n },\n telemetry: {\n ...(useReasonArgs.telemetry ?? {}),\n output: useReasonArgs.telemetry?.output ?? finalOutput ?? finalText,\n },\n });\n\n ctx.currentNodeState.byKey[checkpointKey] = { status: \"completed\", result };\n ctx.stateDirty = true;\n return result;\n } catch (error) {\n traceSpan?.fail?.(error, {\n attributes: {\n toolStepCount: steps.length,\n toolCallCount: allToolCalls.length,\n },\n });\n throw error;\n } finally {\n await closeOwnedTools(tools);\n }\n};\n\ninterface ToolLoopCheckpoint {\n status: \"tool_loop\";\n opId: string;\n messages: KortyxPromptMessage[];\n steps: UseReasonStep[];\n pending?: RunReasonEngineResult;\n approvedCalls: string[];\n finalizing?: boolean;\n}\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { getHookContext } from \"./context\";\nimport { awaitInterruptInternal } from \"./interrupt\";\nimport { useReason as useReasonInternal } from \"./reason/use-reason\";\nimport { emitStructuredData } from \"./structured\";\nimport type {\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonResult,\n UseStructuredDataArgs,\n} from \"./types\";\n\nexport type {\n SchemaLike,\n StructuredDataKind,\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonInterruptConfig,\n UseReasonResult,\n UseReasonStep,\n UseReasonStructuredConfig,\n UseReasonToolExecution,\n UseStructuredDataAppendArgs,\n UseStructuredDataArgs,\n UseStructuredDataFinalArgs,\n UseStructuredDataSetArgs,\n UseStructuredDataTextDeltaArgs,\n} from \"./types\";\n\ntype StateSetter<T> = (next: T | ((prev: T) => T)) => void;\n\nexport function useStructuredData<TData = unknown>(\n args: UseStructuredDataArgs<TData>,\n): void {\n emitStructuredData(args);\n}\n\nexport function useReason<\n TOutput = unknown,\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): Promise<UseReasonResult<TOutput, TResponse>> {\n return useReasonInternal(args);\n}\n\nexport function useInterrupt<\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(args: UseInterruptArgs<TRequest, TResponse>): Promise<TResponse> {\n return awaitInterruptInternal(args);\n}\n\n/** Live execution signal for cooperative I/O. Never store it in workflow state. */\nexport function useAbortSignal(): AbortSignal | undefined {\n return getHookContext().node.abortSignal;\n}\n\nexport function useRuntimeContext<\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(): TContext {\n const ctx = getHookContext();\n const config = ctx.state.config;\n const context =\n config && typeof config === \"object\" && \"context\" in config\n ? (config as { context?: unknown }).context\n : undefined;\n\n return context && typeof context === \"object\" && !Array.isArray(context)\n ? (context as TContext)\n : ({} as TContext);\n}\n\nexport function useNodeState<T>(initialValue: T): [T, StateSetter<T>] {\n const ctx = getHookContext();\n const nodeState = ctx.currentNodeState;\n\n const index = ctx.nodeStateIndex++;\n if (index >= nodeState.byIndex.length) {\n nodeState.byIndex[index] = initialValue as T;\n ctx.stateDirty = true;\n }\n\n const getValue = () => nodeState.byIndex[index] as T;\n const setValue: StateSetter<T> = (next) => {\n const prev = getValue();\n const resolved =\n typeof next === \"function\" ? (next as (p: T) => T)(prev) : next;\n nodeState.byIndex[index] = resolved;\n ctx.stateDirty = true;\n };\n\n return [getValue(), setValue];\n}\n\nexport function useWorkflowState<T>(\n key: string,\n ...rest: [] | [T]\n): [T, StateSetter<T>] {\n const ctx = getHookContext();\n const workflowState = ctx.workflowState;\n const hasInitial = rest.length > 0;\n const initialValue = rest[0];\n\n if (!Object.hasOwn(workflowState, key) && hasInitial) {\n workflowState[key] = initialValue as T;\n ctx.stateDirty = true;\n }\n\n const getValue = () => workflowState[key] as T;\n const setValue: StateSetter<T> = (next) => {\n const prev = getValue();\n const resolved =\n typeof next === \"function\" ? (next as (p: T) => T)(prev) : next;\n workflowState[key] = resolved;\n ctx.stateDirty = true;\n };\n\n return [getValue(), setValue];\n}\n","import {\n isExecutionCancelled,\n isExecutionLimitReached,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport { getHookContext } from \"./context\";\nimport { awaitInterruptInternal } from \"./interrupt\";\nimport type { CallRecord } from \"./workflow\";\n\ntype ParallelRecord = {\n version: 1;\n calls: string[];\n interrupts: Array<{ callId: string; index: number }>;\n};\n\nexport type ParallelGroup = {\n key: string;\n record: ParallelRecord;\n restored: boolean;\n ready: Promise<void>;\n};\n\nexport type WorkflowTask = {\n id: string;\n group?: ParallelGroup;\n done: Promise<void>;\n finish: () => void;\n completed: boolean;\n};\n\n/** Internal control flow: the child snapshot is ready for its owning join. */\nexport class ParallelChildWaiting extends Error {}\n\n/** All siblings have settled; results retain the order passed to parallel(). */\nexport class ParallelError extends AggregateError {\n constructor(\n public readonly results: readonly PromiseSettledResult<unknown>[],\n ) {\n super(\n results.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n ),\n \"One or more parallel operations failed.\",\n );\n this.name = \"ParallelError\";\n }\n}\n\nexport function registerWorkflowTask(id: string): WorkflowTask {\n const ctx = getHookContext();\n if (ctx.workflowControlError) throw ctx.workflowControlError;\n if (ctx.workflowContextClosed)\n throw new Error(\"The workflow node activation has finished.\");\n const group = ctx.parallelGroup;\n if (group?.restored && !group.record.calls.includes(id)) {\n throw new Error(`Parallel call membership changed during replay: '${id}'.`);\n }\n let finish!: () => void;\n const task: WorkflowTask = {\n id,\n ...(group ? { group } : {}),\n completed: false,\n done: new Promise<void>((resolve) => {\n finish = resolve;\n }),\n finish: () => {\n task.completed = true;\n finish();\n },\n };\n ctx.workflowTasks.push(task);\n if (group && !group.record.calls.includes(id)) group.record.calls.push(id);\n return task;\n}\n\n/** Join concurrent child calls, preserving their snapshots before suspending. */\nexport function parallel<const T extends readonly unknown[]>(\n values: T,\n): Promise<{ -readonly [K in keyof T]: Awaited<T[K]> }> {\n // Observe inputs immediately, including when context/group validation rejects.\n const settled = Promise.allSettled(values);\n let ctx: ReturnType<typeof getHookContext>;\n try {\n ctx = getHookContext();\n } catch (error) {\n return Promise.reject(error);\n }\n const join = async () => {\n if (ctx.workflowControlError) throw ctx.workflowControlError;\n if (ctx.parallelGroup)\n throw new Error(\n \"Await each parallel group before starting another in the same node.\",\n );\n const key = `__parallel:${ctx.parallelIndex++}`;\n const saved = ctx.currentNodeState.byKey[key] as\n | ParallelRecord\n | null\n | undefined;\n const tasks = ctx.workflowTasks.filter(\n (task) => !task.completed && !task.group,\n );\n const ids = tasks.map((task) => task.id);\n if (\n saved &&\n (saved.version !== 1 || ids.some((id) => !saved.calls.includes(id)))\n ) {\n throw new Error(\"Parallel call membership changed during replay.\");\n }\n const group: ParallelGroup = {\n key,\n record: saved ?? { version: 1, calls: ids, interrupts: [] },\n restored: Boolean(saved),\n ready: Promise.resolve(),\n };\n ctx.currentNodeState.byKey[key] = group.record;\n ctx.stateDirty = true;\n ctx.parallelGroup = group;\n for (const task of tasks) task.group = group;\n const callRecord = (id: string) =>\n ctx.currentNodeState.byKey[`__useWorkflow:${id}`] as\n | CallRecord\n | undefined;\n const bridge = async (callId: string, index: number) => {\n const interruption = callRecord(callId)?.interrupts[index];\n if (!interruption)\n throw new Error(\n \"Parallel interrupt history does not match the saved child.\",\n );\n try {\n interruption.response = await awaitInterruptInternal({\n request: interruption.request,\n ...(interruption.request.meta\n ? { meta: interruption.request.meta }\n : {}),\n });\n } catch (error) {\n ctx.workflowControlError = error;\n throw error;\n }\n };\n group.ready = (async () => {\n // One deterministic parent interrupt journal, independent of child finish order.\n for (const entry of group.record.interrupts)\n await bridge(entry.callId, entry.index);\n })();\n try {\n // Even a replay suspension must settle every already-created child promise.\n const [ready, outcomes] = await Promise.all([\n Promise.allSettled([group.ready]),\n settled,\n ]);\n // Also own calls made by asynchronous custom-hook wrappers in this group.\n let drained = -1;\n while (drained !== ctx.workflowTasks.length) {\n drained = ctx.workflowTasks.length;\n await Promise.all(\n ctx.workflowTasks\n .filter((task) => task.group === group)\n .map((task) => task.done),\n );\n }\n if (ready[0]?.status === \"rejected\") throw ready[0].reason;\n throwIfExecutionAborted(ctx.node.abortSignal);\n if (ctx.workflowControlError) throw ctx.workflowControlError;\n const rejected = outcomes.filter(\n (outcome) => outcome.status === \"rejected\",\n );\n const control = rejected.find(\n (outcome) =>\n isExecutionCancelled(outcome.reason) ||\n isExecutionLimitReached(outcome.reason),\n );\n if (control) {\n ctx.workflowControlError = control.reason;\n throw control.reason;\n }\n const actual = ctx.workflowTasks\n .filter((task) => task.group === group)\n .map((task) => task.id);\n if (\n group.record.calls.length !== actual.length ||\n group.record.calls.some((id) => !actual.includes(id))\n ) {\n throw new Error(\"Parallel call membership changed during replay.\");\n }\n for (const callId of group.record.calls) {\n const record = callRecord(callId);\n if (record?.status !== \"interrupted\") continue;\n const index = record.interrupts.length - 1;\n if (record.interrupts[index]?.response !== undefined) continue;\n group.record.interrupts.push({ callId, index });\n await bridge(callId, index);\n // An unseen interrupt suspends; it must not become a partial result.\n throw new Error(\n \"Parallel interrupt unexpectedly resumed without replay.\",\n );\n }\n if (rejected.length) throw new ParallelError(outcomes);\n return outcomes.map(\n (outcome) => (outcome as PromiseFulfilledResult<unknown>).value,\n ) as { -readonly [K in keyof T]: Awaited<T[K]> };\n } finally {\n ctx.parallelGroup = undefined;\n }\n };\n const promise = join();\n ctx.parallelJoins.push(promise);\n // The node owns this join even if user code forgets to await it.\n void promise.catch(() => {});\n return promise;\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n InterruptInput,\n TokenUsage,\n WorkflowDefinition,\n} from \"@kortyx/core\";\nimport {\n isExecutionCancelled,\n isExecutionLimitReached,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport type { z } from \"zod\";\nimport { accumulateTokenUsage, getHookContext } from \"./context\";\nimport { awaitInterruptInternal } from \"./interrupt\";\nimport {\n ParallelChildWaiting,\n registerWorkflowTask,\n type WorkflowTask,\n} from \"./parallel\";\nimport { emitWorkflowCall, workflowCallContent } from \"./workflow-telemetry\";\n\nexport type WorkflowCallOutcome =\n | {\n status: \"completed\";\n data: Record<string, unknown>;\n usage?: TokenUsage | undefined;\n }\n | {\n status: \"interrupted\";\n request: InterruptInput;\n snapshot: unknown;\n usage?: TokenUsage | undefined;\n };\n\nexport type WorkflowCallService = (args: {\n id: string;\n workflow: string;\n input: unknown;\n snapshot?: unknown;\n definition?: WorkflowDefinition | undefined;\n invocationId: string;\n response?: string | string[] | undefined;\n callerNodeExecutionId?: string | undefined;\n}) => Promise<WorkflowCallOutcome>;\n\nexport type CallRecord = {\n parallelKey?: string;\n usage?: TokenUsage;\n fingerprint: string;\n sequence?: number;\n telemetry?: Record<string, unknown>;\n invocationId: string;\n status: \"running\" | \"interrupted\" | \"completed\" | \"failed\";\n snapshot?: unknown;\n data?: Record<string, unknown>;\n error?: string;\n interrupts: Array<{ request: InterruptInput; response?: string | string[] }>;\n};\n\nexport class WorkflowCallError extends Error {\n constructor(\n public readonly workflow: string,\n message: string,\n ) {\n super(`Workflow '${workflow}': ${message}`);\n this.name = \"WorkflowCallError\";\n }\n}\n\n// Canonicalize JSON so object insertion order cannot change call identity.\nexport function workflowCallFingerprint(value: unknown): string {\n const seen = new Set<object>();\n const canonical = (v: unknown): unknown => {\n if (v === null || typeof v === \"string\" || typeof v === \"boolean\") return v;\n if (typeof v === \"number\" && Number.isFinite(v)) return v;\n if (typeof v !== \"object\" || !v || seen.has(v)) {\n throw new Error(\"Workflow input and output must be JSON serializable.\");\n }\n if (!Array.isArray(v) && Object.getPrototypeOf(v) !== Object.prototype) {\n throw new Error(\n \"Workflow input and output must contain plain JSON objects.\",\n );\n }\n seen.add(v);\n const result = Array.isArray(v)\n ? v.map(canonical)\n : Object.fromEntries(\n Object.keys(v)\n .sort()\n .map((key) => [\n key,\n canonical((v as Record<string, unknown>)[key]),\n ]),\n );\n seen.delete(v);\n return result;\n };\n return JSON.stringify(canonical(value));\n}\n\ntype SchematizedWorkflow = WorkflowDefinition & {\n inputSchema: z.ZodType;\n outputSchema: z.ZodType<Record<string, unknown>>;\n};\n\n/** Bind string workflow ids to the same definitions registered with the agent. */\nexport function createWorkflowHooks<\n const W extends Record<string, SchematizedWorkflow>,\n>(workflows: W) {\n return {\n useWorkflow: <K extends keyof W & string>(args: {\n id: string;\n workflow: K;\n input: z.input<W[K][\"inputSchema\"]>;\n }): Promise<{ data: z.output<W[K][\"outputSchema\"]> }> => {\n const workflow = workflows[args.workflow];\n if (!workflow || workflow.id !== args.workflow)\n throw new Error(\"Workflow registry keys must match definition ids.\");\n return useWorkflow({ ...args, workflow }) as Promise<{\n data: z.output<W[K][\"outputSchema\"]>;\n }>;\n },\n };\n}\n\n/** Typed references avoid caller-supplied result type assertions. */\nexport function useWorkflow<W extends SchematizedWorkflow>(args: {\n id: string;\n workflow: W;\n input: z.input<W[\"inputSchema\"]>;\n}): Promise<{ data: z.output<W[\"outputSchema\"]> }>;\nexport function useWorkflow(args: {\n id: string;\n workflow: string;\n input: unknown;\n}): Promise<{ data: Record<string, unknown> }>;\nexport async function useWorkflow(args: {\n id: string;\n workflow: string | SchematizedWorkflow;\n input: unknown;\n}): Promise<{ data: Record<string, unknown> }> {\n const task = registerWorkflowTask(args.id);\n try {\n // Give the enclosing parallel([...]) call a chance to claim the eager calls.\n await Promise.resolve();\n if (task.group) await task.group.ready;\n return await runWorkflowCall(args, task);\n } catch (error) {\n if (isExecutionCancelled(error) || isExecutionLimitReached(error))\n getHookContext().workflowControlError = error;\n throw error;\n } finally {\n task.finish();\n }\n}\n\nasync function runWorkflowCall(\n args: {\n id: string;\n workflow: string | SchematizedWorkflow;\n input: unknown;\n },\n task: WorkflowTask,\n): Promise<{ data: Record<string, unknown> }> {\n const ctx = getHookContext();\n throwIfExecutionAborted(ctx.node.abortSignal);\n const service = ctx.node.callWorkflow;\n if (!service)\n throw new Error(\"useWorkflow requires an agent workflow registry.\");\n if (!args.id.trim())\n throw new Error(\"useWorkflow requires a stable, nonempty id.\");\n if (ctx.workflowCallActive && !task.group)\n throw new Error(\n \"Concurrent workflow calls require parallel([...]); otherwise await each call.\",\n );\n if (ctx.workflowCallIds.has(args.id))\n throw new Error(\n `Duplicate workflow call id '${args.id}' in one node activation.`,\n );\n if (ctx.workflowCallIds.size >= 64)\n throw new Error(\n \"A node may call at most 64 child workflows per activation.\",\n );\n ctx.workflowCallIds.add(args.id);\n const definition =\n typeof args.workflow === \"string\" ? undefined : args.workflow;\n const workflow = definition?.id ?? (args.workflow as string);\n const input = args.input;\n const fingerprint = workflowCallFingerprint({\n workflow,\n input,\n version: definition?.version ?? null,\n });\n const key = `__useWorkflow:${args.id}`;\n let record = ctx.currentNodeState.byKey[key] as CallRecord | undefined;\n if (record && record.parallelKey !== task.group?.key)\n throw new WorkflowCallError(\n workflow,\n \"parallel call membership changed during replay\",\n );\n if (record && record.fingerprint !== fingerprint)\n throw new WorkflowCallError(\n workflow,\n \"call input or target changed during replay\",\n );\n if (!record) ctx.node.consumeExecution?.(\"maxChildInvocations\");\n record ??= {\n fingerprint,\n invocationId: randomUUID(),\n status: \"running\",\n interrupts: [],\n ...(task.group ? { parallelKey: task.group.key } : {}),\n };\n ctx.currentNodeState.byKey[key] = record;\n ctx.stateDirty = true;\n if (!task.group) ctx.workflowCallActive = true;\n const telemetry = ctx.node.workflowCallTelemetry;\n const activationKey = \"__useWorkflowActivation\";\n ctx.currentNodeState.byKey[activationKey] ??= randomUUID();\n const callerNodeExecutionId = ctx.currentNodeState.byKey[\n activationKey\n ] as string;\n const metadata = {\n invocationId: record.invocationId,\n parentInvocationId: telemetry?.correlation?.invocationId ?? null,\n branchId:\n telemetry?.correlation?.branchId ??\n telemetry?.correlation?.runId ??\n \"unknown\",\n callId: args.id,\n callerNodeId: ctx.node.graph.node,\n callerNodeExecutionId,\n sourceWorkflowId: ctx.node.graph.name,\n targetWorkflowId: workflow,\n targetVersion: definition?.version ?? null,\n };\n record.telemetry = metadata;\n const report = (\n status:\n | \"started\"\n | \"suspended\"\n | \"resumed\"\n | \"completed\"\n | \"failed\"\n | \"reused\",\n content: Record<string, unknown> = {},\n ) => {\n record.sequence = (record.sequence ?? 0) + 1;\n emitWorkflowCall(telemetry, `workflow.call.${status}`, {\n ...metadata,\n sequence: record.sequence,\n ...content,\n });\n };\n const recordUsage = (usage: TokenUsage | undefined) => {\n if (!usage) return;\n accumulateTokenUsage({\n input: usage.input - (record.usage?.input ?? 0),\n output: usage.output - (record.usage?.output ?? 0),\n total: usage.total - (record.usage?.total ?? 0),\n });\n record.usage = usage;\n };\n const cached = record.status === \"completed\";\n\n try {\n // Replay every bridged interrupt, even for a completed call. The parent\n // graph assigns resume values by interrupt position within its node.\n for (const interruption of task.group ? [] : record.interrupts) {\n interruption.response = await awaitInterruptInternal({\n request: interruption.request,\n ...(interruption.request.meta\n ? { meta: interruption.request.meta }\n : {}),\n });\n }\n if (record.status === \"failed\")\n throw new WorkflowCallError(workflow, record.error ?? \"child failed\");\n if (\n task.group &&\n record.status === \"interrupted\" &&\n record.interrupts.at(-1)?.response === undefined\n )\n throw new ParallelChildWaiting();\n while (record.status !== \"completed\") {\n let outcome: WorkflowCallOutcome;\n try {\n report(\n record.snapshot ? \"resumed\" : \"started\",\n workflowCallContent(telemetry, \"input\", input),\n );\n outcome = await service({\n callerNodeExecutionId,\n id: args.id,\n workflow,\n input,\n definition,\n invocationId: record.invocationId,\n ...(record.snapshot ? { snapshot: record.snapshot } : {}),\n ...(record.interrupts.length\n ? { response: record.interrupts.at(-1)?.response }\n : {}),\n });\n } catch (error) {\n const child = error as {\n __kortyxChildSnapshot?: unknown;\n __kortyxChildUsage?: TokenUsage;\n } | null;\n recordUsage(child?.__kortyxChildUsage);\n throwIfExecutionAborted(ctx.node.abortSignal);\n if (isExecutionCancelled(error)) throw error;\n if (isExecutionLimitReached(error)) {\n if (child?.__kortyxChildSnapshot)\n record.snapshot = child.__kortyxChildSnapshot;\n report(\"suspended\", {\n reason: \"limit_reached\",\n limit: error.limitReached,\n });\n throw error;\n }\n record.status = \"failed\";\n record.error = error instanceof Error ? error.message : String(error);\n report(\"failed\", { error: \"Child workflow failed\" });\n throw new WorkflowCallError(workflow, record.error);\n }\n throwIfExecutionAborted(ctx.node.abortSignal);\n // Child totals survive suspension; count only newly reported work.\n recordUsage(outcome.usage);\n if (outcome.status === \"completed\") {\n // Validate cached and live outputs against the caller's actual contract.\n record.data = outcome.data;\n workflowCallFingerprint(record.data);\n record.status = \"completed\";\n delete record.snapshot;\n report(\n \"completed\",\n workflowCallContent(telemetry, \"output\", record.data),\n );\n } else {\n record.status = \"interrupted\";\n record.snapshot = outcome.snapshot;\n report(\"suspended\", {\n leaf: outcome.request.meta?.workflowCall ?? null,\n });\n const interruption: CallRecord[\"interrupts\"][number] = {\n request: outcome.request,\n };\n record.interrupts.push(interruption);\n if (task.group) throw new ParallelChildWaiting();\n interruption.response = await awaitInterruptInternal({\n request: interruption.request,\n ...(interruption.request.meta\n ? { meta: interruption.request.meta }\n : {}),\n });\n }\n }\n if (cached)\n report(\"reused\", workflowCallContent(telemetry, \"output\", record.data));\n const data = record.data ?? {};\n return {\n data: JSON.parse(JSON.stringify(data)) as Record<string, unknown>,\n };\n } finally {\n if (!task.group) ctx.workflowCallActive = false;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n KortyxTelemetryConfig,\n KortyxTelemetryEventType,\n} from \"./tracing\";\n\n/** Best effort lifecycle facts. Engine snapshots and interrupt tokens never leave the runtime. */\nexport function emitWorkflowCall(\n telemetry: KortyxTelemetryConfig | undefined,\n type: KortyxTelemetryEventType,\n payload: Record<string, unknown>,\n) {\n const base = telemetry?.correlation;\n if (\n !telemetry?.reporter ||\n !telemetry.environment ||\n !telemetry.service ||\n !base?.runId ||\n !base.workflowId\n )\n return;\n try {\n const active = telemetry.trace?.getActiveContext?.();\n void Promise.resolve(\n telemetry.reporter.emit([\n {\n schemaVersion: 1,\n eventId: randomUUID(),\n occurredAt: new Date().toISOString(),\n environment: telemetry.environment,\n service: telemetry.service,\n correlation: {\n ...base,\n runId: base.runId,\n workflowId: base.workflowId,\n ...active,\n },\n type,\n payload,\n },\n ]),\n ).catch(() => {});\n } catch {\n /* Observability cannot change execution. */\n }\n}\n\nexport function workflowCallContent(\n telemetry: KortyxTelemetryConfig | undefined,\n side: \"input\" | \"output\",\n value: unknown,\n): Record<string, unknown> {\n const policy = telemetry?.captureContent;\n if (\n !(policy === true || (policy && typeof policy === \"object\" && policy[side]))\n )\n return {};\n const serialized = JSON.stringify(value);\n // Use a marker instead of a truncated, misleading JSON result.\n return serialized && Buffer.byteLength(serialized, \"utf8\") <= 16_384\n ? { [side]: JSON.parse(serialized) }\n : { [`${side}Omitted`]: \"Content exceeds 16 KiB\" };\n}\n","// release-test: 2026-01-22\n\nexport type { ChatRequestBody, CheckpointRequestBody } from \"./adapters/http\";\nexport {\n createChatRouteHandler,\n createCheckpointRouteHandler,\n handleChatRequestBody,\n handleCheckpointRequestBody,\n parseChatRequestBody,\n parseCheckpointRequestBody,\n} from \"./adapters/http\";\nexport type { StreamChatFromRouteArgs } from \"./adapters/http-client\";\nexport { streamChatFromRoute } from \"./adapters/http-client\";\nexport type {\n Agent,\n AgentProcessOptions,\n AgentProjectTopologyOptions,\n CreateAgentArgs,\n} from \"./chat/create-agent\";\nexport { createAgent } from \"./chat/create-agent\";\nexport type { StreamChatArgs } from \"./chat/process-chat\";\nexport { streamChat } from \"./chat/process-chat\";\nexport type {\n ExecutableWorkflow,\n ExecuteOptions,\n ExecutionInfo,\n ExecutionInterrupt,\n ExecutionResult,\n ResumeHandle,\n ResumeOptions,\n ResumeResponse,\n} from \"./execution/types\";\nexport { ExecutionRequestError } from \"./execution/types\";\nexport type {\n InterruptScope,\n ListInterruptsOptions,\n PendingInterrupt,\n ResumableInterrupt,\n} from \"./interrupt/discovery\";\nexport type {\n ApplyResumeSelection,\n ResumeMeta,\n} from \"./interrupt/resume-handler\";\nexport {\n parseResumeMeta,\n tryPrepareResumeStream,\n} from \"./interrupt/resume-handler\";\nexport type {\n CompiledGraphLike,\n OrchestrateArgs,\n SaveMemoryFn,\n SelectWorkflowFn,\n} from \"./orchestrator\";\nexport { orchestrateGraphStream } from \"./orchestrator\";\nexport { transformGraphStreamForUI } from \"./stream/transform-graph-stream-for-ui\";\nexport { projectWorkflowTopology } from \"./telemetry/topology\";\nexport type { ChatMessage } from \"./types/chat-message\";\nexport { extractLatestUserMessage } from \"./utils/extract-latest-message\";\n","import { collectBufferedStream, toSSE } from \"@kortyx/stream\";\nimport { z } from \"zod\";\nimport type { Agent } from \"../chat/create-agent\";\nimport type { ChatMessage } from \"../types/chat-message\";\n\nexport type ChatRequestBody = {\n sessionId?: string | undefined;\n workflowId?: string | undefined;\n stream?: boolean | undefined;\n context?: Record<string, unknown> | undefined;\n messages: ChatMessage[];\n};\n\nexport type CheckpointRequestBody =\n | {\n action: \"list\";\n sessionId: string;\n }\n | {\n action: \"get\";\n checkpointId: string;\n }\n | {\n action: \"rollback\";\n checkpointId: string;\n }\n | {\n action: \"fork\";\n checkpointId: string;\n newSessionId?: string | undefined;\n };\n\nconst chatMessageSchema = z\n .object({\n role: z.enum([\"user\", \"assistant\", \"system\"]),\n content: z.string(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n id: z.string().optional(),\n timestamp: z.number().refine(Number.isFinite).optional(),\n })\n .strict();\n\nconst chatRequestBodySchema = z.looseObject({\n sessionId: z.string().optional(),\n workflowId: z.string().optional(),\n stream: z.boolean().optional(),\n context: z.record(z.string(), z.unknown()).optional(),\n messages: z.array(chatMessageSchema),\n});\n\nconst checkpointRequestBodySchema = z.discriminatedUnion(\"action\", [\n z\n .object({\n action: z.literal(\"list\"),\n sessionId: z.string().min(1),\n })\n .strict(),\n z\n .object({\n action: z.literal(\"get\"),\n checkpointId: z.string().min(1),\n })\n .strict(),\n z\n .object({\n action: z.literal(\"rollback\"),\n checkpointId: z.string().min(1),\n })\n .strict(),\n z\n .object({\n action: z.literal(\"fork\"),\n checkpointId: z.string().min(1),\n newSessionId: z.string().min(1).optional(),\n })\n .strict(),\n]);\n\nconst toErrorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nexport function parseChatRequestBody(value: unknown): ChatRequestBody {\n const parsed = chatRequestBodySchema.safeParse(value);\n if (!parsed.success) {\n const [firstIssue] = parsed.error.issues as unknown as [\n { message: string },\n ...Array<{ message: string }>,\n ];\n throw new Error(firstIssue.message);\n }\n\n const sessionId = parsed.data.sessionId?.trim();\n const workflowId = parsed.data.workflowId?.trim();\n\n return {\n ...(sessionId ? { sessionId } : {}),\n ...(workflowId ? { workflowId } : {}),\n ...(typeof parsed.data.stream === \"boolean\"\n ? { stream: parsed.data.stream }\n : {}),\n ...(parsed.data.context ? { context: parsed.data.context } : {}),\n messages: parsed.data.messages as ChatMessage[],\n };\n}\n\nexport function parseCheckpointRequestBody(\n value: unknown,\n): CheckpointRequestBody {\n const parsed = checkpointRequestBodySchema.safeParse(value);\n if (parsed.success) return parsed.data;\n const [firstIssue] = parsed.error.issues as unknown as [\n { message: string },\n ...Array<{ message: string }>,\n ];\n throw new Error(firstIssue.message);\n}\n\nexport async function handleChatRequestBody(args: {\n abortSignal?: AbortSignal | undefined;\n onExecution?: ((completion: Promise<void>) => void) | undefined;\n agent: Agent;\n body: ChatRequestBody;\n}): Promise<Response> {\n const { agent, body } = args;\n const stream = await agent.streamChat(body.messages, {\n ...(args.onExecution ? { onExecution: args.onExecution } : {}),\n ...(args.abortSignal ? { abortSignal: args.abortSignal } : {}),\n sessionId: body.sessionId,\n workflowId: body.workflowId,\n context: body.context,\n });\n\n if (body.stream === false) {\n const buffered = await collectBufferedStream(stream);\n return new Response(JSON.stringify(buffered), {\n headers: {\n \"content-type\": \"application/json\",\n },\n });\n }\n\n return toSSE(stream);\n}\n\nexport function createChatRouteHandler(args: {\n onExecution?: ((completion: Promise<void>) => void) | undefined;\n agent: Agent;\n errorStatus?: number | undefined;\n}): (request: Request) => Promise<Response> {\n const { agent, errorStatus = 400 } = args;\n\n return async function POST(request: Request): Promise<Response> {\n try {\n const body = parseChatRequestBody(await request.json());\n return await handleChatRequestBody({\n agent,\n body,\n abortSignal: request.signal,\n onExecution: args.onExecution,\n });\n } catch (error) {\n return new Response(\n JSON.stringify({\n error: toErrorMessage(error),\n }),\n {\n status: errorStatus,\n headers: {\n \"content-type\": \"application/json\",\n },\n },\n );\n }\n };\n}\n\nexport async function handleCheckpointRequestBody(args: {\n agent: Agent;\n body: CheckpointRequestBody;\n}): Promise<Response> {\n const { agent, body } = args;\n const result =\n body.action === \"list\"\n ? await agent.listCheckpoints(body.sessionId)\n : body.action === \"get\"\n ? await agent.getCheckpoint(body.checkpointId)\n : body.action === \"rollback\"\n ? await agent.rollbackTo(body.checkpointId)\n : await agent.fork(body.checkpointId, {\n ...(body.newSessionId ? { newSessionId: body.newSessionId } : {}),\n });\n\n return new Response(JSON.stringify(result), {\n headers: {\n \"content-type\": \"application/json\",\n },\n });\n}\n\nexport function createCheckpointRouteHandler(args: {\n agent: Agent;\n errorStatus?: number | undefined;\n}): (request: Request) => Promise<Response> {\n const { agent, errorStatus = 400 } = args;\n\n return async function POST(request: Request): Promise<Response> {\n try {\n const body = parseCheckpointRequestBody(await request.json());\n return await handleCheckpointRequestBody({ agent, body });\n } catch (error) {\n return new Response(\n JSON.stringify({\n error: toErrorMessage(error),\n }),\n {\n status: errorStatus,\n headers: {\n \"content-type\": \"application/json\",\n },\n },\n );\n }\n };\n}\n","import { type StreamChunk, streamFromRoute } from \"@kortyx/stream/browser\";\nimport type { ChatMessage } from \"../types/chat-message\";\n\nexport interface StreamChatFromRouteArgs {\n endpoint: string;\n sessionId?: string | undefined;\n workflowId?: string | undefined;\n messages: ChatMessage[];\n fetchImpl?: typeof fetch;\n headers?: Record<string, string> | undefined;\n}\n\nexport async function* streamChatFromRoute(\n args: StreamChatFromRouteArgs,\n): AsyncGenerator<StreamChunk, void, void> {\n yield* streamFromRoute({\n endpoint: args.endpoint,\n ...(args.fetchImpl ? { fetchImpl: args.fetchImpl } : {}),\n ...(args.headers ? { headers: args.headers } : {}),\n body: {\n sessionId: args.sessionId,\n workflowId: args.workflowId,\n messages: args.messages,\n },\n });\n}\n","import { resolve } from \"node:path\";\nimport type { WorkflowDefinition } from \"@kortyx/core\";\nimport {\n createExecutionBudget,\n type ExecutionLimits,\n ExecutionLimitsSchema,\n} from \"@kortyx/core\";\nimport {\n type GetProviderFn,\n getProvider as getRegisteredProvider,\n} from \"@kortyx/providers\";\nimport type {\n CheckpointId,\n CheckpointSummary,\n ExecutionRuntimeConfig,\n ForkSessionCheckpointResult,\n FrameworkAdapter,\n PendingRequestRecord,\n RollbackSessionCheckpointResult,\n SessionCheckpointRecord,\n WorkflowRegistry,\n} from \"@kortyx/runtime\";\nimport {\n createFileWorkflowRegistry,\n createFrameworkAdapterFromEnv,\n createInMemoryWorkflowRegistry,\n} from \"@kortyx/runtime\";\nimport type { StreamChunk } from \"@kortyx/stream\";\nimport { z } from \"zod\";\nimport { executeWorkflow, resumeWorkflow } from \"../execution/execute\";\nimport type {\n ExecutableWorkflow,\n ExecuteOptions,\n ExecutionResult,\n ResumeHandle,\n ResumeOptions,\n ResumeResponse,\n} from \"../execution/types\";\nimport { createInterruptDiscovery } from \"../interrupt/discovery\";\nimport { emitTelemetryEvent } from \"../telemetry/events\";\nimport { projectWorkflowTopology } from \"../telemetry/topology\";\nimport { restoreWorkflowCallBranch } from \"../telemetry/workflow-call-branch\";\nimport type { ChatMessage } from \"../types/chat-message\";\nimport { streamChat as runStreamChat } from \"./process-chat\";\n\nexport interface AgentProcessOptions {\n executionSignal?: AbortSignal | undefined;\n onExecution?: ((completion: Promise<void>) => void) | undefined;\n limits?: ExecutionLimits | undefined;\n abortSignal?: AbortSignal | undefined;\n sessionId?: string | undefined;\n workflowId?: string | undefined;\n context?: Record<string, unknown> | undefined;\n}\n\ntype AgentTopologySnapshot = ReturnType<typeof projectWorkflowTopology>;\n\nexport interface AgentProjectTopologyOptions {\n environment: string;\n service: AgentTopologySnapshot[\"service\"];\n}\n\nexport interface CreateAgentArgs {\n limits?: ExecutionLimits | undefined;\n getProvider?: GetProviderFn | undefined;\n workflows?: WorkflowDefinition[];\n workflowsDir?: string;\n workflowRegistry?: WorkflowRegistry;\n defaultWorkflowId?: string;\n frameworkAdapter?: FrameworkAdapter;\n telemetry?: ExecutionRuntimeConfig[\"telemetry\"];\n}\n\nexport interface Agent extends ReturnType<typeof createInterruptDiscovery> {\n execute<W extends ExecutableWorkflow>(\n args: ExecuteOptions<W>,\n ): Promise<ExecutionResult<z.output<W[\"outputSchema\"]>>>;\n execute(args: {\n limits?: ExecutionLimits;\n abortSignal?: AbortSignal;\n workflow: string;\n input: unknown;\n sessionId?: string;\n context?: Record<string, unknown>;\n }): Promise<ExecutionResult>;\n resume<W extends ExecutableWorkflow>(\n args: ResumeOptions<W>,\n ): Promise<ExecutionResult<z.output<W[\"outputSchema\"]>>>;\n resume(args: {\n limits?: ExecutionLimits;\n abortSignal?: AbortSignal;\n workflow: string;\n resume: ResumeHandle;\n response: ResumeResponse;\n }): Promise<ExecutionResult>;\n projectTopology?: (\n options: AgentProjectTopologyOptions,\n ) => Promise<AgentTopologySnapshot[]>;\n streamChat: (\n messages: ChatMessage[],\n options?: AgentProcessOptions,\n ) => Promise<AsyncIterable<StreamChunk>>;\n listCheckpoints: (sessionId: string) => Promise<CheckpointSummary[]>;\n getCheckpoint: (id: CheckpointId) => Promise<SessionCheckpointRecord | null>;\n rollbackTo: (id: CheckpointId) => Promise<RollbackSessionCheckpointResult>;\n fork: (\n id: CheckpointId,\n options?: { newSessionId?: string },\n ) => Promise<ForkSessionCheckpointResult>;\n}\n\nconst agentProcessOptionsSchema = z\n .object({\n executionSignal: z\n .custom<AbortSignal>((value) => value instanceof AbortSignal)\n .optional(),\n onExecution: z\n .custom<(completion: Promise<void>) => void>(\n (value) => typeof value === \"function\",\n )\n .optional(),\n limits: ExecutionLimitsSchema.optional(),\n abortSignal: z\n .custom<AbortSignal>((value) => value instanceof AbortSignal)\n .optional(),\n sessionId: z.string().optional(),\n workflowId: z.string().optional(),\n context: z.record(z.string(), z.unknown()).optional(),\n })\n .strict();\n\nconst createAgentArgsBaseSchema = z\n .object({\n limits: ExecutionLimitsSchema.optional(),\n getProvider: z.unknown().optional(),\n workflows: z.array(z.unknown()).optional(),\n workflowsDir: z.string().optional(),\n workflowRegistry: z.unknown().optional(),\n defaultWorkflowId: z.string().optional(),\n frameworkAdapter: z.unknown().optional(),\n telemetry: z.unknown().optional(),\n })\n .strict();\n\nconst createAgentArgsSchema = createAgentArgsBaseSchema.superRefine(\n (value: z.infer<typeof createAgentArgsBaseSchema>, ctx: z.RefinementCtx) => {\n if (\n value.getProvider !== undefined &&\n typeof value.getProvider !== \"function\"\n ) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Expected `args.getProvider` to be a function.\",\n path: [\"getProvider\"],\n });\n }\n\n const workflowSources = [\n value.workflows !== undefined,\n value.workflowsDir !== undefined,\n value.workflowRegistry !== undefined,\n ].filter(Boolean).length;\n\n if (workflowSources > 1) {\n ctx.addIssue({\n code: \"custom\",\n message:\n \"Use only one workflow source: `workflows`, `workflowsDir`, or `workflowRegistry`.\",\n });\n }\n },\n);\n\nconst parseSchema = <T>(schema: z.ZodType<T>, value: unknown): T => {\n const parsed = schema.safeParse(value);\n if (parsed.success) return parsed.data;\n const [firstIssue] = parsed.error.issues as unknown as [\n { message: string },\n ...Array<{ message: string }>,\n ];\n throw new Error(firstIssue.message);\n};\n\nconst parseCreateAgentArgs = (value: unknown): CreateAgentArgs =>\n parseSchema(createAgentArgsSchema, value) as CreateAgentArgs;\n\nconst parseAgentProcessOptions = (\n value: unknown,\n): AgentProcessOptions | undefined => {\n if (value === undefined) return undefined;\n return parseSchema(agentProcessOptionsSchema, value);\n};\n\nconst hydratePendingGraphCheckpoint = async (\n frameworkAdapter: FrameworkAdapter,\n request: PendingRequestRecord,\n): Promise<PendingRequestRecord> => {\n if (request.graphCheckpointId) return request;\n const checkpointer = frameworkAdapter.checkpointer as\n | {\n getLatestCheckpointId?: (\n threadId: string,\n checkpointNs?: string,\n ) => Promise<string | undefined>;\n }\n | undefined;\n const graphCheckpointId =\n (await checkpointer?.getLatestCheckpointId?.(\n request.runId,\n request.workflow,\n )) ?? (await checkpointer?.getLatestCheckpointId?.(request.runId, \"\"));\n return graphCheckpointId ? { ...request, graphCheckpointId } : request;\n};\n\nconst clearPendingGraphWrites = async (\n frameworkAdapter: FrameworkAdapter,\n request: PendingRequestRecord,\n): Promise<void> => {\n if (request.graphSnapshot || !request.graphCheckpointId) return;\n const checkpointer = frameworkAdapter.checkpointer as\n | {\n deleteCheckpointWrites?: (\n threadId: string,\n checkpointNs: string,\n checkpointId: string,\n ) => Promise<void>;\n }\n | undefined;\n if (!checkpointer?.deleteCheckpointWrites) return;\n\n await Promise.all([\n checkpointer.deleteCheckpointWrites(\n request.runId,\n request.workflow,\n request.graphCheckpointId,\n ),\n checkpointer.deleteCheckpointWrites(\n request.runId,\n \"\",\n request.graphCheckpointId,\n ),\n ]);\n};\n\nexport function createAgent(args: CreateAgentArgs): Agent {\n const parsedArgs = parseCreateAgentArgs(args);\n\n const {\n limits,\n getProvider,\n workflows,\n workflowsDir,\n workflowRegistry,\n defaultWorkflowId,\n frameworkAdapter,\n telemetry,\n } = parsedArgs;\n\n const resolvedDefaultWorkflowId = defaultWorkflowId;\n const resolvedFrameworkAdapter: FrameworkAdapter =\n frameworkAdapter ?? createFrameworkAdapterFromEnv();\n const resolvedGetProvider = getProvider ?? getRegisteredProvider;\n\n const resolvedCwd = process.cwd();\n\n const registryPromise: Promise<WorkflowRegistry | undefined> = (async () => {\n if (workflowRegistry) return workflowRegistry;\n if (workflows) {\n return createInMemoryWorkflowRegistry(workflows, {\n fallbackId: resolvedDefaultWorkflowId ?? \"general-chat\",\n });\n }\n if (workflowsDir) {\n return createFileWorkflowRegistry({\n workflowsDir,\n fallbackId: resolvedDefaultWorkflowId ?? \"general-chat\",\n });\n }\n\n const resolvedWorkflowsDir = resolve(resolvedCwd, \"src\", \"workflows\");\n return createFileWorkflowRegistry({\n workflowsDir: resolvedWorkflowsDir,\n fallbackId: resolvedDefaultWorkflowId ?? \"general-chat\",\n });\n })();\n const registeredWorkflowsPromise = registryPromise.then((registry) =>\n registry?.list?.(),\n );\n\n const projectTopology = async (\n options: AgentProjectTopologyOptions,\n ): Promise<AgentTopologySnapshot[]> => {\n const registeredWorkflows = await registeredWorkflowsPromise;\n if (!registeredWorkflows?.length) return [];\n const knownWorkflowIds = registeredWorkflows.map((workflow) => workflow.id);\n return registeredWorkflows.map((workflow) =>\n projectWorkflowTopology({\n workflow,\n environment: options.environment,\n service: options.service,\n knownWorkflowIds,\n }),\n );\n };\n\n const streamChat = async (\n messages: ChatMessage[],\n options?: AgentProcessOptions,\n ): Promise<AsyncIterable<StreamChunk>> => {\n const parsedOptions = parseAgentProcessOptions(options);\n\n const registry = await registryPromise;\n if (!registry) {\n throw new Error(\n \"createAgent requires workflows, workflowsDir, or workflowRegistry.\",\n );\n }\n const registeredWorkflows = await registeredWorkflowsPromise.catch(\n () => undefined,\n );\n const knownWorkflowIds = registeredWorkflows?.map(\n (workflow) => workflow.id,\n );\n\n return runStreamChat({\n ...(resolvedDefaultWorkflowId\n ? { defaultWorkflowId: resolvedDefaultWorkflowId }\n : {}),\n messages,\n abortSignal: parsedOptions?.abortSignal,\n executionSignal: parsedOptions?.executionSignal,\n onExecution: parsedOptions?.onExecution,\n options: parsedOptions,\n workflowRegistry: registry,\n ...(knownWorkflowIds ? { knownWorkflowIds } : {}),\n frameworkAdapter: resolvedFrameworkAdapter,\n getProvider: resolvedGetProvider,\n loadRuntimeConfig: (runtimeOptions?: AgentProcessOptions) => ({\n ...(limits || runtimeOptions?.limits\n ? {\n executionBudget: createExecutionBudget(\n limits,\n runtimeOptions?.limits,\n ),\n }\n : {}),\n ...(runtimeOptions?.sessionId\n ? {\n session: {\n id: runtimeOptions.sessionId,\n },\n }\n : {}),\n ...(runtimeOptions?.context ? { context: runtimeOptions.context } : {}),\n ...(telemetry ? { telemetry } : {}),\n }),\n });\n };\n\n const listCheckpoints = (sessionId: string) =>\n resolvedFrameworkAdapter.sessionCheckpoints.list(sessionId);\n\n const getCheckpoint = (id: CheckpointId) =>\n resolvedFrameworkAdapter.sessionCheckpoints.get(id);\n\n const rollbackTo = async (\n id: CheckpointId,\n ): Promise<RollbackSessionCheckpointResult> => {\n const target = await resolvedFrameworkAdapter.sessionCheckpoints.get(id);\n const result =\n await resolvedFrameworkAdapter.sessionCheckpoints.rollbackTo(id);\n const activePendingRequests = await Promise.all(\n result.activePendingRequests.map((request) =>\n hydratePendingGraphCheckpoint(resolvedFrameworkAdapter, request),\n ),\n );\n restoreWorkflowCallBranch(\n activePendingRequests,\n telemetry,\n target?.runId ?? \"unknown\",\n );\n await Promise.all(\n activePendingRequests.map((request) =>\n clearPendingGraphWrites(resolvedFrameworkAdapter, request),\n ),\n );\n\n await Promise.all([\n ...result.invalidatedInterruptTokens.map((token) =>\n resolvedFrameworkAdapter.pendingRequests.delete(token),\n ),\n ...activePendingRequests.map((request) =>\n resolvedFrameworkAdapter.pendingRequests.save(request),\n ),\n ]);\n\n if (target) {\n emitTelemetryEvent({\n config: { ...(telemetry ? { telemetry } : {}) },\n type: \"session.rolled_back\",\n correlation: {\n runId: target.runId,\n sessionId: target.sessionId,\n workflowId: target.workflow,\n },\n payload: {\n checkpointId: target.id,\n invalidatedInterruptIds: result.invalidatedInterruptTokens,\n },\n });\n }\n\n return { ...result, activePendingRequests };\n };\n\n const fork = async (\n id: CheckpointId,\n options?: { newSessionId?: string },\n ): Promise<ForkSessionCheckpointResult> => {\n const source = await resolvedFrameworkAdapter.sessionCheckpoints.get(id);\n const result = await resolvedFrameworkAdapter.sessionCheckpoints.fork(\n id,\n options,\n );\n const activePendingRequests = await Promise.all(\n result.checkpoint.activePendingRequests.map((request) =>\n hydratePendingGraphCheckpoint(resolvedFrameworkAdapter, request),\n ),\n );\n restoreWorkflowCallBranch(\n activePendingRequests,\n telemetry,\n source?.runId ?? \"unknown\",\n );\n await Promise.all(\n activePendingRequests.map((request) =>\n clearPendingGraphWrites(resolvedFrameworkAdapter, request),\n ),\n );\n await Promise.all(\n activePendingRequests.map((request) =>\n resolvedFrameworkAdapter.pendingRequests.save(request),\n ),\n );\n emitTelemetryEvent({\n config: { ...(telemetry ? { telemetry } : {}) },\n type: \"session.forked\",\n correlation: {\n runId: result.checkpoint.runId,\n sessionId: result.checkpoint.sessionId,\n workflowId: result.checkpoint.workflow,\n },\n payload: {\n newSessionId: result.sessionId,\n parentSessionId: result.parentSessionId,\n forkedFromCheckpointId: result.forkedFrom,\n },\n });\n return {\n ...result,\n checkpoint: { ...result.checkpoint, activePendingRequests },\n };\n };\n\n const services = async () => {\n const registry = await registryPromise;\n if (!registry) throw new Error(\"Workflow registry is unavailable.\");\n return {\n registry,\n limits,\n frameworkAdapter: resolvedFrameworkAdapter,\n getProvider: resolvedGetProvider,\n telemetry,\n knownWorkflowIds: (await registeredWorkflowsPromise)?.map(\n (workflow) => workflow.id,\n ),\n };\n };\n const execute = (async (options: Parameters<typeof executeWorkflow>[1]) =>\n executeWorkflow(await services(), options)) as Agent[\"execute\"];\n const resume = (async (options: Parameters<typeof resumeWorkflow>[1]) =>\n resumeWorkflow(await services(), options)) as Agent[\"resume\"];\n\n return {\n ...createInterruptDiscovery(resolvedFrameworkAdapter.pendingRequests),\n execute,\n resume,\n projectTopology,\n streamChat,\n listCheckpoints,\n getCheckpoint,\n rollbackTo,\n fork,\n };\n}\n","import type { WorkflowDefinition } from \"@kortyx/core\";\nimport {\n createExecutionBudget,\n type ExecutionLimitReached,\n type ExecutionLimits,\n isExecutionCancelled,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport type { GetProviderFn } from \"@kortyx/providers\";\nimport {\n buildInitialGraphState,\n createExecutionGraph,\n type ExecutionRuntimeConfig,\n type FrameworkAdapter,\n makeRequestId,\n type PendingRequestRecord,\n type WorkflowRegistry,\n} from \"@kortyx/runtime\";\nimport { z } from \"zod\";\nimport { tryPrepareResumeStream } from \"../interrupt/resume-handler\";\nimport {\n type OrchestrationOutcome,\n orchestrateGraphStream,\n} from \"../orchestrator\";\nimport { prepareWorkflowTelemetry } from \"../telemetry/topology\";\nimport { parseExecutionInput, resolveExecutionWorkflow } from \"./contracts\";\nimport {\n ExecutionRequestError,\n type ExecutionResult,\n type ResumeHandle,\n type ResumeResponse,\n} from \"./types\";\n\nexport interface ExecutionServices {\n limits?: ExecutionLimits | undefined;\n registry: WorkflowRegistry;\n frameworkAdapter: FrameworkAdapter;\n getProvider: GetProviderFn;\n telemetry?: ExecutionRuntimeConfig[\"telemetry\"];\n knownWorkflowIds?: readonly string[] | undefined;\n}\n\nconst handleSchema = z\n .object({\n token: z.string().min(1),\n requestId: z.string().min(1),\n sessionId: z.string().min(1),\n runId: z.string().min(1),\n })\n .strict();\nconst responseSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"text\"), text: z.string().min(1) }).strict(),\n z\n .object({\n type: z.literal(\"select\"),\n ids: z.array(z.string().min(1)).min(1),\n })\n .strict(),\n z.object({ type: z.literal(\"cancel\") }).strict(),\n]);\n\nexport function resultFromOutcome(\n outcome: OrchestrationOutcome,\n runId: string,\n sessionId: string,\n): ExecutionResult {\n const usage =\n (\n outcome.pending?.schema.meta?.__kortyxResumeStatePatch as\n | { tokenUsage?: import(\"@kortyx/core\").TokenUsage }\n | undefined\n )?.tokenUsage ??\n (\n outcome.error as\n | {\n __kortyxHookStatePatch?: {\n tokenUsage?: import(\"@kortyx/core\").TokenUsage;\n };\n }\n | undefined\n )?.__kortyxHookStatePatch?.tokenUsage ??\n outcome.state.runtime?.tokenUsage;\n const info = {\n runId,\n sessionId,\n ...(outcome.checkpointId ? { checkpointId: outcome.checkpointId } : {}),\n ...(usage ? { usage } : {}),\n };\n if (isExecutionCancelled(outcome.error))\n return { ...info, status: \"cancelled\", reason: \"Execution cancelled.\" };\n if (outcome.error) {\n const error = outcome.error;\n return {\n ...info,\n status: \"failed\",\n error: {\n code:\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n typeof error.code === \"string\"\n ? error.code\n : \"EXECUTION_FAILED\",\n message: error instanceof Error ? error.message : String(error),\n },\n };\n }\n if (outcome.cancelled)\n return { ...info, status: \"cancelled\", reason: \"cancelled_by_client\" };\n if (outcome.pending) {\n const pending = outcome.pending;\n const meta = Object.fromEntries(\n Object.entries(pending.schema.meta ?? {}).filter(\n ([key]) => !key.startsWith(\"__kortyx\"),\n ),\n );\n return {\n ...info,\n status: \"suspended\",\n ...(pending.schema.meta?.__kortyxExecutionLimit\n ? {\n reason: \"limit_reached\" as const,\n limit: pending.schema.meta.executionLimit as ExecutionLimitReached,\n }\n : {}),\n interrupt: {\n workflow: pending.workflow,\n node: pending.node,\n input: {\n ...pending.schema,\n meta,\n options: pending.options.map(({ id, label, description }) => ({\n id,\n label,\n description,\n })),\n },\n },\n resume: {\n token: pending.token,\n requestId: pending.requestId,\n sessionId,\n runId,\n },\n };\n }\n return { ...info, status: \"completed\", data: outcome.state.data ?? {} };\n}\n\nfunction runtimeConfig(\n services: ExecutionServices,\n sessionId: string,\n context?: Record<string, unknown>,\n): ExecutionRuntimeConfig {\n return {\n session: { id: sessionId },\n ...(context ? { context } : {}),\n getProvider: services.getProvider,\n checkpointer: services.frameworkAdapter.checkpointer,\n selectWorkflow: (id) => services.registry.select(id),\n ...(services.telemetry ? { telemetry: services.telemetry } : {}),\n };\n}\n\nexport async function executeWorkflow(\n services: ExecutionServices,\n args: {\n limits?: ExecutionLimits;\n abortSignal?: AbortSignal;\n workflow: WorkflowDefinition | string;\n input: unknown;\n sessionId?: string;\n context?: Record<string, unknown>;\n },\n): Promise<ExecutionResult> {\n const select = (id: string) => services.registry.select(id);\n const workflow = await resolveExecutionWorkflow(select, args.workflow);\n const input = parseExecutionInput(workflow, args.input);\n if (args.sessionId !== undefined && !args.sessionId.trim())\n throw new ExecutionRequestError(\n \"INVALID_SESSION\",\n \"sessionId must not be empty.\",\n );\n const sessionId = args.sessionId ?? makeRequestId(\"session\");\n const runId = makeRequestId(\"run\");\n const config = prepareWorkflowTelemetry({\n config: {\n ...runtimeConfig(services, sessionId, args.context),\n ...(services.limits || args.limits\n ? {\n executionBudget: createExecutionBudget(\n services.limits,\n args.limits,\n ),\n }\n : {}),\n executionContract: { id: workflow.id, version: workflow.version },\n },\n workflow,\n runId,\n sessionId,\n knownWorkflowIds: services.knownWorkflowIds,\n });\n const state = await buildInitialGraphState({\n input,\n runtime: {},\n config,\n defaultWorkflowId: workflow.id,\n });\n return new Promise<ExecutionResult>((resolve) => {\n const onOutcome = (outcome: OrchestrationOutcome) =>\n resolve(resultFromOutcome(outcome, runId, sessionId));\n void (async () => {\n throwIfExecutionAborted(args.abortSignal);\n const graph = await createExecutionGraph(workflow, config);\n await orchestrateGraphStream({\n graph,\n state,\n config,\n runId,\n sessionId,\n selectWorkflow: select,\n frameworkAdapter: services.frameworkAdapter,\n knownWorkflowIds: services.knownWorkflowIds,\n abortSignal: args.abortSignal,\n emitOutput: false,\n onOutcome,\n });\n })().catch((error) => onOutcome({ state, error }));\n });\n}\n\nexport async function resumeWorkflow(\n services: ExecutionServices,\n args: {\n limits?: ExecutionLimits;\n abortSignal?: AbortSignal;\n workflow: WorkflowDefinition | string;\n resume: ResumeHandle;\n response: ResumeResponse;\n },\n): Promise<ExecutionResult> {\n const parsed = z\n .object({ resume: handleSchema, response: responseSchema })\n .safeParse(args);\n if (!parsed.success)\n throw new ExecutionRequestError(\"INVALID_RESUME\", parsed.error.message);\n const { resume: handle, response } = parsed.data;\n const select = (id: string) => services.registry.select(id);\n const workflow = await resolveExecutionWorkflow(select, args.workflow);\n const validatePending = async (pending: PendingRequestRecord) => {\n const contract = pending.state?.config?.executionContract ?? {\n id: pending.workflow,\n };\n if (\n pending.runId !== handle.runId ||\n contract.id !== workflow.id ||\n (contract.version && contract.version !== workflow.version)\n )\n throw new ExecutionRequestError(\n \"RESUME_MISMATCH\",\n \"Resume handle does not match the root execution and workflow version.\",\n );\n if (response.type === \"cancel\") return;\n if (response.type === \"text\") {\n if (pending.schema.kind !== \"text\")\n throw new ExecutionRequestError(\n \"INVALID_RESPONSE\",\n \"This interrupt requires a selection.\",\n );\n } else {\n const multi =\n pending.schema.kind === \"multi-choice\" || pending.schema.multiple;\n if (\n pending.schema.kind === \"text\" ||\n (!multi && response.ids.length !== 1) ||\n new Set(response.ids).size !== response.ids.length\n )\n throw new ExecutionRequestError(\n \"INVALID_RESPONSE\",\n \"Invalid selection for this interrupt.\",\n );\n if (\n pending.options.length &&\n response.ids.some(\n (id) => !pending.options.some((option) => option.id === id),\n )\n )\n throw new ExecutionRequestError(\n \"INVALID_RESPONSE\",\n \"Selection contains an unknown option.\",\n );\n }\n };\n return new Promise<ExecutionResult>((resolve, reject) => {\n void tryPrepareResumeStream({\n limits: args.limits,\n abortSignal: args.abortSignal,\n meta: {\n token: handle.token,\n requestId: handle.requestId,\n selected:\n response.type === \"text\"\n ? [response.text]\n : response.type === \"select\"\n ? response.ids\n : [],\n cancel: response.type === \"cancel\",\n },\n sessionId: handle.sessionId,\n config: runtimeConfig(services, handle.sessionId),\n selectWorkflow: select,\n frameworkAdapter: services.frameworkAdapter,\n knownWorkflowIds: services.knownWorkflowIds,\n validatePending,\n applyResumeSelection: () => ({}),\n emitOutput: false,\n onOutcome: (outcome) =>\n resolve(resultFromOutcome(outcome, handle.runId, handle.sessionId)),\n })\n .then((stream) => {\n if (!stream)\n reject(\n new ExecutionRequestError(\n \"INVALID_RESUME\",\n \"No waiting execution found.\",\n ),\n );\n })\n .catch((error) =>\n reject(\n error instanceof ExecutionRequestError\n ? error\n : new ExecutionRequestError(\n \"INVALID_RESUME\",\n error instanceof Error ? error.message : String(error),\n ),\n ),\n );\n });\n}\n","import type { GraphState } from \"@kortyx/core\";\nimport {\n createExecutionCancelledError,\n type ExecutionBudget,\n type ExecutionLimits,\n restartExecutionBudget,\n} from \"@kortyx/core\";\nimport type {\n FrameworkAdapter,\n PendingRequestRecord,\n PendingRequestStore,\n} from \"@kortyx/runtime\";\nimport { createExecutionGraph, restoreGraphSnapshot } from \"@kortyx/runtime\";\nimport type { StreamChunk } from \"@kortyx/stream\";\nimport type { SelectWorkflowFn } from \"../orchestrator\";\nimport { type OrchestrateArgs, orchestrateGraphStream } from \"../orchestrator\";\nimport {\n emitTelemetryEvent,\n shouldCaptureTelemetryContent,\n} from \"../telemetry/events\";\nimport { prepareWorkflowTelemetry } from \"../telemetry/topology\";\nimport type { ChatMessage } from \"../types/chat-message\";\n\nexport interface ResumeMeta {\n token: string;\n requestId: string;\n selected: string[]; // normalized to array for consistency\n cancel?: boolean;\n}\n\nexport type ApplyResumeSelection = (args: {\n pending: PendingRequestRecord;\n selected: string[];\n}) => Record<string, unknown> | null | undefined;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst responseFromSelection = (selected: string[]): string | undefined => {\n if (selected.length === 0) return undefined;\n if (selected.length === 1) return selected[0];\n return JSON.stringify(selected);\n};\n\nexport function parseResumeMeta(\n msg: ChatMessage | undefined,\n): ResumeMeta | null {\n if (!msg || !msg.metadata) return null;\n const raw = msg.metadata.resume;\n if (!isRecord(raw)) return null;\n\n const token = typeof raw.token === \"string\" ? raw.token : \"\";\n const requestId = typeof raw.requestId === \"string\" ? raw.requestId : \"\";\n const cancel = raw.cancel === true;\n\n // Accept multiple shapes; normalize to selected: string[]\n let selected: string[] = [];\n const rawSelected = raw.selected;\n if (typeof rawSelected === \"string\") selected = [rawSelected];\n else if (Array.isArray(rawSelected)) selected = rawSelected.map(String);\n else if (isRecord(raw.choice) && typeof raw.choice.id === \"string\")\n selected = [raw.choice.id];\n else if (Array.isArray(raw.choices))\n selected = raw.choices\n .map((c) => (isRecord(c) ? c.id : undefined))\n .filter((id): id is string => typeof id === \"string\");\n\n if (!token || !requestId) return null;\n return { token, requestId, selected, cancel };\n}\n\ninterface TryResumeArgs {\n limits?: ExecutionLimits | undefined;\n abortSignal?: AbortSignal | undefined;\n executionSignal?: AbortSignal | undefined;\n onExecution?: ((completion: Promise<void>) => void) | undefined;\n lastMessage?: ChatMessage | undefined;\n meta?: ResumeMeta | undefined;\n emitOutput?: boolean | undefined;\n onOutcome?: OrchestrateArgs[\"onOutcome\"];\n validatePending?:\n | ((pending: PendingRequestRecord) => void | Promise<void>)\n | undefined;\n sessionId: string;\n config: Record<string, unknown>;\n selectWorkflow: SelectWorkflowFn;\n knownWorkflowIds?: readonly string[] | undefined;\n defaultWorkflowId?: string;\n applyResumeSelection?: ApplyResumeSelection;\n frameworkAdapter?: FrameworkAdapter;\n}\n\nexport async function tryPrepareResumeStream({\n limits,\n abortSignal,\n executionSignal,\n onExecution,\n lastMessage,\n meta: suppliedMeta,\n emitOutput,\n onOutcome,\n validatePending,\n sessionId,\n config,\n selectWorkflow,\n knownWorkflowIds,\n defaultWorkflowId,\n applyResumeSelection,\n frameworkAdapter,\n}: TryResumeArgs): Promise<AsyncIterable<StreamChunk> | null> {\n const meta = suppliedMeta ?? parseResumeMeta(lastMessage);\n if (!meta) return null;\n\n const store: PendingRequestStore | undefined =\n frameworkAdapter?.pendingRequests;\n if (!store) return null;\n\n const pending = await store.get(meta.token);\n if (!pending || pending.requestId !== meta.requestId) {\n throw new Error(\n \"Interrupt is expired, already consumed, or does not match the request.\",\n );\n }\n\n if (pending.sessionId && pending.sessionId !== sessionId)\n throw new Error(\"Interrupt belongs to another session.\");\n await validatePending?.(pending);\n const isLimitPause = Boolean(pending.schema.meta?.__kortyxExecutionLimit);\n\n const savedBudget = pending.state?.config?.executionBudget as\n | ExecutionBudget\n | undefined;\n const resumedBudget =\n savedBudget && isLimitPause && !meta.cancel\n ? restartExecutionBudget(savedBudget, limits)\n : savedBudget;\n if (abortSignal?.aborted) {\n onOutcome?.({\n state: pending.state as GraphState,\n error: createExecutionCancelledError(),\n });\n return (async function* () {\n yield {\n type: \"cancelled\",\n runId: pending.runId,\n reason: \"Execution cancelled.\",\n } as const;\n yield { type: \"done\" } as const;\n })();\n }\n if (store.take && !(await store.take(meta.token)))\n throw new Error(\"Interrupt has already been resumed or cancelled.\");\n if (meta.cancel) {\n await store.delete(pending.token);\n emitTelemetryEvent({\n config,\n type: \"interrupt.cancelled\",\n correlation: {\n runId: pending.runId,\n sessionId,\n workflowId: pending.workflow,\n nodeId: pending.node,\n },\n payload: {\n interruptId: pending.requestId,\n reason: \"cancelled_by_client\",\n },\n flush: true,\n });\n onOutcome?.({ state: pending.state as GraphState, cancelled: true });\n return (async function* (): AsyncGenerator<StreamChunk> {\n yield { type: \"done\" };\n })();\n }\n\n try {\n const resumeData = isLimitPause\n ? {}\n : applyResumeSelection\n ? applyResumeSelection({ pending, selected: meta.selected })\n : meta.selected?.length\n ? { coordinates: String(meta.selected[0]) }\n : {};\n\n const resumeDataPatch = isRecord(resumeData) ? resumeData : {};\n const pendingMeta = isRecord(pending.schema?.meta)\n ? pending.schema.meta\n : {};\n const resumeStatePatch = isRecord(pendingMeta.__kortyxResumeStatePatch)\n ? pendingMeta.__kortyxResumeStatePatch\n : undefined;\n\n const pendingData = isRecord(pending.state?.data)\n ? pending.state?.data\n : {};\n const workflowId =\n typeof pending.workflow === \"string\" && pending.workflow.trim()\n ? pending.workflow\n : typeof defaultWorkflowId === \"string\" && defaultWorkflowId.trim()\n ? defaultWorkflowId\n : \"job-search\";\n\n const resumedState = {\n // For static breakpoints, resume with null input (set in orchestrator),\n // and stash the user selection into data so the next node can read it.\n input: pending.state ? pending.state.input : \"\",\n lastNode: \"__start__\",\n currentWorkflow: workflowId,\n config,\n runtime: {},\n conversationHistory: [],\n awaitingHumanInput: false,\n data: {\n ...pendingData,\n ...resumeDataPatch,\n },\n } satisfies GraphState;\n\n const wf = await selectWorkflow(resumedState.currentWorkflow as string);\n const telemetryConfig = prepareWorkflowTelemetry({\n config: {\n ...config,\n ...(pending.responseCompleted\n ? {\n responseCompleted: true,\n responseCheckpointId: pending.state?.config?.responseCheckpointId,\n }\n : {}),\n ...(resumedBudget ? { executionBudget: resumedBudget } : {}),\n ...(pending.state?.config?.context\n ? { context: pending.state.config.context }\n : {}),\n ...(pending.state?.config?.executionContract\n ? { executionContract: pending.state.config.executionContract }\n : {}),\n ...(pending.state?.config?.executionBranchId\n ? { executionBranchId: pending.state.config.executionBranchId }\n : {}),\n },\n workflow: wf,\n runId: pending.runId,\n sessionId,\n knownWorkflowIds,\n });\n resumedState.config = telemetryConfig;\n const resumeUpdate: Record<string, unknown> = pending.graphSnapshot\n ? {\n config: {\n ...telemetryConfig,\n context: pending.state?.config?.context ?? telemetryConfig.context,\n },\n }\n : {};\n if (isLimitPause && pending.graphSnapshot) {\n pending.graphSnapshot.checkpoint.channel_values.config = telemetryConfig;\n if (resumeStatePatch)\n pending.graphSnapshot.checkpoint.channel_values.runtime = {\n ...(pending.graphSnapshot.checkpoint.channel_values.runtime as Record<\n string,\n unknown\n >),\n ...resumeStatePatch,\n };\n }\n if (pending.graphSnapshot && frameworkAdapter)\n await restoreGraphSnapshot(\n frameworkAdapter.checkpointer,\n pending.graphSnapshot,\n pending.runId,\n );\n if (Object.keys(resumeDataPatch).length > 0) {\n resumeUpdate.data = {\n ...pendingData,\n ...resumeDataPatch,\n };\n }\n if (resumeStatePatch) {\n resumeUpdate.runtime = resumeStatePatch;\n }\n const hasResumeUpdate =\n !isLimitPause && Object.keys(resumeUpdate).length > 0;\n const resumeValue = isLimitPause\n ? undefined\n : meta.selected?.length && pending.schema.kind === \"multi-choice\"\n ? meta.selected.map((x) => String(x))\n : meta.selected?.length\n ? String(meta.selected[0])\n : undefined;\n const resumeCheckpointId =\n typeof pending.graphCheckpointId === \"string\" &&\n pending.graphCheckpointId.length > 0\n ? pending.graphCheckpointId\n : undefined;\n const resumedGraph = await createExecutionGraph(wf, {\n ...telemetryConfig,\n resume: true,\n ...(resumeValue !== undefined ? { resumeValue } : {}),\n ...(resumeCheckpointId ? { resumeCheckpointId } : {}),\n ...(hasResumeUpdate ? { resumeUpdate } : {}),\n });\n await store.delete(pending.token);\n const response = responseFromSelection(meta.selected);\n const telemetry = isRecord(telemetryConfig.telemetry)\n ? telemetryConfig.telemetry\n : {};\n const responseCaptured = Boolean(\n response &&\n shouldCaptureTelemetryContent(telemetry.captureContent, \"input\"),\n );\n emitTelemetryEvent({\n config: telemetryConfig,\n type: \"interrupt.resolved\",\n correlation: {\n runId: pending.runId,\n sessionId,\n workflowId,\n nodeId: pending.node,\n },\n payload: {\n interruptId: pending.requestId,\n resolvedAt: new Date().toISOString(),\n resumeOutcome: \"resumed\",\n responseCaptured,\n ...(responseCaptured && response ? { response } : {}),\n },\n flush: true,\n });\n\n const args = {\n abortSignal,\n executionSignal:\n pending.responseCompleted && emitOutput === false\n ? abortSignal\n : executionSignal,\n onExecution,\n emitOutput,\n onOutcome,\n sessionId,\n runId: pending.runId,\n graph: resumedGraph,\n state: resumedState,\n config: {\n ...telemetryConfig,\n resume: true,\n telemetryInterruptId: pending.requestId,\n telemetryInterruptNodeId: pending.node,\n ...(resumeValue !== undefined ? { resumeValue } : {}),\n ...(resumeCheckpointId ? { resumeCheckpointId } : {}),\n ...(hasResumeUpdate ? { resumeUpdate } : {}),\n },\n selectWorkflow,\n knownWorkflowIds,\n frameworkAdapter: frameworkAdapter as FrameworkAdapter,\n } satisfies OrchestrateArgs;\n\n const stream = await orchestrateGraphStream(args);\n return stream as unknown as AsyncIterable<StreamChunk>;\n } catch (error) {\n await store.save(pending);\n throw error;\n }\n}\n","import { PassThrough } from \"node:stream\";\nimport type { GraphState, WorkflowDefinition, WorkflowId } from \"@kortyx/core\";\nimport {\n createExecutionCancelledError,\n type ExecutionBudget,\n isExecutionCancelled,\n isExecutionLimitReached,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport {\n captureGraphSnapshot,\n createExecutionGraph,\n type FrameworkAdapter,\n makeRequestId,\n makeResumeToken,\n type PendingRequestRecord,\n type PendingRequestStore,\n} from \"@kortyx/runtime\";\nimport type { StreamChunk } from \"@kortyx/stream\";\nimport { Command } from \"@langchain/langgraph\";\nimport {\n parseExecutionInput,\n validateExecutionOutput,\n} from \"./execution/contracts\";\nimport { createResponseLifecycle } from \"./stream/response-lifecycle\";\nimport { transformGraphStreamForUI } from \"./stream/transform-graph-stream-for-ui\";\nimport {\n emitTelemetryEvent,\n shouldCaptureTelemetryContent,\n} from \"./telemetry/events\";\nimport { prepareWorkflowTelemetry } from \"./telemetry/topology\";\n\nexport type SelectWorkflowFn = (\n workflowId: string,\n) => Promise<WorkflowDefinition>;\n\nexport type SaveMemoryFn = (\n sessionId: string,\n state: GraphState,\n) => Promise<void>;\n\nexport interface CompiledGraphLike {\n execution?: {\n abortSignal?: AbortSignal | undefined;\n budget?: ExecutionBudget | undefined;\n completeResponse?:\n | ((\n options: import(\"@kortyx/hooks\").CompleteResponseOptions,\n state: GraphState,\n ) => Promise<void>)\n | undefined;\n };\n config?: Record<string, unknown>;\n streamEvents: (\n state: GraphState,\n options?: { version?: string; configurable?: Record<string, unknown> },\n ) => AsyncIterable<unknown> | AsyncGenerator<unknown>;\n getState?: (options?: {\n configurable?: Record<string, unknown>;\n }) => Promise<unknown>;\n}\n\nexport type OrchestrationOutcome = {\n cancelled?: boolean;\n state: GraphState;\n pending?: PendingRequestRecord | undefined;\n checkpointId?: string | undefined;\n error?: unknown;\n};\n\nexport interface OrchestrateArgs {\n executionSignal?: AbortSignal | undefined;\n onExecution?: ((completion: Promise<void>) => void) | undefined;\n abortSignal?: AbortSignal | undefined;\n emitOutput?: boolean | undefined;\n onOutcome?: ((outcome: OrchestrationOutcome) => void) | undefined;\n sessionId?: string;\n runId: string;\n graph: CompiledGraphLike; // minimal graph surface used here\n state: GraphState; // initial state\n config: Record<string, unknown>; // runtime config\n selectWorkflow: SelectWorkflowFn;\n knownWorkflowIds?: readonly string[] | undefined;\n frameworkAdapter?: FrameworkAdapter;\n}\n\ntype TraceSpanLike = {\n setAttributes?: (attributes: Record<string, unknown>) => void;\n addEvent?: (name: string, attributes?: Record<string, unknown>) => void;\n end?: (args?: {\n attributes?: Record<string, unknown>;\n telemetry?: Record<string, unknown>;\n }) => void;\n fail?: (\n error: unknown,\n args?: {\n attributes?: Record<string, unknown>;\n telemetry?: Record<string, unknown>;\n },\n ) => void;\n};\n\ntype TraceAdapterLike = {\n startSpan?: (args: {\n name: string;\n attributes?: Record<string, unknown>;\n telemetry?: unknown;\n }) => TraceSpanLike | undefined;\n withSpan?: <T>(\n args: {\n name: string;\n attributes?: Record<string, unknown>;\n telemetry?: unknown;\n },\n fn: (span: TraceSpanLike) => T | Promise<T>,\n ) => Promise<T>;\n getActiveContext?: () =>\n | {\n traceId: string;\n spanId: string;\n }\n | undefined;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst isGraphState = (value: unknown): value is GraphState =>\n isRecord(value) && typeof value.currentWorkflow === \"string\";\n\ntype GraphSnapshot = {\n state: GraphState;\n checkpointId?: string;\n};\n\nconst getGraphCheckpointId = (snapshot: unknown): string | undefined => {\n if (!isRecord(snapshot)) return undefined;\n const config = isRecord(snapshot.config) ? snapshot.config : undefined;\n const configurable =\n config && isRecord(config.configurable) ? config.configurable : undefined;\n const checkpointId = configurable?.checkpoint_id;\n return typeof checkpointId === \"string\" && checkpointId.length > 0\n ? checkpointId\n : undefined;\n};\n\nconst getTraceAdapter = (\n config: Record<string, unknown>,\n): TraceAdapterLike | undefined => {\n const telemetry = isRecord(config.telemetry) ? config.telemetry : undefined;\n const traceAdapter = telemetry?.trace ?? config.reasonTrace;\n return isRecord(traceAdapter)\n ? (traceAdapter as TraceAdapterLike)\n : undefined;\n};\n\n/**\n * Orchestrates runtime execution with mid-stream transitions emitted by\n * runtime events.\n */\nexport async function orchestrateGraphStream({\n sessionId,\n runId,\n graph,\n state,\n config: initialConfig,\n abortSignal: requestSignal,\n executionSignal,\n onExecution,\n emitOutput = true,\n onOutcome,\n selectWorkflow,\n knownWorkflowIds,\n frameworkAdapter,\n}: OrchestrateArgs): Promise<NodeJS.ReadableStream> {\n const out = new PassThrough({ objectMode: true });\n\n const write = (chunk: unknown) => {\n if (emitOutput && !response.closed && !out.destroyed) out.write(chunk);\n };\n let outcomeState = state;\n let outcomeError: unknown;\n let sessionCheckpointId: string | undefined =\n initialConfig.responseCheckpointId as string | undefined;\n let config = initialConfig;\n const budget = config.executionBudget as ExecutionBudget | undefined;\n let currentGraph = graph;\n let currentState: GraphState = state;\n let finished = false;\n const response = createResponseLifecycle({\n enabled: emitOutput,\n restored: initialConfig.responseCompleted === true,\n requestSignal,\n executionSignal,\n onClosed: () => {\n out.write({ type: \"done\" });\n out.end();\n },\n finalize: async (options, nodeState) => {\n // Snapshot the foreground before any later node return or handoff.\n const snapshot = JSON.parse(JSON.stringify(nodeState)) as GraphState;\n delete snapshot.config.responseCompleted;\n delete snapshot.config.responseCheckpointId;\n if (options.message !== undefined) {\n forwardEmit(\"message\", {\n node: nodeState.lastNode,\n content: options.message,\n });\n }\n if (options.data !== undefined) {\n forwardEmit(\"structured_data\", {\n node: nodeState.lastNode,\n data: options.data,\n });\n }\n if (sessionId && frameworkAdapter) {\n const checkpoint = await frameworkAdapter.sessionCheckpoints.append({\n sessionId,\n runId,\n workflow: String(snapshot.currentWorkflow),\n state: snapshot,\n nodes: [...touchedNodes],\n structuredStreamIds: [...structuredStreamIds],\n pendingRequests: [],\n });\n sessionCheckpointId = checkpoint.id;\n write({\n type: \"checkpoint\",\n id: checkpoint.id,\n sessionId,\n turnIndex: checkpoint.turnIndex,\n });\n emitTelemetryEvent({\n config,\n type: \"session.checkpointed\",\n payload: {\n checkpointId: checkpoint.id,\n turnIndex: checkpoint.turnIndex,\n nodes: checkpoint.nodes,\n },\n });\n }\n throwIfExecutionAborted(abortSignal);\n config.responseCompleted = true;\n config.responseCheckpointId = sessionCheckpointId;\n currentState.config.responseCompleted = true;\n nodeState.config.responseCompleted = true;\n // The marker travels with graph config across retries, children and resumes.\n currentGraph.config!.responseCompleted = true;\n emitTelemetryEvent({\n config,\n type: \"response.completed\",\n payload: {\n nodeId: nodeState.lastNode,\n checkpointId: sessionCheckpointId,\n },\n flush: true,\n });\n },\n });\n const abortSignal = response.signal;\n out.on(\"close\", () => {\n if (!finished) response.disconnect();\n });\n let structuredSeq = 0;\n const debugEnabled = Boolean((config as any)?.features?.tracing);\n const traceAdapter = getTraceAdapter(config);\n const contextMeta = isRecord(config.context) ? config.context : {};\n const telemetryConfig = isRecord(config.telemetry) ? config.telemetry : {};\n const emitResumeFailure = (resumeError: unknown) => {\n const interruptId =\n typeof config.telemetryInterruptId === \"string\"\n ? config.telemetryInterruptId\n : undefined;\n if (!interruptId) return;\n emitTelemetryEvent({\n config,\n type: \"interrupt.resolved\",\n correlation:\n typeof config.telemetryInterruptNodeId === \"string\"\n ? { nodeId: config.telemetryInterruptNodeId }\n : undefined,\n payload: {\n interruptId,\n resolvedAt: new Date().toISOString(),\n resumeOutcome: \"failed\",\n resumeError:\n resumeError instanceof Error\n ? resumeError.message\n : String(resumeError),\n },\n flush: true,\n });\n };\n const telemetryCorrelation = isRecord(telemetryConfig.correlation)\n ? telemetryConfig.correlation\n : {};\n const runSpanArgs = {\n name: \"kortyx.run\",\n attributes: {\n ...(sessionId ? { sessionId } : {}),\n runId,\n workflowId: state.currentWorkflow,\n ...(typeof telemetryCorrelation.topologyHash === \"string\"\n ? { topologyHash: telemetryCorrelation.topologyHash }\n : {}),\n ...(typeof telemetryCorrelation.workflowRevisionId === \"string\"\n ? { workflowRevisionId: telemetryCorrelation.workflowRevisionId }\n : {}),\n ...(typeof contextMeta.userId === \"string\"\n ? { userId: contextMeta.userId }\n : {}),\n ...(typeof contextMeta.tenantId === \"string\"\n ? { tenantId: contextMeta.tenantId }\n : {}),\n },\n telemetry: {\n metadata: {\n ...(isRecord(telemetryConfig.metadata) ? telemetryConfig.metadata : {}),\n ...contextMeta,\n },\n tags: Array.isArray(telemetryConfig.tags)\n ? telemetryConfig.tags\n : undefined,\n captureContent: telemetryConfig.captureContent,\n input:\n typeof state.input === \"string\"\n ? state.input\n : JSON.stringify(state.input),\n },\n };\n const namespacesUsed = new Set<string>();\n const touchedNodes = new Set<string>();\n const structuredStreamIds = new Set<string>();\n const activePendingRequests = new Map<string, PendingRequestRecord>();\n const pendingRequestWrites: Promise<void>[] = [];\n\n // Announce session id to clients so they can persist it\n try {\n const sid = (config as any)?.session?.id as string | undefined;\n if (sid && typeof sid === \"string\") {\n write({ type: \"session\", sessionId: sid } as any);\n }\n } catch {}\n\n // Pending transition captured from runtime transition events.\n const pending: {\n to: string | null;\n payload: Record<string, unknown>;\n sourceNodeId: string | undefined;\n sourceWorkflowId: string | undefined;\n } = {\n to: null,\n payload: {},\n sourceNodeId: undefined,\n sourceWorkflowId: undefined,\n };\n\n // Bridge internal graph emits to our stream AND capture transitions\n let lastStatusMsg = \"\";\n let lastStatusAt = 0;\n let accumulatedOutput = \"\";\n let lastOutputSegmentId: string | undefined;\n const appendAccumulatedOutput = (\n payload: unknown,\n node: string,\n delta: string,\n ) => {\n const payloadObj = payload as {\n segmentId?: unknown;\n opId?: unknown;\n id?: unknown;\n };\n const opId =\n typeof payloadObj.opId === \"string\" && payloadObj.opId.length > 0\n ? payloadObj.opId\n : undefined;\n const segmentId =\n typeof payloadObj.segmentId === \"string\" &&\n payloadObj.segmentId.length > 0\n ? payloadObj.segmentId\n : undefined;\n const textStreamId =\n opId && segmentId\n ? `${opId}:${segmentId}`\n : segmentId ||\n opId ||\n (typeof payloadObj.id === \"string\" && payloadObj.id.length > 0\n ? payloadObj.id\n : undefined) ||\n node;\n\n if (\n textStreamId &&\n lastOutputSegmentId &&\n textStreamId !== lastOutputSegmentId &&\n accumulatedOutput.length > 0 &&\n !/\\s$/.test(accumulatedOutput) &&\n !/^\\s/.test(delta)\n ) {\n accumulatedOutput += \" \";\n }\n\n lastOutputSegmentId = textStreamId;\n accumulatedOutput += delta;\n if (!emitOutput) accumulatedOutput = accumulatedOutput.slice(0, 65536);\n };\n const nextStructuredStreamId = () => `${runId}:structured:${structuredSeq++}`;\n const runTraceEndArgs = () =>\n accumulatedOutput.length > 0\n ? { telemetry: { output: accumulatedOutput } }\n : undefined;\n\n // Capture interrupt payloads emitted by runtime hooks and forward them as\n // resumable interrupt chunks.\n interface HumanInputPayload {\n node?: string;\n workflow?: string;\n input?: {\n kind?: string;\n multiple?: boolean;\n question?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n meta?: Record<string, unknown>;\n options?: Array<{\n id: string;\n label: string;\n description?: string;\n value?: unknown;\n }>;\n };\n }\n // Track latest interrupt token for updating stored snapshot at end\n let pendingRecordToken: string | null = null;\n // Avoid emitting duplicate interrupt chunks in the same run.\n let wroteHumanInput = false;\n\n const pendingStore: PendingRequestStore | undefined =\n frameworkAdapter?.pendingRequests;\n const sealPendingSnapshots = async () => {\n if (budget) outcomeState.config.executionBudget = budget;\n if (response.closed) outcomeState.config.responseCompleted = true;\n if (typeof frameworkAdapter?.checkpointer?.getTuple !== \"function\") return;\n for (const [token, request] of activePendingRequests) {\n if (budget) request.state!.config.executionBudget = budget;\n if (response.closed) request.state!.config.responseCompleted = true;\n const graphSnapshot = await captureGraphSnapshot(\n frameworkAdapter.checkpointer,\n runId,\n request.graphCheckpointId,\n );\n if (graphSnapshot) {\n const sealed = { ...request, graphSnapshot, ready: true };\n activePendingRequests.set(token, sealed);\n await pendingStore?.update(token, {\n graphSnapshot,\n ready: true,\n state: request.state!,\n });\n }\n }\n };\n const pendingTtlMs = frameworkAdapter?.ttlMs ?? 15 * 60 * 1000;\n\n const persistAndEmitInterrupt = async (\n payload: HumanInputPayload,\n ): Promise<void> => {\n if (wroteHumanInput) return;\n\n const token = makeResumeToken();\n const requestId = makeRequestId(\"human\");\n pendingRecordToken = token;\n const input = payload.input ?? {};\n const optionsList = Array.isArray(input.options) ? input.options : [];\n const kind = input.kind || (input.multiple ? \"multi-choice\" : \"choice\");\n const isText = kind === \"text\";\n\n const record: PendingRequestRecord = {\n token,\n ready: false,\n responseCompleted: response.closed,\n requestId,\n sessionId,\n runId,\n workflow: payload.workflow || (currentState.currentWorkflow as string),\n node: payload.node || \"\",\n state: { ...(currentState as GraphState), awaitingHumanInput: true },\n schema: isText\n ? {\n kind: kind as any,\n multiple: Boolean(input.multiple),\n ...(input.question ? { question: input.question } : {}),\n ...(typeof input.id === \"string\" && input.id.length > 0\n ? { id: input.id }\n : {}),\n ...(typeof input.schemaId === \"string\" && input.schemaId.length > 0\n ? { schemaId: input.schemaId }\n : {}),\n ...(typeof input.schemaVersion === \"string\" &&\n input.schemaVersion.length > 0\n ? { schemaVersion: input.schemaVersion }\n : {}),\n ...(input.meta && typeof input.meta === \"object\"\n ? { meta: input.meta }\n : {}),\n }\n : {\n kind: kind as any,\n multiple: Boolean(input.multiple),\n question: String(input.question || \"Please choose an option.\"),\n ...(typeof input.id === \"string\" && input.id.length > 0\n ? { id: input.id }\n : {}),\n ...(typeof input.schemaId === \"string\" && input.schemaId.length > 0\n ? { schemaId: input.schemaId }\n : {}),\n ...(typeof input.schemaVersion === \"string\" &&\n input.schemaVersion.length > 0\n ? { schemaVersion: input.schemaVersion }\n : {}),\n ...(input.meta && typeof input.meta === \"object\"\n ? { meta: input.meta }\n : {}),\n },\n options: optionsList.map((option: any) => ({\n id: String(option.id),\n label: String(option.label),\n description:\n typeof option.description === \"string\"\n ? option.description\n : undefined,\n value: option.value,\n })),\n createdAt: Date.now(),\n ttlMs: pendingTtlMs,\n };\n activePendingRequests.set(record.token, record);\n\n if (pendingStore) {\n const savePromise = pendingStore.save(record).catch((error) => {\n // eslint-disable-next-line no-console\n outcomeError = error;\n console.error(\"[orchestrator] failed to save pending request\", error);\n });\n pendingRequestWrites.push(savePromise);\n }\n\n const clientMeta =\n record.schema.meta &&\n typeof record.schema.meta === \"object\" &&\n !Array.isArray(record.schema.meta)\n ? Object.fromEntries(\n Object.entries(record.schema.meta).filter(\n ([key]) => !key.startsWith(\"__kortyx\"),\n ),\n )\n : undefined;\n\n write({\n type: \"interrupt\",\n requestId: record.requestId,\n resumeToken: record.token,\n workflow: record.workflow,\n node: record.node,\n ...(typeof record.schema.id === \"string\" && record.schema.id.length > 0\n ? { id: record.schema.id }\n : {}),\n ...(typeof record.schema.schemaId === \"string\" &&\n record.schema.schemaId.length > 0\n ? { schemaId: record.schema.schemaId }\n : {}),\n ...(typeof record.schema.schemaVersion === \"string\" &&\n record.schema.schemaVersion.length > 0\n ? { schemaVersion: record.schema.schemaVersion }\n : {}),\n input: {\n kind: record.schema.kind,\n multiple: record.schema.multiple,\n question: record.schema.question,\n ...(typeof record.schema.id === \"string\" && record.schema.id.length > 0\n ? { id: record.schema.id }\n : {}),\n ...(typeof record.schema.schemaId === \"string\" &&\n record.schema.schemaId.length > 0\n ? { schemaId: record.schema.schemaId }\n : {}),\n ...(typeof record.schema.schemaVersion === \"string\" &&\n record.schema.schemaVersion.length > 0\n ? { schemaVersion: record.schema.schemaVersion }\n : {}),\n ...(clientMeta && Object.keys(clientMeta).length > 0\n ? { meta: clientMeta }\n : {}),\n options: record.options.map((option) => ({\n id: option.id,\n label: option.label,\n description: option.description,\n })),\n },\n } as any);\n emitTelemetryEvent({\n config,\n type: \"interrupt.created\",\n correlation: { nodeId: record.node },\n payload: {\n workflowCall: record.schema.meta?.workflowCall ?? null,\n workflowCallPath: record.schema.meta?.workflowCallPath ?? null,\n branchId: config.executionBranchId ?? runId,\n interruptId: record.requestId,\n responseCompleted: response.closed,\n requestId: record.requestId,\n kind: record.schema.kind,\n interactionMode:\n record.schema.kind === \"text\"\n ? \"freeform\"\n : record.options.length > 0\n ? \"static-options\"\n : record.schema.schemaId\n ? \"dynamic-picker\"\n : \"unknown\",\n ...(record.schema.schemaId ? { schemaId: record.schema.schemaId } : {}),\n ...(record.schema.schemaVersion\n ? { schemaVersion: record.schema.schemaVersion }\n : {}),\n ...(typeof record.schema.question === \"string\" &&\n shouldCaptureTelemetryContent(telemetryConfig.captureContent, \"output\")\n ? { question: record.schema.question }\n : {}),\n ...(shouldCaptureTelemetryContent(\n telemetryConfig.captureContent,\n \"output\",\n )\n ? {\n options: record.options.map((option) => ({\n id: option.id,\n label: option.label,\n ...(option.description\n ? { description: option.description }\n : {}),\n })),\n }\n : {}),\n optionCount: record.options.length,\n nodeId: record.node,\n expiresAt: new Date(record.createdAt + record.ttlMs).toISOString(),\n },\n flush: true,\n });\n wroteHumanInput = true;\n };\n\n const forwardEmit = (event: string, payload: unknown) => {\n if (event === \"error\") {\n const msg = String(\n (payload as { message?: unknown })?.message ?? \"Unexpected error\",\n );\n outcomeError = new Error(msg);\n write({ type: \"error\", message: msg });\n write({ type: \"done\" });\n finished = true;\n out.end();\n return;\n }\n if (event === \"status\") {\n if (!debugEnabled) return;\n const statusMessage = (\n payload as { message?: unknown } | null | undefined\n )?.message;\n const msg =\n statusMessage === null || statusMessage === undefined\n ? \"\"\n : String(statusMessage);\n const now = Date.now();\n if (msg && msg === lastStatusMsg && now - lastStatusAt < 250) return; // de-dupe rapid duplicates\n lastStatusMsg = msg;\n lastStatusAt = now;\n write({ type: \"status\", message: msg });\n return;\n }\n if (event === \"text-start\") {\n const node = (payload as { node?: string })?.node;\n if (!node) return;\n touchedNodes.add(node);\n write({\n type: \"text-start\",\n node,\n ...(typeof (payload as { id?: string }).id === \"string\"\n ? { id: (payload as { id?: string }).id }\n : {}),\n ...(typeof (payload as { opId?: string }).opId === \"string\"\n ? { opId: (payload as { opId?: string }).opId }\n : {}),\n ...(typeof (payload as { segmentId?: string }).segmentId === \"string\"\n ? { segmentId: (payload as { segmentId?: string }).segmentId }\n : {}),\n });\n return;\n }\n if (event === \"text-delta\") {\n const node = (payload as { node?: string })?.node;\n const delta = String((payload as { delta?: unknown })?.delta ?? \"\");\n if (!node || !delta) return;\n touchedNodes.add(node);\n appendAccumulatedOutput(payload, node, delta);\n write({\n type: \"text-delta\",\n delta,\n node,\n ...(typeof (payload as { id?: string }).id === \"string\"\n ? { id: (payload as { id?: string }).id }\n : {}),\n ...(typeof (payload as { opId?: string }).opId === \"string\"\n ? { opId: (payload as { opId?: string }).opId }\n : {}),\n ...(typeof (payload as { segmentId?: string }).segmentId === \"string\"\n ? { segmentId: (payload as { segmentId?: string }).segmentId }\n : {}),\n });\n return;\n }\n if (event === \"text-end\") {\n const node = (payload as { node?: string })?.node;\n if (!node) return;\n touchedNodes.add(node);\n write({\n type: \"text-end\",\n node,\n ...(typeof (payload as { id?: string }).id === \"string\"\n ? { id: (payload as { id?: string }).id }\n : {}),\n ...(typeof (payload as { opId?: string }).opId === \"string\"\n ? { opId: (payload as { opId?: string }).opId }\n : {}),\n ...(typeof (payload as { segmentId?: string }).segmentId === \"string\"\n ? { segmentId: (payload as { segmentId?: string }).segmentId }\n : {}),\n });\n return;\n }\n if (event === \"tool-call-start\") {\n const payloadObj = payload as {\n tool?: unknown;\n toolCallId?: unknown;\n node?: string;\n id?: string;\n opId?: string;\n input?: unknown;\n };\n if (\n typeof payloadObj.tool !== \"string\" ||\n typeof payloadObj.toolCallId !== \"string\"\n ) {\n return;\n }\n write({\n type: \"tool-call-start\",\n tool: payloadObj.tool,\n toolCallId: payloadObj.toolCallId,\n ...(payloadObj.node ? { node: payloadObj.node } : {}),\n ...(payloadObj.id ? { id: payloadObj.id } : {}),\n ...(payloadObj.opId ? { opId: payloadObj.opId } : {}),\n ...(payloadObj.input !== undefined ? { input: payloadObj.input } : {}),\n });\n if (payloadObj.node) touchedNodes.add(payloadObj.node);\n return;\n }\n if (event === \"tool-call-result\") {\n const payloadObj = payload as {\n tool?: unknown;\n toolCallId?: unknown;\n node?: string;\n id?: string;\n opId?: string;\n content?: unknown;\n structuredContent?: unknown;\n isError?: unknown;\n };\n if (\n typeof payloadObj.tool !== \"string\" ||\n typeof payloadObj.toolCallId !== \"string\"\n ) {\n return;\n }\n write({\n type: \"tool-call-result\",\n tool: payloadObj.tool,\n toolCallId: payloadObj.toolCallId,\n ...(payloadObj.node ? { node: payloadObj.node } : {}),\n ...(payloadObj.id ? { id: payloadObj.id } : {}),\n ...(payloadObj.opId ? { opId: payloadObj.opId } : {}),\n content: payloadObj.content,\n ...(payloadObj.structuredContent !== undefined\n ? { structuredContent: payloadObj.structuredContent }\n : {}),\n ...(typeof payloadObj.isError === \"boolean\"\n ? { isError: payloadObj.isError }\n : {}),\n });\n if (payloadObj.node) touchedNodes.add(payloadObj.node);\n return;\n }\n if (event === \"tool-call-error\") {\n const payloadObj = payload as {\n tool?: unknown;\n toolCallId?: unknown;\n node?: string;\n id?: string;\n opId?: string;\n message?: unknown;\n };\n if (\n typeof payloadObj.tool !== \"string\" ||\n typeof payloadObj.toolCallId !== \"string\"\n ) {\n return;\n }\n write({\n type: \"tool-call-error\",\n tool: payloadObj.tool,\n toolCallId: payloadObj.toolCallId,\n ...(payloadObj.node ? { node: payloadObj.node } : {}),\n ...(payloadObj.id ? { id: payloadObj.id } : {}),\n ...(payloadObj.opId ? { opId: payloadObj.opId } : {}),\n message: String(payloadObj.message ?? \"\"),\n });\n if (payloadObj.node) touchedNodes.add(payloadObj.node);\n return;\n }\n if (event === \"message\") {\n const node = (payload as { node?: string })?.node;\n const text = String((payload as { content?: unknown })?.content ?? \"\");\n if (node) touchedNodes.add(node);\n write({ type: \"message\", node, content: text });\n return;\n }\n if (event === \"structured_data\") {\n const payloadObj = payload as {\n streamId?: string;\n dataType?: string;\n kind?: string;\n schemaId?: string;\n schemaVersion?: string;\n id?: string;\n node?: string;\n path?: string;\n value?: unknown;\n items?: unknown[];\n delta?: string;\n data?: unknown;\n };\n const kind =\n payloadObj.kind === \"set\" ||\n payloadObj.kind === \"append\" ||\n payloadObj.kind === \"text-delta\" ||\n payloadObj.kind === \"final\"\n ? payloadObj.kind\n : \"final\";\n\n const streamId =\n typeof payloadObj.streamId === \"string\" && payloadObj.streamId\n ? payloadObj.streamId\n : nextStructuredStreamId();\n structuredStreamIds.add(streamId);\n if (payloadObj.node) touchedNodes.add(payloadObj.node);\n\n write({\n type: \"structured-data\",\n node: payloadObj.node,\n streamId,\n dataType:\n typeof payloadObj.dataType === \"string\" && payloadObj.dataType\n ? payloadObj.dataType\n : \"generic\",\n kind,\n ...(typeof payloadObj.schemaId === \"string\"\n ? { schemaId: payloadObj.schemaId }\n : {}),\n ...(typeof payloadObj.schemaVersion === \"string\"\n ? { schemaVersion: payloadObj.schemaVersion }\n : {}),\n ...(typeof payloadObj.id === \"string\" ? { id: payloadObj.id } : {}),\n ...(kind === \"set\"\n ? {\n path: String(payloadObj.path ?? \"\"),\n value: payloadObj.value,\n }\n : {}),\n ...(kind === \"append\"\n ? {\n path: String(payloadObj.path ?? \"\"),\n items: Array.isArray(payloadObj.items) ? payloadObj.items : [],\n }\n : {}),\n ...(kind === \"text-delta\"\n ? {\n path: String(payloadObj.path ?? \"\"),\n delta: String(payloadObj.delta ?? \"\"),\n }\n : {}),\n ...(kind === \"final\" ? { data: payloadObj.data } : {}),\n });\n return;\n }\n // legacy 'human_required' removed — dynamic interrupts are used instead\n if (event === \"transition\") {\n // 1) surface to the client (useful for dev tools)\n write({\n type: \"transition\",\n transitionTo: (payload as { transitionTo?: string })?.transitionTo,\n payload:\n (payload as { payload?: Record<string, unknown> })?.payload ?? {},\n });\n // 2) capture for orchestration\n pending.to = (payload as { transitionTo?: string })?.transitionTo ?? null;\n pending.payload =\n (payload as { payload?: Record<string, unknown> })?.payload ?? {};\n const transition = payload as { node?: unknown; workflow?: unknown };\n pending.sourceNodeId =\n typeof transition.node === \"string\" ? transition.node : undefined;\n pending.sourceWorkflowId =\n typeof transition.workflow === \"string\"\n ? transition.workflow\n : undefined;\n return;\n }\n if (event === \"interrupt\") {\n const p = payload as any;\n if (typeof p?.node === \"string\") touchedNodes.add(p.node);\n const local: HumanInputPayload = {\n node: p?.node,\n workflow: p?.workflow,\n input: p?.input,\n };\n void persistAndEmitInterrupt(local).catch((error) => {\n // eslint-disable-next-line no-console\n console.error(\"[orchestrator] failed to emit interrupt\", error);\n });\n return;\n }\n };\n\n const runLoop = async (runTraceSpan: TraceSpanLike) => {\n while (true) {\n throwIfExecutionAborted(abortSignal);\n let workflowFinalState: GraphState | null = null;\n let workflowFinalGraphCheckpointId: string | undefined;\n let sawWorkflowDone = false;\n let workflowDoneData: unknown;\n\n // Ensure the compiled graph uses our forwardEmit\n currentGraph.execution ??= {};\n currentGraph.execution.abortSignal = abortSignal;\n currentGraph.execution.budget = budget;\n currentGraph.execution.completeResponse = response.complete;\n currentGraph.config = currentGraph.config || {};\n currentGraph.config.emit = forwardEmit;\n currentGraph.config.executionRunId = runId;\n const threadId =\n ((currentGraph.config as any)?.session?.id as string | undefined) ||\n sessionId ||\n \"anonymous-session\";\n const checkpointNs = \"\";\n namespacesUsed.add(checkpointNs);\n const readLatestGraphCheckpointId = async (): Promise<\n string | undefined\n > => {\n const checkpointer = (currentGraph.config as any)?.checkpointer as\n | {\n getLatestCheckpointId?: (\n threadId: string,\n checkpointNs?: string,\n ) => Promise<string | undefined>;\n }\n | undefined;\n return checkpointer?.getLatestCheckpointId?.(runId, checkpointNs);\n };\n const readLatestGraphSnapshot =\n async (): Promise<GraphSnapshot | null> => {\n if (typeof currentGraph.getState !== \"function\") {\n const checkpointId = await readLatestGraphCheckpointId();\n return checkpointId ? { state: currentState, checkpointId } : null;\n }\n const snapshot = await currentGraph.getState({\n configurable: {\n thread_id: runId,\n checkpoint_ns: checkpointNs,\n },\n });\n const values =\n isRecord(snapshot) && \"values\" in snapshot\n ? snapshot.values\n : snapshot;\n const checkpointId =\n getGraphCheckpointId(snapshot) ??\n (await readLatestGraphCheckpointId());\n /* v8 ignore next -- snapshot shape branches are covered above; v8 reports a synthetic negative branch for this type guard. */\n if (!isGraphState(values)) {\n return checkpointId ? { state: currentState, checkpointId } : null;\n }\n return {\n state: values,\n ...(checkpointId ? { checkpointId } : {}),\n };\n };\n if (debugEnabled) {\n write({\n type: \"status\",\n message: `🧵 thread_id=${threadId} run_id=${runId} workflow=${currentState.currentWorkflow}`,\n });\n }\n\n // Stream runtime events (LLM deltas, node starts/ends, etc.)\n const isResume = Boolean((currentGraph.config as any)?.resume);\n // For static breakpoints, resume with null input; if a resumeUpdate was provided,\n // use Command({ update }) to merge selection into state at resume time.\n const resumeUpdate = (currentGraph.config as any)?.resumeUpdate as\n | Record<string, unknown>\n | undefined;\n const resumeValue = (currentGraph.config as any)?.resumeValue as\n | unknown\n | undefined;\n const resumeCheckpointId = (currentGraph.config as any)\n ?.resumeCheckpointId as string | undefined;\n const invokeState = isResume\n ? resumeValue !== undefined && resumeUpdate\n ? (new Command({ resume: resumeValue, update: resumeUpdate }) as any)\n : resumeValue !== undefined\n ? (new Command({ resume: resumeValue }) as any)\n : resumeUpdate\n ? (new Command({ update: resumeUpdate }) as any)\n : (null as any)\n : (currentState as any);\n const runtimeStream = currentGraph.streamEvents(invokeState, {\n version: \"v2\",\n configurable: {\n thread_id: runId,\n checkpoint_ns: checkpointNs,\n ...(isResume && resumeCheckpointId\n ? { checkpoint_id: resumeCheckpointId }\n : {}),\n },\n });\n\n if (debugEnabled) {\n write({\n type: \"status\",\n message: `▶️ streamEvents invoke: resume=${Boolean((currentGraph.config as any)?.resume)} thread_id=${threadId} run_id=${runId} ns=${String(currentState.currentWorkflow || \"default\")}`,\n } as any);\n }\n\n // Observe engine state independently of UI chunks or their consumers.\n const observedStream = (async function* () {\n for await (const event of runtimeStream) {\n const raw = event as {\n event?: string;\n name?: string;\n data?: { output?: unknown };\n };\n if (\n (raw.event === \"on_chain_end\" || raw.event === \"on_graph_end\") &&\n !raw.name?.startsWith(\"ChannelWrite\") &&\n isGraphState(raw.data?.output)\n ) {\n outcomeState = raw.data.output;\n }\n yield event;\n }\n })();\n const uiStream = transformGraphStreamForUI(observedStream as any, {\n debug: debugEnabled,\n emitStatus: debugEnabled,\n });\n\n if (!emitOutput) {\n for await (const _event of observedStream) {\n if (finished) break;\n }\n sawWorkflowDone = true;\n workflowDoneData = outcomeState;\n }\n for await (const chunk of (emitOutput\n ? uiStream\n : []) as AsyncIterable<StreamChunk>) {\n if (finished) break;\n if (\"node\" in chunk && typeof chunk.node === \"string\") {\n touchedNodes.add(chunk.node);\n }\n\n if (chunk.type === \"done\") {\n sawWorkflowDone = true;\n workflowDoneData = chunk.data;\n continue;\n }\n\n write(chunk);\n }\n\n if (finished) {\n runTraceSpan.fail?.(outcomeError);\n return;\n }\n\n if (sawWorkflowDone) {\n const graphSnapshot = await readLatestGraphSnapshot();\n workflowFinalGraphCheckpointId = graphSnapshot?.checkpointId;\n workflowFinalState = isGraphState(workflowDoneData)\n ? workflowDoneData\n : (graphSnapshot?.state ?? currentState);\n }\n\n throwIfExecutionAborted(abortSignal);\n const transitionTo = pending.to;\n const transitionPayload = pending.payload;\n const sourceNodeId = pending.sourceNodeId;\n const sourceWorkflowId = pending.sourceWorkflowId;\n\n // Reset pending so we don't carry it accidentally\n pending.to = null;\n pending.payload = {};\n pending.sourceNodeId = undefined;\n pending.sourceWorkflowId = undefined;\n\n if (transitionTo) {\n // 🔁 Handoff to the next workflow\n try {\n const nextWorkflow = await selectWorkflow(transitionTo);\n const sourceTelemetry = isRecord(config.telemetry)\n ? config.telemetry\n : {};\n config = prepareWorkflowTelemetry({\n config,\n workflow: nextWorkflow,\n runId,\n sessionId,\n knownWorkflowIds,\n });\n const targetTelemetry = isRecord(config.telemetry)\n ? config.telemetry\n : {};\n emitTelemetryEvent({\n config,\n type: \"workflow.transitioned\",\n ...(sourceNodeId ? { correlation: { nodeId: sourceNodeId } } : {}),\n payload: {\n sourceNodeId: sourceNodeId ?? \"\",\n sourceWorkflowId:\n sourceWorkflowId ?? String(currentState.currentWorkflow),\n ...(typeof sourceTelemetry.correlation === \"object\" &&\n sourceTelemetry.correlation &&\n typeof (sourceTelemetry.correlation as Record<string, unknown>)\n .workflowRevisionId === \"string\"\n ? {\n sourceWorkflowRevisionId: (\n sourceTelemetry.correlation as Record<string, unknown>\n ).workflowRevisionId,\n }\n : {}),\n targetWorkflowId: transitionTo,\n ...(typeof targetTelemetry.correlation === \"object\" &&\n targetTelemetry.correlation &&\n typeof (targetTelemetry.correlation as Record<string, unknown>)\n .workflowRevisionId === \"string\"\n ? {\n targetWorkflowRevisionId: (\n targetTelemetry.correlation as Record<string, unknown>\n ).workflowRevisionId,\n }\n : {}),\n },\n });\n // Resume controls belong only to the graph restored from the checkpoint.\n delete config.resume;\n delete config.resumeValue;\n delete config.resumeUpdate;\n delete config.resumeCheckpointId;\n const nextGraph = await createExecutionGraph(nextWorkflow, {\n ...(config as Record<string, unknown>),\n emit: forwardEmit, // keep forwarding emits\n });\n\n // Merge data: prefer the final state's data if present, then add transition payload\n const mergedData = {\n ...(workflowFinalState?.data ?? currentState.data ?? {}),\n ...transitionPayload,\n };\n\n const rawInputFromPayload = (\n transitionPayload as {\n rawInput?: unknown;\n }\n )?.rawInput;\n const rawNextInput =\n typeof rawInputFromPayload === \"string\"\n ? rawInputFromPayload\n : currentState.input;\n\n currentState = {\n ...currentState,\n runtime: workflowFinalState?.runtime ?? currentState.runtime,\n currentWorkflow: transitionTo as WorkflowId,\n config,\n input: nextWorkflow.inputSchema\n ? parseExecutionInput(nextWorkflow, rawNextInput)\n : rawNextInput,\n data: mergedData,\n ui: {}, // reset UI layer on new graph\n };\n\n currentGraph = nextGraph;\n continue; // run the next graph\n } catch (err) {\n throwIfExecutionAborted(abortSignal);\n if (isExecutionCancelled(err)) throw err;\n outcomeError = err;\n runTraceSpan.fail?.(err);\n runTraceSpan.addEvent?.(\"kortyx.transition.error\", {\n transitionTo,\n });\n write({\n type: \"error\",\n message: `Transition failed to '${transitionTo}': ${\n err instanceof Error ? err.message : String(err)\n }`,\n });\n write({ type: \"done\" });\n out.end();\n return;\n }\n }\n\n // No transition → either graph returned done or ended naturally\n if (workflowFinalState) {\n // If we paused for an interrupt, persist a pending request and emit an interrupt chunk\n // Attach final state to pending record if we have one\n if (workflowFinalState && pendingRecordToken) {\n if (pendingRequestWrites.length > 0) {\n await Promise.all(pendingRequestWrites);\n }\n if (pendingStore) {\n await pendingStore.update(pendingRecordToken, {\n state: workflowFinalState,\n ...(workflowFinalGraphCheckpointId\n ? { graphCheckpointId: workflowFinalGraphCheckpointId }\n : {}),\n });\n }\n const pendingRequest = activePendingRequests.get(pendingRecordToken);\n /* v8 ignore next -- pendingRecordToken is assigned only after the active request is inserted. */\n if (pendingRequest) {\n activePendingRequests.set(pendingRecordToken, {\n ...pendingRequest,\n state: workflowFinalState,\n ...(workflowFinalGraphCheckpointId\n ? { graphCheckpointId: workflowFinalGraphCheckpointId }\n : {}),\n });\n }\n }\n /* v8 ignore next -- pending writes are created only by interrupt persistence, which also sets pendingRecordToken. */\n if (!pendingRecordToken && pendingRequestWrites.length > 0) {\n await Promise.all(pendingRequestWrites);\n }\n\n const shouldKeepFrameworkState =\n Boolean(pendingRecordToken) ||\n Boolean((workflowFinalState as any)?.awaitingHumanInput);\n if (!shouldKeepFrameworkState) {\n workflowFinalState = await validateExecutionOutput(\n workflowFinalState,\n selectWorkflow,\n );\n // Best-effort cleanup: completed runs don't need to retain checkpoints.\n try {\n if (frameworkAdapter?.cleanupRun) {\n await frameworkAdapter.cleanupRun(\n runId,\n Array.from(namespacesUsed),\n );\n } else {\n const cp = (currentGraph.config as any)\n ?.checkpointer as unknown as {\n deleteThread?: (id: string) => any;\n };\n if (cp?.deleteThread) {\n await cp.deleteThread(runId);\n }\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\"[orchestrator] framework cleanup failed\", e);\n }\n }\n\n outcomeState = workflowFinalState;\n if (!emitOutput && !shouldKeepFrameworkState)\n accumulatedOutput = JSON.stringify(workflowFinalState.data).slice(\n 0,\n 65536,\n );\n finished = true;\n runTraceSpan.setAttributes?.({\n \"kortyx.run.awaiting_human_input\": shouldKeepFrameworkState,\n \"kortyx.run.final_workflow\": String(currentState.currentWorkflow),\n });\n runTraceSpan.end?.(runTraceEndArgs());\n const resolvedSessionId =\n ((config as any)?.session?.id as string | undefined) ||\n sessionId ||\n \"\";\n await sealPendingSnapshots();\n if (\n !response.closed &&\n resolvedSessionId &&\n frameworkAdapter?.sessionCheckpoints\n ) {\n try {\n const checkpoint = await frameworkAdapter.sessionCheckpoints.append(\n {\n sessionId: resolvedSessionId,\n runId,\n ...(workflowFinalGraphCheckpointId\n ? { graphCheckpointId: workflowFinalGraphCheckpointId }\n : {}),\n workflow: String(workflowFinalState.currentWorkflow),\n state: workflowFinalState,\n nodes: Array.from(touchedNodes),\n structuredStreamIds: Array.from(structuredStreamIds),\n pendingRequests: Array.from(activePendingRequests.values()),\n },\n );\n sessionCheckpointId = checkpoint.id;\n write({\n type: \"checkpoint\",\n id: checkpoint.id,\n sessionId: checkpoint.sessionId,\n turnIndex: checkpoint.turnIndex,\n ...(checkpoint.label ? { label: checkpoint.label } : {}),\n } as StreamChunk);\n emitTelemetryEvent({\n config,\n type: \"session.checkpointed\",\n payload: {\n checkpointId: checkpoint.id,\n turnIndex: checkpoint.turnIndex,\n ...(checkpoint.parentCheckpointId\n ? { parentCheckpointId: checkpoint.parentCheckpointId }\n : {}),\n nodes: checkpoint.nodes,\n },\n });\n } catch (error) {\n // eslint-disable-next-line no-console\n outcomeError = error;\n console.error(\"[orchestrator] session checkpoint failed\", error);\n }\n }\n write({ type: \"done\", data: workflowFinalState } as any);\n out.end();\n return;\n }\n\n // Natural end with no explicit \"done\" (defensive close)\n const naturalGraphSnapshot = await readLatestGraphSnapshot();\n let naturalFinalState = naturalGraphSnapshot?.state ?? currentState;\n if (!pendingRecordToken && !naturalFinalState.awaitingHumanInput) {\n naturalFinalState = await validateExecutionOutput(\n naturalFinalState,\n selectWorkflow,\n );\n }\n outcomeState = naturalFinalState;\n if (pendingRequestWrites.length > 0) {\n await Promise.all(pendingRequestWrites);\n }\n if (pendingRecordToken && naturalGraphSnapshot?.checkpointId) {\n if (pendingStore) {\n await pendingStore.update(pendingRecordToken, {\n state: naturalFinalState,\n graphCheckpointId: naturalGraphSnapshot.checkpointId,\n });\n }\n const pendingRequest = activePendingRequests.get(pendingRecordToken);\n /* v8 ignore next -- pendingRecordToken is assigned only after the active request is inserted. */\n if (pendingRequest) {\n activePendingRequests.set(pendingRecordToken, {\n ...pendingRequest,\n state: naturalFinalState,\n graphCheckpointId: naturalGraphSnapshot.checkpointId,\n });\n }\n }\n const resolvedSessionId =\n ((config as any)?.session?.id as string | undefined) || sessionId || \"\";\n await sealPendingSnapshots();\n if (\n !response.closed &&\n resolvedSessionId &&\n frameworkAdapter?.sessionCheckpoints\n ) {\n try {\n const checkpoint = await frameworkAdapter.sessionCheckpoints.append({\n sessionId: resolvedSessionId,\n runId,\n ...(naturalGraphSnapshot?.checkpointId\n ? { graphCheckpointId: naturalGraphSnapshot.checkpointId }\n : {}),\n workflow: String(naturalFinalState.currentWorkflow),\n state: naturalFinalState,\n nodes: Array.from(touchedNodes),\n structuredStreamIds: Array.from(structuredStreamIds),\n pendingRequests: Array.from(activePendingRequests.values()),\n });\n sessionCheckpointId = checkpoint.id;\n write({\n type: \"checkpoint\",\n id: checkpoint.id,\n sessionId: checkpoint.sessionId,\n turnIndex: checkpoint.turnIndex,\n ...(checkpoint.label ? { label: checkpoint.label } : {}),\n } as StreamChunk);\n emitTelemetryEvent({\n config,\n type: \"session.checkpointed\",\n payload: {\n checkpointId: checkpoint.id,\n turnIndex: checkpoint.turnIndex,\n ...(checkpoint.parentCheckpointId\n ? { parentCheckpointId: checkpoint.parentCheckpointId }\n : {}),\n nodes: checkpoint.nodes,\n },\n });\n } catch (error) {\n // eslint-disable-next-line no-console\n outcomeError = error;\n console.error(\"[orchestrator] session checkpoint failed\", error);\n }\n }\n runTraceSpan.setAttributes?.({\n \"kortyx.run.final_workflow\": String(naturalFinalState.currentWorkflow),\n });\n finished = true;\n runTraceSpan.end?.(runTraceEndArgs());\n write({ type: \"done\", data: naturalFinalState } as any);\n out.end();\n return;\n }\n };\n\n const emitTraceChunk = () => {\n const traceContext = traceAdapter?.getActiveContext?.();\n if (!traceContext) return;\n\n write({\n type: \"trace\",\n traceId: traceContext.traceId,\n spanId: traceContext.spanId,\n runId,\n rootSpanName: \"kortyx.run\",\n } satisfies StreamChunk);\n };\n\n const fallbackRunSpan = traceAdapter?.withSpan\n ? undefined\n : traceAdapter?.startSpan?.(runSpanArgs);\n if (!traceAdapter?.withSpan) {\n emitTraceChunk();\n }\n const runPromise = traceAdapter?.withSpan\n ? traceAdapter.withSpan(runSpanArgs, (runTraceSpan) => {\n emitTraceChunk();\n return runLoop(runTraceSpan);\n })\n : runLoop(fallbackRunSpan ?? {});\n\n const finishCancelled = async () => {\n emitTelemetryEvent({\n config,\n type: \"run.cancelled\",\n correlation: { runId, workflowId: outcomeState.currentWorkflow },\n payload: { reason: \"execution_aborted\" },\n flush: true,\n });\n await Promise.allSettled(pendingRequestWrites);\n await Promise.allSettled(\n [...activePendingRequests.keys()].map((token) =>\n pendingStore?.delete(token),\n ),\n );\n activePendingRequests.clear();\n try {\n await frameworkAdapter?.cleanupRun?.(runId, [...namespacesUsed]);\n } catch (cleanupError) {\n console.error(\"[cancel:cleanupRun]\", cleanupError);\n }\n outcomeError = createExecutionCancelledError();\n fallbackRunSpan?.setAttributes?.({ \"kortyx.run.cancelled\": true });\n fallbackRunSpan?.end?.();\n write({ type: \"cancelled\", runId, reason: \"Execution cancelled.\" });\n write({ type: \"done\" });\n finished = true;\n out.end();\n };\n\n const completion = runPromise\n .catch(async (err) => {\n if (abortSignal?.aborted || isExecutionCancelled(err)) {\n await finishCancelled();\n return;\n }\n if (isExecutionLimitReached(err)) {\n try {\n const snapshot =\n frameworkAdapter &&\n (await captureGraphSnapshot(frameworkAdapter.checkpointer, runId));\n throwIfExecutionAborted(abortSignal);\n if (!snapshot)\n throw new Error(\n \"Execution limit reached without a resumable checkpoint.\",\n );\n const savedState = snapshot.checkpoint\n .channel_values as unknown as GraphState;\n const pausedState: GraphState = {\n ...savedState,\n config: {\n ...savedState.config,\n ...config,\n executionBudget: budget,\n },\n awaitingHumanInput: true,\n };\n // Preserve hook checkpoints, including completed and pending tool rounds.\n const patch = (\n err as unknown as {\n __kortyxHookStatePatch?: Record<string, unknown>;\n }\n ).__kortyxHookStatePatch;\n currentState = pausedState;\n outcomeState = pausedState;\n const limitReached = err.limitReached;\n write({ type: \"limit-reached\", runId, ...limitReached });\n emitTelemetryEvent({\n config,\n type: \"run.limit_reached\",\n payload: limitReached,\n });\n await persistAndEmitInterrupt({\n node: String(\n (err as unknown as { nodeId?: string }).nodeId ??\n savedState.lastNode,\n ),\n workflow: String(savedState.currentWorkflow),\n input: {\n kind: \"choice\",\n question: \"Limit reached — Continue?\",\n options: [{ id: \"continue\", label: \"Continue\" }],\n meta: {\n __kortyxExecutionLimit: true,\n executionLimit: limitReached,\n ...(patch ? { __kortyxResumeStatePatch: patch } : {}),\n },\n },\n });\n await Promise.all(pendingRequestWrites);\n throwIfExecutionAborted(abortSignal);\n if (outcomeError) throw outcomeError;\n const request = activePendingRequests.get(pendingRecordToken!)!;\n const sealed = {\n ...request,\n state: pausedState,\n graphCheckpointId: snapshot.checkpoint.id,\n graphSnapshot: snapshot,\n ready: true,\n };\n activePendingRequests.set(request.token, sealed);\n await pendingStore?.update(request.token, sealed);\n if (response.closed) pausedState.config.responseCompleted = true;\n if (!response.closed) {\n const checkpoint =\n await frameworkAdapter!.sessionCheckpoints.append({\n sessionId: sessionId!,\n runId,\n graphCheckpointId: snapshot.checkpoint.id,\n workflow: String(pausedState.currentWorkflow),\n state: pausedState,\n nodes: Array.from(touchedNodes),\n structuredStreamIds: Array.from(structuredStreamIds),\n pendingRequests: [sealed],\n label: \"Execution limit reached\",\n });\n throwIfExecutionAborted(abortSignal);\n sessionCheckpointId = checkpoint.id;\n write({\n type: \"checkpoint\",\n id: checkpoint.id,\n sessionId: checkpoint.sessionId,\n turnIndex: checkpoint.turnIndex,\n label: checkpoint.label,\n });\n emitTelemetryEvent({\n config,\n type: \"session.checkpointed\",\n payload: {\n checkpointId: checkpoint.id,\n turnIndex: checkpoint.turnIndex,\n nodes: checkpoint.nodes,\n },\n });\n }\n fallbackRunSpan?.setAttributes?.({\n \"kortyx.run.awaiting_human_input\": true,\n \"kortyx.run.limit_reached\": limitReached.limit,\n });\n fallbackRunSpan?.end?.();\n finished = true;\n write({ type: \"done\" });\n out.end();\n return;\n } catch (pauseError) {\n if (abortSignal?.aborted || isExecutionCancelled(pauseError)) {\n await finishCancelled();\n return;\n }\n await Promise.allSettled(\n [...activePendingRequests.keys()].map((token) =>\n pendingStore?.delete(token),\n ),\n );\n activePendingRequests.clear();\n err = pauseError;\n }\n }\n outcomeError = err;\n fallbackRunSpan?.fail?.(err);\n emitResumeFailure(err);\n console.error(\"[error:orchestrateGraphStream]\", err);\n write({\n type: \"error\",\n message: err instanceof Error ? err.message : String(err),\n });\n write({ type: \"done\" });\n finished = true;\n out.end();\n })\n .finally(() => {\n response.dispose();\n onOutcome?.({\n state: outcomeState,\n pending: pendingRecordToken\n ? activePendingRequests.get(pendingRecordToken)\n : undefined,\n checkpointId: sessionCheckpointId,\n ...(outcomeError ? { error: outcomeError } : {}),\n });\n });\n\n onExecution?.(completion);\n if (response.closed) out.end();\n return out;\n}\n","import type { GraphState, WorkflowDefinition } from \"@kortyx/core\";\nimport { z } from \"zod\";\nimport type { SelectWorkflowFn } from \"../orchestrator\";\nimport { ExecutionRequestError } from \"./types\";\n\nexport async function resolveExecutionWorkflow(\n select: SelectWorkflowFn,\n reference: WorkflowDefinition | string,\n): Promise<WorkflowDefinition> {\n const id = typeof reference === \"string\" ? reference : reference.id;\n let workflow: WorkflowDefinition;\n try {\n workflow = await select(id);\n } catch {\n throw new ExecutionRequestError(\n \"UNKNOWN_WORKFLOW\",\n `Workflow '${id}' is not registered.`,\n );\n }\n if (workflow.id !== id)\n throw new ExecutionRequestError(\n \"UNKNOWN_WORKFLOW\",\n `Workflow '${id}' is not registered.`,\n );\n if (!workflow.inputSchema || !workflow.outputSchema)\n throw new ExecutionRequestError(\n \"MISSING_CONTRACT\",\n `Workflow '${id}' requires inputSchema and outputSchema.`,\n );\n if (\n typeof reference !== \"string\" &&\n (reference.version !== workflow.version ||\n reference.inputSchema !== workflow.inputSchema ||\n reference.outputSchema !== workflow.outputSchema)\n )\n throw new ExecutionRequestError(\n \"CONTRACT_MISMATCH\",\n \"The typed workflow contract does not match the registered definition.\",\n );\n return workflow;\n}\n\nexport function parseExecutionInput(\n workflow: WorkflowDefinition,\n input: unknown,\n): unknown {\n try {\n z.json().parse(input);\n const parsed = workflow.inputSchema\n ? workflow.inputSchema.parse(input)\n : input;\n z.json().parse(parsed);\n return parsed;\n } catch (error) {\n throw new ExecutionRequestError(\n \"INVALID_INPUT\",\n error instanceof Error ? error.message : String(error),\n );\n }\n}\n\n/** Validate the terminal workflow and entry contract, applying each schema once. */\nexport async function validateExecutionOutput(\n state: GraphState,\n select: SelectWorkflowFn,\n): Promise<GraphState> {\n if (!state.config?.executionContract) return state;\n const terminal = await select(String(state.currentWorkflow));\n const contract = state.config.executionContract as {\n id: string;\n version: string;\n };\n const root = await select(contract.id);\n if (root.id !== contract.id || root.version !== contract.version)\n throw new Error(\"The root workflow changed since execution started.\");\n let data = state.data ?? {};\n try {\n for (const schema of new Set([terminal.outputSchema, root.outputSchema])) {\n if (schema) data = schema.parse(data);\n }\n if (terminal.outputSchema || root.outputSchema) z.json().parse(data);\n } catch (error) {\n const failure = new Error(\n `Workflow output validation failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n Object.assign(failure, { code: \"INVALID_OUTPUT\" });\n throw failure;\n }\n return { ...state, data };\n}\n","import type {\n ExecutionLimitReached,\n ExecutionLimits,\n TokenUsage,\n WorkflowDefinition,\n} from \"@kortyx/core\";\nimport type { PendingRequestRecord } from \"@kortyx/runtime\";\nimport type { z } from \"zod\";\n\nexport type ExecutableWorkflow = WorkflowDefinition & {\n inputSchema: z.ZodType;\n outputSchema: z.ZodType<Record<string, unknown>>;\n};\n\n/** Serializable identity of a waiting request. Treat tokens as private credentials. */\nexport type ResumeHandle = {\n token: string;\n requestId: string;\n sessionId: string;\n runId: string;\n};\n\nexport type ResumeResponse =\n | { type: \"text\"; text: string }\n | { type: \"select\"; ids: string[] }\n | { type: \"cancel\" };\n\nexport type ExecutionInterrupt = {\n workflow: string;\n node: string;\n input: PendingRequestRecord[\"schema\"] & {\n options: Array<{\n id: string;\n label: string;\n description?: string | undefined;\n }>;\n };\n};\n\nexport type ExecutionInfo = {\n runId: string;\n sessionId: string;\n checkpointId?: string;\n usage?: TokenUsage;\n};\n\nexport type ExecutionResult<T = Record<string, unknown>> = ExecutionInfo &\n (\n | { status: \"completed\"; data: T }\n | {\n status: \"suspended\";\n reason?: \"limit_reached\";\n limit?: ExecutionLimitReached;\n interrupt: ExecutionInterrupt;\n resume: ResumeHandle;\n }\n | { status: \"cancelled\"; reason: string }\n | { status: \"failed\"; error: { code: string; message: string } }\n );\n\nexport type ExecuteOptions<W extends ExecutableWorkflow> = {\n limits?: ExecutionLimits;\n abortSignal?: AbortSignal;\n workflow: W;\n input: z.input<W[\"inputSchema\"]>;\n sessionId?: string;\n context?: Record<string, unknown>;\n};\nexport type ResumeOptions<W extends ExecutableWorkflow> = {\n limits?: ExecutionLimits;\n abortSignal?: AbortSignal;\n workflow: W;\n resume: ResumeHandle;\n response: ResumeResponse;\n};\n\n/** The command was rejected before starting work or claiming an interrupt. */\nexport class ExecutionRequestError extends Error {\n override name = \"ExecutionRequestError\";\n constructor(\n public readonly code: string,\n message: string,\n ) {\n super(message);\n }\n}\n","import type { GraphState } from \"@kortyx/core\";\nimport { throwIfExecutionAborted } from \"@kortyx/core\";\nimport type { CompleteResponseOptions } from \"@kortyx/hooks\";\n\n/** Request cancellation is detachable; execution cancellation remains live. */\nexport function createResponseLifecycle(args: {\n enabled: boolean;\n restored: boolean;\n requestSignal?: AbortSignal | undefined;\n executionSignal?: AbortSignal | undefined;\n onClosed: () => void;\n finalize: (\n options: CompleteResponseOptions,\n state: GraphState,\n ) => Promise<void>;\n}): {\n readonly closed: boolean;\n signal: AbortSignal;\n disconnect(): void;\n dispose(): void;\n complete(options: CompleteResponseOptions, state: GraphState): Promise<void>;\n} {\n const controller = new AbortController();\n let closed = args.restored;\n let completing: Promise<void> | undefined;\n const abort = () => controller.abort();\n const detachRequest = () =>\n args.requestSignal?.removeEventListener(\"abort\", abort);\n if (!closed) {\n args.requestSignal?.addEventListener(\"abort\", abort, { once: true });\n if (args.requestSignal?.aborted) abort();\n }\n args.executionSignal?.addEventListener(\"abort\", abort, { once: true });\n if (args.executionSignal?.aborted) abort();\n return {\n get closed() {\n return closed;\n },\n signal: controller.signal,\n disconnect() {\n if (!closed) abort();\n },\n dispose() {\n detachRequest();\n args.executionSignal?.removeEventListener(\"abort\", abort);\n },\n complete(\n options: CompleteResponseOptions,\n state: GraphState,\n ): Promise<void> {\n if (!args.enabled || closed) return Promise.resolve();\n completing ??= (async () => {\n throwIfExecutionAborted(controller.signal);\n await args.finalize(options, state);\n throwIfExecutionAborted(controller.signal);\n closed = true;\n detachRequest();\n args.onClosed();\n })();\n return completing;\n },\n };\n}\n","import type { StreamChunk } from \"@kortyx/stream\";\nimport type { StreamEvent } from \"@langchain/core/tracers/log_stream\";\n\ninterface TransformOptions {\n debug?: boolean;\n emitStatus?: boolean;\n}\n\nconst isGraphStateOutput = (value: unknown): value is Record<string, unknown> =>\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n \"currentWorkflow\" in value;\n\n/**\n * Transforms runtime stream events into standardized UI chunks.\n * Runtime emits (`message`, `structured_data`, `interrupt`, `transition`) are\n * forwarded directly by the orchestrator, so this transformer only handles\n * graph lifecycle + completion signals.\n */\nexport async function* transformGraphStreamForUI(\n stream: AsyncIterable<StreamEvent>,\n options: TransformOptions = {},\n): AsyncGenerator<StreamChunk> {\n const { debug = false, emitStatus = debug } = options;\n const startedNodes = new Set<string>();\n const endedNodes = new Set<string>();\n let latestGraphState: Record<string, unknown> | null = null;\n\n for await (const event of stream) {\n const { event: type, name, data } = event ?? {};\n if (debug) console.log(`[debug:event]`, JSON.stringify(event, null, 2));\n\n switch (type) {\n case \"on_chain_start\":\n if (name && !name.startsWith(\"ChannelWrite\")) {\n if (name === \"__start__\" || name === \"__end__\") break;\n if (startedNodes.has(name)) break; // de-dupe\n startedNodes.add(name);\n if (debug) console.log(`[debug:start] node=${name}`);\n if (emitStatus) {\n yield { type: \"status\", message: `Processing node: ${name}` };\n }\n }\n break;\n\n case \"on_chain_end\": {\n const nodeName = name;\n const output = data?.output;\n if (debug)\n console.log(\n `[debug:on_chain_end:${nodeName}] output=`,\n JSON.stringify(output, null, 2),\n );\n if (!output || nodeName?.startsWith(\"ChannelWrite\")) break;\n if (isGraphStateOutput(output)) latestGraphState = output;\n\n // Emit a simple completion status for UI progress feedback (de-dupe + skip internal nodes)\n if (nodeName !== \"__start__\" && nodeName !== \"__end__\") {\n if (!endedNodes.has(nodeName)) {\n if (emitStatus) {\n yield {\n type: \"status\",\n message: `✅ Completed node: ${nodeName}`,\n };\n }\n endedNodes.add(nodeName);\n }\n }\n break;\n }\n\n case \"on_graph_end\": {\n if (debug)\n console.log(`[debug:on_graph_end]`, JSON.stringify(data, null, 2));\n const output = (data as any)?.output;\n yield {\n type: \"done\",\n data: isGraphStateOutput(output) ? output : latestGraphState,\n };\n break;\n }\n\n default:\n if (debug) {\n console.warn(`[debug:unknown_event]`, type);\n }\n break;\n }\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n KortyxTelemetryConfig,\n KortyxTelemetryEvent,\n KortyxTelemetryEventType,\n} from \"@kortyx/hooks\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst createId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nexport const shouldCaptureTelemetryContent = (\n value: unknown,\n side: \"input\" | \"output\",\n): boolean => {\n if (value === true) return true;\n return Boolean(\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n (value as Record<string, unknown>)[side] === true,\n );\n};\n\n/** Emits a lifecycle fact only when the application configured telemetry. */\nexport const emitTelemetryEvent = (args: {\n config: Record<string, unknown>;\n type: KortyxTelemetryEventType;\n payload: Record<string, unknown>;\n correlation?: Partial<KortyxTelemetryEvent[\"correlation\"]> | undefined;\n flush?: boolean | undefined;\n}): void => {\n const telemetry = isRecord(args.config.telemetry)\n ? (args.config.telemetry as KortyxTelemetryConfig)\n : undefined;\n const base = telemetry?.correlation;\n const runId = args.correlation?.runId ?? base?.runId;\n const workflowId = args.correlation?.workflowId ?? base?.workflowId;\n if (\n !telemetry?.reporter ||\n !telemetry.environment ||\n !telemetry.service ||\n !runId ||\n !workflowId\n ) {\n return;\n }\n const context = isRecord(args.config.context) ? args.config.context : {};\n const event: KortyxTelemetryEvent = {\n schemaVersion: 1,\n eventId: createId(),\n occurredAt: new Date().toISOString(),\n environment: telemetry.environment,\n service: telemetry.service,\n correlation: {\n runId,\n workflowId,\n ...(base?.sessionId ? { sessionId: base.sessionId } : {}),\n ...(base?.workflowRevisionId\n ? { workflowRevisionId: base.workflowRevisionId }\n : {}),\n ...(base?.topologyHash ? { topologyHash: base.topologyHash } : {}),\n ...(base?.nodeId ? { nodeId: base.nodeId } : {}),\n ...(args.correlation ?? {}),\n },\n ...(telemetry.metadata ||\n telemetry.tags ||\n context.userId ||\n context.tenantId\n ? {\n context: {\n ...(typeof context.userId === \"string\"\n ? { userId: context.userId }\n : {}),\n ...(typeof context.tenantId === \"string\"\n ? { tenantId: context.tenantId }\n : {}),\n ...(telemetry.tags ? { tags: telemetry.tags } : {}),\n ...(telemetry.metadata ? { metadata: telemetry.metadata } : {}),\n },\n }\n : {}),\n type: args.type,\n payload: {\n ...args.payload,\n ...(args.type === \"run.cancelled\"\n ? { branchId: args.config.executionBranchId ?? runId }\n : {}),\n },\n };\n try {\n void Promise.resolve(telemetry.reporter.emit([event]))\n .then(async () => {\n if (!args.flush) return;\n const flush = (telemetry as { flush?: unknown }).flush;\n if (typeof flush === \"function\") await flush.call(telemetry);\n })\n .catch(() => {\n // Reporters must not affect the workflow execution path.\n });\n } catch {\n // A custom reporter may violate its async contract. Treat it like a\n // delivery failure rather than allowing observability to break a run.\n }\n};\n","import { createHash } from \"node:crypto\";\nimport type { WorkflowDefinition } from \"@kortyx/core\";\nimport type {\n EnsureWorkflowTopologyRequest,\n KortyxTelemetryConfig,\n} from \"@kortyx/hooks\";\n\ntype WorkflowTopologyTransition = NonNullable<\n EnsureWorkflowTopologyRequest[\"workflow\"][\"transitions\"]\n>[number];\n\ntype WorkflowTopologyNodeInput = {\n run?: unknown;\n params?: unknown;\n metadata?: unknown;\n behavior?: unknown;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst stableValue = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(stableValue);\n if (!isRecord(value)) return value;\n return Object.fromEntries(\n Object.entries(value)\n .filter(([, nested]) => typeof nested !== \"function\")\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, nested]) => [key, stableValue(nested)]),\n );\n};\n\nconst asString = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.length > 0 ? value : undefined;\n\nconst metadata = (value: unknown): Record<string, unknown> | undefined =>\n isRecord(value) ? (stableValue(value) as Record<string, unknown>) : undefined;\n\nconst tagsFrom = (workflow: WorkflowDefinition): string[] | undefined => {\n const raw = isRecord(workflow.metadata) ? workflow.metadata.tags : undefined;\n if (!Array.isArray(raw)) return undefined;\n const tags = raw\n .filter((tag): tag is string => typeof tag === \"string\")\n .sort();\n return tags.length > 0 ? tags : undefined;\n};\n\nconst wordsFrom = (value: string): string[] =>\n value\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .split(/[^a-zA-Z0-9]+/)\n .map((word) => word.toLowerCase())\n .filter(Boolean);\n\nconst camelFromWorkflowId = (workflowId: string): string => {\n const [first = \"\", ...rest] = wordsFrom(workflowId);\n return [\n first,\n ...rest.map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`),\n ].join(\"\");\n};\n\nconst resolveMemberTransitionTarget = (\n memberName: string,\n knownWorkflowIds: readonly string[],\n): string | undefined => {\n const exact = knownWorkflowIds.find(\n (workflowId) => camelFromWorkflowId(workflowId) === memberName,\n );\n if (exact) return exact;\n\n const memberWords = new Set(wordsFrom(memberName));\n const candidates = knownWorkflowIds\n .map((workflowId) => {\n const workflowWords = wordsFrom(workflowId);\n const matched = workflowWords.filter((word) => memberWords.has(word));\n return {\n workflowId,\n matched: matched.length,\n total: workflowWords.length,\n };\n })\n .filter(\n (candidate) =>\n candidate.total > 0 && candidate.matched === candidate.total,\n )\n .sort(\n (a, b) =>\n b.matched - a.matched || a.workflowId.localeCompare(b.workflowId),\n );\n\n if (candidates.length !== 1) return undefined;\n return candidates[0]?.workflowId;\n};\n\nconst transitionTargetsFromRun = (\n run: unknown,\n knownWorkflowIds: readonly string[],\n): string[] => {\n if (typeof run !== \"function\") return [];\n\n const source = Function.prototype.toString.call(run);\n const targets = new Set<string>();\n\n for (const match of source.matchAll(\n /\\btransitionTo\\s*:\\s*(['\"`])([^'\"`$]+)\\1/g,\n )) {\n const target = match[2]?.trim();\n if (target) targets.add(target);\n }\n\n for (const match of source.matchAll(\n /\\btransitionTo\\s*:\\s*(?:[A-Za-z_$][\\w$]*\\.)+([A-Za-z_$][\\w$]*)/g,\n )) {\n const memberName = match[1] as string;\n const target = resolveMemberTransitionTarget(memberName, knownWorkflowIds);\n if (target) targets.add(target);\n }\n\n for (const match of source.matchAll(\n /\\btransitionTo\\s*:\\s*(?:[A-Za-z_$][\\w$]*\\.)*[A-Za-z_$][\\w$]*\\[['\"`]([A-Za-z_$][\\w$]*)['\"`]\\]/g,\n )) {\n const memberName = match[1] as string;\n const target = resolveMemberTransitionTarget(memberName, knownWorkflowIds);\n if (target) targets.add(target);\n }\n\n return [...targets].sort();\n};\n\nconst transitionsFromNodes = (\n workflow: WorkflowDefinition,\n knownWorkflowIds: readonly string[],\n): WorkflowTopologyTransition[] => {\n const transitions = new Map<string, WorkflowTopologyTransition>();\n\n for (const [sourceNodeId, node] of Object.entries(\n workflow.nodes as Record<string, WorkflowTopologyNodeInput>,\n )) {\n for (const targetWorkflowId of transitionTargetsFromRun(\n node.run,\n knownWorkflowIds,\n )) {\n if (targetWorkflowId === workflow.id) continue;\n const key = `${sourceNodeId}:${targetWorkflowId}`;\n transitions.set(key, { sourceNodeId, targetWorkflowId });\n }\n }\n\n return [...transitions.values()].sort((a, b) =>\n JSON.stringify(a).localeCompare(JSON.stringify(b)),\n );\n};\n\n/** Produces the topology-only, deterministic Contract A snapshot. */\nexport const projectWorkflowTopology = (args: {\n workflow: WorkflowDefinition;\n environment: string;\n service: NonNullable<KortyxTelemetryConfig[\"service\"]>;\n knownWorkflowIds?: readonly string[] | undefined;\n}): EnsureWorkflowTopologyRequest => {\n const nodes = Object.entries(\n args.workflow.nodes as Record<string, WorkflowTopologyNodeInput>,\n )\n .map(([id, node]) => {\n const nodeMetadata = metadata(node.metadata);\n const params = metadata(node.params);\n const model = isRecord(node.params)\n ? isRecord(node.params.model)\n ? node.params.model\n : undefined\n : undefined;\n const provider = isRecord(model)\n ? (asString(model.provider) ?? asString(model.providerId))\n : undefined;\n const modelName = isRecord(model)\n ? (asString(model.name) ?? asString(model.modelId))\n : undefined;\n return {\n id,\n ...(asString(nodeMetadata?.label)\n ? { label: asString(nodeMetadata?.label) }\n : {}),\n ...(asString(nodeMetadata?.type)\n ? { type: asString(nodeMetadata?.type) }\n : {}),\n ...(provider ? { provider } : {}),\n ...(modelName ? { model: modelName } : {}),\n ...(nodeMetadata ? { metadata: nodeMetadata } : {}),\n // These fields feed the hash but are intentionally not sent as Studio\n // display metadata. They are stripped below after hashing.\n _execution: {\n ...(typeof node.run === \"string\" ? { run: node.run } : {}),\n ...(params ? { params } : {}),\n ...(node.behavior ? { behavior: stableValue(node.behavior) } : {}),\n },\n };\n })\n .sort((a, b) => a.id.localeCompare(b.id));\n const edges = args.workflow.edges\n .map((edge) => {\n const condition = isRecord(edge[2]) ? asString(edge[2].when) : undefined;\n return {\n sourceNodeId: edge[0],\n targetNodeId: edge[1],\n ...(condition ? { condition } : {}),\n };\n })\n .sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b)));\n const transitions = transitionsFromNodes(\n args.workflow,\n args.knownWorkflowIds ?? [],\n );\n const tags = tagsFrom(args.workflow);\n const hashInput = stableValue({\n workflowId: args.workflow.id,\n nodes: nodes.map((node) => ({ id: node.id, ...node._execution })),\n edges,\n transitions,\n });\n const topologyHash = createHash(\"sha256\")\n .update(JSON.stringify(hashInput))\n .digest(\"hex\");\n\n return {\n schemaVersion: 1,\n environment: args.environment,\n service: args.service,\n workflow: {\n id: args.workflow.id,\n declaredVersion: args.workflow.version,\n ...(args.workflow.description\n ? { description: args.workflow.description }\n : {}),\n ...(tags ? { tags } : {}),\n topologyHash,\n nodes: nodes.map(({ _execution: _ignored, ...node }) => node),\n edges,\n ...(transitions.length > 0 ? { transitions } : {}),\n },\n };\n};\n\n/**\n * Starts topology registration without adding latency to workflow execution.\n * A hot adapter cache yields a revision ID; a cold run carries topologyHash so\n * the API can backfill correlation when the asynchronous ensure finishes.\n */\nexport const prepareWorkflowTelemetry = (args: {\n config: Record<string, unknown>;\n workflow: WorkflowDefinition;\n runId: string;\n sessionId?: string | undefined;\n knownWorkflowIds?: readonly string[] | undefined;\n}): Record<string, unknown> => {\n const telemetry = isRecord(args.config.telemetry)\n ? (args.config.telemetry as KortyxTelemetryConfig)\n : undefined;\n if (!telemetry?.reporter || !telemetry.environment || !telemetry.service) {\n return args.config;\n }\n\n let snapshot: EnsureWorkflowTopologyRequest;\n try {\n snapshot = projectWorkflowTopology({\n workflow: args.workflow,\n environment: telemetry.environment,\n service: telemetry.service,\n knownWorkflowIds: args.knownWorkflowIds,\n });\n } catch {\n // An application may put non-serializable values in node params. That is\n // invalid telemetry input, but it must never prevent workflow execution.\n return args.config;\n }\n let workflowRevisionId: string | undefined;\n try {\n workflowRevisionId = telemetry.reporter.getWorkflowRevisionId?.({\n environment: snapshot.environment,\n workflowId: snapshot.workflow.id,\n topologyHash: snapshot.workflow.topologyHash,\n });\n void Promise.resolve(\n telemetry.reporter.ensureWorkflowTopology(snapshot),\n ).catch(() => {\n // Telemetry is best effort. The run still contains a topology hash for\n // a later API-side backfill when the transport becomes available.\n });\n } catch {\n // Do not allow a custom reporter that throws synchronously to stop a run.\n }\n\n return {\n ...args.config,\n prepareChildTelemetry: (\n workflow: WorkflowDefinition,\n config: Record<string, unknown>,\n ) =>\n prepareWorkflowTelemetry({\n config,\n workflow,\n runId: args.runId,\n sessionId: args.sessionId,\n knownWorkflowIds: args.knownWorkflowIds,\n }),\n telemetry: {\n ...telemetry,\n correlation: {\n ...(telemetry.correlation ?? {}),\n runId: args.runId,\n ...(args.sessionId ? { sessionId: args.sessionId } : {}),\n workflowId: snapshot.workflow.id,\n topologyHash: snapshot.workflow.topologyHash,\n ...(workflowRevisionId ? { workflowRevisionId } : {}),\n },\n } satisfies KortyxTelemetryConfig,\n };\n};\n","import type {\n PendingRequestRecord,\n PendingRequestStore,\n} from \"@kortyx/runtime\";\nimport { z } from \"zod\";\nimport type { ResumeHandle } from \"../execution/types\";\n\nconst scopeSchema = z\n .object({\n sessionId: z.string().min(1).optional(),\n runId: z.string().min(1).optional(),\n context: z\n .record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.null()]),\n )\n .optional(),\n })\n .strict()\n .refine(\n (scope) =>\n Boolean(\n scope.sessionId ||\n scope.runId ||\n Object.keys(scope.context ?? {}).length,\n ),\n \"Interrupt discovery requires an authorized session, run, or context scope.\",\n );\n\nexport type InterruptScope = z.input<typeof scopeSchema>;\nexport type ListInterruptsOptions = InterruptScope & {\n status?: \"pending\";\n afterResponseCompleted?: boolean;\n};\nexport type PendingInterrupt = {\n id: string;\n status: \"pending\";\n runId: string;\n sessionId: string;\n workflow: string;\n node: string;\n createdAt: string;\n expiresAt: string;\n afterResponseCompleted: boolean;\n input: Omit<PendingRequestRecord[\"schema\"], \"meta\"> & {\n options: Array<{ id: string; label: string; description?: string }>;\n };\n};\nexport type ResumableInterrupt = PendingInterrupt & { resume: ResumeHandle };\n\nconst matches = (record: PendingRequestRecord, scope: InterruptScope) =>\n record.ready !== false &&\n Date.now() < record.createdAt + record.ttlMs &&\n (!scope.sessionId || record.sessionId === scope.sessionId) &&\n (!scope.runId || record.runId === scope.runId) &&\n Object.entries(scope.context ?? {}).every(\n ([key, value]) => record.state?.config.context?.[key] === value,\n );\n\nconst summary = (record: PendingRequestRecord): PendingInterrupt => {\n const { meta: _meta, ...input } = record.schema;\n const contract = record.state?.config.executionContract as\n | { id?: string }\n | undefined;\n return {\n id: record.requestId,\n status: \"pending\",\n runId: record.runId,\n sessionId: record.sessionId ?? \"\",\n workflow: contract?.id ?? record.workflow,\n node: record.node,\n createdAt: new Date(record.createdAt).toISOString(),\n expiresAt: new Date(record.createdAt + record.ttlMs).toISOString(),\n afterResponseCompleted: record.responseCompleted === true,\n input: {\n ...input,\n options: record.options.map(({ id, label, description }) => ({\n id,\n label,\n ...(description !== undefined ? { description } : {}),\n })),\n },\n };\n};\n\nexport function createInterruptDiscovery(store: PendingRequestStore) {\n const records = () => {\n if (!store.list)\n throw new Error(\n \"This persistence adapter does not support interrupt discovery; implement pendingRequests.list.\",\n );\n return store.list();\n };\n return {\n async listInterrupts(\n options: ListInterruptsOptions,\n ): Promise<PendingInterrupt[]> {\n const {\n status: _status,\n afterResponseCompleted,\n ...scope\n } = z\n .object({\n sessionId: z.string().optional(),\n runId: z.string().optional(),\n context: z\n .record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.null()]),\n )\n .optional(),\n status: z.literal(\"pending\").optional(),\n afterResponseCompleted: z.boolean().optional(),\n })\n .strict()\n .parse(options);\n scopeSchema.parse(scope);\n return (await records())\n .filter(\n (record) =>\n matches(record, scope) &&\n (afterResponseCompleted === undefined ||\n (record.responseCompleted === true) === afterResponseCompleted),\n )\n .sort(\n (a, b) =>\n a.createdAt - b.createdAt || a.requestId.localeCompare(b.requestId),\n )\n .map(summary);\n },\n async getInterrupt(\n id: string,\n scope: InterruptScope,\n ): Promise<ResumableInterrupt | null> {\n z.string().min(1).parse(id);\n scopeSchema.parse(scope);\n const record = (await records()).find(\n (record) => record.requestId === id && matches(record, scope),\n );\n if (!record) return null;\n return {\n ...summary(record),\n resume: {\n token: record.token,\n requestId: record.requestId,\n sessionId: record.sessionId ?? \"\",\n runId: record.runId,\n },\n };\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { emitWorkflowCall, type KortyxTelemetryConfig } from \"@kortyx/hooks\";\nimport type { PendingRequestRecord } from \"@kortyx/runtime\";\n\n/** Rebase every snapshot copy; emit each inherited logical invocation only once. */\nexport function restoreWorkflowCallBranch(\n requests: PendingRequestRecord[],\n telemetry: KortyxTelemetryConfig | undefined,\n sourceRunId: string,\n) {\n const branchId = randomUUID();\n const emitted = new Set<string>();\n for (const request of requests) {\n if (request.state)\n request.state.config = {\n ...request.state.config,\n executionBranchId: branchId,\n };\n const seen = new Set<object>();\n const visit = (value: unknown) => {\n if (!value || typeof value !== \"object\" || seen.has(value)) return;\n seen.add(value);\n const record = value as Record<string, unknown>;\n if (\n typeof record.invocationId === \"string\" &&\n typeof record.fingerprint === \"string\" &&\n Array.isArray(record.interrupts)\n ) {\n const previous = record.telemetry as\n | Record<string, unknown>\n | undefined;\n if (previous) {\n record.sequence = 0;\n record.telemetry = { ...previous, branchId };\n if (!emitted.has(record.invocationId)) {\n emitted.add(record.invocationId);\n emitWorkflowCall(\n telemetry\n ? {\n ...telemetry,\n correlation: {\n runId: request.runId,\n workflowId: request.workflow,\n ...(request.sessionId\n ? { sessionId: request.sessionId }\n : {}),\n },\n }\n : undefined,\n \"workflow.call.restored\",\n {\n ...previous,\n branchId,\n sourceBranchId: previous.branchId,\n sourceRunId,\n sequence: 0,\n status: record.status,\n },\n );\n }\n }\n }\n for (const child of Object.values(record)) visit(child);\n };\n visit(request);\n }\n return branchId;\n}\n","import type { RuntimeEnvelope } from \"@kortyx/core\";\nimport type { GetProviderFn } from \"@kortyx/providers\";\nimport type { FrameworkAdapter, WorkflowRegistry } from \"@kortyx/runtime\";\nimport {\n buildInitialGraphState,\n createExecutionGraph,\n makeRequestId,\n} from \"@kortyx/runtime\";\nimport type { StreamChunk } from \"@kortyx/stream\";\nimport { parseExecutionInput } from \"../execution/contracts\";\nimport type { ApplyResumeSelection } from \"../interrupt/resume-handler\";\nimport {\n parseResumeMeta,\n tryPrepareResumeStream,\n} from \"../interrupt/resume-handler\";\nimport type { SelectWorkflowFn } from \"../orchestrator\";\nimport { orchestrateGraphStream } from \"../orchestrator\";\nimport { prepareWorkflowTelemetry } from \"../telemetry/topology\";\nimport type { ChatMessage } from \"../types/chat-message\";\nimport { extractLatestUserMessage } from \"../utils/extract-latest-message\";\n\nexport interface RuntimeConfig {\n session?: { id?: string };\n [key: string]: unknown;\n}\n\nexport interface StreamChatArgs<Options> {\n abortSignal?: AbortSignal | undefined;\n executionSignal?: AbortSignal | undefined;\n onExecution?: ((completion: Promise<void>) => void) | undefined;\n messages: ChatMessage[];\n options?: Options | undefined;\n sessionId?: string;\n defaultWorkflowId?: string;\n loadRuntimeConfig: (\n options?: Options,\n ) => RuntimeConfig | Promise<RuntimeConfig>;\n selectWorkflow?: SelectWorkflowFn;\n workflowRegistry?: WorkflowRegistry;\n knownWorkflowIds?: readonly string[] | undefined;\n frameworkAdapter?: FrameworkAdapter;\n getProvider: GetProviderFn;\n applyResumeSelection?: ApplyResumeSelection;\n}\n\nexport async function streamChat<Options = unknown>({\n messages,\n abortSignal,\n executionSignal,\n onExecution,\n options,\n sessionId,\n defaultWorkflowId,\n loadRuntimeConfig,\n selectWorkflow,\n workflowRegistry,\n knownWorkflowIds,\n frameworkAdapter,\n getProvider,\n applyResumeSelection,\n}: StreamChatArgs<Options>): Promise<AsyncIterable<StreamChunk>> {\n const config = await loadRuntimeConfig(options);\n let runtimeConfig: Parameters<typeof createExecutionGraph>[1] = {\n ...config,\n getProvider,\n ...(frameworkAdapter\n ? { checkpointer: frameworkAdapter.checkpointer }\n : {}),\n };\n\n const workflowSelector: SelectWorkflowFn | null =\n selectWorkflow ??\n (workflowRegistry ? (id) => workflowRegistry.select(id) : null);\n if (!workflowSelector) {\n throw new Error(\n \"streamChat requires selectWorkflow or workflowRegistry to resolve workflows.\",\n );\n }\n\n runtimeConfig.selectWorkflow = workflowSelector;\n\n const fallbackSessionId = (options as { sessionId?: string } | undefined)\n ?.sessionId;\n const resolvedSessionId =\n sessionId || fallbackSessionId || \"anonymous-session\";\n const last = messages[messages.length - 1];\n const input = extractLatestUserMessage(messages);\n\n const previousMessages = messages.slice(0, -1);\n const runtime: RuntimeEnvelope = {\n ...(previousMessages.length > 0 ? { priorMessages: previousMessages } : {}),\n } as RuntimeEnvelope;\n\n const isResumeRequest = Boolean(parseResumeMeta(last));\n const requestedWorkflowId = (() => {\n if (!options) return undefined;\n if (typeof options !== \"object\") return undefined;\n const record = options as Record<string, unknown>;\n const wfId = record.workflowId;\n if (typeof wfId === \"string\") return wfId;\n return undefined;\n })();\n if (!isResumeRequest && requestedWorkflowId) {\n if (requestedWorkflowId.trim() === \"\") delete runtime.requestedWorkflow;\n else runtime.requestedWorkflow = requestedWorkflowId;\n }\n\n const resumeStream = await tryPrepareResumeStream({\n abortSignal,\n executionSignal,\n onExecution,\n lastMessage: last,\n sessionId: resolvedSessionId,\n config: runtimeConfig,\n selectWorkflow: workflowSelector,\n knownWorkflowIds,\n ...(frameworkAdapter ? { frameworkAdapter } : {}),\n ...(defaultWorkflowId ? { defaultWorkflowId } : {}),\n ...(applyResumeSelection ? { applyResumeSelection } : {}),\n });\n if (resumeStream) return resumeStream as AsyncIterable<StreamChunk>;\n\n const baseState = await buildInitialGraphState({\n input,\n config: runtimeConfig,\n runtime,\n ...(defaultWorkflowId ? { defaultWorkflowId } : {}),\n });\n\n const runId = makeRequestId(\"run\");\n let headCheckpoint =\n !isResumeRequest && frameworkAdapter?.sessionCheckpoints\n ? await frameworkAdapter.sessionCheckpoints.getHead(resolvedSessionId)\n : null;\n if (\n !isResumeRequest &&\n !headCheckpoint &&\n frameworkAdapter?.sessionCheckpoints\n ) {\n headCheckpoint = await frameworkAdapter.sessionCheckpoints.append({\n sessionId: resolvedSessionId,\n runId,\n workflow: String(baseState.currentWorkflow),\n state: {\n ...baseState,\n input: \"\",\n awaitingHumanInput: false,\n },\n nodes: [],\n structuredStreamIds: [],\n pendingRequests: [],\n label: \"session start\",\n });\n }\n const currentWorkflow = requestedWorkflowId\n ? baseState.currentWorkflow\n : (headCheckpoint?.state.currentWorkflow ?? baseState.currentWorkflow);\n const selectedWorkflow = await workflowSelector(currentWorkflow as string);\n runtimeConfig = prepareWorkflowTelemetry({\n config: runtimeConfig,\n workflow: selectedWorkflow,\n runId,\n sessionId: resolvedSessionId,\n knownWorkflowIds,\n }) as Parameters<typeof createExecutionGraph>[1];\n\n runtimeConfig = {\n ...runtimeConfig,\n executionContract: {\n id: selectedWorkflow.id,\n version: selectedWorkflow.version,\n },\n };\n const parsedInput = selectedWorkflow.inputSchema\n ? parseExecutionInput(selectedWorkflow, input)\n : input;\n const graph = await createExecutionGraph(selectedWorkflow, runtimeConfig);\n const initialState = headCheckpoint\n ? {\n ...headCheckpoint.state,\n input: parsedInput,\n config: runtimeConfig,\n currentWorkflow,\n awaitingHumanInput: false,\n runtime: {\n ...(headCheckpoint.state.runtime ?? {}),\n ...(runtime.requestedWorkflow\n ? { requestedWorkflow: runtime.requestedWorkflow }\n : {}),\n ...(runtime.priorMessages\n ? { priorMessages: runtime.priorMessages }\n : {}),\n },\n }\n : {\n ...baseState,\n input: parsedInput,\n config: runtimeConfig,\n currentWorkflow,\n };\n\n const orchestratedStream = await orchestrateGraphStream({\n abortSignal,\n executionSignal,\n onExecution,\n sessionId: resolvedSessionId,\n runId,\n graph,\n state: initialState,\n config: runtimeConfig,\n selectWorkflow: workflowSelector,\n knownWorkflowIds,\n ...(frameworkAdapter ? { frameworkAdapter } : {}),\n });\n\n return orchestratedStream as AsyncIterable<StreamChunk>;\n}\n","import type { ChatMessage } from \"../types/chat-message\";\n\nexport function extractLatestUserMessage(messages: ChatMessage[]): string {\n if (!messages || messages.length === 0) return \"\";\n // Find last message with role = \"user\"\n for (let i = messages.length - 1; i >= 0; i -= 1) {\n const msg = messages[i];\n if (msg?.role === \"user\" && msg?.content?.trim()) {\n return msg.content.trim();\n }\n }\n return \"\";\n}\n"],"mappings":"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","names":["index_exports","__export","emitWorkflowCall","useReason","module","__toCommonJS","import_zod","isRecord","result","import_core","import_node_crypto","import_node_crypto2","import_core2","response","createRuntimeId","import_node_crypto3","import_core3","import_zod2","matches","tryStringify","import_zod3","toErrorMessage","import_core4","completed","import_core5","resolve","import_core6","import_node_crypto4","metadata","import_core","import_runtime","import_zod","import_core","import_runtime","import_zod","import_core","import_runtime","import_core","import_zod","import_node_crypto","isRecord","isRecord","checkpointId","resolvedSessionId","isRecord","resolve","import_zod","record","import_node_crypto","import_runtime","runtimeConfig","getRegisteredProvider","streamChat"]}
|
|
1
|
+
{"version":3,"sources":["../../hooks/src/index.ts","../../hooks/src/complete-response.ts","../../hooks/src/context.ts","../../hooks/src/interrupt.ts","../../hooks/src/reason/checkpoint.ts","../../hooks/src/validation.ts","../../hooks/src/reason/use-reason.ts","../../hooks/src/structured.ts","../../hooks/src/structured-path.ts","../../hooks/src/reason/engine.ts","../../hooks/src/reason-engine.ts","../../hooks/src/reason/output-format.ts","../../hooks/src/reason/structured-stream.ts","../../hooks/src/reason/output-stream.ts","../../hooks/src/reason/parsing.ts","../../hooks/src/reason/prompting.ts","../../hooks/src/reason/result.ts","../../hooks/src/reason/tools.ts","../../hooks/src/hooks.ts","../../hooks/src/parallel.ts","../../hooks/src/workflow.ts","../../hooks/src/workflow-telemetry.ts","../src/index.ts","../src/adapters/http.ts","../src/adapters/http-client.ts","../src/chat/create-agent.ts","../src/execution/execute.ts","../src/interrupt/resume-handler.ts","../src/execution/types.ts","../src/orchestrator.ts","../src/execution/contracts.ts","../src/stream/response-lifecycle.ts","../src/stream/transform-graph-stream-for-ui.ts","../src/telemetry/events.ts","../src/telemetry/topology.ts","../src/interrupt/discovery.ts","../src/telemetry/workflow-call-branch.ts","../src/chat/process-chat.ts","../src/utils/extract-latest-message.ts"],"sourcesContent":["// release-test: 2026-01-22\n/**\n * @kortyx/hooks\n *\n * Internal hook implementations resolved via async-local context.\n */\n\nexport {\n type CompleteResponseOptions,\n completeResponse,\n} from \"./complete-response\";\nexport type { HookRuntimeContext } from \"./context\";\nexport { runWithHookContext } from \"./context\";\nexport type {\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonResult,\n UseReasonStep,\n UseReasonToolExecution,\n UseStructuredDataArgs,\n} from \"./hooks\";\nexport {\n useAbortSignal,\n useInterrupt,\n useNodeState,\n useReason,\n useRuntimeContext,\n useStructuredData,\n useWorkflowState,\n} from \"./hooks\";\nexport { ParallelError, parallel } from \"./parallel\";\nexport type {\n EnsureWorkflowTopologyRequest,\n EnsureWorkflowTopologyResponse,\n KortyxTelemetryConfig,\n KortyxTelemetryContentCapture,\n KortyxTelemetryCorrelation,\n KortyxTelemetryEvent,\n KortyxTelemetryEventType,\n KortyxTelemetryPrompt,\n KortyxTelemetryReporter,\n KortyxTelemetryService,\n KortyxTraceAdapter,\n KortyxTraceMetadata,\n ReasonTraceAdapter,\n ReasonTraceAttributes,\n ReasonTraceSpan,\n ReasonTraceSpanEndArgs,\n ReasonTraceSpanStartArgs,\n} from \"./tracing\";\nexport type { WorkflowCallOutcome, WorkflowCallService } from \"./workflow\";\nexport {\n createWorkflowHooks,\n useWorkflow,\n WorkflowCallError,\n workflowCallFingerprint,\n} from \"./workflow\";\nexport { emitWorkflowCall } from \"./workflow-telemetry\";\n","import { z } from \"zod\";\nimport { getHookContext, snapshotHookState } from \"./context\";\n\nexport type CompleteResponseOptions = {\n message?: string | undefined;\n data?: unknown;\n};\n\nconst optionsSchema = z\n .object({\n message: z.string().optional(),\n data: z.json().optional(),\n })\n .strict();\n\n/** Finish client delivery, leaving the node and workflow execution running. */\nexport async function completeResponse(\n options: CompleteResponseOptions = {},\n): Promise<void> {\n const ctx = getHookContext();\n const parsed = optionsSchema.parse(options);\n if (!ctx.node.completeResponse) {\n throw new Error(\n \"completeResponse requires an agent-managed root workflow.\",\n );\n }\n await ctx.node.completeResponse(parsed, snapshotHookState());\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type {\n GraphState,\n InterruptInput,\n InterruptResult,\n NodeConfig,\n TokenUsage,\n} from \"@kortyx/core\";\nimport type { KortyxUsage } from \"@kortyx/providers\";\nimport type { ParallelGroup, WorkflowTask } from \"./parallel\";\nimport type { KortyxTelemetryConfig, ReasonTraceAdapter } from \"./tracing\";\nimport type { WorkflowCallService } from \"./workflow\";\n\ntype NodeStateStore = {\n byIndex: unknown[];\n byKey: Record<string, unknown>;\n};\n\ntype HookRuntimeState = {\n nodeState?: Record<string, unknown>;\n workflowState?: Record<string, unknown>;\n};\n\ntype StoredNodeStateEnvelope = {\n nodeId?: unknown;\n state?: unknown;\n};\n\ntype HookStatePatchedError = {\n __kortyxHookStatePatch?: Record<string, unknown>;\n};\n\nexport type HookNodeRuntimeContext = {\n completeResponse?:\n | ((\n options: import(\"./complete-response\").CompleteResponseOptions,\n state: GraphState,\n ) => Promise<void>)\n | undefined;\n /** Transient execution control; never part of checkpointed state. */\n abortSignal?: AbortSignal | undefined;\n consumeExecution?:\n | ((limit: import(\"@kortyx/core\").ExecutionLimit) => void)\n | undefined;\n graph: {\n name: string;\n node: string;\n };\n config: NodeConfig;\n emit: (event: string, payload: unknown) => void;\n awaitInterrupt: (args: InterruptInput) => InterruptResult;\n callWorkflow?: WorkflowCallService;\n workflowCallTelemetry?: KortyxTelemetryConfig | undefined;\n};\n\nexport type HookRuntimeContext = {\n node: HookNodeRuntimeContext;\n state: GraphState;\n reasonTrace?: ReasonTraceAdapter | undefined;\n};\n\ntype HookInternalContext = HookRuntimeContext & {\n workflowCallActive: boolean;\n workflowCallIds: Set<string>;\n workflowTasks: WorkflowTask[];\n parallelJoins: Promise<unknown>[];\n parallelGroup: ParallelGroup | undefined;\n parallelIndex: number;\n workflowControlError?: unknown;\n workflowContextClosed: boolean;\n nodeStateIndex: number;\n reasonCallIndex: number;\n currentNodeState: NodeStateStore;\n workflowState: Record<string, unknown>;\n tokenUsage?: TokenUsage | undefined;\n stateDirty: boolean;\n runtimeDirty: boolean;\n};\n\nconst storage = new AsyncLocalStorage<HookInternalContext>();\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst normalizeNodeState = (value: unknown): NodeStateStore => {\n if (Array.isArray(value)) {\n return { byIndex: [...value], byKey: {} };\n }\n\n if (isRecord(value)) {\n const byIndex = Array.isArray(value.byIndex) ? [...value.byIndex] : [];\n const byKey = isRecord(value.byKey) ? { ...value.byKey } : {};\n return { byIndex, byKey };\n }\n\n return { byIndex: [], byKey: {} };\n};\n\nconst cloneWorkflowState = (value: unknown): Record<string, unknown> =>\n isRecord(value) ? { ...value } : {};\n\nconst cloneTokenUsage = (value: unknown): TokenUsage | undefined => {\n if (!isRecord(value)) return undefined;\n const input = typeof value.input === \"number\" ? value.input : undefined;\n const output = typeof value.output === \"number\" ? value.output : undefined;\n const total = typeof value.total === \"number\" ? value.total : undefined;\n if (input === undefined && output === undefined && total === undefined) {\n return undefined;\n }\n return {\n input: input ?? 0,\n output: output ?? 0,\n total: total ?? 0,\n };\n};\n\nconst getHookRuntimeState = (state: GraphState): HookRuntimeState => {\n const runtime = (state.runtime ?? {}) as Record<string, unknown>;\n const internal = isRecord(runtime.__kortyx) ? runtime.__kortyx : undefined;\n const result: HookRuntimeState = {};\n if (isRecord(internal?.nodeState)) result.nodeState = internal?.nodeState;\n if (isRecord(internal?.workflowState)) {\n result.workflowState = internal?.workflowState;\n }\n return result;\n};\n\nconst createInternalContext = (\n ctx: HookRuntimeContext,\n): HookInternalContext => {\n const hookRuntimeState = getHookRuntimeState(ctx.state);\n const nodeId = ctx.node.graph.node;\n const storedNodeState = isRecord(hookRuntimeState.nodeState)\n ? (hookRuntimeState.nodeState as StoredNodeStateEnvelope)\n : undefined;\n const storedNodeId =\n typeof storedNodeState?.nodeId === \"string\"\n ? String(storedNodeState.nodeId)\n : \"\";\n const storedState = storedNodeState?.state;\n const currentNodeState =\n storedNodeId && storedNodeId === nodeId\n ? normalizeNodeState(storedState)\n : { byIndex: [], byKey: {} };\n\n return {\n ...ctx,\n workflowCallActive: false,\n workflowCallIds: new Set(),\n workflowTasks: [],\n parallelJoins: [],\n parallelGroup: undefined,\n parallelIndex: 0,\n workflowContextClosed: false,\n nodeStateIndex: 0,\n reasonCallIndex: 0,\n currentNodeState,\n workflowState: cloneWorkflowState(hookRuntimeState.workflowState),\n tokenUsage: cloneTokenUsage(ctx.state.runtime?.tokenUsage),\n stateDirty: false,\n runtimeDirty: false,\n };\n};\n\nconst buildRuntimeStateUpdates = (ctx: HookInternalContext) => {\n const updates: Record<string, unknown> = {};\n\n if (ctx.stateDirty) {\n updates.__kortyx = {\n nodeState: {\n nodeId: ctx.node.graph.node,\n state: ctx.currentNodeState,\n },\n workflowState: ctx.workflowState,\n };\n }\n\n if (ctx.runtimeDirty && ctx.tokenUsage) {\n updates.tokenUsage = ctx.tokenUsage;\n }\n\n return Object.keys(updates).length > 0 ? updates : null;\n};\n\nconst cleanupCompletedReasonCheckpoints = (ctx: HookInternalContext): void => {\n let changed = false;\n\n for (const [key, value] of Object.entries(ctx.currentNodeState.byKey)) {\n if (!key.startsWith(\"__useReason:\")) continue;\n if (!isRecord(value) || value.status !== \"completed\") continue;\n delete ctx.currentNodeState.byKey[key];\n changed = true;\n }\n\n if (changed) ctx.stateDirty = true;\n};\n\nconst toTokenUsageDelta = (\n usage: KortyxUsage | undefined,\n): TokenUsage | undefined => {\n if (!usage) return undefined;\n\n const input = usage.input ?? 0;\n const output = usage.output ?? 0;\n const total =\n usage.total ??\n input +\n output +\n (usage.outputIncludesReasoning ? 0 : (usage.reasoning ?? 0));\n\n if (input === 0 && output === 0 && total === 0) {\n return undefined;\n }\n\n return {\n input,\n output,\n total,\n };\n};\n\nexport function accumulateTokenUsage(usage: KortyxUsage | undefined): void {\n const delta = toTokenUsageDelta(usage);\n if (!delta) return;\n\n const ctx = getHookContext();\n const current = ctx.tokenUsage ?? {\n input: 0,\n output: 0,\n total: 0,\n };\n\n ctx.tokenUsage = {\n input: current.input + delta.input,\n output: current.output + delta.output,\n total: current.total + delta.total,\n };\n ctx.runtimeDirty = true;\n}\n\nexport function getReasonTraceAdapter(): ReasonTraceAdapter | undefined {\n return getHookContext().reasonTrace;\n}\n\nexport async function runWithHookContext<T>(\n ctx: HookRuntimeContext,\n fn: () => Promise<T>,\n): Promise<{ result: T; runtimeUpdates: Record<string, unknown> | null }> {\n const internal = createInternalContext(ctx);\n try {\n const result = await storage.run(internal, async () => {\n const drain = async () => {\n let drained = -1;\n while (\n drained !==\n internal.parallelJoins.length + internal.workflowTasks.length\n ) {\n drained =\n internal.parallelJoins.length + internal.workflowTasks.length;\n await Promise.allSettled(internal.parallelJoins);\n await Promise.all(internal.workflowTasks.map((task) => task.done));\n }\n internal.workflowContextClosed = true;\n };\n try {\n const result = await fn();\n await drain();\n if (internal.workflowControlError) throw internal.workflowControlError;\n return result;\n } catch (error) {\n await drain();\n throw internal.workflowControlError ?? error;\n }\n });\n cleanupCompletedReasonCheckpoints(internal);\n for (const key of Object.keys(internal.currentNodeState.byKey)) {\n if (\n key.startsWith(\"__useWorkflow:\") ||\n key.startsWith(\"__parallel:\") ||\n key === \"__useWorkflowActivation\"\n ) {\n internal.currentNodeState.byKey[key] = null;\n internal.stateDirty = true;\n }\n }\n return { result, runtimeUpdates: buildRuntimeStateUpdates(internal) };\n } catch (err) {\n const runtimeUpdates = buildRuntimeStateUpdates(internal);\n if (runtimeUpdates) {\n const currentRuntime = isRecord(internal.state.runtime)\n ? (internal.state.runtime as Record<string, unknown>)\n : {};\n internal.state.runtime = {\n ...currentRuntime,\n ...runtimeUpdates,\n } as unknown as GraphState[\"runtime\"];\n if (err && typeof err === \"object\") {\n (err as HookStatePatchedError).__kortyxHookStatePatch = runtimeUpdates;\n }\n }\n throw err;\n }\n}\n\nexport function getHookContext(): HookInternalContext {\n const ctx = storage.getStore();\n if (!ctx) {\n throw new Error(\"Hooks can only be used while a node is executing.\");\n }\n return ctx;\n}\n\n/** Include hook state already written in this node, excluding future node returns. */\nexport function snapshotHookState(): GraphState {\n const ctx = getHookContext();\n return {\n ...ctx.state,\n lastNode: ctx.node.graph.node,\n runtime: { ...ctx.state.runtime, ...buildRuntimeStateUpdates(ctx) },\n };\n}\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { throwIfExecutionAborted } from \"@kortyx/core\";\nimport { getHookContext } from \"./context\";\nimport { resolveHookStatePatch } from \"./reason/checkpoint\";\nimport type { UseInterruptArgs } from \"./types\";\nimport { parseWithSchema } from \"./validation\";\n\nexport const awaitInterruptInternal = <\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(\n args: UseInterruptArgs<TRequest, TResponse>,\n): Promise<TResponse> => {\n const ctx = getHookContext();\n throwIfExecutionAborted(ctx.node.abortSignal);\n\n const request = parseWithSchema(\n args.requestSchema,\n args.request,\n \"useInterrupt request\",\n );\n const userMeta =\n args.meta && typeof args.meta === \"object\" && !Array.isArray(args.meta)\n ? args.meta\n : {};\n const resumeStatePatch = resolveHookStatePatch({\n nodeId: ctx.node.graph.node,\n currentNodeState: ctx.currentNodeState,\n workflowState: ctx.workflowState,\n });\n\n const enrichedRequest = {\n ...request,\n ...(typeof args.schemaId === \"string\" && args.schemaId.length > 0\n ? { schemaId: args.schemaId }\n : {}),\n ...(typeof args.schemaVersion === \"string\" && args.schemaVersion.length > 0\n ? { schemaVersion: args.schemaVersion }\n : {}),\n ...(typeof args.id === \"string\" && args.id.length > 0\n ? { id: args.id }\n : {}),\n meta: {\n ...userMeta,\n __kortyxResumeStatePatch: {\n ...resumeStatePatch,\n ...(ctx.tokenUsage ? { tokenUsage: ctx.tokenUsage } : {}),\n },\n },\n } as InterruptInput;\n\n const raw = ctx.node.awaitInterrupt(enrichedRequest);\n const response = parseWithSchema(\n args.responseSchema,\n raw,\n \"useInterrupt response\",\n );\n\n return Promise.resolve(response);\n};\n","import type { InterruptInput } from \"@kortyx/core\";\nimport type {\n KortyxFinishReason,\n KortyxProviderMetadata,\n KortyxUsage,\n KortyxWarning,\n} from \"@kortyx/providers\";\nimport type { UseReasonResult } from \"../types\";\n\nexport type ReasonInterruptCheckpoint = {\n status: \"awaiting_interrupt\";\n request: InterruptInput;\n firstText: string;\n firstRaw?: unknown;\n firstUsage?: KortyxUsage;\n firstFinishReason?: KortyxFinishReason;\n firstProviderMetadata?: KortyxProviderMetadata;\n firstWarnings?: KortyxWarning[];\n firstOutput?: unknown;\n};\n\nexport type ReasonCompletedCheckpoint = {\n status: \"completed\";\n result: UseReasonResult<unknown, unknown>;\n};\n\nexport const resolveReasonCheckpointKey = (args: {\n id?: string;\n autoIndex: number;\n}): string =>\n typeof args.id === \"string\" && args.id.length > 0\n ? `__useReason:${args.id}`\n : `__useReason:auto:${args.autoIndex}`;\n\nexport const readReasonCheckpoint = (\n raw: unknown,\n): ReasonInterruptCheckpoint | undefined => {\n if (!raw || typeof raw !== \"object\") return undefined;\n const value = raw as Record<string, unknown>;\n if (value.status !== \"awaiting_interrupt\") return undefined;\n if (typeof value.firstText !== \"string\") return undefined;\n if (!value.request || typeof value.request !== \"object\") return undefined;\n return {\n status: \"awaiting_interrupt\",\n request: value.request as InterruptInput,\n firstText: value.firstText,\n ...(Object.hasOwn(value, \"firstRaw\") ? { firstRaw: value.firstRaw } : {}),\n ...(Object.hasOwn(value, \"firstUsage\")\n ? { firstUsage: value.firstUsage as KortyxUsage }\n : {}),\n ...(Object.hasOwn(value, \"firstFinishReason\")\n ? { firstFinishReason: value.firstFinishReason as KortyxFinishReason }\n : {}),\n ...(Object.hasOwn(value, \"firstProviderMetadata\")\n ? {\n firstProviderMetadata:\n value.firstProviderMetadata as KortyxProviderMetadata,\n }\n : {}),\n ...(Object.hasOwn(value, \"firstWarnings\")\n ? { firstWarnings: value.firstWarnings as KortyxWarning[] }\n : {}),\n ...(Object.hasOwn(value, \"firstOutput\")\n ? { firstOutput: value.firstOutput }\n : {}),\n };\n};\n\nexport const readReasonCompletedCheckpoint = (\n raw: unknown,\n): ReasonCompletedCheckpoint | undefined => {\n if (!raw || typeof raw !== \"object\") return undefined;\n const value = raw as Record<string, unknown>;\n if (value.status !== \"completed\") return undefined;\n if (!value.result || typeof value.result !== \"object\") return undefined;\n return {\n status: \"completed\",\n result: value.result as UseReasonResult<unknown, unknown>,\n };\n};\n\nexport const resolveHookStatePatch = (args: {\n nodeId: string;\n currentNodeState: unknown;\n workflowState: Record<string, unknown>;\n}): Record<string, unknown> => ({\n __kortyx: {\n nodeState: {\n nodeId: args.nodeId,\n state: args.currentNodeState,\n },\n workflowState: args.workflowState,\n },\n});\n","import { ValidationError } from \"@kortyx/core/errors\";\nimport type { SchemaLike } from \"./types\";\n\nexport const parseWithSchema = <T>(\n schema: SchemaLike<T> | undefined,\n value: unknown,\n label: string,\n): T => {\n if (!schema) return value as T;\n\n const parsed = schema.safeParse(value);\n if (parsed.success) return parsed.data;\n\n const parsedError =\n \"error\" in parsed && parsed.error ? parsed.error : undefined;\n const reason =\n typeof parsedError?.message === \"string\" && parsedError.message.length > 0\n ? parsedError.message\n : \"invalid payload\";\n throw new ValidationError(\n label === \"useReason output\" ? \"MODEL_OUTPUT_SCHEMA\" : \"SCHEMA_VALIDATION\",\n `${label} validation failed: ${reason}`,\n parsedError,\n );\n};\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { combineAbortSignals, throwIfExecutionAborted } from \"@kortyx/core\";\nimport type {\n KortyxFinishReason,\n KortyxProviderMetadata,\n KortyxUsage,\n KortyxWarning,\n} from \"@kortyx/providers\";\nimport {\n accumulateTokenUsage,\n getHookContext,\n getReasonTraceAdapter,\n} from \"../context\";\nimport { awaitInterruptInternal } from \"../interrupt\";\nimport { shouldStreamStructured } from \"../structured\";\nimport type { ReasonTraceSpan } from \"../tracing\";\nimport type { SchemaLike, UseReasonArgs, UseReasonResult } from \"../types\";\nimport { parseWithSchema } from \"../validation\";\nimport {\n type ReasonInterruptCheckpoint,\n readReasonCheckpoint,\n readReasonCompletedCheckpoint,\n resolveHookStatePatch,\n resolveReasonCheckpointKey,\n} from \"./checkpoint\";\nimport { createRuntimeId, reasonEngine } from \"./engine\";\nimport { inferOutputFormat } from \"./output-format\";\nimport { createStructuredOutputStreamer } from \"./output-stream\";\nimport {\n parseInterruptFirstPassResult,\n parseReasonOutputWithSchema,\n} from \"./parsing\";\nimport {\n defaultContinuationInput,\n defaultInterruptFirstPassInput,\n withOutputGuardrails,\n withStructuredStreamHints,\n} from \"./prompting\";\nimport {\n emitReasonStructuredOutput,\n mergeProviderMetadata,\n mergeUsage,\n mergeWarnings,\n} from \"./result\";\nimport {\n resolveAppendFieldPaths,\n resolveSetFieldPaths,\n resolveTextDeltaFieldPaths,\n} from \"./structured-stream\";\nimport { runReasonToolLoop } from \"./tools\";\n\nconst shouldStreamReasonStructured = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): boolean => (args.emit ?? true) && shouldStreamStructured(args.structured);\n\nconst resolveEffectiveReasoningIncludeThoughts = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): boolean =>\n args.reasoning?.includeThoughts ??\n args.model.options?.reasoning?.includeThoughts ??\n false;\n\nconst resolveEffectiveResponseFormatType = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): \"text\" | \"json\" | undefined =>\n args.responseFormat?.type ?? args.model.options?.responseFormat?.type;\n\nconst assertReasoningThoughtsCompatibility = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): void => {\n if (!resolveEffectiveReasoningIncludeThoughts(args)) return;\n\n const usesStructuredOutput =\n Boolean(args.outputSchema) ||\n Boolean(args.interrupt) ||\n Boolean(args.structured) ||\n resolveEffectiveResponseFormatType(args) === \"json\";\n\n if (!usesStructuredOutput) return;\n\n throw new Error(\n \"useReason does not support reasoning.includeThoughts with structured output, interrupt mode, or JSON responseFormat. Disable includeThoughts for this call.\",\n );\n};\n\nexport async function useReason<\n TOutput = unknown,\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): Promise<UseReasonResult<TOutput, TResponse>> {\n assertReasoningThoughtsCompatibility(args);\n const ctx = getHookContext();\n const abortSignal = combineAbortSignals(\n ctx.node.abortSignal,\n args.abortSignal,\n args.model.options?.abortSignal,\n );\n throwIfExecutionAborted(abortSignal);\n const allowValidatedToolOutput = Boolean(\n args.outputSchema &&\n !(args.responseFormat ?? args.model.options?.responseFormat),\n );\n const inferred = inferOutputFormat(\n args.outputSchema,\n args.responseFormat ?? args.model.options?.responseFormat,\n );\n args = {\n ...args,\n abortSignal,\n ...(!args.interrupt && inferred.responseFormat\n ? { responseFormat: inferred.responseFormat }\n : {}),\n };\n const id =\n typeof args.id === \"string\" && args.id.length > 0 ? args.id : undefined;\n const opId = createRuntimeId();\n const checkpointKey = resolveReasonCheckpointKey({\n ...(id ? { id } : {}),\n autoIndex: ctx.reasonCallIndex++,\n });\n const existingCompleted = readReasonCompletedCheckpoint(\n ctx.currentNodeState.byKey[checkpointKey],\n );\n\n if (existingCompleted) {\n return existingCompleted.result as UseReasonResult<TOutput, TResponse>;\n }\n\n const existingCheckpoint = readReasonCheckpoint(\n ctx.currentNodeState.byKey[checkpointKey],\n );\n\n const reasonMeta =\n typeof id === \"string\" ? ({ id, opId } as const) : ({ opId } as const);\n const traceSpan: ReasonTraceSpan | undefined =\n getReasonTraceAdapter()?.startSpan({\n name: \"useReason\",\n attributes: {\n ...(id ? { id } : {}),\n opId,\n nodeId: ctx.node.graph.node,\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n stream: args.stream ?? args.model.options?.streaming ?? true,\n emit: args.emit ?? true,\n ...(args.telemetry?.operation\n ? { operation: args.telemetry.operation }\n : {}),\n ...(args.telemetry?.prompt?.name\n ? { promptName: args.telemetry.prompt.name }\n : {}),\n ...(args.telemetry?.prompt?.version !== undefined\n ? { promptVersion: args.telemetry.prompt.version }\n : {}),\n ...(args.telemetry?.prompt?.type\n ? { promptType: args.telemetry.prompt.type }\n : {}),\n hasOutputSchema: Boolean(args.outputSchema),\n hasInterrupt: Boolean(args.interrupt),\n hasStructured: Boolean(args.structured),\n hasTools: Boolean(args.tools?.length),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n input: args.telemetry?.input ?? args.input,\n },\n });\n\n if (args.tools?.length) {\n return runReasonToolLoop({\n useReasonArgs: args,\n allowValidatedToolOutput,\n checkpointKey,\n initialWarnings: inferred.warnings,\n ...(id ? { id } : {}),\n opId,\n ...(traceSpan ? { traceSpan } : {}),\n });\n }\n const suppressTextStream = Boolean(args.outputSchema || args.interrupt);\n const setFieldPaths = resolveSetFieldPaths(args.structured);\n const appendFieldPaths = resolveAppendFieldPaths(args.structured);\n const textDeltaFieldPaths = resolveTextDeltaFieldPaths(args.structured);\n const useStructuredIncrementalStreaming = Boolean(\n args.outputSchema &&\n !args.interrupt &&\n (setFieldPaths.length > 0 ||\n appendFieldPaths.length > 0 ||\n textDeltaFieldPaths.length > 0) &&\n args.stream !== false &&\n shouldStreamReasonStructured(args),\n );\n\n let firstText = \"\";\n let firstRaw: unknown;\n let firstOutput: TOutput | undefined;\n let firstInterruptRequest: TRequest | undefined;\n let firstInterruptRequired = false;\n\n let finalText = \"\";\n let finalRaw: unknown;\n let finalOutput: TOutput | undefined;\n let aggregatedUsage: KortyxUsage | undefined;\n let finalFinishReason: KortyxFinishReason | undefined;\n let aggregatedProviderMetadata: KortyxProviderMetadata | undefined;\n let aggregatedWarnings: KortyxWarning[] | undefined = inferred.warnings;\n\n if (existingCheckpoint) {\n firstText = existingCheckpoint.firstText;\n firstRaw = existingCheckpoint.firstRaw;\n firstOutput = existingCheckpoint.firstOutput as TOutput | undefined;\n finalText = firstText;\n finalRaw = firstRaw;\n finalOutput = firstOutput;\n aggregatedUsage = existingCheckpoint.firstUsage;\n finalFinishReason = existingCheckpoint.firstFinishReason;\n aggregatedProviderMetadata = existingCheckpoint.firstProviderMetadata;\n aggregatedWarnings = existingCheckpoint.firstWarnings;\n traceSpan?.addEvent?.(\"useReason.resume\", {\n checkpointKey,\n });\n } else {\n const first = await reasonEngine(\n {\n ...args,\n emit: suppressTextStream ? false : args.emit,\n stream: useStructuredIncrementalStreaming\n ? true\n : suppressTextStream\n ? false\n : args.stream,\n ...(useStructuredIncrementalStreaming\n ? {\n onTextChunk: createStructuredOutputStreamer(args, id, opId),\n }\n : {}),\n },\n reasonMeta,\n args.interrupt\n ? defaultInterruptFirstPassInput({\n input: args.input,\n requestSchema: args.interrupt.requestSchema,\n mode: args.interrupt.mode ?? \"required\",\n ...(args.outputSchema\n ? { outputSchema: args.outputSchema as SchemaLike<unknown> }\n : {}),\n })\n : args.outputSchema\n ? withOutputGuardrails(\n withStructuredStreamHints(args.input, {\n ...(setFieldPaths.length > 0 ? { setFieldPaths } : {}),\n ...(appendFieldPaths.length > 0 ? { appendFieldPaths } : {}),\n ...(textDeltaFieldPaths.length > 0\n ? { textDeltaFieldPaths }\n : {}),\n }),\n args.outputSchema as SchemaLike<unknown>,\n )\n : undefined,\n );\n firstRaw = first.raw;\n finalRaw = first.raw;\n accumulateTokenUsage(first.usage);\n aggregatedUsage = mergeUsage(aggregatedUsage, first.usage);\n finalFinishReason = first.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n first.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, first.warnings);\n traceSpan?.addEvent?.(\"useReason.first-pass.complete\", {\n textLength: first.text.length,\n hasInterrupt: Boolean(args.interrupt),\n });\n\n if (args.interrupt) {\n const firstPass = parseInterruptFirstPassResult<TRequest, TOutput>({\n text: first.text,\n requestSchema: args.interrupt.requestSchema,\n ...(first.finishReason ? { finishReason: first.finishReason } : {}),\n ...(first.usage ? { usage: first.usage } : {}),\n ...(args.outputSchema\n ? { outputSchema: args.outputSchema as SchemaLike<TOutput> }\n : {}),\n mode: args.interrupt.mode ?? \"required\",\n });\n firstText = firstPass.draftText;\n finalText = firstPass.draftText;\n firstInterruptRequired = firstPass.interruptRequired;\n firstInterruptRequest = firstPass.request;\n firstOutput = firstPass.output;\n finalOutput = firstPass.output;\n } else {\n firstText = first.text;\n finalText = first.text;\n if (args.outputSchema) {\n firstOutput = parseReasonOutputWithSchema({\n text: first.text,\n schema: args.outputSchema,\n ...(first.finishReason ? { finishReason: first.finishReason } : {}),\n ...(first.usage ? { usage: first.usage } : {}),\n label: \"useReason output\",\n });\n }\n finalOutput = firstOutput;\n }\n }\n\n let interruptResponse: TResponse | undefined;\n\n if (args.interrupt && (existingCheckpoint || firstInterruptRequired)) {\n const requestSchema = args.interrupt.requestSchema;\n\n const interruptRequest = existingCheckpoint\n ? parseWithSchema(\n requestSchema,\n existingCheckpoint.request,\n \"useReason interrupt.request\",\n )\n : firstInterruptRequest;\n\n if (!interruptRequest) {\n throw new Error(\n \"useReason interrupt request is missing; first pass did not produce a valid interrupt payload.\",\n );\n }\n\n if (!existingCheckpoint) {\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"awaiting_interrupt\",\n request: interruptRequest,\n firstText,\n ...(firstRaw !== undefined ? { firstRaw } : {}),\n ...(aggregatedUsage !== undefined\n ? { firstUsage: aggregatedUsage }\n : {}),\n ...(finalFinishReason !== undefined\n ? { firstFinishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { firstProviderMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { firstWarnings: aggregatedWarnings }\n : {}),\n ...(firstOutput !== undefined ? { firstOutput } : {}),\n } satisfies ReasonInterruptCheckpoint;\n ctx.stateDirty = true;\n }\n\n const resumeStatePatch = resolveHookStatePatch({\n nodeId: ctx.node.graph.node,\n currentNodeState: ctx.currentNodeState,\n workflowState: ctx.workflowState,\n });\n\n interruptResponse = await awaitInterruptInternal<TRequest, TResponse>({\n request: interruptRequest,\n requestSchema,\n responseSchema: args.interrupt.responseSchema,\n ...(args.interrupt.schemaId ? { schemaId: args.interrupt.schemaId } : {}),\n ...(args.interrupt.schemaVersion\n ? { schemaVersion: args.interrupt.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n meta: {\n __kortyxResumeStatePatch: resumeStatePatch,\n },\n });\n traceSpan?.addEvent?.(\"useReason.interrupt.resolved\", {\n checkpointKey,\n });\n\n if (Object.hasOwn(ctx.currentNodeState.byKey, checkpointKey)) {\n delete ctx.currentNodeState.byKey[checkpointKey];\n ctx.stateDirty = true;\n }\n\n const continuationInput = defaultContinuationInput({\n input: args.input,\n draftText: firstText,\n ...(firstOutput !== undefined ? { draftOutput: firstOutput } : {}),\n request: interruptRequest,\n response: interruptResponse,\n });\n\n const second = await reasonEngine(\n {\n ...args,\n ...(inferred.responseFormat\n ? { responseFormat: inferred.responseFormat }\n : {}),\n emit: suppressTextStream ? false : args.emit,\n stream: suppressTextStream ? false : args.stream,\n },\n reasonMeta,\n args.outputSchema\n ? withOutputGuardrails(\n continuationInput,\n args.outputSchema as SchemaLike<unknown>,\n )\n : continuationInput,\n );\n finalText = second.text;\n finalRaw = second.raw;\n accumulateTokenUsage(second.usage);\n aggregatedUsage = mergeUsage(aggregatedUsage, second.usage);\n finalFinishReason = second.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n second.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, second.warnings);\n traceSpan?.addEvent?.(\"useReason.continuation.complete\", {\n textLength: second.text.length,\n });\n\n if (args.outputSchema) {\n finalOutput = parseReasonOutputWithSchema({\n text: finalText,\n schema: args.outputSchema,\n ...(second.finishReason ? { finishReason: second.finishReason } : {}),\n ...(aggregatedUsage ? { usage: aggregatedUsage } : {}),\n label: \"useReason output\",\n });\n }\n }\n\n if (finalOutput !== undefined) {\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: finalOutput,\n structured: args.structured,\n emit: args.emit ?? true,\n });\n }\n\n const result = {\n ...(id ? { id } : {}),\n opId,\n text: finalText,\n ...(finalRaw !== undefined ? { raw: finalRaw } : {}),\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n ...(finalOutput !== undefined ? { output: finalOutput } : {}),\n ...(interruptResponse !== undefined ? { interruptResponse } : {}),\n };\n\n if (args.interrupt) {\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"completed\",\n result,\n };\n ctx.stateDirty = true;\n }\n\n traceSpan?.end?.({\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n attributes: {\n textLength: finalText.length,\n resumedFromCheckpoint: Boolean(existingCheckpoint),\n interrupted: Boolean(interruptResponse !== undefined),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n output: args.telemetry?.output ?? finalOutput ?? finalText,\n },\n });\n\n return result;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { getHookContext } from \"./context\";\nimport { assertStructuredPath } from \"./structured-path\";\nimport type { UseReasonStructuredConfig, UseStructuredDataArgs } from \"./types\";\nimport { parseWithSchema } from \"./validation\";\n\nconst createStructuredStreamId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nexport const emitStructuredData = <TData = unknown>(\n args: UseStructuredDataArgs<TData>,\n): void => {\n const ctx = getHookContext();\n const streamId =\n typeof args.streamId === \"string\" && args.streamId.length > 0\n ? args.streamId\n : createStructuredStreamId();\n const dataType =\n typeof args.dataType === \"string\" && args.dataType.length > 0\n ? args.dataType\n : \"generic\";\n\n const base = {\n node: ctx.node.graph.node,\n streamId,\n dataType,\n ...(typeof args.schemaId === \"string\" && args.schemaId.length > 0\n ? { schemaId: args.schemaId }\n : {}),\n ...(typeof args.schemaVersion === \"string\" && args.schemaVersion.length > 0\n ? { schemaVersion: args.schemaVersion }\n : {}),\n ...(typeof args.id === \"string\" && args.id.length > 0\n ? { id: args.id }\n : {}),\n };\n\n if (args.kind === \"set\") {\n assertStructuredPath(args.path, \"useStructuredData\");\n const value = parseWithSchema(\n args.valueSchema,\n args.value,\n \"useStructuredData value\",\n );\n ctx.node.emit(\"structured_data\", {\n ...base,\n kind: \"set\",\n path: args.path,\n value,\n });\n return;\n }\n\n if (args.kind === \"append\") {\n assertStructuredPath(args.path, \"useStructuredData\");\n const items = args.items.map((item) =>\n parseWithSchema(args.itemSchema, item, \"useStructuredData append item\"),\n );\n ctx.node.emit(\"structured_data\", {\n ...base,\n kind: \"append\",\n path: args.path,\n items,\n });\n return;\n }\n\n if (args.kind === \"text-delta\") {\n assertStructuredPath(args.path, \"useStructuredData\");\n ctx.node.emit(\"structured_data\", {\n ...base,\n kind: \"text-delta\",\n path: args.path,\n delta: args.delta,\n });\n return;\n }\n\n const validated = parseWithSchema(\n args.dataSchema,\n args.data,\n \"useStructuredData data\",\n );\n\n ctx.node.emit(\"structured_data\", {\n ...base,\n kind: \"final\",\n data: validated,\n });\n};\n\nexport const shouldEmitStructured = (\n cfg: UseReasonStructuredConfig | undefined,\n): boolean => Boolean(cfg);\n\nexport const shouldStreamStructured = (\n cfg: UseReasonStructuredConfig | undefined,\n): boolean => Boolean(cfg) && (cfg?.stream ?? true);\n","export const parseStructuredPath = (path: string, source: string): string[] => {\n if (path.length === 0) {\n throw new Error(`${source} path must be a non-empty dot-separated string.`);\n }\n\n const parts = path.split(\".\");\n if (parts.some((part) => part.length === 0)) {\n throw new Error(\n `${source} path \"${path}\" must not contain empty segments.`,\n );\n }\n\n return parts;\n};\n\nexport const assertStructuredPath = (path: string, source: string): void => {\n parseStructuredPath(path, source);\n};\n","import { randomUUID } from \"node:crypto\";\nimport { combineAbortSignals, throwIfExecutionAborted } from \"@kortyx/core\";\nimport type {\n KortyxPromptMessage,\n KortyxReasoningOptions,\n KortyxResponseFormat,\n KortyxToolDefinition,\n ProviderModelRef,\n} from \"@kortyx/providers\";\nimport { accumulateTokenUsage, getHookContext } from \"../context\";\nimport type { RunReasonEngineResult } from \"../reason-engine\";\nimport { runReasonEngine } from \"../reason-engine\";\nimport type { KortyxTraceMetadata } from \"../tracing\";\n\nexport type ReasonEngineInput = {\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | undefined;\n maxOutputTokens?: number | undefined;\n stopSequences?: string[] | undefined;\n abortSignal?: AbortSignal | undefined;\n reasoning?: KortyxReasoningOptions | undefined;\n responseFormat?: KortyxResponseFormat | undefined;\n providerOptions?: Record<string, unknown> | undefined;\n tools?: KortyxToolDefinition[] | undefined;\n messages?: KortyxPromptMessage[] | undefined;\n emit?: boolean | undefined;\n stream?: boolean | undefined;\n onTextChunk?: ((text: string) => void) | undefined;\n telemetry?: KortyxTraceMetadata | undefined;\n};\n\nexport const createRuntimeId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nexport async function reasonEngine(\n args: ReasonEngineInput,\n meta: { id?: string; opId: string },\n inputOverride?: string,\n): Promise<RunReasonEngineResult> {\n const ctx = getHookContext();\n const abortSignal = combineAbortSignals(\n ctx.node.abortSignal,\n args.abortSignal,\n args.model.options?.abortSignal,\n );\n throwIfExecutionAborted(abortSignal);\n ctx.node.consumeExecution?.(\"maxModelPasses\");\n\n try {\n return await runReasonEngine({\n model: args.model,\n input: inputOverride ?? args.input,\n system: args.system,\n temperature: args.temperature,\n maxOutputTokens: args.maxOutputTokens,\n stopSequences: args.stopSequences,\n abortSignal,\n reasoning: args.reasoning,\n responseFormat: args.responseFormat,\n providerOptions: args.providerOptions,\n tools: args.tools,\n messages: args.messages,\n defaultTemperature: ctx.node.config?.model?.temperature,\n stream: args.stream,\n emit: args.emit,\n onTextChunk: args.onTextChunk,\n telemetry: args.telemetry,\n nodeId: ctx.node.graph.node,\n emitEvent: ctx.node.emit,\n reasonTrace: ctx.reasonTrace,\n id: meta.id,\n opId: meta.opId,\n });\n } catch (error) {\n const usage = (error as Partial<RunReasonEngineResult> | undefined)?.usage;\n if (usage) accumulateTokenUsage(usage);\n throw error;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport {\n createExecutionCancelledError,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport { KortyxError } from \"@kortyx/core/errors\";\nimport type {\n KortyxContinuation,\n KortyxFinishReason,\n KortyxPromptMessage,\n KortyxProviderMetadata,\n KortyxReasoningOptions,\n KortyxResponseFormat,\n KortyxToolCall,\n KortyxToolDefinition,\n KortyxUsage,\n KortyxWarning,\n ProviderModelRef,\n} from \"@kortyx/providers\";\nimport type {\n KortyxTraceMetadata,\n ReasonTraceAdapter,\n ReasonTraceSpan,\n} from \"./tracing\";\n\nfunction assertModelFinish(result: {\n finishReason?: KortyxFinishReason | undefined;\n usage?: KortyxUsage | undefined;\n}): void {\n if (result.finishReason?.unified !== \"content-filter\") return;\n throw Object.assign(\n new KortyxError(\"PROVIDER_REFUSAL\", \"The provider refused the request.\", {\n category: \"provider\",\n retryable: false,\n safeMessage: \"The provider refused the request.\",\n }),\n {\n ...(result.usage ? { usage: result.usage } : {}),\n finishReason: result.finishReason,\n },\n );\n}\n\nexport interface RunReasonEngineArgs {\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | undefined;\n maxOutputTokens?: number | undefined;\n stopSequences?: string[] | undefined;\n abortSignal?: AbortSignal | undefined;\n reasoning?: KortyxReasoningOptions | undefined;\n responseFormat?: KortyxResponseFormat | undefined;\n providerOptions?: Record<string, unknown> | undefined;\n tools?: KortyxToolDefinition[] | undefined;\n messages?: KortyxPromptMessage[] | undefined;\n defaultTemperature?: number | undefined;\n stream?: boolean | undefined;\n emit?: boolean | undefined;\n nodeId?: string | undefined;\n emitEvent?: ((event: string, payload: unknown) => void) | undefined;\n onTextChunk?: ((text: string) => void) | undefined;\n id?: string | undefined;\n opId?: string | undefined;\n segmentId?: string | undefined;\n telemetry?: KortyxTraceMetadata | undefined;\n reasonTrace?: ReasonTraceAdapter | undefined;\n}\n\nexport interface RunReasonEngineResult {\n continuation?: KortyxContinuation;\n text: string;\n raw?: unknown;\n usage?: KortyxUsage;\n finishReason?: KortyxFinishReason;\n toolCalls?: KortyxToolCall[];\n providerMetadata?: KortyxProviderMetadata;\n warnings?: KortyxWarning[];\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\nconst createRuntimeId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nconst emitNodeEvent = (\n emitEvent: RunReasonEngineArgs[\"emitEvent\"],\n nodeId: string | undefined,\n event: string,\n payload: Record<string, unknown>,\n): void => {\n if (!emitEvent) return;\n emitEvent(event, {\n ...payload,\n ...(typeof nodeId === \"string\" && nodeId.length > 0\n ? { node: nodeId }\n : {}),\n });\n};\n\nexport const resolveProviderOptions = (\n defaults: Record<string, unknown> | undefined,\n overrides: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined => {\n const providerOptions =\n defaults || overrides ? { ...defaults, ...overrides } : undefined;\n // Provider namespaces inherit model defaults (including transport) while\n // allowing individual call settings to override them.\n for (const [key, value] of Object.entries(overrides ?? {})) {\n const previous = defaults?.[key];\n if (\n previous &&\n value &&\n typeof previous === \"object\" &&\n typeof value === \"object\" &&\n !Array.isArray(previous) &&\n !Array.isArray(value)\n ) {\n if (providerOptions) providerOptions[key] = { ...previous, ...value };\n }\n }\n return providerOptions;\n};\n\nexport async function runReasonEngine(\n args: RunReasonEngineArgs,\n): Promise<RunReasonEngineResult> {\n let stream = args.stream ?? args.model.options?.streaming ?? true;\n const emit = args.emit ?? true;\n const temperature =\n args.temperature ??\n args.model.options?.temperature ??\n args.defaultTemperature;\n const maxOutputTokens =\n args.maxOutputTokens ?? args.model.options?.maxOutputTokens;\n const stopSequences = args.stopSequences ?? args.model.options?.stopSequences;\n const abortSignal = args.abortSignal ?? args.model.options?.abortSignal;\n const reasoning = args.reasoning ?? args.model.options?.reasoning;\n const responseFormat =\n args.responseFormat ?? args.model.options?.responseFormat;\n const providerOptions = resolveProviderOptions(\n args.model.options?.providerOptions,\n args.providerOptions,\n );\n const tools = args.tools ?? args.model.options?.tools;\n\n throwIfExecutionAborted(abortSignal);\n const model = args.model.provider.getModel(args.model.modelId, {\n ...(temperature !== undefined ? { temperature } : {}),\n streaming: stream,\n ...(maxOutputTokens !== undefined ? { maxOutputTokens } : {}),\n ...(stopSequences !== undefined ? { stopSequences } : {}),\n ...(abortSignal !== undefined ? { abortSignal } : {}),\n ...(reasoning !== undefined ? { reasoning } : {}),\n ...(responseFormat !== undefined ? { responseFormat } : {}),\n ...(tools !== undefined ? { tools } : {}),\n ...(providerOptions !== undefined ? { providerOptions } : {}),\n });\n\n if (tools?.length && !model.supportsToolStreaming) stream = false;\n\n const messages: KortyxPromptMessage[] =\n args.messages !== undefined\n ? args.messages\n : [\n ...(typeof args.system === \"string\" && args.system.length > 0\n ? [{ role: \"system\" as const, content: args.system }]\n : []),\n { role: \"user\" as const, content: String(args.input ?? \"\") },\n ];\n\n const opId =\n typeof args.opId === \"string\" && args.opId.length > 0\n ? args.opId\n : createRuntimeId();\n const segmentId =\n typeof args.segmentId === \"string\" && args.segmentId.length > 0\n ? args.segmentId\n : createRuntimeId();\n\n const commonMeta: Record<string, unknown> = {\n ...(typeof args.id === \"string\" && args.id.length > 0\n ? { id: args.id }\n : {}),\n opId,\n segmentId,\n };\n const traceSpan = args.reasonTrace?.startSpan({\n name: \"runReasonEngine\",\n attributes: {\n ...commonMeta,\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n stream,\n emit,\n ...(args.telemetry?.operation\n ? { operation: args.telemetry.operation }\n : {}),\n ...(args.telemetry?.prompt?.name\n ? { promptName: args.telemetry.prompt.name }\n : {}),\n ...(args.telemetry?.prompt?.version !== undefined\n ? { promptVersion: args.telemetry.prompt.version }\n : {}),\n ...(args.telemetry?.prompt?.type\n ? { promptType: args.telemetry.prompt.type }\n : {}),\n ...(typeof args.nodeId === \"string\" && args.nodeId.length > 0\n ? { nodeId: args.nodeId }\n : {}),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n input:\n args.telemetry?.input ??\n messages.map(\n ({ continuation: _continuation, raw: _raw, ...message }) => message,\n ),\n },\n });\n const modelRequestStartedAt = Date.now();\n let firstTextTokenAt: number | undefined;\n let lastTextTokenAt: number | undefined;\n\n const generationTimingAttributes = (): Record<string, number> =>\n firstTextTokenAt === undefined || lastTextTokenAt === undefined\n ? {}\n : {\n ttftMs: Math.max(0, firstTextTokenAt - modelRequestStartedAt),\n streamDurationMs: Math.max(0, lastTextTokenAt - firstTextTokenAt),\n timeToLastTokenMs: Math.max(\n 0,\n lastTextTokenAt - modelRequestStartedAt,\n ),\n };\n\n const endTrace = (\n span: ReasonTraceSpan | undefined,\n result: RunReasonEngineResult,\n ): void => {\n span?.end?.({\n ...(result.usage !== undefined ? { usage: result.usage } : {}),\n ...(result.finishReason !== undefined\n ? { finishReason: result.finishReason }\n : {}),\n ...(result.providerMetadata !== undefined\n ? { providerMetadata: result.providerMetadata }\n : {}),\n ...(result.warnings !== undefined ? { warnings: result.warnings } : {}),\n attributes: {\n textLength: result.text.length,\n ...generationTimingAttributes(),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n output: args.telemetry?.output ?? result.text,\n },\n });\n };\n\n const failTrace = (\n span: ReasonTraceSpan | undefined,\n error: unknown,\n ): void => {\n const detail = error as Partial<RunReasonEngineResult> | undefined;\n try {\n span?.fail?.(error, {\n ...(detail?.usage ? { usage: detail.usage } : {}),\n ...(detail?.finishReason ? { finishReason: detail.finishReason } : {}),\n ...(detail?.providerMetadata\n ? { providerMetadata: detail.providerMetadata }\n : {}),\n attributes: {\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n },\n });\n } catch {\n /* Reporting must not replace the execution failure. */\n }\n };\n\n try {\n if (stream) {\n let continuation: KortyxContinuation | undefined;\n let final = \"\";\n let raw: unknown;\n let usage: KortyxUsage | undefined;\n let finishReason: KortyxFinishReason | undefined;\n let toolCalls: KortyxToolCall[] | undefined;\n let providerMetadata: KortyxProviderMetadata | undefined;\n let warnings: KortyxWarning[] | undefined;\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-start\", {\n ...commonMeta,\n });\n }\n\n const response = await model.stream(messages);\n for await (const chunk of response) {\n throwIfExecutionAborted(abortSignal);\n switch (chunk.type) {\n case \"text-delta\": {\n if (chunk.delta.length === 0) break;\n const tokenAt = Date.now();\n firstTextTokenAt ??= tokenAt;\n lastTextTokenAt = tokenAt;\n final += chunk.delta;\n args.onTextChunk?.(chunk.delta);\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: chunk.delta,\n });\n }\n break;\n }\n case \"finish\": {\n continuation = chunk.continuation;\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.usage !== undefined) {\n usage = chunk.usage;\n }\n if (chunk.finishReason !== undefined) {\n finishReason = chunk.finishReason;\n }\n if (chunk.toolCalls !== undefined) {\n toolCalls = chunk.toolCalls;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (chunk.warnings !== undefined) {\n warnings = chunk.warnings;\n }\n break;\n }\n case \"raw\": {\n raw = chunk.raw;\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n break;\n }\n case \"error\": {\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (chunk.warnings !== undefined) {\n warnings = chunk.warnings;\n }\n throw toError(chunk.error);\n }\n }\n }\n\n throwIfExecutionAborted(abortSignal);\n assertModelFinish({ finishReason, usage });\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n const result = {\n text: final,\n ...(continuation ? { continuation } : {}),\n ...(raw !== undefined ? { raw } : {}),\n ...(usage !== undefined ? { usage } : {}),\n ...(finishReason !== undefined ? { finishReason } : {}),\n ...(toolCalls !== undefined ? { toolCalls } : {}),\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n ...(warnings !== undefined ? { warnings } : {}),\n };\n throwIfExecutionAborted(abortSignal);\n endTrace(traceSpan, result);\n return result;\n }\n\n const response = await model.invoke(messages);\n throwIfExecutionAborted(abortSignal);\n assertModelFinish(response);\n if (response.content) args.onTextChunk?.(response.content);\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-start\", {\n ...commonMeta,\n });\n if (response.content) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: response.content,\n });\n }\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n const result = {\n text: response.content,\n ...(response.continuation ? { continuation: response.continuation } : {}),\n ...(response.raw !== undefined ? { raw: response.raw } : {}),\n ...(response.usage !== undefined ? { usage: response.usage } : {}),\n ...(response.finishReason !== undefined\n ? { finishReason: response.finishReason }\n : {}),\n ...(response.toolCalls !== undefined\n ? { toolCalls: response.toolCalls }\n : {}),\n ...(response.providerMetadata !== undefined\n ? { providerMetadata: response.providerMetadata }\n : {}),\n ...(response.warnings !== undefined\n ? { warnings: response.warnings }\n : {}),\n };\n endTrace(traceSpan, result);\n return result;\n } catch (error) {\n const failure = abortSignal?.aborted\n ? createExecutionCancelledError()\n : error;\n failTrace(traceSpan, failure);\n throw failure;\n }\n}\n","import type { KortyxResponseFormat, KortyxWarning } from \"@kortyx/providers\";\nimport { toJSONSchema } from \"zod\";\nimport type { SchemaLike } from \"../types\";\n\n/** Infer the wire schema only when the caller did not choose a format. */\nexport function inferOutputFormat(\n schema: SchemaLike<unknown> | undefined,\n explicit: KortyxResponseFormat | undefined,\n): {\n responseFormat?: KortyxResponseFormat;\n warnings?: KortyxWarning[];\n} {\n if (explicit) return { responseFormat: explicit };\n if (!schema) return {};\n try {\n const json = toJSONSchema(schema as never) as Record<string, unknown>;\n const clean = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(clean);\n if (!value || typeof value !== \"object\") return value;\n const object = value as Record<string, unknown>;\n if (\n [\n \"allOf\",\n \"not\",\n \"dependentRequired\",\n \"dependentSchemas\",\n \"if\",\n \"then\",\n \"else\",\n \"prefixItems\",\n ].some((key) => key in object)\n )\n throw new Error(\n \"Schema composition requires an explicit provider schema\",\n );\n if (object.type === \"object\") {\n if (object.additionalProperties !== false)\n throw new Error(\n \"Dynamic properties require an explicit provider schema\",\n );\n const properties = object.properties as\n | Record<string, unknown>\n | undefined;\n const required = object.required as string[] | undefined;\n if (\n properties &&\n Object.keys(properties).some((key) => !required?.includes(key))\n ) {\n throw new Error(\n \"Optional properties require an explicit provider schema\",\n );\n }\n }\n return Object.fromEntries(\n Object.entries(object)\n .filter(([key]) => key !== \"$schema\" && key !== \"default\")\n .map(([key, child]) => {\n // Property and definition names are user data, not schema keywords.\n if (\n (key === \"properties\" ||\n key === \"$defs\" ||\n key === \"definitions\") &&\n child &&\n typeof child === \"object\"\n )\n return [\n key,\n Object.fromEntries(\n Object.entries(child).map(([name, definition]) => [\n name,\n clean(definition),\n ]),\n ),\n ];\n return [\n key,\n key === \"enum\" || key === \"const\" ? child : clean(child),\n ];\n }),\n );\n };\n if (json.type !== \"object\")\n throw new Error(\"The provider schema must have an object root\");\n return { responseFormat: { type: \"json\", schema: clean(json) } };\n } catch {\n return {\n responseFormat: { type: \"json\" },\n warnings: [\n {\n type: \"compatibility\",\n feature: \"outputSchema\",\n details:\n \"This validator cannot be inferred as a strict provider JSON schema. Kortyx still validates the final output locally. Supply responseFormat.schema to enforce a wire schema.\",\n },\n ],\n };\n }\n}\n","import { assertStructuredPath, parseStructuredPath } from \"../structured-path\";\nimport type { UseReasonStructuredConfig } from \"../types\";\n\nexport const resolveAppendFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const appendPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"append\")\n .map(([path]) => path);\n\n for (const path of appendPaths) {\n assertStructuredPath(path, \"useReason structured append\");\n }\n\n return appendPaths;\n};\n\nexport const resolveSetFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const setPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"set\")\n .map(([path]) => path);\n\n for (const path of setPaths) {\n assertStructuredPath(path, \"useReason structured set\");\n }\n\n return setPaths;\n};\n\nexport const resolveTextDeltaFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const textPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"text-delta\")\n .map(([path]) => path);\n\n for (const path of textPaths) {\n assertStructuredPath(path, \"useReason structured text-delta\");\n }\n\n return textPaths;\n};\n\nconst extractCompletedStringValueAt = (args: {\n text: string;\n start: number;\n}): { complete: boolean; value?: string } => {\n let value = \"\";\n\n for (let i = args.start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (ch === '\"') {\n return {\n complete: true,\n value,\n };\n }\n\n if (ch !== \"\\\\\") {\n value += ch;\n continue;\n }\n\n const next = args.text[i + 1];\n if (!next) {\n return {\n complete: false,\n };\n }\n\n if (\n next === '\"' ||\n next === \"\\\\\" ||\n next === \"/\" ||\n next === \"b\" ||\n next === \"f\" ||\n next === \"n\" ||\n next === \"r\" ||\n next === \"t\"\n ) {\n value +=\n next === \"b\"\n ? \"\\b\"\n : next === \"f\"\n ? \"\\f\"\n : next === \"n\"\n ? \"\\n\"\n : next === \"r\"\n ? \"\\r\"\n : next === \"t\"\n ? \"\\t\"\n : next;\n i += 1;\n continue;\n }\n\n if (next === \"u\") {\n const hex = args.text.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n return {\n complete: false,\n };\n }\n value += String.fromCharCode(Number.parseInt(hex, 16));\n i += 5;\n continue;\n }\n\n return {\n complete: false,\n };\n }\n\n return {\n complete: false,\n };\n};\n\nconst skipWhitespace = (text: string, start: number): number => {\n let i = start;\n while (i < text.length && /\\s/.test(text[i] ?? \"\")) i += 1;\n return i;\n};\n\nconst pathSegmentMatches = (patternPart: string, actualPart: string): boolean =>\n patternPart === \"*\" || patternPart === actualPart;\n\nconst pathMatchesPattern = (\n actualParts: string[],\n patternParts: string[],\n): boolean =>\n actualParts.length === patternParts.length &&\n actualParts.every((part, index) =>\n pathSegmentMatches(patternParts[index] ?? \"\", part),\n );\n\nconst isPathPrefix = (prefix: string[], full: string[]): boolean =>\n prefix.length <= full.length &&\n prefix.every((part, index) => pathSegmentMatches(full[index] ?? \"\", part));\n\nconst parseStringToken = (\n text: string,\n start: number,\n): { complete: boolean; end?: number; value?: string } => {\n if (text[start] !== '\"') return { complete: false };\n\n const parsed = extractCompletedStringValueAt({ text, start: start + 1 });\n if (!parsed.complete || parsed.value === undefined)\n return { complete: false };\n\n let inEscape = false;\n for (let i = start + 1; i < text.length; i += 1) {\n const ch = text[i];\n if (ch === undefined) break;\n\n if (inEscape) {\n inEscape = false;\n if (ch === \"u\") i += 4;\n continue;\n }\n\n if (ch === \"\\\\\") {\n inEscape = true;\n continue;\n }\n\n if (ch === '\"') {\n return {\n complete: true,\n end: i + 1,\n value: parsed.value,\n };\n }\n }\n\n return { complete: false };\n};\n\nconst skipNestedValue = (\n text: string,\n start: number,\n): { complete: boolean; end?: number } => {\n const opener = text[start];\n const closer = opener === \"{\" ? \"}\" : \"]\";\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n\n for (let i = start; i < text.length; i += 1) {\n const ch = text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === opener) {\n nesting += 1;\n continue;\n }\n\n if (ch === closer) {\n nesting -= 1;\n if (nesting === 0) {\n return { complete: true, end: i + 1 };\n }\n }\n }\n\n return { complete: false };\n};\n\nconst skipCompleteValue = (\n text: string,\n start: number,\n): { complete: boolean; end?: number } => {\n const i = skipWhitespace(text, start);\n const first = text[i];\n if (!first) return { complete: false };\n\n if (first === '\"') {\n const parsed = parseStringToken(text, i);\n return parsed.complete && parsed.end !== undefined\n ? { complete: true, end: parsed.end }\n : { complete: false };\n }\n\n if (first === \"{\" || first === \"[\") {\n return skipNestedValue(text, i);\n }\n\n for (let j = i; j < text.length; j += 1) {\n const ch = text[j];\n if (ch !== \",\" && ch !== \"}\" && ch !== \"]\") continue;\n\n const raw = text.slice(i, j).trim();\n if (!raw) return { complete: false };\n\n try {\n JSON.parse(raw);\n return { complete: true, end: j };\n } catch {\n return { complete: false };\n }\n }\n\n return { complete: false };\n};\n\nconst locateValueStart = (args: {\n text: string;\n path: string;\n}): { found: boolean; start?: number } => {\n const [first] = locateValueStarts(args);\n return first\n ? {\n found: true,\n start: first.start,\n }\n : {\n found: false,\n };\n};\n\nconst locateValueStarts = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; start: number }> => {\n const targetParts = parseStructuredPath(\n args.path,\n \"useReason structured field\",\n );\n const matches: Array<{ path: string; start: number }> = [];\n\n const visitValue = (start: number, currentParts: string[]): void => {\n const valueStart = skipWhitespace(args.text, start);\n if (pathMatchesPattern(currentParts, targetParts)) {\n matches.push({\n path: currentParts.join(\".\"),\n start: valueStart,\n });\n return;\n }\n\n if (!isPathPrefix(currentParts, targetParts)) {\n return;\n }\n\n const first = args.text[valueStart];\n if (first === \"{\") visitObject(valueStart + 1, currentParts);\n if (first === \"[\") visitArray(valueStart + 1, currentParts);\n };\n\n const visitObject = (start: number, currentParts: string[]): void => {\n let i = skipWhitespace(args.text, start);\n\n while (i < args.text.length) {\n const ch = args.text[i];\n if (ch === \"}\") return;\n if (ch === \",\") {\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (ch !== '\"') return;\n\n const key = parseStringToken(args.text, i);\n if (!key.complete || key.end === undefined || key.value === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, key.end);\n if (args.text[i] !== \":\") return;\n\n const valueStart = skipWhitespace(args.text, i + 1);\n const childParts = [...currentParts, key.value];\n if (pathMatchesPattern(childParts, targetParts)) {\n matches.push({\n path: childParts.join(\".\"),\n start: valueStart,\n });\n } else if (isPathPrefix(childParts, targetParts)) {\n visitValue(valueStart, childParts);\n }\n\n const skipped = skipCompleteValue(args.text, valueStart);\n if (!skipped.complete || skipped.end === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, skipped.end);\n if (args.text[i] === \",\") {\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (args.text[i] === \"}\") return;\n return;\n }\n };\n\n const visitArray = (start: number, currentParts: string[]): void => {\n let i = skipWhitespace(args.text, start);\n let index = 0;\n\n while (i < args.text.length) {\n if (args.text[i] === \"]\") return;\n\n const childParts = [...currentParts, String(index)];\n if (pathMatchesPattern(childParts, targetParts)) {\n matches.push({\n path: childParts.join(\".\"),\n start: i,\n });\n } else if (isPathPrefix(childParts, targetParts)) {\n visitValue(i, childParts);\n }\n\n const skipped = skipCompleteValue(args.text, i);\n if (!skipped.complete || skipped.end === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, skipped.end);\n if (args.text[i] === \",\") {\n index += 1;\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (args.text[i] === \"]\") return;\n return;\n }\n };\n\n visitValue(0, []);\n return matches;\n};\n\nconst extractCompletedValueAt = (args: {\n text: string;\n start: number;\n}): { complete: boolean; value?: unknown } => {\n const start = skipWhitespace(args.text, args.start);\n const first = args.text[start];\n if (!first) return { complete: false };\n\n if (first === '\"') {\n const parsed = extractCompletedStringValueAt({\n text: args.text,\n start: start + 1,\n });\n return parsed.complete\n ? {\n complete: true,\n value: parsed.value,\n }\n : {\n complete: false,\n };\n }\n\n if (first === \"{\") {\n return extractCompletedNestedValueAt({\n text: args.text,\n start,\n opener: \"{\",\n closer: \"}\",\n });\n }\n\n if (first === \"[\") {\n return extractCompletedNestedValueAt({\n text: args.text,\n start,\n opener: \"[\",\n closer: \"]\",\n });\n }\n\n for (let i = start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n if (ch !== \",\" && ch !== \"}\" && ch !== \"]\") continue;\n\n const raw = args.text.slice(start, i).trim();\n if (!raw) return { complete: false };\n\n try {\n return {\n complete: true,\n value: JSON.parse(raw),\n };\n } catch {\n return { complete: false };\n }\n }\n\n return { complete: false };\n};\n\nconst extractCompletedNestedValueAt = (args: {\n text: string;\n start: number;\n opener: \"{\" | \"[\";\n closer: \"}\" | \"]\";\n}): { complete: boolean; value?: unknown } => {\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n\n for (let i = args.start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === args.opener) {\n nesting += 1;\n continue;\n }\n\n if (ch === args.closer) {\n nesting -= 1;\n if (nesting === 0) {\n const raw = args.text.slice(args.start, i + 1);\n try {\n return {\n complete: true,\n value: JSON.parse(raw),\n };\n } catch {\n return {\n complete: false,\n };\n }\n }\n }\n }\n\n return {\n complete: false,\n };\n};\n\nexport const extractCompletedFieldValue = (args: {\n text: string;\n path: string;\n}): { found: boolean; complete: boolean; value?: unknown } => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) {\n return {\n found: located.found,\n complete: false,\n };\n }\n\n const parsed = extractCompletedValueAt({\n text: args.text,\n start: located.start,\n });\n return parsed.complete\n ? {\n found: true,\n complete: true,\n value: parsed.value,\n }\n : {\n found: true,\n complete: false,\n };\n};\n\nexport const extractCompletedFieldValues = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; value: unknown }> => {\n const located = locateValueStarts(args);\n const values: Array<{ path: string; value: unknown }> = [];\n\n for (const match of located) {\n const parsed = extractCompletedValueAt({\n text: args.text,\n start: match.start,\n });\n if (!parsed.complete) continue;\n\n values.push({\n path: match.path,\n value: parsed.value,\n });\n }\n\n return values;\n};\n\nexport const extractCompletedArrayItems = (args: {\n text: string;\n path: string;\n}): unknown[] => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) return [];\n\n const arrayStart = skipWhitespace(args.text, located.start);\n if (args.text[arrayStart] !== \"[\") return [];\n const start = arrayStart + 1;\n\n const items: unknown[] = [];\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n let itemStart = -1;\n\n for (let i = start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n if (itemStart < 0) itemStart = i;\n continue;\n }\n\n if (itemStart < 0) {\n if (/\\s/.test(ch) || ch === \",\") continue;\n if (ch === \"]\") break;\n itemStart = i;\n if (ch === \"{\" || ch === \"[\") {\n nesting = 1;\n } else {\n nesting = 0;\n }\n continue;\n }\n\n if (ch === \"{\" || ch === \"[\") {\n nesting += 1;\n continue;\n }\n\n if (ch === \"}\" || ch === \"]\") {\n if (nesting > 0) {\n nesting -= 1;\n continue;\n }\n }\n\n if (nesting === 0 && (ch === \",\" || ch === \"]\")) {\n const raw = args.text.slice(itemStart, i).trim();\n if (raw) {\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n itemStart = -1;\n if (ch === \"]\") break;\n }\n }\n\n return items;\n};\n\nexport const extractCompletedArrayItemGroups = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; items: unknown[] }> => {\n return locateValueStarts(args).flatMap((match) => {\n const items = extractCompletedArrayItems({\n text: args.text,\n path: match.path,\n });\n return items.length > 0\n ? [\n {\n path: match.path,\n items,\n },\n ]\n : [];\n });\n};\n\nexport const extractStreamingStringValue = (args: {\n text: string;\n path: string;\n}): { found: boolean; complete: boolean; value: string } => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) {\n return {\n found: located.found,\n complete: false,\n value: \"\",\n };\n }\n\n const stringStart = skipWhitespace(args.text, located.start);\n if (args.text[stringStart] !== '\"') {\n return {\n found: true,\n complete: false,\n value: \"\",\n };\n }\n\n let value = \"\";\n\n for (let i = stringStart + 1; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (ch === '\"') {\n return {\n found: true,\n complete: true,\n value,\n };\n }\n\n if (ch !== \"\\\\\") {\n value += ch;\n continue;\n }\n\n const next = args.text[i + 1];\n if (!next) {\n return {\n found: true,\n complete: false,\n value,\n };\n }\n\n if (\n next === '\"' ||\n next === \"\\\\\" ||\n next === \"/\" ||\n next === \"b\" ||\n next === \"f\" ||\n next === \"n\" ||\n next === \"r\" ||\n next === \"t\"\n ) {\n value +=\n next === \"b\"\n ? \"\\b\"\n : next === \"f\"\n ? \"\\f\"\n : next === \"n\"\n ? \"\\n\"\n : next === \"r\"\n ? \"\\r\"\n : next === \"t\"\n ? \"\\t\"\n : next;\n i += 1;\n continue;\n }\n\n if (next === \"u\") {\n const hex = args.text.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n return {\n found: true,\n complete: false,\n value,\n };\n }\n value += String.fromCharCode(Number.parseInt(hex, 16));\n i += 5;\n continue;\n }\n\n return {\n found: true,\n complete: false,\n value,\n };\n }\n\n return {\n found: true,\n complete: false,\n value,\n };\n};\n\nexport const extractStreamingStringValues = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; complete: boolean; value: string }> => {\n return locateValueStarts(args).flatMap((match) => {\n const current = extractStreamingStringValue({\n text: args.text,\n path: match.path,\n });\n return current.found\n ? [\n {\n path: match.path,\n complete: current.complete,\n value: current.value,\n },\n ]\n : [];\n });\n};\n","import { emitStructuredData } from \"../structured\";\nimport type { UseReasonStructuredConfig } from \"../types\";\nimport {\n extractCompletedArrayItemGroups,\n extractCompletedFieldValues,\n extractStreamingStringValues,\n resolveAppendFieldPaths,\n resolveSetFieldPaths,\n resolveTextDeltaFieldPaths,\n} from \"./structured-stream\";\n\nexport function createStructuredOutputStreamer(\n args: { structured?: UseReasonStructuredConfig | undefined },\n id: string | undefined,\n opId: string,\n) {\n let firstText = \"\";\n const setFieldPaths = resolveSetFieldPaths(args.structured);\n const appendFieldPaths = resolveAppendFieldPaths(args.structured);\n const textDeltaFieldPaths = resolveTextDeltaFieldPaths(args.structured);\n const emittedSetValues = new Map<string, string>();\n const emittedAppendCounts = new Map<string, number>();\n const emittedTextValues = new Map<string, string>();\n return (delta: string) => {\n firstText += delta;\n\n for (const fieldPath of setFieldPaths) {\n const values = extractCompletedFieldValues({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, value } of values) {\n const nextSerialized = JSON.stringify(value);\n if (emittedSetValues.get(path) === nextSerialized) continue;\n\n emittedSetValues.set(path, nextSerialized);\n emitStructuredData({\n kind: \"set\",\n path,\n value,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n\n for (const fieldPath of appendFieldPaths) {\n const groups = extractCompletedArrayItemGroups({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, items } of groups) {\n const emittedAppendCount = emittedAppendCounts.get(path) ?? 0;\n if (items.length <= emittedAppendCount) continue;\n\n const nextItems = items.slice(emittedAppendCount);\n emittedAppendCounts.set(path, items.length);\n emitStructuredData({\n kind: \"append\",\n path,\n items: nextItems,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n\n for (const fieldPath of textDeltaFieldPaths) {\n const values = extractStreamingStringValues({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, value } of values) {\n const emittedTextValue = emittedTextValues.get(path) ?? \"\";\n if (\n value.length <= emittedTextValue.length ||\n !value.startsWith(emittedTextValue)\n ) {\n continue;\n }\n\n const nextDelta = value.slice(emittedTextValue.length);\n emittedTextValues.set(path, value);\n if (nextDelta.length === 0) continue;\n\n emitStructuredData({\n kind: \"text-delta\",\n path,\n delta: nextDelta,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n };\n}\n","import type { InterruptInput } from \"@kortyx/core\";\nimport { ValidationError } from \"@kortyx/core/errors\";\nimport type { KortyxFinishReason, KortyxUsage } from \"@kortyx/providers\";\nimport type { SchemaLike } from \"../types\";\nimport { parseWithSchema } from \"../validation\";\n\nconst tryJsonParse = (\n value: string,\n):\n | { ok: true; value: unknown; error?: never }\n | { ok: false; error: string } => {\n try {\n return { ok: true, value: JSON.parse(value) };\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n};\n\nconst extractJsonCodeBlock = (value: string): string | null => {\n const match = value.match(/```(?:json)?\\s*([\\s\\S]*?)```/i);\n if (!match || typeof match[1] !== \"string\") return null;\n const inner = match[1].trim();\n return inner.length > 0 ? inner : null;\n};\n\nconst tryStringify = (value: unknown): string => {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nexport const resolveOutputCandidate = (text: string): unknown => {\n const trimmed = text.trim();\n if (!trimmed) return text;\n\n const direct = tryJsonParse(trimmed);\n if (direct.ok) return direct.value;\n\n const block = extractJsonCodeBlock(trimmed);\n if (block) {\n const parsedBlock = tryJsonParse(block);\n if (parsedBlock.ok) return parsedBlock.value;\n }\n\n return text;\n};\n\nconst createTruncatedStructuredOutputError = (\n label: string,\n cause?: unknown,\n): Error =>\n new ValidationError(\n \"OUTPUT_TRUNCATED\",\n `${label} was truncated before producing valid structured output. The model stopped due to output length. Increase maxOutputTokens or simplify the requested output.`,\n cause,\n );\n\nconst createInvalidStructuredOutputError = (\n label: string,\n cause?: unknown,\n): Error =>\n new ValidationError(\n \"INVALID_MODEL_JSON\",\n `${label} did not produce valid structured output. The model returned text instead of the expected JSON payload. Check outputSchema and provider structured-output settings.`,\n cause,\n );\n\nexport const parseReasonOutputWithSchema = <TOutput>(args: {\n text: string;\n schema: SchemaLike<TOutput>;\n finishReason?: KortyxFinishReason;\n usage?: KortyxUsage;\n label: string;\n}): TOutput => {\n const candidate = resolveOutputCandidate(args.text);\n const block = extractJsonCodeBlock(args.text.trim());\n const validJson =\n tryJsonParse(args.text.trim()).ok ||\n (block !== null && tryJsonParse(block).ok);\n\n try {\n return parseWithSchema(args.schema, candidate, args.label);\n } catch (error) {\n if (!(error instanceof ValidationError)) throw error;\n const failure =\n args.finishReason?.unified === \"length\"\n ? createTruncatedStructuredOutputError(args.label, error)\n : typeof candidate === \"string\" && !validJson\n ? createInvalidStructuredOutputError(args.label, error)\n : error;\n if (failure && typeof failure === \"object\")\n Object.assign(failure, {\n ...(args.usage ? { usage: args.usage } : {}),\n ...(args.finishReason ? { finishReason: args.finishReason } : {}),\n });\n throw failure;\n }\n};\n\nexport const parseInterruptFirstPassResult = <\n TRequest extends InterruptInput = InterruptInput,\n TOutput = unknown,\n>(args: {\n text: string;\n requestSchema: SchemaLike<TRequest>;\n outputSchema?: SchemaLike<TOutput>;\n finishReason?: KortyxFinishReason;\n usage?: KortyxUsage;\n mode?: \"required\" | \"optional\" | undefined;\n}):\n | {\n draftText: string;\n interruptRequired: boolean;\n request: TRequest;\n output?: TOutput;\n }\n | {\n draftText: string;\n interruptRequired: false;\n request?: undefined;\n output?: TOutput;\n } => {\n try {\n const candidate = resolveOutputCandidate(args.text);\n if (!isRecord(candidate)) {\n if (args.finishReason?.unified === \"length\") {\n throw createTruncatedStructuredOutputError(\"useReason output\");\n }\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\n throw createInvalidStructuredOutputError(\"useReason output\");\n }\n throw new ValidationError(\n \"MODEL_OUTPUT_SCHEMA\",\n \"useReason first pass with interrupt must return a JSON object.\",\n );\n }\n\n const mode = args.mode ?? \"required\";\n let interruptRequired = true;\n if (mode === \"optional\") {\n if (\n candidate.decision !== \"continue\" &&\n candidate.decision !== \"interrupt\"\n ) {\n throw new ValidationError(\n \"MODEL_OUTPUT_SCHEMA\",\n 'useReason optional interrupt first pass must include decision \"continue\" or \"interrupt\".',\n );\n }\n interruptRequired = candidate.decision === \"interrupt\";\n\n if (!interruptRequired) {\n const hasUnexpectedRequest = [\n candidate.interruptRequest,\n candidate.request,\n candidate.interrupt,\n ].some((value) => value !== null && value !== undefined);\n\n if (hasUnexpectedRequest) {\n throw new ValidationError(\n \"MODEL_OUTPUT_SCHEMA\",\n 'useReason optional interrupt first pass with decision \"continue\" must not include an interrupt request.',\n );\n }\n }\n }\n\n let request: TRequest | undefined;\n if (interruptRequired) {\n const requestCandidates: unknown[] = [\n candidate.interruptRequest,\n candidate.request,\n candidate.interrupt,\n mode === \"required\" ? candidate : undefined,\n ];\n const requestPayload = requestCandidates.find(\n (value) => value !== null && value !== undefined,\n );\n\n request = parseWithSchema(\n args.requestSchema,\n requestPayload,\n \"useReason interrupt.request\",\n );\n }\n\n let output: TOutput | undefined;\n if (args.outputSchema) {\n const outputPayload = Object.hasOwn(candidate, \"output\")\n ? candidate.output\n : candidate;\n try {\n output = parseWithSchema(\n args.outputSchema,\n outputPayload,\n \"useReason output\",\n );\n } catch (error) {\n if (!(error instanceof ValidationError)) throw error;\n if (args.finishReason?.unified === \"length\") {\n throw createTruncatedStructuredOutputError(\"useReason output\", error);\n }\n throw error;\n }\n }\n\n const explicitDraft =\n typeof candidate.draftText === \"string\" && candidate.draftText.length > 0\n ? candidate.draftText\n : typeof candidate.text === \"string\" && candidate.text.length > 0\n ? candidate.text\n : undefined;\n\n if (!args.outputSchema && !explicitDraft) {\n throw new ValidationError(\n \"MODEL_OUTPUT_SCHEMA\",\n \"useReason first pass with interrupt requires `draftText` when outputSchema is not provided.\",\n );\n }\n\n const draftText =\n explicitDraft ??\n (output !== undefined ? tryStringify(output) : String(args.text ?? \"\"));\n\n if (!interruptRequired) {\n return {\n draftText,\n interruptRequired: false,\n ...(output !== undefined ? { output } : {}),\n };\n }\n\n return {\n draftText,\n interruptRequired: true,\n request: request as TRequest,\n ...(output !== undefined ? { output } : {}),\n };\n } catch (error) {\n if (error && typeof error === \"object\")\n Object.assign(error, {\n ...(args.usage ? { usage: args.usage } : {}),\n ...(args.finishReason ? { finishReason: args.finishReason } : {}),\n });\n throw error;\n }\n};\n","import type { InterruptInput } from \"@kortyx/core\";\nimport { toJSONSchema } from \"zod\";\nimport type { SchemaLike } from \"../types\";\n\nconst tryStringify = (value: unknown): string => {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nconst tryGetSchemaHint = (schema: unknown): string | undefined => {\n try {\n const hint = toJSONSchema(schema as never);\n return JSON.stringify(hint, null, 2);\n } catch {\n return undefined;\n }\n};\n\nconst withSchemaHint = (\n input: string,\n label: string,\n schema: unknown,\n): string => {\n const hint = tryGetSchemaHint(schema);\n if (!hint) return input;\n return `${input}\\n\\n${label}:\\n${hint}`;\n};\n\nexport const defaultInterruptFirstPassInput = (args: {\n input: string;\n requestSchema: SchemaLike<unknown>;\n outputSchema?: SchemaLike<unknown>;\n mode?: \"required\" | \"optional\" | undefined;\n}): string => {\n const mode = args.mode ?? \"required\";\n const base =\n mode === \"optional\"\n ? args.outputSchema\n ? [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: decision, output, interruptRequest, draftText.\",\n '- decision must be either \"continue\" or \"interrupt\".',\n '- Use decision \"continue\" when you can produce the final output without asking the user.',\n '- Use decision \"interrupt\" only when user input is needed before finalizing.',\n \"- output must match the expected output JSON schema.\",\n '- When decision is \"interrupt\", interruptRequest must match the expected interrupt request JSON schema and must be a non-null object.',\n '- When decision is \"continue\", interruptRequest must be null.',\n \"- draftText should be a concise plain-language summary of output.\",\n ].join(\"\\n\\n\")\n : [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: decision, draftText, interruptRequest.\",\n '- decision must be either \"continue\" or \"interrupt\".',\n '- Use decision \"continue\" when you can produce the final answer without asking the user.',\n '- Use decision \"interrupt\" only when user input is needed before finalizing.',\n \"- draftText should be the current answer text.\",\n '- When decision is \"interrupt\", interruptRequest must match the expected interrupt request JSON schema and must be a non-null object.',\n '- When decision is \"continue\", interruptRequest must be null.',\n ].join(\"\\n\\n\")\n : args.outputSchema\n ? [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: output, interruptRequest, draftText.\",\n \"- output must match the expected output JSON schema.\",\n \"- interruptRequest must match the expected interrupt request JSON schema.\",\n \"- interruptRequest must be a non-null object.\",\n \"- draftText should be a concise plain-language summary of output.\",\n \"- If uncertain, still return a valid interruptRequest with safe default options.\",\n ].join(\"\\n\\n\")\n : [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: draftText, interruptRequest.\",\n \"- draftText should be the current draft answer text.\",\n \"- interruptRequest must match the expected interrupt request JSON schema.\",\n \"- interruptRequest must be a non-null object.\",\n \"- If uncertain, still return a valid interruptRequest with safe default options.\",\n ].join(\"\\n\\n\");\n\n const withInterruptSchema = withSchemaHint(\n base,\n \"Expected interrupt request JSON schema (for `interruptRequest`)\",\n args.requestSchema,\n );\n\n if (!args.outputSchema) return withInterruptSchema;\n const withOutputSchema = withSchemaHint(\n withInterruptSchema,\n \"Expected output JSON schema (for `output`)\",\n args.outputSchema,\n );\n return [\n withOutputSchema,\n \"JSON template:\",\n mode === \"optional\"\n ? '{ \"decision\": \"continue\", \"output\": { ... }, \"interruptRequest\": null, \"draftText\": \"...\" }'\n : '{ \"output\": { ... }, \"interruptRequest\": { ... }, \"draftText\": \"...\" }',\n ].join(\"\\n\\n\");\n};\n\nexport const defaultContinuationInput = (args: {\n input: string;\n draftText: string;\n draftOutput?: unknown;\n request: InterruptInput;\n response: unknown;\n}): string =>\n [\n \"You are continuing a paused reasoning task after user input.\",\n \"Update the previous result using the user response and return the final answer only.\",\n \"If the previous output was JSON, return JSON in the same schema.\",\n \"\",\n `Original request:\\n${args.input}`,\n `Draft answer text:\\n${args.draftText}`,\n `Draft output object:\\n${tryStringify(args.draftOutput ?? args.draftText)}`,\n `Interrupt request shown to user:\\n${tryStringify(args.request)}`,\n `User response:\\n${tryStringify(args.response)}`,\n ].join(\"\\n\\n\");\n\nexport const withOutputGuardrails = (\n input: string,\n schema?: SchemaLike<unknown>,\n): string => {\n const base = [\n input,\n \"Output rules:\",\n \"- Return only JSON, no markdown fences.\",\n \"- Ensure the response conforms to the expected output schema.\",\n \"- Do not include explanatory text outside the JSON object.\",\n ].join(\"\\n\\n\");\n return withSchemaHint(base, \"Expected output JSON schema\", schema);\n};\n\nexport const withStructuredStreamHints = (\n input: string,\n args: {\n setFieldPaths?: string[];\n appendFieldPaths?: string[];\n textDeltaFieldPaths?: string[];\n },\n): string => {\n const rules: string[] = [];\n\n for (const path of args.setFieldPaths ?? []) {\n rules.push(\n `- For the field path pattern \\`${path}\\`, write one stable final value and do not rewrite it after it is complete.`,\n );\n }\n\n for (const path of args.appendFieldPaths ?? []) {\n rules.push(\n `- For the array field path pattern \\`${path}\\`, write items in final order and finish each item before starting the next.`,\n );\n rules.push(\n `- Once an item in \\`${path}\\` is complete, do not rewrite or reorder earlier items.`,\n );\n }\n\n for (const path of args.textDeltaFieldPaths ?? []) {\n rules.push(\n `- For the string field path pattern \\`${path}\\`, write the value progressively by appending text to the end.`,\n );\n rules.push(\n `- Do not rewrite or replace the earlier prefix of \\`${path}\\` once emitted.`,\n );\n }\n\n if (rules.length === 0) return input;\n\n return [\n input,\n \"Streaming rules:\",\n ...rules,\n \"- Keep the overall response as valid JSON.\",\n ].join(\"\\n\\n\");\n};\n","import type {\n KortyxFinishReason,\n KortyxProviderMetadata,\n KortyxUsage,\n KortyxWarning,\n} from \"@kortyx/providers\";\nimport { emitStructuredData, shouldEmitStructured } from \"../structured\";\nimport type { UseReasonArgs } from \"../types\";\n\nexport const mergeUsage = (\n left: KortyxUsage | undefined,\n right: KortyxUsage | undefined,\n): KortyxUsage | undefined => {\n if (!left) return right;\n if (!right) return left;\n\n const sum = (\n a: number | undefined,\n b: number | undefined,\n ): number | undefined =>\n a === undefined && b === undefined ? undefined : (a ?? 0) + (b ?? 0);\n\n const raw =\n left.raw || right.raw\n ? {\n ...(left.raw ?? {}),\n ...(right.raw ?? {}),\n }\n : undefined;\n const input = sum(left.input, right.input);\n const output = sum(left.output, right.output);\n const total = sum(left.total, right.total);\n const reasoning = sum(left.reasoning, right.reasoning);\n const cacheRead = sum(left.cacheRead, right.cacheRead);\n const cacheWrite = sum(left.cacheWrite, right.cacheWrite);\n const merged: KortyxUsage = {\n ...(right.outputIncludesReasoning !== undefined\n ? { outputIncludesReasoning: right.outputIncludesReasoning }\n : {}),\n ...(right.inputIncludesCacheWrite !== undefined\n ? { inputIncludesCacheWrite: right.inputIncludesCacheWrite }\n : {}),\n ...(right.inputIncludesCacheRead !== undefined\n ? { inputIncludesCacheRead: right.inputIncludesCacheRead }\n : {}),\n };\n\n if (input !== undefined) merged.input = input;\n if (output !== undefined) merged.output = output;\n if (total !== undefined) merged.total = total;\n if (reasoning !== undefined) merged.reasoning = reasoning;\n if (cacheRead !== undefined) merged.cacheRead = cacheRead;\n if (cacheWrite !== undefined) merged.cacheWrite = cacheWrite;\n if (raw) merged.raw = raw;\n\n return merged;\n};\n\nexport const mergeWarnings = (\n left: KortyxWarning[] | undefined,\n right: KortyxWarning[] | undefined,\n): KortyxWarning[] | undefined => {\n if (!left?.length) return right;\n if (!right?.length) return left;\n\n const seen = new Set<string>();\n const merged: KortyxWarning[] = [];\n for (const warning of [...left, ...right]) {\n const key = JSON.stringify(warning);\n if (seen.has(key)) continue;\n seen.add(key);\n merged.push(warning);\n }\n return merged;\n};\n\nexport const mergeProviderMetadata = (\n left: KortyxProviderMetadata | undefined,\n right: KortyxProviderMetadata | undefined,\n): KortyxProviderMetadata | undefined => {\n if (!left) return right;\n if (!right) return left;\n return {\n ...left,\n ...right,\n };\n};\n\nexport const emitReasonStructuredOutput = <TOutput>(args: {\n id?: string;\n opId: string;\n output: TOutput;\n structured: UseReasonArgs<TOutput>[\"structured\"];\n emit: boolean;\n}): void => {\n if (!args.emit || !shouldEmitStructured(args.structured)) return;\n\n emitStructuredData<TOutput>({\n dataType: args.structured?.dataType ?? \"reason-output\",\n data: args.output,\n kind: \"final\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(args.id ? { id: args.id } : {}),\n streamId: args.opId,\n });\n};\n\nexport type ReasonResultAggregation = {\n usage?: KortyxUsage | undefined;\n finishReason?: KortyxFinishReason | undefined;\n providerMetadata?: KortyxProviderMetadata | undefined;\n warnings?: KortyxWarning[] | undefined;\n};\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { combineAbortSignals, throwIfExecutionAborted } from \"@kortyx/core\";\nimport { isControlFlowError, serializeFailure } from \"@kortyx/core/errors\";\nimport type {\n KortyxExecutableTool,\n KortyxFinishReason,\n KortyxPromptMessage,\n KortyxProviderMetadata,\n KortyxToolCall,\n KortyxToolDefinition,\n KortyxToolResult,\n KortyxUsage,\n KortyxWarning,\n} from \"@kortyx/providers\";\nimport { accumulateTokenUsage, getHookContext } from \"../context\";\nimport { awaitInterruptInternal } from \"../interrupt\";\nimport {\n type RunReasonEngineResult,\n resolveProviderOptions,\n} from \"../reason-engine\";\nimport { shouldStreamStructured } from \"../structured\";\nimport type { ReasonTraceSpan } from \"../tracing\";\nimport type { UseReasonArgs, UseReasonResult, UseReasonStep } from \"../types\";\nimport { reasonEngine } from \"./engine\";\nimport { createStructuredOutputStreamer } from \"./output-stream\";\nimport { parseReasonOutputWithSchema } from \"./parsing\";\nimport { withOutputGuardrails } from \"./prompting\";\nimport {\n emitReasonStructuredOutput,\n mergeProviderMetadata,\n mergeUsage,\n mergeWarnings,\n} from \"./result\";\n\nconst toToolDefinitions = (\n tools: KortyxExecutableTool[],\n): KortyxToolDefinition[] =>\n tools.map((tool) => ({\n name: tool.name,\n ...(tool.title ? { title: tool.title } : {}),\n ...(tool.description ? { description: tool.description } : {}),\n inputSchema: tool.inputSchema,\n ...(tool.outputSchema !== undefined\n ? { outputSchema: tool.outputSchema }\n : {}),\n ...(tool.annotations !== undefined\n ? { annotations: tool.annotations }\n : {}),\n ...(tool.metadata !== undefined ? { metadata: tool.metadata } : {}),\n }));\n\nconst resolveToolExecutionBoolean = (\n value: boolean | Record<string, boolean> | undefined,\n toolName: string,\n fallback: boolean,\n): boolean => {\n if (typeof value === \"boolean\") return value;\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value[toolName] ?? fallback;\n }\n return fallback;\n};\n\nconst normalizeToolResult = (\n toolCall: KortyxToolCall,\n value: KortyxToolResult | unknown,\n): KortyxToolResult => {\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n \"toolCallId\" in value &&\n \"name\" in value &&\n \"content\" in value\n ) {\n return value as KortyxToolResult;\n }\n\n let content: string;\n try {\n content = typeof value === \"string\" ? value : JSON.stringify(value);\n } catch {\n content = String(value);\n }\n\n return {\n toolCallId: toolCall.id,\n name: toolCall.name,\n content,\n ...(value !== undefined &&\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ? { structuredContent: value }\n : {}),\n };\n};\n\nconst closeOwnedTools = async (\n tools: KortyxExecutableTool[],\n preserveFailure = false,\n traceSpan?: ReasonTraceSpan,\n): Promise<void> => {\n const closeFns = new Set<NonNullable<KortyxExecutableTool[\"close\"]>>();\n for (const tool of tools) {\n if (tool.closeAfterUse === false || !tool.close) continue;\n closeFns.add(tool.close);\n }\n\n try {\n await Promise.all(\n [...closeFns].map(async (close) => {\n await close();\n }),\n );\n } catch (error) {\n if (!preserveFailure) throw error;\n try {\n traceSpan?.addEvent?.(\"useReason.cleanup.failed\", {\n failure: serializeFailure(error),\n });\n } catch {\n /* Preserve the primary failure. */\n }\n }\n};\n\nconst createInitialMessages = (args: {\n system?: string | undefined;\n input: string;\n}): KortyxPromptMessage[] => [\n ...(typeof args.system === \"string\" && args.system.length > 0\n ? [{ role: \"system\" as const, content: args.system }]\n : []),\n { role: \"user\" as const, content: String(args.input ?? \"\") },\n];\n\nexport const runReasonToolLoop = async <\n TOutput,\n TRequest extends InterruptInput,\n TResponse = InterruptResult,\n>(args: {\n useReasonArgs: UseReasonArgs<TOutput, TRequest, TResponse>;\n id?: string | undefined;\n opId: string;\n traceSpan?: ReasonTraceSpan | undefined;\n checkpointKey: string;\n initialWarnings?: KortyxWarning[] | undefined;\n allowValidatedToolOutput?: boolean;\n}): Promise<UseReasonResult<TOutput, TResponse>> => {\n const { useReasonArgs, id, traceSpan, checkpointKey } = args;\n const ctx = getHookContext();\n const abortSignal = combineAbortSignals(\n ctx.node.abortSignal,\n useReasonArgs.abortSignal,\n useReasonArgs.model.options?.abortSignal,\n );\n const saved = ctx.currentNodeState.byKey[checkpointKey] as\n | ToolLoopCheckpoint\n | undefined;\n const checkpoint = saved?.status === \"tool_loop\" ? saved : undefined;\n const opId = checkpoint?.opId ?? args.opId;\n let primaryFailure = false;\n const tools = useReasonArgs.tools ?? [];\n const toolByName = new Map<string, KortyxExecutableTool>();\n let validationCompleted = false;\n let separateOutput = false;\n\n try {\n for (const tool of tools) {\n if (toolByName.has(tool.name)) {\n throw new Error(\n `useReason received duplicate tool name \"${tool.name}\".`,\n );\n }\n toolByName.set(tool.name, tool);\n }\n\n if (useReasonArgs.interrupt) {\n throw new Error(\n \"useReason tools cannot be combined with useReason interrupt mode yet. Use toolExecution.approval for tool approval.\",\n );\n }\n\n separateOutput = Boolean(\n useReasonArgs.model.provider.getModel(useReasonArgs.model.modelId, {\n ...useReasonArgs.model.options,\n ...(useReasonArgs.reasoning !== undefined\n ? { reasoning: useReasonArgs.reasoning }\n : {}),\n ...(useReasonArgs.responseFormat\n ? { responseFormat: useReasonArgs.responseFormat }\n : {}),\n providerOptions:\n resolveProviderOptions(\n useReasonArgs.model.options?.providerOptions,\n useReasonArgs.providerOptions,\n ) ?? {},\n }).requiresSeparateStructuredOutput,\n );\n validationCompleted = true;\n } finally {\n if (!validationCompleted) {\n // Preserve the validation failure even if request-owned cleanup also fails.\n await closeOwnedTools(tools, true, traceSpan);\n }\n }\n\n const toolDefinitions = toToolDefinitions(tools);\n let finalizing = checkpoint?.finalizing ?? false;\n let completed = false;\n const maxSteps = Math.max(1, useReasonArgs.toolExecution?.maxSteps ?? 3);\n const messages =\n checkpoint?.messages ??\n createInitialMessages({\n system: useReasonArgs.system,\n input: useReasonArgs.outputSchema\n ? withOutputGuardrails(useReasonArgs.input, useReasonArgs.outputSchema)\n : useReasonArgs.input,\n });\n const steps: UseReasonStep[] = checkpoint?.steps ?? [];\n const allToolCalls: KortyxToolCall[] = steps.flatMap(\n (step) => step.toolCalls,\n );\n const allToolResults: KortyxToolResult[] = steps.flatMap(\n (step) => step.toolResults,\n );\n let finalText = \"\";\n let finalRaw: unknown;\n let finalOutput: TOutput | undefined;\n let aggregatedUsage = steps.reduce<KortyxUsage | undefined>(\n (usage, step) => mergeUsage(usage, step.usage),\n undefined,\n );\n let finalFinishReason: KortyxFinishReason | undefined;\n let aggregatedProviderMetadata: KortyxProviderMetadata | undefined;\n let aggregatedWarnings = steps.reduce<KortyxWarning[] | undefined>(\n (warnings, step) => mergeWarnings(warnings, step.warnings),\n args.initialWarnings,\n );\n let pending = checkpoint?.pending;\n const approvedCalls = checkpoint?.approvedCalls ?? [];\n const save = () => {\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"tool_loop\",\n opId,\n messages,\n steps,\n approvedCalls,\n finalizing,\n ...(pending ? { pending } : {}),\n } satisfies ToolLoopCheckpoint;\n ctx.stateDirty = true;\n };\n\n const emitToolEvent = (\n event: string,\n payload: Record<string, unknown>,\n ): void => {\n ctx.node.emit(event, {\n ...payload,\n node: ctx.node.graph.node,\n ...(id ? { id } : {}),\n opId,\n });\n };\n\n try {\n for (\n let stepIndex = pending ? steps.length - 1 : steps.length;\n stepIndex < maxSteps;\n stepIndex += 1\n ) {\n throwIfExecutionAborted(abortSignal);\n traceSpan?.addEvent?.(\"useReason.tool-step.start\", {\n stepIndex,\n toolCount: toolDefinitions.length,\n });\n\n const reused = Boolean(pending);\n const stream =\n useReasonArgs.stream ?? useReasonArgs.model.options?.streaming ?? true;\n const emit = useReasonArgs.emit ?? true;\n let textStarted = false;\n const structuredChunk =\n useReasonArgs.outputSchema &&\n (!separateOutput || finalizing) &&\n stream &&\n emit &&\n shouldStreamStructured(useReasonArgs.structured)\n ? createStructuredOutputStreamer(useReasonArgs, id, opId)\n : undefined;\n const step =\n pending ??\n (await reasonEngine(\n {\n ...useReasonArgs,\n tools: finalizing ? [] : toolDefinitions,\n ...(separateOutput && !finalizing\n ? { responseFormat: { type: \"text\" as const } }\n : {}),\n messages,\n emit: false,\n stream,\n onTextChunk: (delta) => {\n if (structuredChunk) structuredChunk(delta);\n if (!emit || useReasonArgs.outputSchema || !delta) return;\n if (!textStarted) {\n emitToolEvent(\"text-start\", {});\n textStarted = true;\n }\n emitToolEvent(\"text-delta\", { delta });\n },\n },\n { ...(id ? { id } : {}), opId },\n ));\n\n if (textStarted) emitToolEvent(\"text-end\", {});\n finalText = step.text;\n finalRaw = step.raw;\n if (!reused) {\n aggregatedUsage = mergeUsage(aggregatedUsage, step.usage);\n accumulateTokenUsage(step.usage);\n }\n finalFinishReason = step.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n step.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, step.warnings);\n\n const toolCalls = step.toolCalls ?? [];\n const toolResults: KortyxToolResult[] = reused\n ? (steps[stepIndex]?.toolResults ?? [])\n : [];\n if (!reused)\n steps.push({\n stepIndex,\n text: step.text,\n toolCalls,\n toolResults,\n ...(step.usage ? { usage: step.usage } : {}),\n ...(step.finishReason ? { finishReason: step.finishReason } : {}),\n ...(step.providerMetadata\n ? { providerMetadata: step.providerMetadata }\n : {}),\n ...(step.warnings ? { warnings: step.warnings } : {}),\n });\n\n if (toolCalls.length === 0) {\n if (separateOutput && !finalizing) {\n if (args.allowValidatedToolOutput && useReasonArgs.outputSchema) {\n try {\n finalOutput = parseReasonOutputWithSchema({\n text: step.text,\n schema: useReasonArgs.outputSchema,\n ...(step.finishReason\n ? { finishReason: step.finishReason }\n : {}),\n ...(aggregatedUsage ? { usage: aggregatedUsage } : {}),\n label: \"useReason output\",\n });\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, [\n {\n type: \"compatibility\",\n feature: \"responseFormat\",\n details:\n \"Reused locally validated tool-phase output without an extra native-schema request. Set responseFormat.schema explicitly to require provider schema enforcement.\",\n },\n ]);\n completed = true;\n break;\n } catch {\n // A schema-only pass can repair a nonconforming draft, within the existing limits.\n }\n }\n messages.push({\n role: \"assistant\",\n content: step.text,\n ...(step.continuation ? { continuation: step.continuation } : {}),\n });\n messages.push({\n role: \"user\",\n content:\n \"Return the final answer using the requested output schema and the tool results above.\",\n });\n finalizing = true;\n pending = undefined;\n save();\n continue;\n }\n completed = true;\n break;\n }\n if (finalizing)\n throw new Error(\n \"Provider requested a tool during schema-only finalization.\",\n );\n\n if (!reused) {\n allToolCalls.push(...toolCalls);\n messages.push({\n role: \"assistant\",\n content: step.text,\n toolCalls,\n ...(step.continuation ? { continuation: step.continuation } : {}),\n });\n }\n pending = step;\n save();\n\n for (const toolCall of toolCalls) {\n if (toolResults.some((result) => result.toolCallId === toolCall.id))\n continue;\n throwIfExecutionAborted(abortSignal);\n const tool = toolByName.get(toolCall.name);\n if (!tool) {\n throw new Error(\n `Model requested unknown tool \"${toolCall.name}\" from useReason.`,\n );\n }\n\n const shouldEmitTool = resolveToolExecutionBoolean(\n useReasonArgs.toolExecution?.emit,\n tool.name,\n false,\n );\n const shouldApproveTool = resolveToolExecutionBoolean(\n useReasonArgs.toolExecution?.approval,\n tool.name,\n false,\n );\n\n traceSpan?.addEvent?.(\"useReason.tool-call.start\", {\n stepIndex,\n tool: tool.name,\n toolCallId: toolCall.id,\n });\n\n if (shouldEmitTool) {\n emitToolEvent(\"tool-call-start\", {\n tool: tool.name,\n toolCallId: toolCall.id,\n input: toolCall.input,\n });\n }\n\n if (shouldApproveTool && !approvedCalls.includes(toolCall.id)) {\n const approval = await awaitInterruptInternal({\n id: `tool:${toolCall.id}`,\n request: {\n kind: \"choice\",\n question: `Approve ${tool.name}?`,\n options: [\n { id: \"approve\", label: \"Approve\" },\n { id: \"deny\", label: \"Deny\" },\n ],\n },\n meta: {\n tool: tool.name,\n toolCallId: toolCall.id,\n input: toolCall.input,\n },\n });\n\n const approved = Array.isArray(approval)\n ? approval.includes(\"approve\")\n : approval === \"approve\";\n\n if (!approved) {\n const denied = {\n toolCallId: toolCall.id,\n name: tool.name,\n content: \"Tool call denied by user.\",\n isError: true,\n } satisfies KortyxToolResult;\n toolResults.push(denied);\n allToolResults.push(denied);\n if (shouldEmitTool) {\n emitToolEvent(\"tool-call-result\", {\n tool: tool.name,\n toolCallId: toolCall.id,\n content: denied.content,\n isError: true,\n });\n }\n messages.push({\n role: \"tool\",\n content: denied.content,\n toolCallId: denied.toolCallId,\n name: denied.name,\n isError: true,\n });\n save();\n continue;\n }\n approvedCalls.push(toolCall.id);\n save();\n }\n\n try {\n throwIfExecutionAborted(abortSignal);\n ctx.node.consumeExecution?.(\"maxToolCalls\");\n const rawResult = await tool.execute(toolCall.input, {\n toolCallId: toolCall.id,\n ...(abortSignal ? { abortSignal } : {}),\n });\n throwIfExecutionAborted(abortSignal);\n const result = normalizeToolResult(toolCall, rawResult);\n toolResults.push(result);\n allToolResults.push(result);\n if (shouldEmitTool) {\n emitToolEvent(\"tool-call-result\", {\n tool: result.name,\n toolCallId: result.toolCallId,\n content: result.content,\n ...(result.structuredContent !== undefined\n ? { structuredContent: result.structuredContent }\n : {}),\n ...(result.isError !== undefined\n ? { isError: result.isError }\n : {}),\n });\n }\n traceSpan?.addEvent?.(\"useReason.tool-call.complete\", {\n stepIndex,\n tool: result.name,\n toolCallId: result.toolCallId,\n isError: Boolean(result.isError),\n });\n } catch (error) {\n throwIfExecutionAborted(abortSignal);\n if (isControlFlowError(error)) throw error;\n const result = {\n toolCallId: toolCall.id,\n name: tool.name,\n content: serializeFailure(error).message,\n failure: serializeFailure(error),\n isError: true,\n } satisfies KortyxToolResult;\n toolResults.push(result);\n allToolResults.push(result);\n if (shouldEmitTool) {\n emitToolEvent(\"tool-call-error\", {\n tool: tool.name,\n toolCallId: toolCall.id,\n message: result.content,\n failure: result.failure,\n });\n }\n traceSpan?.addEvent?.(\"useReason.tool-call.error\", {\n stepIndex,\n tool: tool.name,\n toolCallId: toolCall.id,\n message: result.content,\n failure: result.failure,\n });\n }\n const completed = toolResults.at(-1);\n if (completed)\n messages.push({\n role: \"tool\",\n content: completed.content,\n toolCallId: completed.toolCallId,\n name: completed.name,\n ...(completed.isError !== undefined\n ? { isError: completed.isError }\n : {}),\n });\n save();\n }\n\n pending = undefined;\n save();\n }\n\n if (!completed) {\n throw new Error(\n `useReason tool loop reached maxSteps (${maxSteps}) before producing a final response.`,\n );\n }\n\n if (useReasonArgs.outputSchema && finalOutput === undefined) {\n finalOutput = parseReasonOutputWithSchema({\n text: finalText,\n schema: useReasonArgs.outputSchema,\n ...(finalFinishReason ? { finishReason: finalFinishReason } : {}),\n ...(aggregatedUsage ? { usage: aggregatedUsage } : {}),\n label: \"useReason output\",\n });\n }\n\n if (finalOutput !== undefined) {\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: finalOutput,\n structured: useReasonArgs.structured,\n emit: useReasonArgs.emit ?? true,\n });\n }\n\n const result = {\n ...(id ? { id } : {}),\n opId,\n text: finalText,\n ...(finalRaw !== undefined ? { raw: finalRaw } : {}),\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n ...(finalOutput !== undefined ? { output: finalOutput } : {}),\n toolCalls: allToolCalls,\n toolResults: allToolResults,\n steps,\n } satisfies UseReasonResult<TOutput, TResponse>;\n\n traceSpan?.end?.({\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n attributes: {\n textLength: finalText.length,\n toolCallCount: allToolCalls.length,\n toolResultCount: allToolResults.length,\n toolStepCount: steps.length,\n },\n telemetry: {\n ...(useReasonArgs.telemetry ?? {}),\n output: useReasonArgs.telemetry?.output ?? finalOutput ?? finalText,\n },\n });\n\n ctx.currentNodeState.byKey[checkpointKey] = { status: \"completed\", result };\n ctx.stateDirty = true;\n return result;\n } catch (error) {\n primaryFailure = true;\n try {\n traceSpan?.fail?.(error, {\n attributes: {\n toolStepCount: steps.length,\n toolCallCount: allToolCalls.length,\n },\n });\n } catch {\n /* Reporting must not replace the execution failure. */\n }\n throw error;\n } finally {\n await closeOwnedTools(tools, primaryFailure, traceSpan);\n }\n};\n\ninterface ToolLoopCheckpoint {\n status: \"tool_loop\";\n opId: string;\n messages: KortyxPromptMessage[];\n steps: UseReasonStep[];\n pending?: RunReasonEngineResult;\n approvedCalls: string[];\n finalizing?: boolean;\n}\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { getHookContext } from \"./context\";\nimport { awaitInterruptInternal } from \"./interrupt\";\nimport { useReason as useReasonInternal } from \"./reason/use-reason\";\nimport { emitStructuredData } from \"./structured\";\nimport type {\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonResult,\n UseStructuredDataArgs,\n} from \"./types\";\n\nexport type {\n SchemaLike,\n StructuredDataKind,\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonInterruptConfig,\n UseReasonResult,\n UseReasonStep,\n UseReasonStructuredConfig,\n UseReasonToolExecution,\n UseStructuredDataAppendArgs,\n UseStructuredDataArgs,\n UseStructuredDataFinalArgs,\n UseStructuredDataSetArgs,\n UseStructuredDataTextDeltaArgs,\n} from \"./types\";\n\ntype StateSetter<T> = (next: T | ((prev: T) => T)) => void;\n\nexport function useStructuredData<TData = unknown>(\n args: UseStructuredDataArgs<TData>,\n): void {\n emitStructuredData(args);\n}\n\nexport function useReason<\n TOutput = unknown,\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): Promise<UseReasonResult<TOutput, TResponse>> {\n return useReasonInternal(args);\n}\n\nexport function useInterrupt<\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(args: UseInterruptArgs<TRequest, TResponse>): Promise<TResponse> {\n return awaitInterruptInternal(args);\n}\n\n/** Live execution signal for cooperative I/O. Never store it in workflow state. */\nexport function useAbortSignal(): AbortSignal | undefined {\n return getHookContext().node.abortSignal;\n}\n\nexport function useRuntimeContext<\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(): TContext {\n const ctx = getHookContext();\n const config = ctx.state.config;\n const context =\n config && typeof config === \"object\" && \"context\" in config\n ? (config as { context?: unknown }).context\n : undefined;\n\n return context && typeof context === \"object\" && !Array.isArray(context)\n ? (context as TContext)\n : ({} as TContext);\n}\n\nexport function useNodeState<T>(initialValue: T): [T, StateSetter<T>] {\n const ctx = getHookContext();\n const nodeState = ctx.currentNodeState;\n\n const index = ctx.nodeStateIndex++;\n if (index >= nodeState.byIndex.length) {\n nodeState.byIndex[index] = initialValue as T;\n ctx.stateDirty = true;\n }\n\n const getValue = () => nodeState.byIndex[index] as T;\n const setValue: StateSetter<T> = (next) => {\n const prev = getValue();\n const resolved =\n typeof next === \"function\" ? (next as (p: T) => T)(prev) : next;\n nodeState.byIndex[index] = resolved;\n ctx.stateDirty = true;\n };\n\n return [getValue(), setValue];\n}\n\nexport function useWorkflowState<T>(\n key: string,\n ...rest: [] | [T]\n): [T, StateSetter<T>] {\n const ctx = getHookContext();\n const workflowState = ctx.workflowState;\n const hasInitial = rest.length > 0;\n const initialValue = rest[0];\n\n if (!Object.hasOwn(workflowState, key) && hasInitial) {\n workflowState[key] = initialValue as T;\n ctx.stateDirty = true;\n }\n\n const getValue = () => workflowState[key] as T;\n const setValue: StateSetter<T> = (next) => {\n const prev = getValue();\n const resolved =\n typeof next === \"function\" ? (next as (p: T) => T)(prev) : next;\n workflowState[key] = resolved;\n ctx.stateDirty = true;\n };\n\n return [getValue(), setValue];\n}\n","import {\n isExecutionCancelled,\n isExecutionLimitReached,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport { type FailureDescriptor, serializeFailure } from \"@kortyx/core/errors\";\nimport { getHookContext } from \"./context\";\nimport { awaitInterruptInternal } from \"./interrupt\";\nimport type { CallRecord } from \"./workflow\";\n\ntype ParallelRecord = {\n version: 1;\n calls: string[];\n interrupts: Array<{ callId: string; index: number }>;\n};\n\nexport type ParallelGroup = {\n key: string;\n record: ParallelRecord;\n restored: boolean;\n ready: Promise<void>;\n};\n\nexport type WorkflowTask = {\n id: string;\n group?: ParallelGroup;\n done: Promise<void>;\n finish: () => void;\n completed: boolean;\n};\n\n/** Internal control flow: the child snapshot is ready for its owning join. */\nexport class ParallelChildWaiting extends Error {\n override name = \"ParallelChildWaiting\";\n}\n\n/** All siblings have settled; results retain the order passed to parallel(). */\nexport class ParallelError extends AggregateError {\n readonly code = \"PARALLEL_FAILED\";\n readonly failure: FailureDescriptor;\n toJSON(): FailureDescriptor {\n return serializeFailure(this);\n }\n constructor(\n public readonly results: readonly PromiseSettledResult<unknown>[],\n ) {\n super(\n results.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n ),\n \"One or more parallel operations failed.\",\n );\n this.name = \"ParallelError\";\n this.failure = serializeFailure({\n version: 1,\n code: this.code,\n category: \"workflow\",\n message: this.message,\n retryable: null,\n results: results.map((result) =>\n result.status === \"fulfilled\"\n ? { status: \"fulfilled\" }\n : { status: \"rejected\", failure: serializeFailure(result.reason) },\n ),\n });\n }\n}\n\nexport function registerWorkflowTask(id: string): WorkflowTask {\n const ctx = getHookContext();\n if (ctx.workflowControlError) throw ctx.workflowControlError;\n if (ctx.workflowContextClosed)\n throw new Error(\"The workflow node activation has finished.\");\n const group = ctx.parallelGroup;\n if (group?.restored && !group.record.calls.includes(id)) {\n throw new Error(`Parallel call membership changed during replay: '${id}'.`);\n }\n let finish!: () => void;\n const task: WorkflowTask = {\n id,\n ...(group ? { group } : {}),\n completed: false,\n done: new Promise<void>((resolve) => {\n finish = resolve;\n }),\n finish: () => {\n task.completed = true;\n finish();\n },\n };\n ctx.workflowTasks.push(task);\n if (group && !group.record.calls.includes(id)) group.record.calls.push(id);\n return task;\n}\n\n/** Join concurrent child calls, preserving their snapshots before suspending. */\nexport function parallel<const T extends readonly unknown[]>(\n values: T,\n): Promise<{ -readonly [K in keyof T]: Awaited<T[K]> }> {\n // Observe inputs immediately, including when context/group validation rejects.\n const settled = Promise.allSettled(values);\n let ctx: ReturnType<typeof getHookContext>;\n try {\n ctx = getHookContext();\n } catch (error) {\n return Promise.reject(error);\n }\n const join = async () => {\n if (ctx.workflowControlError) throw ctx.workflowControlError;\n if (ctx.parallelGroup)\n throw new Error(\n \"Await each parallel group before starting another in the same node.\",\n );\n const key = `__parallel:${ctx.parallelIndex++}`;\n const saved = ctx.currentNodeState.byKey[key] as\n | ParallelRecord\n | null\n | undefined;\n const tasks = ctx.workflowTasks.filter(\n (task) => !task.completed && !task.group,\n );\n const ids = tasks.map((task) => task.id);\n if (\n saved &&\n (saved.version !== 1 || ids.some((id) => !saved.calls.includes(id)))\n ) {\n throw new Error(\"Parallel call membership changed during replay.\");\n }\n const group: ParallelGroup = {\n key,\n record: saved ?? { version: 1, calls: ids, interrupts: [] },\n restored: Boolean(saved),\n ready: Promise.resolve(),\n };\n ctx.currentNodeState.byKey[key] = group.record;\n ctx.stateDirty = true;\n ctx.parallelGroup = group;\n for (const task of tasks) task.group = group;\n const callRecord = (id: string) =>\n ctx.currentNodeState.byKey[`__useWorkflow:${id}`] as\n | CallRecord\n | undefined;\n const bridge = async (callId: string, index: number) => {\n const interruption = callRecord(callId)?.interrupts[index];\n if (!interruption)\n throw new Error(\n \"Parallel interrupt history does not match the saved child.\",\n );\n try {\n interruption.response = await awaitInterruptInternal({\n request: interruption.request,\n ...(interruption.request.meta\n ? { meta: interruption.request.meta }\n : {}),\n });\n } catch (error) {\n ctx.workflowControlError = error;\n throw error;\n }\n };\n group.ready = (async () => {\n // One deterministic parent interrupt journal, independent of child finish order.\n for (const entry of group.record.interrupts)\n await bridge(entry.callId, entry.index);\n })();\n try {\n // Even a replay suspension must settle every already-created child promise.\n const [ready, outcomes] = await Promise.all([\n Promise.allSettled([group.ready]),\n settled,\n ]);\n // Also own calls made by asynchronous custom-hook wrappers in this group.\n let drained = -1;\n while (drained !== ctx.workflowTasks.length) {\n drained = ctx.workflowTasks.length;\n await Promise.all(\n ctx.workflowTasks\n .filter((task) => task.group === group)\n .map((task) => task.done),\n );\n }\n if (ready[0]?.status === \"rejected\") throw ready[0].reason;\n throwIfExecutionAborted(ctx.node.abortSignal);\n if (ctx.workflowControlError) throw ctx.workflowControlError;\n const rejected = outcomes.filter(\n (outcome) => outcome.status === \"rejected\",\n );\n const control = rejected.find(\n (outcome) =>\n isExecutionCancelled(outcome.reason) ||\n isExecutionLimitReached(outcome.reason),\n );\n if (control) {\n ctx.workflowControlError = control.reason;\n throw control.reason;\n }\n const actual = ctx.workflowTasks\n .filter((task) => task.group === group)\n .map((task) => task.id);\n if (\n group.record.calls.length !== actual.length ||\n group.record.calls.some((id) => !actual.includes(id))\n ) {\n throw new Error(\"Parallel call membership changed during replay.\");\n }\n for (const callId of group.record.calls) {\n const record = callRecord(callId);\n if (record?.status !== \"interrupted\") continue;\n const index = record.interrupts.length - 1;\n if (record.interrupts[index]?.response !== undefined) continue;\n group.record.interrupts.push({ callId, index });\n await bridge(callId, index);\n // An unseen interrupt suspends; it must not become a partial result.\n throw new Error(\n \"Parallel interrupt unexpectedly resumed without replay.\",\n );\n }\n if (rejected.length) throw new ParallelError(outcomes);\n return outcomes.map(\n (outcome) => (outcome as PromiseFulfilledResult<unknown>).value,\n ) as { -readonly [K in keyof T]: Awaited<T[K]> };\n } finally {\n ctx.parallelGroup = undefined;\n }\n };\n const promise = join();\n ctx.parallelJoins.push(promise);\n // The node owns this join even if user code forgets to await it.\n void promise.catch(() => {});\n return promise;\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n InterruptInput,\n TokenUsage,\n WorkflowDefinition,\n} from \"@kortyx/core\";\nimport {\n isExecutionCancelled,\n isExecutionLimitReached,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport {\n type FailureDescriptor,\n KortyxError,\n serializeFailure,\n WorkflowContractError,\n} from \"@kortyx/core/errors\";\nimport type { z } from \"zod\";\nimport { accumulateTokenUsage, getHookContext } from \"./context\";\nimport { awaitInterruptInternal } from \"./interrupt\";\nimport {\n ParallelChildWaiting,\n registerWorkflowTask,\n type WorkflowTask,\n} from \"./parallel\";\nimport { emitWorkflowCall, workflowCallContent } from \"./workflow-telemetry\";\n\nexport type WorkflowCallOutcome =\n | {\n status: \"completed\";\n data: Record<string, unknown>;\n usage?: TokenUsage | undefined;\n }\n | {\n status: \"interrupted\";\n request: InterruptInput;\n snapshot: unknown;\n usage?: TokenUsage | undefined;\n };\n\nexport type WorkflowCallService = (args: {\n id: string;\n workflow: string;\n input: unknown;\n snapshot?: unknown;\n definition?: WorkflowDefinition | undefined;\n invocationId: string;\n response?: string | string[] | undefined;\n callerNodeExecutionId?: string | undefined;\n}) => Promise<WorkflowCallOutcome>;\n\nexport type CallRecord = {\n parallelKey?: string;\n usage?: TokenUsage;\n fingerprint: string;\n sequence?: number;\n telemetry?: Record<string, unknown>;\n invocationId: string;\n status: \"running\" | \"interrupted\" | \"completed\" | \"failed\";\n snapshot?: unknown;\n data?: Record<string, unknown>;\n error?: string;\n failure?: FailureDescriptor;\n interrupts: Array<{ request: InterruptInput; response?: string | string[] }>;\n};\n\nexport class WorkflowCallError extends KortyxError {\n constructor(\n public readonly workflow: string,\n message: string,\n cause?: unknown,\n failure?: FailureDescriptor,\n ) {\n const detail = serializeFailure(\n failure ?? cause ?? new WorkflowContractError(message),\n );\n super(detail.code, `Workflow '${workflow}': ${message}`, {\n ...detail,\n safeMessage: detail.message,\n ...(cause !== undefined ? { cause } : {}),\n });\n Object.assign(this.failure, detail, {\n context: { ...detail.context, workflow },\n });\n this.name = \"WorkflowCallError\";\n }\n}\n\n// Canonicalize JSON so object insertion order cannot change call identity.\nexport function workflowCallFingerprint(value: unknown): string {\n const seen = new Set<object>();\n const canonical = (v: unknown): unknown => {\n if (v === null || typeof v === \"string\" || typeof v === \"boolean\") return v;\n if (typeof v === \"number\" && Number.isFinite(v)) return v;\n if (typeof v !== \"object\" || !v || seen.has(v)) {\n throw new WorkflowContractError(\n \"Workflow input and output must be JSON serializable.\",\n );\n }\n if (!Array.isArray(v) && Object.getPrototypeOf(v) !== Object.prototype) {\n throw new WorkflowContractError(\n \"Workflow input and output must contain plain JSON objects.\",\n );\n }\n seen.add(v);\n const result = Array.isArray(v)\n ? v.map(canonical)\n : Object.fromEntries(\n Object.keys(v)\n .sort()\n .map((key) => [\n key,\n canonical((v as Record<string, unknown>)[key]),\n ]),\n );\n seen.delete(v);\n return result;\n };\n return JSON.stringify(canonical(value));\n}\n\ntype SchematizedWorkflow = WorkflowDefinition & {\n inputSchema: z.ZodType;\n outputSchema: z.ZodType<Record<string, unknown>>;\n};\n\n/** Bind string workflow ids to the same definitions registered with the agent. */\nexport function createWorkflowHooks<\n const W extends Record<string, SchematizedWorkflow>,\n>(workflows: W) {\n return {\n useWorkflow: <K extends keyof W & string>(args: {\n id: string;\n workflow: K;\n input: z.input<W[K][\"inputSchema\"]>;\n }): Promise<{ data: z.output<W[K][\"outputSchema\"]> }> => {\n const workflow = workflows[args.workflow];\n if (!workflow || workflow.id !== args.workflow)\n throw new WorkflowContractError(\n \"Workflow registry keys must match definition ids.\",\n );\n return useWorkflow({ ...args, workflow }) as Promise<{\n data: z.output<W[K][\"outputSchema\"]>;\n }>;\n },\n };\n}\n\n/** Typed references avoid caller-supplied result type assertions. */\nexport function useWorkflow<W extends SchematizedWorkflow>(args: {\n id: string;\n workflow: W;\n input: z.input<W[\"inputSchema\"]>;\n}): Promise<{ data: z.output<W[\"outputSchema\"]> }>;\nexport function useWorkflow(args: {\n id: string;\n workflow: string;\n input: unknown;\n}): Promise<{ data: Record<string, unknown> }>;\nexport async function useWorkflow(args: {\n id: string;\n workflow: string | SchematizedWorkflow;\n input: unknown;\n}): Promise<{ data: Record<string, unknown> }> {\n const task = registerWorkflowTask(args.id);\n try {\n // Give the enclosing parallel([...]) call a chance to claim the eager calls.\n await Promise.resolve();\n if (task.group) await task.group.ready;\n return await runWorkflowCall(args, task);\n } catch (error) {\n if (isExecutionCancelled(error) || isExecutionLimitReached(error))\n getHookContext().workflowControlError = error;\n throw error;\n } finally {\n task.finish();\n }\n}\n\nasync function runWorkflowCall(\n args: {\n id: string;\n workflow: string | SchematizedWorkflow;\n input: unknown;\n },\n task: WorkflowTask,\n): Promise<{ data: Record<string, unknown> }> {\n const ctx = getHookContext();\n throwIfExecutionAborted(ctx.node.abortSignal);\n const service = ctx.node.callWorkflow;\n if (!service)\n throw new WorkflowContractError(\n \"useWorkflow requires an agent workflow registry.\",\n );\n if (!args.id.trim())\n throw new WorkflowContractError(\n \"useWorkflow requires a stable, nonempty id.\",\n );\n if (ctx.workflowCallActive && !task.group)\n throw new WorkflowContractError(\n \"Concurrent workflow calls require parallel([...]); otherwise await each call.\",\n );\n if (ctx.workflowCallIds.has(args.id))\n throw new WorkflowContractError(\n `Duplicate workflow call id '${args.id}' in one node activation.`,\n );\n if (ctx.workflowCallIds.size >= 64)\n throw new WorkflowContractError(\n \"A node may call at most 64 child workflows per activation.\",\n );\n ctx.workflowCallIds.add(args.id);\n const definition =\n typeof args.workflow === \"string\" ? undefined : args.workflow;\n const workflow = definition?.id ?? (args.workflow as string);\n const input = args.input;\n const fingerprint = workflowCallFingerprint({\n workflow,\n input,\n version: definition?.version ?? null,\n });\n const key = `__useWorkflow:${args.id}`;\n let record = ctx.currentNodeState.byKey[key] as CallRecord | undefined;\n if (record && record.parallelKey !== task.group?.key)\n throw new WorkflowCallError(\n workflow,\n \"parallel call membership changed during replay\",\n );\n if (record && record.fingerprint !== fingerprint)\n throw new WorkflowCallError(\n workflow,\n \"call input or target changed during replay\",\n );\n if (!record) ctx.node.consumeExecution?.(\"maxChildInvocations\");\n record ??= {\n fingerprint,\n invocationId: randomUUID(),\n status: \"running\",\n interrupts: [],\n ...(task.group ? { parallelKey: task.group.key } : {}),\n };\n ctx.currentNodeState.byKey[key] = record;\n ctx.stateDirty = true;\n if (!task.group) ctx.workflowCallActive = true;\n const telemetry = ctx.node.workflowCallTelemetry;\n const activationKey = \"__useWorkflowActivation\";\n ctx.currentNodeState.byKey[activationKey] ??= randomUUID();\n const callerNodeExecutionId = ctx.currentNodeState.byKey[\n activationKey\n ] as string;\n const metadata = {\n invocationId: record.invocationId,\n parentInvocationId: telemetry?.correlation?.invocationId ?? null,\n branchId:\n telemetry?.correlation?.branchId ??\n telemetry?.correlation?.runId ??\n \"unknown\",\n callId: args.id,\n callerNodeId: ctx.node.graph.node,\n callerNodeExecutionId,\n sourceWorkflowId: ctx.node.graph.name,\n targetWorkflowId: workflow,\n targetVersion: definition?.version ?? null,\n };\n record.telemetry = metadata;\n const report = (\n status:\n | \"started\"\n | \"suspended\"\n | \"resumed\"\n | \"completed\"\n | \"failed\"\n | \"reused\",\n content: Record<string, unknown> = {},\n ) => {\n record.sequence = (record.sequence ?? 0) + 1;\n emitWorkflowCall(telemetry, `workflow.call.${status}`, {\n ...metadata,\n sequence: record.sequence,\n ...content,\n });\n };\n const recordUsage = (usage: TokenUsage | undefined) => {\n if (!usage) return;\n accumulateTokenUsage({\n input: usage.input - (record.usage?.input ?? 0),\n output: usage.output - (record.usage?.output ?? 0),\n total: usage.total - (record.usage?.total ?? 0),\n });\n record.usage = usage;\n };\n const cached = record.status === \"completed\";\n\n try {\n // Replay every bridged interrupt, even for a completed call. The parent\n // graph assigns resume values by interrupt position within its node.\n for (const interruption of task.group ? [] : record.interrupts) {\n interruption.response = await awaitInterruptInternal({\n request: interruption.request,\n ...(interruption.request.meta\n ? { meta: interruption.request.meta }\n : {}),\n });\n }\n if (record.status === \"failed\")\n throw new WorkflowCallError(\n workflow,\n record.error ?? \"child failed\",\n undefined,\n record.failure ?? serializeFailure(undefined),\n );\n if (\n task.group &&\n record.status === \"interrupted\" &&\n record.interrupts.at(-1)?.response === undefined\n )\n throw new ParallelChildWaiting();\n while (record.status !== \"completed\") {\n let outcome: WorkflowCallOutcome;\n try {\n report(\n record.snapshot ? \"resumed\" : \"started\",\n workflowCallContent(telemetry, \"input\", input),\n );\n outcome = await service({\n callerNodeExecutionId,\n id: args.id,\n workflow,\n input,\n definition,\n invocationId: record.invocationId,\n ...(record.snapshot ? { snapshot: record.snapshot } : {}),\n ...(record.interrupts.length\n ? { response: record.interrupts.at(-1)?.response }\n : {}),\n });\n } catch (error) {\n const child = error as {\n __kortyxChildSnapshot?: unknown;\n __kortyxChildUsage?: TokenUsage;\n } | null;\n recordUsage(child?.__kortyxChildUsage);\n throwIfExecutionAborted(ctx.node.abortSignal);\n if (isExecutionCancelled(error)) throw error;\n if (isExecutionLimitReached(error)) {\n if (child?.__kortyxChildSnapshot)\n record.snapshot = child.__kortyxChildSnapshot;\n report(\"suspended\", {\n reason: \"limit_reached\",\n limit: error.limitReached,\n });\n throw error;\n }\n record.status = \"failed\";\n record.failure = serializeFailure(error);\n record.error = record.failure.message;\n report(\"failed\", { error: \"Child workflow failed\" });\n throw new WorkflowCallError(\n workflow,\n record.error,\n error,\n record.failure,\n );\n }\n throwIfExecutionAborted(ctx.node.abortSignal);\n // Child totals survive suspension; count only newly reported work.\n recordUsage(outcome.usage);\n if (outcome.status === \"completed\") {\n // Validate cached and live outputs against the caller's actual contract.\n record.data = outcome.data;\n workflowCallFingerprint(record.data);\n record.status = \"completed\";\n delete record.snapshot;\n report(\n \"completed\",\n workflowCallContent(telemetry, \"output\", record.data),\n );\n } else {\n record.status = \"interrupted\";\n record.snapshot = outcome.snapshot;\n report(\"suspended\", {\n leaf: outcome.request.meta?.workflowCall ?? null,\n });\n const interruption: CallRecord[\"interrupts\"][number] = {\n request: outcome.request,\n };\n record.interrupts.push(interruption);\n if (task.group) throw new ParallelChildWaiting();\n interruption.response = await awaitInterruptInternal({\n request: interruption.request,\n ...(interruption.request.meta\n ? { meta: interruption.request.meta }\n : {}),\n });\n }\n }\n if (cached)\n report(\"reused\", workflowCallContent(telemetry, \"output\", record.data));\n const data = record.data ?? {};\n return {\n data: JSON.parse(JSON.stringify(data)) as Record<string, unknown>,\n };\n } finally {\n if (!task.group) ctx.workflowCallActive = false;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n KortyxTelemetryConfig,\n KortyxTelemetryEventType,\n} from \"./tracing\";\n\n/** Best effort lifecycle facts. Engine snapshots and interrupt tokens never leave the runtime. */\nexport function emitWorkflowCall(\n telemetry: KortyxTelemetryConfig | undefined,\n type: KortyxTelemetryEventType,\n payload: Record<string, unknown>,\n) {\n const base = telemetry?.correlation;\n if (\n !telemetry?.reporter ||\n !telemetry.environment ||\n !telemetry.service ||\n !base?.runId ||\n !base.workflowId\n )\n return;\n try {\n const active = telemetry.trace?.getActiveContext?.();\n void Promise.resolve(\n telemetry.reporter.emit([\n {\n schemaVersion: 1,\n eventId: randomUUID(),\n occurredAt: new Date().toISOString(),\n environment: telemetry.environment,\n service: telemetry.service,\n correlation: {\n ...base,\n runId: base.runId,\n workflowId: base.workflowId,\n ...active,\n },\n type,\n payload,\n },\n ]),\n ).catch(() => {});\n } catch {\n /* Observability cannot change execution. */\n }\n}\n\nexport function workflowCallContent(\n telemetry: KortyxTelemetryConfig | undefined,\n side: \"input\" | \"output\",\n value: unknown,\n): Record<string, unknown> {\n const policy = telemetry?.captureContent;\n if (\n !(policy === true || (policy && typeof policy === \"object\" && policy[side]))\n )\n return {};\n const serialized = JSON.stringify(value);\n // Use a marker instead of a truncated, misleading JSON result.\n return serialized && Buffer.byteLength(serialized, \"utf8\") <= 16_384\n ? { [side]: JSON.parse(serialized) }\n : { [`${side}Omitted`]: \"Content exceeds 16 KiB\" };\n}\n","// release-test: 2026-01-22\n\nexport type { ChatRequestBody, CheckpointRequestBody } from \"./adapters/http\";\nexport {\n createChatRouteHandler,\n createCheckpointRouteHandler,\n createFailureResponse,\n handleChatRequestBody,\n handleCheckpointRequestBody,\n parseChatRequestBody,\n parseCheckpointRequestBody,\n readRequestJson,\n} from \"./adapters/http\";\nexport type { StreamChatFromRouteArgs } from \"./adapters/http-client\";\nexport { streamChatFromRoute } from \"./adapters/http-client\";\nexport type {\n Agent,\n AgentProcessOptions,\n AgentProjectTopologyOptions,\n CreateAgentArgs,\n} from \"./chat/create-agent\";\nexport { createAgent } from \"./chat/create-agent\";\nexport type { StreamChatArgs } from \"./chat/process-chat\";\nexport { streamChat } from \"./chat/process-chat\";\nexport type {\n ExecutableWorkflow,\n ExecuteOptions,\n ExecutionInfo,\n ExecutionInterrupt,\n ExecutionResult,\n ResumeHandle,\n ResumeOptions,\n ResumeResponse,\n} from \"./execution/types\";\nexport { ExecutionRequestError } from \"./execution/types\";\nexport type {\n InterruptScope,\n ListInterruptsOptions,\n PendingInterrupt,\n ResumableInterrupt,\n} from \"./interrupt/discovery\";\nexport type {\n ApplyResumeSelection,\n ResumeMeta,\n} from \"./interrupt/resume-handler\";\nexport {\n parseResumeMeta,\n tryPrepareResumeStream,\n} from \"./interrupt/resume-handler\";\nexport type {\n CompiledGraphLike,\n OrchestrateArgs,\n SaveMemoryFn,\n SelectWorkflowFn,\n} from \"./orchestrator\";\nexport { orchestrateGraphStream } from \"./orchestrator\";\nexport { transformGraphStreamForUI } from \"./stream/transform-graph-stream-for-ui\";\nexport { projectWorkflowTopology } from \"./telemetry/topology\";\nexport type { ChatMessage } from \"./types/chat-message\";\nexport { extractLatestUserMessage } from \"./utils/extract-latest-message\";\n","import {\n failureHttpStatus,\n KortyxError,\n serializeFailure,\n} from \"@kortyx/core/errors\";\nimport { collectBufferedStream, toSSE } from \"@kortyx/stream\";\nimport { z } from \"zod\";\nimport type { Agent } from \"../chat/create-agent\";\nimport type { ChatMessage } from \"../types/chat-message\";\n\nexport type ChatRequestBody = {\n sessionId?: string | undefined;\n workflowId?: string | undefined;\n stream?: boolean | undefined;\n context?: Record<string, unknown> | undefined;\n messages: ChatMessage[];\n};\n\nexport type CheckpointRequestBody =\n | {\n action: \"list\";\n sessionId: string;\n }\n | {\n action: \"get\";\n checkpointId: string;\n }\n | {\n action: \"rollback\";\n checkpointId: string;\n }\n | {\n action: \"fork\";\n checkpointId: string;\n newSessionId?: string | undefined;\n };\n\nconst chatMessageSchema = z\n .object({\n role: z.enum([\"user\", \"assistant\", \"system\"]),\n content: z.string(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n id: z.string().optional(),\n timestamp: z.number().refine(Number.isFinite).optional(),\n })\n .strict();\n\nconst chatRequestBodySchema = z.looseObject({\n sessionId: z.string().optional(),\n workflowId: z.string().optional(),\n stream: z.boolean().optional(),\n context: z.record(z.string(), z.unknown()).optional(),\n messages: z.array(chatMessageSchema),\n});\n\nconst checkpointRequestBodySchema = z.discriminatedUnion(\"action\", [\n z\n .object({\n action: z.literal(\"list\"),\n sessionId: z.string().min(1),\n })\n .strict(),\n z\n .object({\n action: z.literal(\"get\"),\n checkpointId: z.string().min(1),\n })\n .strict(),\n z\n .object({\n action: z.literal(\"rollback\"),\n checkpointId: z.string().min(1),\n })\n .strict(),\n z\n .object({\n action: z.literal(\"fork\"),\n checkpointId: z.string().min(1),\n newSessionId: z.string().min(1).optional(),\n })\n .strict(),\n]);\n\n/** Read an object-shaped API command without exposing parser/input details. */\nexport async function readRequestJson(\n request: Request,\n): Promise<Record<string, unknown>> {\n try {\n const value: unknown = await request.json();\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n throw new Error(\"Expected a JSON object.\");\n return value as Record<string, unknown>;\n } catch (cause) {\n throw new KortyxError(\n \"INVALID_REQUEST\",\n \"Request body is not valid JSON.\",\n {\n category: \"request\",\n retryable: false,\n safeMessage: \"The request body must contain a valid JSON object.\",\n cause,\n },\n );\n }\n}\n\n/** Safe response for custom route handlers. Control flow propagates unchanged. */\nexport function createFailureResponse(\n error: unknown,\n status?: number,\n): Response {\n const failure = serializeFailure(error);\n return Response.json(\n { error: failure.message, failure },\n { status: status ?? failureHttpStatus(failure) },\n );\n}\n\nexport function parseChatRequestBody(value: unknown): ChatRequestBody {\n const parsed = chatRequestBodySchema.safeParse(value);\n if (!parsed.success) {\n const [firstIssue] = parsed.error.issues as unknown as [\n { message: string },\n ...Array<{ message: string }>,\n ];\n throw new KortyxError(\"INVALID_REQUEST\", firstIssue.message, {\n category: \"request\",\n retryable: false,\n safeMessage: \"The request body is invalid.\",\n });\n }\n\n const sessionId = parsed.data.sessionId?.trim();\n const workflowId = parsed.data.workflowId?.trim();\n\n return {\n ...(sessionId ? { sessionId } : {}),\n ...(workflowId ? { workflowId } : {}),\n ...(typeof parsed.data.stream === \"boolean\"\n ? { stream: parsed.data.stream }\n : {}),\n ...(parsed.data.context ? { context: parsed.data.context } : {}),\n messages: parsed.data.messages as ChatMessage[],\n };\n}\n\nexport function parseCheckpointRequestBody(\n value: unknown,\n): CheckpointRequestBody {\n const parsed = checkpointRequestBodySchema.safeParse(value);\n if (parsed.success) return parsed.data;\n const [firstIssue] = parsed.error.issues as unknown as [\n { message: string },\n ...Array<{ message: string }>,\n ];\n throw new KortyxError(\"INVALID_REQUEST\", firstIssue.message, {\n category: \"request\",\n retryable: false,\n safeMessage: \"The request body is invalid.\",\n });\n}\n\nexport async function handleChatRequestBody(args: {\n abortSignal?: AbortSignal | undefined;\n onExecution?: ((completion: Promise<void>) => void) | undefined;\n agent: Agent;\n body: ChatRequestBody;\n}): Promise<Response> {\n const { agent, body } = args;\n const stream = await agent.streamChat(body.messages, {\n ...(args.onExecution ? { onExecution: args.onExecution } : {}),\n ...(args.abortSignal ? { abortSignal: args.abortSignal } : {}),\n sessionId: body.sessionId,\n workflowId: body.workflowId,\n context: body.context,\n });\n\n if (body.stream === false) {\n const buffered = await collectBufferedStream(stream);\n return new Response(JSON.stringify(buffered), {\n headers: {\n \"content-type\": \"application/json\",\n },\n });\n }\n\n return toSSE(stream);\n}\n\nexport function createChatRouteHandler(args: {\n onExecution?: ((completion: Promise<void>) => void) | undefined;\n agent: Agent;\n errorStatus?: number | undefined;\n}): (request: Request) => Promise<Response> {\n const { agent, errorStatus } = args;\n\n return async function POST(request: Request): Promise<Response> {\n try {\n const body = parseChatRequestBody(await readRequestJson(request));\n return await handleChatRequestBody({\n agent,\n body,\n abortSignal: request.signal,\n onExecution: args.onExecution,\n });\n } catch (error) {\n return createFailureResponse(error, errorStatus);\n }\n };\n}\n\nexport async function handleCheckpointRequestBody(args: {\n agent: Agent;\n body: CheckpointRequestBody;\n}): Promise<Response> {\n const { agent, body } = args;\n const result =\n body.action === \"list\"\n ? await agent.listCheckpoints(body.sessionId)\n : body.action === \"get\"\n ? await agent.getCheckpoint(body.checkpointId)\n : body.action === \"rollback\"\n ? await agent.rollbackTo(body.checkpointId)\n : await agent.fork(body.checkpointId, {\n ...(body.newSessionId ? { newSessionId: body.newSessionId } : {}),\n });\n\n return new Response(JSON.stringify(result), {\n headers: {\n \"content-type\": \"application/json\",\n },\n });\n}\n\nexport function createCheckpointRouteHandler(args: {\n agent: Agent;\n errorStatus?: number | undefined;\n}): (request: Request) => Promise<Response> {\n const { agent, errorStatus } = args;\n\n return async function POST(request: Request): Promise<Response> {\n try {\n const body = parseCheckpointRequestBody(await readRequestJson(request));\n return await handleCheckpointRequestBody({ agent, body });\n } catch (error) {\n return createFailureResponse(error, errorStatus);\n }\n };\n}\n","import { type StreamChunk, streamFromRoute } from \"@kortyx/stream/browser\";\nimport type { ChatMessage } from \"../types/chat-message\";\n\nexport interface StreamChatFromRouteArgs {\n endpoint: string;\n sessionId?: string | undefined;\n workflowId?: string | undefined;\n messages: ChatMessage[];\n fetchImpl?: typeof fetch;\n headers?: Record<string, string> | undefined;\n}\n\nexport async function* streamChatFromRoute(\n args: StreamChatFromRouteArgs,\n): AsyncGenerator<StreamChunk, void, void> {\n yield* streamFromRoute({\n endpoint: args.endpoint,\n ...(args.fetchImpl ? { fetchImpl: args.fetchImpl } : {}),\n ...(args.headers ? { headers: args.headers } : {}),\n body: {\n sessionId: args.sessionId,\n workflowId: args.workflowId,\n messages: args.messages,\n },\n });\n}\n","import { resolve } from \"node:path\";\nimport type { WorkflowDefinition } from \"@kortyx/core\";\nimport {\n createExecutionBudget,\n type ExecutionLimits,\n ExecutionLimitsSchema,\n} from \"@kortyx/core\";\nimport {\n type GetProviderFn,\n getProvider as getRegisteredProvider,\n} from \"@kortyx/providers\";\nimport type {\n CheckpointId,\n CheckpointSummary,\n ExecutionRuntimeConfig,\n ForkSessionCheckpointResult,\n FrameworkAdapter,\n PendingRequestRecord,\n RollbackSessionCheckpointResult,\n SessionCheckpointRecord,\n WorkflowRegistry,\n} from \"@kortyx/runtime\";\nimport {\n createFileWorkflowRegistry,\n createFrameworkAdapterFromEnv,\n createInMemoryWorkflowRegistry,\n} from \"@kortyx/runtime\";\nimport type { StreamChunk } from \"@kortyx/stream\";\nimport { z } from \"zod\";\nimport { executeWorkflow, resumeWorkflow } from \"../execution/execute\";\nimport type {\n ExecutableWorkflow,\n ExecuteOptions,\n ExecutionResult,\n ResumeHandle,\n ResumeOptions,\n ResumeResponse,\n} from \"../execution/types\";\nimport { createInterruptDiscovery } from \"../interrupt/discovery\";\nimport { emitTelemetryEvent } from \"../telemetry/events\";\nimport { projectWorkflowTopology } from \"../telemetry/topology\";\nimport { restoreWorkflowCallBranch } from \"../telemetry/workflow-call-branch\";\nimport type { ChatMessage } from \"../types/chat-message\";\nimport { streamChat as runStreamChat } from \"./process-chat\";\n\nexport interface AgentProcessOptions {\n executionSignal?: AbortSignal | undefined;\n onExecution?: ((completion: Promise<void>) => void) | undefined;\n limits?: ExecutionLimits | undefined;\n abortSignal?: AbortSignal | undefined;\n sessionId?: string | undefined;\n workflowId?: string | undefined;\n context?: Record<string, unknown> | undefined;\n}\n\ntype AgentTopologySnapshot = ReturnType<typeof projectWorkflowTopology>;\n\nexport interface AgentProjectTopologyOptions {\n environment: string;\n service: AgentTopologySnapshot[\"service\"];\n}\n\nexport interface CreateAgentArgs {\n limits?: ExecutionLimits | undefined;\n getProvider?: GetProviderFn | undefined;\n workflows?: WorkflowDefinition[];\n workflowsDir?: string;\n workflowRegistry?: WorkflowRegistry;\n defaultWorkflowId?: string;\n frameworkAdapter?: FrameworkAdapter;\n telemetry?: ExecutionRuntimeConfig[\"telemetry\"];\n}\n\nexport interface Agent extends ReturnType<typeof createInterruptDiscovery> {\n execute<W extends ExecutableWorkflow>(\n args: ExecuteOptions<W>,\n ): Promise<ExecutionResult<z.output<W[\"outputSchema\"]>>>;\n execute(args: {\n limits?: ExecutionLimits;\n abortSignal?: AbortSignal;\n workflow: string;\n input: unknown;\n sessionId?: string;\n context?: Record<string, unknown>;\n }): Promise<ExecutionResult>;\n resume<W extends ExecutableWorkflow>(\n args: ResumeOptions<W>,\n ): Promise<ExecutionResult<z.output<W[\"outputSchema\"]>>>;\n resume(args: {\n limits?: ExecutionLimits;\n abortSignal?: AbortSignal;\n workflow: string;\n resume: ResumeHandle;\n response: ResumeResponse;\n }): Promise<ExecutionResult>;\n projectTopology?: (\n options: AgentProjectTopologyOptions,\n ) => Promise<AgentTopologySnapshot[]>;\n streamChat: (\n messages: ChatMessage[],\n options?: AgentProcessOptions,\n ) => Promise<AsyncIterable<StreamChunk>>;\n listCheckpoints: (sessionId: string) => Promise<CheckpointSummary[]>;\n getCheckpoint: (id: CheckpointId) => Promise<SessionCheckpointRecord | null>;\n rollbackTo: (id: CheckpointId) => Promise<RollbackSessionCheckpointResult>;\n fork: (\n id: CheckpointId,\n options?: { newSessionId?: string },\n ) => Promise<ForkSessionCheckpointResult>;\n}\n\nconst agentProcessOptionsSchema = z\n .object({\n executionSignal: z\n .custom<AbortSignal>((value) => value instanceof AbortSignal)\n .optional(),\n onExecution: z\n .custom<(completion: Promise<void>) => void>(\n (value) => typeof value === \"function\",\n )\n .optional(),\n limits: ExecutionLimitsSchema.optional(),\n abortSignal: z\n .custom<AbortSignal>((value) => value instanceof AbortSignal)\n .optional(),\n sessionId: z.string().optional(),\n workflowId: z.string().optional(),\n context: z.record(z.string(), z.unknown()).optional(),\n })\n .strict();\n\nconst createAgentArgsBaseSchema = z\n .object({\n limits: ExecutionLimitsSchema.optional(),\n getProvider: z.unknown().optional(),\n workflows: z.array(z.unknown()).optional(),\n workflowsDir: z.string().optional(),\n workflowRegistry: z.unknown().optional(),\n defaultWorkflowId: z.string().optional(),\n frameworkAdapter: z.unknown().optional(),\n telemetry: z.unknown().optional(),\n })\n .strict();\n\nconst createAgentArgsSchema = createAgentArgsBaseSchema.superRefine(\n (value: z.infer<typeof createAgentArgsBaseSchema>, ctx: z.RefinementCtx) => {\n if (\n value.getProvider !== undefined &&\n typeof value.getProvider !== \"function\"\n ) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Expected `args.getProvider` to be a function.\",\n path: [\"getProvider\"],\n });\n }\n\n const workflowSources = [\n value.workflows !== undefined,\n value.workflowsDir !== undefined,\n value.workflowRegistry !== undefined,\n ].filter(Boolean).length;\n\n if (workflowSources > 1) {\n ctx.addIssue({\n code: \"custom\",\n message:\n \"Use only one workflow source: `workflows`, `workflowsDir`, or `workflowRegistry`.\",\n });\n }\n },\n);\n\nconst parseSchema = <T>(schema: z.ZodType<T>, value: unknown): T => {\n const parsed = schema.safeParse(value);\n if (parsed.success) return parsed.data;\n const [firstIssue] = parsed.error.issues as unknown as [\n { message: string },\n ...Array<{ message: string }>,\n ];\n throw new Error(firstIssue.message);\n};\n\nconst parseCreateAgentArgs = (value: unknown): CreateAgentArgs =>\n parseSchema(createAgentArgsSchema, value) as CreateAgentArgs;\n\nconst parseAgentProcessOptions = (\n value: unknown,\n): AgentProcessOptions | undefined => {\n if (value === undefined) return undefined;\n return parseSchema(agentProcessOptionsSchema, value);\n};\n\nconst hydratePendingGraphCheckpoint = async (\n frameworkAdapter: FrameworkAdapter,\n request: PendingRequestRecord,\n): Promise<PendingRequestRecord> => {\n if (request.graphCheckpointId) return request;\n const checkpointer = frameworkAdapter.checkpointer as\n | {\n getLatestCheckpointId?: (\n threadId: string,\n checkpointNs?: string,\n ) => Promise<string | undefined>;\n }\n | undefined;\n const graphCheckpointId =\n (await checkpointer?.getLatestCheckpointId?.(\n request.runId,\n request.workflow,\n )) ?? (await checkpointer?.getLatestCheckpointId?.(request.runId, \"\"));\n return graphCheckpointId ? { ...request, graphCheckpointId } : request;\n};\n\nconst clearPendingGraphWrites = async (\n frameworkAdapter: FrameworkAdapter,\n request: PendingRequestRecord,\n): Promise<void> => {\n if (request.graphSnapshot || !request.graphCheckpointId) return;\n const checkpointer = frameworkAdapter.checkpointer as\n | {\n deleteCheckpointWrites?: (\n threadId: string,\n checkpointNs: string,\n checkpointId: string,\n ) => Promise<void>;\n }\n | undefined;\n if (!checkpointer?.deleteCheckpointWrites) return;\n\n await Promise.all([\n checkpointer.deleteCheckpointWrites(\n request.runId,\n request.workflow,\n request.graphCheckpointId,\n ),\n checkpointer.deleteCheckpointWrites(\n request.runId,\n \"\",\n request.graphCheckpointId,\n ),\n ]);\n};\n\nexport function createAgent(args: CreateAgentArgs): Agent {\n const parsedArgs = parseCreateAgentArgs(args);\n\n const {\n limits,\n getProvider,\n workflows,\n workflowsDir,\n workflowRegistry,\n defaultWorkflowId,\n frameworkAdapter,\n telemetry,\n } = parsedArgs;\n\n const resolvedDefaultWorkflowId = defaultWorkflowId;\n const resolvedFrameworkAdapter: FrameworkAdapter =\n frameworkAdapter ?? createFrameworkAdapterFromEnv();\n const resolvedGetProvider = getProvider ?? getRegisteredProvider;\n\n const resolvedCwd = process.cwd();\n\n const registryPromise: Promise<WorkflowRegistry | undefined> = (async () => {\n if (workflowRegistry) return workflowRegistry;\n if (workflows) {\n return createInMemoryWorkflowRegistry(workflows, {\n fallbackId: resolvedDefaultWorkflowId ?? \"general-chat\",\n });\n }\n if (workflowsDir) {\n return createFileWorkflowRegistry({\n workflowsDir,\n fallbackId: resolvedDefaultWorkflowId ?? \"general-chat\",\n });\n }\n\n const resolvedWorkflowsDir = resolve(resolvedCwd, \"src\", \"workflows\");\n return createFileWorkflowRegistry({\n workflowsDir: resolvedWorkflowsDir,\n fallbackId: resolvedDefaultWorkflowId ?? \"general-chat\",\n });\n })();\n const registeredWorkflowsPromise = registryPromise.then((registry) =>\n registry?.list?.(),\n );\n\n const projectTopology = async (\n options: AgentProjectTopologyOptions,\n ): Promise<AgentTopologySnapshot[]> => {\n const registeredWorkflows = await registeredWorkflowsPromise;\n if (!registeredWorkflows?.length) return [];\n const knownWorkflowIds = registeredWorkflows.map((workflow) => workflow.id);\n return registeredWorkflows.map((workflow) =>\n projectWorkflowTopology({\n workflow,\n environment: options.environment,\n service: options.service,\n knownWorkflowIds,\n }),\n );\n };\n\n const streamChat = async (\n messages: ChatMessage[],\n options?: AgentProcessOptions,\n ): Promise<AsyncIterable<StreamChunk>> => {\n const parsedOptions = parseAgentProcessOptions(options);\n\n const registry = await registryPromise;\n if (!registry) {\n throw new Error(\n \"createAgent requires workflows, workflowsDir, or workflowRegistry.\",\n );\n }\n const registeredWorkflows = await registeredWorkflowsPromise.catch(\n () => undefined,\n );\n const knownWorkflowIds = registeredWorkflows?.map(\n (workflow) => workflow.id,\n );\n\n return runStreamChat({\n ...(resolvedDefaultWorkflowId\n ? { defaultWorkflowId: resolvedDefaultWorkflowId }\n : {}),\n messages,\n abortSignal: parsedOptions?.abortSignal,\n executionSignal: parsedOptions?.executionSignal,\n onExecution: parsedOptions?.onExecution,\n options: parsedOptions,\n workflowRegistry: registry,\n ...(knownWorkflowIds ? { knownWorkflowIds } : {}),\n frameworkAdapter: resolvedFrameworkAdapter,\n getProvider: resolvedGetProvider,\n loadRuntimeConfig: (runtimeOptions?: AgentProcessOptions) => ({\n ...(limits || runtimeOptions?.limits\n ? {\n executionBudget: createExecutionBudget(\n limits,\n runtimeOptions?.limits,\n ),\n }\n : {}),\n ...(runtimeOptions?.sessionId\n ? {\n session: {\n id: runtimeOptions.sessionId,\n },\n }\n : {}),\n ...(runtimeOptions?.context ? { context: runtimeOptions.context } : {}),\n ...(telemetry ? { telemetry } : {}),\n }),\n });\n };\n\n const listCheckpoints = (sessionId: string) =>\n resolvedFrameworkAdapter.sessionCheckpoints.list(sessionId);\n\n const getCheckpoint = (id: CheckpointId) =>\n resolvedFrameworkAdapter.sessionCheckpoints.get(id);\n\n const rollbackTo = async (\n id: CheckpointId,\n ): Promise<RollbackSessionCheckpointResult> => {\n const target = await resolvedFrameworkAdapter.sessionCheckpoints.get(id);\n const result =\n await resolvedFrameworkAdapter.sessionCheckpoints.rollbackTo(id);\n const activePendingRequests = await Promise.all(\n result.activePendingRequests.map((request) =>\n hydratePendingGraphCheckpoint(resolvedFrameworkAdapter, request),\n ),\n );\n restoreWorkflowCallBranch(\n activePendingRequests,\n telemetry,\n target?.runId ?? \"unknown\",\n );\n await Promise.all(\n activePendingRequests.map((request) =>\n clearPendingGraphWrites(resolvedFrameworkAdapter, request),\n ),\n );\n\n await Promise.all([\n ...result.invalidatedInterruptTokens.map((token) =>\n resolvedFrameworkAdapter.pendingRequests.delete(token),\n ),\n ...activePendingRequests.map((request) =>\n resolvedFrameworkAdapter.pendingRequests.save(request),\n ),\n ]);\n\n if (target) {\n emitTelemetryEvent({\n config: { ...(telemetry ? { telemetry } : {}) },\n type: \"session.rolled_back\",\n correlation: {\n runId: target.runId,\n sessionId: target.sessionId,\n workflowId: target.workflow,\n },\n payload: {\n checkpointId: target.id,\n invalidatedInterruptIds: result.invalidatedInterruptTokens,\n },\n });\n }\n\n return { ...result, activePendingRequests };\n };\n\n const fork = async (\n id: CheckpointId,\n options?: { newSessionId?: string },\n ): Promise<ForkSessionCheckpointResult> => {\n const source = await resolvedFrameworkAdapter.sessionCheckpoints.get(id);\n const result = await resolvedFrameworkAdapter.sessionCheckpoints.fork(\n id,\n options,\n );\n const activePendingRequests = await Promise.all(\n result.checkpoint.activePendingRequests.map((request) =>\n hydratePendingGraphCheckpoint(resolvedFrameworkAdapter, request),\n ),\n );\n restoreWorkflowCallBranch(\n activePendingRequests,\n telemetry,\n source?.runId ?? \"unknown\",\n );\n await Promise.all(\n activePendingRequests.map((request) =>\n clearPendingGraphWrites(resolvedFrameworkAdapter, request),\n ),\n );\n await Promise.all(\n activePendingRequests.map((request) =>\n resolvedFrameworkAdapter.pendingRequests.save(request),\n ),\n );\n emitTelemetryEvent({\n config: { ...(telemetry ? { telemetry } : {}) },\n type: \"session.forked\",\n correlation: {\n runId: result.checkpoint.runId,\n sessionId: result.checkpoint.sessionId,\n workflowId: result.checkpoint.workflow,\n },\n payload: {\n newSessionId: result.sessionId,\n parentSessionId: result.parentSessionId,\n forkedFromCheckpointId: result.forkedFrom,\n },\n });\n return {\n ...result,\n checkpoint: { ...result.checkpoint, activePendingRequests },\n };\n };\n\n const services = async () => {\n const registry = await registryPromise;\n if (!registry) throw new Error(\"Workflow registry is unavailable.\");\n return {\n registry,\n limits,\n frameworkAdapter: resolvedFrameworkAdapter,\n getProvider: resolvedGetProvider,\n telemetry,\n knownWorkflowIds: (await registeredWorkflowsPromise)?.map(\n (workflow) => workflow.id,\n ),\n };\n };\n const execute = (async (options: Parameters<typeof executeWorkflow>[1]) =>\n executeWorkflow(await services(), options)) as Agent[\"execute\"];\n const resume = (async (options: Parameters<typeof resumeWorkflow>[1]) =>\n resumeWorkflow(await services(), options)) as Agent[\"resume\"];\n\n return {\n ...createInterruptDiscovery(resolvedFrameworkAdapter.pendingRequests),\n execute,\n resume,\n projectTopology,\n streamChat,\n listCheckpoints,\n getCheckpoint,\n rollbackTo,\n fork,\n };\n}\n","import type { WorkflowDefinition } from \"@kortyx/core\";\nimport {\n createExecutionBudget,\n type ExecutionLimitReached,\n type ExecutionLimits,\n isExecutionCancelled,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport { KortyxError, serializeFailure } from \"@kortyx/core/errors\";\nimport type { GetProviderFn } from \"@kortyx/providers\";\nimport {\n buildInitialGraphState,\n createExecutionGraph,\n type ExecutionRuntimeConfig,\n type FrameworkAdapter,\n makeRequestId,\n type PendingRequestRecord,\n type WorkflowRegistry,\n} from \"@kortyx/runtime\";\nimport { z } from \"zod\";\nimport { tryPrepareResumeStream } from \"../interrupt/resume-handler\";\nimport {\n type OrchestrationOutcome,\n orchestrateGraphStream,\n} from \"../orchestrator\";\nimport { prepareWorkflowTelemetry } from \"../telemetry/topology\";\nimport { parseExecutionInput, resolveExecutionWorkflow } from \"./contracts\";\nimport {\n ExecutionRequestError,\n type ExecutionResult,\n type ResumeHandle,\n type ResumeResponse,\n} from \"./types\";\n\nexport interface ExecutionServices {\n limits?: ExecutionLimits | undefined;\n registry: WorkflowRegistry;\n frameworkAdapter: FrameworkAdapter;\n getProvider: GetProviderFn;\n telemetry?: ExecutionRuntimeConfig[\"telemetry\"];\n knownWorkflowIds?: readonly string[] | undefined;\n}\n\nconst handleSchema = z\n .object({\n token: z.string().min(1),\n requestId: z.string().min(1),\n sessionId: z.string().min(1),\n runId: z.string().min(1),\n })\n .strict();\nconst responseSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"text\"), text: z.string().min(1) }).strict(),\n z\n .object({\n type: z.literal(\"select\"),\n ids: z.array(z.string().min(1)).min(1),\n })\n .strict(),\n z.object({ type: z.literal(\"cancel\") }).strict(),\n]);\n\nexport function resultFromOutcome(\n outcome: OrchestrationOutcome,\n runId: string,\n sessionId: string,\n): ExecutionResult {\n const usage =\n (\n outcome.pending?.schema.meta?.__kortyxResumeStatePatch as\n | { tokenUsage?: import(\"@kortyx/core\").TokenUsage }\n | undefined\n )?.tokenUsage ??\n (\n outcome.error as\n | {\n __kortyxHookStatePatch?: {\n tokenUsage?: import(\"@kortyx/core\").TokenUsage;\n };\n }\n | undefined\n )?.__kortyxHookStatePatch?.tokenUsage ??\n outcome.state.runtime?.tokenUsage;\n const info = {\n runId,\n sessionId,\n ...(outcome.checkpointId ? { checkpointId: outcome.checkpointId } : {}),\n ...(usage ? { usage } : {}),\n };\n if (isExecutionCancelled(outcome.error))\n return { ...info, status: \"cancelled\", reason: \"Execution cancelled.\" };\n if (outcome.error) {\n const error = outcome.error;\n return {\n ...info,\n status: \"failed\",\n error: serializeFailure(error),\n };\n }\n if (outcome.cancelled)\n return { ...info, status: \"cancelled\", reason: \"cancelled_by_client\" };\n if (outcome.pending) {\n const pending = outcome.pending;\n const meta = Object.fromEntries(\n Object.entries(pending.schema.meta ?? {}).filter(\n ([key]) => !key.startsWith(\"__kortyx\"),\n ),\n );\n return {\n ...info,\n status: \"suspended\",\n ...(pending.schema.meta?.__kortyxExecutionLimit\n ? {\n reason: \"limit_reached\" as const,\n limit: pending.schema.meta.executionLimit as ExecutionLimitReached,\n }\n : {}),\n interrupt: {\n workflow: pending.workflow,\n node: pending.node,\n input: {\n ...pending.schema,\n meta,\n options: pending.options.map(({ id, label, description }) => ({\n id,\n label,\n description,\n })),\n },\n },\n resume: {\n token: pending.token,\n requestId: pending.requestId,\n sessionId,\n runId,\n },\n };\n }\n return { ...info, status: \"completed\", data: outcome.state.data ?? {} };\n}\n\nfunction runtimeConfig(\n services: ExecutionServices,\n sessionId: string,\n context?: Record<string, unknown>,\n): ExecutionRuntimeConfig {\n return {\n session: { id: sessionId },\n ...(context ? { context } : {}),\n getProvider: services.getProvider,\n checkpointer: services.frameworkAdapter.checkpointer,\n selectWorkflow: (id) => services.registry.select(id),\n ...(services.telemetry ? { telemetry: services.telemetry } : {}),\n };\n}\n\nexport async function executeWorkflow(\n services: ExecutionServices,\n args: {\n limits?: ExecutionLimits;\n abortSignal?: AbortSignal;\n workflow: WorkflowDefinition | string;\n input: unknown;\n sessionId?: string;\n context?: Record<string, unknown>;\n },\n): Promise<ExecutionResult> {\n const select = (id: string) => services.registry.select(id);\n const workflow = await resolveExecutionWorkflow(select, args.workflow);\n const input = parseExecutionInput(workflow, args.input);\n if (args.sessionId !== undefined && !args.sessionId.trim())\n throw new ExecutionRequestError(\n \"INVALID_SESSION\",\n \"sessionId must not be empty.\",\n );\n const sessionId = args.sessionId ?? makeRequestId(\"session\");\n const runId = makeRequestId(\"run\");\n const config = prepareWorkflowTelemetry({\n config: {\n ...runtimeConfig(services, sessionId, args.context),\n ...(services.limits || args.limits\n ? {\n executionBudget: createExecutionBudget(\n services.limits,\n args.limits,\n ),\n }\n : {}),\n executionContract: { id: workflow.id, version: workflow.version },\n },\n workflow,\n runId,\n sessionId,\n knownWorkflowIds: services.knownWorkflowIds,\n });\n const state = await buildInitialGraphState({\n input,\n runtime: {},\n config,\n defaultWorkflowId: workflow.id,\n });\n return new Promise<ExecutionResult>((resolve) => {\n const onOutcome = (outcome: OrchestrationOutcome) =>\n resolve(resultFromOutcome(outcome, runId, sessionId));\n void (async () => {\n throwIfExecutionAborted(args.abortSignal);\n const graph = await createExecutionGraph(workflow, config);\n await orchestrateGraphStream({\n graph,\n state,\n config,\n runId,\n sessionId,\n selectWorkflow: select,\n frameworkAdapter: services.frameworkAdapter,\n knownWorkflowIds: services.knownWorkflowIds,\n abortSignal: args.abortSignal,\n emitOutput: false,\n onOutcome,\n });\n })().catch((error) => onOutcome({ state, error }));\n });\n}\n\nexport async function resumeWorkflow(\n services: ExecutionServices,\n args: {\n limits?: ExecutionLimits;\n abortSignal?: AbortSignal;\n workflow: WorkflowDefinition | string;\n resume: ResumeHandle;\n response: ResumeResponse;\n },\n): Promise<ExecutionResult> {\n const parsed = z\n .object({ resume: handleSchema, response: responseSchema })\n .safeParse(args);\n if (!parsed.success)\n throw new ExecutionRequestError(\"INVALID_RESUME\", parsed.error.message);\n const { resume: handle, response } = parsed.data;\n const select = (id: string) => services.registry.select(id);\n const workflow = await resolveExecutionWorkflow(select, args.workflow);\n const validatePending = async (pending: PendingRequestRecord) => {\n const contract = pending.state?.config?.executionContract ?? {\n id: pending.workflow,\n };\n if (\n pending.runId !== handle.runId ||\n contract.id !== workflow.id ||\n (contract.version && contract.version !== workflow.version)\n )\n throw new ExecutionRequestError(\n \"RESUME_MISMATCH\",\n \"Resume handle does not match the root execution and workflow version.\",\n );\n if (response.type === \"cancel\") return;\n if (response.type === \"text\") {\n if (pending.schema.kind !== \"text\")\n throw new ExecutionRequestError(\n \"INVALID_RESPONSE\",\n \"This interrupt requires a selection.\",\n );\n } else {\n const multi =\n pending.schema.kind === \"multi-choice\" || pending.schema.multiple;\n if (\n pending.schema.kind === \"text\" ||\n (!multi && response.ids.length !== 1) ||\n new Set(response.ids).size !== response.ids.length\n )\n throw new ExecutionRequestError(\n \"INVALID_RESPONSE\",\n \"Invalid selection for this interrupt.\",\n );\n if (\n pending.options.length &&\n response.ids.some(\n (id) => !pending.options.some((option) => option.id === id),\n )\n )\n throw new ExecutionRequestError(\n \"INVALID_RESPONSE\",\n \"Selection contains an unknown option.\",\n );\n }\n };\n return new Promise<ExecutionResult>((resolve, reject) => {\n void tryPrepareResumeStream({\n limits: args.limits,\n abortSignal: args.abortSignal,\n meta: {\n token: handle.token,\n requestId: handle.requestId,\n selected:\n response.type === \"text\"\n ? [response.text]\n : response.type === \"select\"\n ? response.ids\n : [],\n cancel: response.type === \"cancel\",\n },\n sessionId: handle.sessionId,\n config: runtimeConfig(services, handle.sessionId),\n selectWorkflow: select,\n frameworkAdapter: services.frameworkAdapter,\n knownWorkflowIds: services.knownWorkflowIds,\n validatePending,\n applyResumeSelection: () => ({}),\n emitOutput: false,\n onOutcome: (outcome) =>\n resolve(resultFromOutcome(outcome, handle.runId, handle.sessionId)),\n })\n .then((stream) => {\n if (!stream)\n reject(\n new ExecutionRequestError(\n \"INVALID_RESUME\",\n \"No waiting execution found.\",\n ),\n );\n })\n .catch((error) =>\n reject(\n error instanceof Error\n ? error\n : new KortyxError(\"RESUME_FAILED\", \"Resume failed.\", {\n category: \"persistence\",\n cause: error,\n safeMessage: \"The saved execution could not be resumed.\",\n }),\n ),\n );\n });\n}\n","import type { GraphState } from \"@kortyx/core\";\nimport {\n createExecutionCancelledError,\n type ExecutionBudget,\n type ExecutionLimits,\n restartExecutionBudget,\n} from \"@kortyx/core\";\nimport type {\n FrameworkAdapter,\n PendingRequestRecord,\n PendingRequestStore,\n} from \"@kortyx/runtime\";\nimport { createExecutionGraph, restoreGraphSnapshot } from \"@kortyx/runtime\";\nimport type { StreamChunk } from \"@kortyx/stream\";\nimport { ExecutionRequestError } from \"../execution/types\";\nimport type { SelectWorkflowFn } from \"../orchestrator\";\nimport { type OrchestrateArgs, orchestrateGraphStream } from \"../orchestrator\";\nimport {\n emitTelemetryEvent,\n shouldCaptureTelemetryContent,\n} from \"../telemetry/events\";\nimport { prepareWorkflowTelemetry } from \"../telemetry/topology\";\nimport type { ChatMessage } from \"../types/chat-message\";\n\nexport interface ResumeMeta {\n token: string;\n requestId: string;\n selected: string[]; // normalized to array for consistency\n cancel?: boolean;\n}\n\nexport type ApplyResumeSelection = (args: {\n pending: PendingRequestRecord;\n selected: string[];\n}) => Record<string, unknown> | null | undefined;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst responseFromSelection = (selected: string[]): string | undefined => {\n if (selected.length === 0) return undefined;\n if (selected.length === 1) return selected[0];\n return JSON.stringify(selected);\n};\n\nexport function parseResumeMeta(\n msg: ChatMessage | undefined,\n): ResumeMeta | null {\n if (!msg || !msg.metadata) return null;\n const raw = msg.metadata.resume;\n if (!isRecord(raw)) return null;\n\n const token = typeof raw.token === \"string\" ? raw.token : \"\";\n const requestId = typeof raw.requestId === \"string\" ? raw.requestId : \"\";\n const cancel = raw.cancel === true;\n\n // Accept multiple shapes; normalize to selected: string[]\n let selected: string[] = [];\n const rawSelected = raw.selected;\n if (typeof rawSelected === \"string\") selected = [rawSelected];\n else if (Array.isArray(rawSelected)) selected = rawSelected.map(String);\n else if (isRecord(raw.choice) && typeof raw.choice.id === \"string\")\n selected = [raw.choice.id];\n else if (Array.isArray(raw.choices))\n selected = raw.choices\n .map((c) => (isRecord(c) ? c.id : undefined))\n .filter((id): id is string => typeof id === \"string\");\n\n if (!token || !requestId) return null;\n return { token, requestId, selected, cancel };\n}\n\ninterface TryResumeArgs {\n limits?: ExecutionLimits | undefined;\n abortSignal?: AbortSignal | undefined;\n executionSignal?: AbortSignal | undefined;\n onExecution?: ((completion: Promise<void>) => void) | undefined;\n lastMessage?: ChatMessage | undefined;\n meta?: ResumeMeta | undefined;\n emitOutput?: boolean | undefined;\n onOutcome?: OrchestrateArgs[\"onOutcome\"];\n validatePending?:\n | ((pending: PendingRequestRecord) => void | Promise<void>)\n | undefined;\n sessionId: string;\n config: Record<string, unknown>;\n selectWorkflow: SelectWorkflowFn;\n knownWorkflowIds?: readonly string[] | undefined;\n defaultWorkflowId?: string;\n applyResumeSelection?: ApplyResumeSelection;\n frameworkAdapter?: FrameworkAdapter;\n}\n\nexport async function tryPrepareResumeStream({\n limits,\n abortSignal,\n executionSignal,\n onExecution,\n lastMessage,\n meta: suppliedMeta,\n emitOutput,\n onOutcome,\n validatePending,\n sessionId,\n config,\n selectWorkflow,\n knownWorkflowIds,\n defaultWorkflowId,\n applyResumeSelection,\n frameworkAdapter,\n}: TryResumeArgs): Promise<AsyncIterable<StreamChunk> | null> {\n const meta = suppliedMeta ?? parseResumeMeta(lastMessage);\n if (!meta) return null;\n\n const store: PendingRequestStore | undefined =\n frameworkAdapter?.pendingRequests;\n if (!store) return null;\n\n const pending = await store.get(meta.token);\n if (!pending || pending.requestId !== meta.requestId) {\n throw new ExecutionRequestError(\n \"INVALID_RESUME\",\n \"Interrupt is expired, already consumed, or does not match the request.\",\n );\n }\n\n if (pending.sessionId && pending.sessionId !== sessionId)\n throw new ExecutionRequestError(\n \"RESUME_MISMATCH\",\n \"Interrupt belongs to another session.\",\n );\n await validatePending?.(pending);\n const isLimitPause = Boolean(pending.schema.meta?.__kortyxExecutionLimit);\n\n const savedBudget = pending.state?.config?.executionBudget as\n | ExecutionBudget\n | undefined;\n const resumedBudget =\n savedBudget && isLimitPause && !meta.cancel\n ? restartExecutionBudget(savedBudget, limits)\n : savedBudget;\n if (abortSignal?.aborted) {\n onOutcome?.({\n state: pending.state as GraphState,\n error: createExecutionCancelledError(),\n });\n return (async function* () {\n yield {\n type: \"cancelled\",\n runId: pending.runId,\n reason: \"Execution cancelled.\",\n } as const;\n yield { type: \"done\" } as const;\n })();\n }\n if (store.take && !(await store.take(meta.token)))\n throw new ExecutionRequestError(\n \"INVALID_RESUME\",\n \"Interrupt has already been resumed or cancelled.\",\n );\n if (meta.cancel) {\n await store.delete(pending.token);\n emitTelemetryEvent({\n config,\n type: \"interrupt.cancelled\",\n correlation: {\n runId: pending.runId,\n sessionId,\n workflowId: pending.workflow,\n nodeId: pending.node,\n },\n payload: {\n interruptId: pending.requestId,\n reason: \"cancelled_by_client\",\n },\n flush: true,\n });\n onOutcome?.({ state: pending.state as GraphState, cancelled: true });\n return (async function* (): AsyncGenerator<StreamChunk> {\n yield { type: \"done\" };\n })();\n }\n\n try {\n const resumeData = isLimitPause\n ? {}\n : applyResumeSelection\n ? applyResumeSelection({ pending, selected: meta.selected })\n : meta.selected?.length\n ? { coordinates: String(meta.selected[0]) }\n : {};\n\n const resumeDataPatch = isRecord(resumeData) ? resumeData : {};\n const pendingMeta = isRecord(pending.schema?.meta)\n ? pending.schema.meta\n : {};\n const resumeStatePatch = isRecord(pendingMeta.__kortyxResumeStatePatch)\n ? pendingMeta.__kortyxResumeStatePatch\n : undefined;\n\n const pendingData = isRecord(pending.state?.data)\n ? pending.state?.data\n : {};\n const workflowId =\n typeof pending.workflow === \"string\" && pending.workflow.trim()\n ? pending.workflow\n : typeof defaultWorkflowId === \"string\" && defaultWorkflowId.trim()\n ? defaultWorkflowId\n : \"job-search\";\n\n const resumedState = {\n // For static breakpoints, resume with null input (set in orchestrator),\n // and stash the user selection into data so the next node can read it.\n input: pending.state ? pending.state.input : \"\",\n lastNode: \"__start__\",\n currentWorkflow: workflowId,\n config,\n runtime: {},\n conversationHistory: [],\n awaitingHumanInput: false,\n data: {\n ...pendingData,\n ...resumeDataPatch,\n },\n } satisfies GraphState;\n\n const wf = await selectWorkflow(resumedState.currentWorkflow as string);\n const telemetryConfig = prepareWorkflowTelemetry({\n config: {\n ...config,\n ...(pending.responseCompleted\n ? {\n responseCompleted: true,\n responseCheckpointId: pending.state?.config?.responseCheckpointId,\n }\n : {}),\n ...(resumedBudget ? { executionBudget: resumedBudget } : {}),\n ...(pending.state?.config?.context\n ? { context: pending.state.config.context }\n : {}),\n ...(pending.state?.config?.executionContract\n ? { executionContract: pending.state.config.executionContract }\n : {}),\n ...(pending.state?.config?.executionBranchId\n ? { executionBranchId: pending.state.config.executionBranchId }\n : {}),\n },\n workflow: wf,\n runId: pending.runId,\n sessionId,\n knownWorkflowIds,\n });\n resumedState.config = telemetryConfig;\n const resumeUpdate: Record<string, unknown> = pending.graphSnapshot\n ? {\n config: {\n ...telemetryConfig,\n context: pending.state?.config?.context ?? telemetryConfig.context,\n },\n }\n : {};\n if (isLimitPause && pending.graphSnapshot) {\n pending.graphSnapshot.checkpoint.channel_values.config = telemetryConfig;\n if (resumeStatePatch)\n pending.graphSnapshot.checkpoint.channel_values.runtime = {\n ...(pending.graphSnapshot.checkpoint.channel_values.runtime as Record<\n string,\n unknown\n >),\n ...resumeStatePatch,\n };\n }\n if (pending.graphSnapshot && frameworkAdapter)\n await restoreGraphSnapshot(\n frameworkAdapter.checkpointer,\n pending.graphSnapshot,\n pending.runId,\n );\n if (Object.keys(resumeDataPatch).length > 0) {\n resumeUpdate.data = {\n ...pendingData,\n ...resumeDataPatch,\n };\n }\n if (resumeStatePatch) {\n resumeUpdate.runtime = resumeStatePatch;\n }\n const hasResumeUpdate =\n !isLimitPause && Object.keys(resumeUpdate).length > 0;\n const resumeValue = isLimitPause\n ? undefined\n : meta.selected?.length && pending.schema.kind === \"multi-choice\"\n ? meta.selected.map((x) => String(x))\n : meta.selected?.length\n ? String(meta.selected[0])\n : undefined;\n const resumeCheckpointId =\n typeof pending.graphCheckpointId === \"string\" &&\n pending.graphCheckpointId.length > 0\n ? pending.graphCheckpointId\n : undefined;\n const resumedGraph = await createExecutionGraph(wf, {\n ...telemetryConfig,\n resume: true,\n ...(resumeValue !== undefined ? { resumeValue } : {}),\n ...(resumeCheckpointId ? { resumeCheckpointId } : {}),\n ...(hasResumeUpdate ? { resumeUpdate } : {}),\n });\n await store.delete(pending.token);\n const response = responseFromSelection(meta.selected);\n const telemetry = isRecord(telemetryConfig.telemetry)\n ? telemetryConfig.telemetry\n : {};\n const responseCaptured = Boolean(\n response &&\n shouldCaptureTelemetryContent(telemetry.captureContent, \"input\"),\n );\n emitTelemetryEvent({\n config: telemetryConfig,\n type: \"interrupt.resolved\",\n correlation: {\n runId: pending.runId,\n sessionId,\n workflowId,\n nodeId: pending.node,\n },\n payload: {\n interruptId: pending.requestId,\n resolvedAt: new Date().toISOString(),\n resumeOutcome: \"resumed\",\n responseCaptured,\n ...(responseCaptured && response ? { response } : {}),\n },\n flush: true,\n });\n\n const args = {\n abortSignal,\n executionSignal:\n pending.responseCompleted && emitOutput === false\n ? abortSignal\n : executionSignal,\n onExecution,\n emitOutput,\n onOutcome,\n sessionId,\n runId: pending.runId,\n graph: resumedGraph,\n state: resumedState,\n config: {\n ...telemetryConfig,\n resume: true,\n telemetryInterruptId: pending.requestId,\n telemetryInterruptNodeId: pending.node,\n ...(resumeValue !== undefined ? { resumeValue } : {}),\n ...(resumeCheckpointId ? { resumeCheckpointId } : {}),\n ...(hasResumeUpdate ? { resumeUpdate } : {}),\n },\n selectWorkflow,\n knownWorkflowIds,\n frameworkAdapter: frameworkAdapter as FrameworkAdapter,\n } satisfies OrchestrateArgs;\n\n const stream = await orchestrateGraphStream(args);\n return stream as unknown as AsyncIterable<StreamChunk>;\n } catch (error) {\n await store.save(pending);\n throw error;\n }\n}\n","import type {\n ExecutionLimitReached,\n ExecutionLimits,\n TokenUsage,\n WorkflowDefinition,\n} from \"@kortyx/core\";\nimport { type FailureDescriptor, KortyxError } from \"@kortyx/core/errors\";\nimport type { PendingRequestRecord } from \"@kortyx/runtime\";\nimport type { z } from \"zod\";\n\nexport type ExecutableWorkflow = WorkflowDefinition & {\n inputSchema: z.ZodType;\n outputSchema: z.ZodType<Record<string, unknown>>;\n};\n\n/** Serializable identity of a waiting request. Treat tokens as private credentials. */\nexport type ResumeHandle = {\n token: string;\n requestId: string;\n sessionId: string;\n runId: string;\n};\n\nexport type ResumeResponse =\n | { type: \"text\"; text: string }\n | { type: \"select\"; ids: string[] }\n | { type: \"cancel\" };\n\nexport type ExecutionInterrupt = {\n workflow: string;\n node: string;\n input: PendingRequestRecord[\"schema\"] & {\n options: Array<{\n id: string;\n label: string;\n description?: string | undefined;\n }>;\n };\n};\n\nexport type ExecutionInfo = {\n runId: string;\n sessionId: string;\n checkpointId?: string;\n usage?: TokenUsage;\n};\n\nexport type ExecutionResult<T = Record<string, unknown>> = ExecutionInfo &\n (\n | { status: \"completed\"; data: T }\n | {\n status: \"suspended\";\n reason?: \"limit_reached\";\n limit?: ExecutionLimitReached;\n interrupt: ExecutionInterrupt;\n resume: ResumeHandle;\n }\n | { status: \"cancelled\"; reason: string }\n | {\n status: \"failed\";\n error: Pick<FailureDescriptor, \"code\" | \"message\"> &\n Partial<FailureDescriptor>;\n }\n );\n\nexport type ExecuteOptions<W extends ExecutableWorkflow> = {\n limits?: ExecutionLimits;\n abortSignal?: AbortSignal;\n workflow: W;\n input: z.input<W[\"inputSchema\"]>;\n sessionId?: string;\n context?: Record<string, unknown>;\n};\nexport type ResumeOptions<W extends ExecutableWorkflow> = {\n limits?: ExecutionLimits;\n abortSignal?: AbortSignal;\n workflow: W;\n resume: ResumeHandle;\n response: ResumeResponse;\n};\n\n/** The command was rejected before starting work or claiming an interrupt. */\nexport class ExecutionRequestError extends KortyxError {\n override name = \"ExecutionRequestError\";\n constructor(code: string, message: string, cause?: unknown) {\n super(code, message, {\n category: \"request\",\n retryable: false,\n safeMessage:\n \"The execution request is invalid. Check the workflow contract and request fields.\",\n cause,\n });\n }\n}\n","import { PassThrough } from \"node:stream\";\nimport type { GraphState, WorkflowDefinition, WorkflowId } from \"@kortyx/core\";\nimport {\n createExecutionCancelledError,\n type ExecutionBudget,\n isExecutionCancelled,\n isExecutionLimitReached,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport {\n errorFromFailure,\n isFailureDescriptor,\n serializeFailure,\n} from \"@kortyx/core/errors\";\nimport {\n captureGraphSnapshot,\n createExecutionGraph,\n type FrameworkAdapter,\n makeRequestId,\n makeResumeToken,\n type PendingRequestRecord,\n type PendingRequestStore,\n} from \"@kortyx/runtime\";\nimport type { StreamChunk } from \"@kortyx/stream\";\nimport { Command } from \"@langchain/langgraph\";\nimport {\n parseExecutionInput,\n validateExecutionOutput,\n} from \"./execution/contracts\";\nimport { createResponseLifecycle } from \"./stream/response-lifecycle\";\nimport { transformGraphStreamForUI } from \"./stream/transform-graph-stream-for-ui\";\nimport {\n emitTelemetryEvent,\n shouldCaptureTelemetryContent,\n} from \"./telemetry/events\";\nimport { prepareWorkflowTelemetry } from \"./telemetry/topology\";\n\nexport type SelectWorkflowFn = (\n workflowId: string,\n) => Promise<WorkflowDefinition>;\n\nexport type SaveMemoryFn = (\n sessionId: string,\n state: GraphState,\n) => Promise<void>;\n\nexport interface CompiledGraphLike {\n execution?: {\n abortSignal?: AbortSignal | undefined;\n budget?: ExecutionBudget | undefined;\n completeResponse?:\n | ((\n options: import(\"@kortyx/hooks\").CompleteResponseOptions,\n state: GraphState,\n ) => Promise<void>)\n | undefined;\n };\n config?: Record<string, unknown>;\n streamEvents: (\n state: GraphState,\n options?: { version?: string; configurable?: Record<string, unknown> },\n ) => AsyncIterable<unknown> | AsyncGenerator<unknown>;\n getState?: (options?: {\n configurable?: Record<string, unknown>;\n }) => Promise<unknown>;\n}\n\nexport type OrchestrationOutcome = {\n cancelled?: boolean;\n state: GraphState;\n pending?: PendingRequestRecord | undefined;\n checkpointId?: string | undefined;\n error?: unknown;\n};\n\nexport interface OrchestrateArgs {\n executionSignal?: AbortSignal | undefined;\n onExecution?: ((completion: Promise<void>) => void) | undefined;\n abortSignal?: AbortSignal | undefined;\n emitOutput?: boolean | undefined;\n onOutcome?: ((outcome: OrchestrationOutcome) => void) | undefined;\n sessionId?: string;\n runId: string;\n graph: CompiledGraphLike; // minimal graph surface used here\n state: GraphState; // initial state\n config: Record<string, unknown>; // runtime config\n selectWorkflow: SelectWorkflowFn;\n knownWorkflowIds?: readonly string[] | undefined;\n frameworkAdapter?: FrameworkAdapter;\n}\n\ntype TraceSpanLike = {\n setAttributes?: (attributes: Record<string, unknown>) => void;\n addEvent?: (name: string, attributes?: Record<string, unknown>) => void;\n end?: (args?: {\n attributes?: Record<string, unknown>;\n telemetry?: Record<string, unknown>;\n }) => void;\n fail?: (\n error: unknown,\n args?: {\n attributes?: Record<string, unknown>;\n telemetry?: Record<string, unknown>;\n },\n ) => void;\n};\n\ntype TraceAdapterLike = {\n startSpan?: (args: {\n name: string;\n attributes?: Record<string, unknown>;\n telemetry?: unknown;\n }) => TraceSpanLike | undefined;\n withSpan?: <T>(\n args: {\n name: string;\n attributes?: Record<string, unknown>;\n telemetry?: unknown;\n },\n fn: (span: TraceSpanLike) => T | Promise<T>,\n ) => Promise<T>;\n getActiveContext?: () =>\n | {\n traceId: string;\n spanId: string;\n }\n | undefined;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst isGraphState = (value: unknown): value is GraphState =>\n isRecord(value) && typeof value.currentWorkflow === \"string\";\n\ntype GraphSnapshot = {\n state: GraphState;\n checkpointId?: string;\n};\n\nconst getGraphCheckpointId = (snapshot: unknown): string | undefined => {\n if (!isRecord(snapshot)) return undefined;\n const config = isRecord(snapshot.config) ? snapshot.config : undefined;\n const configurable =\n config && isRecord(config.configurable) ? config.configurable : undefined;\n const checkpointId = configurable?.checkpoint_id;\n return typeof checkpointId === \"string\" && checkpointId.length > 0\n ? checkpointId\n : undefined;\n};\n\nconst getTraceAdapter = (\n config: Record<string, unknown>,\n): TraceAdapterLike | undefined => {\n const telemetry = isRecord(config.telemetry) ? config.telemetry : undefined;\n const traceAdapter = telemetry?.trace ?? config.reasonTrace;\n return isRecord(traceAdapter)\n ? (traceAdapter as TraceAdapterLike)\n : undefined;\n};\n\n/**\n * Orchestrates runtime execution with mid-stream transitions emitted by\n * runtime events.\n */\nexport async function orchestrateGraphStream({\n sessionId,\n runId,\n graph,\n state,\n config: initialConfig,\n abortSignal: requestSignal,\n executionSignal,\n onExecution,\n emitOutput = true,\n onOutcome,\n selectWorkflow,\n knownWorkflowIds,\n frameworkAdapter,\n}: OrchestrateArgs): Promise<NodeJS.ReadableStream> {\n const out = new PassThrough({ objectMode: true });\n\n const write = (chunk: unknown) => {\n if (emitOutput && !response.closed && !out.destroyed) out.write(chunk);\n };\n let outcomeState = state;\n let outcomeError: unknown;\n let sessionCheckpointId: string | undefined =\n initialConfig.responseCheckpointId as string | undefined;\n let config = initialConfig;\n const budget = config.executionBudget as ExecutionBudget | undefined;\n let currentGraph = graph;\n let currentState: GraphState = state;\n let finished = false;\n const response = createResponseLifecycle({\n enabled: emitOutput,\n restored: initialConfig.responseCompleted === true,\n requestSignal,\n executionSignal,\n onClosed: () => {\n out.write({ type: \"done\" });\n out.end();\n },\n finalize: async (options, nodeState) => {\n // Snapshot the foreground before any later node return or handoff.\n const snapshot = JSON.parse(JSON.stringify(nodeState)) as GraphState;\n delete snapshot.config.responseCompleted;\n delete snapshot.config.responseCheckpointId;\n if (options.message !== undefined) {\n forwardEmit(\"message\", {\n node: nodeState.lastNode,\n content: options.message,\n });\n }\n if (options.data !== undefined) {\n forwardEmit(\"structured_data\", {\n node: nodeState.lastNode,\n data: options.data,\n });\n }\n if (sessionId && frameworkAdapter) {\n const checkpoint = await frameworkAdapter.sessionCheckpoints.append({\n sessionId,\n runId,\n workflow: String(snapshot.currentWorkflow),\n state: snapshot,\n nodes: [...touchedNodes],\n structuredStreamIds: [...structuredStreamIds],\n pendingRequests: [],\n });\n sessionCheckpointId = checkpoint.id;\n write({\n type: \"checkpoint\",\n id: checkpoint.id,\n sessionId,\n turnIndex: checkpoint.turnIndex,\n });\n emitTelemetryEvent({\n config,\n type: \"session.checkpointed\",\n payload: {\n checkpointId: checkpoint.id,\n turnIndex: checkpoint.turnIndex,\n nodes: checkpoint.nodes,\n },\n });\n }\n throwIfExecutionAborted(abortSignal);\n config.responseCompleted = true;\n config.responseCheckpointId = sessionCheckpointId;\n currentState.config.responseCompleted = true;\n nodeState.config.responseCompleted = true;\n // The marker travels with graph config across retries, children and resumes.\n currentGraph.config!.responseCompleted = true;\n emitTelemetryEvent({\n config,\n type: \"response.completed\",\n payload: {\n nodeId: nodeState.lastNode,\n checkpointId: sessionCheckpointId,\n },\n flush: true,\n });\n },\n });\n const abortSignal = response.signal;\n out.on(\"close\", () => {\n if (!finished) response.disconnect();\n });\n let structuredSeq = 0;\n const debugEnabled = Boolean((config as any)?.features?.tracing);\n const traceAdapter = getTraceAdapter(config);\n const contextMeta = isRecord(config.context) ? config.context : {};\n const telemetryConfig = isRecord(config.telemetry) ? config.telemetry : {};\n const emitResumeFailure = (resumeError: unknown) => {\n const interruptId =\n typeof config.telemetryInterruptId === \"string\"\n ? config.telemetryInterruptId\n : undefined;\n if (!interruptId) return;\n emitTelemetryEvent({\n config,\n type: \"interrupt.resolved\",\n correlation:\n typeof config.telemetryInterruptNodeId === \"string\"\n ? { nodeId: config.telemetryInterruptNodeId }\n : undefined,\n payload: {\n interruptId,\n resolvedAt: new Date().toISOString(),\n resumeOutcome: \"failed\",\n resumeError: serializeFailure(resumeError).message,\n failure: serializeFailure(resumeError),\n },\n flush: true,\n });\n };\n const telemetryCorrelation = isRecord(telemetryConfig.correlation)\n ? telemetryConfig.correlation\n : {};\n const runSpanArgs = {\n name: \"kortyx.run\",\n attributes: {\n ...(sessionId ? { sessionId } : {}),\n runId,\n workflowId: state.currentWorkflow,\n ...(typeof telemetryCorrelation.topologyHash === \"string\"\n ? { topologyHash: telemetryCorrelation.topologyHash }\n : {}),\n ...(typeof telemetryCorrelation.workflowRevisionId === \"string\"\n ? { workflowRevisionId: telemetryCorrelation.workflowRevisionId }\n : {}),\n ...(typeof contextMeta.userId === \"string\"\n ? { userId: contextMeta.userId }\n : {}),\n ...(typeof contextMeta.tenantId === \"string\"\n ? { tenantId: contextMeta.tenantId }\n : {}),\n },\n telemetry: {\n metadata: {\n ...(isRecord(telemetryConfig.metadata) ? telemetryConfig.metadata : {}),\n ...contextMeta,\n },\n tags: Array.isArray(telemetryConfig.tags)\n ? telemetryConfig.tags\n : undefined,\n captureContent: telemetryConfig.captureContent,\n input:\n typeof state.input === \"string\"\n ? state.input\n : JSON.stringify(state.input),\n },\n };\n const namespacesUsed = new Set<string>();\n const touchedNodes = new Set<string>();\n const structuredStreamIds = new Set<string>();\n const activePendingRequests = new Map<string, PendingRequestRecord>();\n const pendingRequestWrites: Promise<void>[] = [];\n\n // Announce session id to clients so they can persist it\n try {\n const sid = (config as any)?.session?.id as string | undefined;\n if (sid && typeof sid === \"string\") {\n write({ type: \"session\", sessionId: sid } as any);\n }\n } catch {}\n\n // Pending transition captured from runtime transition events.\n const pending: {\n to: string | null;\n payload: Record<string, unknown>;\n sourceNodeId: string | undefined;\n sourceWorkflowId: string | undefined;\n } = {\n to: null,\n payload: {},\n sourceNodeId: undefined,\n sourceWorkflowId: undefined,\n };\n\n // Bridge internal graph emits to our stream AND capture transitions\n let lastStatusMsg = \"\";\n let lastStatusAt = 0;\n let accumulatedOutput = \"\";\n let lastOutputSegmentId: string | undefined;\n const appendAccumulatedOutput = (\n payload: unknown,\n node: string,\n delta: string,\n ) => {\n const payloadObj = payload as {\n segmentId?: unknown;\n opId?: unknown;\n id?: unknown;\n };\n const opId =\n typeof payloadObj.opId === \"string\" && payloadObj.opId.length > 0\n ? payloadObj.opId\n : undefined;\n const segmentId =\n typeof payloadObj.segmentId === \"string\" &&\n payloadObj.segmentId.length > 0\n ? payloadObj.segmentId\n : undefined;\n const textStreamId =\n opId && segmentId\n ? `${opId}:${segmentId}`\n : segmentId ||\n opId ||\n (typeof payloadObj.id === \"string\" && payloadObj.id.length > 0\n ? payloadObj.id\n : undefined) ||\n node;\n\n if (\n textStreamId &&\n lastOutputSegmentId &&\n textStreamId !== lastOutputSegmentId &&\n accumulatedOutput.length > 0 &&\n !/\\s$/.test(accumulatedOutput) &&\n !/^\\s/.test(delta)\n ) {\n accumulatedOutput += \" \";\n }\n\n lastOutputSegmentId = textStreamId;\n accumulatedOutput += delta;\n if (!emitOutput) accumulatedOutput = accumulatedOutput.slice(0, 65536);\n };\n const nextStructuredStreamId = () => `${runId}:structured:${structuredSeq++}`;\n const runTraceEndArgs = () =>\n accumulatedOutput.length > 0\n ? { telemetry: { output: accumulatedOutput } }\n : undefined;\n\n // Capture interrupt payloads emitted by runtime hooks and forward them as\n // resumable interrupt chunks.\n interface HumanInputPayload {\n node?: string;\n workflow?: string;\n input?: {\n kind?: string;\n multiple?: boolean;\n question?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n meta?: Record<string, unknown>;\n options?: Array<{\n id: string;\n label: string;\n description?: string;\n value?: unknown;\n }>;\n };\n }\n // Track latest interrupt token for updating stored snapshot at end\n let pendingRecordToken: string | null = null;\n // Avoid emitting duplicate interrupt chunks in the same run.\n let wroteHumanInput = false;\n\n const pendingStore: PendingRequestStore | undefined =\n frameworkAdapter?.pendingRequests;\n const sealPendingSnapshots = async () => {\n if (budget) outcomeState.config.executionBudget = budget;\n if (response.closed) outcomeState.config.responseCompleted = true;\n if (typeof frameworkAdapter?.checkpointer?.getTuple !== \"function\") return;\n for (const [token, request] of activePendingRequests) {\n if (budget && request.state)\n request.state.config.executionBudget = budget;\n if (response.closed && request.state)\n request.state.config.responseCompleted = true;\n const graphSnapshot = await captureGraphSnapshot(\n frameworkAdapter.checkpointer,\n runId,\n request.graphCheckpointId,\n );\n if (graphSnapshot) {\n const sealed = { ...request, graphSnapshot, ready: true };\n activePendingRequests.set(token, sealed);\n await pendingStore?.update(token, {\n graphSnapshot,\n ready: true,\n state: request.state!,\n });\n }\n }\n };\n const pendingTtlMs = frameworkAdapter?.ttlMs ?? 15 * 60 * 1000;\n\n const persistAndEmitInterrupt = async (\n payload: HumanInputPayload,\n ): Promise<void> => {\n if (wroteHumanInput) return;\n\n const token = makeResumeToken();\n const requestId = makeRequestId(\"human\");\n pendingRecordToken = token;\n const input = payload.input ?? {};\n const optionsList = Array.isArray(input.options) ? input.options : [];\n const kind = input.kind || (input.multiple ? \"multi-choice\" : \"choice\");\n const isText = kind === \"text\";\n\n const record: PendingRequestRecord = {\n token,\n ready: false,\n responseCompleted: response.closed,\n requestId,\n sessionId,\n runId,\n workflow: payload.workflow || (currentState.currentWorkflow as string),\n node: payload.node || \"\",\n state: { ...(currentState as GraphState), awaitingHumanInput: true },\n schema: isText\n ? {\n kind: kind as any,\n multiple: Boolean(input.multiple),\n ...(input.question ? { question: input.question } : {}),\n ...(typeof input.id === \"string\" && input.id.length > 0\n ? { id: input.id }\n : {}),\n ...(typeof input.schemaId === \"string\" && input.schemaId.length > 0\n ? { schemaId: input.schemaId }\n : {}),\n ...(typeof input.schemaVersion === \"string\" &&\n input.schemaVersion.length > 0\n ? { schemaVersion: input.schemaVersion }\n : {}),\n ...(input.meta && typeof input.meta === \"object\"\n ? { meta: input.meta }\n : {}),\n }\n : {\n kind: kind as any,\n multiple: Boolean(input.multiple),\n question: String(input.question || \"Please choose an option.\"),\n ...(typeof input.id === \"string\" && input.id.length > 0\n ? { id: input.id }\n : {}),\n ...(typeof input.schemaId === \"string\" && input.schemaId.length > 0\n ? { schemaId: input.schemaId }\n : {}),\n ...(typeof input.schemaVersion === \"string\" &&\n input.schemaVersion.length > 0\n ? { schemaVersion: input.schemaVersion }\n : {}),\n ...(input.meta && typeof input.meta === \"object\"\n ? { meta: input.meta }\n : {}),\n },\n options: optionsList.map((option: any) => ({\n id: String(option.id),\n label: String(option.label),\n description:\n typeof option.description === \"string\"\n ? option.description\n : undefined,\n value: option.value,\n })),\n createdAt: Date.now(),\n ttlMs: pendingTtlMs,\n };\n activePendingRequests.set(record.token, record);\n\n if (pendingStore) {\n const savePromise = pendingStore.save(record).catch((error) => {\n // eslint-disable-next-line no-console\n outcomeError = error;\n console.error(\n \"[orchestrator] failed to save pending request\",\n serializeFailure(error),\n );\n });\n pendingRequestWrites.push(savePromise);\n }\n\n const clientMeta =\n record.schema.meta &&\n typeof record.schema.meta === \"object\" &&\n !Array.isArray(record.schema.meta)\n ? Object.fromEntries(\n Object.entries(record.schema.meta).filter(\n ([key]) => !key.startsWith(\"__kortyx\"),\n ),\n )\n : undefined;\n\n write({\n type: \"interrupt\",\n requestId: record.requestId,\n resumeToken: record.token,\n workflow: record.workflow,\n node: record.node,\n ...(typeof record.schema.id === \"string\" && record.schema.id.length > 0\n ? { id: record.schema.id }\n : {}),\n ...(typeof record.schema.schemaId === \"string\" &&\n record.schema.schemaId.length > 0\n ? { schemaId: record.schema.schemaId }\n : {}),\n ...(typeof record.schema.schemaVersion === \"string\" &&\n record.schema.schemaVersion.length > 0\n ? { schemaVersion: record.schema.schemaVersion }\n : {}),\n input: {\n kind: record.schema.kind,\n multiple: record.schema.multiple,\n question: record.schema.question,\n ...(typeof record.schema.id === \"string\" && record.schema.id.length > 0\n ? { id: record.schema.id }\n : {}),\n ...(typeof record.schema.schemaId === \"string\" &&\n record.schema.schemaId.length > 0\n ? { schemaId: record.schema.schemaId }\n : {}),\n ...(typeof record.schema.schemaVersion === \"string\" &&\n record.schema.schemaVersion.length > 0\n ? { schemaVersion: record.schema.schemaVersion }\n : {}),\n ...(clientMeta && Object.keys(clientMeta).length > 0\n ? { meta: clientMeta }\n : {}),\n options: record.options.map((option) => ({\n id: option.id,\n label: option.label,\n description: option.description,\n })),\n },\n } as any);\n emitTelemetryEvent({\n config,\n type: \"interrupt.created\",\n correlation: { nodeId: record.node },\n payload: {\n workflowCall: record.schema.meta?.workflowCall ?? null,\n workflowCallPath: record.schema.meta?.workflowCallPath ?? null,\n branchId: config.executionBranchId ?? runId,\n interruptId: record.requestId,\n responseCompleted: response.closed,\n requestId: record.requestId,\n kind: record.schema.kind,\n interactionMode:\n record.schema.kind === \"text\"\n ? \"freeform\"\n : record.options.length > 0\n ? \"static-options\"\n : record.schema.schemaId\n ? \"dynamic-picker\"\n : \"unknown\",\n ...(record.schema.schemaId ? { schemaId: record.schema.schemaId } : {}),\n ...(record.schema.schemaVersion\n ? { schemaVersion: record.schema.schemaVersion }\n : {}),\n ...(typeof record.schema.question === \"string\" &&\n shouldCaptureTelemetryContent(telemetryConfig.captureContent, \"output\")\n ? { question: record.schema.question }\n : {}),\n ...(shouldCaptureTelemetryContent(\n telemetryConfig.captureContent,\n \"output\",\n )\n ? {\n options: record.options.map((option) => ({\n id: option.id,\n label: option.label,\n ...(option.description\n ? { description: option.description }\n : {}),\n })),\n }\n : {}),\n optionCount: record.options.length,\n nodeId: record.node,\n expiresAt: new Date(record.createdAt + record.ttlMs).toISOString(),\n },\n flush: true,\n });\n wroteHumanInput = true;\n };\n\n const forwardEmit = (event: string, payload: unknown) => {\n if (event === \"error\") {\n const msg = String(\n (payload as { message?: unknown })?.message ?? \"Unexpected error\",\n );\n const supplied = (payload as { failure?: unknown })?.failure;\n outcomeError = isFailureDescriptor(supplied)\n ? errorFromFailure(supplied)\n : new Error(msg);\n write({\n type: \"error\",\n message: serializeFailure(outcomeError).message,\n failure: serializeFailure(outcomeError),\n });\n write({ type: \"done\" });\n finished = true;\n out.end();\n return;\n }\n if (event === \"status\") {\n if (!debugEnabled) return;\n const statusMessage = (\n payload as { message?: unknown } | null | undefined\n )?.message;\n const msg =\n statusMessage === null || statusMessage === undefined\n ? \"\"\n : String(statusMessage);\n const now = Date.now();\n if (msg && msg === lastStatusMsg && now - lastStatusAt < 250) return; // de-dupe rapid duplicates\n lastStatusMsg = msg;\n lastStatusAt = now;\n write({ type: \"status\", message: msg });\n return;\n }\n if (event === \"text-start\") {\n const node = (payload as { node?: string })?.node;\n if (!node) return;\n touchedNodes.add(node);\n write({\n type: \"text-start\",\n node,\n ...(typeof (payload as { id?: string }).id === \"string\"\n ? { id: (payload as { id?: string }).id }\n : {}),\n ...(typeof (payload as { opId?: string }).opId === \"string\"\n ? { opId: (payload as { opId?: string }).opId }\n : {}),\n ...(typeof (payload as { segmentId?: string }).segmentId === \"string\"\n ? { segmentId: (payload as { segmentId?: string }).segmentId }\n : {}),\n });\n return;\n }\n if (event === \"text-delta\") {\n const node = (payload as { node?: string })?.node;\n const delta = String((payload as { delta?: unknown })?.delta ?? \"\");\n if (!node || !delta) return;\n touchedNodes.add(node);\n appendAccumulatedOutput(payload, node, delta);\n write({\n type: \"text-delta\",\n delta,\n node,\n ...(typeof (payload as { id?: string }).id === \"string\"\n ? { id: (payload as { id?: string }).id }\n : {}),\n ...(typeof (payload as { opId?: string }).opId === \"string\"\n ? { opId: (payload as { opId?: string }).opId }\n : {}),\n ...(typeof (payload as { segmentId?: string }).segmentId === \"string\"\n ? { segmentId: (payload as { segmentId?: string }).segmentId }\n : {}),\n });\n return;\n }\n if (event === \"text-end\") {\n const node = (payload as { node?: string })?.node;\n if (!node) return;\n touchedNodes.add(node);\n write({\n type: \"text-end\",\n node,\n ...(typeof (payload as { id?: string }).id === \"string\"\n ? { id: (payload as { id?: string }).id }\n : {}),\n ...(typeof (payload as { opId?: string }).opId === \"string\"\n ? { opId: (payload as { opId?: string }).opId }\n : {}),\n ...(typeof (payload as { segmentId?: string }).segmentId === \"string\"\n ? { segmentId: (payload as { segmentId?: string }).segmentId }\n : {}),\n });\n return;\n }\n if (event === \"tool-call-start\") {\n const payloadObj = payload as {\n tool?: unknown;\n toolCallId?: unknown;\n node?: string;\n id?: string;\n opId?: string;\n input?: unknown;\n };\n if (\n typeof payloadObj.tool !== \"string\" ||\n typeof payloadObj.toolCallId !== \"string\"\n ) {\n return;\n }\n write({\n type: \"tool-call-start\",\n tool: payloadObj.tool,\n toolCallId: payloadObj.toolCallId,\n ...(payloadObj.node ? { node: payloadObj.node } : {}),\n ...(payloadObj.id ? { id: payloadObj.id } : {}),\n ...(payloadObj.opId ? { opId: payloadObj.opId } : {}),\n ...(payloadObj.input !== undefined ? { input: payloadObj.input } : {}),\n });\n if (payloadObj.node) touchedNodes.add(payloadObj.node);\n return;\n }\n if (event === \"tool-call-result\") {\n const payloadObj = payload as {\n tool?: unknown;\n toolCallId?: unknown;\n node?: string;\n id?: string;\n opId?: string;\n content?: unknown;\n structuredContent?: unknown;\n isError?: unknown;\n };\n if (\n typeof payloadObj.tool !== \"string\" ||\n typeof payloadObj.toolCallId !== \"string\"\n ) {\n return;\n }\n write({\n type: \"tool-call-result\",\n tool: payloadObj.tool,\n toolCallId: payloadObj.toolCallId,\n ...(payloadObj.node ? { node: payloadObj.node } : {}),\n ...(payloadObj.id ? { id: payloadObj.id } : {}),\n ...(payloadObj.opId ? { opId: payloadObj.opId } : {}),\n content: payloadObj.content,\n ...(payloadObj.structuredContent !== undefined\n ? { structuredContent: payloadObj.structuredContent }\n : {}),\n ...(typeof payloadObj.isError === \"boolean\"\n ? { isError: payloadObj.isError }\n : {}),\n });\n if (payloadObj.node) touchedNodes.add(payloadObj.node);\n return;\n }\n if (event === \"tool-call-error\") {\n const payloadObj = payload as {\n tool?: unknown;\n toolCallId?: unknown;\n node?: string;\n id?: string;\n opId?: string;\n message?: unknown;\n };\n if (\n typeof payloadObj.tool !== \"string\" ||\n typeof payloadObj.toolCallId !== \"string\"\n ) {\n return;\n }\n write({\n type: \"tool-call-error\",\n tool: payloadObj.tool,\n toolCallId: payloadObj.toolCallId,\n ...(payloadObj.node ? { node: payloadObj.node } : {}),\n ...(payloadObj.id ? { id: payloadObj.id } : {}),\n ...(payloadObj.opId ? { opId: payloadObj.opId } : {}),\n message: String(payloadObj.message ?? \"\"),\n });\n if (payloadObj.node) touchedNodes.add(payloadObj.node);\n return;\n }\n if (event === \"message\") {\n const node = (payload as { node?: string })?.node;\n const text = String((payload as { content?: unknown })?.content ?? \"\");\n if (node) touchedNodes.add(node);\n write({ type: \"message\", node, content: text });\n return;\n }\n if (event === \"structured_data\") {\n const payloadObj = payload as {\n streamId?: string;\n dataType?: string;\n kind?: string;\n schemaId?: string;\n schemaVersion?: string;\n id?: string;\n node?: string;\n path?: string;\n value?: unknown;\n items?: unknown[];\n delta?: string;\n data?: unknown;\n };\n const kind =\n payloadObj.kind === \"set\" ||\n payloadObj.kind === \"append\" ||\n payloadObj.kind === \"text-delta\" ||\n payloadObj.kind === \"final\"\n ? payloadObj.kind\n : \"final\";\n\n const streamId =\n typeof payloadObj.streamId === \"string\" && payloadObj.streamId\n ? payloadObj.streamId\n : nextStructuredStreamId();\n structuredStreamIds.add(streamId);\n if (payloadObj.node) touchedNodes.add(payloadObj.node);\n\n write({\n type: \"structured-data\",\n node: payloadObj.node,\n streamId,\n dataType:\n typeof payloadObj.dataType === \"string\" && payloadObj.dataType\n ? payloadObj.dataType\n : \"generic\",\n kind,\n ...(typeof payloadObj.schemaId === \"string\"\n ? { schemaId: payloadObj.schemaId }\n : {}),\n ...(typeof payloadObj.schemaVersion === \"string\"\n ? { schemaVersion: payloadObj.schemaVersion }\n : {}),\n ...(typeof payloadObj.id === \"string\" ? { id: payloadObj.id } : {}),\n ...(kind === \"set\"\n ? {\n path: String(payloadObj.path ?? \"\"),\n value: payloadObj.value,\n }\n : {}),\n ...(kind === \"append\"\n ? {\n path: String(payloadObj.path ?? \"\"),\n items: Array.isArray(payloadObj.items) ? payloadObj.items : [],\n }\n : {}),\n ...(kind === \"text-delta\"\n ? {\n path: String(payloadObj.path ?? \"\"),\n delta: String(payloadObj.delta ?? \"\"),\n }\n : {}),\n ...(kind === \"final\" ? { data: payloadObj.data } : {}),\n });\n return;\n }\n // legacy 'human_required' removed — dynamic interrupts are used instead\n if (event === \"transition\") {\n // 1) surface to the client (useful for dev tools)\n write({\n type: \"transition\",\n transitionTo: (payload as { transitionTo?: string })?.transitionTo,\n payload:\n (payload as { payload?: Record<string, unknown> })?.payload ?? {},\n });\n // 2) capture for orchestration\n pending.to = (payload as { transitionTo?: string })?.transitionTo ?? null;\n pending.payload =\n (payload as { payload?: Record<string, unknown> })?.payload ?? {};\n const transition = payload as { node?: unknown; workflow?: unknown };\n pending.sourceNodeId =\n typeof transition.node === \"string\" ? transition.node : undefined;\n pending.sourceWorkflowId =\n typeof transition.workflow === \"string\"\n ? transition.workflow\n : undefined;\n return;\n }\n if (event === \"interrupt\") {\n const p = payload as any;\n if (typeof p?.node === \"string\") touchedNodes.add(p.node);\n const local: HumanInputPayload = {\n node: p?.node,\n workflow: p?.workflow,\n input: p?.input,\n };\n void persistAndEmitInterrupt(local).catch((error) => {\n // eslint-disable-next-line no-console\n console.error(\n \"[orchestrator] failed to emit interrupt\",\n serializeFailure(error),\n );\n });\n return;\n }\n };\n\n const runLoop = async (runTraceSpan: TraceSpanLike) => {\n while (true) {\n throwIfExecutionAborted(abortSignal);\n let workflowFinalState: GraphState | null = null;\n let workflowFinalGraphCheckpointId: string | undefined;\n let sawWorkflowDone = false;\n let workflowDoneData: unknown;\n\n // Ensure the compiled graph uses our forwardEmit\n currentGraph.execution ??= {};\n currentGraph.execution.abortSignal = abortSignal;\n currentGraph.execution.budget = budget;\n currentGraph.execution.completeResponse = response.complete;\n currentGraph.config = currentGraph.config || {};\n currentGraph.config.emit = forwardEmit;\n currentGraph.config.executionRunId = runId;\n const threadId =\n ((currentGraph.config as any)?.session?.id as string | undefined) ||\n sessionId ||\n \"anonymous-session\";\n const checkpointNs = \"\";\n namespacesUsed.add(checkpointNs);\n const readLatestGraphCheckpointId = async (): Promise<\n string | undefined\n > => {\n const checkpointer = (currentGraph.config as any)?.checkpointer as\n | {\n getLatestCheckpointId?: (\n threadId: string,\n checkpointNs?: string,\n ) => Promise<string | undefined>;\n }\n | undefined;\n return checkpointer?.getLatestCheckpointId?.(runId, checkpointNs);\n };\n const readLatestGraphSnapshot =\n async (): Promise<GraphSnapshot | null> => {\n if (typeof currentGraph.getState !== \"function\") {\n const checkpointId = await readLatestGraphCheckpointId();\n return checkpointId ? { state: currentState, checkpointId } : null;\n }\n const snapshot = await currentGraph.getState({\n configurable: {\n thread_id: runId,\n checkpoint_ns: checkpointNs,\n },\n });\n const values =\n isRecord(snapshot) && \"values\" in snapshot\n ? snapshot.values\n : snapshot;\n const checkpointId =\n getGraphCheckpointId(snapshot) ??\n (await readLatestGraphCheckpointId());\n /* v8 ignore next -- snapshot shape branches are covered above; v8 reports a synthetic negative branch for this type guard. */\n if (!isGraphState(values)) {\n return checkpointId ? { state: currentState, checkpointId } : null;\n }\n return {\n state: values,\n ...(checkpointId ? { checkpointId } : {}),\n };\n };\n if (debugEnabled) {\n write({\n type: \"status\",\n message: `🧵 thread_id=${threadId} run_id=${runId} workflow=${currentState.currentWorkflow}`,\n });\n }\n\n // Stream runtime events (LLM deltas, node starts/ends, etc.)\n const isResume = Boolean((currentGraph.config as any)?.resume);\n // For static breakpoints, resume with null input; if a resumeUpdate was provided,\n // use Command({ update }) to merge selection into state at resume time.\n const resumeUpdate = (currentGraph.config as any)?.resumeUpdate as\n | Record<string, unknown>\n | undefined;\n const resumeValue = (currentGraph.config as any)?.resumeValue as\n | unknown\n | undefined;\n const resumeCheckpointId = (currentGraph.config as any)\n ?.resumeCheckpointId as string | undefined;\n const invokeState = isResume\n ? resumeValue !== undefined && resumeUpdate\n ? (new Command({ resume: resumeValue, update: resumeUpdate }) as any)\n : resumeValue !== undefined\n ? (new Command({ resume: resumeValue }) as any)\n : resumeUpdate\n ? (new Command({ update: resumeUpdate }) as any)\n : (null as any)\n : (currentState as any);\n const runtimeStream = currentGraph.streamEvents(invokeState, {\n version: \"v2\",\n configurable: {\n thread_id: runId,\n checkpoint_ns: checkpointNs,\n ...(isResume && resumeCheckpointId\n ? { checkpoint_id: resumeCheckpointId }\n : {}),\n },\n });\n\n if (debugEnabled) {\n write({\n type: \"status\",\n message: `▶️ streamEvents invoke: resume=${Boolean((currentGraph.config as any)?.resume)} thread_id=${threadId} run_id=${runId} ns=${String(currentState.currentWorkflow || \"default\")}`,\n } as any);\n }\n\n // Observe engine state independently of UI chunks or their consumers.\n const observedStream = (async function* () {\n for await (const event of runtimeStream) {\n const raw = event as {\n event?: string;\n name?: string;\n data?: { output?: unknown };\n };\n if (\n (raw.event === \"on_chain_end\" || raw.event === \"on_graph_end\") &&\n !raw.name?.startsWith(\"ChannelWrite\") &&\n isGraphState(raw.data?.output)\n ) {\n outcomeState = raw.data.output;\n }\n yield event;\n }\n })();\n const uiStream = transformGraphStreamForUI(observedStream as any, {\n debug: debugEnabled,\n emitStatus: debugEnabled,\n });\n\n if (!emitOutput) {\n for await (const _event of observedStream) {\n if (finished) break;\n }\n sawWorkflowDone = true;\n workflowDoneData = outcomeState;\n }\n for await (const chunk of (emitOutput\n ? uiStream\n : []) as AsyncIterable<StreamChunk>) {\n if (finished) break;\n if (\"node\" in chunk && typeof chunk.node === \"string\") {\n touchedNodes.add(chunk.node);\n }\n\n if (chunk.type === \"done\") {\n sawWorkflowDone = true;\n workflowDoneData = chunk.data;\n continue;\n }\n\n write(chunk);\n }\n\n if (finished) {\n runTraceSpan.fail?.(outcomeError);\n return;\n }\n\n if (sawWorkflowDone) {\n const graphSnapshot = await readLatestGraphSnapshot();\n workflowFinalGraphCheckpointId = graphSnapshot?.checkpointId;\n workflowFinalState = isGraphState(workflowDoneData)\n ? workflowDoneData\n : (graphSnapshot?.state ?? currentState);\n }\n\n throwIfExecutionAborted(abortSignal);\n const transitionTo = pending.to;\n const transitionPayload = pending.payload;\n const sourceNodeId = pending.sourceNodeId;\n const sourceWorkflowId = pending.sourceWorkflowId;\n\n // Reset pending so we don't carry it accidentally\n pending.to = null;\n pending.payload = {};\n pending.sourceNodeId = undefined;\n pending.sourceWorkflowId = undefined;\n\n if (transitionTo) {\n // 🔁 Handoff to the next workflow\n try {\n const nextWorkflow = await selectWorkflow(transitionTo);\n const sourceTelemetry = isRecord(config.telemetry)\n ? config.telemetry\n : {};\n config = prepareWorkflowTelemetry({\n config,\n workflow: nextWorkflow,\n runId,\n sessionId,\n knownWorkflowIds,\n });\n const targetTelemetry = isRecord(config.telemetry)\n ? config.telemetry\n : {};\n emitTelemetryEvent({\n config,\n type: \"workflow.transitioned\",\n ...(sourceNodeId ? { correlation: { nodeId: sourceNodeId } } : {}),\n payload: {\n sourceNodeId: sourceNodeId ?? \"\",\n sourceWorkflowId:\n sourceWorkflowId ?? String(currentState.currentWorkflow),\n ...(typeof sourceTelemetry.correlation === \"object\" &&\n sourceTelemetry.correlation &&\n typeof (sourceTelemetry.correlation as Record<string, unknown>)\n .workflowRevisionId === \"string\"\n ? {\n sourceWorkflowRevisionId: (\n sourceTelemetry.correlation as Record<string, unknown>\n ).workflowRevisionId,\n }\n : {}),\n targetWorkflowId: transitionTo,\n ...(typeof targetTelemetry.correlation === \"object\" &&\n targetTelemetry.correlation &&\n typeof (targetTelemetry.correlation as Record<string, unknown>)\n .workflowRevisionId === \"string\"\n ? {\n targetWorkflowRevisionId: (\n targetTelemetry.correlation as Record<string, unknown>\n ).workflowRevisionId,\n }\n : {}),\n },\n });\n // Resume controls belong only to the graph restored from the checkpoint.\n delete config.resume;\n delete config.resumeValue;\n delete config.resumeUpdate;\n delete config.resumeCheckpointId;\n const nextGraph = await createExecutionGraph(nextWorkflow, {\n ...(config as Record<string, unknown>),\n emit: forwardEmit, // keep forwarding emits\n });\n\n // Merge data: prefer the final state's data if present, then add transition payload\n const mergedData = {\n ...(workflowFinalState?.data ?? currentState.data ?? {}),\n ...transitionPayload,\n };\n\n const rawInputFromPayload = (\n transitionPayload as {\n rawInput?: unknown;\n }\n )?.rawInput;\n const rawNextInput =\n typeof rawInputFromPayload === \"string\"\n ? rawInputFromPayload\n : currentState.input;\n\n currentState = {\n ...currentState,\n runtime: workflowFinalState?.runtime ?? currentState.runtime,\n currentWorkflow: transitionTo as WorkflowId,\n config,\n input: nextWorkflow.inputSchema\n ? parseExecutionInput(nextWorkflow, rawNextInput)\n : rawNextInput,\n data: mergedData,\n ui: {}, // reset UI layer on new graph\n };\n\n currentGraph = nextGraph;\n continue; // run the next graph\n } catch (err) {\n throwIfExecutionAborted(abortSignal);\n if (isExecutionCancelled(err)) throw err;\n outcomeError = err;\n runTraceSpan.fail?.(err);\n runTraceSpan.addEvent?.(\"kortyx.transition.error\", {\n transitionTo,\n });\n write({\n type: \"error\",\n message: serializeFailure(err).message,\n failure: serializeFailure(err),\n });\n write({ type: \"done\" });\n out.end();\n return;\n }\n }\n\n // No transition → either graph returned done or ended naturally\n if (workflowFinalState) {\n // If we paused for an interrupt, persist a pending request and emit an interrupt chunk\n // Attach final state to pending record if we have one\n if (workflowFinalState && pendingRecordToken) {\n if (pendingRequestWrites.length > 0) {\n await Promise.all(pendingRequestWrites);\n }\n if (pendingStore) {\n await pendingStore.update(pendingRecordToken, {\n state: workflowFinalState,\n ...(workflowFinalGraphCheckpointId\n ? { graphCheckpointId: workflowFinalGraphCheckpointId }\n : {}),\n });\n }\n const pendingRequest = activePendingRequests.get(pendingRecordToken);\n /* v8 ignore next -- pendingRecordToken is assigned only after the active request is inserted. */\n if (pendingRequest) {\n activePendingRequests.set(pendingRecordToken, {\n ...pendingRequest,\n state: workflowFinalState,\n ...(workflowFinalGraphCheckpointId\n ? { graphCheckpointId: workflowFinalGraphCheckpointId }\n : {}),\n });\n }\n }\n /* v8 ignore next -- pending writes are created only by interrupt persistence, which also sets pendingRecordToken. */\n if (!pendingRecordToken && pendingRequestWrites.length > 0) {\n await Promise.all(pendingRequestWrites);\n }\n\n const shouldKeepFrameworkState =\n Boolean(pendingRecordToken) ||\n Boolean((workflowFinalState as any)?.awaitingHumanInput);\n if (!shouldKeepFrameworkState) {\n workflowFinalState = await validateExecutionOutput(\n workflowFinalState,\n selectWorkflow,\n );\n // Best-effort cleanup: completed runs don't need to retain checkpoints.\n try {\n if (frameworkAdapter?.cleanupRun) {\n await frameworkAdapter.cleanupRun(\n runId,\n Array.from(namespacesUsed),\n );\n } else {\n const cp = (currentGraph.config as any)\n ?.checkpointer as unknown as {\n deleteThread?: (id: string) => any;\n };\n if (cp?.deleteThread) {\n await cp.deleteThread(runId);\n }\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\n \"[orchestrator] framework cleanup failed\",\n serializeFailure(e),\n );\n }\n }\n\n outcomeState = workflowFinalState;\n if (!emitOutput && !shouldKeepFrameworkState)\n accumulatedOutput = JSON.stringify(workflowFinalState.data).slice(\n 0,\n 65536,\n );\n finished = true;\n runTraceSpan.setAttributes?.({\n \"kortyx.run.awaiting_human_input\": shouldKeepFrameworkState,\n \"kortyx.run.final_workflow\": String(currentState.currentWorkflow),\n });\n runTraceSpan.end?.(runTraceEndArgs());\n const resolvedSessionId =\n ((config as any)?.session?.id as string | undefined) ||\n sessionId ||\n \"\";\n await sealPendingSnapshots();\n if (\n !response.closed &&\n resolvedSessionId &&\n frameworkAdapter?.sessionCheckpoints\n ) {\n try {\n const checkpoint = await frameworkAdapter.sessionCheckpoints.append(\n {\n sessionId: resolvedSessionId,\n runId,\n ...(workflowFinalGraphCheckpointId\n ? { graphCheckpointId: workflowFinalGraphCheckpointId }\n : {}),\n workflow: String(workflowFinalState.currentWorkflow),\n state: workflowFinalState,\n nodes: Array.from(touchedNodes),\n structuredStreamIds: Array.from(structuredStreamIds),\n pendingRequests: Array.from(activePendingRequests.values()),\n },\n );\n sessionCheckpointId = checkpoint.id;\n write({\n type: \"checkpoint\",\n id: checkpoint.id,\n sessionId: checkpoint.sessionId,\n turnIndex: checkpoint.turnIndex,\n ...(checkpoint.label ? { label: checkpoint.label } : {}),\n } as StreamChunk);\n emitTelemetryEvent({\n config,\n type: \"session.checkpointed\",\n payload: {\n checkpointId: checkpoint.id,\n turnIndex: checkpoint.turnIndex,\n ...(checkpoint.parentCheckpointId\n ? { parentCheckpointId: checkpoint.parentCheckpointId }\n : {}),\n nodes: checkpoint.nodes,\n },\n });\n } catch (error) {\n // eslint-disable-next-line no-console\n outcomeError = error;\n console.error(\n \"[orchestrator] session checkpoint failed\",\n serializeFailure(error),\n );\n }\n }\n write({ type: \"done\", data: workflowFinalState } as any);\n out.end();\n return;\n }\n\n // Natural end with no explicit \"done\" (defensive close)\n const naturalGraphSnapshot = await readLatestGraphSnapshot();\n let naturalFinalState = naturalGraphSnapshot?.state ?? currentState;\n if (!pendingRecordToken && !naturalFinalState.awaitingHumanInput) {\n naturalFinalState = await validateExecutionOutput(\n naturalFinalState,\n selectWorkflow,\n );\n }\n outcomeState = naturalFinalState;\n if (pendingRequestWrites.length > 0) {\n await Promise.all(pendingRequestWrites);\n }\n if (pendingRecordToken && naturalGraphSnapshot?.checkpointId) {\n if (pendingStore) {\n await pendingStore.update(pendingRecordToken, {\n state: naturalFinalState,\n graphCheckpointId: naturalGraphSnapshot.checkpointId,\n });\n }\n const pendingRequest = activePendingRequests.get(pendingRecordToken);\n /* v8 ignore next -- pendingRecordToken is assigned only after the active request is inserted. */\n if (pendingRequest) {\n activePendingRequests.set(pendingRecordToken, {\n ...pendingRequest,\n state: naturalFinalState,\n graphCheckpointId: naturalGraphSnapshot.checkpointId,\n });\n }\n }\n const resolvedSessionId =\n ((config as any)?.session?.id as string | undefined) || sessionId || \"\";\n await sealPendingSnapshots();\n if (\n !response.closed &&\n resolvedSessionId &&\n frameworkAdapter?.sessionCheckpoints\n ) {\n try {\n const checkpoint = await frameworkAdapter.sessionCheckpoints.append({\n sessionId: resolvedSessionId,\n runId,\n ...(naturalGraphSnapshot?.checkpointId\n ? { graphCheckpointId: naturalGraphSnapshot.checkpointId }\n : {}),\n workflow: String(naturalFinalState.currentWorkflow),\n state: naturalFinalState,\n nodes: Array.from(touchedNodes),\n structuredStreamIds: Array.from(structuredStreamIds),\n pendingRequests: Array.from(activePendingRequests.values()),\n });\n sessionCheckpointId = checkpoint.id;\n write({\n type: \"checkpoint\",\n id: checkpoint.id,\n sessionId: checkpoint.sessionId,\n turnIndex: checkpoint.turnIndex,\n ...(checkpoint.label ? { label: checkpoint.label } : {}),\n } as StreamChunk);\n emitTelemetryEvent({\n config,\n type: \"session.checkpointed\",\n payload: {\n checkpointId: checkpoint.id,\n turnIndex: checkpoint.turnIndex,\n ...(checkpoint.parentCheckpointId\n ? { parentCheckpointId: checkpoint.parentCheckpointId }\n : {}),\n nodes: checkpoint.nodes,\n },\n });\n } catch (error) {\n // eslint-disable-next-line no-console\n outcomeError = error;\n console.error(\n \"[orchestrator] session checkpoint failed\",\n serializeFailure(error),\n );\n }\n }\n runTraceSpan.setAttributes?.({\n \"kortyx.run.final_workflow\": String(naturalFinalState.currentWorkflow),\n });\n finished = true;\n runTraceSpan.end?.(runTraceEndArgs());\n write({ type: \"done\", data: naturalFinalState } as any);\n out.end();\n return;\n }\n };\n\n const emitTraceChunk = () => {\n const traceContext = traceAdapter?.getActiveContext?.();\n if (!traceContext) return;\n\n write({\n type: \"trace\",\n traceId: traceContext.traceId,\n spanId: traceContext.spanId,\n runId,\n rootSpanName: \"kortyx.run\",\n } satisfies StreamChunk);\n };\n\n const fallbackRunSpan = traceAdapter?.withSpan\n ? undefined\n : traceAdapter?.startSpan?.(runSpanArgs);\n if (!traceAdapter?.withSpan) {\n emitTraceChunk();\n }\n const runPromise = traceAdapter?.withSpan\n ? traceAdapter.withSpan(runSpanArgs, (runTraceSpan) => {\n emitTraceChunk();\n return runLoop(runTraceSpan);\n })\n : runLoop(fallbackRunSpan ?? {});\n\n const finishCancelled = async () => {\n emitTelemetryEvent({\n config,\n type: \"run.cancelled\",\n correlation: { runId, workflowId: outcomeState.currentWorkflow },\n payload: { reason: \"execution_aborted\" },\n flush: true,\n });\n await Promise.allSettled(pendingRequestWrites);\n await Promise.allSettled(\n [...activePendingRequests.keys()].map((token) =>\n pendingStore?.delete(token),\n ),\n );\n activePendingRequests.clear();\n try {\n await frameworkAdapter?.cleanupRun?.(runId, [...namespacesUsed]);\n } catch (cleanupError) {\n console.error(\"[cancel:cleanupRun]\", serializeFailure(cleanupError));\n }\n outcomeError = createExecutionCancelledError();\n fallbackRunSpan?.setAttributes?.({ \"kortyx.run.cancelled\": true });\n fallbackRunSpan?.end?.();\n write({ type: \"cancelled\", runId, reason: \"Execution cancelled.\" });\n write({ type: \"done\" });\n finished = true;\n out.end();\n };\n\n const completion = runPromise\n .catch(async (err) => {\n if (abortSignal?.aborted || isExecutionCancelled(err)) {\n await finishCancelled();\n return;\n }\n if (isExecutionLimitReached(err)) {\n try {\n const snapshot =\n frameworkAdapter &&\n (await captureGraphSnapshot(frameworkAdapter.checkpointer, runId));\n throwIfExecutionAborted(abortSignal);\n if (!snapshot)\n throw new Error(\n \"Execution limit reached without a resumable checkpoint.\",\n );\n const savedState = snapshot.checkpoint\n .channel_values as unknown as GraphState;\n const pausedState: GraphState = {\n ...savedState,\n config: {\n ...savedState.config,\n ...config,\n executionBudget: budget,\n },\n awaitingHumanInput: true,\n };\n // Preserve hook checkpoints, including completed and pending tool rounds.\n const patch = (\n err as unknown as {\n __kortyxHookStatePatch?: Record<string, unknown>;\n }\n ).__kortyxHookStatePatch;\n currentState = pausedState;\n outcomeState = pausedState;\n const limitReached = err.limitReached;\n write({ type: \"limit-reached\", runId, ...limitReached });\n emitTelemetryEvent({\n config,\n type: \"run.limit_reached\",\n payload: limitReached,\n });\n await persistAndEmitInterrupt({\n node: String(\n (err as unknown as { nodeId?: string }).nodeId ??\n savedState.lastNode,\n ),\n workflow: String(savedState.currentWorkflow),\n input: {\n kind: \"choice\",\n question: \"Limit reached — Continue?\",\n options: [{ id: \"continue\", label: \"Continue\" }],\n meta: {\n __kortyxExecutionLimit: true,\n executionLimit: limitReached,\n ...(patch ? { __kortyxResumeStatePatch: patch } : {}),\n },\n },\n });\n await Promise.all(pendingRequestWrites);\n throwIfExecutionAborted(abortSignal);\n if (outcomeError) throw outcomeError;\n const request = activePendingRequests.get(pendingRecordToken!)!;\n const sealed = {\n ...request,\n state: pausedState,\n graphCheckpointId: snapshot.checkpoint.id,\n graphSnapshot: snapshot,\n ready: true,\n };\n activePendingRequests.set(request.token, sealed);\n await pendingStore?.update(request.token, sealed);\n if (response.closed) pausedState.config.responseCompleted = true;\n if (!response.closed) {\n const checkpoint =\n await frameworkAdapter!.sessionCheckpoints.append({\n sessionId: sessionId!,\n runId,\n graphCheckpointId: snapshot.checkpoint.id,\n workflow: String(pausedState.currentWorkflow),\n state: pausedState,\n nodes: Array.from(touchedNodes),\n structuredStreamIds: Array.from(structuredStreamIds),\n pendingRequests: [sealed],\n label: \"Execution limit reached\",\n });\n throwIfExecutionAborted(abortSignal);\n sessionCheckpointId = checkpoint.id;\n write({\n type: \"checkpoint\",\n id: checkpoint.id,\n sessionId: checkpoint.sessionId,\n turnIndex: checkpoint.turnIndex,\n label: checkpoint.label,\n });\n emitTelemetryEvent({\n config,\n type: \"session.checkpointed\",\n payload: {\n checkpointId: checkpoint.id,\n turnIndex: checkpoint.turnIndex,\n nodes: checkpoint.nodes,\n },\n });\n }\n fallbackRunSpan?.setAttributes?.({\n \"kortyx.run.awaiting_human_input\": true,\n \"kortyx.run.limit_reached\": limitReached.limit,\n });\n fallbackRunSpan?.end?.();\n finished = true;\n write({ type: \"done\" });\n out.end();\n return;\n } catch (pauseError) {\n if (abortSignal?.aborted || isExecutionCancelled(pauseError)) {\n await finishCancelled();\n return;\n }\n await Promise.allSettled(\n [...activePendingRequests.keys()].map((token) =>\n pendingStore?.delete(token),\n ),\n );\n activePendingRequests.clear();\n err = pauseError;\n }\n }\n outcomeError = err;\n fallbackRunSpan?.fail?.(err);\n emitResumeFailure(err);\n console.error(\"[error:orchestrateGraphStream]\", serializeFailure(err));\n write({\n type: \"error\",\n message: serializeFailure(err).message,\n failure: serializeFailure(err),\n });\n write({ type: \"done\" });\n finished = true;\n out.end();\n })\n .finally(() => {\n response.dispose();\n onOutcome?.({\n state: outcomeState,\n pending: pendingRecordToken\n ? activePendingRequests.get(pendingRecordToken)\n : undefined,\n checkpointId: sessionCheckpointId,\n ...(outcomeError ? { error: outcomeError } : {}),\n });\n });\n\n onExecution?.(completion);\n if (response.closed) out.end();\n return out;\n}\n","import type { GraphState, WorkflowDefinition } from \"@kortyx/core\";\nimport {\n errorProperty,\n ValidationError,\n WorkflowContractError,\n} from \"@kortyx/core/errors\";\nimport { z } from \"zod\";\nimport type { SelectWorkflowFn } from \"../orchestrator\";\nimport { ExecutionRequestError } from \"./types\";\n\nexport async function resolveExecutionWorkflow(\n select: SelectWorkflowFn,\n reference: WorkflowDefinition | string,\n): Promise<WorkflowDefinition> {\n const id = typeof reference === \"string\" ? reference : reference.id;\n let workflow: WorkflowDefinition;\n try {\n workflow = await select(id);\n } catch (error) {\n if (errorProperty(error, \"code\") !== \"UNKNOWN_WORKFLOW\") throw error;\n throw new ExecutionRequestError(\n \"UNKNOWN_WORKFLOW\",\n `Workflow '${id}' is not registered.`,\n );\n }\n if (workflow.id !== id)\n throw new ExecutionRequestError(\n \"UNKNOWN_WORKFLOW\",\n `Workflow '${id}' is not registered.`,\n );\n if (!workflow.inputSchema || !workflow.outputSchema)\n throw new ExecutionRequestError(\n \"MISSING_CONTRACT\",\n `Workflow '${id}' requires inputSchema and outputSchema.`,\n );\n if (\n typeof reference !== \"string\" &&\n (reference.version !== workflow.version ||\n reference.inputSchema !== workflow.inputSchema ||\n reference.outputSchema !== workflow.outputSchema)\n )\n throw new ExecutionRequestError(\n \"CONTRACT_MISMATCH\",\n \"The typed workflow contract does not match the registered definition.\",\n );\n return workflow;\n}\n\nexport function parseExecutionInput(\n workflow: WorkflowDefinition,\n input: unknown,\n): unknown {\n try {\n z.json().parse(input);\n const parsed = workflow.inputSchema\n ? workflow.inputSchema.parse(input)\n : input;\n z.json().parse(parsed);\n return parsed;\n } catch (error) {\n if (!(error instanceof z.ZodError)) throw error;\n throw new ExecutionRequestError(\"INVALID_INPUT\", error.message, error);\n }\n}\n\n/** Validate the terminal workflow and entry contract, applying each schema once. */\nexport async function validateExecutionOutput(\n state: GraphState,\n select: SelectWorkflowFn,\n): Promise<GraphState> {\n if (!state.config?.executionContract) return state;\n const terminal = await select(String(state.currentWorkflow));\n const contract = state.config.executionContract as {\n id: string;\n version: string;\n };\n const root = await select(contract.id);\n if (root.id !== contract.id || root.version !== contract.version)\n throw new WorkflowContractError(\n \"The root workflow changed since execution started.\",\n );\n let data = state.data ?? {};\n try {\n for (const schema of new Set([terminal.outputSchema, root.outputSchema])) {\n if (schema) data = schema.parse(data);\n }\n if (terminal.outputSchema || root.outputSchema) z.json().parse(data);\n } catch (error) {\n if (!(error instanceof z.ZodError)) throw error;\n const failure = new ValidationError(\n \"INVALID_OUTPUT\",\n `Workflow output validation failed: ${error.message}`,\n error,\n );\n throw failure;\n }\n return { ...state, data };\n}\n","import type { GraphState } from \"@kortyx/core\";\nimport { throwIfExecutionAborted } from \"@kortyx/core\";\nimport type { CompleteResponseOptions } from \"@kortyx/hooks\";\n\n/** Request cancellation is detachable; execution cancellation remains live. */\nexport function createResponseLifecycle(args: {\n enabled: boolean;\n restored: boolean;\n requestSignal?: AbortSignal | undefined;\n executionSignal?: AbortSignal | undefined;\n onClosed: () => void;\n finalize: (\n options: CompleteResponseOptions,\n state: GraphState,\n ) => Promise<void>;\n}): {\n readonly closed: boolean;\n signal: AbortSignal;\n disconnect(): void;\n dispose(): void;\n complete(options: CompleteResponseOptions, state: GraphState): Promise<void>;\n} {\n const controller = new AbortController();\n let closed = args.restored;\n let completing: Promise<void> | undefined;\n const abort = () => controller.abort();\n const detachRequest = () =>\n args.requestSignal?.removeEventListener(\"abort\", abort);\n if (!closed) {\n args.requestSignal?.addEventListener(\"abort\", abort, { once: true });\n if (args.requestSignal?.aborted) abort();\n }\n args.executionSignal?.addEventListener(\"abort\", abort, { once: true });\n if (args.executionSignal?.aborted) abort();\n return {\n get closed() {\n return closed;\n },\n signal: controller.signal,\n disconnect() {\n if (!closed) abort();\n },\n dispose() {\n detachRequest();\n args.executionSignal?.removeEventListener(\"abort\", abort);\n },\n complete(\n options: CompleteResponseOptions,\n state: GraphState,\n ): Promise<void> {\n if (!args.enabled || closed) return Promise.resolve();\n completing ??= (async () => {\n throwIfExecutionAborted(controller.signal);\n await args.finalize(options, state);\n throwIfExecutionAborted(controller.signal);\n closed = true;\n detachRequest();\n args.onClosed();\n })();\n return completing;\n },\n };\n}\n","import type { StreamChunk } from \"@kortyx/stream\";\nimport type { StreamEvent } from \"@langchain/core/tracers/log_stream\";\n\ninterface TransformOptions {\n debug?: boolean;\n emitStatus?: boolean;\n}\n\nconst isGraphStateOutput = (value: unknown): value is Record<string, unknown> =>\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n \"currentWorkflow\" in value;\n\n/**\n * Transforms runtime stream events into standardized UI chunks.\n * Runtime emits (`message`, `structured_data`, `interrupt`, `transition`) are\n * forwarded directly by the orchestrator, so this transformer only handles\n * graph lifecycle + completion signals.\n */\nexport async function* transformGraphStreamForUI(\n stream: AsyncIterable<StreamEvent>,\n options: TransformOptions = {},\n): AsyncGenerator<StreamChunk> {\n const { debug = false, emitStatus = debug } = options;\n const startedNodes = new Set<string>();\n const endedNodes = new Set<string>();\n let latestGraphState: Record<string, unknown> | null = null;\n\n for await (const event of stream) {\n const { event: type, name, data } = event ?? {};\n if (debug) console.log(`[debug:event]`, JSON.stringify(event, null, 2));\n\n switch (type) {\n case \"on_chain_start\":\n if (name && !name.startsWith(\"ChannelWrite\")) {\n if (name === \"__start__\" || name === \"__end__\") break;\n if (startedNodes.has(name)) break; // de-dupe\n startedNodes.add(name);\n if (debug) console.log(`[debug:start] node=${name}`);\n if (emitStatus) {\n yield { type: \"status\", message: `Processing node: ${name}` };\n }\n }\n break;\n\n case \"on_chain_end\": {\n const nodeName = name;\n const output = data?.output;\n if (debug)\n console.log(\n `[debug:on_chain_end:${nodeName}] output=`,\n JSON.stringify(output, null, 2),\n );\n if (!output || nodeName?.startsWith(\"ChannelWrite\")) break;\n if (isGraphStateOutput(output)) latestGraphState = output;\n\n // Emit a simple completion status for UI progress feedback (de-dupe + skip internal nodes)\n if (nodeName !== \"__start__\" && nodeName !== \"__end__\") {\n if (!endedNodes.has(nodeName)) {\n if (emitStatus) {\n yield {\n type: \"status\",\n message: `✅ Completed node: ${nodeName}`,\n };\n }\n endedNodes.add(nodeName);\n }\n }\n break;\n }\n\n case \"on_graph_end\": {\n if (debug)\n console.log(`[debug:on_graph_end]`, JSON.stringify(data, null, 2));\n const output = (data as any)?.output;\n yield {\n type: \"done\",\n data: isGraphStateOutput(output) ? output : latestGraphState,\n };\n break;\n }\n\n default:\n if (debug) {\n console.warn(`[debug:unknown_event]`, type);\n }\n break;\n }\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n KortyxTelemetryConfig,\n KortyxTelemetryEvent,\n KortyxTelemetryEventType,\n} from \"@kortyx/hooks\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst createId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nexport const shouldCaptureTelemetryContent = (\n value: unknown,\n side: \"input\" | \"output\",\n): boolean => {\n if (value === true) return true;\n return Boolean(\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n (value as Record<string, unknown>)[side] === true,\n );\n};\n\n/** Emits a lifecycle fact only when the application configured telemetry. */\nexport const emitTelemetryEvent = (args: {\n config: Record<string, unknown>;\n type: KortyxTelemetryEventType;\n payload: Record<string, unknown>;\n correlation?: Partial<KortyxTelemetryEvent[\"correlation\"]> | undefined;\n flush?: boolean | undefined;\n}): void => {\n const telemetry = isRecord(args.config.telemetry)\n ? (args.config.telemetry as KortyxTelemetryConfig)\n : undefined;\n const base = telemetry?.correlation;\n const runId = args.correlation?.runId ?? base?.runId;\n const workflowId = args.correlation?.workflowId ?? base?.workflowId;\n if (\n !telemetry?.reporter ||\n !telemetry.environment ||\n !telemetry.service ||\n !runId ||\n !workflowId\n ) {\n return;\n }\n const context = isRecord(args.config.context) ? args.config.context : {};\n const event: KortyxTelemetryEvent = {\n schemaVersion: 1,\n eventId: createId(),\n occurredAt: new Date().toISOString(),\n environment: telemetry.environment,\n service: telemetry.service,\n correlation: {\n runId,\n workflowId,\n ...(base?.sessionId ? { sessionId: base.sessionId } : {}),\n ...(base?.workflowRevisionId\n ? { workflowRevisionId: base.workflowRevisionId }\n : {}),\n ...(base?.topologyHash ? { topologyHash: base.topologyHash } : {}),\n ...(base?.nodeId ? { nodeId: base.nodeId } : {}),\n ...(args.correlation ?? {}),\n },\n ...(telemetry.metadata ||\n telemetry.tags ||\n context.userId ||\n context.tenantId\n ? {\n context: {\n ...(typeof context.userId === \"string\"\n ? { userId: context.userId }\n : {}),\n ...(typeof context.tenantId === \"string\"\n ? { tenantId: context.tenantId }\n : {}),\n ...(telemetry.tags ? { tags: telemetry.tags } : {}),\n ...(telemetry.metadata ? { metadata: telemetry.metadata } : {}),\n },\n }\n : {}),\n type: args.type,\n payload: {\n ...args.payload,\n ...(args.type === \"run.cancelled\"\n ? { branchId: args.config.executionBranchId ?? runId }\n : {}),\n },\n };\n try {\n void Promise.resolve(telemetry.reporter.emit([event]))\n .then(async () => {\n if (!args.flush) return;\n const flush = (telemetry as { flush?: unknown }).flush;\n if (typeof flush === \"function\") await flush.call(telemetry);\n })\n .catch(() => {\n // Reporters must not affect the workflow execution path.\n });\n } catch {\n // A custom reporter may violate its async contract. Treat it like a\n // delivery failure rather than allowing observability to break a run.\n }\n};\n","import { createHash } from \"node:crypto\";\nimport type { WorkflowDefinition } from \"@kortyx/core\";\nimport type {\n EnsureWorkflowTopologyRequest,\n KortyxTelemetryConfig,\n} from \"@kortyx/hooks\";\n\ntype WorkflowTopologyTransition = NonNullable<\n EnsureWorkflowTopologyRequest[\"workflow\"][\"transitions\"]\n>[number];\n\ntype WorkflowTopologyNodeInput = {\n run?: unknown;\n params?: unknown;\n metadata?: unknown;\n behavior?: unknown;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst stableValue = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(stableValue);\n if (!isRecord(value)) return value;\n return Object.fromEntries(\n Object.entries(value)\n .filter(([, nested]) => typeof nested !== \"function\")\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, nested]) => [key, stableValue(nested)]),\n );\n};\n\nconst asString = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.length > 0 ? value : undefined;\n\nconst metadata = (value: unknown): Record<string, unknown> | undefined =>\n isRecord(value) ? (stableValue(value) as Record<string, unknown>) : undefined;\n\nconst tagsFrom = (workflow: WorkflowDefinition): string[] | undefined => {\n const raw = isRecord(workflow.metadata) ? workflow.metadata.tags : undefined;\n if (!Array.isArray(raw)) return undefined;\n const tags = raw\n .filter((tag): tag is string => typeof tag === \"string\")\n .sort();\n return tags.length > 0 ? tags : undefined;\n};\n\nconst wordsFrom = (value: string): string[] =>\n value\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .split(/[^a-zA-Z0-9]+/)\n .map((word) => word.toLowerCase())\n .filter(Boolean);\n\nconst camelFromWorkflowId = (workflowId: string): string => {\n const [first = \"\", ...rest] = wordsFrom(workflowId);\n return [\n first,\n ...rest.map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`),\n ].join(\"\");\n};\n\nconst resolveMemberTransitionTarget = (\n memberName: string,\n knownWorkflowIds: readonly string[],\n): string | undefined => {\n const exact = knownWorkflowIds.find(\n (workflowId) => camelFromWorkflowId(workflowId) === memberName,\n );\n if (exact) return exact;\n\n const memberWords = new Set(wordsFrom(memberName));\n const candidates = knownWorkflowIds\n .map((workflowId) => {\n const workflowWords = wordsFrom(workflowId);\n const matched = workflowWords.filter((word) => memberWords.has(word));\n return {\n workflowId,\n matched: matched.length,\n total: workflowWords.length,\n };\n })\n .filter(\n (candidate) =>\n candidate.total > 0 && candidate.matched === candidate.total,\n )\n .sort(\n (a, b) =>\n b.matched - a.matched || a.workflowId.localeCompare(b.workflowId),\n );\n\n if (candidates.length !== 1) return undefined;\n return candidates[0]?.workflowId;\n};\n\nconst transitionTargetsFromRun = (\n run: unknown,\n knownWorkflowIds: readonly string[],\n): string[] => {\n if (typeof run !== \"function\") return [];\n\n const source = Function.prototype.toString.call(run);\n const targets = new Set<string>();\n\n for (const match of source.matchAll(\n /\\btransitionTo\\s*:\\s*(['\"`])([^'\"`$]+)\\1/g,\n )) {\n const target = match[2]?.trim();\n if (target) targets.add(target);\n }\n\n for (const match of source.matchAll(\n /\\btransitionTo\\s*:\\s*(?:[A-Za-z_$][\\w$]*\\.)+([A-Za-z_$][\\w$]*)/g,\n )) {\n const memberName = match[1] as string;\n const target = resolveMemberTransitionTarget(memberName, knownWorkflowIds);\n if (target) targets.add(target);\n }\n\n for (const match of source.matchAll(\n /\\btransitionTo\\s*:\\s*(?:[A-Za-z_$][\\w$]*\\.)*[A-Za-z_$][\\w$]*\\[['\"`]([A-Za-z_$][\\w$]*)['\"`]\\]/g,\n )) {\n const memberName = match[1] as string;\n const target = resolveMemberTransitionTarget(memberName, knownWorkflowIds);\n if (target) targets.add(target);\n }\n\n return [...targets].sort();\n};\n\nconst transitionsFromNodes = (\n workflow: WorkflowDefinition,\n knownWorkflowIds: readonly string[],\n): WorkflowTopologyTransition[] => {\n const transitions = new Map<string, WorkflowTopologyTransition>();\n\n for (const [sourceNodeId, node] of Object.entries(\n workflow.nodes as Record<string, WorkflowTopologyNodeInput>,\n )) {\n for (const targetWorkflowId of transitionTargetsFromRun(\n node.run,\n knownWorkflowIds,\n )) {\n if (targetWorkflowId === workflow.id) continue;\n const key = `${sourceNodeId}:${targetWorkflowId}`;\n transitions.set(key, { sourceNodeId, targetWorkflowId });\n }\n }\n\n return [...transitions.values()].sort((a, b) =>\n JSON.stringify(a).localeCompare(JSON.stringify(b)),\n );\n};\n\n/** Produces the topology-only, deterministic Contract A snapshot. */\nexport const projectWorkflowTopology = (args: {\n workflow: WorkflowDefinition;\n environment: string;\n service: NonNullable<KortyxTelemetryConfig[\"service\"]>;\n knownWorkflowIds?: readonly string[] | undefined;\n}): EnsureWorkflowTopologyRequest => {\n const nodes = Object.entries(\n args.workflow.nodes as Record<string, WorkflowTopologyNodeInput>,\n )\n .map(([id, node]) => {\n const nodeMetadata = metadata(node.metadata);\n const params = metadata(node.params);\n const model = isRecord(node.params)\n ? isRecord(node.params.model)\n ? node.params.model\n : undefined\n : undefined;\n const provider = isRecord(model)\n ? (asString(model.provider) ?? asString(model.providerId))\n : undefined;\n const modelName = isRecord(model)\n ? (asString(model.name) ?? asString(model.modelId))\n : undefined;\n return {\n id,\n ...(asString(nodeMetadata?.label)\n ? { label: asString(nodeMetadata?.label) }\n : {}),\n ...(asString(nodeMetadata?.type)\n ? { type: asString(nodeMetadata?.type) }\n : {}),\n ...(provider ? { provider } : {}),\n ...(modelName ? { model: modelName } : {}),\n ...(nodeMetadata ? { metadata: nodeMetadata } : {}),\n // These fields feed the hash but are intentionally not sent as Studio\n // display metadata. They are stripped below after hashing.\n _execution: {\n ...(typeof node.run === \"string\" ? { run: node.run } : {}),\n ...(params ? { params } : {}),\n ...(node.behavior ? { behavior: stableValue(node.behavior) } : {}),\n },\n };\n })\n .sort((a, b) => a.id.localeCompare(b.id));\n const edges = args.workflow.edges\n .map((edge) => {\n const condition = isRecord(edge[2]) ? asString(edge[2].when) : undefined;\n return {\n sourceNodeId: edge[0],\n targetNodeId: edge[1],\n ...(condition ? { condition } : {}),\n };\n })\n .sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b)));\n const transitions = transitionsFromNodes(\n args.workflow,\n args.knownWorkflowIds ?? [],\n );\n const tags = tagsFrom(args.workflow);\n const hashInput = stableValue({\n workflowId: args.workflow.id,\n nodes: nodes.map((node) => ({ id: node.id, ...node._execution })),\n edges,\n transitions,\n });\n const topologyHash = createHash(\"sha256\")\n .update(JSON.stringify(hashInput))\n .digest(\"hex\");\n\n return {\n schemaVersion: 1,\n environment: args.environment,\n service: args.service,\n workflow: {\n id: args.workflow.id,\n declaredVersion: args.workflow.version,\n ...(args.workflow.description\n ? { description: args.workflow.description }\n : {}),\n ...(tags ? { tags } : {}),\n topologyHash,\n nodes: nodes.map(({ _execution: _ignored, ...node }) => node),\n edges,\n ...(transitions.length > 0 ? { transitions } : {}),\n },\n };\n};\n\n/**\n * Starts topology registration without adding latency to workflow execution.\n * A hot adapter cache yields a revision ID; a cold run carries topologyHash so\n * the API can backfill correlation when the asynchronous ensure finishes.\n */\nexport const prepareWorkflowTelemetry = (args: {\n config: Record<string, unknown>;\n workflow: WorkflowDefinition;\n runId: string;\n sessionId?: string | undefined;\n knownWorkflowIds?: readonly string[] | undefined;\n}): Record<string, unknown> => {\n const telemetry = isRecord(args.config.telemetry)\n ? (args.config.telemetry as KortyxTelemetryConfig)\n : undefined;\n if (!telemetry?.reporter || !telemetry.environment || !telemetry.service) {\n return args.config;\n }\n\n let snapshot: EnsureWorkflowTopologyRequest;\n try {\n snapshot = projectWorkflowTopology({\n workflow: args.workflow,\n environment: telemetry.environment,\n service: telemetry.service,\n knownWorkflowIds: args.knownWorkflowIds,\n });\n } catch {\n // An application may put non-serializable values in node params. That is\n // invalid telemetry input, but it must never prevent workflow execution.\n return args.config;\n }\n let workflowRevisionId: string | undefined;\n try {\n workflowRevisionId = telemetry.reporter.getWorkflowRevisionId?.({\n environment: snapshot.environment,\n workflowId: snapshot.workflow.id,\n topologyHash: snapshot.workflow.topologyHash,\n });\n void Promise.resolve(\n telemetry.reporter.ensureWorkflowTopology(snapshot),\n ).catch(() => {\n // Telemetry is best effort. The run still contains a topology hash for\n // a later API-side backfill when the transport becomes available.\n });\n } catch {\n // Do not allow a custom reporter that throws synchronously to stop a run.\n }\n\n return {\n ...args.config,\n prepareChildTelemetry: (\n workflow: WorkflowDefinition,\n config: Record<string, unknown>,\n ) =>\n prepareWorkflowTelemetry({\n config,\n workflow,\n runId: args.runId,\n sessionId: args.sessionId,\n knownWorkflowIds: args.knownWorkflowIds,\n }),\n telemetry: {\n ...telemetry,\n correlation: {\n ...(telemetry.correlation ?? {}),\n runId: args.runId,\n ...(args.sessionId ? { sessionId: args.sessionId } : {}),\n workflowId: snapshot.workflow.id,\n topologyHash: snapshot.workflow.topologyHash,\n ...(workflowRevisionId ? { workflowRevisionId } : {}),\n },\n } satisfies KortyxTelemetryConfig,\n };\n};\n","import type {\n PendingRequestRecord,\n PendingRequestStore,\n} from \"@kortyx/runtime\";\nimport { z } from \"zod\";\nimport type { ResumeHandle } from \"../execution/types\";\n\nconst scopeSchema = z\n .object({\n sessionId: z.string().min(1).optional(),\n runId: z.string().min(1).optional(),\n context: z\n .record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.null()]),\n )\n .optional(),\n })\n .strict()\n .refine(\n (scope) =>\n Boolean(\n scope.sessionId ||\n scope.runId ||\n Object.keys(scope.context ?? {}).length,\n ),\n \"Interrupt discovery requires an authorized session, run, or context scope.\",\n );\n\nexport type InterruptScope = z.input<typeof scopeSchema>;\nexport type ListInterruptsOptions = InterruptScope & {\n status?: \"pending\";\n afterResponseCompleted?: boolean;\n};\nexport type PendingInterrupt = {\n id: string;\n status: \"pending\";\n runId: string;\n sessionId: string;\n workflow: string;\n node: string;\n createdAt: string;\n expiresAt: string;\n afterResponseCompleted: boolean;\n input: Omit<PendingRequestRecord[\"schema\"], \"meta\"> & {\n options: Array<{ id: string; label: string; description?: string }>;\n };\n};\nexport type ResumableInterrupt = PendingInterrupt & { resume: ResumeHandle };\n\nconst matches = (record: PendingRequestRecord, scope: InterruptScope) =>\n record.ready !== false &&\n Date.now() < record.createdAt + record.ttlMs &&\n (!scope.sessionId || record.sessionId === scope.sessionId) &&\n (!scope.runId || record.runId === scope.runId) &&\n Object.entries(scope.context ?? {}).every(\n ([key, value]) => record.state?.config.context?.[key] === value,\n );\n\nconst summary = (record: PendingRequestRecord): PendingInterrupt => {\n const { meta: _meta, ...input } = record.schema;\n const contract = record.state?.config.executionContract as\n | { id?: string }\n | undefined;\n return {\n id: record.requestId,\n status: \"pending\",\n runId: record.runId,\n sessionId: record.sessionId ?? \"\",\n workflow: contract?.id ?? record.workflow,\n node: record.node,\n createdAt: new Date(record.createdAt).toISOString(),\n expiresAt: new Date(record.createdAt + record.ttlMs).toISOString(),\n afterResponseCompleted: record.responseCompleted === true,\n input: {\n ...input,\n options: record.options.map(({ id, label, description }) => ({\n id,\n label,\n ...(description !== undefined ? { description } : {}),\n })),\n },\n };\n};\n\nexport function createInterruptDiscovery(store: PendingRequestStore) {\n const records = () => {\n if (!store.list)\n throw new Error(\n \"This persistence adapter does not support interrupt discovery; implement pendingRequests.list.\",\n );\n return store.list();\n };\n return {\n async listInterrupts(\n options: ListInterruptsOptions,\n ): Promise<PendingInterrupt[]> {\n const {\n status: _status,\n afterResponseCompleted,\n ...scope\n } = z\n .object({\n sessionId: z.string().optional(),\n runId: z.string().optional(),\n context: z\n .record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.null()]),\n )\n .optional(),\n status: z.literal(\"pending\").optional(),\n afterResponseCompleted: z.boolean().optional(),\n })\n .strict()\n .parse(options);\n scopeSchema.parse(scope);\n return (await records())\n .filter(\n (record) =>\n matches(record, scope) &&\n (afterResponseCompleted === undefined ||\n (record.responseCompleted === true) === afterResponseCompleted),\n )\n .sort(\n (a, b) =>\n a.createdAt - b.createdAt || a.requestId.localeCompare(b.requestId),\n )\n .map(summary);\n },\n async getInterrupt(\n id: string,\n scope: InterruptScope,\n ): Promise<ResumableInterrupt | null> {\n z.string().min(1).parse(id);\n scopeSchema.parse(scope);\n const record = (await records()).find(\n (record) => record.requestId === id && matches(record, scope),\n );\n if (!record) return null;\n return {\n ...summary(record),\n resume: {\n token: record.token,\n requestId: record.requestId,\n sessionId: record.sessionId ?? \"\",\n runId: record.runId,\n },\n };\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { emitWorkflowCall, type KortyxTelemetryConfig } from \"@kortyx/hooks\";\nimport type { PendingRequestRecord } from \"@kortyx/runtime\";\n\n/** Rebase every snapshot copy; emit each inherited logical invocation only once. */\nexport function restoreWorkflowCallBranch(\n requests: PendingRequestRecord[],\n telemetry: KortyxTelemetryConfig | undefined,\n sourceRunId: string,\n) {\n const branchId = randomUUID();\n const emitted = new Set<string>();\n for (const request of requests) {\n if (request.state)\n request.state.config = {\n ...request.state.config,\n executionBranchId: branchId,\n };\n const seen = new Set<object>();\n const visit = (value: unknown) => {\n if (!value || typeof value !== \"object\" || seen.has(value)) return;\n seen.add(value);\n const record = value as Record<string, unknown>;\n if (\n typeof record.invocationId === \"string\" &&\n typeof record.fingerprint === \"string\" &&\n Array.isArray(record.interrupts)\n ) {\n const previous = record.telemetry as\n | Record<string, unknown>\n | undefined;\n if (previous) {\n record.sequence = 0;\n record.telemetry = { ...previous, branchId };\n if (!emitted.has(record.invocationId)) {\n emitted.add(record.invocationId);\n emitWorkflowCall(\n telemetry\n ? {\n ...telemetry,\n correlation: {\n runId: request.runId,\n workflowId: request.workflow,\n ...(request.sessionId\n ? { sessionId: request.sessionId }\n : {}),\n },\n }\n : undefined,\n \"workflow.call.restored\",\n {\n ...previous,\n branchId,\n sourceBranchId: previous.branchId,\n sourceRunId,\n sequence: 0,\n status: record.status,\n },\n );\n }\n }\n }\n for (const child of Object.values(record)) visit(child);\n };\n visit(request);\n }\n return branchId;\n}\n","import type { RuntimeEnvelope } from \"@kortyx/core\";\nimport type { GetProviderFn } from \"@kortyx/providers\";\nimport type { FrameworkAdapter, WorkflowRegistry } from \"@kortyx/runtime\";\nimport {\n buildInitialGraphState,\n createExecutionGraph,\n makeRequestId,\n} from \"@kortyx/runtime\";\nimport type { StreamChunk } from \"@kortyx/stream\";\nimport { parseExecutionInput } from \"../execution/contracts\";\nimport type { ApplyResumeSelection } from \"../interrupt/resume-handler\";\nimport {\n parseResumeMeta,\n tryPrepareResumeStream,\n} from \"../interrupt/resume-handler\";\nimport type { SelectWorkflowFn } from \"../orchestrator\";\nimport { orchestrateGraphStream } from \"../orchestrator\";\nimport { prepareWorkflowTelemetry } from \"../telemetry/topology\";\nimport type { ChatMessage } from \"../types/chat-message\";\nimport { extractLatestUserMessage } from \"../utils/extract-latest-message\";\n\nexport interface RuntimeConfig {\n session?: { id?: string };\n [key: string]: unknown;\n}\n\nexport interface StreamChatArgs<Options> {\n abortSignal?: AbortSignal | undefined;\n executionSignal?: AbortSignal | undefined;\n onExecution?: ((completion: Promise<void>) => void) | undefined;\n messages: ChatMessage[];\n options?: Options | undefined;\n sessionId?: string;\n defaultWorkflowId?: string;\n loadRuntimeConfig: (\n options?: Options,\n ) => RuntimeConfig | Promise<RuntimeConfig>;\n selectWorkflow?: SelectWorkflowFn;\n workflowRegistry?: WorkflowRegistry;\n knownWorkflowIds?: readonly string[] | undefined;\n frameworkAdapter?: FrameworkAdapter;\n getProvider: GetProviderFn;\n applyResumeSelection?: ApplyResumeSelection;\n}\n\nexport async function streamChat<Options = unknown>({\n messages,\n abortSignal,\n executionSignal,\n onExecution,\n options,\n sessionId,\n defaultWorkflowId,\n loadRuntimeConfig,\n selectWorkflow,\n workflowRegistry,\n knownWorkflowIds,\n frameworkAdapter,\n getProvider,\n applyResumeSelection,\n}: StreamChatArgs<Options>): Promise<AsyncIterable<StreamChunk>> {\n const config = await loadRuntimeConfig(options);\n let runtimeConfig: Parameters<typeof createExecutionGraph>[1] = {\n ...config,\n getProvider,\n ...(frameworkAdapter\n ? { checkpointer: frameworkAdapter.checkpointer }\n : {}),\n };\n\n const workflowSelector: SelectWorkflowFn | null =\n selectWorkflow ??\n (workflowRegistry ? (id) => workflowRegistry.select(id) : null);\n if (!workflowSelector) {\n throw new Error(\n \"streamChat requires selectWorkflow or workflowRegistry to resolve workflows.\",\n );\n }\n\n runtimeConfig.selectWorkflow = workflowSelector;\n\n const fallbackSessionId = (options as { sessionId?: string } | undefined)\n ?.sessionId;\n const resolvedSessionId =\n sessionId || fallbackSessionId || \"anonymous-session\";\n const last = messages[messages.length - 1];\n const input = extractLatestUserMessage(messages);\n\n const previousMessages = messages.slice(0, -1);\n const runtime: RuntimeEnvelope = {\n ...(previousMessages.length > 0 ? { priorMessages: previousMessages } : {}),\n } as RuntimeEnvelope;\n\n const isResumeRequest = Boolean(parseResumeMeta(last));\n const requestedWorkflowId = (() => {\n if (!options) return undefined;\n if (typeof options !== \"object\") return undefined;\n const record = options as Record<string, unknown>;\n const wfId = record.workflowId;\n if (typeof wfId === \"string\") return wfId;\n return undefined;\n })();\n if (!isResumeRequest && requestedWorkflowId) {\n if (requestedWorkflowId.trim() === \"\") delete runtime.requestedWorkflow;\n else runtime.requestedWorkflow = requestedWorkflowId;\n }\n\n const resumeStream = await tryPrepareResumeStream({\n abortSignal,\n executionSignal,\n onExecution,\n lastMessage: last,\n sessionId: resolvedSessionId,\n config: runtimeConfig,\n selectWorkflow: workflowSelector,\n knownWorkflowIds,\n ...(frameworkAdapter ? { frameworkAdapter } : {}),\n ...(defaultWorkflowId ? { defaultWorkflowId } : {}),\n ...(applyResumeSelection ? { applyResumeSelection } : {}),\n });\n if (resumeStream) return resumeStream as AsyncIterable<StreamChunk>;\n\n const baseState = await buildInitialGraphState({\n input,\n config: runtimeConfig,\n runtime,\n ...(defaultWorkflowId ? { defaultWorkflowId } : {}),\n });\n\n const runId = makeRequestId(\"run\");\n let headCheckpoint =\n !isResumeRequest && frameworkAdapter?.sessionCheckpoints\n ? await frameworkAdapter.sessionCheckpoints.getHead(resolvedSessionId)\n : null;\n if (\n !isResumeRequest &&\n !headCheckpoint &&\n frameworkAdapter?.sessionCheckpoints\n ) {\n headCheckpoint = await frameworkAdapter.sessionCheckpoints.append({\n sessionId: resolvedSessionId,\n runId,\n workflow: String(baseState.currentWorkflow),\n state: {\n ...baseState,\n input: \"\",\n awaitingHumanInput: false,\n },\n nodes: [],\n structuredStreamIds: [],\n pendingRequests: [],\n label: \"session start\",\n });\n }\n const currentWorkflow = requestedWorkflowId\n ? baseState.currentWorkflow\n : (headCheckpoint?.state.currentWorkflow ?? baseState.currentWorkflow);\n const selectedWorkflow = await workflowSelector(currentWorkflow as string);\n runtimeConfig = prepareWorkflowTelemetry({\n config: runtimeConfig,\n workflow: selectedWorkflow,\n runId,\n sessionId: resolvedSessionId,\n knownWorkflowIds,\n }) as Parameters<typeof createExecutionGraph>[1];\n\n runtimeConfig = {\n ...runtimeConfig,\n executionContract: {\n id: selectedWorkflow.id,\n version: selectedWorkflow.version,\n },\n };\n const parsedInput = selectedWorkflow.inputSchema\n ? parseExecutionInput(selectedWorkflow, input)\n : input;\n const graph = await createExecutionGraph(selectedWorkflow, runtimeConfig);\n const initialState = headCheckpoint\n ? {\n ...headCheckpoint.state,\n input: parsedInput,\n config: runtimeConfig,\n currentWorkflow,\n awaitingHumanInput: false,\n runtime: {\n ...(headCheckpoint.state.runtime ?? {}),\n ...(runtime.requestedWorkflow\n ? { requestedWorkflow: runtime.requestedWorkflow }\n : {}),\n ...(runtime.priorMessages\n ? { priorMessages: runtime.priorMessages }\n : {}),\n },\n }\n : {\n ...baseState,\n input: parsedInput,\n config: runtimeConfig,\n currentWorkflow,\n };\n\n const orchestratedStream = await orchestrateGraphStream({\n abortSignal,\n executionSignal,\n onExecution,\n sessionId: resolvedSessionId,\n runId,\n graph,\n state: initialState,\n config: runtimeConfig,\n selectWorkflow: workflowSelector,\n knownWorkflowIds,\n ...(frameworkAdapter ? { frameworkAdapter } : {}),\n });\n\n return orchestratedStream as AsyncIterable<StreamChunk>;\n}\n","import type { ChatMessage } from \"../types/chat-message\";\n\nexport function extractLatestUserMessage(messages: ChatMessage[]): string {\n if (!messages || messages.length === 0) return \"\";\n // Find last message with role = \"user\"\n for (let i = messages.length - 1; i >= 0; i -= 1) {\n const msg = messages[i];\n if (msg?.role === \"user\" && msg?.content?.trim()) {\n return msg.content.trim();\n }\n }\n return \"\";\n}\n"],"mappings":"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","names":["index_exports","__export","emitWorkflowCall","useReason","module","__toCommonJS","import_zod","isRecord","result","import_core","import_errors","import_node_crypto","import_errors2","import_node_crypto2","import_core2","response","createRuntimeId","import_node_crypto3","import_core3","import_zod2","matches","import_errors3","tryStringify","import_zod3","import_errors4","import_core4","completed","import_core5","import_errors5","resolve","import_core6","import_node_crypto4","import_errors6","metadata","import_core","import_runtime","import_zod","import_core","import_errors","import_runtime","import_zod","import_core","import_runtime","import_errors","import_core","import_errors","import_errors","import_zod","import_node_crypto","isRecord","isRecord","checkpointId","resolvedSessionId","isRecord","resolve","import_zod","record","import_node_crypto","import_runtime","runtimeConfig","getRegisteredProvider","streamChat"]}
|