@kortyx/agent 0.16.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../hooks/src/index.ts","../../hooks/src/context.ts","../../hooks/src/reason/checkpoint.ts","../../hooks/src/validation.ts","../../hooks/src/interrupt.ts","../../hooks/src/structured.ts","../../hooks/src/structured-path.ts","../../hooks/src/reason/engine.ts","../../hooks/src/reason-engine.ts","../../hooks/src/reason/parsing.ts","../../hooks/src/reason/prompting.ts","../../hooks/src/reason/result.ts","../../hooks/src/reason/structured-stream.ts","../../hooks/src/reason/tools.ts","../../hooks/src/reason/use-reason.ts","../../hooks/src/hooks.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/telemetry/events.ts","../src/telemetry/topology.ts","../src/telemetry/workflow-call-branch.ts","../src/chat/process-chat.ts","../src/interrupt/resume-handler.ts","../src/orchestrator.ts","../src/stream/transform-graph-stream-for-ui.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 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 useInterrupt,\n useNodeState,\n useReason,\n useRuntimeContext,\n useStructuredData,\n useWorkflowState,\n} from \"./hooks\";\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 { 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 { KortyxTelemetryConfig, ReasonTraceAdapter } from \"./tracing\";\n\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 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 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 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 = usage.total ?? input + output + (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, fn);\n cleanupCompletedReasonCheckpoints(internal);\n for (const key of Object.keys(internal.currentNodeState.byKey)) {\n if (\n key.startsWith(\"__useWorkflow:\") ||\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","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 { 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\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 { 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 type {\n KortyxPromptMessage,\n KortyxReasoningOptions,\n KortyxResponseFormat,\n KortyxToolDefinition,\n ProviderModelRef,\n} from \"@kortyx/providers\";\nimport { 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\n return 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: args.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}\n","import { randomUUID } from \"node:crypto\";\nimport type {\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 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 async function runReasonEngine(\n args: RunReasonEngineArgs,\n): Promise<RunReasonEngineResult> {\n const 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 =\n args.providerOptions ?? args.model.options?.providerOptions;\n const tools = args.tools ?? args.model.options?.tools;\n\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 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: args.telemetry?.input ?? messages,\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 span?.fail?.(error, {\n attributes: {\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n },\n });\n };\n\n try {\n if (stream) {\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 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 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 ...(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 endTrace(traceSpan, result);\n return result;\n }\n\n const response = await model.invoke(messages);\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.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 failTrace(traceSpan, error);\n throw error;\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\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 { 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 type { InterruptInput, InterruptResult } 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 { getHookContext } from \"../context\";\nimport { awaitInterruptInternal } from \"../interrupt\";\nimport type { ReasonTraceSpan } from \"../tracing\";\nimport type { UseReasonArgs, UseReasonResult, UseReasonStep } from \"../types\";\nimport { reasonEngine } from \"./engine\";\nimport { parseReasonOutputWithSchema } from \"./parsing\";\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}): Promise<UseReasonResult<TOutput, TResponse>> => {\n const { useReasonArgs, id, opId, traceSpan } = args;\n const ctx = getHookContext();\n const tools = useReasonArgs.tools ?? [];\n const toolByName = new Map<string, KortyxExecutableTool>();\n let validationCompleted = 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 validationCompleted = true;\n } finally {\n if (!validationCompleted) {\n await closeOwnedTools(tools);\n }\n }\n\n const toolDefinitions = toToolDefinitions(tools);\n const maxSteps = Math.max(1, useReasonArgs.toolExecution?.maxSteps ?? 3);\n const messages = createInitialMessages({\n system: useReasonArgs.system,\n input: useReasonArgs.input,\n });\n const steps: UseReasonStep[] = [];\n const allToolCalls: KortyxToolCall[] = [];\n const allToolResults: KortyxToolResult[] = [];\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;\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 (let stepIndex = 0; stepIndex < maxSteps; stepIndex += 1) {\n traceSpan?.addEvent?.(\"useReason.tool-step.start\", {\n stepIndex,\n toolCount: toolDefinitions.length,\n });\n\n const step = await reasonEngine(\n {\n ...useReasonArgs,\n tools: toolDefinitions,\n messages,\n emit: false,\n stream: false,\n },\n { ...(id ? { id } : {}), opId },\n );\n\n finalText = step.text;\n finalRaw = step.raw;\n aggregatedUsage = mergeUsage(aggregatedUsage, step.usage);\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[] = [];\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 ((useReasonArgs.emit ?? true) && step.text.length > 0) {\n emitToolEvent(\"text-start\", {});\n emitToolEvent(\"text-delta\", { delta: step.text });\n emitToolEvent(\"text-end\", {});\n }\n break;\n }\n\n allToolCalls.push(...toolCalls);\n messages.push({\n role: \"assistant\",\n content: step.text,\n toolCalls,\n });\n\n for (const toolCall of toolCalls) {\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) {\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 continue;\n }\n }\n\n try {\n const rawResult = await tool.execute(toolCall.input, {\n toolCallId: toolCall.id,\n ...(useReasonArgs.abortSignal\n ? { abortSignal: useReasonArgs.abortSignal }\n : {}),\n });\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 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 }\n\n const currentStep = steps[steps.length - 1];\n if (currentStep) {\n steps[steps.length - 1] = {\n ...currentStep,\n toolResults,\n };\n }\n\n for (const result of toolResults) {\n messages.push({\n role: \"tool\",\n content: result.content,\n toolCallId: result.toolCallId,\n name: result.name,\n ...(result.structuredContent !== undefined\n ? { structuredContent: result.structuredContent }\n : {}),\n ...(result.isError !== undefined ? { isError: result.isError } : {}),\n ...(result.raw !== undefined ? { raw: result.raw } : {}),\n });\n }\n }\n\n if (steps.length >= maxSteps && steps.at(-1)?.toolCalls.length) {\n throw new Error(\n `useReason tool loop reached maxSteps (${maxSteps}) before producing a final response.`,\n );\n }\n\n if (useReasonArgs.outputSchema) {\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 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","import type { InterruptInput, InterruptResult } 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 {\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 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 ...(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;\n const emittedSetValues = new Map<string, string>();\n const emittedAppendCounts = new Map<string, number>();\n const emittedTextValues = new Map<string, string>();\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: (delta: string) => {\n firstText += delta;\n finalText = firstText;\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 =\n 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 : {}),\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 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 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\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 { randomUUID } from \"node:crypto\";\nimport type {\n InterruptInput,\n TokenUsage,\n WorkflowDefinition,\n} from \"@kortyx/core\";\nimport type { z } from \"zod\";\nimport { accumulateTokenUsage, getHookContext } from \"./context\";\nimport { awaitInterruptInternal } from \"./interrupt\";\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 | { status: \"interrupted\"; request: InterruptInput; snapshot: unknown };\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\ntype CallRecord = {\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 ctx = getHookContext();\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)\n throw new Error(\n \"Concurrent workflow calls are not supported; 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.fingerprint !== fingerprint)\n throw new WorkflowCallError(\n workflow,\n \"call input or target changed during replay\",\n );\n record ??= {\n fingerprint,\n invocationId: randomUUID(),\n status: \"running\",\n interrupts: [],\n };\n ctx.currentNodeState.byKey[key] = record;\n ctx.stateDirty = true;\n 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 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 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 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 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 if (outcome.status === \"completed\") {\n // Validate cached and live outputs against the caller's actual contract.\n record.data = outcome.data;\n accumulateTokenUsage(outcome.usage);\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 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 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 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 agent: Agent;\n body: ChatRequestBody;\n}): Promise<Response> {\n const { agent, body } = args;\n const stream = await agent.streamChat(body.messages, {\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 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({ 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\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 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 { 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 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 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 {\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 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 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 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 options: parsedOptions,\n workflowRegistry: registry,\n ...(knownWorkflowIds ? { knownWorkflowIds } : {}),\n frameworkAdapter: resolvedFrameworkAdapter,\n getProvider: resolvedGetProvider,\n loadRuntimeConfig: (runtimeOptions?: AgentProcessOptions) => ({\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 return {\n projectTopology,\n streamChat,\n listCheckpoints,\n getCheckpoint,\n rollbackTo,\n fork,\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 { 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 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 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 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 baseState = await buildInitialGraphState({\n input,\n config: runtimeConfig,\n runtime,\n ...(defaultWorkflowId ? { defaultWorkflowId } : {}),\n });\n\n const resumeStream = await tryPrepareResumeStream({\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 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 const graph = await createExecutionGraph(selectedWorkflow, runtimeConfig);\n const initialState = headCheckpoint\n ? {\n ...headCheckpoint.state,\n input,\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 : { ...baseState, config: runtimeConfig, currentWorkflow };\n\n const orchestratedStream = await orchestrateGraphStream({\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 { GraphState } 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 lastMessage: ChatMessage | 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 lastMessage,\n sessionId,\n config,\n selectWorkflow,\n knownWorkflowIds,\n defaultWorkflowId,\n applyResumeSelection,\n frameworkAdapter,\n}: TryResumeArgs): Promise<AsyncIterable<StreamChunk> | null> {\n const meta = 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 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 return (async function* (): AsyncGenerator<StreamChunk> {\n yield { type: \"done\" };\n })();\n }\n\n // Build a minimal state; the checkpointer (keyed by sessionId) will restore paused context\n // eslint-disable-next-line no-console\n console.log(\n `[resume] token=${meta.token} requestId=${meta.requestId} selected=${JSON.stringify(\n meta.selected,\n )} sessionId=${sessionId}`,\n );\n\n const resumeData = 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) ? pending.schema.meta : {};\n const resumeStatePatch = isRecord(pendingMeta.__kortyxResumeStatePatch)\n ? pendingMeta.__kortyxResumeStatePatch\n : undefined;\n\n const pendingData = isRecord(pending.state?.data) ? pending.state?.data : {};\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: \"\",\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.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 (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 = Object.keys(resumeUpdate).length > 0;\n const resumeValue =\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 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}\n","import { PassThrough } from \"node:stream\";\nimport type { GraphState, WorkflowDefinition, WorkflowId } 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 { 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 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 interface OrchestrateArgs {\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 selectWorkflow,\n knownWorkflowIds,\n frameworkAdapter,\n}: OrchestrateArgs): Promise<NodeJS.ReadableStream> {\n const out = new PassThrough({ objectMode: true });\n\n let config = initialConfig;\n let currentGraph = graph;\n let currentState: GraphState = state;\n let finished = false;\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 ...(typeof state.input === \"string\" ? { input: 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 out.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 };\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 (typeof frameworkAdapter?.checkpointer?.getTuple !== \"function\") return;\n for (const [token, request] of activePendingRequests) {\n const graphSnapshot = await captureGraphSnapshot(\n frameworkAdapter.checkpointer,\n runId,\n request.graphCheckpointId,\n );\n if (graphSnapshot) {\n const sealed = { ...request, graphSnapshot };\n activePendingRequests.set(token, sealed);\n await pendingStore?.update(token, { graphSnapshot });\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 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 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 out.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 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 out.write({ type: \"error\", message: msg });\n out.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 out.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 out.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 out.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 out.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 out.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 out.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 out.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 out.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 out.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 out.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 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.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 out.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 out.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 const uiStream = transformGraphStreamForUI(runtimeStream as any, {\n debug: debugEnabled,\n emitStatus: debugEnabled,\n });\n\n for await (const chunk of uiStream 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 out.write(chunk);\n }\n\n if (finished) return;\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 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 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 newInput =\n typeof rawInputFromPayload === \"string\"\n ? rawInputFromPayload\n : currentState.input;\n\n currentState = {\n ...currentState,\n currentWorkflow: transitionTo as WorkflowId,\n config,\n input: newInput,\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 runTraceSpan.addEvent?.(\"kortyx.transition.error\", {\n transitionTo,\n });\n out.write({\n type: \"error\",\n message: `Transition failed to '${transitionTo}': ${\n err instanceof Error ? err.message : String(err)\n }`,\n });\n out.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 // 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 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 (resolvedSessionId && frameworkAdapter?.sessionCheckpoints) {\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 out.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 console.error(\"[orchestrator] session checkpoint failed\", error);\n }\n }\n out.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 const naturalFinalState = naturalGraphSnapshot?.state ?? currentState;\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 (resolvedSessionId && frameworkAdapter?.sessionCheckpoints) {\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 out.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 console.error(\"[orchestrator] session checkpoint failed\", error);\n }\n }\n runTraceSpan.setAttributes?.({\n \"kortyx.run.final_workflow\": String(naturalFinalState.currentWorkflow),\n });\n runTraceSpan.end?.(runTraceEndArgs());\n out.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 out.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 runPromise.catch((err) => {\n fallbackRunSpan?.fail?.(err);\n emitResumeFailure(err);\n console.error(\"[error:orchestrateGraphStream]\", err);\n out.write({\n type: \"error\",\n message: err instanceof Error ? err.message : String(err),\n });\n out.write({ type: \"done\" });\n out.end();\n });\n\n return out;\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 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","isRecord","import_node_crypto","import_node_crypto2","response","result","createRuntimeId","import_node_crypto3","import_zod","tryStringify","toErrorMessage","import_node_crypto4","metadata","import_runtime","import_zod","import_node_crypto","isRecord","import_node_crypto","import_runtime","import_runtime","isRecord","checkpointId","resolvedSessionId","isRecord","getRegisteredProvider","streamChat"]}
1
+ {"version":3,"sources":["../../hooks/src/index.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/parsing.ts","../../hooks/src/reason/prompting.ts","../../hooks/src/reason/result.ts","../../hooks/src/reason/structured-stream.ts","../../hooks/src/reason/tools.ts","../../hooks/src/hooks.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/transform-graph-stream-for-ui.ts","../src/telemetry/events.ts","../src/telemetry/topology.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 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 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 { 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 { KortyxTelemetryConfig, ReasonTraceAdapter } from \"./tracing\";\n\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 /** 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 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 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 = usage.total ?? input + output + (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, fn);\n cleanupCompletedReasonCheckpoints(internal);\n for (const key of Object.keys(internal.currentNodeState.byKey)) {\n if (\n key.startsWith(\"__useWorkflow:\") ||\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","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 {\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 args = { ...args, abortSignal };\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 ...(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;\n const emittedSetValues = new Map<string, string>();\n const emittedAppendCounts = new Map<string, number>();\n const emittedTextValues = new Map<string, string>();\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: (delta: string) => {\n firstText += delta;\n finalText = firstText;\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 =\n 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 : {}),\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 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 { 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 return 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}\n","import { randomUUID } from \"node:crypto\";\nimport {\n createExecutionCancelledError,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport type {\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 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 async function runReasonEngine(\n args: RunReasonEngineArgs,\n): Promise<RunReasonEngineResult> {\n const 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 =\n args.providerOptions ?? args.model.options?.providerOptions;\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 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: args.telemetry?.input ?? messages,\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 span?.fail?.(error, {\n attributes: {\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n },\n });\n };\n\n try {\n if (stream) {\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 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 ...(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\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.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 { 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\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 { 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 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 type { ReasonTraceSpan } from \"../tracing\";\nimport type { UseReasonArgs, UseReasonResult, UseReasonStep } from \"../types\";\nimport { reasonEngine } from \"./engine\";\nimport { parseReasonOutputWithSchema } from \"./parsing\";\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}): Promise<UseReasonResult<TOutput, TResponse>> => {\n const { useReasonArgs, id, opId, traceSpan } = args;\n const ctx = getHookContext();\n const abortSignal = combineAbortSignals(\n ctx.node.abortSignal,\n useReasonArgs.abortSignal,\n useReasonArgs.model.options?.abortSignal,\n );\n const tools = useReasonArgs.tools ?? [];\n const toolByName = new Map<string, KortyxExecutableTool>();\n let validationCompleted = 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 validationCompleted = true;\n } finally {\n if (!validationCompleted) {\n await closeOwnedTools(tools);\n }\n }\n\n const toolDefinitions = toToolDefinitions(tools);\n const maxSteps = Math.max(1, useReasonArgs.toolExecution?.maxSteps ?? 3);\n const messages = createInitialMessages({\n system: useReasonArgs.system,\n input: useReasonArgs.input,\n });\n const steps: UseReasonStep[] = [];\n const allToolCalls: KortyxToolCall[] = [];\n const allToolResults: KortyxToolResult[] = [];\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;\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 (let stepIndex = 0; stepIndex < maxSteps; stepIndex += 1) {\n throwIfExecutionAborted(abortSignal);\n traceSpan?.addEvent?.(\"useReason.tool-step.start\", {\n stepIndex,\n toolCount: toolDefinitions.length,\n });\n\n const step = await reasonEngine(\n {\n ...useReasonArgs,\n tools: toolDefinitions,\n messages,\n emit: false,\n stream: false,\n },\n { ...(id ? { id } : {}), opId },\n );\n\n finalText = step.text;\n finalRaw = step.raw;\n aggregatedUsage = mergeUsage(aggregatedUsage, step.usage);\n accumulateTokenUsage(step.usage);\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[] = [];\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 ((useReasonArgs.emit ?? true) && step.text.length > 0) {\n emitToolEvent(\"text-start\", {});\n emitToolEvent(\"text-delta\", { delta: step.text });\n emitToolEvent(\"text-end\", {});\n }\n break;\n }\n\n allToolCalls.push(...toolCalls);\n messages.push({\n role: \"assistant\",\n content: step.text,\n toolCalls,\n });\n\n for (const toolCall of toolCalls) {\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) {\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 continue;\n }\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 }\n\n const currentStep = steps[steps.length - 1];\n if (currentStep) {\n steps[steps.length - 1] = {\n ...currentStep,\n toolResults,\n };\n }\n\n for (const result of toolResults) {\n messages.push({\n role: \"tool\",\n content: result.content,\n toolCallId: result.toolCallId,\n name: result.name,\n ...(result.structuredContent !== undefined\n ? { structuredContent: result.structuredContent }\n : {}),\n ...(result.isError !== undefined ? { isError: result.isError } : {}),\n ...(result.raw !== undefined ? { raw: result.raw } : {}),\n });\n }\n }\n\n if (steps.length >= maxSteps && steps.at(-1)?.toolCalls.length) {\n throw new Error(\n `useReason tool loop reached maxSteps (${maxSteps}) before producing a final response.`,\n );\n }\n\n if (useReasonArgs.outputSchema) {\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 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","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 { 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 { 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\ntype CallRecord = {\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 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)\n throw new Error(\n \"Concurrent workflow calls are not supported; 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.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 };\n ctx.currentNodeState.byKey[key] = record;\n ctx.stateDirty = true;\n 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 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 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 throwIfExecutionAborted(ctx.node.abortSignal);\n if (isExecutionCancelled(error)) throw error;\n if (isExecutionLimitReached(error)) {\n const child = error as unknown as {\n __kortyxChildSnapshot?: unknown;\n __kortyxChildUsage?: TokenUsage;\n };\n if (child.__kortyxChildSnapshot)\n record.snapshot = child.__kortyxChildSnapshot;\n recordUsage(child.__kortyxChildUsage);\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 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 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 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 agent: Agent;\n body: ChatRequestBody;\n}): Promise<Response> {\n const { agent, body } = args;\n const stream = await agent.streamChat(body.messages, {\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 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 });\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 { 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 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 {\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 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 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 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 ?? 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 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 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 ...(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 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 combineAbortSignals,\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 { 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 };\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 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 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 && !out.destroyed) out.write(chunk);\n };\n let outcomeState = state;\n let outcomeError: unknown;\n let sessionCheckpointId: 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 controller = new AbortController();\n const abortSignal = combineAbortSignals(requestSignal, controller.signal);\n out.on(\"close\", () => {\n if (!finished) controller.abort();\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 (typeof frameworkAdapter?.checkpointer?.getTuple !== \"function\") return;\n for (const [token, request] of activePendingRequests) {\n if (budget) request.state!.config.executionBudget = budget;\n const graphSnapshot = await captureGraphSnapshot(\n frameworkAdapter.checkpointer,\n runId,\n request.graphCheckpointId,\n );\n if (graphSnapshot) {\n const sealed = { ...request, graphSnapshot };\n activePendingRequests.set(token, sealed);\n await pendingStore?.update(token, {\n graphSnapshot,\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 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 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.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 (resolvedSessionId && frameworkAdapter?.sessionCheckpoints) {\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 (resolvedSessionId && frameworkAdapter?.sessionCheckpoints) {\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 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 // Keep the existing hook replay cache, but do not checkpoint individual tool steps.\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 };\n activePendingRequests.set(request.token, sealed);\n await pendingStore?.update(request.token, sealed);\n const checkpoint = 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 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 onOutcome?.({\n state: outcomeState,\n pending: pendingRecordToken\n ? activePendingRequests.get(pendingRecordToken)\n : undefined,\n checkpointId: sessionCheckpointId,\n ...(outcomeError ? { error: outcomeError } : {}),\n });\n });\n\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 { 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 { 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 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 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 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 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","isRecord","import_core","import_node_crypto","import_node_crypto2","import_core2","response","result","createRuntimeId","import_node_crypto3","import_core3","import_zod","tryStringify","toErrorMessage","import_core4","import_core5","import_node_crypto4","metadata","import_core","import_runtime","import_zod","import_core","import_runtime","import_zod","import_core","import_runtime","import_zod","import_node_crypto","isRecord","isRecord","checkpointId","resolvedSessionId","isRecord","resolve","import_node_crypto","import_runtime","runtimeConfig","getRegisteredProvider","streamChat"]}