@kortyx/hooks 0.31.0 → 0.32.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/README.md +25 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +316 -255
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/complete-response.ts","../src/context.ts","../src/interrupt.ts","../src/reason/checkpoint.ts","../src/validation.ts","../src/interrupt-contract.ts","../src/output-contract.ts","../src/structured-path.ts","../src/reason/use-reason.ts","../src/safe-tracing.ts","../src/structured.ts","../src/tool.ts","../src/error-diagnostics.ts","../src/diagnostic-capture.ts","../src/workflow-telemetry.ts","../src/reason/engine.ts","../src/reason-engine.ts","../src/reason/output-format.ts","../src/reason/structured-stream.ts","../src/reason/output-stream.ts","../src/reason/parsing.ts","../src/reason/prompting.ts","../src/reason/result.ts","../src/reason/tools.ts","../src/hooks.ts","../src/parallel.ts","../src/report-error.ts","../src/workflow.ts"],"sourcesContent":["// release-test: 2026-01-22\n/**\n * @kortyx/hooks\n *\n * Internal hook implementations resolved via async-local context.\n */\n\nexport {\n type CompleteResponseOptions,\n completeResponse,\n} from \"./complete-response\";\nexport type { HookRuntimeContext } from \"./context\";\nexport { runWithHookContext } from \"./context\";\nexport type {\n InterruptContract,\n InterruptContractMap,\n InterruptHistoryEntry,\n OutputContract,\n OutputContractEntry,\n OutputContractMap,\n UseContractInterruptArgs,\n UseContractStructuredDataArgs,\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonInterruptConfig,\n UseReasonInterruptsConfig,\n UseReasonOutputsConfig,\n UseReasonResult,\n UseReasonStep,\n UseReasonToolExecution,\n UseStructuredDataArgs,\n} from \"./hooks\";\nexport {\n defineInterruptContract,\n defineOutputContract,\n useAbortSignal,\n useInterrupt,\n useNodeState,\n useReason,\n useRuntimeContext,\n useStructuredData,\n useWorkflowState,\n} from \"./hooks\";\nexport { ParallelError, parallel } from \"./parallel\";\nexport { reportError } from \"./report-error\";\nexport type { UseToolArgs } from \"./tool\";\nexport { useTool } from \"./tool\";\nexport type {\n EnsureWorkflowTopologyRequest,\n EnsureWorkflowTopologyResponse,\n KortyxErrorDetails,\n KortyxTelemetryConfig,\n KortyxTelemetryContentCapture,\n KortyxTelemetryCorrelation,\n KortyxTelemetryEvent,\n KortyxTelemetryEventType,\n KortyxTelemetryPrompt,\n KortyxTelemetryReporter,\n KortyxTelemetryService,\n KortyxTraceAdapter,\n KortyxTraceErrorProjection,\n KortyxTraceMetadata,\n ReasonTraceAdapter,\n ReasonTraceAttributes,\n ReasonTraceSpan,\n ReasonTraceSpanEndArgs,\n ReasonTraceSpanStartArgs,\n ReportErrorOptions,\n} from \"./tracing\";\nexport type { WorkflowCallOutcome, WorkflowCallService } from \"./workflow\";\nexport {\n createWorkflowHooks,\n useWorkflow,\n WorkflowCallError,\n workflowCallFingerprint,\n} from \"./workflow\";\nexport { emitWorkflowCall } from \"./workflow-telemetry\";\n","import { z } from \"zod\";\nimport { getHookContext, snapshotHookState } from \"./context\";\n\nexport type CompleteResponseOptions = {\n message?: string | undefined;\n data?: unknown;\n};\n\nconst optionsSchema = z\n .object({\n message: z.string().optional(),\n data: z.json().optional(),\n })\n .strict();\n\n/** Finish client delivery, leaving the node and workflow execution running. */\nexport async function completeResponse(\n options: CompleteResponseOptions = {},\n): Promise<void> {\n const ctx = getHookContext();\n const parsed = optionsSchema.parse(options);\n if (!ctx.node.completeResponse) {\n throw new Error(\n \"completeResponse requires an agent-managed root workflow.\",\n );\n }\n await ctx.node.completeResponse(parsed, snapshotHookState());\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type {\n GraphState,\n InterruptInput,\n InterruptResumeValue,\n NodeConfig,\n TokenUsage,\n} from \"@kortyx/core\";\nimport type { KortyxUsage } from \"@kortyx/providers\";\nimport type { ParallelGroup, WorkflowTask } from \"./parallel\";\nimport type { KortyxTelemetryConfig, ReasonTraceAdapter } from \"./tracing\";\nimport type { WorkflowCallService } from \"./workflow\";\n\ntype NodeStateStore = {\n byIndex: unknown[];\n byKey: Record<string, unknown>;\n};\n\ntype HookRuntimeState = {\n nodeState?: Record<string, unknown>;\n workflowState?: Record<string, unknown>;\n};\n\ntype StoredNodeStateEnvelope = {\n nodeId?: unknown;\n state?: unknown;\n};\n\ntype HookStatePatchedError = {\n __kortyxHookStatePatch?: Record<string, unknown>;\n};\n\nexport type HookNodeRuntimeContext = {\n completeResponse?:\n | ((\n options: import(\"./complete-response\").CompleteResponseOptions,\n state: GraphState,\n ) => Promise<void>)\n | undefined;\n /** Transient execution control; never part of checkpointed state. */\n abortSignal?: AbortSignal | undefined;\n consumeExecution?:\n | ((limit: import(\"@kortyx/core\").ExecutionLimit) => void)\n | undefined;\n graph: {\n name: string;\n node: string;\n };\n config: NodeConfig;\n emit: (event: string, payload: unknown) => void;\n awaitInterrupt: (args: InterruptInput) => InterruptResumeValue;\n callWorkflow?: WorkflowCallService;\n workflowCallTelemetry?: KortyxTelemetryConfig | undefined;\n};\n\nexport type HookRuntimeContext = {\n node: HookNodeRuntimeContext;\n state: GraphState;\n reasonTrace?: ReasonTraceAdapter | undefined;\n};\n\ntype HookInternalContext = HookRuntimeContext & {\n workflowCallActive: boolean;\n workflowCallIds: Set<string>;\n workflowTasks: WorkflowTask[];\n parallelJoins: Promise<unknown>[];\n parallelGroup: ParallelGroup | undefined;\n parallelIndex: number;\n workflowControlError?: unknown;\n workflowContextClosed: boolean;\n nodeStateIndex: number;\n reasonCallIndex: number;\n toolCallIndex: number;\n currentNodeState: NodeStateStore;\n workflowState: Record<string, unknown>;\n tokenUsage?: TokenUsage | undefined;\n stateDirty: boolean;\n runtimeDirty: boolean;\n};\n\nconst storage = new AsyncLocalStorage<HookInternalContext>();\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst normalizeNodeState = (value: unknown): NodeStateStore => {\n if (Array.isArray(value)) {\n return { byIndex: [...value], byKey: {} };\n }\n\n if (isRecord(value)) {\n const byIndex = Array.isArray(value.byIndex) ? [...value.byIndex] : [];\n const byKey = isRecord(value.byKey) ? { ...value.byKey } : {};\n return { byIndex, byKey };\n }\n\n return { byIndex: [], byKey: {} };\n};\n\nconst cloneWorkflowState = (value: unknown): Record<string, unknown> =>\n isRecord(value) ? { ...value } : {};\n\nconst cloneTokenUsage = (value: unknown): TokenUsage | undefined => {\n if (!isRecord(value)) return undefined;\n const input = typeof value.input === \"number\" ? value.input : undefined;\n const output = typeof value.output === \"number\" ? value.output : undefined;\n const total = typeof value.total === \"number\" ? value.total : undefined;\n if (input === undefined && output === undefined && total === undefined) {\n return undefined;\n }\n return {\n input: input ?? 0,\n output: output ?? 0,\n total: total ?? 0,\n };\n};\n\nconst getHookRuntimeState = (state: GraphState): HookRuntimeState => {\n const runtime = (state.runtime ?? {}) as Record<string, unknown>;\n const internal = isRecord(runtime.__kortyx) ? runtime.__kortyx : undefined;\n const result: HookRuntimeState = {};\n if (isRecord(internal?.nodeState)) result.nodeState = internal?.nodeState;\n if (isRecord(internal?.workflowState)) {\n result.workflowState = internal?.workflowState;\n }\n return result;\n};\n\nconst createInternalContext = (\n ctx: HookRuntimeContext,\n): HookInternalContext => {\n const hookRuntimeState = getHookRuntimeState(ctx.state);\n const nodeId = ctx.node.graph.node;\n const storedNodeState = isRecord(hookRuntimeState.nodeState)\n ? (hookRuntimeState.nodeState as StoredNodeStateEnvelope)\n : undefined;\n const storedNodeId =\n typeof storedNodeState?.nodeId === \"string\"\n ? String(storedNodeState.nodeId)\n : \"\";\n const storedState = storedNodeState?.state;\n const currentNodeState =\n storedNodeId && storedNodeId === nodeId\n ? normalizeNodeState(storedState)\n : { byIndex: [], byKey: {} };\n\n return {\n ...ctx,\n workflowCallActive: false,\n workflowCallIds: new Set(),\n workflowTasks: [],\n parallelJoins: [],\n parallelGroup: undefined,\n parallelIndex: 0,\n workflowContextClosed: false,\n nodeStateIndex: 0,\n reasonCallIndex: 0,\n toolCallIndex: 0,\n currentNodeState,\n workflowState: cloneWorkflowState(hookRuntimeState.workflowState),\n tokenUsage: cloneTokenUsage(ctx.state.runtime?.tokenUsage),\n stateDirty: false,\n runtimeDirty: false,\n };\n};\n\nconst buildRuntimeStateUpdates = (ctx: HookInternalContext) => {\n const updates: Record<string, unknown> = {};\n\n if (ctx.stateDirty) {\n updates.__kortyx = {\n nodeState: {\n nodeId: ctx.node.graph.node,\n state: ctx.currentNodeState,\n },\n workflowState: ctx.workflowState,\n };\n }\n\n if (ctx.runtimeDirty && ctx.tokenUsage) {\n updates.tokenUsage = ctx.tokenUsage;\n }\n\n return Object.keys(updates).length > 0 ? updates : null;\n};\n\nconst cleanupCompletedReasonCheckpoints = (ctx: HookInternalContext): void => {\n let changed = false;\n\n for (const [key, value] of Object.entries(ctx.currentNodeState.byKey)) {\n if (!key.startsWith(\"__useReason:\")) continue;\n if (!isRecord(value) || value.status !== \"completed\") continue;\n delete ctx.currentNodeState.byKey[key];\n changed = true;\n }\n\n if (changed) ctx.stateDirty = true;\n};\n\nconst toTokenUsageDelta = (\n usage: KortyxUsage | undefined,\n): TokenUsage | undefined => {\n if (!usage) return undefined;\n\n const input = usage.input ?? 0;\n const output = usage.output ?? 0;\n const total =\n usage.total ??\n input +\n output +\n (usage.outputIncludesReasoning ? 0 : (usage.reasoning ?? 0));\n\n if (input === 0 && output === 0 && total === 0) {\n return undefined;\n }\n\n return {\n input,\n output,\n total,\n };\n};\n\nexport function accumulateTokenUsage(usage: KortyxUsage | undefined): void {\n const delta = toTokenUsageDelta(usage);\n if (!delta) return;\n\n const ctx = getHookContext();\n const current = ctx.tokenUsage ?? {\n input: 0,\n output: 0,\n total: 0,\n };\n\n ctx.tokenUsage = {\n input: current.input + delta.input,\n output: current.output + delta.output,\n total: current.total + delta.total,\n };\n ctx.runtimeDirty = true;\n}\n\nexport function getReasonTraceAdapter(): ReasonTraceAdapter | undefined {\n return getHookContext().reasonTrace;\n}\n\nexport async function runWithHookContext<T>(\n ctx: HookRuntimeContext,\n fn: () => Promise<T>,\n): Promise<{ result: T; runtimeUpdates: Record<string, unknown> | null }> {\n const internal = createInternalContext(ctx);\n try {\n const result = await storage.run(internal, async () => {\n const drain = async () => {\n let drained = -1;\n while (\n drained !==\n internal.parallelJoins.length + internal.workflowTasks.length\n ) {\n drained =\n internal.parallelJoins.length + internal.workflowTasks.length;\n await Promise.allSettled(internal.parallelJoins);\n await Promise.all(internal.workflowTasks.map((task) => task.done));\n }\n internal.workflowContextClosed = true;\n };\n try {\n const result = await fn();\n await drain();\n if (internal.workflowControlError) throw internal.workflowControlError;\n return result;\n } catch (error) {\n await drain();\n throw internal.workflowControlError ?? error;\n }\n });\n cleanupCompletedReasonCheckpoints(internal);\n for (const key of Object.keys(internal.currentNodeState.byKey)) {\n if (key.startsWith(\"__useTool:\")) {\n delete internal.currentNodeState.byKey[key];\n internal.stateDirty = true;\n }\n }\n for (const key of Object.keys(internal.currentNodeState.byKey)) {\n if (\n key.startsWith(\"__useWorkflow:\") ||\n key.startsWith(\"__parallel:\") ||\n key === \"__useWorkflowActivation\"\n ) {\n internal.currentNodeState.byKey[key] = null;\n internal.stateDirty = true;\n }\n }\n return { result, runtimeUpdates: buildRuntimeStateUpdates(internal) };\n } catch (err) {\n const runtimeUpdates = buildRuntimeStateUpdates(internal);\n if (runtimeUpdates) {\n const currentRuntime = isRecord(internal.state.runtime)\n ? (internal.state.runtime as Record<string, unknown>)\n : {};\n internal.state.runtime = {\n ...currentRuntime,\n ...runtimeUpdates,\n } as unknown as GraphState[\"runtime\"];\n if (err && typeof err === \"object\") {\n (err as HookStatePatchedError).__kortyxHookStatePatch = runtimeUpdates;\n }\n }\n throw err;\n }\n}\n\nexport function getHookContext(): HookInternalContext {\n const ctx = storage.getStore();\n if (!ctx) {\n throw new Error(\"Hooks can only be used while a node is executing.\");\n }\n return ctx;\n}\n\n/** Include hook state already written in this node, excluding future node returns. */\nexport function snapshotHookState(): GraphState {\n const ctx = getHookContext();\n return {\n ...ctx.state,\n lastNode: ctx.node.graph.node,\n runtime: { ...ctx.state.runtime, ...buildRuntimeStateUpdates(ctx) },\n };\n}\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { throwIfExecutionAborted } from \"@kortyx/core\";\nimport { getHookContext } from \"./context\";\nimport { resolveHookStatePatch } from \"./reason/checkpoint\";\nimport type { UseInterruptArgs } from \"./types\";\nimport { parseWithSchema } from \"./validation\";\n\nexport const awaitInterruptInternal = <\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(\n args: UseInterruptArgs<TRequest, TResponse>,\n): Promise<TResponse> => {\n const ctx = getHookContext();\n throwIfExecutionAborted(ctx.node.abortSignal);\n\n const request = parseWithSchema(\n args.requestSchema,\n args.request,\n \"useInterrupt request\",\n );\n const userMeta =\n args.meta && typeof args.meta === \"object\" && !Array.isArray(args.meta)\n ? args.meta\n : {};\n const resumeStatePatch = resolveHookStatePatch({\n nodeId: ctx.node.graph.node,\n currentNodeState: ctx.currentNodeState,\n workflowState: ctx.workflowState,\n });\n\n const enrichedRequest = {\n ...request,\n ...(typeof args.schemaId === \"string\" && args.schemaId.length > 0\n ? { schemaId: args.schemaId }\n : {}),\n ...(typeof args.schemaVersion === \"string\" && args.schemaVersion.length > 0\n ? { schemaVersion: args.schemaVersion }\n : {}),\n ...(typeof args.id === \"string\" && args.id.length > 0\n ? { id: args.id }\n : {}),\n meta: {\n ...userMeta,\n __kortyxResumeStatePatch: {\n ...resumeStatePatch,\n ...(ctx.tokenUsage ? { tokenUsage: ctx.tokenUsage } : {}),\n },\n },\n } as InterruptInput;\n\n const raw = ctx.node.awaitInterrupt(enrichedRequest);\n const response = parseWithSchema(\n args.responseSchema,\n raw,\n \"useInterrupt response\",\n );\n\n return Promise.resolve(response);\n};\n","import type { InterruptInput } from \"@kortyx/core\";\nimport type {\n KortyxFinishReason,\n KortyxProviderMetadata,\n KortyxUsage,\n KortyxWarning,\n} from \"@kortyx/providers\";\nimport type { UseReasonResult } from \"../types\";\n\nexport type ReasonInterruptCheckpoint = {\n status: \"awaiting_interrupt\";\n request: InterruptInput;\n firstText: string;\n firstRaw?: unknown;\n firstUsage?: KortyxUsage;\n firstFinishReason?: KortyxFinishReason;\n firstProviderMetadata?: KortyxProviderMetadata;\n firstWarnings?: KortyxWarning[];\n firstOutput?: unknown;\n};\n\nexport type ReasonCompletedCheckpoint = {\n status: \"completed\";\n result: UseReasonResult<unknown, unknown>;\n};\n\nexport const resolveReasonCheckpointKey = (args: {\n id?: string;\n autoIndex: number;\n}): string =>\n typeof args.id === \"string\" && args.id.length > 0\n ? `__useReason:${args.id}`\n : `__useReason:auto:${args.autoIndex}`;\n\nexport const readReasonCheckpoint = (\n raw: unknown,\n): ReasonInterruptCheckpoint | undefined => {\n if (!raw || typeof raw !== \"object\") return undefined;\n const value = raw as Record<string, unknown>;\n if (value.status !== \"awaiting_interrupt\") return undefined;\n if (typeof value.firstText !== \"string\") return undefined;\n if (!value.request || typeof value.request !== \"object\") return undefined;\n return {\n status: \"awaiting_interrupt\",\n request: value.request as InterruptInput,\n firstText: value.firstText,\n ...(Object.hasOwn(value, \"firstRaw\") ? { firstRaw: value.firstRaw } : {}),\n ...(Object.hasOwn(value, \"firstUsage\")\n ? { firstUsage: value.firstUsage as KortyxUsage }\n : {}),\n ...(Object.hasOwn(value, \"firstFinishReason\")\n ? { firstFinishReason: value.firstFinishReason as KortyxFinishReason }\n : {}),\n ...(Object.hasOwn(value, \"firstProviderMetadata\")\n ? {\n firstProviderMetadata:\n value.firstProviderMetadata as KortyxProviderMetadata,\n }\n : {}),\n ...(Object.hasOwn(value, \"firstWarnings\")\n ? { firstWarnings: value.firstWarnings as KortyxWarning[] }\n : {}),\n ...(Object.hasOwn(value, \"firstOutput\")\n ? { firstOutput: value.firstOutput }\n : {}),\n };\n};\n\nexport const readReasonCompletedCheckpoint = (\n raw: unknown,\n): ReasonCompletedCheckpoint | undefined => {\n if (!raw || typeof raw !== \"object\") return undefined;\n const value = raw as Record<string, unknown>;\n if (value.status !== \"completed\") return undefined;\n if (!value.result || typeof value.result !== \"object\") return undefined;\n return {\n status: \"completed\",\n result: value.result as UseReasonResult<unknown, unknown>,\n };\n};\n\nexport const resolveHookStatePatch = (args: {\n nodeId: string;\n currentNodeState: unknown;\n workflowState: Record<string, unknown>;\n}): Record<string, unknown> => ({\n __kortyx: {\n nodeState: {\n nodeId: args.nodeId,\n state: args.currentNodeState,\n },\n workflowState: args.workflowState,\n },\n});\n","import { ValidationError } from \"@kortyx/core/errors\";\nimport type { SchemaLike } from \"./types\";\n\nexport const parseWithSchema = <T>(\n schema: SchemaLike<T> | undefined,\n value: unknown,\n label: string,\n): T => {\n if (!schema) return value as T;\n\n const parsed = schema.safeParse(value);\n if (parsed.success) return parsed.data;\n\n const parsedError =\n \"error\" in parsed && parsed.error ? parsed.error : undefined;\n const reason =\n typeof parsedError?.message === \"string\" && parsedError.message.length > 0\n ? parsedError.message\n : \"invalid payload\";\n throw new ValidationError(\n label === \"useReason output\" ? \"MODEL_OUTPUT_SCHEMA\" : \"SCHEMA_VALIDATION\",\n `${label} validation failed: ${reason}`,\n parsedError,\n );\n};\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport type {\n InterruptContract,\n InterruptContractMap,\n UseReasonInterruptConfig,\n UseReasonInterruptsConfig,\n} from \"./types\";\n\nconst CONTROL_TOOL_PREFIX = \"kortyx_request_input__\";\nconst LEGACY_CONTRACT_NAME = \"default\";\nlet legacyWarningEmitted = false;\nconst legacyConfigs = new WeakSet<object>();\n\nexport const defineInterruptContract = <TRequest, TResponse>(\n contract: InterruptContract<TRequest, TResponse>,\n): InterruptContract<TRequest, TResponse> => {\n if (!contract || typeof contract !== \"object\")\n throw new Error(\"defineInterruptContract requires a contract object.\");\n for (const [field, value] of [\n [\"description\", contract.description],\n [\"schemaId\", contract.schemaId],\n [\"schemaVersion\", contract.schemaVersion],\n ] as const)\n if (typeof value !== \"string\" || value.trim().length === 0)\n throw new Error(\n `Interrupt contract ${field} must be a non-empty string.`,\n );\n if (typeof contract.requestSchema?.safeParse !== \"function\")\n throw new Error(\n \"Interrupt contract requestSchema must provide safeParse(value).\",\n );\n if (typeof contract.responseSchema?.safeParse !== \"function\")\n throw new Error(\n \"Interrupt contract responseSchema must provide safeParse(value).\",\n );\n return contract;\n};\n\nexport const interruptControlToolName = (name: string): string =>\n `${CONTROL_TOOL_PREFIX}${name}`;\n\nexport const isInterruptControlToolName = (name: string): boolean =>\n name.startsWith(CONTROL_TOOL_PREFIX);\n\nexport const assertInterruptContractName = (name: string): void => {\n if (!/^[A-Za-z][A-Za-z0-9_-]*$/.test(name))\n throw new Error(\n `Invalid useReason interrupt contract name \"${name}\". Use letters, numbers, underscores, or hyphens, starting with a letter.`,\n );\n if (interruptControlToolName(name).length > 64)\n throw new Error(\n `useReason interrupt contract name \"${name}\" is too long for a provider tool name.`,\n );\n};\n\nexport const warnLegacyUseReasonInterrupt = (): void => {\n if (legacyWarningEmitted) return;\n legacyWarningEmitted = true;\n process.emitWarning(\n \"useReason({ interrupt }) is deprecated and will be removed in the next major release. Define an interrupt contract with defineInterruptContract() and pass it through useReason({ interrupts: { contracts } }). See docs/internal/next-major-removals.md.\",\n {\n code: \"KORTYX_USE_REASON_INTERRUPT_DEPRECATED\",\n type: \"DeprecationWarning\",\n },\n );\n};\n\nexport const normalizeReasonInterrupts = <\n TRequest extends InterruptInput,\n TResponse,\n>(args: {\n interrupt?: UseReasonInterruptConfig<TRequest, TResponse> | undefined;\n interrupts?: UseReasonInterruptsConfig<InterruptContractMap> | undefined;\n}): UseReasonInterruptsConfig<InterruptContractMap> | undefined => {\n if (args.interrupt && args.interrupts)\n throw new Error(\n \"useReason cannot receive both deprecated `interrupt` and `interrupts`. Migrate the legacy configuration to an interrupt contract.\",\n );\n if (args.interrupts) {\n for (const [name, contract] of Object.entries(args.interrupts.contracts)) {\n assertInterruptContractName(name);\n defineInterruptContract(contract);\n }\n if (Object.keys(args.interrupts.contracts).length === 0)\n throw new Error(\"useReason interrupts.contracts cannot be empty.\");\n if (\n args.interrupts.maxRequests !== undefined &&\n (!Number.isInteger(args.interrupts.maxRequests) ||\n args.interrupts.maxRequests < 1)\n )\n throw new Error(\"useReason interrupts.maxRequests must be at least 1.\");\n return args.interrupts;\n }\n if (!args.interrupt) return undefined;\n\n warnLegacyUseReasonInterrupt();\n const normalized: UseReasonInterruptsConfig<InterruptContractMap> = {\n mode: args.interrupt.mode,\n maxRequests: 1,\n contracts: {\n [LEGACY_CONTRACT_NAME]: {\n description:\n \"Ask the user for the additional information required to complete this request.\",\n requestSchema: args.interrupt.requestSchema,\n responseSchema:\n args.interrupt.responseSchema ??\n ({\n safeParse: (value: unknown) => ({\n success: true as const,\n data: value as InterruptResult,\n }),\n } satisfies InterruptContract<\n InterruptInput,\n InterruptResult\n >[\"responseSchema\"]),\n schemaId: args.interrupt.schemaId ?? \"kortyx.legacy-interrupt\",\n schemaVersion: args.interrupt.schemaVersion ?? \"1\",\n },\n },\n };\n legacyConfigs.add(normalized);\n return normalized;\n};\n\nexport const isLegacyInterruptContracts = (\n config: UseReasonInterruptsConfig<InterruptContractMap> | undefined,\n): boolean => Boolean(config && legacyConfigs.has(config));\n","import { toJSONSchema } from \"zod\";\nimport { assertStructuredPath } from \"./structured-path\";\nimport type {\n OutputContract,\n OutputContractMap,\n UseReasonOutputsConfig,\n} from \"./types\";\n\nconst EMIT_PREFIX = \"kortyx_emit__\";\nconst RETURN_PREFIX = \"kortyx_return__\";\nconst STREAM_EMIT_PREFIX = \"kortyx_stream_emit__\";\nconst STREAM_RETURN_PREFIX = \"kortyx_stream_return__\";\nlet legacyOutputWarningEmitted = false;\n\nexport const warnLegacyReasonOutput = (): void => {\n if (legacyOutputWarningEmitted) return;\n legacyOutputWarningEmitted = true;\n process.emitWarning(\n \"useReason({ outputSchema, structured }) and result.output are deprecated and will be removed in the next major release. Define reusable contracts with defineOutputContract() and pass them through useReason({ outputs }). See docs/internal/next-major-removals.md.\",\n { code: \"KORTYX_USE_REASON_OUTPUT_DEPRECATED\", type: \"DeprecationWarning\" },\n );\n};\n\nexport const defineOutputContract = <TData>(\n contract: OutputContract<TData>,\n): OutputContract<TData> => {\n if (!contract || typeof contract !== \"object\")\n throw new Error(\"defineOutputContract requires a contract object.\");\n for (const [field, value] of [\n [\"description\", contract.description],\n [\"schemaId\", contract.schemaId],\n [\"schemaVersion\", contract.schemaVersion],\n ] as const)\n if (typeof value !== \"string\" || value.trim().length === 0)\n throw new Error(`Output contract ${field} must be a non-empty string.`);\n if (typeof contract.schema?.safeParse !== \"function\")\n throw new Error(\"Output contract schema must provide safeParse(value).\");\n if (contract.stream) {\n if (\n !contract.stream.fields ||\n Object.keys(contract.stream.fields).length === 0\n )\n throw new Error(\"Output contract stream.fields must not be empty.\");\n for (const [path, mode] of Object.entries(contract.stream.fields)) {\n assertStructuredPath(path, \"Output contract stream.fields\");\n if (!([\"set\", \"append\", \"text-delta\"] as unknown[]).includes(mode))\n throw new Error(`Invalid output contract stream mode for \"${path}\".`);\n }\n }\n return contract;\n};\n\nexport const outputControlToolName = (\n kind: \"emit\" | \"return\" | \"stream-emit\" | \"stream-return\",\n name: string,\n): string =>\n `${kind === \"emit\" ? EMIT_PREFIX : kind === \"return\" ? RETURN_PREFIX : kind === \"stream-emit\" ? STREAM_EMIT_PREFIX : STREAM_RETURN_PREFIX}${name}`;\n\nexport const isOutputControlToolName = (name: string): boolean =>\n name.startsWith(EMIT_PREFIX) ||\n name.startsWith(RETURN_PREFIX) ||\n name.startsWith(STREAM_EMIT_PREFIX) ||\n name.startsWith(STREAM_RETURN_PREFIX);\n\nexport const normalizeReasonOutputs = (\n config:\n | UseReasonOutputsConfig<OutputContractMap, OutputContractMap>\n | undefined,\n hasLegacyOutput: boolean,\n): typeof config => {\n if (!config) return undefined;\n if (hasLegacyOutput)\n throw new Error(\n \"useReason cannot combine `outputs` with deprecated `outputSchema` or `structured`.\",\n );\n const entries = [\n ...Object.entries(config.emit ?? {}).map(([name, contract]) => ({\n name,\n contract,\n kind: \"emit\" as const,\n })),\n ...Object.entries(config.return ?? {}).map(([name, contract]) => ({\n name,\n contract,\n kind: \"return\" as const,\n })),\n ];\n if (entries.length === 0)\n throw new Error(\n \"useReason outputs must include at least one emit or return contract.\",\n );\n for (const { name, contract, kind } of entries) {\n if (\n !/^[A-Za-z][A-Za-z0-9_-]*$/.test(name) ||\n outputControlToolName(kind, name).length > 64\n )\n throw new Error(`Invalid useReason output contract name \"${name}\".`);\n defineOutputContract(contract);\n if (contract.schema[\"~kortyx\"]?.nativeOutput === true)\n throw new Error(\n `useReason output contract \"${name}\" uses a provider-native output schema that cannot be selected through tools. Continue using outputSchema for this provider until a non-tool contract path is available.`,\n );\n if (\n contract.stream &&\n outputControlToolName(\n kind === \"emit\" ? \"stream-emit\" : \"stream-return\",\n name,\n ).length > 64\n )\n throw new Error(\n `Invalid useReason output contract name \"${name}\" for streaming tools.`,\n );\n try {\n const json = toJSONSchema(contract.schema as never);\n if (json.type !== \"object\")\n throw new Error(\"The tool input schema must have an object root.\");\n } catch (error) {\n throw new Error(\n `useReason output contract \"${name}\" schema must support JSON Schema conversion.`,\n { cause: error },\n );\n }\n }\n if (\n config.maxEmissions !== undefined &&\n (!Number.isInteger(config.maxEmissions) || config.maxEmissions < 1)\n )\n throw new Error(\"useReason outputs.maxEmissions must be at least 1.\");\n return config;\n};\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 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 { normalizeReasonInterrupts } from \"../interrupt-contract\";\nimport {\n normalizeReasonOutputs,\n warnLegacyReasonOutput,\n} from \"../output-contract\";\nimport { withSafeTraceSpan } from \"../safe-tracing\";\nimport { shouldStreamStructured } from \"../structured\";\nimport { closeOwnedTools, replayToolObservations } from \"../tool\";\nimport type {\n InterruptContractMap,\n OutputContractMap,\n SchemaLike,\n UseReasonArgs,\n UseReasonResult,\n} from \"../types\";\nimport { parseWithSchema } from \"../validation\";\nimport {\n type ReasonInterruptCheckpoint,\n readReasonCheckpoint,\n readReasonCompletedCheckpoint,\n resolveHookStatePatch,\n resolveReasonCheckpointKey,\n} from \"./checkpoint\";\nimport { createRuntimeId, reasonEngine } from \"./engine\";\nimport { inferOutputFormat } from \"./output-format\";\nimport { createStructuredOutputStreamer } from \"./output-stream\";\nimport {\n parseInterruptFirstPassResult,\n parseReasonOutputWithSchema,\n} from \"./parsing\";\nimport {\n defaultContinuationInput,\n defaultInterruptFirstPassInput,\n withOutputGuardrails,\n withStructuredStreamHints,\n} from \"./prompting\";\nimport {\n emitReasonStructuredOutput,\n mergeProviderMetadata,\n mergeUsage,\n mergeWarnings,\n} from \"./result\";\nimport {\n resolveAppendFieldPaths,\n resolveSetFieldPaths,\n resolveTextDeltaFieldPaths,\n} from \"./structured-stream\";\nimport { runReasonToolLoop } from \"./tools\";\n\nconst shouldStreamReasonStructured = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n TContracts extends InterruptContractMap,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse, TContracts>,\n): boolean => (args.emit ?? true) && shouldStreamStructured(args.structured);\n\nconst usesNativeOutput = (schema: SchemaLike<unknown> | undefined): boolean =>\n schema?.[\"~kortyx\"]?.nativeOutput === true;\n\nconst resolveEffectiveReasoningIncludeThoughts = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n TContracts extends InterruptContractMap,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse, TContracts>,\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 TContracts extends InterruptContractMap,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse, TContracts>,\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.interrupts) ||\n Boolean(args.structured) ||\n Boolean(args.outputs) ||\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\nasync function runReason<\n TOutput = unknown,\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n TContracts extends InterruptContractMap = InterruptContractMap,\n TEmit extends OutputContractMap = OutputContractMap,\n TReturn extends OutputContractMap = OutputContractMap,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse, TContracts, TEmit, TReturn>,\n): Promise<UseReasonResult<TOutput, TResponse, TContracts, TEmit, TReturn>> {\n assertReasoningThoughtsCompatibility(args);\n normalizeReasonOutputs(\n args.outputs,\n Boolean(args.outputSchema || args.structured),\n );\n if (args.outputSchema || args.structured) warnLegacyReasonOutput();\n if (args.outputs && resolveEffectiveResponseFormatType(args) === \"json\")\n throw new Error(\n \"useReason output contracts use tool calls and cannot be combined with JSON responseFormat.\",\n );\n const interruptConfig = normalizeReasonInterrupts({\n interrupt: args.interrupt,\n interrupts: args.interrupts,\n });\n const ctx = getHookContext();\n const abortSignal = combineAbortSignals(\n ctx.node.abortSignal,\n args.abortSignal,\n args.model.options?.abortSignal,\n );\n throwIfExecutionAborted(abortSignal);\n const allowValidatedToolOutput = Boolean(\n args.outputSchema &&\n !(args.responseFormat ?? args.model.options?.responseFormat),\n );\n const inferred = inferOutputFormat(\n args.outputSchema,\n args.responseFormat ?? args.model.options?.responseFormat,\n );\n const usesLegacyNoToolInterrupt = Boolean(\n args.interrupt && !args.interrupts && !args.tools?.length,\n );\n args = {\n ...args,\n abortSignal,\n ...(!usesLegacyNoToolInterrupt && inferred.responseFormat\n ? { responseFormat: inferred.responseFormat }\n : {}),\n };\n const id =\n typeof args.id === \"string\" && args.id.length > 0 ? args.id : undefined;\n const provisionalOpId = createRuntimeId();\n const checkpointKey = resolveReasonCheckpointKey({\n ...(id ? { id } : {}),\n autoIndex: ctx.reasonCallIndex++,\n });\n const checkpointValue = ctx.currentNodeState.byKey[checkpointKey];\n const opId =\n checkpointValue &&\n typeof checkpointValue === \"object\" &&\n \"status\" in checkpointValue &&\n checkpointValue.status === \"tool_loop\" &&\n \"opId\" in checkpointValue &&\n typeof checkpointValue.opId === \"string\"\n ? checkpointValue.opId\n : provisionalOpId;\n const existingCompleted = readReasonCompletedCheckpoint(checkpointValue);\n\n if (existingCompleted) {\n await replayToolObservations(\n existingCompleted.result.steps?.flatMap(\n (step) => step.toolObservations ?? [],\n ) ?? [],\n );\n return existingCompleted.result as unknown as UseReasonResult<\n TOutput,\n TResponse,\n TContracts,\n TEmit,\n TReturn\n >;\n }\n\n const existingCheckpoint = readReasonCheckpoint(checkpointValue);\n\n const reasonMeta =\n typeof id === \"string\" ? ({ id, opId } as const) : ({ opId } as const);\n return withSafeTraceSpan(\n getReasonTraceAdapter(),\n {\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(interruptConfig),\n interruptContractCount: Object.keys(interruptConfig?.contracts ?? {})\n .length,\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 async (traceSpan) => {\n // New contracts always use the durable tool loop. The deprecated\n // no-tools form keeps its checkpoint reader so in-flight legacy runs can\n // resume during the deprecation window; legacy + tools is normalized to\n // the new control-tool runtime.\n if (\n (args.tools?.length || args.interrupts || args.outputs) &&\n !existingCheckpoint\n ) {\n return runReasonToolLoop({\n useReasonArgs: args,\n allowValidatedToolOutput,\n checkpointKey,\n initialWarnings: inferred.warnings,\n ...(id ? { id } : {}),\n opId,\n ...(traceSpan ? { traceSpan } : {}),\n });\n }\n const suppressTextStream = Boolean(args.outputSchema || args.interrupt);\n const setFieldPaths = resolveSetFieldPaths(args.structured);\n const appendFieldPaths = resolveAppendFieldPaths(args.structured);\n const textDeltaFieldPaths = resolveTextDeltaFieldPaths(args.structured);\n const useStructuredIncrementalStreaming = Boolean(\n args.outputSchema &&\n !args.interrupt &&\n (setFieldPaths.length > 0 ||\n appendFieldPaths.length > 0 ||\n textDeltaFieldPaths.length > 0) &&\n args.stream !== false &&\n shouldStreamReasonStructured(args),\n );\n\n let firstText = \"\";\n let firstRaw: unknown;\n let firstOutput: TOutput | undefined;\n let firstInterruptRequest: TRequest | undefined;\n let firstInterruptRequired = false;\n\n let finalText = \"\";\n let finalRaw: unknown;\n let finalOutput: TOutput | undefined;\n let aggregatedUsage: KortyxUsage | undefined;\n let finalFinishReason: KortyxFinishReason | undefined;\n let aggregatedProviderMetadata: KortyxProviderMetadata | undefined;\n let aggregatedWarnings: KortyxWarning[] | undefined = inferred.warnings;\n\n if (existingCheckpoint) {\n firstText = existingCheckpoint.firstText;\n firstRaw = existingCheckpoint.firstRaw;\n firstOutput = existingCheckpoint.firstOutput as TOutput | undefined;\n finalText = firstText;\n finalRaw = firstRaw;\n finalOutput = firstOutput;\n aggregatedUsage = existingCheckpoint.firstUsage;\n finalFinishReason = existingCheckpoint.firstFinishReason;\n aggregatedProviderMetadata = existingCheckpoint.firstProviderMetadata;\n aggregatedWarnings = existingCheckpoint.firstWarnings;\n traceSpan?.addEvent?.(\"useReason.resume\", {\n checkpointKey,\n });\n } else {\n const first = await reasonEngine(\n {\n ...args,\n emit: suppressTextStream ? false : args.emit,\n stream: useStructuredIncrementalStreaming\n ? true\n : suppressTextStream\n ? false\n : args.stream,\n ...(useStructuredIncrementalStreaming\n ? {\n onTextChunk: createStructuredOutputStreamer(args, id, opId),\n }\n : {}),\n },\n reasonMeta,\n args.interrupt\n ? defaultInterruptFirstPassInput({\n input: args.input,\n requestSchema: args.interrupt.requestSchema,\n mode: args.interrupt.mode ?? \"required\",\n ...(args.outputSchema\n ? { outputSchema: args.outputSchema as SchemaLike<unknown> }\n : {}),\n })\n : args.outputSchema\n ? usesNativeOutput(args.outputSchema)\n ? undefined\n : withOutputGuardrails(\n withStructuredStreamHints(args.input, {\n ...(setFieldPaths.length > 0 ? { setFieldPaths } : {}),\n ...(appendFieldPaths.length > 0\n ? { appendFieldPaths }\n : {}),\n ...(textDeltaFieldPaths.length > 0\n ? { textDeltaFieldPaths }\n : {}),\n }),\n args.outputSchema as SchemaLike<unknown>,\n )\n : undefined,\n );\n firstRaw = first.raw;\n finalRaw = first.raw;\n accumulateTokenUsage(first.usage);\n aggregatedUsage = mergeUsage(aggregatedUsage, first.usage);\n finalFinishReason = first.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n first.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, first.warnings);\n traceSpan?.addEvent?.(\"useReason.first-pass.complete\", {\n textLength: first.text.length,\n hasInterrupt: Boolean(args.interrupt),\n });\n\n if (args.interrupt) {\n const firstPass = parseInterruptFirstPassResult<TRequest, TOutput>({\n text: first.text,\n requestSchema: args.interrupt.requestSchema,\n ...(first.finishReason ? { finishReason: first.finishReason } : {}),\n ...(first.usage ? { usage: first.usage } : {}),\n ...(args.outputSchema\n ? { outputSchema: args.outputSchema as SchemaLike<TOutput> }\n : {}),\n mode: args.interrupt.mode ?? \"required\",\n });\n firstText = firstPass.draftText;\n finalText = firstPass.draftText;\n firstInterruptRequired = firstPass.interruptRequired;\n firstInterruptRequest = firstPass.request;\n firstOutput = firstPass.output;\n finalOutput = firstPass.output;\n } else {\n firstText = first.text;\n finalText = first.text;\n if (args.outputSchema) {\n firstOutput = parseReasonOutputWithSchema({\n text: first.text,\n schema: args.outputSchema,\n ...(first.finishReason\n ? { finishReason: first.finishReason }\n : {}),\n ...(first.usage ? { usage: first.usage } : {}),\n label: \"useReason output\",\n });\n }\n finalOutput = firstOutput;\n }\n }\n\n let interruptResponse: TResponse | undefined;\n\n if (args.interrupt && (existingCheckpoint || firstInterruptRequired)) {\n const requestSchema = args.interrupt.requestSchema;\n\n const interruptRequest = existingCheckpoint\n ? parseWithSchema(\n requestSchema,\n existingCheckpoint.request,\n \"useReason interrupt.request\",\n )\n : firstInterruptRequest;\n\n if (!interruptRequest) {\n throw new Error(\n \"useReason interrupt request is missing; first pass did not produce a valid interrupt payload.\",\n );\n }\n\n if (!existingCheckpoint) {\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"awaiting_interrupt\",\n request: interruptRequest,\n firstText,\n ...(firstRaw !== undefined ? { firstRaw } : {}),\n ...(aggregatedUsage !== undefined\n ? { firstUsage: aggregatedUsage }\n : {}),\n ...(finalFinishReason !== undefined\n ? { firstFinishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { firstProviderMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { firstWarnings: aggregatedWarnings }\n : {}),\n ...(firstOutput !== undefined ? { firstOutput } : {}),\n } satisfies ReasonInterruptCheckpoint;\n ctx.stateDirty = true;\n }\n\n const resumeStatePatch = resolveHookStatePatch({\n nodeId: ctx.node.graph.node,\n currentNodeState: ctx.currentNodeState,\n workflowState: ctx.workflowState,\n });\n\n interruptResponse = await awaitInterruptInternal<TRequest, TResponse>({\n request: interruptRequest,\n requestSchema,\n responseSchema: args.interrupt.responseSchema,\n ...(args.interrupt.schemaId\n ? { schemaId: args.interrupt.schemaId }\n : {}),\n ...(args.interrupt.schemaVersion\n ? { schemaVersion: args.interrupt.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n meta: {\n __kortyxResumeStatePatch: resumeStatePatch,\n },\n });\n traceSpan?.addEvent?.(\"useReason.interrupt.resolved\", {\n checkpointKey,\n });\n\n if (Object.hasOwn(ctx.currentNodeState.byKey, checkpointKey)) {\n delete ctx.currentNodeState.byKey[checkpointKey];\n ctx.stateDirty = true;\n }\n\n const continuationInput = defaultContinuationInput({\n input: args.input,\n draftText: firstText,\n ...(firstOutput !== undefined ? { draftOutput: firstOutput } : {}),\n request: interruptRequest,\n response: interruptResponse,\n });\n\n const second = await reasonEngine(\n {\n ...args,\n ...(inferred.responseFormat\n ? { responseFormat: inferred.responseFormat }\n : {}),\n emit: suppressTextStream ? false : args.emit,\n stream: suppressTextStream ? false : args.stream,\n },\n reasonMeta,\n args.outputSchema\n ? withOutputGuardrails(\n continuationInput,\n args.outputSchema as SchemaLike<unknown>,\n )\n : continuationInput,\n );\n finalText = second.text;\n finalRaw = second.raw;\n accumulateTokenUsage(second.usage);\n aggregatedUsage = mergeUsage(aggregatedUsage, second.usage);\n finalFinishReason = second.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n second.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, second.warnings);\n traceSpan?.addEvent?.(\"useReason.continuation.complete\", {\n textLength: second.text.length,\n });\n\n if (args.outputSchema) {\n finalOutput = parseReasonOutputWithSchema({\n text: finalText,\n schema: args.outputSchema,\n ...(second.finishReason\n ? { finishReason: second.finishReason }\n : {}),\n ...(aggregatedUsage ? { usage: aggregatedUsage } : {}),\n label: \"useReason output\",\n });\n }\n }\n\n if (finalOutput !== undefined) {\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: finalOutput,\n structured: args.structured,\n emit: args.emit ?? true,\n });\n }\n\n const result = {\n ...(id ? { id } : {}),\n opId,\n text: finalText,\n ...(finalRaw !== undefined ? { raw: finalRaw } : {}),\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n ...(finalOutput !== undefined ? { output: finalOutput } : {}),\n ...(interruptResponse !== undefined ? { interruptResponse } : {}),\n };\n\n if (args.interrupt) {\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"completed\",\n result,\n };\n ctx.stateDirty = true;\n }\n\n traceSpan?.end?.({\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n attributes: {\n textLength: finalText.length,\n resumedFromCheckpoint: Boolean(existingCheckpoint),\n interrupted: Boolean(interruptResponse !== undefined),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n output: args.telemetry?.output ?? finalOutput ?? finalText,\n },\n });\n\n return result;\n },\n );\n}\n\nexport async function useReason<\n TOutput = unknown,\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n TContracts extends InterruptContractMap = InterruptContractMap,\n TEmit extends OutputContractMap = OutputContractMap,\n TReturn extends OutputContractMap = OutputContractMap,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse, TContracts, TEmit, TReturn>,\n): Promise<UseReasonResult<TOutput, TResponse, TContracts, TEmit, TReturn>> {\n try {\n return await runReason(args);\n } finally {\n await closeOwnedTools(args.tools ?? []);\n }\n}\n","import type {\n ReasonTraceAdapter,\n ReasonTraceAttributes,\n ReasonTraceSpan,\n ReasonTraceSpanEndArgs,\n ReasonTraceSpanStartArgs,\n} from \"./tracing\";\n\n/** Observation callbacks never participate in execution's error path. */\nexport function safeSpan(span: ReasonTraceSpan | undefined): ReasonTraceSpan {\n const guard =\n <T extends unknown[]>(fn: ((...args: T) => void) | undefined) =>\n (...args: T) => {\n try {\n fn?.(...args);\n } catch {}\n };\n let ended = false;\n const finish =\n <T extends unknown[]>(fn: ((...args: T) => void) | undefined) =>\n (...args: T) => {\n if (ended) return;\n ended = true;\n guard(fn)(...args);\n };\n return {\n addEvent: guard((name: string, attributes?: ReasonTraceAttributes) =>\n span?.addEvent?.(name, attributes),\n ),\n setAttributes: guard((attributes: ReasonTraceAttributes) =>\n span?.setAttributes?.(attributes),\n ),\n end: finish((args?: ReasonTraceSpanEndArgs) => span?.end?.(args)),\n fail: finish((error: unknown, args?: ReasonTraceSpanEndArgs) => {\n if (span?.fail) span.fail(error, args);\n else span?.end?.(args);\n }),\n };\n}\n\nexport function safeStartSpan(\n adapter: Partial<ReasonTraceAdapter> | undefined,\n args: ReasonTraceSpanStartArgs,\n): ReasonTraceSpan {\n try {\n return safeSpan(adapter?.startSpan?.(args));\n } catch {\n return safeSpan(undefined);\n }\n}\n\n/** Retains active adapter context, and never retries a callback if observation fails. */\nexport async function withSafeTraceSpan<T>(\n adapter: Partial<ReasonTraceAdapter> | undefined,\n args: ReasonTraceSpanStartArgs,\n fn: (span: ReasonTraceSpan) => Promise<T>,\n): Promise<T> {\n let execution: Promise<T> | undefined;\n const invoke = (span: ReasonTraceSpan) => {\n execution ??= Promise.resolve().then(async () => {\n const observed = safeSpan(span);\n try {\n const result = await fn(observed);\n observed.end?.();\n return result;\n } catch (error) {\n observed.fail?.(error);\n throw error;\n }\n });\n return execution;\n };\n let activeScope: ReasonTraceAdapter[\"withSpan\"];\n try {\n activeScope = adapter?.withSpan?.bind(adapter);\n } catch {}\n if (activeScope) {\n let started: (() => void) | undefined;\n const invoked = new Promise<void>((resolve) => {\n started = resolve;\n });\n const observe = async () => {\n try {\n await activeScope(args, (span) => {\n const result = invoke(span);\n started?.();\n return result;\n });\n } catch {\n /* The execution promise preserves its own failure. */\n }\n };\n const observation = observe();\n // Delivery or adapter work after the callback must not hold up execution.\n if (!execution) await Promise.race([invoked, observation]);\n } else {\n await invoke(safeStartSpan(adapter, args)).catch(() => {});\n }\n return execution ?? invoke(safeSpan(undefined));\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","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { randomUUID } from \"node:crypto\";\nimport { combineAbortSignals, throwIfExecutionAborted } from \"@kortyx/core\";\nimport { isControlFlowError } from \"@kortyx/core/errors\";\nimport type {\n KortyxExecutableTool,\n ToolObservation,\n ToolOutcomeDescriptor,\n} from \"@kortyx/providers\";\nimport { getHookContext } from \"./context\";\nimport { errorDiagnostics } from \"./error-diagnostics\";\nimport { withSafeTraceSpan } from \"./safe-tracing\";\nimport type { ReasonTraceAdapter } from \"./tracing\";\nimport { emitWorkflowCall } from \"./workflow-telemetry\";\n\ntype ToolScope = {\n tool: KortyxExecutableTool;\n input: unknown;\n signal?: AbortSignal | undefined;\n mode: \"direct\" | \"model\";\n providerToolCallId: string;\n adopted: boolean;\n classify?: KortyxExecutableTool[\"outcomes\"] | undefined;\n telemetry?: KortyxExecutableTool[\"telemetry\"] | undefined;\n};\nconst tools = new AsyncLocalStorage<ToolScope>();\n\nexport type UseToolArgs<T extends KortyxExecutableTool> = {\n tool: T;\n input: Parameters<T[\"execute\"]> extends []\n ? unknown\n : Parameters<T[\"execute\"]>[0];\n id?: string | undefined;\n abortSignal?: AbortSignal | undefined;\n};\n\nfunction classification(\n tool: KortyxExecutableTool,\n value: unknown,\n thrown: boolean,\n policy = tool.outcomes,\n): ToolOutcomeDescriptor {\n const fallback: ToolOutcomeDescriptor = {\n outcome: thrown ? \"fault\" : \"success\",\n };\n try {\n if (\n value &&\n typeof value === \"object\" &&\n \"isError\" in value &&\n value.isError === true\n )\n fallback.outcome = \"fault\";\n const result = thrown\n ? policy?.classifyError?.(value)\n : policy?.classifyResult?.(value);\n if (!result || ![\"success\", \"denied\", \"fault\"].includes(result.outcome))\n return fallback;\n if (result.outcome !== \"denied\")\n return thrown || fallback.outcome === \"fault\"\n ? fallback\n : { outcome: result.outcome };\n const code = result.code;\n return {\n outcome: \"denied\",\n code:\n typeof code === \"string\" &&\n /^[A-Z][A-Z0-9_]{0,63}$/.test(code) &&\n policy?.denialCodes?.includes(code)\n ? code\n : \"DENIED\",\n };\n } catch {\n return fallback;\n }\n}\n\nexport async function closeOwnedTools(\n owned: readonly KortyxExecutableTool[],\n): Promise<void> {\n const closers = new Map<\n NonNullable<KortyxExecutableTool[\"close\"]>,\n KortyxExecutableTool\n >();\n for (const tool of owned) {\n if (tool.closeAfterUse !== false && tool.close && !closers.has(tool.close))\n closers.set(tool.close, tool);\n }\n // Cleanup is a best-effort diagnostic, never a reason to retry a committed operation.\n await Promise.all(\n [...closers].map(async ([close, tool]) => {\n try {\n await close.call(tool);\n } catch {\n const ctx = getHookContext();\n try {\n ctx.reasonTrace\n ?.startSpan({\n name: \"kortyx.tool.cleanup\",\n attributes: { cleanupFailed: true },\n })\n ?.end?.();\n } catch {}\n }\n }),\n );\n}\n\n/** Read only diagnostic strings; never serialize an exception, cause, input or stack. */\nfunction captureToolError(\n observation: ToolObservation,\n error: unknown,\n policy: KortyxExecutableTool[\"telemetry\"],\n returned = false,\n) {\n try {\n const reported =\n returned &&\n error &&\n typeof error === \"object\" &&\n \"isError\" in error &&\n error.isError === true &&\n \"content\" in error &&\n typeof error.content === \"string\"\n ? { name: \"ToolError\", message: error.content }\n : error;\n let projected = false;\n let projection: import(\"./tracing\").KortyxErrorDetails | null | undefined;\n let projectionFailure: unknown;\n let projectionFailed = false;\n const project = policy?.error\n ? (original: unknown) => {\n if (!projected) {\n projected = true;\n try {\n projection = policy.error?.(original);\n } catch (error) {\n projectionFailure = error;\n projectionFailed = true;\n }\n }\n if (projectionFailed) throw projectionFailure;\n return projection ?? null;\n }\n : undefined;\n Object.assign(\n observation,\n errorDiagnostics(policy?.error ? error : reported, project),\n );\n const diagnosticId = getHookContext().reasonTrace?.reportError?.(\n policy?.error ? error : reported,\n {\n mechanism: \"tool\",\n ...(project ? { error: project } : {}),\n correlation: {\n toolCallId: observation.toolCallId,\n attemptId: observation.attemptId,\n },\n },\n );\n if (typeof diagnosticId === \"string\")\n observation.diagnosticId = diagnosticId;\n } catch {\n // An application's projection or an exception getter cannot change execution.\n }\n}\n\nfunction ownership() {\n const ctx = getHookContext();\n const correlation = ctx.node.workflowCallTelemetry?.correlation;\n return {\n workflowId: ctx.node.graph.name,\n nodeId: ctx.node.graph.node,\n ...(correlation?.workflowRevisionId\n ? { workflowRevisionId: correlation.workflowRevisionId }\n : {}),\n ...(correlation?.parentInvocationId\n ? { parentInvocationId: correlation.parentInvocationId }\n : {}),\n ...(correlation?.runId ? { runId: correlation.runId } : {}),\n ...(correlation?.invocationId\n ? { invocationId: correlation.invocationId }\n : {}),\n ...(correlation?.branchId ? { branchId: correlation.branchId } : {}),\n };\n}\n\n/** Checkpointed safe facts let a whole cached child retain its tool evidence. */\nexport function rememberToolObservation(observation: ToolObservation): void {\n const ctx = getHookContext();\n const existing = ctx.workflowState.__kortyxToolObservations;\n const observations = Array.isArray(existing) ? existing : [];\n if (!observations.some((item) => item.attemptId === observation.attemptId))\n observations.push({ ...observation });\n ctx.workflowState.__kortyxToolObservations = observations;\n ctx.stateDirty = true;\n}\n\nfunction toolTrace(\n observation: ToolObservation,\n): ReasonTraceAdapter | undefined {\n const ctx = getHookContext();\n const adapter = ctx.reasonTrace ?? ctx.node.workflowCallTelemetry?.trace;\n if (adapter) return adapter;\n const telemetry = ctx.node.workflowCallTelemetry;\n if (!telemetry?.reporter) return undefined;\n const correlation = { ...telemetry.correlation, ...observation };\n const spanId = randomUUID();\n const emit = (\n type: import(\"./tracing\").KortyxTelemetryEventType,\n payload: Record<string, unknown>,\n ) =>\n emitWorkflowCall(\n {\n ...telemetry,\n correlation,\n trace: {\n startSpan: () => undefined,\n getActiveContext: () => ({\n traceId: correlation.runId ?? spanId,\n spanId,\n }),\n },\n },\n type,\n payload,\n );\n return {\n startSpan: ({ attributes = {} }) => {\n if (attributes.executed === true) emit(\"tool.started\", attributes);\n let ended = false;\n return {\n end: (args) => {\n if (ended) return;\n ended = true;\n const payload = { ...attributes, ...args?.attributes };\n const type =\n payload.observationKind === \"reused\"\n ? \"tool.reused\"\n : payload.observationKind === \"waiting\"\n ? \"tool.waiting\"\n : payload.suspended\n ? \"tool.suspended\"\n : payload.outcome === \"denied\"\n ? \"tool.denied\"\n : payload.outcome === \"fault\"\n ? \"tool.failed\"\n : payload.outcome === \"cancelled\"\n ? \"tool.cancelled\"\n : \"tool.completed\";\n emit(type, payload);\n },\n };\n },\n };\n}\n\nexport async function executeObservedTool(args: {\n tool: KortyxExecutableTool;\n input: unknown;\n toolCallId: string;\n providerToolCallId?: string | undefined;\n callingMode: \"direct\" | \"model\";\n abortSignal?: AbortSignal | undefined;\n onObservation?: (observation: ToolObservation) => void;\n}): Promise<unknown> {\n const ctx = getHookContext();\n const observation: ToolObservation = {\n version: 1,\n name: args.tool.name,\n toolCallId: args.toolCallId,\n attemptId: randomUUID(),\n callingMode: args.callingMode,\n executed: false,\n ...ownership(),\n };\n const scope: ToolScope = {\n tool: args.tool,\n input: args.input,\n signal: args.abortSignal,\n mode: args.callingMode,\n providerToolCallId: args.providerToolCallId ?? args.toolCallId,\n adopted: false,\n };\n // Admission happens before an actual-execution start and is not a tool fault.\n try {\n throwIfExecutionAborted(args.abortSignal);\n } catch (error) {\n observation.outcome = \"cancelled\";\n await observeToolFact(observation);\n args.onObservation?.(observation);\n throw error;\n }\n ctx.node.consumeExecution?.(\"maxToolCalls\");\n observation.executed = true;\n const started = performance.now();\n return withSafeTraceSpan(\n toolTrace(observation),\n {\n name: \"kortyx.tool\",\n attributes: { ...observation, nodeId: ctx.node.graph.node },\n },\n async (span) =>\n tools.run(scope, async () => {\n try {\n const result = await args.tool.execute(args.input, {\n toolCallId: args.providerToolCallId ?? args.toolCallId,\n ...(args.abortSignal ? { abortSignal: args.abortSignal } : {}),\n });\n throwIfExecutionAborted(args.abortSignal);\n const outcome = classification(\n args.tool,\n result,\n false,\n scope.classify ?? args.tool.outcomes,\n );\n observation.outcome = outcome.outcome;\n if (outcome.code) observation.denialCode = outcome.code;\n if (observation.outcome === \"fault\") {\n captureToolError(\n observation,\n result,\n scope.telemetry ?? args.tool.telemetry,\n true,\n );\n }\n return result;\n } catch (error) {\n if (args.abortSignal?.aborted) observation.outcome = \"cancelled\";\n else if (!isControlFlowError(error)) {\n const outcome = classification(\n args.tool,\n error,\n true,\n scope.classify ?? args.tool.outcomes,\n );\n observation.outcome = outcome.outcome;\n if (outcome.code) observation.denialCode = outcome.code;\n if (observation.outcome === \"fault\")\n captureToolError(\n observation,\n error,\n scope.telemetry ?? args.tool.telemetry,\n );\n }\n throw error;\n } finally {\n observation.durationMs = Math.max(0, performance.now() - started);\n span.end?.({\n attributes: {\n ...observation,\n ...(observation.outcome ? {} : { suspended: true }),\n },\n });\n rememberToolObservation(observation);\n args.onObservation?.({ ...observation });\n }\n }),\n );\n}\n\n/** A selected but unexecuted denial, cancellation, approval wait, or cached reuse. */\nexport async function observeToolFact(\n observation: ToolObservation,\n kind?: \"reused\" | \"waiting\",\n preserveOwner = false,\n): Promise<void> {\n const ctx = getHookContext();\n if (!preserveOwner) Object.assign(observation, ownership());\n if (observation.outcome && kind !== \"reused\")\n rememberToolObservation(observation);\n await withSafeTraceSpan(\n toolTrace(observation),\n {\n name: \"kortyx.tool\",\n attributes: {\n ...observation,\n executed: false,\n ...(kind ? { observationKind: kind } : {}),\n nodeId: observation.nodeId ?? ctx.node.graph.node,\n },\n },\n async (span) => {\n span.end?.({\n attributes: {\n ...observation,\n executed: false,\n ...(kind ? { observationKind: kind } : {}),\n },\n });\n },\n );\n}\n\nexport async function useTool<T extends KortyxExecutableTool>(\n args: UseToolArgs<T>,\n): Promise<Awaited<ReturnType<T[\"execute\"]>>> {\n const ctx = getHookContext();\n const scope = tools.getStore();\n if (\n scope?.mode === \"model\" &&\n !scope.adopted &&\n scope.tool.name === args.tool.name &&\n scope.input === args.input\n ) {\n scope.adopted = true;\n scope.classify = args.tool.outcomes ?? scope.classify;\n scope.telemetry = args.tool.telemetry ?? scope.telemetry;\n return tools.run({ ...scope, mode: \"direct\" }, () =>\n args.tool.execute(args.input, {\n toolCallId: scope.providerToolCallId,\n ...(scope.signal ? { abortSignal: scope.signal } : {}),\n }),\n ) as Promise<Awaited<ReturnType<T[\"execute\"]>>>;\n }\n const index = ctx.toolCallIndex++;\n const key = `__useTool:${args.id ?? `auto:${index}`}`;\n let id = ctx.currentNodeState.byKey[key];\n if (typeof id !== \"string\") {\n id = randomUUID();\n ctx.currentNodeState.byKey[key] = id;\n ctx.stateDirty = true;\n }\n try {\n return (await executeObservedTool({\n tool: args.tool,\n input: args.input,\n toolCallId: String(id),\n callingMode: \"direct\",\n abortSignal: combineAbortSignals(ctx.node.abortSignal, args.abortSignal),\n })) as Awaited<ReturnType<T[\"execute\"]>>;\n } finally {\n await closeOwnedTools([args.tool]);\n }\n}\n\nexport async function replayToolObservations(\n observations: readonly ToolObservation[],\n child = false,\n): Promise<void> {\n for (const original of observations) {\n const source = original.source ?? {\n ...ownershipFrom(original),\n toolCallId: original.toolCallId,\n attemptId: original.attemptId,\n };\n await observeToolFact(\n {\n ...original,\n ...ownership(),\n ...(child\n ? {\n workflowId: original.workflowId,\n nodeId: original.nodeId,\n workflowRevisionId: original.workflowRevisionId,\n invocationId: original.invocationId,\n parentInvocationId: original.parentInvocationId,\n }\n : {}),\n attemptId: randomUUID(),\n executed: false,\n source,\n durationMs: undefined,\n },\n \"reused\",\n child,\n );\n }\n}\nconst ownershipFrom = (observation: ToolObservation) => ({\n runId: observation.runId,\n invocationId: observation.invocationId,\n branchId: observation.branchId,\n});\n","import { summarizeDiagnostic } from \"@kortyx/telemetry-contracts\";\nimport { captureDiagnosticContent } from \"./diagnostic-capture\";\nimport type { KortyxErrorDetails, KortyxTraceErrorProjection } from \"./tracing\";\n\n/** Redacted observer diagnostic; bounded summaries are produced separately. */\nexport function exceptionDiagnostics(\n error: unknown,\n project?: KortyxTraceErrorProjection,\n): KortyxErrorDetails | null {\n const content = captureDiagnosticContent(error, project);\n return !content || content.capture.status === \"failed\"\n ? null\n : (content.data as KortyxErrorDetails);\n}\n\n/** Internal tracing diagnostics only; never changes client-facing failure contracts. */\nexport function errorDiagnostics(\n error: unknown,\n project?: KortyxTraceErrorProjection,\n): { errorType?: string; errorMessage?: string } {\n const captured = exceptionDiagnostics(error, project);\n const details = captured ? summarizeDiagnostic(captured) : null;\n return details\n ? {\n errorMessage: details.message.slice(0, 8192),\n ...(details.type ? { errorType: details.type.slice(0, 256) } : {}),\n }\n : {};\n}\nexport function isModelTraceSpan(name: string) {\n return name === \"runReasonEngine\" || name === \"useReason\";\n}\n","import { errorProperty } from \"@kortyx/core/errors\";\nimport {\n DIAGNOSTIC_LIMITS,\n type DiagnosticContent,\n type DiagnosticNote,\n isPrivateDiagnosticField,\n redactDiagnosticText,\n} from \"@kortyx/telemetry-contracts\";\nimport type { KortyxTraceErrorProjection } from \"./tracing\";\n\nconst encoder = new TextEncoder();\n// Node 24 stores even assigned stacks behind a shared native lazy accessor.\nconst nativeStackGetter = Object.getOwnPropertyDescriptor(\n new Error(),\n \"stack\",\n)?.get;\nfunction nativeStack(\n object: object,\n getter: (() => unknown) | undefined,\n): unknown {\n if (!getter || getter !== nativeStackGetter)\n throw new Error(\"Custom stack accessor\");\n for (const key of [\"name\", \"message\"]) {\n let cursor: object | null = object;\n while (cursor) {\n const descriptor = Object.getOwnPropertyDescriptor(cursor, key);\n if (descriptor) {\n if (!(\"value\" in descriptor) || typeof descriptor.value !== \"string\")\n throw new Error(\"Custom error formatting\");\n break;\n }\n cursor = Object.getPrototypeOf(cursor);\n }\n }\n const formatter = Object.getOwnPropertyDescriptor(Error, \"prepareStackTrace\");\n if (formatter && (!(\"value\" in formatter) || !formatter.writable))\n throw new Error(\"Custom stack formatter\");\n // Synchronous formatting must not invoke an application's prepareStackTrace.\n Object.defineProperty(Error, \"prepareStackTrace\", {\n ...(formatter ?? { configurable: true, writable: true }),\n value: undefined,\n });\n try {\n return getter.call(object);\n } finally {\n if (formatter) Object.defineProperty(Error, \"prepareStackTrace\", formatter);\n else Reflect.deleteProperty(Error, \"prepareStackTrace\");\n }\n}\nconst pointer = (key: string) => key.replace(/~/g, \"~0\").replace(/\\//g, \"~1\");\n\n/** Data-only graph capture. Getters and application toJSON methods are never invoked. */\nexport function captureDiagnosticContent(\n error: unknown,\n project?: KortyxTraceErrorProjection,\n): DiagnosticContent | null {\n const omissions: DiagnosticNote[] = [];\n const redactions: DiagnosticNote[] = [];\n const seen = new WeakMap<object, string>();\n let nodes = 0;\n let remaining = DIAGNOSTIC_LIMITS.bytes - 64 * 1024;\n const omit = (\n path: string,\n reason: string,\n extra: Partial<DiagnosticNote> = {},\n ) => {\n if (omissions.length < 1000)\n omissions.push({ path: path.slice(0, 4096), reason, ...extra });\n return { $omitted: reason };\n };\n const visit = (value: unknown, path: string, depth: number): unknown => {\n if (++nodes > DIAGNOSTIC_LIMITS.nodes) return omit(path, \"node_limit\");\n if (depth > DIAGNOSTIC_LIMITS.depth) return omit(path, \"depth_limit\");\n if (typeof value === \"string\") {\n const clean = redactDiagnosticText(value);\n if (clean !== value && redactions.length < 1000)\n redactions.push({\n path: path.slice(0, 4096),\n reason: \"credential_text\",\n });\n const bytes = encoder.encode(JSON.stringify(clean)).length;\n if (bytes > remaining)\n return omit(path, \"byte_limit\", {\n originalBytes: encoder.encode(value).length,\n });\n remaining -= bytes;\n return clean;\n }\n if (value === null || typeof value === \"boolean\") return value;\n if (typeof value === \"number\")\n return Number.isFinite(value)\n ? value\n : { $type: \"number\", value: String(value) };\n if (typeof value === \"bigint\")\n return { $type: \"bigint\", value: value.toString() };\n if (typeof value === \"undefined\") return { $type: \"undefined\" };\n if (typeof value === \"function\" || typeof value === \"symbol\")\n return omit(path, `unsupported_${typeof value}`);\n const object = value as object;\n const reference = seen.get(object);\n if (reference) return { $ref: reference };\n seen.set(object, path);\n remaining -= 32;\n if (remaining < 0) return omit(path, \"byte_limit\");\n try {\n if (value instanceof Date)\n return { $type: \"Date\", value: Date.prototype.toISOString.call(value) };\n if (value instanceof Map || value instanceof Set) {\n const isMap = value instanceof Map;\n const iterator = isMap\n ? Map.prototype.entries.call(value)\n : Set.prototype.values.call(value);\n const count = Object.getOwnPropertyDescriptor(\n isMap ? Map.prototype : Set.prototype,\n \"size\",\n )?.get?.call(value) as number;\n const entries: unknown[] = [];\n for (\n let index = 0;\n index < Math.min(count, DIAGNOSTIC_LIMITS.properties);\n index++\n )\n entries.push(iterator.next().value);\n if (count > entries.length)\n omissions.push({\n path,\n reason: \"collection_limit\",\n originalCount: count,\n });\n return isMap\n ? {\n $type: \"Map\",\n entries: visit(entries, `${path}/entries`, depth + 1),\n }\n : {\n $type: \"Set\",\n values: visit(entries, `${path}/values`, depth + 1),\n };\n }\n if (Array.isArray(value)) {\n const count = Math.min(value.length, DIAGNOSTIC_LIMITS.properties);\n const items = Array.from({ length: count }, (_, index) =>\n read(value, String(index), `${path}/${index}`, depth),\n );\n if (count < value.length)\n items.push(\n omit(path, \"collection_limit\", { originalCount: value.length }),\n );\n return items;\n }\n const keys = Object.getOwnPropertyNames(object);\n const result: Record<string, unknown> = Object.create(null);\n if (value instanceof Error) {\n const ownName = Object.getOwnPropertyDescriptor(object, \"name\");\n let type: unknown =\n ownName && \"value\" in ownName ? ownName.value : undefined;\n if (typeof type !== \"string\") {\n const name = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(value),\n \"name\",\n );\n type = name && \"value\" in name ? name.value : \"Error\";\n }\n result.type = visit(\n typeof type === \"string\" ? type : \"Error\",\n `${path}/type`,\n depth + 1,\n );\n }\n for (const key of keys.slice(0, DIAGNOSTIC_LIMITS.properties)) {\n if ([\"__proto__\", \"constructor\", \"prototype\"].includes(key)) {\n result[key] = omit(`${path}/${pointer(key)}`, \"unsafe_key\");\n continue;\n }\n remaining -= encoder.encode(key).length + 4;\n result[key] = read(object, key, `${path}/${pointer(key)}`, depth);\n }\n if (keys.length > DIAGNOSTIC_LIMITS.properties)\n result.$omittedProperties = omit(path, \"property_limit\", {\n originalCount: keys.length,\n });\n return result;\n } catch {\n return omit(path, \"unreadable_object\");\n }\n };\n const read = (\n object: object,\n key: string,\n path: string,\n depth: number,\n ): unknown => {\n if (isPrivateDiagnosticField(key)) {\n if (redactions.length < 1000)\n redactions.push({\n path: path.slice(0, 4096),\n reason: \"credential_field\",\n });\n return \"[REDACTED]\";\n }\n try {\n const property = Object.getOwnPropertyDescriptor(object, key);\n if (property && \"value\" in property)\n return visit(property.value, path, depth + 1);\n if (\n key === \"stack\" &&\n object instanceof Error &&\n property?.get &&\n property.get === nativeStackGetter\n )\n return visit(nativeStack(object, property.get), path, depth + 1);\n return omit(\n path,\n property ? \"accessor_not_evaluated\" : \"unavailable_property\",\n );\n } catch {\n return omit(path, \"unreadable_property\");\n }\n };\n try {\n const original = project ? project(error) : error;\n if (project && original === null) return null;\n const captured = visit(original, \"#/data\", 0);\n const upstreamOmissions = errorProperty(original, \"diagnosticOmissions\");\n if (Array.isArray(upstreamOmissions))\n for (const note of upstreamOmissions.slice(0, 1000)) {\n const path = errorProperty(note, \"path\");\n const reason = errorProperty(note, \"reason\");\n if (typeof path === \"string\" && typeof reason === \"string\")\n omissions.push({\n path: redactDiagnosticText(path).slice(0, 4096),\n reason: redactDiagnosticText(reason).slice(0, 128),\n });\n }\n const data: Record<string, unknown> =\n captured && typeof captured === \"object\" && !Array.isArray(captured)\n ? (captured as Record<string, unknown>)\n : {\n type: \"Error\",\n message:\n typeof captured === \"string\"\n ? captured\n : \"Execution reported a fault.\",\n value: captured,\n };\n if (typeof data.message !== \"string\" && !(\"message\" in data))\n data.message = \"Execution reported a fault.\";\n if (!(\"type\" in data))\n data.type = typeof data.name === \"string\" ? data.name : \"Error\";\n const content: DiagnosticContent = {\n schemaVersion: 1,\n data,\n capture: {\n status: omissions.length ? \"partial\" : \"complete\",\n omissions,\n redactions,\n },\n };\n if (\n encoder.encode(JSON.stringify(content)).length > DIAGNOSTIC_LIMITS.bytes\n )\n return {\n schemaVersion: 1,\n data: {\n type: \"Error\",\n message: \"Diagnostic exceeded the capture budget.\",\n },\n capture: {\n status: \"partial\",\n redactions: [],\n omissions: [{ path: \"#/data\", reason: \"serialized_byte_limit\" }],\n },\n };\n return content;\n } catch {\n return {\n schemaVersion: 1,\n data: { type: \"Error\", message: \"Diagnostic capture failed.\" },\n capture: {\n status: \"failed\",\n redactions: [],\n omissions: [{ path: \"#/data\", reason: \"projection_or_capture_failed\" }],\n },\n };\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","import { randomUUID } from \"node:crypto\";\nimport { combineAbortSignals, throwIfExecutionAborted } from \"@kortyx/core\";\nimport type {\n KortyxPromptMessage,\n KortyxReasoningOptions,\n KortyxResponseFormat,\n KortyxToolDefinition,\n ProviderModelRef,\n} from \"@kortyx/providers\";\nimport { accumulateTokenUsage, getHookContext } from \"../context\";\nimport type { RunReasonEngineResult } from \"../reason-engine\";\nimport { runReasonEngine } from \"../reason-engine\";\nimport type { KortyxTraceMetadata } from \"../tracing\";\n\nexport type ReasonEngineInput = {\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | undefined;\n maxOutputTokens?: number | undefined;\n stopSequences?: string[] | undefined;\n abortSignal?: AbortSignal | undefined;\n reasoning?: KortyxReasoningOptions | undefined;\n responseFormat?: KortyxResponseFormat | undefined;\n providerOptions?: Record<string, unknown> | undefined;\n tools?: KortyxToolDefinition[] | undefined;\n messages?: KortyxPromptMessage[] | undefined;\n emit?: boolean | undefined;\n stream?: boolean | undefined;\n onTextChunk?: ((text: string) => void) | undefined;\n telemetry?: KortyxTraceMetadata | undefined;\n};\n\nexport const createRuntimeId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nexport async function reasonEngine(\n args: ReasonEngineInput,\n meta: { id?: string; opId: string },\n inputOverride?: string,\n): Promise<RunReasonEngineResult> {\n const ctx = getHookContext();\n const abortSignal = combineAbortSignals(\n ctx.node.abortSignal,\n args.abortSignal,\n args.model.options?.abortSignal,\n );\n throwIfExecutionAborted(abortSignal);\n ctx.node.consumeExecution?.(\"maxModelPasses\");\n\n try {\n return await runReasonEngine({\n model: args.model,\n input: inputOverride ?? args.input,\n system: args.system,\n temperature: args.temperature,\n maxOutputTokens: args.maxOutputTokens,\n stopSequences: args.stopSequences,\n abortSignal,\n reasoning: args.reasoning,\n responseFormat: args.responseFormat,\n providerOptions: args.providerOptions,\n tools: args.tools,\n messages: args.messages,\n defaultTemperature: ctx.node.config?.model?.temperature,\n stream: args.stream,\n emit: args.emit,\n onTextChunk: args.onTextChunk,\n telemetry: args.telemetry,\n nodeId: ctx.node.graph.node,\n emitEvent: ctx.node.emit,\n reasonTrace: ctx.reasonTrace,\n id: meta.id,\n opId: meta.opId,\n });\n } catch (error) {\n const usage = (error as Partial<RunReasonEngineResult> | undefined)?.usage;\n if (usage) accumulateTokenUsage(usage);\n throw error;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport {\n createExecutionCancelledError,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport { KortyxError } from \"@kortyx/core/errors\";\nimport type {\n KortyxContinuation,\n KortyxFinishReason,\n KortyxPromptMessage,\n KortyxProviderMetadata,\n KortyxReasoningOptions,\n KortyxResponseFormat,\n KortyxToolCall,\n KortyxToolDefinition,\n KortyxUsage,\n KortyxWarning,\n ProviderModelRef,\n} from \"@kortyx/providers\";\nimport { safeStartSpan } from \"./safe-tracing\";\nimport type {\n KortyxTraceMetadata,\n ReasonTraceAdapter,\n ReasonTraceSpan,\n} from \"./tracing\";\n\nfunction assertModelFinish(result: {\n finishReason?: KortyxFinishReason | undefined;\n usage?: KortyxUsage | undefined;\n}): void {\n if (result.finishReason?.unified !== \"content-filter\") return;\n throw Object.assign(\n new KortyxError(\"PROVIDER_REFUSAL\", \"The provider refused the request.\", {\n category: \"provider\",\n retryable: false,\n safeMessage: \"The provider refused the request.\",\n }),\n {\n ...(result.usage ? { usage: result.usage } : {}),\n finishReason: result.finishReason,\n },\n );\n}\n\nexport interface RunReasonEngineArgs {\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | undefined;\n maxOutputTokens?: number | undefined;\n stopSequences?: string[] | undefined;\n abortSignal?: AbortSignal | undefined;\n reasoning?: KortyxReasoningOptions | undefined;\n responseFormat?: KortyxResponseFormat | undefined;\n providerOptions?: Record<string, unknown> | undefined;\n tools?: KortyxToolDefinition[] | undefined;\n messages?: KortyxPromptMessage[] | undefined;\n defaultTemperature?: number | undefined;\n stream?: boolean | undefined;\n emit?: boolean | undefined;\n nodeId?: string | undefined;\n emitEvent?: ((event: string, payload: unknown) => void) | undefined;\n onTextChunk?: ((text: string) => void) | undefined;\n id?: string | undefined;\n opId?: string | undefined;\n segmentId?: string | undefined;\n telemetry?: KortyxTraceMetadata | undefined;\n reasonTrace?: ReasonTraceAdapter | undefined;\n}\n\nexport interface RunReasonEngineResult {\n continuation?: KortyxContinuation;\n text: string;\n raw?: unknown;\n usage?: KortyxUsage;\n finishReason?: KortyxFinishReason;\n toolCalls?: KortyxToolCall[];\n providerMetadata?: KortyxProviderMetadata;\n warnings?: KortyxWarning[];\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\nconst createRuntimeId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nconst emitNodeEvent = (\n emitEvent: RunReasonEngineArgs[\"emitEvent\"],\n nodeId: string | undefined,\n event: string,\n payload: Record<string, unknown>,\n): void => {\n if (!emitEvent) return;\n emitEvent(event, {\n ...payload,\n ...(typeof nodeId === \"string\" && nodeId.length > 0\n ? { node: nodeId }\n : {}),\n });\n};\n\nexport const resolveProviderOptions = (\n defaults: Record<string, unknown> | undefined,\n overrides: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined => {\n const providerOptions =\n defaults || overrides ? { ...defaults, ...overrides } : undefined;\n // Provider namespaces inherit model defaults (including transport) while\n // allowing individual call settings to override them.\n for (const [key, value] of Object.entries(overrides ?? {})) {\n const previous = defaults?.[key];\n if (\n previous &&\n value &&\n typeof previous === \"object\" &&\n typeof value === \"object\" &&\n !Array.isArray(previous) &&\n !Array.isArray(value)\n ) {\n if (providerOptions) providerOptions[key] = { ...previous, ...value };\n }\n }\n return providerOptions;\n};\n\nexport async function runReasonEngine(\n args: RunReasonEngineArgs,\n): Promise<RunReasonEngineResult> {\n let stream = args.stream ?? args.model.options?.streaming ?? true;\n const emit = args.emit ?? true;\n const temperature =\n args.temperature ??\n args.model.options?.temperature ??\n args.defaultTemperature;\n const maxOutputTokens =\n args.maxOutputTokens ?? args.model.options?.maxOutputTokens;\n const stopSequences = args.stopSequences ?? args.model.options?.stopSequences;\n const abortSignal = args.abortSignal ?? args.model.options?.abortSignal;\n const reasoning = args.reasoning ?? args.model.options?.reasoning;\n const responseFormat =\n args.responseFormat ?? args.model.options?.responseFormat;\n const providerOptions = resolveProviderOptions(\n args.model.options?.providerOptions,\n args.providerOptions,\n );\n const tools = args.tools ?? args.model.options?.tools;\n\n throwIfExecutionAborted(abortSignal);\n const model = args.model.provider.getModel(args.model.modelId, {\n ...(temperature !== undefined ? { temperature } : {}),\n streaming: stream,\n ...(maxOutputTokens !== undefined ? { maxOutputTokens } : {}),\n ...(stopSequences !== undefined ? { stopSequences } : {}),\n ...(abortSignal !== undefined ? { abortSignal } : {}),\n ...(reasoning !== undefined ? { reasoning } : {}),\n ...(responseFormat !== undefined ? { responseFormat } : {}),\n ...(tools !== undefined ? { tools } : {}),\n ...(providerOptions !== undefined ? { providerOptions } : {}),\n });\n\n if (tools?.length && !model.supportsToolStreaming) stream = false;\n\n const messages: KortyxPromptMessage[] =\n args.messages !== undefined\n ? args.messages\n : [\n ...(typeof args.system === \"string\" && args.system.length > 0\n ? [{ role: \"system\" as const, content: args.system }]\n : []),\n { role: \"user\" as const, content: String(args.input ?? \"\") },\n ];\n\n const opId =\n typeof args.opId === \"string\" && args.opId.length > 0\n ? args.opId\n : createRuntimeId();\n const segmentId =\n typeof args.segmentId === \"string\" && args.segmentId.length > 0\n ? args.segmentId\n : createRuntimeId();\n\n const commonMeta: Record<string, unknown> = {\n ...(typeof args.id === \"string\" && args.id.length > 0\n ? { id: args.id }\n : {}),\n opId,\n segmentId,\n };\n const traceSpan = safeStartSpan(args.reasonTrace, {\n name: \"runReasonEngine\",\n attributes: {\n ...commonMeta,\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n stream,\n emit,\n ...(args.telemetry?.operation\n ? { operation: args.telemetry.operation }\n : {}),\n ...(args.telemetry?.prompt?.name\n ? { promptName: args.telemetry.prompt.name }\n : {}),\n ...(args.telemetry?.prompt?.version !== undefined\n ? { promptVersion: args.telemetry.prompt.version }\n : {}),\n ...(args.telemetry?.prompt?.type\n ? { promptType: args.telemetry.prompt.type }\n : {}),\n ...(typeof args.nodeId === \"string\" && args.nodeId.length > 0\n ? { nodeId: args.nodeId }\n : {}),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n input:\n args.telemetry?.input ??\n messages.map(\n ({ continuation: _continuation, raw: _raw, ...message }) => message,\n ),\n },\n });\n const modelRequestStartedAt = Date.now();\n let firstTextTokenAt: number | undefined;\n let lastTextTokenAt: number | undefined;\n\n const generationTimingAttributes = (): Record<string, number> =>\n firstTextTokenAt === undefined || lastTextTokenAt === undefined\n ? {}\n : {\n ttftMs: Math.max(0, firstTextTokenAt - modelRequestStartedAt),\n streamDurationMs: Math.max(0, lastTextTokenAt - firstTextTokenAt),\n timeToLastTokenMs: Math.max(\n 0,\n lastTextTokenAt - modelRequestStartedAt,\n ),\n };\n\n const endTrace = (\n span: ReasonTraceSpan | undefined,\n result: RunReasonEngineResult,\n ): void => {\n span?.end?.({\n ...(result.usage !== undefined ? { usage: result.usage } : {}),\n ...(result.finishReason !== undefined\n ? { finishReason: result.finishReason }\n : {}),\n ...(result.providerMetadata !== undefined\n ? { providerMetadata: result.providerMetadata }\n : {}),\n ...(result.warnings !== undefined ? { warnings: result.warnings } : {}),\n attributes: {\n textLength: result.text.length,\n ...generationTimingAttributes(),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n output: args.telemetry?.output ?? result.text,\n },\n });\n };\n\n const failTrace = (\n span: ReasonTraceSpan | undefined,\n error: unknown,\n ): void => {\n const detail = error as Partial<RunReasonEngineResult> | undefined;\n try {\n span?.fail?.(error, {\n ...(detail?.usage ? { usage: detail.usage } : {}),\n ...(detail?.finishReason ? { finishReason: detail.finishReason } : {}),\n ...(detail?.providerMetadata\n ? { providerMetadata: detail.providerMetadata }\n : {}),\n attributes: {\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n },\n });\n } catch {\n /* Reporting must not replace the execution failure. */\n }\n };\n\n try {\n if (stream) {\n let continuation: KortyxContinuation | undefined;\n let final = \"\";\n let raw: unknown;\n let usage: KortyxUsage | undefined;\n let finishReason: KortyxFinishReason | undefined;\n let toolCalls: KortyxToolCall[] | undefined;\n let providerMetadata: KortyxProviderMetadata | undefined;\n let warnings: KortyxWarning[] | undefined;\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-start\", {\n ...commonMeta,\n });\n }\n\n const response = await model.stream(messages);\n for await (const chunk of response) {\n throwIfExecutionAborted(abortSignal);\n switch (chunk.type) {\n case \"text-delta\": {\n if (chunk.delta.length === 0) break;\n const tokenAt = Date.now();\n firstTextTokenAt ??= tokenAt;\n lastTextTokenAt = tokenAt;\n final += chunk.delta;\n args.onTextChunk?.(chunk.delta);\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: chunk.delta,\n });\n }\n break;\n }\n case \"finish\": {\n continuation = chunk.continuation;\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.usage !== undefined) {\n usage = chunk.usage;\n }\n if (chunk.finishReason !== undefined) {\n finishReason = chunk.finishReason;\n }\n if (chunk.toolCalls !== undefined) {\n toolCalls = chunk.toolCalls;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (chunk.warnings !== undefined) {\n warnings = chunk.warnings;\n }\n break;\n }\n case \"raw\": {\n raw = chunk.raw;\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n break;\n }\n case \"error\": {\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (chunk.warnings !== undefined) {\n warnings = chunk.warnings;\n }\n throw toError(chunk.error);\n }\n }\n }\n\n throwIfExecutionAborted(abortSignal);\n assertModelFinish({ finishReason, usage });\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n const result = {\n text: final,\n ...(continuation ? { continuation } : {}),\n ...(raw !== undefined ? { raw } : {}),\n ...(usage !== undefined ? { usage } : {}),\n ...(finishReason !== undefined ? { finishReason } : {}),\n ...(toolCalls !== undefined ? { toolCalls } : {}),\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n ...(warnings !== undefined ? { warnings } : {}),\n };\n throwIfExecutionAborted(abortSignal);\n endTrace(traceSpan, result);\n return result;\n }\n\n const response = await model.invoke(messages);\n throwIfExecutionAborted(abortSignal);\n assertModelFinish(response);\n if (response.content) args.onTextChunk?.(response.content);\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-start\", {\n ...commonMeta,\n });\n if (response.content) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: response.content,\n });\n }\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n const result = {\n text: response.content,\n ...(response.continuation ? { continuation: response.continuation } : {}),\n ...(response.raw !== undefined ? { raw: response.raw } : {}),\n ...(response.usage !== undefined ? { usage: response.usage } : {}),\n ...(response.finishReason !== undefined\n ? { finishReason: response.finishReason }\n : {}),\n ...(response.toolCalls !== undefined\n ? { toolCalls: response.toolCalls }\n : {}),\n ...(response.providerMetadata !== undefined\n ? { providerMetadata: response.providerMetadata }\n : {}),\n ...(response.warnings !== undefined\n ? { warnings: response.warnings }\n : {}),\n };\n endTrace(traceSpan, result);\n return result;\n } catch (error) {\n const failure = abortSignal?.aborted\n ? createExecutionCancelledError()\n : error;\n failTrace(traceSpan, failure);\n throw failure;\n }\n}\n","import type { KortyxResponseFormat, KortyxWarning } from \"@kortyx/providers\";\nimport { toJSONSchema } from \"zod\";\nimport type { SchemaLike } from \"../types\";\n\n/** Infer the wire schema only when the caller did not choose a format. */\nexport function inferOutputFormat(\n schema: SchemaLike<unknown> | undefined,\n explicit: KortyxResponseFormat | undefined,\n): {\n responseFormat?: KortyxResponseFormat;\n warnings?: KortyxWarning[];\n} {\n if (explicit) return { responseFormat: explicit };\n if (!schema) return {};\n try {\n const json = toJSONSchema(schema as never) as Record<string, unknown>;\n const clean = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(clean);\n if (!value || typeof value !== \"object\") return value;\n const object = value as Record<string, unknown>;\n if (\n [\n \"allOf\",\n \"not\",\n \"dependentRequired\",\n \"dependentSchemas\",\n \"if\",\n \"then\",\n \"else\",\n \"prefixItems\",\n ].some((key) => key in object)\n )\n throw new Error(\n \"Schema composition requires an explicit provider schema\",\n );\n if (object.type === \"object\") {\n if (object.additionalProperties !== false)\n throw new Error(\n \"Dynamic properties require an explicit provider schema\",\n );\n const properties = object.properties as\n | Record<string, unknown>\n | undefined;\n const required = object.required as string[] | undefined;\n if (\n properties &&\n Object.keys(properties).some((key) => !required?.includes(key))\n ) {\n throw new Error(\n \"Optional properties require an explicit provider schema\",\n );\n }\n }\n return Object.fromEntries(\n Object.entries(object)\n .filter(([key]) => key !== \"$schema\" && key !== \"default\")\n .map(([key, child]) => {\n // Property and definition names are user data, not schema keywords.\n if (\n (key === \"properties\" ||\n key === \"$defs\" ||\n key === \"definitions\") &&\n child &&\n typeof child === \"object\"\n )\n return [\n key,\n Object.fromEntries(\n Object.entries(child).map(([name, definition]) => [\n name,\n clean(definition),\n ]),\n ),\n ];\n return [\n key,\n key === \"enum\" || key === \"const\" ? child : clean(child),\n ];\n }),\n );\n };\n if (json.type !== \"object\")\n throw new Error(\"The provider schema must have an object root\");\n return { responseFormat: { type: \"json\", schema: clean(json) } };\n } catch {\n return {\n responseFormat: { type: \"json\" },\n warnings: [\n {\n type: \"compatibility\",\n feature: \"outputSchema\",\n details:\n \"This validator cannot be inferred as a strict provider JSON schema. Kortyx still validates the final output locally. Supply responseFormat.schema to enforce a wire schema.\",\n },\n ],\n };\n }\n}\n","import { assertStructuredPath, parseStructuredPath } from \"../structured-path\";\nimport type { UseReasonStructuredConfig } from \"../types\";\n\nexport const resolveAppendFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const appendPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"append\")\n .map(([path]) => path);\n\n for (const path of appendPaths) {\n assertStructuredPath(path, \"useReason structured append\");\n }\n\n return appendPaths;\n};\n\nexport const resolveSetFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const setPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"set\")\n .map(([path]) => path);\n\n for (const path of setPaths) {\n assertStructuredPath(path, \"useReason structured set\");\n }\n\n return setPaths;\n};\n\nexport const resolveTextDeltaFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const textPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"text-delta\")\n .map(([path]) => path);\n\n for (const path of textPaths) {\n assertStructuredPath(path, \"useReason structured text-delta\");\n }\n\n return textPaths;\n};\n\nconst extractCompletedStringValueAt = (args: {\n text: string;\n start: number;\n}): { complete: boolean; value?: string } => {\n let value = \"\";\n\n for (let i = args.start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (ch === '\"') {\n return {\n complete: true,\n value,\n };\n }\n\n if (ch !== \"\\\\\") {\n value += ch;\n continue;\n }\n\n const next = args.text[i + 1];\n if (!next) {\n return {\n complete: false,\n };\n }\n\n if (\n next === '\"' ||\n next === \"\\\\\" ||\n next === \"/\" ||\n next === \"b\" ||\n next === \"f\" ||\n next === \"n\" ||\n next === \"r\" ||\n next === \"t\"\n ) {\n value +=\n next === \"b\"\n ? \"\\b\"\n : next === \"f\"\n ? \"\\f\"\n : next === \"n\"\n ? \"\\n\"\n : next === \"r\"\n ? \"\\r\"\n : next === \"t\"\n ? \"\\t\"\n : next;\n i += 1;\n continue;\n }\n\n if (next === \"u\") {\n const hex = args.text.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n return {\n complete: false,\n };\n }\n value += String.fromCharCode(Number.parseInt(hex, 16));\n i += 5;\n continue;\n }\n\n return {\n complete: false,\n };\n }\n\n return {\n complete: false,\n };\n};\n\nconst skipWhitespace = (text: string, start: number): number => {\n let i = start;\n while (i < text.length && /\\s/.test(text[i] ?? \"\")) i += 1;\n return i;\n};\n\nconst pathSegmentMatches = (patternPart: string, actualPart: string): boolean =>\n patternPart === \"*\" || patternPart === actualPart;\n\nconst pathMatchesPattern = (\n actualParts: string[],\n patternParts: string[],\n): boolean =>\n actualParts.length === patternParts.length &&\n actualParts.every((part, index) =>\n pathSegmentMatches(patternParts[index] ?? \"\", part),\n );\n\nconst isPathPrefix = (prefix: string[], full: string[]): boolean =>\n prefix.length <= full.length &&\n prefix.every((part, index) => pathSegmentMatches(full[index] ?? \"\", part));\n\nconst parseStringToken = (\n text: string,\n start: number,\n): { complete: boolean; end?: number; value?: string } => {\n if (text[start] !== '\"') return { complete: false };\n\n const parsed = extractCompletedStringValueAt({ text, start: start + 1 });\n if (!parsed.complete || parsed.value === undefined)\n return { complete: false };\n\n let inEscape = false;\n for (let i = start + 1; i < text.length; i += 1) {\n const ch = text[i];\n if (ch === undefined) break;\n\n if (inEscape) {\n inEscape = false;\n if (ch === \"u\") i += 4;\n continue;\n }\n\n if (ch === \"\\\\\") {\n inEscape = true;\n continue;\n }\n\n if (ch === '\"') {\n return {\n complete: true,\n end: i + 1,\n value: parsed.value,\n };\n }\n }\n\n return { complete: false };\n};\n\nconst skipNestedValue = (\n text: string,\n start: number,\n): { complete: boolean; end?: number } => {\n const opener = text[start];\n const closer = opener === \"{\" ? \"}\" : \"]\";\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n\n for (let i = start; i < text.length; i += 1) {\n const ch = text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === opener) {\n nesting += 1;\n continue;\n }\n\n if (ch === closer) {\n nesting -= 1;\n if (nesting === 0) {\n return { complete: true, end: i + 1 };\n }\n }\n }\n\n return { complete: false };\n};\n\nconst skipCompleteValue = (\n text: string,\n start: number,\n): { complete: boolean; end?: number } => {\n const i = skipWhitespace(text, start);\n const first = text[i];\n if (!first) return { complete: false };\n\n if (first === '\"') {\n const parsed = parseStringToken(text, i);\n return parsed.complete && parsed.end !== undefined\n ? { complete: true, end: parsed.end }\n : { complete: false };\n }\n\n if (first === \"{\" || first === \"[\") {\n return skipNestedValue(text, i);\n }\n\n for (let j = i; j < text.length; j += 1) {\n const ch = text[j];\n if (ch !== \",\" && ch !== \"}\" && ch !== \"]\") continue;\n\n const raw = text.slice(i, j).trim();\n if (!raw) return { complete: false };\n\n try {\n JSON.parse(raw);\n return { complete: true, end: j };\n } catch {\n return { complete: false };\n }\n }\n\n return { complete: false };\n};\n\nconst locateValueStart = (args: {\n text: string;\n path: string;\n}): { found: boolean; start?: number } => {\n const [first] = locateValueStarts(args);\n return first\n ? {\n found: true,\n start: first.start,\n }\n : {\n found: false,\n };\n};\n\nconst locateValueStarts = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; start: number }> => {\n const targetParts = parseStructuredPath(\n args.path,\n \"useReason structured field\",\n );\n const matches: Array<{ path: string; start: number }> = [];\n\n const visitValue = (start: number, currentParts: string[]): void => {\n const valueStart = skipWhitespace(args.text, start);\n if (pathMatchesPattern(currentParts, targetParts)) {\n matches.push({\n path: currentParts.join(\".\"),\n start: valueStart,\n });\n return;\n }\n\n if (!isPathPrefix(currentParts, targetParts)) {\n return;\n }\n\n const first = args.text[valueStart];\n if (first === \"{\") visitObject(valueStart + 1, currentParts);\n if (first === \"[\") visitArray(valueStart + 1, currentParts);\n };\n\n const visitObject = (start: number, currentParts: string[]): void => {\n let i = skipWhitespace(args.text, start);\n\n while (i < args.text.length) {\n const ch = args.text[i];\n if (ch === \"}\") return;\n if (ch === \",\") {\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (ch !== '\"') return;\n\n const key = parseStringToken(args.text, i);\n if (!key.complete || key.end === undefined || key.value === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, key.end);\n if (args.text[i] !== \":\") return;\n\n const valueStart = skipWhitespace(args.text, i + 1);\n const childParts = [...currentParts, key.value];\n if (pathMatchesPattern(childParts, targetParts)) {\n matches.push({\n path: childParts.join(\".\"),\n start: valueStart,\n });\n } else if (isPathPrefix(childParts, targetParts)) {\n visitValue(valueStart, childParts);\n }\n\n const skipped = skipCompleteValue(args.text, valueStart);\n if (!skipped.complete || skipped.end === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, skipped.end);\n if (args.text[i] === \",\") {\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (args.text[i] === \"}\") return;\n return;\n }\n };\n\n const visitArray = (start: number, currentParts: string[]): void => {\n let i = skipWhitespace(args.text, start);\n let index = 0;\n\n while (i < args.text.length) {\n if (args.text[i] === \"]\") return;\n\n const childParts = [...currentParts, String(index)];\n if (pathMatchesPattern(childParts, targetParts)) {\n matches.push({\n path: childParts.join(\".\"),\n start: i,\n });\n } else if (isPathPrefix(childParts, targetParts)) {\n visitValue(i, childParts);\n }\n\n const skipped = skipCompleteValue(args.text, i);\n if (!skipped.complete || skipped.end === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, skipped.end);\n if (args.text[i] === \",\") {\n index += 1;\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (args.text[i] === \"]\") return;\n return;\n }\n };\n\n visitValue(0, []);\n return matches;\n};\n\nconst extractCompletedValueAt = (args: {\n text: string;\n start: number;\n}): { complete: boolean; value?: unknown } => {\n const start = skipWhitespace(args.text, args.start);\n const first = args.text[start];\n if (!first) return { complete: false };\n\n if (first === '\"') {\n const parsed = extractCompletedStringValueAt({\n text: args.text,\n start: start + 1,\n });\n return parsed.complete\n ? {\n complete: true,\n value: parsed.value,\n }\n : {\n complete: false,\n };\n }\n\n if (first === \"{\") {\n return extractCompletedNestedValueAt({\n text: args.text,\n start,\n opener: \"{\",\n closer: \"}\",\n });\n }\n\n if (first === \"[\") {\n return extractCompletedNestedValueAt({\n text: args.text,\n start,\n opener: \"[\",\n closer: \"]\",\n });\n }\n\n for (let i = start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n if (ch !== \",\" && ch !== \"}\" && ch !== \"]\") continue;\n\n const raw = args.text.slice(start, i).trim();\n if (!raw) return { complete: false };\n\n try {\n return {\n complete: true,\n value: JSON.parse(raw),\n };\n } catch {\n return { complete: false };\n }\n }\n\n return { complete: false };\n};\n\nconst extractCompletedNestedValueAt = (args: {\n text: string;\n start: number;\n opener: \"{\" | \"[\";\n closer: \"}\" | \"]\";\n}): { complete: boolean; value?: unknown } => {\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n\n for (let i = args.start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === args.opener) {\n nesting += 1;\n continue;\n }\n\n if (ch === args.closer) {\n nesting -= 1;\n if (nesting === 0) {\n const raw = args.text.slice(args.start, i + 1);\n try {\n return {\n complete: true,\n value: JSON.parse(raw),\n };\n } catch {\n return {\n complete: false,\n };\n }\n }\n }\n }\n\n return {\n complete: false,\n };\n};\n\nexport const extractCompletedFieldValue = (args: {\n text: string;\n path: string;\n}): { found: boolean; complete: boolean; value?: unknown } => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) {\n return {\n found: located.found,\n complete: false,\n };\n }\n\n const parsed = extractCompletedValueAt({\n text: args.text,\n start: located.start,\n });\n return parsed.complete\n ? {\n found: true,\n complete: true,\n value: parsed.value,\n }\n : {\n found: true,\n complete: false,\n };\n};\n\nexport const extractCompletedFieldValues = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; value: unknown }> => {\n const located = locateValueStarts(args);\n const values: Array<{ path: string; value: unknown }> = [];\n\n for (const match of located) {\n const parsed = extractCompletedValueAt({\n text: args.text,\n start: match.start,\n });\n if (!parsed.complete) continue;\n\n values.push({\n path: match.path,\n value: parsed.value,\n });\n }\n\n return values;\n};\n\nexport const extractCompletedArrayItems = (args: {\n text: string;\n path: string;\n}): unknown[] => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) return [];\n\n const arrayStart = skipWhitespace(args.text, located.start);\n if (args.text[arrayStart] !== \"[\") return [];\n const start = arrayStart + 1;\n\n const items: unknown[] = [];\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n let itemStart = -1;\n\n for (let i = start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n if (itemStart < 0) itemStart = i;\n continue;\n }\n\n if (itemStart < 0) {\n if (/\\s/.test(ch) || ch === \",\") continue;\n if (ch === \"]\") break;\n itemStart = i;\n if (ch === \"{\" || ch === \"[\") {\n nesting = 1;\n } else {\n nesting = 0;\n }\n continue;\n }\n\n if (ch === \"{\" || ch === \"[\") {\n nesting += 1;\n continue;\n }\n\n if (ch === \"}\" || ch === \"]\") {\n if (nesting > 0) {\n nesting -= 1;\n continue;\n }\n }\n\n if (nesting === 0 && (ch === \",\" || ch === \"]\")) {\n const raw = args.text.slice(itemStart, i).trim();\n if (raw) {\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n itemStart = -1;\n if (ch === \"]\") break;\n }\n }\n\n return items;\n};\n\nexport const extractCompletedArrayItemGroups = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; items: unknown[] }> => {\n return locateValueStarts(args).flatMap((match) => {\n const items = extractCompletedArrayItems({\n text: args.text,\n path: match.path,\n });\n return items.length > 0\n ? [\n {\n path: match.path,\n items,\n },\n ]\n : [];\n });\n};\n\nexport const extractStreamingStringValue = (args: {\n text: string;\n path: string;\n}): { found: boolean; complete: boolean; value: string } => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) {\n return {\n found: located.found,\n complete: false,\n value: \"\",\n };\n }\n\n const stringStart = skipWhitespace(args.text, located.start);\n if (args.text[stringStart] !== '\"') {\n return {\n found: true,\n complete: false,\n value: \"\",\n };\n }\n\n let value = \"\";\n\n for (let i = stringStart + 1; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (ch === '\"') {\n return {\n found: true,\n complete: true,\n value,\n };\n }\n\n if (ch !== \"\\\\\") {\n value += ch;\n continue;\n }\n\n const next = args.text[i + 1];\n if (!next) {\n return {\n found: true,\n complete: false,\n value,\n };\n }\n\n if (\n next === '\"' ||\n next === \"\\\\\" ||\n next === \"/\" ||\n next === \"b\" ||\n next === \"f\" ||\n next === \"n\" ||\n next === \"r\" ||\n next === \"t\"\n ) {\n value +=\n next === \"b\"\n ? \"\\b\"\n : next === \"f\"\n ? \"\\f\"\n : next === \"n\"\n ? \"\\n\"\n : next === \"r\"\n ? \"\\r\"\n : next === \"t\"\n ? \"\\t\"\n : next;\n i += 1;\n continue;\n }\n\n if (next === \"u\") {\n const hex = args.text.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n return {\n found: true,\n complete: false,\n value,\n };\n }\n value += String.fromCharCode(Number.parseInt(hex, 16));\n i += 5;\n continue;\n }\n\n return {\n found: true,\n complete: false,\n value,\n };\n }\n\n return {\n found: true,\n complete: false,\n value,\n };\n};\n\nexport const extractStreamingStringValues = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; complete: boolean; value: string }> => {\n return locateValueStarts(args).flatMap((match) => {\n const current = extractStreamingStringValue({\n text: args.text,\n path: match.path,\n });\n return current.found\n ? [\n {\n path: match.path,\n complete: current.complete,\n value: current.value,\n },\n ]\n : [];\n });\n};\n","import { emitStructuredData } from \"../structured\";\nimport type { UseReasonStructuredConfig } from \"../types\";\nimport {\n extractCompletedArrayItemGroups,\n extractCompletedFieldValues,\n extractStreamingStringValues,\n resolveAppendFieldPaths,\n resolveSetFieldPaths,\n resolveTextDeltaFieldPaths,\n} from \"./structured-stream\";\n\nexport function createStructuredOutputStreamer(\n args: { structured?: UseReasonStructuredConfig | undefined },\n id: string | undefined,\n opId: string,\n) {\n let firstText = \"\";\n const setFieldPaths = resolveSetFieldPaths(args.structured);\n const appendFieldPaths = resolveAppendFieldPaths(args.structured);\n const textDeltaFieldPaths = resolveTextDeltaFieldPaths(args.structured);\n const emittedSetValues = new Map<string, string>();\n const emittedAppendCounts = new Map<string, number>();\n const emittedTextValues = new Map<string, string>();\n return (delta: string) => {\n firstText += delta;\n\n for (const fieldPath of setFieldPaths) {\n const values = extractCompletedFieldValues({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, value } of values) {\n const nextSerialized = JSON.stringify(value);\n if (emittedSetValues.get(path) === nextSerialized) continue;\n\n emittedSetValues.set(path, nextSerialized);\n emitStructuredData({\n kind: \"set\",\n path,\n value,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n\n for (const fieldPath of appendFieldPaths) {\n const groups = extractCompletedArrayItemGroups({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, items } of groups) {\n const emittedAppendCount = emittedAppendCounts.get(path) ?? 0;\n if (items.length <= emittedAppendCount) continue;\n\n const nextItems = items.slice(emittedAppendCount);\n emittedAppendCounts.set(path, items.length);\n emitStructuredData({\n kind: \"append\",\n path,\n items: nextItems,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n\n for (const fieldPath of textDeltaFieldPaths) {\n const values = extractStreamingStringValues({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, value } of values) {\n const emittedTextValue = emittedTextValues.get(path) ?? \"\";\n if (\n value.length <= emittedTextValue.length ||\n !value.startsWith(emittedTextValue)\n ) {\n continue;\n }\n\n const nextDelta = value.slice(emittedTextValue.length);\n emittedTextValues.set(path, value);\n if (nextDelta.length === 0) continue;\n\n emitStructuredData({\n kind: \"text-delta\",\n path,\n delta: nextDelta,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n };\n}\n","import type { InterruptInput } from \"@kortyx/core\";\nimport { ValidationError } from \"@kortyx/core/errors\";\nimport type { KortyxFinishReason, KortyxUsage } from \"@kortyx/providers\";\nimport type { SchemaLike } from \"../types\";\nimport { parseWithSchema } from \"../validation\";\n\nconst tryJsonParse = (\n value: string,\n):\n | { ok: true; value: unknown; error?: never }\n | { ok: false; error: string } => {\n try {\n return { ok: true, value: JSON.parse(value) };\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n};\n\nconst extractJsonCodeBlock = (value: string): string | null => {\n const match = value.match(/```(?:json)?\\s*([\\s\\S]*?)```/i);\n if (!match || typeof match[1] !== \"string\") return null;\n const inner = match[1].trim();\n return inner.length > 0 ? inner : null;\n};\n\nconst tryStringify = (value: unknown): string => {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nexport const resolveOutputCandidate = (text: string): unknown => {\n const trimmed = text.trim();\n if (!trimmed) return text;\n\n const direct = tryJsonParse(trimmed);\n if (direct.ok) return direct.value;\n\n const block = extractJsonCodeBlock(trimmed);\n if (block) {\n const parsedBlock = tryJsonParse(block);\n if (parsedBlock.ok) return parsedBlock.value;\n }\n\n return text;\n};\n\nconst createTruncatedStructuredOutputError = (\n label: string,\n cause?: unknown,\n): Error =>\n new ValidationError(\n \"OUTPUT_TRUNCATED\",\n `${label} was truncated before producing valid structured output. The model stopped due to output length. Increase maxOutputTokens or simplify the requested output.`,\n cause,\n );\n\nconst createInvalidStructuredOutputError = (\n label: string,\n cause?: unknown,\n): Error =>\n new ValidationError(\n \"INVALID_MODEL_JSON\",\n `${label} did not produce valid structured output. The model returned text instead of the expected JSON payload. Check the output contract or outputSchema and provider structured-output settings.`,\n cause,\n );\n\nexport const parseReasonOutputWithSchema = <TOutput>(args: {\n text: string;\n schema: SchemaLike<TOutput>;\n finishReason?: KortyxFinishReason;\n usage?: KortyxUsage;\n label: string;\n}): TOutput => {\n const candidate = resolveOutputCandidate(args.text);\n const block = extractJsonCodeBlock(args.text.trim());\n const validJson =\n tryJsonParse(args.text.trim()).ok ||\n (block !== null && tryJsonParse(block).ok);\n\n try {\n return parseWithSchema(args.schema, candidate, args.label);\n } catch (error) {\n if (!(error instanceof ValidationError)) throw error;\n const failure =\n args.finishReason?.unified === \"length\"\n ? createTruncatedStructuredOutputError(args.label, error)\n : typeof candidate === \"string\" && !validJson\n ? createInvalidStructuredOutputError(args.label, error)\n : error;\n if (failure && typeof failure === \"object\")\n Object.assign(failure, {\n ...(args.usage ? { usage: args.usage } : {}),\n ...(args.finishReason ? { finishReason: args.finishReason } : {}),\n });\n throw failure;\n }\n};\n\nexport const parseInterruptFirstPassResult = <\n TRequest extends InterruptInput = InterruptInput,\n TOutput = unknown,\n>(args: {\n text: string;\n requestSchema: SchemaLike<TRequest>;\n outputSchema?: SchemaLike<TOutput>;\n finishReason?: KortyxFinishReason;\n usage?: KortyxUsage;\n mode?: \"required\" | \"optional\" | undefined;\n}):\n | {\n draftText: string;\n interruptRequired: boolean;\n request: TRequest;\n output?: TOutput;\n }\n | {\n draftText: string;\n interruptRequired: false;\n request?: undefined;\n output?: TOutput;\n } => {\n try {\n const candidate = resolveOutputCandidate(args.text);\n if (!isRecord(candidate)) {\n if (args.finishReason?.unified === \"length\") {\n throw createTruncatedStructuredOutputError(\"useReason output\");\n }\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\n throw createInvalidStructuredOutputError(\"useReason output\");\n }\n throw new ValidationError(\n \"MODEL_OUTPUT_SCHEMA\",\n \"useReason first pass with interrupt must return a JSON object.\",\n );\n }\n\n const mode = args.mode ?? \"required\";\n let interruptRequired = true;\n if (mode === \"optional\") {\n if (\n candidate.decision !== \"continue\" &&\n candidate.decision !== \"interrupt\"\n ) {\n throw new ValidationError(\n \"MODEL_OUTPUT_SCHEMA\",\n 'useReason optional interrupt first pass must include decision \"continue\" or \"interrupt\".',\n );\n }\n interruptRequired = candidate.decision === \"interrupt\";\n\n if (!interruptRequired) {\n const hasUnexpectedRequest = [\n candidate.interruptRequest,\n candidate.request,\n candidate.interrupt,\n ].some((value) => value !== null && value !== undefined);\n\n if (hasUnexpectedRequest) {\n throw new ValidationError(\n \"MODEL_OUTPUT_SCHEMA\",\n 'useReason optional interrupt first pass with decision \"continue\" must not include an interrupt request.',\n );\n }\n }\n }\n\n let request: TRequest | undefined;\n if (interruptRequired) {\n const requestCandidates: unknown[] = [\n candidate.interruptRequest,\n candidate.request,\n candidate.interrupt,\n mode === \"required\" ? candidate : undefined,\n ];\n const requestPayload = requestCandidates.find(\n (value) => value !== null && value !== undefined,\n );\n\n request = parseWithSchema(\n args.requestSchema,\n requestPayload,\n \"useReason interrupt.request\",\n );\n }\n\n let output: TOutput | undefined;\n if (args.outputSchema) {\n const outputPayload = Object.hasOwn(candidate, \"output\")\n ? candidate.output\n : candidate;\n try {\n output = parseWithSchema(\n args.outputSchema,\n outputPayload,\n \"useReason output\",\n );\n } catch (error) {\n if (!(error instanceof ValidationError)) throw error;\n if (args.finishReason?.unified === \"length\") {\n throw createTruncatedStructuredOutputError(\"useReason output\", error);\n }\n throw error;\n }\n }\n\n const explicitDraft =\n typeof candidate.draftText === \"string\" && candidate.draftText.length > 0\n ? candidate.draftText\n : typeof candidate.text === \"string\" && candidate.text.length > 0\n ? candidate.text\n : undefined;\n\n if (!args.outputSchema && !explicitDraft) {\n throw new ValidationError(\n \"MODEL_OUTPUT_SCHEMA\",\n \"useReason first pass with interrupt requires `draftText` when outputSchema is not provided.\",\n );\n }\n\n const draftText =\n explicitDraft ??\n (output !== undefined ? tryStringify(output) : String(args.text ?? \"\"));\n\n if (!interruptRequired) {\n return {\n draftText,\n interruptRequired: false,\n ...(output !== undefined ? { output } : {}),\n };\n }\n\n return {\n draftText,\n interruptRequired: true,\n request: request as TRequest,\n ...(output !== undefined ? { output } : {}),\n };\n } catch (error) {\n if (error && typeof error === \"object\")\n Object.assign(error, {\n ...(args.usage ? { usage: args.usage } : {}),\n ...(args.finishReason ? { finishReason: args.finishReason } : {}),\n });\n throw error;\n }\n};\n","import type { InterruptInput } from \"@kortyx/core\";\nimport { toJSONSchema } from \"zod\";\nimport type { SchemaLike } from \"../types\";\n\nconst tryStringify = (value: unknown): string => {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nconst tryGetSchemaHint = (schema: unknown): string | undefined => {\n try {\n const hint = toJSONSchema(schema as never);\n return JSON.stringify(hint, null, 2);\n } catch {\n return undefined;\n }\n};\n\nconst withSchemaHint = (\n input: string,\n label: string,\n schema: unknown,\n): string => {\n const hint = tryGetSchemaHint(schema);\n if (!hint) return input;\n return `${input}\\n\\n${label}:\\n${hint}`;\n};\n\nexport const defaultInterruptFirstPassInput = (args: {\n input: string;\n requestSchema: SchemaLike<unknown>;\n outputSchema?: SchemaLike<unknown>;\n mode?: \"required\" | \"optional\" | undefined;\n}): string => {\n const mode = args.mode ?? \"required\";\n const base =\n mode === \"optional\"\n ? args.outputSchema\n ? [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: decision, output, interruptRequest, draftText.\",\n '- decision must be either \"continue\" or \"interrupt\".',\n '- Use decision \"continue\" when you can produce the final output without asking the user.',\n '- Use decision \"interrupt\" only when user input is needed before finalizing.',\n \"- output must match the expected output JSON schema.\",\n '- When decision is \"interrupt\", interruptRequest must match the expected interrupt request JSON schema and must be a non-null object.',\n '- When decision is \"continue\", interruptRequest must be null.',\n \"- draftText should be a concise plain-language summary of output.\",\n ].join(\"\\n\\n\")\n : [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: decision, draftText, interruptRequest.\",\n '- decision must be either \"continue\" or \"interrupt\".',\n '- Use decision \"continue\" when you can produce the final answer without asking the user.',\n '- Use decision \"interrupt\" only when user input is needed before finalizing.',\n \"- draftText should be the current answer text.\",\n '- When decision is \"interrupt\", interruptRequest must match the expected interrupt request JSON schema and must be a non-null object.',\n '- When decision is \"continue\", interruptRequest must be null.',\n ].join(\"\\n\\n\")\n : args.outputSchema\n ? [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: output, interruptRequest, draftText.\",\n \"- output must match the expected output JSON schema.\",\n \"- interruptRequest must match the expected interrupt request JSON schema.\",\n \"- interruptRequest must be a non-null object.\",\n \"- draftText should be a concise plain-language summary of output.\",\n \"- If uncertain, still return a valid interruptRequest with safe default options.\",\n ].join(\"\\n\\n\")\n : [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: draftText, interruptRequest.\",\n \"- draftText should be the current draft answer text.\",\n \"- interruptRequest must match the expected interrupt request JSON schema.\",\n \"- interruptRequest must be a non-null object.\",\n \"- If uncertain, still return a valid interruptRequest with safe default options.\",\n ].join(\"\\n\\n\");\n\n const withInterruptSchema = withSchemaHint(\n base,\n \"Expected interrupt request JSON schema (for `interruptRequest`)\",\n args.requestSchema,\n );\n\n if (!args.outputSchema) return withInterruptSchema;\n const withOutputSchema = withSchemaHint(\n withInterruptSchema,\n \"Expected output JSON schema (for `output`)\",\n args.outputSchema,\n );\n return [\n withOutputSchema,\n \"JSON template:\",\n mode === \"optional\"\n ? '{ \"decision\": \"continue\", \"output\": { ... }, \"interruptRequest\": null, \"draftText\": \"...\" }'\n : '{ \"output\": { ... }, \"interruptRequest\": { ... }, \"draftText\": \"...\" }',\n ].join(\"\\n\\n\");\n};\n\nexport const defaultContinuationInput = (args: {\n input: string;\n draftText: string;\n draftOutput?: unknown;\n request: InterruptInput;\n response: unknown;\n}): string =>\n [\n \"You are continuing a paused reasoning task after user input.\",\n \"Update the previous result using the user response and return the final answer only.\",\n \"If the previous output was JSON, return JSON in the same schema.\",\n \"\",\n `Original request:\\n${args.input}`,\n `Draft answer text:\\n${args.draftText}`,\n `Draft output object:\\n${tryStringify(args.draftOutput ?? args.draftText)}`,\n `Interrupt request shown to user:\\n${tryStringify(args.request)}`,\n `User response:\\n${tryStringify(args.response)}`,\n ].join(\"\\n\\n\");\n\nexport const withOutputGuardrails = (\n input: string,\n schema?: SchemaLike<unknown>,\n): string => {\n const base = [\n input,\n \"Output rules:\",\n \"- Return only JSON, no markdown fences.\",\n \"- Ensure the response conforms to the expected output schema.\",\n \"- Do not include explanatory text outside the JSON object.\",\n ].join(\"\\n\\n\");\n return withSchemaHint(base, \"Expected output JSON schema\", schema);\n};\n\nexport const withStructuredStreamHints = (\n input: string,\n args: {\n setFieldPaths?: string[];\n appendFieldPaths?: string[];\n textDeltaFieldPaths?: string[];\n },\n): string => {\n const rules: string[] = [];\n\n for (const path of args.setFieldPaths ?? []) {\n rules.push(\n `- For the field path pattern \\`${path}\\`, write one stable final value and do not rewrite it after it is complete.`,\n );\n }\n\n for (const path of args.appendFieldPaths ?? []) {\n rules.push(\n `- For the array field path pattern \\`${path}\\`, write items in final order and finish each item before starting the next.`,\n );\n rules.push(\n `- Once an item in \\`${path}\\` is complete, do not rewrite or reorder earlier items.`,\n );\n }\n\n for (const path of args.textDeltaFieldPaths ?? []) {\n rules.push(\n `- For the string field path pattern \\`${path}\\`, write the value progressively by appending text to the end.`,\n );\n rules.push(\n `- Do not rewrite or replace the earlier prefix of \\`${path}\\` once emitted.`,\n );\n }\n\n if (rules.length === 0) return input;\n\n return [\n input,\n \"Streaming rules:\",\n ...rules,\n \"- Keep the overall response as valid JSON.\",\n ].join(\"\\n\\n\");\n};\n","import type {\n KortyxFinishReason,\n KortyxProviderMetadata,\n KortyxUsage,\n KortyxWarning,\n} from \"@kortyx/providers\";\nimport { emitStructuredData, shouldEmitStructured } from \"../structured\";\nimport type { UseReasonArgs } from \"../types\";\n\nexport const mergeUsage = (\n left: KortyxUsage | undefined,\n right: KortyxUsage | undefined,\n): KortyxUsage | undefined => {\n if (!left) return right;\n if (!right) return left;\n\n const sum = (\n a: number | undefined,\n b: number | undefined,\n ): number | undefined =>\n a === undefined && b === undefined ? undefined : (a ?? 0) + (b ?? 0);\n\n const raw =\n left.raw || right.raw\n ? {\n ...(left.raw ?? {}),\n ...(right.raw ?? {}),\n }\n : undefined;\n const input = sum(left.input, right.input);\n const output = sum(left.output, right.output);\n const total = sum(left.total, right.total);\n const reasoning = sum(left.reasoning, right.reasoning);\n const cacheRead = sum(left.cacheRead, right.cacheRead);\n const cacheWrite = sum(left.cacheWrite, right.cacheWrite);\n const cacheWrite1h = sum(left.cacheWrite1h, right.cacheWrite1h);\n const merged: KortyxUsage = {\n ...(right.outputIncludesReasoning !== undefined\n ? { outputIncludesReasoning: right.outputIncludesReasoning }\n : {}),\n ...(right.inputIncludesCacheWrite !== undefined\n ? { inputIncludesCacheWrite: right.inputIncludesCacheWrite }\n : {}),\n ...(right.inputIncludesCacheRead !== undefined\n ? { inputIncludesCacheRead: right.inputIncludesCacheRead }\n : {}),\n };\n\n if (input !== undefined) merged.input = input;\n if (output !== undefined) merged.output = output;\n if (total !== undefined) merged.total = total;\n if (reasoning !== undefined) merged.reasoning = reasoning;\n if (cacheRead !== undefined) merged.cacheRead = cacheRead;\n if (cacheWrite !== undefined) merged.cacheWrite = cacheWrite;\n if (cacheWrite1h !== undefined) merged.cacheWrite1h = cacheWrite1h;\n if (raw) merged.raw = raw;\n\n return merged;\n};\n\nexport const mergeWarnings = (\n left: KortyxWarning[] | undefined,\n right: KortyxWarning[] | undefined,\n): KortyxWarning[] | undefined => {\n if (!left?.length) return right;\n if (!right?.length) return left;\n\n const seen = new Set<string>();\n const merged: KortyxWarning[] = [];\n for (const warning of [...left, ...right]) {\n const key = JSON.stringify(warning);\n if (seen.has(key)) continue;\n seen.add(key);\n merged.push(warning);\n }\n return merged;\n};\n\nexport const mergeProviderMetadata = (\n left: KortyxProviderMetadata | undefined,\n right: KortyxProviderMetadata | undefined,\n): KortyxProviderMetadata | undefined => {\n if (!left) return right;\n if (!right) return left;\n return {\n ...left,\n ...right,\n };\n};\n\nexport const emitReasonStructuredOutput = <TOutput>(args: {\n id?: string;\n opId: string;\n output: TOutput;\n structured: UseReasonArgs<TOutput>[\"structured\"];\n emit: boolean;\n}): void => {\n if (!args.emit || !shouldEmitStructured(args.structured)) return;\n\n emitStructuredData<TOutput>({\n dataType: args.structured?.dataType ?? \"reason-output\",\n data: args.output,\n kind: \"final\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(args.id ? { id: args.id } : {}),\n streamId: args.opId,\n });\n};\n\nexport type ReasonResultAggregation = {\n usage?: KortyxUsage | undefined;\n finishReason?: KortyxFinishReason | undefined;\n providerMetadata?: KortyxProviderMetadata | undefined;\n warnings?: KortyxWarning[] | undefined;\n};\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { combineAbortSignals, throwIfExecutionAborted } from \"@kortyx/core\";\nimport { isControlFlowError, serializeFailure } from \"@kortyx/core/errors\";\nimport type {\n KortyxExecutableTool,\n KortyxFinishReason,\n KortyxPromptMessage,\n KortyxProviderMetadata,\n KortyxToolCall,\n KortyxToolDefinition,\n KortyxToolResult,\n KortyxUsage,\n KortyxWarning,\n} from \"@kortyx/providers\";\nimport { toJSONSchema } from \"zod\";\nimport { accumulateTokenUsage, getHookContext } from \"../context\";\nimport { awaitInterruptInternal } from \"../interrupt\";\nimport {\n interruptControlToolName,\n isInterruptControlToolName,\n isLegacyInterruptContracts,\n normalizeReasonInterrupts,\n} from \"../interrupt-contract\";\nimport {\n isOutputControlToolName,\n outputControlToolName,\n} from \"../output-contract\";\nimport {\n type RunReasonEngineResult,\n resolveProviderOptions,\n} from \"../reason-engine\";\nimport { emitStructuredData, shouldStreamStructured } from \"../structured\";\nimport {\n executeObservedTool,\n observeToolFact,\n replayToolObservations,\n} from \"../tool\";\nimport type { ReasonTraceSpan } from \"../tracing\";\nimport type {\n InterruptContract,\n InterruptContractMap,\n InterruptHistoryEntry,\n OutputContract,\n OutputContractEntry,\n OutputContractMap,\n UseReasonArgs,\n UseReasonResult,\n UseReasonStep,\n} from \"../types\";\nimport { parseWithSchema } from \"../validation\";\nimport { reasonEngine } from \"./engine\";\nimport { inferOutputFormat } from \"./output-format\";\nimport { createStructuredOutputStreamer } from \"./output-stream\";\nimport { parseReasonOutputWithSchema } from \"./parsing\";\nimport { withOutputGuardrails } from \"./prompting\";\nimport {\n emitReasonStructuredOutput,\n mergeProviderMetadata,\n mergeUsage,\n mergeWarnings,\n} from \"./result\";\n\nconst toToolDefinitions = (\n tools: KortyxExecutableTool[],\n): KortyxToolDefinition[] =>\n tools.map((tool) => ({\n name: tool.name,\n ...(tool.title ? { title: tool.title } : {}),\n ...(tool.description ? { description: tool.description } : {}),\n inputSchema: tool.inputSchema,\n ...(tool.outputSchema !== undefined\n ? { outputSchema: tool.outputSchema }\n : {}),\n ...(tool.annotations !== undefined\n ? { annotations: tool.annotations }\n : {}),\n ...(tool.metadata !== undefined ? { metadata: tool.metadata } : {}),\n }));\n\nconst resolveToolExecutionBoolean = (\n value: boolean | Record<string, boolean> | undefined,\n toolName: string,\n fallback: boolean,\n): boolean => {\n if (typeof value === \"boolean\") return value;\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value[toolName] ?? fallback;\n }\n return fallback;\n};\n\nconst normalizeToolResult = (\n toolCall: KortyxToolCall,\n value: KortyxToolResult | unknown,\n): KortyxToolResult => {\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n \"toolCallId\" in value &&\n \"name\" in value &&\n \"content\" in value &&\n typeof value.content === \"string\"\n ) {\n const result = value as KortyxToolResult;\n return { ...result, toolCallId: toolCall.id, name: toolCall.name };\n }\n\n let content: string;\n try {\n content =\n typeof value === \"string\"\n ? value\n : (JSON.stringify(value) ?? String(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 createInitialMessages = (args: {\n system?: string | undefined;\n input: string;\n interruptInstructions?: string | undefined;\n outputInstructions?: string | undefined;\n}): KortyxPromptMessage[] => [\n ...(typeof args.system === \"string\" ||\n args.interruptInstructions ||\n args.outputInstructions\n ? [\n {\n role: \"system\" as const,\n content: [\n args.system,\n args.interruptInstructions,\n args.outputInstructions,\n ]\n .filter((value): value is string => Boolean(value))\n .join(\"\\n\\n\"),\n },\n ]\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 TContracts extends InterruptContractMap = InterruptContractMap,\n TEmit extends OutputContractMap = OutputContractMap,\n TReturn extends OutputContractMap = OutputContractMap,\n>(args: {\n useReasonArgs: UseReasonArgs<\n TOutput,\n TRequest,\n TResponse,\n TContracts,\n TEmit,\n TReturn\n >;\n id?: string | undefined;\n opId: string;\n traceSpan?: ReasonTraceSpan | undefined;\n checkpointKey: string;\n initialWarnings?: KortyxWarning[] | undefined;\n allowValidatedToolOutput?: boolean;\n}): Promise<\n UseReasonResult<TOutput, TResponse, TContracts, TEmit, TReturn>\n> => {\n const { useReasonArgs, id, traceSpan, checkpointKey } = args;\n const ctx = getHookContext();\n const abortSignal = combineAbortSignals(\n ctx.node.abortSignal,\n useReasonArgs.abortSignal,\n useReasonArgs.model.options?.abortSignal,\n );\n const saved = ctx.currentNodeState.byKey[checkpointKey] as\n | ToolLoopCheckpoint\n | undefined;\n const checkpoint = saved?.status === \"tool_loop\" ? saved : undefined;\n const opId = checkpoint?.opId ?? args.opId;\n const tools = useReasonArgs.tools ?? [];\n const interruptConfig = normalizeReasonInterrupts({\n interrupt: useReasonArgs.interrupt,\n interrupts: useReasonArgs.interrupts,\n });\n const interruptByToolName = new Map<\n string,\n { name: string; contract: InterruptContract<unknown, unknown> }\n >();\n const outputByToolName = new Map<\n string,\n {\n name: string;\n kind: \"emit\" | \"return\";\n contract: OutputContract<unknown>;\n stream: boolean;\n }\n >();\n const toolByName = new Map<string, KortyxExecutableTool>();\n let separateOutput = false;\n\n for (const tool of tools) {\n if (\n isInterruptControlToolName(tool.name) ||\n isOutputControlToolName(tool.name)\n )\n throw new Error(\n `useReason tool name \"${tool.name}\" uses a reserved control-tool namespace.`,\n );\n if (toolByName.has(tool.name)) {\n throw new Error(`useReason received duplicate tool name \"${tool.name}\".`);\n }\n toolByName.set(tool.name, tool);\n }\n\n separateOutput = Boolean(\n useReasonArgs.model.provider.getModel(useReasonArgs.model.modelId, {\n ...useReasonArgs.model.options,\n ...(useReasonArgs.reasoning !== undefined\n ? { reasoning: useReasonArgs.reasoning }\n : {}),\n ...(useReasonArgs.responseFormat\n ? { responseFormat: useReasonArgs.responseFormat }\n : {}),\n providerOptions:\n resolveProviderOptions(\n useReasonArgs.model.options?.providerOptions,\n useReasonArgs.providerOptions,\n ) ?? {},\n }).requiresSeparateStructuredOutput,\n );\n\n const interruptDefinitions: KortyxToolDefinition[] = [];\n for (const [name, contract] of Object.entries(\n interruptConfig?.contracts ?? {},\n )) {\n const toolName = interruptControlToolName(name);\n if (toolByName.has(toolName))\n throw new Error(\n `useReason tool name \"${toolName}\" is reserved for interrupt contracts.`,\n );\n let inputSchema: unknown;\n try {\n inputSchema = toJSONSchema(contract.requestSchema as never);\n } catch (error) {\n throw new Error(\n `useReason interrupt contract \"${name}\" requestSchema must support JSON Schema conversion.`,\n { cause: error },\n );\n }\n interruptByToolName.set(toolName, { name, contract });\n interruptDefinitions.push({\n name: toolName,\n title: `Request human input: ${name}`,\n description: [\n contract.description,\n \"Call this only when human input is needed. Execution pauses until the validated response is returned as this tool's result.\",\n ].join(\" \"),\n inputSchema,\n metadata: {\n kortyxControl: \"interrupt\",\n contract: name,\n schemaId: contract.schemaId,\n schemaVersion: contract.schemaVersion,\n },\n });\n }\n const outputDefinitions: KortyxToolDefinition[] = [];\n for (const kind of [\"emit\", \"return\"] as const) {\n for (const [name, contract] of Object.entries(\n useReasonArgs.outputs?.[kind] ?? {},\n )) {\n if (contract.stream) {\n const streamName = outputControlToolName(\n kind === \"emit\" ? \"stream-emit\" : \"stream-return\",\n name,\n );\n outputByToolName.set(streamName, {\n name,\n kind,\n contract,\n stream: true,\n });\n outputDefinitions.push({\n name: streamName,\n title: `Stream structured output: ${name}`,\n description: `${contract.description} Call this to start realtime generation of this structured value. The value is generated in a separate streamed model pass, validated, and ${kind === \"emit\" ? \"returned as a tool result so you can continue\" : \"used to finish this operation\"}.`,\n inputSchema: {\n type: \"object\",\n properties: {\n instruction: {\n type: \"string\",\n description: \"What the streamed output should contain.\",\n },\n },\n required: [\"instruction\"],\n additionalProperties: false,\n },\n metadata: {\n kortyxControl:\n kind === \"emit\" ? \"output.stream.emit\" : \"output.stream.return\",\n contract: name,\n schemaId: contract.schemaId,\n schemaVersion: contract.schemaVersion,\n },\n });\n } else {\n const toolName = outputControlToolName(kind, name);\n outputByToolName.set(toolName, { name, kind, contract, stream: false });\n outputDefinitions.push({\n name: toolName,\n title: `${kind === \"emit\" ? \"Emit\" : \"Return\"} structured output: ${name}`,\n description: `${contract.description} ${kind === \"emit\" ? \"Emit this structured value and continue reasoning.\" : \"Return this structured value and finish reasoning.\"}`,\n inputSchema: toJSONSchema(contract.schema as never),\n metadata: {\n kortyxControl: kind === \"emit\" ? \"output.emit\" : \"output.return\",\n contract: name,\n schemaId: contract.schemaId,\n schemaVersion: contract.schemaVersion,\n },\n });\n }\n }\n }\n const toolDefinitions = [\n ...toToolDefinitions(tools),\n ...interruptDefinitions,\n ...outputDefinitions,\n ];\n let finalizing = checkpoint?.finalizing ?? false;\n let completed = false;\n const maxSteps = Math.max(1, useReasonArgs.toolExecution?.maxSteps ?? 3);\n const messages =\n checkpoint?.messages ??\n createInitialMessages({\n system: useReasonArgs.system,\n input: useReasonArgs.outputSchema\n ? withOutputGuardrails(useReasonArgs.input, useReasonArgs.outputSchema)\n : useReasonArgs.input,\n ...(interruptConfig\n ? {\n interruptInstructions: [\n \"Human-input rules:\",\n \"- The kortyx_request_input__* tools pause this reasoning operation and return the validated human response as a normal tool result.\",\n \"- Call at most one human-input tool in a model turn, and do not combine it with other tool calls in that turn.\",\n interruptConfig.mode === \"required\"\n ? \"- You must call at least one human-input tool before returning the final answer.\"\n : \"- Human input is optional; call a human-input tool only when the request cannot be completed safely without it.\",\n ].join(\"\\n\"),\n }\n : {}),\n ...(useReasonArgs.outputs\n ? {\n outputInstructions: [\n \"Structured output rules:\",\n \"- The kortyx_emit__* tools publish validated structured output and return an acknowledgement. You may continue with text or more tools afterward.\",\n \"- The kortyx_return__* tools publish a validated result and end this reasoning operation. If return tools are available, call exactly one before finishing.\",\n \"- For contracts with realtime streaming, use kortyx_stream_emit__* or kortyx_stream_return__*. These start a separate streamed JSON generation; its fields become visible as tokens arrive.\",\n \"- Call a structured output control tool alone in its model turn.\",\n ].join(\"\\n\"),\n }\n : {}),\n });\n const steps: UseReasonStep[] = checkpoint?.steps ?? [];\n const allToolCalls: KortyxToolCall[] = steps\n .flatMap((step) => step.toolCalls)\n .filter(\n (call) =>\n !interruptByToolName.has(call.name) && !outputByToolName.has(call.name),\n );\n const knownToolCallIds = new Set(\n steps.flatMap((step) => step.toolCalls.map((call) => call.id)),\n );\n const allToolResults: KortyxToolResult[] = steps\n .flatMap((step) => step.toolResults)\n .filter(\n (result) =>\n !interruptByToolName.has(result.name) &&\n !outputByToolName.has(result.name),\n );\n let finalText = \"\";\n let finalRaw: unknown;\n let finalOutput: TOutput | undefined;\n let aggregatedUsage = steps.reduce<KortyxUsage | undefined>(\n (usage, step) => mergeUsage(usage, step.usage),\n undefined,\n );\n let finalFinishReason: KortyxFinishReason | undefined;\n let aggregatedProviderMetadata: KortyxProviderMetadata | undefined;\n let aggregatedWarnings = steps.reduce<KortyxWarning[] | undefined>(\n (warnings, step) => mergeWarnings(warnings, step.warnings),\n args.initialWarnings,\n );\n let pending = checkpoint?.pending;\n let pendingStepIndex = checkpoint?.pendingStepIndex;\n const approvedCalls = checkpoint?.approvedCalls ?? [];\n const interruptHistory = (checkpoint?.interruptHistory ?? []) as Array<\n InterruptHistoryEntry<TContracts>\n >;\n const emissions = (checkpoint?.emissions ??\n []) as OutputContractEntry<TEmit>[];\n let returned = checkpoint?.returned as\n | OutputContractEntry<TReturn>\n | undefined;\n const save = () => {\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"tool_loop\",\n opId,\n messages,\n steps,\n approvedCalls,\n interruptHistory,\n emissions,\n ...(returned ? { returned } : {}),\n finalizing,\n ...(pending ? { pending } : {}),\n ...(pending && pendingStepIndex !== undefined\n ? { pendingStepIndex }\n : {}),\n } satisfies ToolLoopCheckpoint;\n ctx.stateDirty = true;\n };\n\n const emitToolEvent = (\n event: string,\n payload: Record<string, unknown>,\n ): void => {\n ctx.node.emit(event, {\n ...payload,\n node: ctx.node.graph.node,\n ...(id ? { id } : {}),\n opId,\n });\n };\n\n try {\n for (\n let stepIndex = pending\n ? (pendingStepIndex ?? steps.length - 1)\n : steps.length;\n stepIndex < maxSteps;\n stepIndex += 1\n ) {\n throwIfExecutionAborted(abortSignal);\n traceSpan?.addEvent?.(\"useReason.tool-step.start\", {\n stepIndex,\n toolCount: toolDefinitions.length,\n });\n\n const reused = Boolean(pending);\n const stream =\n useReasonArgs.stream ?? useReasonArgs.model.options?.streaming ?? true;\n const emit = useReasonArgs.emit ?? true;\n let textStarted = false;\n const segmentId = `step-${stepIndex}`;\n const structuredChunk =\n useReasonArgs.outputSchema &&\n (!separateOutput || finalizing) &&\n stream &&\n emit &&\n shouldStreamStructured(useReasonArgs.structured)\n ? createStructuredOutputStreamer(useReasonArgs, id, opId)\n : undefined;\n const step =\n pending ??\n (await reasonEngine(\n {\n ...useReasonArgs,\n tools: finalizing ? [] : toolDefinitions,\n ...(separateOutput && !finalizing\n ? { responseFormat: { type: \"text\" as const } }\n : {}),\n messages,\n emit: false,\n stream,\n onTextChunk: (delta) => {\n if (structuredChunk) structuredChunk(delta);\n if (!emit || useReasonArgs.outputSchema || !delta) return;\n if (!textStarted) {\n emitToolEvent(\"text-start\", { segmentId });\n textStarted = true;\n }\n emitToolEvent(\"text-delta\", { delta, segmentId });\n },\n },\n { ...(id ? { id } : {}), opId },\n ));\n\n if (textStarted) emitToolEvent(\"text-end\", { segmentId });\n finalText = step.text;\n finalRaw = step.raw;\n if (!reused) {\n aggregatedUsage = mergeUsage(aggregatedUsage, step.usage);\n accumulateTokenUsage(step.usage);\n }\n finalFinishReason = step.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n step.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, step.warnings);\n\n const toolCalls = step.toolCalls ?? [];\n const ids = new Set<string>();\n for (const call of toolCalls) {\n if (\n !call.id ||\n ids.has(call.id) ||\n (!reused && knownToolCallIds.has(call.id))\n )\n throw new Error(\"Model returned duplicate or empty tool call IDs.\");\n ids.add(call.id);\n }\n const toolResults: KortyxToolResult[] = reused\n ? (steps[stepIndex]?.toolResults ?? [])\n : [];\n if (!reused)\n steps.push({\n stepIndex,\n text: step.text,\n toolCalls,\n toolResults,\n ...(step.usage ? { usage: step.usage } : {}),\n ...(step.finishReason ? { finishReason: step.finishReason } : {}),\n ...(step.providerMetadata\n ? { providerMetadata: step.providerMetadata }\n : {}),\n ...(step.warnings ? { warnings: step.warnings } : {}),\n });\n if (!reused) for (const call of toolCalls) knownToolCallIds.add(call.id);\n\n if (toolCalls.length === 0) {\n if (\n Object.keys(useReasonArgs.outputs?.return ?? {}).length > 0 &&\n !returned\n )\n throw new Error(\n \"useReason outputs.return requires one terminal output contract call.\",\n );\n if (\n interruptConfig?.mode === \"required\" &&\n interruptHistory.length === 0\n )\n throw new Error(\n \"useReason interrupts.mode is required, but the model returned a final answer without requesting human input.\",\n );\n if (separateOutput && !finalizing) {\n if (args.allowValidatedToolOutput && useReasonArgs.outputSchema) {\n try {\n finalOutput = parseReasonOutputWithSchema({\n text: step.text,\n schema: useReasonArgs.outputSchema,\n ...(step.finishReason\n ? { finishReason: step.finishReason }\n : {}),\n ...(aggregatedUsage ? { usage: aggregatedUsage } : {}),\n label: \"useReason output\",\n });\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, [\n {\n type: \"compatibility\",\n feature: \"responseFormat\",\n details:\n \"Reused locally validated tool-phase output without an extra native-schema request. Set responseFormat.schema explicitly to require provider schema enforcement.\",\n },\n ]);\n completed = true;\n break;\n } catch {\n // A schema-only pass can repair a nonconforming draft, within the existing limits.\n }\n }\n messages.push({\n role: \"assistant\",\n content: step.text,\n ...(step.continuation ? { continuation: step.continuation } : {}),\n });\n messages.push({\n role: \"user\",\n content:\n \"Return the final answer using the requested output schema and the tool results above.\",\n });\n finalizing = true;\n pending = undefined;\n pendingStepIndex = undefined;\n save();\n continue;\n }\n completed = true;\n break;\n }\n if (finalizing)\n throw new Error(\n \"Provider requested a tool during schema-only finalization.\",\n );\n\n if (!reused) {\n allToolCalls.push(\n ...toolCalls.filter(\n (call) =>\n !interruptByToolName.has(call.name) &&\n !outputByToolName.has(call.name),\n ),\n );\n messages.push({\n role: \"assistant\",\n content: step.text,\n toolCalls,\n ...(step.continuation ? { continuation: step.continuation } : {}),\n });\n }\n pending = step;\n pendingStepIndex = stepIndex;\n save();\n\n const outputCalls = toolCalls.filter((call) =>\n outputByToolName.has(call.name),\n );\n if (outputCalls.length > 0) {\n if (toolCalls.length !== 1)\n throw new Error(\n \"A useReason output contract call must be the only tool call in its model turn.\",\n );\n const call = outputCalls[0];\n if (!call) throw new Error(\"Missing useReason output control call.\");\n const resolved = outputByToolName.get(call.name);\n if (!resolved)\n throw new Error(\n `Unknown useReason output contract tool \"${call.name}\".`,\n );\n if (toolResults.some((result) => result.toolCallId === call.id)) {\n pending = undefined;\n pendingStepIndex = undefined;\n save();\n continue;\n }\n if (\n resolved.kind === \"emit\" &&\n emissions.length >= (useReasonArgs.outputs?.maxEmissions ?? 16)\n )\n throw new Error(\n `useReason reached outputs.maxEmissions (${useReasonArgs.outputs?.maxEmissions ?? 16}).`,\n );\n let data: unknown;\n if (resolved.stream) {\n if (!stream)\n throw new Error(\n `useReason streaming output contract \"${resolved.name}\" requires stream: true.`,\n );\n if (stepIndex + 1 >= maxSteps)\n throw new Error(\n `useReason output streaming requires another model pass within maxSteps (${maxSteps}).`,\n );\n const instruction =\n call.input &&\n typeof call.input === \"object\" &&\n !Array.isArray(call.input)\n ? (call.input as Record<string, unknown>).instruction\n : undefined;\n if (\n typeof instruction !== \"string\" ||\n instruction.trim().length === 0\n )\n throw new Error(\n `useReason streaming output contract \"${resolved.name}\" requires an instruction.`,\n );\n const streamId = `${opId}:${resolved.kind}:${resolved.name}:${resolved.kind === \"emit\" ? emissions.length : \"return\"}`;\n const structured = {\n dataType: resolved.contract.schemaId,\n schemaId: resolved.contract.schemaId,\n schemaVersion: resolved.contract.schemaVersion,\n fields: resolved.contract.stream?.fields,\n };\n const inferred = inferOutputFormat(\n resolved.contract.schema,\n undefined,\n );\n try {\n const outputStep = await reasonEngine(\n {\n ...useReasonArgs,\n tools: [],\n ...(inferred.responseFormat\n ? { responseFormat: inferred.responseFormat }\n : {}),\n messages: [\n ...messages,\n {\n role: \"tool\",\n toolCallId: call.id,\n name: call.name,\n content: \"Generating the requested structured output.\",\n },\n {\n role: \"user\",\n content: withOutputGuardrails(\n instruction,\n resolved.contract.schema,\n ),\n },\n ],\n emit: false,\n stream,\n ...(emit && stream\n ? {\n onTextChunk: createStructuredOutputStreamer(\n { structured },\n id,\n streamId,\n ),\n }\n : {}),\n },\n { ...(id ? { id } : {}), opId },\n );\n if (outputStep.toolCalls?.length)\n throw new Error(\n `Provider requested a tool during streamed output contract \"${resolved.name}\".`,\n );\n aggregatedUsage = mergeUsage(aggregatedUsage, outputStep.usage);\n accumulateTokenUsage(outputStep.usage);\n aggregatedWarnings = mergeWarnings(\n aggregatedWarnings,\n mergeWarnings(inferred.warnings, outputStep.warnings),\n );\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n outputStep.providerMetadata,\n );\n finalFinishReason = outputStep.finishReason;\n finalRaw = outputStep.raw;\n data = parseReasonOutputWithSchema({\n text: outputStep.text,\n schema: resolved.contract.schema,\n ...(outputStep.finishReason\n ? { finishReason: outputStep.finishReason }\n : {}),\n ...(aggregatedUsage ? { usage: aggregatedUsage } : {}),\n label: `useReason output contract \"${resolved.name}\"`,\n });\n steps.push({\n stepIndex: stepIndex + 1,\n kind: \"output\",\n text: outputStep.text,\n toolCalls: [],\n toolResults: [],\n ...(outputStep.usage ? { usage: outputStep.usage } : {}),\n ...(outputStep.finishReason\n ? { finishReason: outputStep.finishReason }\n : {}),\n ...(outputStep.providerMetadata\n ? { providerMetadata: outputStep.providerMetadata }\n : {}),\n ...(outputStep.warnings ? { warnings: outputStep.warnings } : {}),\n });\n stepIndex += 1;\n } catch (error) {\n traceSpan?.addEvent?.(\"useReason.output.invalidated\", {\n contract: resolved.name,\n kind: resolved.kind,\n schemaId: resolved.contract.schemaId,\n schemaVersion: resolved.contract.schemaVersion,\n streamId,\n });\n if (emit) {\n try {\n ctx.node.emit(\"structured_data_invalidated\", {\n node: ctx.node.graph.node,\n streamId,\n });\n } catch {\n // Reporting must not replace the generation or validation error.\n }\n }\n throw error;\n }\n } else {\n data = parseWithSchema(\n resolved.contract.schema,\n call.input,\n `useReason output contract \"${resolved.name}\"`,\n );\n }\n const entry = { contract: resolved.name, data };\n const emissionIndex = emissions.length;\n if (resolved.kind === \"emit\")\n emissions.push(entry as OutputContractEntry<TEmit>);\n else returned = entry as OutputContractEntry<TReturn>;\n if (emit)\n emitStructuredData({\n kind: \"final\",\n data,\n dataType: resolved.contract.schemaId,\n schemaId: resolved.contract.schemaId,\n schemaVersion: resolved.contract.schemaVersion,\n streamId: `${opId}:${resolved.kind}:${resolved.name}:${resolved.kind === \"emit\" ? emissionIndex : \"return\"}`,\n ...(id ? { id } : {}),\n });\n traceSpan?.addEvent?.(\"useReason.output.emitted\", {\n contract: resolved.name,\n kind: resolved.kind,\n schemaId: resolved.contract.schemaId,\n schemaVersion: resolved.contract.schemaVersion,\n emissionIndex,\n data,\n });\n if (resolved.kind === \"return\") {\n pending = undefined;\n pendingStepIndex = undefined;\n completed = true;\n save();\n break;\n }\n const result = normalizeToolResult(call, { emitted: true, data });\n toolResults.push(result);\n messages.push({\n role: \"tool\",\n content: result.content,\n toolCallId: result.toolCallId,\n name: result.name,\n });\n pending = undefined;\n pendingStepIndex = undefined;\n save();\n continue;\n }\n\n const interruptCalls = toolCalls.filter((call) =>\n interruptByToolName.has(call.name),\n );\n if (interruptCalls.length > 0) {\n if (toolCalls.length !== 1)\n throw new Error(\n \"A useReason interrupt contract call must be the only tool call in its model turn.\",\n );\n const interruptCall = interruptCalls[0];\n if (!interruptCall)\n throw new Error(\"Missing useReason interrupt control call.\");\n if (interruptHistory.length >= (interruptConfig?.maxRequests ?? 1))\n throw new Error(\n `useReason reached interrupts.maxRequests (${interruptConfig?.maxRequests ?? 1}).`,\n );\n const resolved = interruptByToolName.get(interruptCall.name);\n if (!resolved)\n throw new Error(\n `Unknown useReason interrupt contract tool \"${interruptCall.name}\".`,\n );\n if (\n toolResults.some((result) => result.toolCallId === interruptCall.id)\n ) {\n pending = undefined;\n pendingStepIndex = undefined;\n save();\n continue;\n }\n const request = parseWithSchema(\n resolved.contract.requestSchema,\n interruptCall.input,\n `useReason interrupt contract \"${resolved.name}\" request`,\n );\n traceSpan?.addEvent?.(\"useReason.interrupt.requested\", {\n checkpointKey,\n contract: resolved.name,\n interruptIndex: interruptHistory.length,\n });\n const question =\n request &&\n typeof request === \"object\" &&\n !Array.isArray(request) &&\n typeof (request as Record<string, unknown>).question === \"string\"\n ? String((request as Record<string, unknown>).question)\n : undefined;\n const response = await awaitInterruptInternal({\n request: {\n kind: \"custom\",\n request,\n contract: resolved.name,\n ...(question ? { question } : {}),\n schemaId: resolved.contract.schemaId,\n schemaVersion: resolved.contract.schemaVersion,\n },\n responseSchema: resolved.contract.responseSchema,\n id: `${id ?? \"reason\"}:${resolved.name}:${interruptHistory.length + 1}`,\n meta: {\n __kortyxReason: {\n opId,\n stepIndex,\n interruptIndex: interruptHistory.length,\n contract: resolved.name,\n },\n },\n });\n const result = normalizeToolResult(interruptCall, response);\n toolResults.push(result);\n messages.push({\n role: \"tool\",\n content: result.content,\n toolCallId: result.toolCallId,\n name: result.name,\n });\n interruptHistory.push({\n contract: resolved.name,\n request,\n response,\n } as InterruptHistoryEntry<TContracts>);\n traceSpan?.addEvent?.(\"useReason.interrupt.resolved\", {\n checkpointKey,\n contract: resolved.name,\n interruptIndex: interruptHistory.length - 1,\n });\n pending = undefined;\n pendingStepIndex = undefined;\n save();\n continue;\n }\n\n for (const toolCall of toolCalls) {\n if (toolResults.some((result) => result.toolCallId === toolCall.id)) {\n await replayToolObservations(\n steps[stepIndex]?.toolObservations?.filter(\n (observation) =>\n observation.toolCallId === `${opId}:${toolCall.id}`,\n ) ?? [],\n );\n continue;\n }\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 if (shouldEmitTool) {\n emitToolEvent(\"tool-call-start\", {\n tool: tool.name,\n toolCallId: toolCall.id,\n input: toolCall.input,\n });\n }\n\n if (shouldApproveTool && !approvedCalls.includes(toolCall.id)) {\n await observeToolFact(\n {\n version: 1,\n name: tool.name,\n toolCallId: `${opId}:${toolCall.id}`,\n attemptId: `${opId}:${toolCall.id}:approval`,\n callingMode: \"model\",\n executed: false,\n },\n \"waiting\",\n );\n const approval = await awaitInterruptInternal({\n id: `tool:${toolCall.id}`,\n request: {\n kind: \"choice\",\n question: `Approve ${tool.name}?`,\n options: [\n { id: \"approve\", label: \"Approve\" },\n { id: \"deny\", label: \"Deny\" },\n ],\n },\n meta: {\n tool: tool.name,\n toolCallId: toolCall.id,\n input: toolCall.input,\n },\n });\n\n const approved = Array.isArray(approval)\n ? approval.includes(\"approve\")\n : approval === \"approve\";\n\n if (!approved) {\n const deniedObservation = {\n version: 1 as const,\n name: tool.name,\n toolCallId: `${opId}:${toolCall.id}`,\n attemptId: `${opId}:${toolCall.id}:approval`,\n callingMode: \"model\" as const,\n executed: false,\n outcome: \"denied\" as const,\n denialCode: \"APPROVAL_DENIED\",\n };\n await observeToolFact(deniedObservation);\n const entry = steps[stepIndex];\n if (entry) {\n entry.toolObservations ??= [];\n entry.toolObservations.push(deniedObservation);\n }\n const denied = {\n toolCallId: toolCall.id,\n name: tool.name,\n content: \"Tool call denied by user.\",\n isError: true,\n } satisfies KortyxToolResult;\n toolResults.push(denied);\n allToolResults.push(denied);\n if (shouldEmitTool) {\n emitToolEvent(\"tool-call-result\", {\n tool: tool.name,\n toolCallId: toolCall.id,\n content: denied.content,\n isError: true,\n });\n }\n messages.push({\n role: \"tool\",\n content: denied.content,\n toolCallId: denied.toolCallId,\n name: denied.name,\n isError: true,\n });\n save();\n continue;\n }\n approvedCalls.push(toolCall.id);\n save();\n }\n\n try {\n throwIfExecutionAborted(abortSignal);\n const rawResult = await executeObservedTool({\n tool,\n input: toolCall.input,\n toolCallId: `${opId}:${toolCall.id}`,\n providerToolCallId: toolCall.id,\n callingMode: \"model\",\n abortSignal,\n onObservation: (observation) => {\n const entry = steps[stepIndex];\n if (entry) {\n entry.toolObservations ??= [];\n entry.toolObservations.push(observation);\n save();\n }\n },\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 } catch (error) {\n throwIfExecutionAborted(abortSignal);\n if (isControlFlowError(error)) throw error;\n const result = {\n toolCallId: toolCall.id,\n name: tool.name,\n content: serializeFailure(error).message,\n failure: serializeFailure(error),\n isError: true,\n } satisfies KortyxToolResult;\n toolResults.push(result);\n allToolResults.push(result);\n if (shouldEmitTool) {\n emitToolEvent(\"tool-call-error\", {\n tool: tool.name,\n toolCallId: toolCall.id,\n message: result.content,\n failure: result.failure,\n });\n }\n }\n const completed = toolResults.at(-1);\n if (completed)\n messages.push({\n role: \"tool\",\n content: completed.content,\n toolCallId: completed.toolCallId,\n name: completed.name,\n ...(completed.isError !== undefined\n ? { isError: completed.isError }\n : {}),\n });\n save();\n }\n\n pending = undefined;\n pendingStepIndex = undefined;\n save();\n }\n\n if (!completed) {\n throw new Error(\n `useReason tool loop reached maxSteps (${maxSteps}) before producing a final response.`,\n );\n }\n\n if (useReasonArgs.outputSchema && finalOutput === undefined) {\n finalOutput = parseReasonOutputWithSchema({\n text: finalText,\n schema: useReasonArgs.outputSchema,\n ...(finalFinishReason ? { finishReason: finalFinishReason } : {}),\n ...(aggregatedUsage ? { usage: aggregatedUsage } : {}),\n label: \"useReason output\",\n });\n }\n\n if (finalOutput !== undefined) {\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: finalOutput,\n structured: useReasonArgs.structured,\n emit: useReasonArgs.emit ?? true,\n });\n }\n\n const result = {\n ...(id ? { id } : {}),\n opId,\n text: useReasonArgs.outputs\n ? steps\n .filter((step) => step.kind !== \"output\")\n .map((step) => step.text)\n .filter(Boolean)\n .join(\"\\n\")\n : 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 ...(emissions.length ? { emissions } : {}),\n ...(returned ? { returned } : {}),\n ...(interruptHistory.length > 0 ? { interruptHistory } : {}),\n ...(isLegacyInterruptContracts(interruptConfig) &&\n interruptHistory.length > 0\n ? {\n interruptResponse: interruptHistory.at(-1)?.response as TResponse,\n }\n : {}),\n } satisfies UseReasonResult<TOutput, TResponse, TContracts>;\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 interruptCount: interruptHistory.length,\n emissionCount: emissions.length,\n ...(returned ? { returnContract: returned.contract } : {}),\n },\n telemetry: {\n ...(useReasonArgs.telemetry ?? {}),\n output:\n useReasonArgs.telemetry?.output ??\n returned?.data ??\n finalOutput ??\n finalText,\n },\n });\n\n ctx.currentNodeState.byKey[checkpointKey] = { status: \"completed\", result };\n ctx.stateDirty = true;\n return result;\n } catch (error) {\n try {\n traceSpan?.fail?.(error, {\n attributes: {\n toolStepCount: steps.length,\n toolCallCount: allToolCalls.length,\n },\n });\n } catch {\n /* Reporting must not replace the execution failure. */\n }\n throw error;\n }\n};\n\ninterface ToolLoopCheckpoint {\n status: \"tool_loop\";\n opId: string;\n messages: KortyxPromptMessage[];\n steps: UseReasonStep[];\n pending?: RunReasonEngineResult;\n pendingStepIndex?: number;\n approvedCalls: string[];\n interruptHistory?: Array<{\n contract: string;\n request: unknown;\n response: unknown;\n }>;\n emissions?: Array<{ contract: string; data: unknown }>;\n returned?: { contract: string; data: unknown };\n finalizing?: boolean;\n}\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { getHookContext } from \"./context\";\nimport { awaitInterruptInternal } from \"./interrupt\";\nimport { defineInterruptContract } from \"./interrupt-contract\";\nimport { defineOutputContract } from \"./output-contract\";\nimport { useReason as useReasonInternal } from \"./reason/use-reason\";\nimport { emitStructuredData } from \"./structured\";\nimport type {\n InterruptContractMap,\n OutputContractMap,\n UseContractInterruptArgs,\n UseContractStructuredDataArgs,\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonResult,\n UseStructuredDataArgs,\n} from \"./types\";\nimport { parseWithSchema } from \"./validation\";\n\nexport { defineInterruptContract, defineOutputContract };\n\nexport type {\n InterruptContract,\n InterruptContractMap,\n InterruptHistoryEntry,\n OutputContract,\n OutputContractEntry,\n OutputContractMap,\n SchemaLike,\n StructuredDataKind,\n UseContractInterruptArgs,\n UseContractStructuredDataArgs,\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonInterruptConfig,\n UseReasonInterruptsConfig,\n UseReasonOutputsConfig,\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>(\n args: UseContractStructuredDataArgs<TData>,\n): void;\nexport function useStructuredData<TData = unknown>(\n args: UseStructuredDataArgs<TData>,\n): void;\nexport function useStructuredData<TData>(\n args: UseStructuredDataArgs<TData> | UseContractStructuredDataArgs<TData>,\n): void {\n if (\"contract\" in args) {\n const contract = defineOutputContract(args.contract);\n const base = {\n dataType: contract.schemaId,\n schemaId: contract.schemaId,\n schemaVersion: contract.schemaVersion,\n ...(args.id ? { id: args.id } : {}),\n ...(args.streamId ? { streamId: args.streamId } : {}),\n };\n if (\n args.kind === \"set\" ||\n args.kind === \"append\" ||\n args.kind === \"text-delta\"\n ) {\n if (contract.stream?.fields[args.path] !== args.kind)\n throw new Error(\n `Output contract does not allow ${args.kind} at \"${args.path}\".`,\n );\n if (args.kind === \"set\")\n emitStructuredData({\n ...base,\n kind: \"set\",\n path: args.path,\n value: args.value,\n ...(args.valueSchema ? { valueSchema: args.valueSchema } : {}),\n });\n else if (args.kind === \"append\")\n emitStructuredData({\n ...base,\n kind: \"append\",\n path: args.path,\n items: args.items,\n ...(args.itemSchema ? { itemSchema: args.itemSchema } : {}),\n });\n else\n emitStructuredData({\n ...base,\n kind: \"text-delta\",\n path: args.path,\n delta: args.delta,\n });\n return;\n }\n emitStructuredData({\n ...base,\n kind: \"final\",\n data: args.data,\n dataSchema: contract.schema,\n });\n return;\n }\n emitStructuredData(args);\n}\n\nexport function useReason<\n TOutput = unknown,\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n TContracts extends InterruptContractMap = InterruptContractMap,\n TEmit extends OutputContractMap = OutputContractMap,\n TReturn extends OutputContractMap = OutputContractMap,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse, TContracts, TEmit, TReturn>,\n): Promise<UseReasonResult<TOutput, TResponse, TContracts, TEmit, TReturn>> {\n return useReasonInternal(args);\n}\n\nexport function useInterrupt<TRequest, TResponse>(\n args: UseContractInterruptArgs<TRequest, TResponse>,\n): Promise<TResponse>;\nexport function useInterrupt<\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(args: UseInterruptArgs<TRequest, TResponse>): Promise<TResponse>;\nexport function useInterrupt(\n args:\n | UseContractInterruptArgs<unknown, unknown>\n | UseInterruptArgs<InterruptInput, InterruptResult>,\n): Promise<unknown> {\n if (\"contract\" in args) {\n const contract = defineInterruptContract(args.contract);\n return awaitInterruptInternal({\n request: {\n kind: \"custom\",\n request: parseWithSchema(\n contract.requestSchema,\n args.request,\n \"useInterrupt contract request\",\n ),\n schemaId: contract.schemaId,\n schemaVersion: contract.schemaVersion,\n ...(args.id ? { id: args.id } : {}),\n ...(args.meta ? { meta: args.meta } : {}),\n },\n responseSchema: contract.responseSchema,\n });\n }\n return awaitInterruptInternal(args);\n}\n\n/** Live execution signal for cooperative I/O. Never store it in workflow state. */\nexport function useAbortSignal(): AbortSignal | undefined {\n return getHookContext().node.abortSignal;\n}\n\nexport function useRuntimeContext<\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(): TContext {\n const ctx = getHookContext();\n const config = ctx.state.config;\n const context =\n config && typeof config === \"object\" && \"context\" in config\n ? (config as { context?: unknown }).context\n : undefined;\n\n return context && typeof context === \"object\" && !Array.isArray(context)\n ? (context as TContext)\n : ({} as TContext);\n}\n\nexport function useNodeState<T>(initialValue: T): [T, StateSetter<T>] {\n const ctx = getHookContext();\n const nodeState = ctx.currentNodeState;\n\n const index = ctx.nodeStateIndex++;\n if (index >= nodeState.byIndex.length) {\n nodeState.byIndex[index] = initialValue as T;\n ctx.stateDirty = true;\n }\n\n const getValue = () => nodeState.byIndex[index] as T;\n const setValue: StateSetter<T> = (next) => {\n const prev = getValue();\n const resolved =\n typeof next === \"function\" ? (next as (p: T) => T)(prev) : next;\n nodeState.byIndex[index] = resolved;\n ctx.stateDirty = true;\n };\n\n return [getValue(), setValue];\n}\n\nexport function useWorkflowState<T>(\n key: string,\n ...rest: [] | [T]\n): [T, StateSetter<T>] {\n const ctx = getHookContext();\n const workflowState = ctx.workflowState;\n const hasInitial = rest.length > 0;\n const initialValue = rest[0];\n\n if (!Object.hasOwn(workflowState, key) && hasInitial) {\n workflowState[key] = initialValue as T;\n ctx.stateDirty = true;\n }\n\n const getValue = () => workflowState[key] as T;\n const setValue: StateSetter<T> = (next) => {\n const prev = getValue();\n const resolved =\n typeof next === \"function\" ? (next as (p: T) => T)(prev) : next;\n workflowState[key] = resolved;\n ctx.stateDirty = true;\n };\n\n return [getValue(), setValue];\n}\n","import {\n isExecutionCancelled,\n isExecutionLimitReached,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport { type FailureDescriptor, serializeFailure } from \"@kortyx/core/errors\";\nimport { getHookContext } from \"./context\";\nimport { awaitInterruptInternal } from \"./interrupt\";\nimport type { CallRecord } from \"./workflow\";\n\ntype ParallelRecord = {\n version: 1;\n calls: string[];\n interrupts: Array<{ callId: string; index: number }>;\n};\n\nexport type ParallelGroup = {\n key: string;\n record: ParallelRecord;\n restored: boolean;\n ready: Promise<void>;\n};\n\nexport type WorkflowTask = {\n id: string;\n group?: ParallelGroup;\n done: Promise<void>;\n finish: () => void;\n completed: boolean;\n};\n\n/** Internal control flow: the child snapshot is ready for its owning join. */\nexport class ParallelChildWaiting extends Error {\n override name = \"ParallelChildWaiting\";\n}\n\n/** All siblings have settled; results retain the order passed to parallel(). */\nexport class ParallelError extends AggregateError {\n readonly code = \"PARALLEL_FAILED\";\n readonly failure: FailureDescriptor;\n toJSON(): FailureDescriptor {\n return serializeFailure(this);\n }\n constructor(\n public readonly results: readonly PromiseSettledResult<unknown>[],\n ) {\n super(\n results.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n ),\n \"One or more parallel operations failed.\",\n );\n this.name = \"ParallelError\";\n this.failure = serializeFailure({\n version: 1,\n code: this.code,\n category: \"workflow\",\n message: this.message,\n retryable: null,\n results: results.map((result) =>\n result.status === \"fulfilled\"\n ? { status: \"fulfilled\" }\n : { status: \"rejected\", failure: serializeFailure(result.reason) },\n ),\n });\n }\n}\n\nexport function registerWorkflowTask(id: string): WorkflowTask {\n const ctx = getHookContext();\n if (ctx.workflowControlError) throw ctx.workflowControlError;\n if (ctx.workflowContextClosed)\n throw new Error(\"The workflow node activation has finished.\");\n const group = ctx.parallelGroup;\n if (group?.restored && !group.record.calls.includes(id)) {\n throw new Error(`Parallel call membership changed during replay: '${id}'.`);\n }\n let finish!: () => void;\n const task: WorkflowTask = {\n id,\n ...(group ? { group } : {}),\n completed: false,\n done: new Promise<void>((resolve) => {\n finish = resolve;\n }),\n finish: () => {\n task.completed = true;\n finish();\n },\n };\n ctx.workflowTasks.push(task);\n if (group && !group.record.calls.includes(id)) group.record.calls.push(id);\n return task;\n}\n\n/** Join concurrent child calls, preserving their snapshots before suspending. */\nexport function parallel<const T extends readonly unknown[]>(\n values: T,\n): Promise<{ -readonly [K in keyof T]: Awaited<T[K]> }> {\n // Observe inputs immediately, including when context/group validation rejects.\n const settled = Promise.allSettled(values);\n let ctx: ReturnType<typeof getHookContext>;\n try {\n ctx = getHookContext();\n } catch (error) {\n return Promise.reject(error);\n }\n const join = async () => {\n if (ctx.workflowControlError) throw ctx.workflowControlError;\n if (ctx.parallelGroup)\n throw new Error(\n \"Await each parallel group before starting another in the same node.\",\n );\n const key = `__parallel:${ctx.parallelIndex++}`;\n const saved = ctx.currentNodeState.byKey[key] as\n | ParallelRecord\n | null\n | undefined;\n const tasks = ctx.workflowTasks.filter(\n (task) => !task.completed && !task.group,\n );\n const ids = tasks.map((task) => task.id);\n if (\n saved &&\n (saved.version !== 1 || ids.some((id) => !saved.calls.includes(id)))\n ) {\n throw new Error(\"Parallel call membership changed during replay.\");\n }\n const group: ParallelGroup = {\n key,\n record: saved ?? { version: 1, calls: ids, interrupts: [] },\n restored: Boolean(saved),\n ready: Promise.resolve(),\n };\n ctx.currentNodeState.byKey[key] = group.record;\n ctx.stateDirty = true;\n ctx.parallelGroup = group;\n for (const task of tasks) task.group = group;\n const callRecord = (id: string) =>\n ctx.currentNodeState.byKey[`__useWorkflow:${id}`] as\n | CallRecord\n | undefined;\n const bridge = async (callId: string, index: number) => {\n const interruption = callRecord(callId)?.interrupts[index];\n if (!interruption)\n throw new Error(\n \"Parallel interrupt history does not match the saved child.\",\n );\n try {\n interruption.response = await awaitInterruptInternal({\n request: interruption.request,\n ...(interruption.request.meta\n ? { meta: interruption.request.meta }\n : {}),\n });\n } catch (error) {\n ctx.workflowControlError = error;\n throw error;\n }\n };\n group.ready = (async () => {\n // One deterministic parent interrupt journal, independent of child finish order.\n for (const entry of group.record.interrupts)\n await bridge(entry.callId, entry.index);\n })();\n try {\n // Even a replay suspension must settle every already-created child promise.\n const [ready, outcomes] = await Promise.all([\n Promise.allSettled([group.ready]),\n settled,\n ]);\n // Also own calls made by asynchronous custom-hook wrappers in this group.\n let drained = -1;\n while (drained !== ctx.workflowTasks.length) {\n drained = ctx.workflowTasks.length;\n await Promise.all(\n ctx.workflowTasks\n .filter((task) => task.group === group)\n .map((task) => task.done),\n );\n }\n if (ready[0]?.status === \"rejected\") throw ready[0].reason;\n throwIfExecutionAborted(ctx.node.abortSignal);\n if (ctx.workflowControlError) throw ctx.workflowControlError;\n const rejected = outcomes.filter(\n (outcome) => outcome.status === \"rejected\",\n );\n const control = rejected.find(\n (outcome) =>\n isExecutionCancelled(outcome.reason) ||\n isExecutionLimitReached(outcome.reason),\n );\n if (control) {\n ctx.workflowControlError = control.reason;\n throw control.reason;\n }\n const actual = ctx.workflowTasks\n .filter((task) => task.group === group)\n .map((task) => task.id);\n if (\n group.record.calls.length !== actual.length ||\n group.record.calls.some((id) => !actual.includes(id))\n ) {\n throw new Error(\"Parallel call membership changed during replay.\");\n }\n for (const callId of group.record.calls) {\n const record = callRecord(callId);\n if (record?.status !== \"interrupted\") continue;\n const index = record.interrupts.length - 1;\n if (record.interrupts[index]?.response !== undefined) continue;\n group.record.interrupts.push({ callId, index });\n await bridge(callId, index);\n // An unseen interrupt suspends; it must not become a partial result.\n throw new Error(\n \"Parallel interrupt unexpectedly resumed without replay.\",\n );\n }\n if (rejected.length) throw new ParallelError(outcomes);\n return outcomes.map(\n (outcome) => (outcome as PromiseFulfilledResult<unknown>).value,\n ) as { -readonly [K in keyof T]: Awaited<T[K]> };\n } finally {\n ctx.parallelGroup = undefined;\n }\n };\n const promise = join();\n ctx.parallelJoins.push(promise);\n // The node owns this join even if user code forgets to await it.\n void promise.catch(() => {});\n return promise;\n}\n","import { getReasonTraceAdapter } from \"./context\";\nimport type { ReportErrorOptions } from \"./tracing\";\n\n/** Reports a handled error to the configured observer without stopping execution. */\nexport function reportError(\n error: unknown,\n options: ReportErrorOptions = {},\n): void {\n try {\n getReasonTraceAdapter()?.reportError?.(error, options);\n } catch {\n // Observability must never participate in workflow execution.\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n InterruptInput,\n TokenUsage,\n WorkflowDefinition,\n} from \"@kortyx/core\";\nimport {\n isExecutionCancelled,\n isExecutionLimitReached,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport {\n type FailureDescriptor,\n KortyxError,\n serializeFailure,\n WorkflowContractError,\n} from \"@kortyx/core/errors\";\nimport type { ToolObservation } from \"@kortyx/providers\";\nimport type { z } from \"zod\";\nimport { accumulateTokenUsage, getHookContext } from \"./context\";\nimport { awaitInterruptInternal } from \"./interrupt\";\nimport {\n ParallelChildWaiting,\n registerWorkflowTask,\n type WorkflowTask,\n} from \"./parallel\";\nimport { rememberToolObservation, replayToolObservations } from \"./tool\";\nimport { emitWorkflowCall, workflowCallContent } from \"./workflow-telemetry\";\n\nexport type WorkflowCallOutcome =\n | {\n status: \"completed\";\n data: Record<string, unknown>;\n toolObservations?: ToolObservation[];\n usage?: TokenUsage | undefined;\n }\n | {\n status: \"interrupted\";\n request: InterruptInput;\n snapshot: unknown;\n usage?: TokenUsage | undefined;\n };\n\nexport type WorkflowCallService = (args: {\n id: string;\n workflow: string;\n input: unknown;\n snapshot?: unknown;\n definition?: WorkflowDefinition | undefined;\n invocationId: string;\n response?: string | string[] | undefined;\n callerNodeExecutionId?: string | undefined;\n}) => Promise<WorkflowCallOutcome>;\n\nexport type CallRecord = {\n restoredToolBranch?: string;\n toolObservations?: ToolObservation[];\n parallelKey?: string;\n usage?: TokenUsage;\n fingerprint: string;\n sequence?: number;\n telemetry?: Record<string, unknown>;\n invocationId: string;\n status: \"running\" | \"interrupted\" | \"completed\" | \"failed\";\n snapshot?: unknown;\n data?: Record<string, unknown>;\n error?: string;\n failure?: FailureDescriptor;\n interrupts: Array<{ request: InterruptInput; response?: string | string[] }>;\n};\n\nexport class WorkflowCallError extends KortyxError {\n constructor(\n public readonly workflow: string,\n message: string,\n cause?: unknown,\n failure?: FailureDescriptor,\n ) {\n const detail = serializeFailure(\n failure ?? cause ?? new WorkflowContractError(message),\n );\n super(detail.code, `Workflow '${workflow}': ${message}`, {\n ...detail,\n safeMessage: detail.message,\n ...(cause !== undefined ? { cause } : {}),\n });\n Object.assign(this.failure, detail, {\n context: { ...detail.context, workflow },\n });\n this.name = \"WorkflowCallError\";\n }\n}\n\n// Canonicalize JSON so object insertion order cannot change call identity.\nexport function workflowCallFingerprint(value: unknown): string {\n const seen = new Set<object>();\n const canonical = (v: unknown): unknown => {\n if (v === null || typeof v === \"string\" || typeof v === \"boolean\") return v;\n if (typeof v === \"number\" && Number.isFinite(v)) return v;\n if (typeof v !== \"object\" || !v || seen.has(v)) {\n throw new WorkflowContractError(\n \"Workflow input and output must be JSON serializable.\",\n );\n }\n if (!Array.isArray(v) && Object.getPrototypeOf(v) !== Object.prototype) {\n throw new WorkflowContractError(\n \"Workflow input and output must contain plain JSON objects.\",\n );\n }\n seen.add(v);\n const result = Array.isArray(v)\n ? v.map(canonical)\n : Object.fromEntries(\n Object.keys(v)\n .sort()\n .map((key) => [\n key,\n canonical((v as Record<string, unknown>)[key]),\n ]),\n );\n seen.delete(v);\n return result;\n };\n return JSON.stringify(canonical(value));\n}\n\ntype SchematizedWorkflow = WorkflowDefinition & {\n inputSchema: z.ZodType;\n outputSchema: z.ZodType<Record<string, unknown>>;\n};\n\n/** Bind string workflow ids to the same definitions registered with the agent. */\nexport function createWorkflowHooks<\n const W extends Record<string, SchematizedWorkflow>,\n>(workflows: W) {\n return {\n useWorkflow: <K extends keyof W & string>(args: {\n id: string;\n workflow: K;\n input: z.input<W[K][\"inputSchema\"]>;\n }): Promise<{ data: z.output<W[K][\"outputSchema\"]> }> => {\n const workflow = workflows[args.workflow];\n if (!workflow || workflow.id !== args.workflow)\n throw new WorkflowContractError(\n \"Workflow registry keys must match definition ids.\",\n );\n return useWorkflow({ ...args, workflow }) as Promise<{\n data: z.output<W[K][\"outputSchema\"]>;\n }>;\n },\n };\n}\n\n/** Typed references avoid caller-supplied result type assertions. */\nexport function useWorkflow<W extends SchematizedWorkflow>(args: {\n id: string;\n workflow: W;\n input: z.input<W[\"inputSchema\"]>;\n}): Promise<{ data: z.output<W[\"outputSchema\"]> }>;\nexport function useWorkflow(args: {\n id: string;\n workflow: string;\n input: unknown;\n}): Promise<{ data: Record<string, unknown> }>;\nexport async function useWorkflow(args: {\n id: string;\n workflow: string | SchematizedWorkflow;\n input: unknown;\n}): Promise<{ data: Record<string, unknown> }> {\n const task = registerWorkflowTask(args.id);\n try {\n // Give the enclosing parallel([...]) call a chance to claim the eager calls.\n await Promise.resolve();\n if (task.group) await task.group.ready;\n return await runWorkflowCall(args, task);\n } catch (error) {\n if (isExecutionCancelled(error) || isExecutionLimitReached(error))\n getHookContext().workflowControlError = error;\n throw error;\n } finally {\n task.finish();\n }\n}\n\nasync function runWorkflowCall(\n args: {\n id: string;\n workflow: string | SchematizedWorkflow;\n input: unknown;\n },\n task: WorkflowTask,\n): Promise<{ data: Record<string, unknown> }> {\n const ctx = getHookContext();\n throwIfExecutionAborted(ctx.node.abortSignal);\n const service = ctx.node.callWorkflow;\n if (!service)\n throw new WorkflowContractError(\n \"useWorkflow requires an agent workflow registry.\",\n );\n if (!args.id.trim())\n throw new WorkflowContractError(\n \"useWorkflow requires a stable, nonempty id.\",\n );\n if (ctx.workflowCallActive && !task.group)\n throw new WorkflowContractError(\n \"Concurrent workflow calls require parallel([...]); otherwise await each call.\",\n );\n if (ctx.workflowCallIds.has(args.id))\n throw new WorkflowContractError(\n `Duplicate workflow call id '${args.id}' in one node activation.`,\n );\n if (ctx.workflowCallIds.size >= 64)\n throw new WorkflowContractError(\n \"A node may call at most 64 child workflows per activation.\",\n );\n ctx.workflowCallIds.add(args.id);\n const definition =\n typeof args.workflow === \"string\" ? undefined : args.workflow;\n const workflow = definition?.id ?? (args.workflow as string);\n const input = args.input;\n const fingerprint = workflowCallFingerprint({\n workflow,\n input,\n version: definition?.version ?? null,\n });\n const key = `__useWorkflow:${args.id}`;\n let record = ctx.currentNodeState.byKey[key] as CallRecord | undefined;\n if (record && record.parallelKey !== task.group?.key)\n throw new WorkflowCallError(\n workflow,\n \"parallel call membership changed during replay\",\n );\n if (record && record.fingerprint !== fingerprint)\n throw new WorkflowCallError(\n workflow,\n \"call input or target changed during replay\",\n );\n if (!record) ctx.node.consumeExecution?.(\"maxChildInvocations\");\n record ??= {\n fingerprint,\n invocationId: randomUUID(),\n status: \"running\",\n interrupts: [],\n ...(task.group ? { parallelKey: task.group.key } : {}),\n };\n ctx.currentNodeState.byKey[key] = record;\n ctx.stateDirty = true;\n if (!task.group) ctx.workflowCallActive = true;\n const telemetry = ctx.node.workflowCallTelemetry;\n const activationKey = \"__useWorkflowActivation\";\n ctx.currentNodeState.byKey[activationKey] ??= randomUUID();\n const callerNodeExecutionId = ctx.currentNodeState.byKey[\n activationKey\n ] as string;\n const metadata = {\n invocationId: record.invocationId,\n parentInvocationId: telemetry?.correlation?.invocationId ?? null,\n branchId:\n telemetry?.correlation?.branchId ??\n telemetry?.correlation?.runId ??\n \"unknown\",\n callId: args.id,\n callerNodeId: ctx.node.graph.node,\n callerNodeExecutionId,\n sourceWorkflowId: ctx.node.graph.name,\n targetWorkflowId: workflow,\n targetVersion: definition?.version ?? null,\n };\n record.telemetry = metadata;\n const report = (\n status:\n | \"started\"\n | \"suspended\"\n | \"resumed\"\n | \"completed\"\n | \"failed\"\n | \"reused\",\n content: Record<string, unknown> = {},\n ) => {\n record.sequence = (record.sequence ?? 0) + 1;\n emitWorkflowCall(telemetry, `workflow.call.${status}`, {\n ...metadata,\n sequence: record.sequence,\n ...content,\n });\n };\n const recordUsage = (usage: TokenUsage | undefined) => {\n if (!usage) return;\n accumulateTokenUsage({\n input: usage.input - (record.usage?.input ?? 0),\n output: usage.output - (record.usage?.output ?? 0),\n total: usage.total - (record.usage?.total ?? 0),\n });\n record.usage = usage;\n };\n const cached = record.status === \"completed\";\n\n try {\n // Replay every bridged interrupt, even for a completed call. The parent\n // graph assigns resume values by interrupt position within its node.\n for (const interruption of task.group ? [] : record.interrupts) {\n interruption.response = await awaitInterruptInternal({\n request: interruption.request,\n ...(interruption.request.meta\n ? { meta: interruption.request.meta }\n : {}),\n });\n }\n if (record.status === \"failed\")\n throw new WorkflowCallError(\n workflow,\n record.error ?? \"child failed\",\n undefined,\n record.failure ?? serializeFailure(undefined),\n );\n if (\n task.group &&\n record.status === \"interrupted\" &&\n record.interrupts.at(-1)?.response === undefined\n )\n throw new ParallelChildWaiting();\n while (record.status !== \"completed\") {\n let outcome: WorkflowCallOutcome;\n try {\n report(\n record.snapshot ? \"resumed\" : \"started\",\n workflowCallContent(telemetry, \"input\", input),\n );\n outcome = await service({\n callerNodeExecutionId,\n id: args.id,\n workflow,\n input,\n definition,\n invocationId: record.invocationId,\n ...(record.snapshot ? { snapshot: record.snapshot } : {}),\n ...(record.interrupts.length\n ? { response: record.interrupts.at(-1)?.response }\n : {}),\n });\n } catch (error) {\n const child = error as {\n __kortyxChildSnapshot?: unknown;\n __kortyxChildUsage?: TokenUsage;\n } | null;\n recordUsage(child?.__kortyxChildUsage);\n throwIfExecutionAborted(ctx.node.abortSignal);\n if (isExecutionCancelled(error)) throw error;\n if (isExecutionLimitReached(error)) {\n if (child?.__kortyxChildSnapshot)\n record.snapshot = child.__kortyxChildSnapshot;\n report(\"suspended\", {\n reason: \"limit_reached\",\n limit: error.limitReached,\n });\n throw error;\n }\n record.status = \"failed\";\n record.failure = serializeFailure(error);\n record.error = record.failure.message;\n report(\"failed\", { error: \"Child workflow failed\" });\n throw new WorkflowCallError(\n workflow,\n record.error,\n error,\n record.failure,\n );\n }\n throwIfExecutionAborted(ctx.node.abortSignal);\n // Child totals survive suspension; count only newly reported work.\n recordUsage(outcome.usage);\n if (outcome.status === \"completed\") {\n // Validate cached and live outputs against the caller's actual contract.\n record.data = outcome.data;\n workflowCallFingerprint(record.data);\n record.status = \"completed\";\n record.toolObservations = outcome.toolObservations ?? [];\n for (const observation of record.toolObservations)\n rememberToolObservation(observation);\n delete record.snapshot;\n report(\n \"completed\",\n workflowCallContent(telemetry, \"output\", record.data),\n );\n } else {\n record.status = \"interrupted\";\n record.snapshot = outcome.snapshot;\n report(\"suspended\", {\n leaf: outcome.request.meta?.workflowCall ?? null,\n });\n const interruption: CallRecord[\"interrupts\"][number] = {\n request: outcome.request,\n };\n record.interrupts.push(interruption);\n if (task.group) throw new ParallelChildWaiting();\n interruption.response = await awaitInterruptInternal({\n request: interruption.request,\n ...(interruption.request.meta\n ? { meta: interruption.request.meta }\n : {}),\n });\n }\n }\n if (cached) {\n report(\"reused\", workflowCallContent(telemetry, \"output\", record.data));\n if (record.restoredToolBranch !== telemetry?.correlation?.branchId)\n await replayToolObservations(record.toolObservations ?? [], true);\n delete record.restoredToolBranch;\n }\n const data = record.data ?? {};\n return {\n data: JSON.parse(JSON.stringify(data)) as Record<string, unknown>,\n };\n } finally {\n if (!task.group) ctx.workflowCallActive = false;\n }\n}\n"],"mappings":"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","names":["useReason","result","import_zod","import_core","import_node_async_hooks","import_node_crypto","import_core","import_errors","import_telemetry_contracts","import_errors","import_node_crypto","error","import_node_crypto","import_core","import_node_crypto","import_core","import_errors","tools","response","result","createRuntimeId","import_zod","import_errors","isRecord","import_zod","tryStringify","import_core","import_errors","import_zod","tools","result","completed","createRuntimeId","useReason","import_core","import_errors","import_node_crypto","import_core","import_errors"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/complete-response.ts","../src/context.ts","../src/interrupt.ts","../src/reason/checkpoint.ts","../src/validation.ts","../src/interrupt-contract.ts","../src/output-contract.ts","../src/structured-path.ts","../src/reason/use-reason.ts","../src/safe-tracing.ts","../src/structured.ts","../src/tool.ts","../src/error-diagnostics.ts","../src/diagnostic-capture.ts","../src/workflow-telemetry.ts","../src/reason/engine.ts","../src/reason-engine.ts","../src/reason/output-format.ts","../src/reason/structured-stream.ts","../src/reason/output-stream.ts","../src/reason/parsing.ts","../src/reason/prompting.ts","../src/reason/result.ts","../src/reason/tools.ts","../src/hooks.ts","../src/parallel.ts","../src/report-error.ts","../src/workflow.ts"],"sourcesContent":["// release-test: 2026-01-22\n/**\n * @kortyx/hooks\n *\n * Internal hook implementations resolved via async-local context.\n */\n\nexport {\n type CompleteResponseOptions,\n completeResponse,\n} from \"./complete-response\";\nexport type { HookRuntimeContext } from \"./context\";\nexport { runWithHookContext } from \"./context\";\nexport type {\n InterruptContract,\n InterruptContractMap,\n InterruptHistoryEntry,\n OutputContract,\n OutputContractEntry,\n OutputContractMap,\n UseContractInterruptArgs,\n UseContractStructuredDataArgs,\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonInterruptConfig,\n UseReasonInterruptsConfig,\n UseReasonOutputsConfig,\n UseReasonResult,\n UseReasonStep,\n UseReasonToolExecution,\n UseStructuredDataArgs,\n} from \"./hooks\";\nexport {\n defineInterruptContract,\n defineOutputContract,\n useAbortSignal,\n useInterrupt,\n useNodeState,\n useReason,\n useRuntimeContext,\n useStructuredData,\n useWorkflowState,\n} from \"./hooks\";\nexport { ParallelError, parallel } from \"./parallel\";\nexport { reportError } from \"./report-error\";\nexport type { UseToolArgs } from \"./tool\";\nexport { useTool } from \"./tool\";\nexport type {\n EnsureWorkflowTopologyRequest,\n EnsureWorkflowTopologyResponse,\n KortyxErrorDetails,\n KortyxTelemetryConfig,\n KortyxTelemetryContentCapture,\n KortyxTelemetryCorrelation,\n KortyxTelemetryEvent,\n KortyxTelemetryEventType,\n KortyxTelemetryPrompt,\n KortyxTelemetryReporter,\n KortyxTelemetryService,\n KortyxTraceAdapter,\n KortyxTraceErrorProjection,\n KortyxTraceMetadata,\n ReasonTraceAdapter,\n ReasonTraceAttributes,\n ReasonTraceSpan,\n ReasonTraceSpanEndArgs,\n ReasonTraceSpanStartArgs,\n ReportErrorOptions,\n} from \"./tracing\";\nexport type { WorkflowCallOutcome, WorkflowCallService } from \"./workflow\";\nexport {\n createWorkflowHooks,\n useWorkflow,\n WorkflowCallError,\n workflowCallFingerprint,\n} from \"./workflow\";\nexport { emitWorkflowCall } from \"./workflow-telemetry\";\n","import { z } from \"zod\";\nimport { getHookContext, snapshotHookState } from \"./context\";\n\nexport type CompleteResponseOptions = {\n message?: string | undefined;\n data?: unknown;\n};\n\nconst optionsSchema = z\n .object({\n message: z.string().optional(),\n data: z.json().optional(),\n })\n .strict();\n\n/** Finish client delivery, leaving the node and workflow execution running. */\nexport async function completeResponse(\n options: CompleteResponseOptions = {},\n): Promise<void> {\n const ctx = getHookContext();\n const parsed = optionsSchema.parse(options);\n if (!ctx.node.completeResponse) {\n throw new Error(\n \"completeResponse requires an agent-managed root workflow.\",\n );\n }\n await ctx.node.completeResponse(parsed, snapshotHookState());\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type {\n GraphState,\n InterruptInput,\n InterruptResumeValue,\n NodeConfig,\n TokenUsage,\n} from \"@kortyx/core\";\nimport type { KortyxUsage } from \"@kortyx/providers\";\nimport type { ParallelGroup, WorkflowTask } from \"./parallel\";\nimport type { KortyxTelemetryConfig, ReasonTraceAdapter } from \"./tracing\";\nimport type { WorkflowCallService } from \"./workflow\";\n\ntype NodeStateStore = {\n byIndex: unknown[];\n byKey: Record<string, unknown>;\n};\n\ntype HookRuntimeState = {\n nodeState?: Record<string, unknown>;\n workflowState?: Record<string, unknown>;\n};\n\ntype StoredNodeStateEnvelope = {\n nodeId?: unknown;\n state?: unknown;\n};\n\ntype HookStatePatchedError = {\n __kortyxHookStatePatch?: Record<string, unknown>;\n};\n\nexport type HookNodeRuntimeContext = {\n completeResponse?:\n | ((\n options: import(\"./complete-response\").CompleteResponseOptions,\n state: GraphState,\n ) => Promise<void>)\n | undefined;\n /** Transient execution control; never part of checkpointed state. */\n abortSignal?: AbortSignal | undefined;\n consumeExecution?:\n | ((limit: import(\"@kortyx/core\").ExecutionLimit) => void)\n | undefined;\n graph: {\n name: string;\n node: string;\n };\n config: NodeConfig;\n emit: (event: string, payload: unknown) => void;\n awaitInterrupt: (args: InterruptInput) => InterruptResumeValue;\n /** Consume an already-resolved engine interrupt when a durable hook skips it. */\n replayInterrupt?: ((args: InterruptInput) => void) | undefined;\n callWorkflow?: WorkflowCallService;\n workflowCallTelemetry?: KortyxTelemetryConfig | undefined;\n};\n\nexport type HookRuntimeContext = {\n node: HookNodeRuntimeContext;\n state: GraphState;\n reasonTrace?: ReasonTraceAdapter | undefined;\n};\n\ntype HookInternalContext = HookRuntimeContext & {\n workflowCallActive: boolean;\n workflowCallIds: Set<string>;\n workflowTasks: WorkflowTask[];\n parallelJoins: Promise<unknown>[];\n parallelGroup: ParallelGroup | undefined;\n parallelIndex: number;\n workflowControlError?: unknown;\n workflowContextClosed: boolean;\n nodeStateIndex: number;\n reasonCallIndex: number;\n toolCallIndex: number;\n currentNodeState: NodeStateStore;\n workflowState: Record<string, unknown>;\n tokenUsage?: TokenUsage | undefined;\n stateDirty: boolean;\n runtimeDirty: boolean;\n};\n\nconst storage = new AsyncLocalStorage<HookInternalContext>();\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst normalizeNodeState = (value: unknown): NodeStateStore => {\n if (Array.isArray(value)) {\n return { byIndex: [...value], byKey: {} };\n }\n\n if (isRecord(value)) {\n const byIndex = Array.isArray(value.byIndex) ? [...value.byIndex] : [];\n const byKey = isRecord(value.byKey) ? { ...value.byKey } : {};\n return { byIndex, byKey };\n }\n\n return { byIndex: [], byKey: {} };\n};\n\nconst cloneWorkflowState = (value: unknown): Record<string, unknown> =>\n isRecord(value) ? { ...value } : {};\n\nconst cloneTokenUsage = (value: unknown): TokenUsage | undefined => {\n if (!isRecord(value)) return undefined;\n const input = typeof value.input === \"number\" ? value.input : undefined;\n const output = typeof value.output === \"number\" ? value.output : undefined;\n const total = typeof value.total === \"number\" ? value.total : undefined;\n if (input === undefined && output === undefined && total === undefined) {\n return undefined;\n }\n return {\n input: input ?? 0,\n output: output ?? 0,\n total: total ?? 0,\n };\n};\n\nconst getHookRuntimeState = (state: GraphState): HookRuntimeState => {\n const runtime = (state.runtime ?? {}) as Record<string, unknown>;\n const internal = isRecord(runtime.__kortyx) ? runtime.__kortyx : undefined;\n const result: HookRuntimeState = {};\n if (isRecord(internal?.nodeState)) result.nodeState = internal?.nodeState;\n if (isRecord(internal?.workflowState)) {\n result.workflowState = internal?.workflowState;\n }\n return result;\n};\n\nconst createInternalContext = (\n ctx: HookRuntimeContext,\n): HookInternalContext => {\n const hookRuntimeState = getHookRuntimeState(ctx.state);\n const nodeId = ctx.node.graph.node;\n const storedNodeState = isRecord(hookRuntimeState.nodeState)\n ? (hookRuntimeState.nodeState as StoredNodeStateEnvelope)\n : undefined;\n const storedNodeId =\n typeof storedNodeState?.nodeId === \"string\"\n ? String(storedNodeState.nodeId)\n : \"\";\n const storedState = storedNodeState?.state;\n const currentNodeState =\n storedNodeId && storedNodeId === nodeId\n ? normalizeNodeState(storedState)\n : { byIndex: [], byKey: {} };\n\n return {\n ...ctx,\n workflowCallActive: false,\n workflowCallIds: new Set(),\n workflowTasks: [],\n parallelJoins: [],\n parallelGroup: undefined,\n parallelIndex: 0,\n workflowContextClosed: false,\n nodeStateIndex: 0,\n reasonCallIndex: 0,\n toolCallIndex: 0,\n currentNodeState,\n workflowState: cloneWorkflowState(hookRuntimeState.workflowState),\n tokenUsage: cloneTokenUsage(ctx.state.runtime?.tokenUsage),\n stateDirty: false,\n runtimeDirty: false,\n };\n};\n\nconst buildRuntimeStateUpdates = (ctx: HookInternalContext) => {\n const updates: Record<string, unknown> = {};\n\n if (ctx.stateDirty) {\n updates.__kortyx = {\n nodeState: {\n nodeId: ctx.node.graph.node,\n state: ctx.currentNodeState,\n },\n workflowState: ctx.workflowState,\n };\n }\n\n if (ctx.runtimeDirty && ctx.tokenUsage) {\n updates.tokenUsage = ctx.tokenUsage;\n }\n\n return Object.keys(updates).length > 0 ? updates : null;\n};\n\nconst cleanupCompletedReasonCheckpoints = (ctx: HookInternalContext): void => {\n let changed = false;\n\n for (const [key, value] of Object.entries(ctx.currentNodeState.byKey)) {\n if (!key.startsWith(\"__useReason:\")) continue;\n if (!isRecord(value) || value.status !== \"completed\") continue;\n delete ctx.currentNodeState.byKey[key];\n changed = true;\n }\n\n if (changed) ctx.stateDirty = true;\n};\n\nconst toTokenUsageDelta = (\n usage: KortyxUsage | undefined,\n): TokenUsage | undefined => {\n if (!usage) return undefined;\n\n const input = usage.input ?? 0;\n const output = usage.output ?? 0;\n const total =\n usage.total ??\n input +\n output +\n (usage.outputIncludesReasoning ? 0 : (usage.reasoning ?? 0));\n\n if (input === 0 && output === 0 && total === 0) {\n return undefined;\n }\n\n return {\n input,\n output,\n total,\n };\n};\n\nexport function accumulateTokenUsage(usage: KortyxUsage | undefined): void {\n const delta = toTokenUsageDelta(usage);\n if (!delta) return;\n\n const ctx = getHookContext();\n const current = ctx.tokenUsage ?? {\n input: 0,\n output: 0,\n total: 0,\n };\n\n ctx.tokenUsage = {\n input: current.input + delta.input,\n output: current.output + delta.output,\n total: current.total + delta.total,\n };\n ctx.runtimeDirty = true;\n}\n\nexport function getReasonTraceAdapter(): ReasonTraceAdapter | undefined {\n return getHookContext().reasonTrace;\n}\n\nexport async function runWithHookContext<T>(\n ctx: HookRuntimeContext,\n fn: () => Promise<T>,\n): Promise<{ result: T; runtimeUpdates: Record<string, unknown> | null }> {\n const internal = createInternalContext(ctx);\n try {\n const result = await storage.run(internal, async () => {\n const drain = async () => {\n let drained = -1;\n while (\n drained !==\n internal.parallelJoins.length + internal.workflowTasks.length\n ) {\n drained =\n internal.parallelJoins.length + internal.workflowTasks.length;\n await Promise.allSettled(internal.parallelJoins);\n await Promise.all(internal.workflowTasks.map((task) => task.done));\n }\n internal.workflowContextClosed = true;\n };\n try {\n const result = await fn();\n await drain();\n if (internal.workflowControlError) throw internal.workflowControlError;\n return result;\n } catch (error) {\n await drain();\n throw internal.workflowControlError ?? error;\n }\n });\n cleanupCompletedReasonCheckpoints(internal);\n for (const key of Object.keys(internal.currentNodeState.byKey)) {\n if (key.startsWith(\"__useTool:\")) {\n delete internal.currentNodeState.byKey[key];\n internal.stateDirty = true;\n }\n }\n for (const key of Object.keys(internal.currentNodeState.byKey)) {\n if (\n key.startsWith(\"__useWorkflow:\") ||\n key.startsWith(\"__parallel:\") ||\n key === \"__useWorkflowActivation\"\n ) {\n internal.currentNodeState.byKey[key] = null;\n internal.stateDirty = true;\n }\n }\n return { result, runtimeUpdates: buildRuntimeStateUpdates(internal) };\n } catch (err) {\n const runtimeUpdates = buildRuntimeStateUpdates(internal);\n if (runtimeUpdates) {\n const currentRuntime = isRecord(internal.state.runtime)\n ? (internal.state.runtime as Record<string, unknown>)\n : {};\n internal.state.runtime = {\n ...currentRuntime,\n ...runtimeUpdates,\n } as unknown as GraphState[\"runtime\"];\n if (err && typeof err === \"object\") {\n (err as HookStatePatchedError).__kortyxHookStatePatch = runtimeUpdates;\n }\n }\n throw err;\n }\n}\n\nexport function getHookContext(): HookInternalContext {\n const ctx = storage.getStore();\n if (!ctx) {\n throw new Error(\"Hooks can only be used while a node is executing.\");\n }\n return ctx;\n}\n\n/** Include hook state already written in this node, excluding future node returns. */\nexport function snapshotHookState(): GraphState {\n const ctx = getHookContext();\n return {\n ...ctx.state,\n lastNode: ctx.node.graph.node,\n runtime: { ...ctx.state.runtime, ...buildRuntimeStateUpdates(ctx) },\n };\n}\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { throwIfExecutionAborted } from \"@kortyx/core\";\nimport { getHookContext } from \"./context\";\nimport { resolveHookStatePatch } from \"./reason/checkpoint\";\nimport type { UseInterruptArgs } from \"./types\";\nimport { parseWithSchema } from \"./validation\";\n\nexport const awaitInterruptInternal = <\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(\n args: UseInterruptArgs<TRequest, TResponse> & {\n onResolved?: ((request: InterruptInput) => void) | undefined;\n },\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 if (args.onResolved) {\n // The resume patch includes this journal; retaining it would recursively\n // embed all earlier checkpoints inside each subsequent interrupt.\n const { __kortyxResumeStatePatch: _patch, ...meta } =\n enrichedRequest.meta ?? {};\n args.onResolved({ ...enrichedRequest, meta });\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 resolvedInterrupts?: InterruptInput[];\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 ...(Array.isArray(value.resolvedInterrupts)\n ? { resolvedInterrupts: value.resolvedInterrupts as InterruptInput[] }\n : {}),\n };\n};\n\nexport const resolveHookStatePatch = (args: {\n nodeId: string;\n currentNodeState: unknown;\n workflowState: Record<string, unknown>;\n}): Record<string, unknown> => ({\n __kortyx: {\n nodeState: {\n nodeId: args.nodeId,\n state: args.currentNodeState,\n },\n workflowState: args.workflowState,\n },\n});\n","import { ValidationError } from \"@kortyx/core/errors\";\nimport type { SchemaLike } from \"./types\";\n\nexport const parseWithSchema = <T>(\n schema: SchemaLike<T> | undefined,\n value: unknown,\n label: string,\n): T => {\n if (!schema) return value as T;\n\n const parsed = schema.safeParse(value);\n if (parsed.success) return parsed.data;\n\n const parsedError =\n \"error\" in parsed && parsed.error ? parsed.error : undefined;\n const reason =\n typeof parsedError?.message === \"string\" && parsedError.message.length > 0\n ? parsedError.message\n : \"invalid payload\";\n throw new ValidationError(\n label === \"useReason output\" ? \"MODEL_OUTPUT_SCHEMA\" : \"SCHEMA_VALIDATION\",\n `${label} validation failed: ${reason}`,\n parsedError,\n );\n};\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport type {\n InterruptContract,\n InterruptContractMap,\n UseReasonInterruptConfig,\n UseReasonInterruptsConfig,\n} from \"./types\";\n\nconst CONTROL_TOOL_PREFIX = \"kortyx_request_input__\";\nconst LEGACY_CONTRACT_NAME = \"default\";\nlet legacyWarningEmitted = false;\nconst legacyConfigs = new WeakSet<object>();\n\nexport const defineInterruptContract = <TRequest, TResponse>(\n contract: InterruptContract<TRequest, TResponse>,\n): InterruptContract<TRequest, TResponse> => {\n if (!contract || typeof contract !== \"object\")\n throw new Error(\"defineInterruptContract requires a contract object.\");\n for (const [field, value] of [\n [\"description\", contract.description],\n [\"schemaId\", contract.schemaId],\n [\"schemaVersion\", contract.schemaVersion],\n ] as const)\n if (typeof value !== \"string\" || value.trim().length === 0)\n throw new Error(\n `Interrupt contract ${field} must be a non-empty string.`,\n );\n if (typeof contract.requestSchema?.safeParse !== \"function\")\n throw new Error(\n \"Interrupt contract requestSchema must provide safeParse(value).\",\n );\n if (typeof contract.responseSchema?.safeParse !== \"function\")\n throw new Error(\n \"Interrupt contract responseSchema must provide safeParse(value).\",\n );\n return contract;\n};\n\nexport const interruptControlToolName = (name: string): string =>\n `${CONTROL_TOOL_PREFIX}${name}`;\n\nexport const isInterruptControlToolName = (name: string): boolean =>\n name.startsWith(CONTROL_TOOL_PREFIX);\n\nexport const assertInterruptContractName = (name: string): void => {\n if (!/^[A-Za-z][A-Za-z0-9_-]*$/.test(name))\n throw new Error(\n `Invalid useReason interrupt contract name \"${name}\". Use letters, numbers, underscores, or hyphens, starting with a letter.`,\n );\n if (interruptControlToolName(name).length > 64)\n throw new Error(\n `useReason interrupt contract name \"${name}\" is too long for a provider tool name.`,\n );\n};\n\nexport const warnLegacyUseReasonInterrupt = (): void => {\n if (legacyWarningEmitted) return;\n legacyWarningEmitted = true;\n process.emitWarning(\n \"useReason({ interrupt }) is deprecated and will be removed in the next major release. Define an interrupt contract with defineInterruptContract() and pass it through useReason({ interrupts: { contracts } }). See docs/internal/next-major-removals.md.\",\n {\n code: \"KORTYX_USE_REASON_INTERRUPT_DEPRECATED\",\n type: \"DeprecationWarning\",\n },\n );\n};\n\nexport const normalizeReasonInterrupts = <\n TRequest extends InterruptInput,\n TResponse,\n>(args: {\n interrupt?: UseReasonInterruptConfig<TRequest, TResponse> | undefined;\n interrupts?: UseReasonInterruptsConfig<InterruptContractMap> | undefined;\n}): UseReasonInterruptsConfig<InterruptContractMap> | undefined => {\n if (args.interrupt && args.interrupts)\n throw new Error(\n \"useReason cannot receive both deprecated `interrupt` and `interrupts`. Migrate the legacy configuration to an interrupt contract.\",\n );\n if (args.interrupts) {\n for (const [name, contract] of Object.entries(args.interrupts.contracts)) {\n assertInterruptContractName(name);\n defineInterruptContract(contract);\n }\n if (Object.keys(args.interrupts.contracts).length === 0)\n throw new Error(\"useReason interrupts.contracts cannot be empty.\");\n if (\n args.interrupts.maxRequests !== undefined &&\n (!Number.isInteger(args.interrupts.maxRequests) ||\n args.interrupts.maxRequests < 1)\n )\n throw new Error(\"useReason interrupts.maxRequests must be at least 1.\");\n return args.interrupts;\n }\n if (!args.interrupt) return undefined;\n\n warnLegacyUseReasonInterrupt();\n const normalized: UseReasonInterruptsConfig<InterruptContractMap> = {\n mode: args.interrupt.mode,\n maxRequests: 1,\n contracts: {\n [LEGACY_CONTRACT_NAME]: {\n description:\n \"Ask the user for the additional information required to complete this request.\",\n requestSchema: args.interrupt.requestSchema,\n responseSchema:\n args.interrupt.responseSchema ??\n ({\n safeParse: (value: unknown) => ({\n success: true as const,\n data: value as InterruptResult,\n }),\n } satisfies InterruptContract<\n InterruptInput,\n InterruptResult\n >[\"responseSchema\"]),\n schemaId: args.interrupt.schemaId ?? \"kortyx.legacy-interrupt\",\n schemaVersion: args.interrupt.schemaVersion ?? \"1\",\n },\n },\n };\n legacyConfigs.add(normalized);\n return normalized;\n};\n\nexport const isLegacyInterruptContracts = (\n config: UseReasonInterruptsConfig<InterruptContractMap> | undefined,\n): boolean => Boolean(config && legacyConfigs.has(config));\n","import { toJSONSchema } from \"zod\";\nimport { assertStructuredPath } from \"./structured-path\";\nimport type {\n OutputContract,\n OutputContractMap,\n UseReasonOutputsConfig,\n} from \"./types\";\n\nconst EMIT_PREFIX = \"kortyx_emit__\";\nconst RETURN_PREFIX = \"kortyx_return__\";\nconst STREAM_EMIT_PREFIX = \"kortyx_stream_emit__\";\nconst STREAM_RETURN_PREFIX = \"kortyx_stream_return__\";\nlet legacyOutputWarningEmitted = false;\n\nexport const warnLegacyReasonOutput = (): void => {\n if (legacyOutputWarningEmitted) return;\n legacyOutputWarningEmitted = true;\n process.emitWarning(\n \"useReason({ outputSchema, structured }) and result.output are deprecated and will be removed in the next major release. Define reusable contracts with defineOutputContract() and pass them through useReason({ outputs }). See docs/internal/next-major-removals.md.\",\n { code: \"KORTYX_USE_REASON_OUTPUT_DEPRECATED\", type: \"DeprecationWarning\" },\n );\n};\n\nexport const defineOutputContract = <TData>(\n contract: OutputContract<TData>,\n): OutputContract<TData> => {\n if (!contract || typeof contract !== \"object\")\n throw new Error(\"defineOutputContract requires a contract object.\");\n for (const [field, value] of [\n [\"description\", contract.description],\n [\"schemaId\", contract.schemaId],\n [\"schemaVersion\", contract.schemaVersion],\n ] as const)\n if (typeof value !== \"string\" || value.trim().length === 0)\n throw new Error(`Output contract ${field} must be a non-empty string.`);\n if (typeof contract.schema?.safeParse !== \"function\")\n throw new Error(\"Output contract schema must provide safeParse(value).\");\n if (contract.stream) {\n if (\n !contract.stream.fields ||\n Object.keys(contract.stream.fields).length === 0\n )\n throw new Error(\"Output contract stream.fields must not be empty.\");\n for (const [path, mode] of Object.entries(contract.stream.fields)) {\n assertStructuredPath(path, \"Output contract stream.fields\");\n if (!([\"set\", \"append\", \"text-delta\"] as unknown[]).includes(mode))\n throw new Error(`Invalid output contract stream mode for \"${path}\".`);\n }\n }\n return contract;\n};\n\nexport const outputControlToolName = (\n kind: \"emit\" | \"return\" | \"stream-emit\" | \"stream-return\",\n name: string,\n): string =>\n `${kind === \"emit\" ? EMIT_PREFIX : kind === \"return\" ? RETURN_PREFIX : kind === \"stream-emit\" ? STREAM_EMIT_PREFIX : STREAM_RETURN_PREFIX}${name}`;\n\nexport const isOutputControlToolName = (name: string): boolean =>\n name.startsWith(EMIT_PREFIX) ||\n name.startsWith(RETURN_PREFIX) ||\n name.startsWith(STREAM_EMIT_PREFIX) ||\n name.startsWith(STREAM_RETURN_PREFIX);\n\nexport const normalizeReasonOutputs = (\n config:\n | UseReasonOutputsConfig<OutputContractMap, OutputContractMap>\n | undefined,\n hasLegacyOutput: boolean,\n): typeof config => {\n if (!config) return undefined;\n if (hasLegacyOutput)\n throw new Error(\n \"useReason cannot combine `outputs` with deprecated `outputSchema` or `structured`.\",\n );\n const entries = [\n ...Object.entries(config.emit ?? {}).map(([name, contract]) => ({\n name,\n contract,\n kind: \"emit\" as const,\n })),\n ...Object.entries(config.return ?? {}).map(([name, contract]) => ({\n name,\n contract,\n kind: \"return\" as const,\n })),\n ];\n if (entries.length === 0)\n throw new Error(\n \"useReason outputs must include at least one emit or return contract.\",\n );\n for (const { name, contract, kind } of entries) {\n if (\n !/^[A-Za-z][A-Za-z0-9_-]*$/.test(name) ||\n outputControlToolName(kind, name).length > 64\n )\n throw new Error(`Invalid useReason output contract name \"${name}\".`);\n defineOutputContract(contract);\n if (contract.schema[\"~kortyx\"]?.nativeOutput === true)\n throw new Error(\n `useReason output contract \"${name}\" uses a provider-native output schema that cannot be selected through tools. Continue using outputSchema for this provider until a non-tool contract path is available.`,\n );\n if (\n contract.stream &&\n outputControlToolName(\n kind === \"emit\" ? \"stream-emit\" : \"stream-return\",\n name,\n ).length > 64\n )\n throw new Error(\n `Invalid useReason output contract name \"${name}\" for streaming tools.`,\n );\n try {\n const json = toJSONSchema(contract.schema as never);\n if (json.type !== \"object\")\n throw new Error(\"The tool input schema must have an object root.\");\n } catch (error) {\n throw new Error(\n `useReason output contract \"${name}\" schema must support JSON Schema conversion.`,\n { cause: error },\n );\n }\n }\n if (\n config.maxEmissions !== undefined &&\n (!Number.isInteger(config.maxEmissions) || config.maxEmissions < 1)\n )\n throw new Error(\"useReason outputs.maxEmissions must be at least 1.\");\n return config;\n};\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 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 { normalizeReasonInterrupts } from \"../interrupt-contract\";\nimport {\n normalizeReasonOutputs,\n warnLegacyReasonOutput,\n} from \"../output-contract\";\nimport { withSafeTraceSpan } from \"../safe-tracing\";\nimport { shouldStreamStructured } from \"../structured\";\nimport { closeOwnedTools, replayToolObservations } from \"../tool\";\nimport type {\n InterruptContractMap,\n OutputContractMap,\n SchemaLike,\n UseReasonArgs,\n UseReasonResult,\n} from \"../types\";\nimport { parseWithSchema } from \"../validation\";\nimport {\n type ReasonInterruptCheckpoint,\n readReasonCheckpoint,\n readReasonCompletedCheckpoint,\n resolveHookStatePatch,\n resolveReasonCheckpointKey,\n} from \"./checkpoint\";\nimport { createRuntimeId, reasonEngine } from \"./engine\";\nimport { inferOutputFormat } from \"./output-format\";\nimport { createStructuredOutputStreamer } from \"./output-stream\";\nimport {\n parseInterruptFirstPassResult,\n parseReasonOutputWithSchema,\n} from \"./parsing\";\nimport {\n defaultContinuationInput,\n defaultInterruptFirstPassInput,\n withOutputGuardrails,\n withStructuredStreamHints,\n} from \"./prompting\";\nimport {\n emitReasonStructuredOutput,\n mergeProviderMetadata,\n mergeUsage,\n mergeWarnings,\n} from \"./result\";\nimport {\n resolveAppendFieldPaths,\n resolveSetFieldPaths,\n resolveTextDeltaFieldPaths,\n} from \"./structured-stream\";\nimport { runReasonToolLoop } from \"./tools\";\n\nconst shouldStreamReasonStructured = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n TContracts extends InterruptContractMap,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse, TContracts>,\n): boolean => (args.emit ?? true) && shouldStreamStructured(args.structured);\n\nconst usesNativeOutput = (schema: SchemaLike<unknown> | undefined): boolean =>\n schema?.[\"~kortyx\"]?.nativeOutput === true;\n\nconst resolveEffectiveReasoningIncludeThoughts = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n TContracts extends InterruptContractMap,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse, TContracts>,\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 TContracts extends InterruptContractMap,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse, TContracts>,\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.interrupts) ||\n Boolean(args.structured) ||\n Boolean(args.outputs) ||\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\nasync function runReason<\n TOutput = unknown,\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n TContracts extends InterruptContractMap = InterruptContractMap,\n TEmit extends OutputContractMap = OutputContractMap,\n TReturn extends OutputContractMap = OutputContractMap,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse, TContracts, TEmit, TReturn>,\n): Promise<UseReasonResult<TOutput, TResponse, TContracts, TEmit, TReturn>> {\n assertReasoningThoughtsCompatibility(args);\n normalizeReasonOutputs(\n args.outputs,\n Boolean(args.outputSchema || args.structured),\n );\n if (args.outputSchema || args.structured) warnLegacyReasonOutput();\n if (args.outputs && resolveEffectiveResponseFormatType(args) === \"json\")\n throw new Error(\n \"useReason output contracts use tool calls and cannot be combined with JSON responseFormat.\",\n );\n const interruptConfig = normalizeReasonInterrupts({\n interrupt: args.interrupt,\n interrupts: args.interrupts,\n });\n const ctx = getHookContext();\n const abortSignal = combineAbortSignals(\n ctx.node.abortSignal,\n args.abortSignal,\n args.model.options?.abortSignal,\n );\n throwIfExecutionAborted(abortSignal);\n const allowValidatedToolOutput = Boolean(\n args.outputSchema &&\n !(args.responseFormat ?? args.model.options?.responseFormat),\n );\n const inferred = inferOutputFormat(\n args.outputSchema,\n args.responseFormat ?? args.model.options?.responseFormat,\n );\n const usesLegacyNoToolInterrupt = Boolean(\n args.interrupt && !args.interrupts && !args.tools?.length,\n );\n args = {\n ...args,\n abortSignal,\n ...(!usesLegacyNoToolInterrupt && inferred.responseFormat\n ? { responseFormat: inferred.responseFormat }\n : {}),\n };\n const id =\n typeof args.id === \"string\" && args.id.length > 0 ? args.id : undefined;\n const provisionalOpId = createRuntimeId();\n const checkpointKey = resolveReasonCheckpointKey({\n ...(id ? { id } : {}),\n autoIndex: ctx.reasonCallIndex++,\n });\n const checkpointValue = ctx.currentNodeState.byKey[checkpointKey];\n const opId =\n checkpointValue &&\n typeof checkpointValue === \"object\" &&\n \"status\" in checkpointValue &&\n checkpointValue.status === \"tool_loop\" &&\n \"opId\" in checkpointValue &&\n typeof checkpointValue.opId === \"string\"\n ? checkpointValue.opId\n : provisionalOpId;\n const existingCompleted = readReasonCompletedCheckpoint(checkpointValue);\n\n if (existingCompleted) {\n for (const request of existingCompleted.resolvedInterrupts ?? [])\n ctx.node.replayInterrupt?.(request);\n await replayToolObservations(\n existingCompleted.result.steps?.flatMap(\n (step) => step.toolObservations ?? [],\n ) ?? [],\n );\n return existingCompleted.result as unknown as UseReasonResult<\n TOutput,\n TResponse,\n TContracts,\n TEmit,\n TReturn\n >;\n }\n\n const existingCheckpoint = readReasonCheckpoint(checkpointValue);\n\n const reasonMeta =\n typeof id === \"string\" ? ({ id, opId } as const) : ({ opId } as const);\n return withSafeTraceSpan(\n getReasonTraceAdapter(),\n {\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(interruptConfig),\n interruptContractCount: Object.keys(interruptConfig?.contracts ?? {})\n .length,\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 async (traceSpan) => {\n // New contracts always use the durable tool loop. The deprecated\n // no-tools form keeps its checkpoint reader so in-flight legacy runs can\n // resume during the deprecation window; legacy + tools is normalized to\n // the new control-tool runtime.\n if (\n (args.tools?.length || args.interrupts || args.outputs) &&\n !existingCheckpoint\n ) {\n return runReasonToolLoop({\n useReasonArgs: args,\n allowValidatedToolOutput,\n checkpointKey,\n initialWarnings: inferred.warnings,\n ...(id ? { id } : {}),\n opId,\n ...(traceSpan ? { traceSpan } : {}),\n });\n }\n const suppressTextStream = Boolean(args.outputSchema || args.interrupt);\n const setFieldPaths = resolveSetFieldPaths(args.structured);\n const appendFieldPaths = resolveAppendFieldPaths(args.structured);\n const textDeltaFieldPaths = resolveTextDeltaFieldPaths(args.structured);\n const useStructuredIncrementalStreaming = Boolean(\n args.outputSchema &&\n !args.interrupt &&\n (setFieldPaths.length > 0 ||\n appendFieldPaths.length > 0 ||\n textDeltaFieldPaths.length > 0) &&\n args.stream !== false &&\n shouldStreamReasonStructured(args),\n );\n\n let firstText = \"\";\n let firstRaw: unknown;\n let firstOutput: TOutput | undefined;\n let firstInterruptRequest: TRequest | undefined;\n let firstInterruptRequired = false;\n\n let finalText = \"\";\n let finalRaw: unknown;\n let finalOutput: TOutput | undefined;\n let aggregatedUsage: KortyxUsage | undefined;\n let finalFinishReason: KortyxFinishReason | undefined;\n let aggregatedProviderMetadata: KortyxProviderMetadata | undefined;\n let aggregatedWarnings: KortyxWarning[] | undefined = inferred.warnings;\n\n if (existingCheckpoint) {\n firstText = existingCheckpoint.firstText;\n firstRaw = existingCheckpoint.firstRaw;\n firstOutput = existingCheckpoint.firstOutput as TOutput | undefined;\n finalText = firstText;\n finalRaw = firstRaw;\n finalOutput = firstOutput;\n aggregatedUsage = existingCheckpoint.firstUsage;\n finalFinishReason = existingCheckpoint.firstFinishReason;\n aggregatedProviderMetadata = existingCheckpoint.firstProviderMetadata;\n aggregatedWarnings = existingCheckpoint.firstWarnings;\n traceSpan?.addEvent?.(\"useReason.resume\", {\n checkpointKey,\n });\n } else {\n const first = await reasonEngine(\n {\n ...args,\n emit: suppressTextStream ? false : args.emit,\n stream: useStructuredIncrementalStreaming\n ? true\n : suppressTextStream\n ? false\n : args.stream,\n ...(useStructuredIncrementalStreaming\n ? {\n onTextChunk: createStructuredOutputStreamer(args, id, opId),\n }\n : {}),\n },\n reasonMeta,\n args.interrupt\n ? defaultInterruptFirstPassInput({\n input: args.input,\n requestSchema: args.interrupt.requestSchema,\n mode: args.interrupt.mode ?? \"required\",\n ...(args.outputSchema\n ? { outputSchema: args.outputSchema as SchemaLike<unknown> }\n : {}),\n })\n : args.outputSchema\n ? usesNativeOutput(args.outputSchema)\n ? undefined\n : withOutputGuardrails(\n withStructuredStreamHints(args.input, {\n ...(setFieldPaths.length > 0 ? { setFieldPaths } : {}),\n ...(appendFieldPaths.length > 0\n ? { appendFieldPaths }\n : {}),\n ...(textDeltaFieldPaths.length > 0\n ? { textDeltaFieldPaths }\n : {}),\n }),\n args.outputSchema as SchemaLike<unknown>,\n )\n : undefined,\n );\n firstRaw = first.raw;\n finalRaw = first.raw;\n accumulateTokenUsage(first.usage);\n aggregatedUsage = mergeUsage(aggregatedUsage, first.usage);\n finalFinishReason = first.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n first.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, first.warnings);\n traceSpan?.addEvent?.(\"useReason.first-pass.complete\", {\n textLength: first.text.length,\n hasInterrupt: Boolean(args.interrupt),\n });\n\n if (args.interrupt) {\n const firstPass = parseInterruptFirstPassResult<TRequest, TOutput>({\n text: first.text,\n requestSchema: args.interrupt.requestSchema,\n ...(first.finishReason ? { finishReason: first.finishReason } : {}),\n ...(first.usage ? { usage: first.usage } : {}),\n ...(args.outputSchema\n ? { outputSchema: args.outputSchema as SchemaLike<TOutput> }\n : {}),\n mode: args.interrupt.mode ?? \"required\",\n });\n firstText = firstPass.draftText;\n finalText = firstPass.draftText;\n firstInterruptRequired = firstPass.interruptRequired;\n firstInterruptRequest = firstPass.request;\n firstOutput = firstPass.output;\n finalOutput = firstPass.output;\n } else {\n firstText = first.text;\n finalText = first.text;\n if (args.outputSchema) {\n firstOutput = parseReasonOutputWithSchema({\n text: first.text,\n schema: args.outputSchema,\n ...(first.finishReason\n ? { finishReason: first.finishReason }\n : {}),\n ...(first.usage ? { usage: first.usage } : {}),\n label: \"useReason output\",\n });\n }\n finalOutput = firstOutput;\n }\n }\n\n let interruptResponse: TResponse | undefined;\n\n if (args.interrupt && (existingCheckpoint || firstInterruptRequired)) {\n const requestSchema = args.interrupt.requestSchema;\n\n const interruptRequest = existingCheckpoint\n ? parseWithSchema(\n requestSchema,\n existingCheckpoint.request,\n \"useReason interrupt.request\",\n )\n : firstInterruptRequest;\n\n if (!interruptRequest) {\n throw new Error(\n \"useReason interrupt request is missing; first pass did not produce a valid interrupt payload.\",\n );\n }\n\n if (!existingCheckpoint) {\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"awaiting_interrupt\",\n request: interruptRequest,\n firstText,\n ...(firstRaw !== undefined ? { firstRaw } : {}),\n ...(aggregatedUsage !== undefined\n ? { firstUsage: aggregatedUsage }\n : {}),\n ...(finalFinishReason !== undefined\n ? { firstFinishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { firstProviderMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { firstWarnings: aggregatedWarnings }\n : {}),\n ...(firstOutput !== undefined ? { firstOutput } : {}),\n } satisfies ReasonInterruptCheckpoint;\n ctx.stateDirty = true;\n }\n\n const resumeStatePatch = resolveHookStatePatch({\n nodeId: ctx.node.graph.node,\n currentNodeState: ctx.currentNodeState,\n workflowState: ctx.workflowState,\n });\n\n interruptResponse = await awaitInterruptInternal<TRequest, TResponse>({\n request: interruptRequest,\n requestSchema,\n responseSchema: args.interrupt.responseSchema,\n ...(args.interrupt.schemaId\n ? { schemaId: args.interrupt.schemaId }\n : {}),\n ...(args.interrupt.schemaVersion\n ? { schemaVersion: args.interrupt.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n meta: {\n __kortyxResumeStatePatch: resumeStatePatch,\n },\n });\n traceSpan?.addEvent?.(\"useReason.interrupt.resolved\", {\n checkpointKey,\n });\n\n if (Object.hasOwn(ctx.currentNodeState.byKey, checkpointKey)) {\n delete ctx.currentNodeState.byKey[checkpointKey];\n ctx.stateDirty = true;\n }\n\n const continuationInput = defaultContinuationInput({\n input: args.input,\n draftText: firstText,\n ...(firstOutput !== undefined ? { draftOutput: firstOutput } : {}),\n request: interruptRequest,\n response: interruptResponse,\n });\n\n const second = await reasonEngine(\n {\n ...args,\n ...(inferred.responseFormat\n ? { responseFormat: inferred.responseFormat }\n : {}),\n emit: suppressTextStream ? false : args.emit,\n stream: suppressTextStream ? false : args.stream,\n },\n reasonMeta,\n args.outputSchema\n ? withOutputGuardrails(\n continuationInput,\n args.outputSchema as SchemaLike<unknown>,\n )\n : continuationInput,\n );\n finalText = second.text;\n finalRaw = second.raw;\n accumulateTokenUsage(second.usage);\n aggregatedUsage = mergeUsage(aggregatedUsage, second.usage);\n finalFinishReason = second.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n second.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, second.warnings);\n traceSpan?.addEvent?.(\"useReason.continuation.complete\", {\n textLength: second.text.length,\n });\n\n if (args.outputSchema) {\n finalOutput = parseReasonOutputWithSchema({\n text: finalText,\n schema: args.outputSchema,\n ...(second.finishReason\n ? { finishReason: second.finishReason }\n : {}),\n ...(aggregatedUsage ? { usage: aggregatedUsage } : {}),\n label: \"useReason output\",\n });\n }\n }\n\n if (finalOutput !== undefined) {\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: finalOutput,\n structured: args.structured,\n emit: args.emit ?? true,\n });\n }\n\n const result = {\n ...(id ? { id } : {}),\n opId,\n text: finalText,\n ...(finalRaw !== undefined ? { raw: finalRaw } : {}),\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n ...(finalOutput !== undefined ? { output: finalOutput } : {}),\n ...(interruptResponse !== undefined ? { interruptResponse } : {}),\n };\n\n if (args.interrupt) {\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"completed\",\n result,\n };\n ctx.stateDirty = true;\n }\n\n traceSpan?.end?.({\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n attributes: {\n textLength: finalText.length,\n resumedFromCheckpoint: Boolean(existingCheckpoint),\n interrupted: Boolean(interruptResponse !== undefined),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n output: args.telemetry?.output ?? finalOutput ?? finalText,\n },\n });\n\n return result;\n },\n );\n}\n\nexport async function useReason<\n TOutput = unknown,\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n TContracts extends InterruptContractMap = InterruptContractMap,\n TEmit extends OutputContractMap = OutputContractMap,\n TReturn extends OutputContractMap = OutputContractMap,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse, TContracts, TEmit, TReturn>,\n): Promise<UseReasonResult<TOutput, TResponse, TContracts, TEmit, TReturn>> {\n try {\n return await runReason(args);\n } finally {\n await closeOwnedTools(args.tools ?? []);\n }\n}\n","import type {\n ReasonTraceAdapter,\n ReasonTraceAttributes,\n ReasonTraceSpan,\n ReasonTraceSpanEndArgs,\n ReasonTraceSpanStartArgs,\n} from \"./tracing\";\n\n/** Observation callbacks never participate in execution's error path. */\nexport function safeSpan(span: ReasonTraceSpan | undefined): ReasonTraceSpan {\n const guard =\n <T extends unknown[]>(fn: ((...args: T) => void) | undefined) =>\n (...args: T) => {\n try {\n fn?.(...args);\n } catch {}\n };\n let ended = false;\n const finish =\n <T extends unknown[]>(fn: ((...args: T) => void) | undefined) =>\n (...args: T) => {\n if (ended) return;\n ended = true;\n guard(fn)(...args);\n };\n return {\n addEvent: guard((name: string, attributes?: ReasonTraceAttributes) =>\n span?.addEvent?.(name, attributes),\n ),\n setAttributes: guard((attributes: ReasonTraceAttributes) =>\n span?.setAttributes?.(attributes),\n ),\n end: finish((args?: ReasonTraceSpanEndArgs) => span?.end?.(args)),\n fail: finish((error: unknown, args?: ReasonTraceSpanEndArgs) => {\n if (span?.fail) span.fail(error, args);\n else span?.end?.(args);\n }),\n };\n}\n\nexport function safeStartSpan(\n adapter: Partial<ReasonTraceAdapter> | undefined,\n args: ReasonTraceSpanStartArgs,\n): ReasonTraceSpan {\n try {\n return safeSpan(adapter?.startSpan?.(args));\n } catch {\n return safeSpan(undefined);\n }\n}\n\n/** Retains active adapter context, and never retries a callback if observation fails. */\nexport async function withSafeTraceSpan<T>(\n adapter: Partial<ReasonTraceAdapter> | undefined,\n args: ReasonTraceSpanStartArgs,\n fn: (span: ReasonTraceSpan) => Promise<T>,\n): Promise<T> {\n let execution: Promise<T> | undefined;\n const invoke = (span: ReasonTraceSpan) => {\n execution ??= Promise.resolve().then(async () => {\n const observed = safeSpan(span);\n try {\n const result = await fn(observed);\n observed.end?.();\n return result;\n } catch (error) {\n observed.fail?.(error);\n throw error;\n }\n });\n return execution;\n };\n let activeScope: ReasonTraceAdapter[\"withSpan\"];\n try {\n activeScope = adapter?.withSpan?.bind(adapter);\n } catch {}\n if (activeScope) {\n let started: (() => void) | undefined;\n const invoked = new Promise<void>((resolve) => {\n started = resolve;\n });\n const observe = async () => {\n try {\n await activeScope(args, (span) => {\n const result = invoke(span);\n started?.();\n return result;\n });\n } catch {\n /* The execution promise preserves its own failure. */\n }\n };\n const observation = observe();\n // Delivery or adapter work after the callback must not hold up execution.\n if (!execution) await Promise.race([invoked, observation]);\n } else {\n await invoke(safeStartSpan(adapter, args)).catch(() => {});\n }\n return execution ?? invoke(safeSpan(undefined));\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","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { randomUUID } from \"node:crypto\";\nimport { combineAbortSignals, throwIfExecutionAborted } from \"@kortyx/core\";\nimport { isControlFlowError } from \"@kortyx/core/errors\";\nimport type {\n KortyxExecutableTool,\n ToolObservation,\n ToolOutcomeDescriptor,\n} from \"@kortyx/providers\";\nimport { getHookContext } from \"./context\";\nimport { errorDiagnostics } from \"./error-diagnostics\";\nimport { withSafeTraceSpan } from \"./safe-tracing\";\nimport type { ReasonTraceAdapter } from \"./tracing\";\nimport { emitWorkflowCall } from \"./workflow-telemetry\";\n\ntype ToolScope = {\n tool: KortyxExecutableTool;\n input: unknown;\n signal?: AbortSignal | undefined;\n mode: \"direct\" | \"model\";\n providerToolCallId: string;\n adopted: boolean;\n classify?: KortyxExecutableTool[\"outcomes\"] | undefined;\n telemetry?: KortyxExecutableTool[\"telemetry\"] | undefined;\n};\nconst tools = new AsyncLocalStorage<ToolScope>();\n\nexport type UseToolArgs<T extends KortyxExecutableTool> = {\n tool: T;\n input: Parameters<T[\"execute\"]> extends []\n ? unknown\n : Parameters<T[\"execute\"]>[0];\n id?: string | undefined;\n abortSignal?: AbortSignal | undefined;\n};\n\nfunction classification(\n tool: KortyxExecutableTool,\n value: unknown,\n thrown: boolean,\n policy = tool.outcomes,\n): ToolOutcomeDescriptor {\n const fallback: ToolOutcomeDescriptor = {\n outcome: thrown ? \"fault\" : \"success\",\n };\n try {\n if (\n value &&\n typeof value === \"object\" &&\n \"isError\" in value &&\n value.isError === true\n )\n fallback.outcome = \"fault\";\n const result = thrown\n ? policy?.classifyError?.(value)\n : policy?.classifyResult?.(value);\n if (!result || ![\"success\", \"denied\", \"fault\"].includes(result.outcome))\n return fallback;\n if (result.outcome !== \"denied\")\n return thrown || fallback.outcome === \"fault\"\n ? fallback\n : { outcome: result.outcome };\n const code = result.code;\n return {\n outcome: \"denied\",\n code:\n typeof code === \"string\" &&\n /^[A-Z][A-Z0-9_]{0,63}$/.test(code) &&\n policy?.denialCodes?.includes(code)\n ? code\n : \"DENIED\",\n };\n } catch {\n return fallback;\n }\n}\n\nexport async function closeOwnedTools(\n owned: readonly KortyxExecutableTool[],\n): Promise<void> {\n const closers = new Map<\n NonNullable<KortyxExecutableTool[\"close\"]>,\n KortyxExecutableTool\n >();\n for (const tool of owned) {\n if (tool.closeAfterUse !== false && tool.close && !closers.has(tool.close))\n closers.set(tool.close, tool);\n }\n // Cleanup is a best-effort diagnostic, never a reason to retry a committed operation.\n await Promise.all(\n [...closers].map(async ([close, tool]) => {\n try {\n await close.call(tool);\n } catch {\n const ctx = getHookContext();\n try {\n ctx.reasonTrace\n ?.startSpan({\n name: \"kortyx.tool.cleanup\",\n attributes: { cleanupFailed: true },\n })\n ?.end?.();\n } catch {}\n }\n }),\n );\n}\n\n/** Read only diagnostic strings; never serialize an exception, cause, input or stack. */\nfunction captureToolError(\n observation: ToolObservation,\n error: unknown,\n policy: KortyxExecutableTool[\"telemetry\"],\n returned = false,\n) {\n try {\n const reported =\n returned &&\n error &&\n typeof error === \"object\" &&\n \"isError\" in error &&\n error.isError === true &&\n \"content\" in error &&\n typeof error.content === \"string\"\n ? { name: \"ToolError\", message: error.content }\n : error;\n let projected = false;\n let projection: import(\"./tracing\").KortyxErrorDetails | null | undefined;\n let projectionFailure: unknown;\n let projectionFailed = false;\n const project = policy?.error\n ? (original: unknown) => {\n if (!projected) {\n projected = true;\n try {\n projection = policy.error?.(original);\n } catch (error) {\n projectionFailure = error;\n projectionFailed = true;\n }\n }\n if (projectionFailed) throw projectionFailure;\n return projection ?? null;\n }\n : undefined;\n Object.assign(\n observation,\n errorDiagnostics(policy?.error ? error : reported, project),\n );\n const diagnosticId = getHookContext().reasonTrace?.reportError?.(\n policy?.error ? error : reported,\n {\n mechanism: \"tool\",\n ...(project ? { error: project } : {}),\n correlation: {\n toolCallId: observation.toolCallId,\n attemptId: observation.attemptId,\n },\n },\n );\n if (typeof diagnosticId === \"string\")\n observation.diagnosticId = diagnosticId;\n } catch {\n // An application's projection or an exception getter cannot change execution.\n }\n}\n\nfunction ownership() {\n const ctx = getHookContext();\n const correlation = ctx.node.workflowCallTelemetry?.correlation;\n return {\n workflowId: ctx.node.graph.name,\n nodeId: ctx.node.graph.node,\n ...(correlation?.workflowRevisionId\n ? { workflowRevisionId: correlation.workflowRevisionId }\n : {}),\n ...(correlation?.parentInvocationId\n ? { parentInvocationId: correlation.parentInvocationId }\n : {}),\n ...(correlation?.runId ? { runId: correlation.runId } : {}),\n ...(correlation?.invocationId\n ? { invocationId: correlation.invocationId }\n : {}),\n ...(correlation?.branchId ? { branchId: correlation.branchId } : {}),\n };\n}\n\n/** Checkpointed safe facts let a whole cached child retain its tool evidence. */\nexport function rememberToolObservation(observation: ToolObservation): void {\n const ctx = getHookContext();\n const existing = ctx.workflowState.__kortyxToolObservations;\n const observations = Array.isArray(existing) ? existing : [];\n if (!observations.some((item) => item.attemptId === observation.attemptId))\n observations.push({ ...observation });\n ctx.workflowState.__kortyxToolObservations = observations;\n ctx.stateDirty = true;\n}\n\nfunction toolTrace(\n observation: ToolObservation,\n): ReasonTraceAdapter | undefined {\n const ctx = getHookContext();\n const adapter = ctx.reasonTrace ?? ctx.node.workflowCallTelemetry?.trace;\n if (adapter) return adapter;\n const telemetry = ctx.node.workflowCallTelemetry;\n if (!telemetry?.reporter) return undefined;\n const correlation = { ...telemetry.correlation, ...observation };\n const spanId = randomUUID();\n const emit = (\n type: import(\"./tracing\").KortyxTelemetryEventType,\n payload: Record<string, unknown>,\n ) =>\n emitWorkflowCall(\n {\n ...telemetry,\n correlation,\n trace: {\n startSpan: () => undefined,\n getActiveContext: () => ({\n traceId: correlation.runId ?? spanId,\n spanId,\n }),\n },\n },\n type,\n payload,\n );\n return {\n startSpan: ({ attributes = {} }) => {\n if (attributes.executed === true) emit(\"tool.started\", attributes);\n let ended = false;\n return {\n end: (args) => {\n if (ended) return;\n ended = true;\n const payload = { ...attributes, ...args?.attributes };\n const type =\n payload.observationKind === \"reused\"\n ? \"tool.reused\"\n : payload.observationKind === \"waiting\"\n ? \"tool.waiting\"\n : payload.suspended\n ? \"tool.suspended\"\n : payload.outcome === \"denied\"\n ? \"tool.denied\"\n : payload.outcome === \"fault\"\n ? \"tool.failed\"\n : payload.outcome === \"cancelled\"\n ? \"tool.cancelled\"\n : \"tool.completed\";\n emit(type, payload);\n },\n };\n },\n };\n}\n\nexport async function executeObservedTool(args: {\n tool: KortyxExecutableTool;\n input: unknown;\n toolCallId: string;\n providerToolCallId?: string | undefined;\n callingMode: \"direct\" | \"model\";\n abortSignal?: AbortSignal | undefined;\n onObservation?: (observation: ToolObservation) => void;\n}): Promise<unknown> {\n const ctx = getHookContext();\n const observation: ToolObservation = {\n version: 1,\n name: args.tool.name,\n toolCallId: args.toolCallId,\n attemptId: randomUUID(),\n callingMode: args.callingMode,\n executed: false,\n ...ownership(),\n };\n const scope: ToolScope = {\n tool: args.tool,\n input: args.input,\n signal: args.abortSignal,\n mode: args.callingMode,\n providerToolCallId: args.providerToolCallId ?? args.toolCallId,\n adopted: false,\n };\n // Admission happens before an actual-execution start and is not a tool fault.\n try {\n throwIfExecutionAborted(args.abortSignal);\n } catch (error) {\n observation.outcome = \"cancelled\";\n await observeToolFact(observation);\n args.onObservation?.(observation);\n throw error;\n }\n ctx.node.consumeExecution?.(\"maxToolCalls\");\n observation.executed = true;\n const started = performance.now();\n return withSafeTraceSpan(\n toolTrace(observation),\n {\n name: \"kortyx.tool\",\n attributes: { ...observation, nodeId: ctx.node.graph.node },\n },\n async (span) =>\n tools.run(scope, async () => {\n try {\n const result = await args.tool.execute(args.input, {\n toolCallId: args.providerToolCallId ?? args.toolCallId,\n ...(args.abortSignal ? { abortSignal: args.abortSignal } : {}),\n });\n throwIfExecutionAborted(args.abortSignal);\n const outcome = classification(\n args.tool,\n result,\n false,\n scope.classify ?? args.tool.outcomes,\n );\n observation.outcome = outcome.outcome;\n if (outcome.code) observation.denialCode = outcome.code;\n if (observation.outcome === \"fault\") {\n captureToolError(\n observation,\n result,\n scope.telemetry ?? args.tool.telemetry,\n true,\n );\n }\n return result;\n } catch (error) {\n if (args.abortSignal?.aborted) observation.outcome = \"cancelled\";\n else if (!isControlFlowError(error)) {\n const outcome = classification(\n args.tool,\n error,\n true,\n scope.classify ?? args.tool.outcomes,\n );\n observation.outcome = outcome.outcome;\n if (outcome.code) observation.denialCode = outcome.code;\n if (observation.outcome === \"fault\")\n captureToolError(\n observation,\n error,\n scope.telemetry ?? args.tool.telemetry,\n );\n }\n throw error;\n } finally {\n observation.durationMs = Math.max(0, performance.now() - started);\n span.end?.({\n attributes: {\n ...observation,\n ...(observation.outcome ? {} : { suspended: true }),\n },\n });\n rememberToolObservation(observation);\n args.onObservation?.({ ...observation });\n }\n }),\n );\n}\n\n/** A selected but unexecuted denial, cancellation, approval wait, or cached reuse. */\nexport async function observeToolFact(\n observation: ToolObservation,\n kind?: \"reused\" | \"waiting\",\n preserveOwner = false,\n): Promise<void> {\n const ctx = getHookContext();\n if (!preserveOwner) Object.assign(observation, ownership());\n if (observation.outcome && kind !== \"reused\")\n rememberToolObservation(observation);\n await withSafeTraceSpan(\n toolTrace(observation),\n {\n name: \"kortyx.tool\",\n attributes: {\n ...observation,\n executed: false,\n ...(kind ? { observationKind: kind } : {}),\n nodeId: observation.nodeId ?? ctx.node.graph.node,\n },\n },\n async (span) => {\n span.end?.({\n attributes: {\n ...observation,\n executed: false,\n ...(kind ? { observationKind: kind } : {}),\n },\n });\n },\n );\n}\n\nexport async function useTool<T extends KortyxExecutableTool>(\n args: UseToolArgs<T>,\n): Promise<Awaited<ReturnType<T[\"execute\"]>>> {\n const ctx = getHookContext();\n const scope = tools.getStore();\n if (\n scope?.mode === \"model\" &&\n !scope.adopted &&\n scope.tool.name === args.tool.name &&\n scope.input === args.input\n ) {\n scope.adopted = true;\n scope.classify = args.tool.outcomes ?? scope.classify;\n scope.telemetry = args.tool.telemetry ?? scope.telemetry;\n return tools.run({ ...scope, mode: \"direct\" }, () =>\n args.tool.execute(args.input, {\n toolCallId: scope.providerToolCallId,\n ...(scope.signal ? { abortSignal: scope.signal } : {}),\n }),\n ) as Promise<Awaited<ReturnType<T[\"execute\"]>>>;\n }\n const index = ctx.toolCallIndex++;\n const key = `__useTool:${args.id ?? `auto:${index}`}`;\n let id = ctx.currentNodeState.byKey[key];\n if (typeof id !== \"string\") {\n id = randomUUID();\n ctx.currentNodeState.byKey[key] = id;\n ctx.stateDirty = true;\n }\n try {\n return (await executeObservedTool({\n tool: args.tool,\n input: args.input,\n toolCallId: String(id),\n callingMode: \"direct\",\n abortSignal: combineAbortSignals(ctx.node.abortSignal, args.abortSignal),\n })) as Awaited<ReturnType<T[\"execute\"]>>;\n } finally {\n await closeOwnedTools([args.tool]);\n }\n}\n\nexport async function replayToolObservations(\n observations: readonly ToolObservation[],\n child = false,\n): Promise<void> {\n for (const original of observations) {\n const source = original.source ?? {\n ...ownershipFrom(original),\n toolCallId: original.toolCallId,\n attemptId: original.attemptId,\n };\n await observeToolFact(\n {\n ...original,\n ...ownership(),\n ...(child\n ? {\n workflowId: original.workflowId,\n nodeId: original.nodeId,\n workflowRevisionId: original.workflowRevisionId,\n invocationId: original.invocationId,\n parentInvocationId: original.parentInvocationId,\n }\n : {}),\n attemptId: randomUUID(),\n executed: false,\n source,\n durationMs: undefined,\n },\n \"reused\",\n child,\n );\n }\n}\nconst ownershipFrom = (observation: ToolObservation) => ({\n runId: observation.runId,\n invocationId: observation.invocationId,\n branchId: observation.branchId,\n});\n","import { summarizeDiagnostic } from \"@kortyx/telemetry-contracts\";\nimport { captureDiagnosticContent } from \"./diagnostic-capture\";\nimport type { KortyxErrorDetails, KortyxTraceErrorProjection } from \"./tracing\";\n\n/** Redacted observer diagnostic; bounded summaries are produced separately. */\nexport function exceptionDiagnostics(\n error: unknown,\n project?: KortyxTraceErrorProjection,\n): KortyxErrorDetails | null {\n const content = captureDiagnosticContent(error, project);\n return !content || content.capture.status === \"failed\"\n ? null\n : (content.data as KortyxErrorDetails);\n}\n\n/** Internal tracing diagnostics only; never changes client-facing failure contracts. */\nexport function errorDiagnostics(\n error: unknown,\n project?: KortyxTraceErrorProjection,\n): { errorType?: string; errorMessage?: string } {\n const captured = exceptionDiagnostics(error, project);\n const details = captured ? summarizeDiagnostic(captured) : null;\n return details\n ? {\n errorMessage: details.message.slice(0, 8192),\n ...(details.type ? { errorType: details.type.slice(0, 256) } : {}),\n }\n : {};\n}\nexport function isModelTraceSpan(name: string) {\n return name === \"runReasonEngine\" || name === \"useReason\";\n}\n","import { errorProperty } from \"@kortyx/core/errors\";\nimport {\n DIAGNOSTIC_LIMITS,\n type DiagnosticContent,\n type DiagnosticNote,\n isPrivateDiagnosticField,\n redactDiagnosticText,\n} from \"@kortyx/telemetry-contracts\";\nimport type { KortyxTraceErrorProjection } from \"./tracing\";\n\nconst encoder = new TextEncoder();\n// Node 24 stores even assigned stacks behind a shared native lazy accessor.\nconst nativeStackGetter = Object.getOwnPropertyDescriptor(\n new Error(),\n \"stack\",\n)?.get;\nfunction nativeStack(\n object: object,\n getter: (() => unknown) | undefined,\n): unknown {\n if (!getter || getter !== nativeStackGetter)\n throw new Error(\"Custom stack accessor\");\n for (const key of [\"name\", \"message\"]) {\n let cursor: object | null = object;\n while (cursor) {\n const descriptor = Object.getOwnPropertyDescriptor(cursor, key);\n if (descriptor) {\n if (!(\"value\" in descriptor) || typeof descriptor.value !== \"string\")\n throw new Error(\"Custom error formatting\");\n break;\n }\n cursor = Object.getPrototypeOf(cursor);\n }\n }\n const formatter = Object.getOwnPropertyDescriptor(Error, \"prepareStackTrace\");\n if (formatter && (!(\"value\" in formatter) || !formatter.writable))\n throw new Error(\"Custom stack formatter\");\n // Synchronous formatting must not invoke an application's prepareStackTrace.\n Object.defineProperty(Error, \"prepareStackTrace\", {\n ...(formatter ?? { configurable: true, writable: true }),\n value: undefined,\n });\n try {\n return getter.call(object);\n } finally {\n if (formatter) Object.defineProperty(Error, \"prepareStackTrace\", formatter);\n else Reflect.deleteProperty(Error, \"prepareStackTrace\");\n }\n}\nconst pointer = (key: string) => key.replace(/~/g, \"~0\").replace(/\\//g, \"~1\");\n\n/** Data-only graph capture. Getters and application toJSON methods are never invoked. */\nexport function captureDiagnosticContent(\n error: unknown,\n project?: KortyxTraceErrorProjection,\n): DiagnosticContent | null {\n const omissions: DiagnosticNote[] = [];\n const redactions: DiagnosticNote[] = [];\n const seen = new WeakMap<object, string>();\n let nodes = 0;\n let remaining = DIAGNOSTIC_LIMITS.bytes - 64 * 1024;\n const omit = (\n path: string,\n reason: string,\n extra: Partial<DiagnosticNote> = {},\n ) => {\n if (omissions.length < 1000)\n omissions.push({ path: path.slice(0, 4096), reason, ...extra });\n return { $omitted: reason };\n };\n const visit = (value: unknown, path: string, depth: number): unknown => {\n if (++nodes > DIAGNOSTIC_LIMITS.nodes) return omit(path, \"node_limit\");\n if (depth > DIAGNOSTIC_LIMITS.depth) return omit(path, \"depth_limit\");\n if (typeof value === \"string\") {\n const clean = redactDiagnosticText(value);\n if (clean !== value && redactions.length < 1000)\n redactions.push({\n path: path.slice(0, 4096),\n reason: \"credential_text\",\n });\n const bytes = encoder.encode(JSON.stringify(clean)).length;\n if (bytes > remaining)\n return omit(path, \"byte_limit\", {\n originalBytes: encoder.encode(value).length,\n });\n remaining -= bytes;\n return clean;\n }\n if (value === null || typeof value === \"boolean\") return value;\n if (typeof value === \"number\")\n return Number.isFinite(value)\n ? value\n : { $type: \"number\", value: String(value) };\n if (typeof value === \"bigint\")\n return { $type: \"bigint\", value: value.toString() };\n if (typeof value === \"undefined\") return { $type: \"undefined\" };\n if (typeof value === \"function\" || typeof value === \"symbol\")\n return omit(path, `unsupported_${typeof value}`);\n const object = value as object;\n const reference = seen.get(object);\n if (reference) return { $ref: reference };\n seen.set(object, path);\n remaining -= 32;\n if (remaining < 0) return omit(path, \"byte_limit\");\n try {\n if (value instanceof Date)\n return { $type: \"Date\", value: Date.prototype.toISOString.call(value) };\n if (value instanceof Map || value instanceof Set) {\n const isMap = value instanceof Map;\n const iterator = isMap\n ? Map.prototype.entries.call(value)\n : Set.prototype.values.call(value);\n const count = Object.getOwnPropertyDescriptor(\n isMap ? Map.prototype : Set.prototype,\n \"size\",\n )?.get?.call(value) as number;\n const entries: unknown[] = [];\n for (\n let index = 0;\n index < Math.min(count, DIAGNOSTIC_LIMITS.properties);\n index++\n )\n entries.push(iterator.next().value);\n if (count > entries.length)\n omissions.push({\n path,\n reason: \"collection_limit\",\n originalCount: count,\n });\n return isMap\n ? {\n $type: \"Map\",\n entries: visit(entries, `${path}/entries`, depth + 1),\n }\n : {\n $type: \"Set\",\n values: visit(entries, `${path}/values`, depth + 1),\n };\n }\n if (Array.isArray(value)) {\n const count = Math.min(value.length, DIAGNOSTIC_LIMITS.properties);\n const items = Array.from({ length: count }, (_, index) =>\n read(value, String(index), `${path}/${index}`, depth),\n );\n if (count < value.length)\n items.push(\n omit(path, \"collection_limit\", { originalCount: value.length }),\n );\n return items;\n }\n const keys = Object.getOwnPropertyNames(object);\n const result: Record<string, unknown> = Object.create(null);\n if (value instanceof Error) {\n const ownName = Object.getOwnPropertyDescriptor(object, \"name\");\n let type: unknown =\n ownName && \"value\" in ownName ? ownName.value : undefined;\n if (typeof type !== \"string\") {\n const name = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(value),\n \"name\",\n );\n type = name && \"value\" in name ? name.value : \"Error\";\n }\n result.type = visit(\n typeof type === \"string\" ? type : \"Error\",\n `${path}/type`,\n depth + 1,\n );\n }\n for (const key of keys.slice(0, DIAGNOSTIC_LIMITS.properties)) {\n if ([\"__proto__\", \"constructor\", \"prototype\"].includes(key)) {\n result[key] = omit(`${path}/${pointer(key)}`, \"unsafe_key\");\n continue;\n }\n remaining -= encoder.encode(key).length + 4;\n result[key] = read(object, key, `${path}/${pointer(key)}`, depth);\n }\n if (keys.length > DIAGNOSTIC_LIMITS.properties)\n result.$omittedProperties = omit(path, \"property_limit\", {\n originalCount: keys.length,\n });\n return result;\n } catch {\n return omit(path, \"unreadable_object\");\n }\n };\n const read = (\n object: object,\n key: string,\n path: string,\n depth: number,\n ): unknown => {\n if (isPrivateDiagnosticField(key)) {\n if (redactions.length < 1000)\n redactions.push({\n path: path.slice(0, 4096),\n reason: \"credential_field\",\n });\n return \"[REDACTED]\";\n }\n try {\n const property = Object.getOwnPropertyDescriptor(object, key);\n if (property && \"value\" in property)\n return visit(property.value, path, depth + 1);\n if (\n key === \"stack\" &&\n object instanceof Error &&\n property?.get &&\n property.get === nativeStackGetter\n )\n return visit(nativeStack(object, property.get), path, depth + 1);\n return omit(\n path,\n property ? \"accessor_not_evaluated\" : \"unavailable_property\",\n );\n } catch {\n return omit(path, \"unreadable_property\");\n }\n };\n try {\n const original = project ? project(error) : error;\n if (project && original === null) return null;\n const captured = visit(original, \"#/data\", 0);\n const upstreamOmissions = errorProperty(original, \"diagnosticOmissions\");\n if (Array.isArray(upstreamOmissions))\n for (const note of upstreamOmissions.slice(0, 1000)) {\n const path = errorProperty(note, \"path\");\n const reason = errorProperty(note, \"reason\");\n if (typeof path === \"string\" && typeof reason === \"string\")\n omissions.push({\n path: redactDiagnosticText(path).slice(0, 4096),\n reason: redactDiagnosticText(reason).slice(0, 128),\n });\n }\n const data: Record<string, unknown> =\n captured && typeof captured === \"object\" && !Array.isArray(captured)\n ? (captured as Record<string, unknown>)\n : {\n type: \"Error\",\n message:\n typeof captured === \"string\"\n ? captured\n : \"Execution reported a fault.\",\n value: captured,\n };\n if (typeof data.message !== \"string\" && !(\"message\" in data))\n data.message = \"Execution reported a fault.\";\n if (!(\"type\" in data))\n data.type = typeof data.name === \"string\" ? data.name : \"Error\";\n const content: DiagnosticContent = {\n schemaVersion: 1,\n data,\n capture: {\n status: omissions.length ? \"partial\" : \"complete\",\n omissions,\n redactions,\n },\n };\n if (\n encoder.encode(JSON.stringify(content)).length > DIAGNOSTIC_LIMITS.bytes\n )\n return {\n schemaVersion: 1,\n data: {\n type: \"Error\",\n message: \"Diagnostic exceeded the capture budget.\",\n },\n capture: {\n status: \"partial\",\n redactions: [],\n omissions: [{ path: \"#/data\", reason: \"serialized_byte_limit\" }],\n },\n };\n return content;\n } catch {\n return {\n schemaVersion: 1,\n data: { type: \"Error\", message: \"Diagnostic capture failed.\" },\n capture: {\n status: \"failed\",\n redactions: [],\n omissions: [{ path: \"#/data\", reason: \"projection_or_capture_failed\" }],\n },\n };\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","import { randomUUID } from \"node:crypto\";\nimport { combineAbortSignals, throwIfExecutionAborted } from \"@kortyx/core\";\nimport type {\n KortyxPromptMessage,\n KortyxReasoningOptions,\n KortyxResponseFormat,\n KortyxToolDefinition,\n ProviderModelRef,\n} from \"@kortyx/providers\";\nimport { accumulateTokenUsage, getHookContext } from \"../context\";\nimport type { RunReasonEngineResult } from \"../reason-engine\";\nimport { runReasonEngine } from \"../reason-engine\";\nimport type { KortyxTraceMetadata } from \"../tracing\";\n\nexport type ReasonEngineInput = {\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | undefined;\n maxOutputTokens?: number | undefined;\n stopSequences?: string[] | undefined;\n abortSignal?: AbortSignal | undefined;\n reasoning?: KortyxReasoningOptions | undefined;\n responseFormat?: KortyxResponseFormat | undefined;\n providerOptions?: Record<string, unknown> | undefined;\n tools?: KortyxToolDefinition[] | undefined;\n messages?: KortyxPromptMessage[] | undefined;\n emit?: boolean | undefined;\n stream?: boolean | undefined;\n onTextChunk?: ((text: string) => void) | undefined;\n telemetry?: KortyxTraceMetadata | undefined;\n};\n\nexport const createRuntimeId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nexport async function reasonEngine(\n args: ReasonEngineInput,\n meta: { id?: string; opId: string },\n inputOverride?: string,\n): Promise<RunReasonEngineResult> {\n const ctx = getHookContext();\n const abortSignal = combineAbortSignals(\n ctx.node.abortSignal,\n args.abortSignal,\n args.model.options?.abortSignal,\n );\n throwIfExecutionAborted(abortSignal);\n ctx.node.consumeExecution?.(\"maxModelPasses\");\n\n try {\n return await runReasonEngine({\n model: args.model,\n input: inputOverride ?? args.input,\n system: args.system,\n temperature: args.temperature,\n maxOutputTokens: args.maxOutputTokens,\n stopSequences: args.stopSequences,\n abortSignal,\n reasoning: args.reasoning,\n responseFormat: args.responseFormat,\n providerOptions: args.providerOptions,\n tools: args.tools,\n messages: args.messages,\n defaultTemperature: ctx.node.config?.model?.temperature,\n stream: args.stream,\n emit: args.emit,\n onTextChunk: args.onTextChunk,\n telemetry: args.telemetry,\n nodeId: ctx.node.graph.node,\n emitEvent: ctx.node.emit,\n reasonTrace: ctx.reasonTrace,\n id: meta.id,\n opId: meta.opId,\n });\n } catch (error) {\n const usage = (error as Partial<RunReasonEngineResult> | undefined)?.usage;\n if (usage) accumulateTokenUsage(usage);\n throw error;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport {\n createExecutionCancelledError,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport { KortyxError } from \"@kortyx/core/errors\";\nimport type {\n KortyxContinuation,\n KortyxFinishReason,\n KortyxPromptMessage,\n KortyxProviderMetadata,\n KortyxReasoningOptions,\n KortyxResponseFormat,\n KortyxToolCall,\n KortyxToolDefinition,\n KortyxUsage,\n KortyxWarning,\n ProviderModelRef,\n} from \"@kortyx/providers\";\nimport { safeStartSpan } from \"./safe-tracing\";\nimport type {\n KortyxTraceMetadata,\n ReasonTraceAdapter,\n ReasonTraceSpan,\n} from \"./tracing\";\n\nfunction assertModelFinish(result: {\n finishReason?: KortyxFinishReason | undefined;\n usage?: KortyxUsage | undefined;\n}): void {\n if (result.finishReason?.unified !== \"content-filter\") return;\n throw Object.assign(\n new KortyxError(\"PROVIDER_REFUSAL\", \"The provider refused the request.\", {\n category: \"provider\",\n retryable: false,\n safeMessage: \"The provider refused the request.\",\n }),\n {\n ...(result.usage ? { usage: result.usage } : {}),\n finishReason: result.finishReason,\n },\n );\n}\n\nexport interface RunReasonEngineArgs {\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | undefined;\n maxOutputTokens?: number | undefined;\n stopSequences?: string[] | undefined;\n abortSignal?: AbortSignal | undefined;\n reasoning?: KortyxReasoningOptions | undefined;\n responseFormat?: KortyxResponseFormat | undefined;\n providerOptions?: Record<string, unknown> | undefined;\n tools?: KortyxToolDefinition[] | undefined;\n messages?: KortyxPromptMessage[] | undefined;\n defaultTemperature?: number | undefined;\n stream?: boolean | undefined;\n emit?: boolean | undefined;\n nodeId?: string | undefined;\n emitEvent?: ((event: string, payload: unknown) => void) | undefined;\n onTextChunk?: ((text: string) => void) | undefined;\n id?: string | undefined;\n opId?: string | undefined;\n segmentId?: string | undefined;\n telemetry?: KortyxTraceMetadata | undefined;\n reasonTrace?: ReasonTraceAdapter | undefined;\n}\n\nexport interface RunReasonEngineResult {\n continuation?: KortyxContinuation;\n text: string;\n raw?: unknown;\n usage?: KortyxUsage;\n finishReason?: KortyxFinishReason;\n toolCalls?: KortyxToolCall[];\n providerMetadata?: KortyxProviderMetadata;\n warnings?: KortyxWarning[];\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\nconst createRuntimeId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nconst emitNodeEvent = (\n emitEvent: RunReasonEngineArgs[\"emitEvent\"],\n nodeId: string | undefined,\n event: string,\n payload: Record<string, unknown>,\n): void => {\n if (!emitEvent) return;\n emitEvent(event, {\n ...payload,\n ...(typeof nodeId === \"string\" && nodeId.length > 0\n ? { node: nodeId }\n : {}),\n });\n};\n\nexport const resolveProviderOptions = (\n defaults: Record<string, unknown> | undefined,\n overrides: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined => {\n const providerOptions =\n defaults || overrides ? { ...defaults, ...overrides } : undefined;\n // Provider namespaces inherit model defaults (including transport) while\n // allowing individual call settings to override them.\n for (const [key, value] of Object.entries(overrides ?? {})) {\n const previous = defaults?.[key];\n if (\n previous &&\n value &&\n typeof previous === \"object\" &&\n typeof value === \"object\" &&\n !Array.isArray(previous) &&\n !Array.isArray(value)\n ) {\n if (providerOptions) providerOptions[key] = { ...previous, ...value };\n }\n }\n return providerOptions;\n};\n\nexport async function runReasonEngine(\n args: RunReasonEngineArgs,\n): Promise<RunReasonEngineResult> {\n let stream = args.stream ?? args.model.options?.streaming ?? true;\n const emit = args.emit ?? true;\n const temperature =\n args.temperature ??\n args.model.options?.temperature ??\n args.defaultTemperature;\n const maxOutputTokens =\n args.maxOutputTokens ?? args.model.options?.maxOutputTokens;\n const stopSequences = args.stopSequences ?? args.model.options?.stopSequences;\n const abortSignal = args.abortSignal ?? args.model.options?.abortSignal;\n const reasoning = args.reasoning ?? args.model.options?.reasoning;\n const responseFormat =\n args.responseFormat ?? args.model.options?.responseFormat;\n const providerOptions = resolveProviderOptions(\n args.model.options?.providerOptions,\n args.providerOptions,\n );\n const tools = args.tools ?? args.model.options?.tools;\n\n throwIfExecutionAborted(abortSignal);\n const model = args.model.provider.getModel(args.model.modelId, {\n ...(temperature !== undefined ? { temperature } : {}),\n streaming: stream,\n ...(maxOutputTokens !== undefined ? { maxOutputTokens } : {}),\n ...(stopSequences !== undefined ? { stopSequences } : {}),\n ...(abortSignal !== undefined ? { abortSignal } : {}),\n ...(reasoning !== undefined ? { reasoning } : {}),\n ...(responseFormat !== undefined ? { responseFormat } : {}),\n ...(tools !== undefined ? { tools } : {}),\n ...(providerOptions !== undefined ? { providerOptions } : {}),\n });\n\n if (tools?.length && !model.supportsToolStreaming) stream = false;\n\n const messages: KortyxPromptMessage[] =\n args.messages !== undefined\n ? args.messages\n : [\n ...(typeof args.system === \"string\" && args.system.length > 0\n ? [{ role: \"system\" as const, content: args.system }]\n : []),\n { role: \"user\" as const, content: String(args.input ?? \"\") },\n ];\n\n const opId =\n typeof args.opId === \"string\" && args.opId.length > 0\n ? args.opId\n : createRuntimeId();\n const segmentId =\n typeof args.segmentId === \"string\" && args.segmentId.length > 0\n ? args.segmentId\n : createRuntimeId();\n\n const commonMeta: Record<string, unknown> = {\n ...(typeof args.id === \"string\" && args.id.length > 0\n ? { id: args.id }\n : {}),\n opId,\n segmentId,\n };\n const traceSpan = safeStartSpan(args.reasonTrace, {\n name: \"runReasonEngine\",\n attributes: {\n ...commonMeta,\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n stream,\n emit,\n ...(args.telemetry?.operation\n ? { operation: args.telemetry.operation }\n : {}),\n ...(args.telemetry?.prompt?.name\n ? { promptName: args.telemetry.prompt.name }\n : {}),\n ...(args.telemetry?.prompt?.version !== undefined\n ? { promptVersion: args.telemetry.prompt.version }\n : {}),\n ...(args.telemetry?.prompt?.type\n ? { promptType: args.telemetry.prompt.type }\n : {}),\n ...(typeof args.nodeId === \"string\" && args.nodeId.length > 0\n ? { nodeId: args.nodeId }\n : {}),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n input:\n args.telemetry?.input ??\n messages.map(\n ({ continuation: _continuation, raw: _raw, ...message }) => message,\n ),\n },\n });\n const modelRequestStartedAt = Date.now();\n let firstTextTokenAt: number | undefined;\n let lastTextTokenAt: number | undefined;\n\n const generationTimingAttributes = (): Record<string, number> =>\n firstTextTokenAt === undefined || lastTextTokenAt === undefined\n ? {}\n : {\n ttftMs: Math.max(0, firstTextTokenAt - modelRequestStartedAt),\n streamDurationMs: Math.max(0, lastTextTokenAt - firstTextTokenAt),\n timeToLastTokenMs: Math.max(\n 0,\n lastTextTokenAt - modelRequestStartedAt,\n ),\n };\n\n const endTrace = (\n span: ReasonTraceSpan | undefined,\n result: RunReasonEngineResult,\n ): void => {\n span?.end?.({\n ...(result.usage !== undefined ? { usage: result.usage } : {}),\n ...(result.finishReason !== undefined\n ? { finishReason: result.finishReason }\n : {}),\n ...(result.providerMetadata !== undefined\n ? { providerMetadata: result.providerMetadata }\n : {}),\n ...(result.warnings !== undefined ? { warnings: result.warnings } : {}),\n attributes: {\n textLength: result.text.length,\n ...generationTimingAttributes(),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n output: args.telemetry?.output ?? result.text,\n },\n });\n };\n\n const failTrace = (\n span: ReasonTraceSpan | undefined,\n error: unknown,\n ): void => {\n const detail = error as Partial<RunReasonEngineResult> | undefined;\n try {\n span?.fail?.(error, {\n ...(detail?.usage ? { usage: detail.usage } : {}),\n ...(detail?.finishReason ? { finishReason: detail.finishReason } : {}),\n ...(detail?.providerMetadata\n ? { providerMetadata: detail.providerMetadata }\n : {}),\n attributes: {\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n },\n });\n } catch {\n /* Reporting must not replace the execution failure. */\n }\n };\n\n try {\n if (stream) {\n let continuation: KortyxContinuation | undefined;\n let final = \"\";\n let raw: unknown;\n let usage: KortyxUsage | undefined;\n let finishReason: KortyxFinishReason | undefined;\n let toolCalls: KortyxToolCall[] | undefined;\n let providerMetadata: KortyxProviderMetadata | undefined;\n let warnings: KortyxWarning[] | undefined;\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-start\", {\n ...commonMeta,\n });\n }\n\n const response = await model.stream(messages);\n for await (const chunk of response) {\n throwIfExecutionAborted(abortSignal);\n switch (chunk.type) {\n case \"text-delta\": {\n if (chunk.delta.length === 0) break;\n const tokenAt = Date.now();\n firstTextTokenAt ??= tokenAt;\n lastTextTokenAt = tokenAt;\n final += chunk.delta;\n args.onTextChunk?.(chunk.delta);\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: chunk.delta,\n });\n }\n break;\n }\n case \"finish\": {\n continuation = chunk.continuation;\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.usage !== undefined) {\n usage = chunk.usage;\n }\n if (chunk.finishReason !== undefined) {\n finishReason = chunk.finishReason;\n }\n if (chunk.toolCalls !== undefined) {\n toolCalls = chunk.toolCalls;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (chunk.warnings !== undefined) {\n warnings = chunk.warnings;\n }\n break;\n }\n case \"raw\": {\n raw = chunk.raw;\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n break;\n }\n case \"error\": {\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (chunk.warnings !== undefined) {\n warnings = chunk.warnings;\n }\n throw toError(chunk.error);\n }\n }\n }\n\n throwIfExecutionAborted(abortSignal);\n assertModelFinish({ finishReason, usage });\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n const result = {\n text: final,\n ...(continuation ? { continuation } : {}),\n ...(raw !== undefined ? { raw } : {}),\n ...(usage !== undefined ? { usage } : {}),\n ...(finishReason !== undefined ? { finishReason } : {}),\n ...(toolCalls !== undefined ? { toolCalls } : {}),\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n ...(warnings !== undefined ? { warnings } : {}),\n };\n throwIfExecutionAborted(abortSignal);\n endTrace(traceSpan, result);\n return result;\n }\n\n const response = await model.invoke(messages);\n throwIfExecutionAborted(abortSignal);\n assertModelFinish(response);\n if (response.content) args.onTextChunk?.(response.content);\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-start\", {\n ...commonMeta,\n });\n if (response.content) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: response.content,\n });\n }\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n const result = {\n text: response.content,\n ...(response.continuation ? { continuation: response.continuation } : {}),\n ...(response.raw !== undefined ? { raw: response.raw } : {}),\n ...(response.usage !== undefined ? { usage: response.usage } : {}),\n ...(response.finishReason !== undefined\n ? { finishReason: response.finishReason }\n : {}),\n ...(response.toolCalls !== undefined\n ? { toolCalls: response.toolCalls }\n : {}),\n ...(response.providerMetadata !== undefined\n ? { providerMetadata: response.providerMetadata }\n : {}),\n ...(response.warnings !== undefined\n ? { warnings: response.warnings }\n : {}),\n };\n endTrace(traceSpan, result);\n return result;\n } catch (error) {\n const failure = abortSignal?.aborted\n ? createExecutionCancelledError()\n : error;\n failTrace(traceSpan, failure);\n throw failure;\n }\n}\n","import type { KortyxResponseFormat, KortyxWarning } from \"@kortyx/providers\";\nimport { toJSONSchema } from \"zod\";\nimport type { SchemaLike } from \"../types\";\n\n/** Infer the wire schema only when the caller did not choose a format. */\nexport function inferOutputFormat(\n schema: SchemaLike<unknown> | undefined,\n explicit: KortyxResponseFormat | undefined,\n): {\n responseFormat?: KortyxResponseFormat;\n warnings?: KortyxWarning[];\n} {\n if (explicit) return { responseFormat: explicit };\n if (!schema) return {};\n try {\n const json = toJSONSchema(schema as never) as Record<string, unknown>;\n const clean = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(clean);\n if (!value || typeof value !== \"object\") return value;\n const object = value as Record<string, unknown>;\n if (\n [\n \"allOf\",\n \"not\",\n \"dependentRequired\",\n \"dependentSchemas\",\n \"if\",\n \"then\",\n \"else\",\n \"prefixItems\",\n ].some((key) => key in object)\n )\n throw new Error(\n \"Schema composition requires an explicit provider schema\",\n );\n if (object.type === \"object\") {\n if (object.additionalProperties !== false)\n throw new Error(\n \"Dynamic properties require an explicit provider schema\",\n );\n const properties = object.properties as\n | Record<string, unknown>\n | undefined;\n const required = object.required as string[] | undefined;\n if (\n properties &&\n Object.keys(properties).some((key) => !required?.includes(key))\n ) {\n throw new Error(\n \"Optional properties require an explicit provider schema\",\n );\n }\n }\n return Object.fromEntries(\n Object.entries(object)\n .filter(([key]) => key !== \"$schema\" && key !== \"default\")\n .map(([key, child]) => {\n // Property and definition names are user data, not schema keywords.\n if (\n (key === \"properties\" ||\n key === \"$defs\" ||\n key === \"definitions\") &&\n child &&\n typeof child === \"object\"\n )\n return [\n key,\n Object.fromEntries(\n Object.entries(child).map(([name, definition]) => [\n name,\n clean(definition),\n ]),\n ),\n ];\n return [\n key,\n key === \"enum\" || key === \"const\" ? child : clean(child),\n ];\n }),\n );\n };\n if (json.type !== \"object\")\n throw new Error(\"The provider schema must have an object root\");\n return { responseFormat: { type: \"json\", schema: clean(json) } };\n } catch {\n return {\n responseFormat: { type: \"json\" },\n warnings: [\n {\n type: \"compatibility\",\n feature: \"outputSchema\",\n details:\n \"This validator cannot be inferred as a strict provider JSON schema. Kortyx still validates the final output locally. Supply responseFormat.schema to enforce a wire schema.\",\n },\n ],\n };\n }\n}\n","import { assertStructuredPath, parseStructuredPath } from \"../structured-path\";\nimport type { UseReasonStructuredConfig } from \"../types\";\n\nexport const resolveAppendFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const appendPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"append\")\n .map(([path]) => path);\n\n for (const path of appendPaths) {\n assertStructuredPath(path, \"useReason structured append\");\n }\n\n return appendPaths;\n};\n\nexport const resolveSetFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const setPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"set\")\n .map(([path]) => path);\n\n for (const path of setPaths) {\n assertStructuredPath(path, \"useReason structured set\");\n }\n\n return setPaths;\n};\n\nexport const resolveTextDeltaFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const textPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"text-delta\")\n .map(([path]) => path);\n\n for (const path of textPaths) {\n assertStructuredPath(path, \"useReason structured text-delta\");\n }\n\n return textPaths;\n};\n\nconst extractCompletedStringValueAt = (args: {\n text: string;\n start: number;\n}): { complete: boolean; value?: string } => {\n let value = \"\";\n\n for (let i = args.start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (ch === '\"') {\n return {\n complete: true,\n value,\n };\n }\n\n if (ch !== \"\\\\\") {\n value += ch;\n continue;\n }\n\n const next = args.text[i + 1];\n if (!next) {\n return {\n complete: false,\n };\n }\n\n if (\n next === '\"' ||\n next === \"\\\\\" ||\n next === \"/\" ||\n next === \"b\" ||\n next === \"f\" ||\n next === \"n\" ||\n next === \"r\" ||\n next === \"t\"\n ) {\n value +=\n next === \"b\"\n ? \"\\b\"\n : next === \"f\"\n ? \"\\f\"\n : next === \"n\"\n ? \"\\n\"\n : next === \"r\"\n ? \"\\r\"\n : next === \"t\"\n ? \"\\t\"\n : next;\n i += 1;\n continue;\n }\n\n if (next === \"u\") {\n const hex = args.text.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n return {\n complete: false,\n };\n }\n value += String.fromCharCode(Number.parseInt(hex, 16));\n i += 5;\n continue;\n }\n\n return {\n complete: false,\n };\n }\n\n return {\n complete: false,\n };\n};\n\nconst skipWhitespace = (text: string, start: number): number => {\n let i = start;\n while (i < text.length && /\\s/.test(text[i] ?? \"\")) i += 1;\n return i;\n};\n\nconst pathSegmentMatches = (patternPart: string, actualPart: string): boolean =>\n patternPart === \"*\" || patternPart === actualPart;\n\nconst pathMatchesPattern = (\n actualParts: string[],\n patternParts: string[],\n): boolean =>\n actualParts.length === patternParts.length &&\n actualParts.every((part, index) =>\n pathSegmentMatches(patternParts[index] ?? \"\", part),\n );\n\nconst isPathPrefix = (prefix: string[], full: string[]): boolean =>\n prefix.length <= full.length &&\n prefix.every((part, index) => pathSegmentMatches(full[index] ?? \"\", part));\n\nconst parseStringToken = (\n text: string,\n start: number,\n): { complete: boolean; end?: number; value?: string } => {\n if (text[start] !== '\"') return { complete: false };\n\n const parsed = extractCompletedStringValueAt({ text, start: start + 1 });\n if (!parsed.complete || parsed.value === undefined)\n return { complete: false };\n\n let inEscape = false;\n for (let i = start + 1; i < text.length; i += 1) {\n const ch = text[i];\n if (ch === undefined) break;\n\n if (inEscape) {\n inEscape = false;\n if (ch === \"u\") i += 4;\n continue;\n }\n\n if (ch === \"\\\\\") {\n inEscape = true;\n continue;\n }\n\n if (ch === '\"') {\n return {\n complete: true,\n end: i + 1,\n value: parsed.value,\n };\n }\n }\n\n return { complete: false };\n};\n\nconst skipNestedValue = (\n text: string,\n start: number,\n): { complete: boolean; end?: number } => {\n const opener = text[start];\n const closer = opener === \"{\" ? \"}\" : \"]\";\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n\n for (let i = start; i < text.length; i += 1) {\n const ch = text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === opener) {\n nesting += 1;\n continue;\n }\n\n if (ch === closer) {\n nesting -= 1;\n if (nesting === 0) {\n return { complete: true, end: i + 1 };\n }\n }\n }\n\n return { complete: false };\n};\n\nconst skipCompleteValue = (\n text: string,\n start: number,\n): { complete: boolean; end?: number } => {\n const i = skipWhitespace(text, start);\n const first = text[i];\n if (!first) return { complete: false };\n\n if (first === '\"') {\n const parsed = parseStringToken(text, i);\n return parsed.complete && parsed.end !== undefined\n ? { complete: true, end: parsed.end }\n : { complete: false };\n }\n\n if (first === \"{\" || first === \"[\") {\n return skipNestedValue(text, i);\n }\n\n for (let j = i; j < text.length; j += 1) {\n const ch = text[j];\n if (ch !== \",\" && ch !== \"}\" && ch !== \"]\") continue;\n\n const raw = text.slice(i, j).trim();\n if (!raw) return { complete: false };\n\n try {\n JSON.parse(raw);\n return { complete: true, end: j };\n } catch {\n return { complete: false };\n }\n }\n\n return { complete: false };\n};\n\nconst locateValueStart = (args: {\n text: string;\n path: string;\n}): { found: boolean; start?: number } => {\n const [first] = locateValueStarts(args);\n return first\n ? {\n found: true,\n start: first.start,\n }\n : {\n found: false,\n };\n};\n\nconst locateValueStarts = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; start: number }> => {\n const targetParts = parseStructuredPath(\n args.path,\n \"useReason structured field\",\n );\n const matches: Array<{ path: string; start: number }> = [];\n\n const visitValue = (start: number, currentParts: string[]): void => {\n const valueStart = skipWhitespace(args.text, start);\n if (pathMatchesPattern(currentParts, targetParts)) {\n matches.push({\n path: currentParts.join(\".\"),\n start: valueStart,\n });\n return;\n }\n\n if (!isPathPrefix(currentParts, targetParts)) {\n return;\n }\n\n const first = args.text[valueStart];\n if (first === \"{\") visitObject(valueStart + 1, currentParts);\n if (first === \"[\") visitArray(valueStart + 1, currentParts);\n };\n\n const visitObject = (start: number, currentParts: string[]): void => {\n let i = skipWhitespace(args.text, start);\n\n while (i < args.text.length) {\n const ch = args.text[i];\n if (ch === \"}\") return;\n if (ch === \",\") {\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (ch !== '\"') return;\n\n const key = parseStringToken(args.text, i);\n if (!key.complete || key.end === undefined || key.value === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, key.end);\n if (args.text[i] !== \":\") return;\n\n const valueStart = skipWhitespace(args.text, i + 1);\n const childParts = [...currentParts, key.value];\n if (pathMatchesPattern(childParts, targetParts)) {\n matches.push({\n path: childParts.join(\".\"),\n start: valueStart,\n });\n } else if (isPathPrefix(childParts, targetParts)) {\n visitValue(valueStart, childParts);\n }\n\n const skipped = skipCompleteValue(args.text, valueStart);\n if (!skipped.complete || skipped.end === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, skipped.end);\n if (args.text[i] === \",\") {\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (args.text[i] === \"}\") return;\n return;\n }\n };\n\n const visitArray = (start: number, currentParts: string[]): void => {\n let i = skipWhitespace(args.text, start);\n let index = 0;\n\n while (i < args.text.length) {\n if (args.text[i] === \"]\") return;\n\n const childParts = [...currentParts, String(index)];\n if (pathMatchesPattern(childParts, targetParts)) {\n matches.push({\n path: childParts.join(\".\"),\n start: i,\n });\n } else if (isPathPrefix(childParts, targetParts)) {\n visitValue(i, childParts);\n }\n\n const skipped = skipCompleteValue(args.text, i);\n if (!skipped.complete || skipped.end === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, skipped.end);\n if (args.text[i] === \",\") {\n index += 1;\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (args.text[i] === \"]\") return;\n return;\n }\n };\n\n visitValue(0, []);\n return matches;\n};\n\nconst extractCompletedValueAt = (args: {\n text: string;\n start: number;\n}): { complete: boolean; value?: unknown } => {\n const start = skipWhitespace(args.text, args.start);\n const first = args.text[start];\n if (!first) return { complete: false };\n\n if (first === '\"') {\n const parsed = extractCompletedStringValueAt({\n text: args.text,\n start: start + 1,\n });\n return parsed.complete\n ? {\n complete: true,\n value: parsed.value,\n }\n : {\n complete: false,\n };\n }\n\n if (first === \"{\") {\n return extractCompletedNestedValueAt({\n text: args.text,\n start,\n opener: \"{\",\n closer: \"}\",\n });\n }\n\n if (first === \"[\") {\n return extractCompletedNestedValueAt({\n text: args.text,\n start,\n opener: \"[\",\n closer: \"]\",\n });\n }\n\n for (let i = start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n if (ch !== \",\" && ch !== \"}\" && ch !== \"]\") continue;\n\n const raw = args.text.slice(start, i).trim();\n if (!raw) return { complete: false };\n\n try {\n return {\n complete: true,\n value: JSON.parse(raw),\n };\n } catch {\n return { complete: false };\n }\n }\n\n return { complete: false };\n};\n\nconst extractCompletedNestedValueAt = (args: {\n text: string;\n start: number;\n opener: \"{\" | \"[\";\n closer: \"}\" | \"]\";\n}): { complete: boolean; value?: unknown } => {\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n\n for (let i = args.start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === args.opener) {\n nesting += 1;\n continue;\n }\n\n if (ch === args.closer) {\n nesting -= 1;\n if (nesting === 0) {\n const raw = args.text.slice(args.start, i + 1);\n try {\n return {\n complete: true,\n value: JSON.parse(raw),\n };\n } catch {\n return {\n complete: false,\n };\n }\n }\n }\n }\n\n return {\n complete: false,\n };\n};\n\nexport const extractCompletedFieldValue = (args: {\n text: string;\n path: string;\n}): { found: boolean; complete: boolean; value?: unknown } => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) {\n return {\n found: located.found,\n complete: false,\n };\n }\n\n const parsed = extractCompletedValueAt({\n text: args.text,\n start: located.start,\n });\n return parsed.complete\n ? {\n found: true,\n complete: true,\n value: parsed.value,\n }\n : {\n found: true,\n complete: false,\n };\n};\n\nexport const extractCompletedFieldValues = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; value: unknown }> => {\n const located = locateValueStarts(args);\n const values: Array<{ path: string; value: unknown }> = [];\n\n for (const match of located) {\n const parsed = extractCompletedValueAt({\n text: args.text,\n start: match.start,\n });\n if (!parsed.complete) continue;\n\n values.push({\n path: match.path,\n value: parsed.value,\n });\n }\n\n return values;\n};\n\nexport const extractCompletedArrayItems = (args: {\n text: string;\n path: string;\n}): unknown[] => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) return [];\n\n const arrayStart = skipWhitespace(args.text, located.start);\n if (args.text[arrayStart] !== \"[\") return [];\n const start = arrayStart + 1;\n\n const items: unknown[] = [];\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n let itemStart = -1;\n\n for (let i = start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n if (itemStart < 0) itemStart = i;\n continue;\n }\n\n if (itemStart < 0) {\n if (/\\s/.test(ch) || ch === \",\") continue;\n if (ch === \"]\") break;\n itemStart = i;\n if (ch === \"{\" || ch === \"[\") {\n nesting = 1;\n } else {\n nesting = 0;\n }\n continue;\n }\n\n if (ch === \"{\" || ch === \"[\") {\n nesting += 1;\n continue;\n }\n\n if (ch === \"}\" || ch === \"]\") {\n if (nesting > 0) {\n nesting -= 1;\n continue;\n }\n }\n\n if (nesting === 0 && (ch === \",\" || ch === \"]\")) {\n const raw = args.text.slice(itemStart, i).trim();\n if (raw) {\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n itemStart = -1;\n if (ch === \"]\") break;\n }\n }\n\n return items;\n};\n\nexport const extractCompletedArrayItemGroups = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; items: unknown[] }> => {\n return locateValueStarts(args).flatMap((match) => {\n const items = extractCompletedArrayItems({\n text: args.text,\n path: match.path,\n });\n return items.length > 0\n ? [\n {\n path: match.path,\n items,\n },\n ]\n : [];\n });\n};\n\nexport const extractStreamingStringValue = (args: {\n text: string;\n path: string;\n}): { found: boolean; complete: boolean; value: string } => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) {\n return {\n found: located.found,\n complete: false,\n value: \"\",\n };\n }\n\n const stringStart = skipWhitespace(args.text, located.start);\n if (args.text[stringStart] !== '\"') {\n return {\n found: true,\n complete: false,\n value: \"\",\n };\n }\n\n let value = \"\";\n\n for (let i = stringStart + 1; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (ch === '\"') {\n return {\n found: true,\n complete: true,\n value,\n };\n }\n\n if (ch !== \"\\\\\") {\n value += ch;\n continue;\n }\n\n const next = args.text[i + 1];\n if (!next) {\n return {\n found: true,\n complete: false,\n value,\n };\n }\n\n if (\n next === '\"' ||\n next === \"\\\\\" ||\n next === \"/\" ||\n next === \"b\" ||\n next === \"f\" ||\n next === \"n\" ||\n next === \"r\" ||\n next === \"t\"\n ) {\n value +=\n next === \"b\"\n ? \"\\b\"\n : next === \"f\"\n ? \"\\f\"\n : next === \"n\"\n ? \"\\n\"\n : next === \"r\"\n ? \"\\r\"\n : next === \"t\"\n ? \"\\t\"\n : next;\n i += 1;\n continue;\n }\n\n if (next === \"u\") {\n const hex = args.text.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n return {\n found: true,\n complete: false,\n value,\n };\n }\n value += String.fromCharCode(Number.parseInt(hex, 16));\n i += 5;\n continue;\n }\n\n return {\n found: true,\n complete: false,\n value,\n };\n }\n\n return {\n found: true,\n complete: false,\n value,\n };\n};\n\nexport const extractStreamingStringValues = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; complete: boolean; value: string }> => {\n return locateValueStarts(args).flatMap((match) => {\n const current = extractStreamingStringValue({\n text: args.text,\n path: match.path,\n });\n return current.found\n ? [\n {\n path: match.path,\n complete: current.complete,\n value: current.value,\n },\n ]\n : [];\n });\n};\n","import { emitStructuredData } from \"../structured\";\nimport type { UseReasonStructuredConfig } from \"../types\";\nimport {\n extractCompletedArrayItemGroups,\n extractCompletedFieldValues,\n extractStreamingStringValues,\n resolveAppendFieldPaths,\n resolveSetFieldPaths,\n resolveTextDeltaFieldPaths,\n} from \"./structured-stream\";\n\nexport function createStructuredOutputStreamer(\n args: { structured?: UseReasonStructuredConfig | undefined },\n id: string | undefined,\n opId: string,\n) {\n let firstText = \"\";\n const setFieldPaths = resolveSetFieldPaths(args.structured);\n const appendFieldPaths = resolveAppendFieldPaths(args.structured);\n const textDeltaFieldPaths = resolveTextDeltaFieldPaths(args.structured);\n const emittedSetValues = new Map<string, string>();\n const emittedAppendCounts = new Map<string, number>();\n const emittedTextValues = new Map<string, string>();\n return (delta: string) => {\n firstText += delta;\n\n for (const fieldPath of setFieldPaths) {\n const values = extractCompletedFieldValues({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, value } of values) {\n const nextSerialized = JSON.stringify(value);\n if (emittedSetValues.get(path) === nextSerialized) continue;\n\n emittedSetValues.set(path, nextSerialized);\n emitStructuredData({\n kind: \"set\",\n path,\n value,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n\n for (const fieldPath of appendFieldPaths) {\n const groups = extractCompletedArrayItemGroups({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, items } of groups) {\n const emittedAppendCount = emittedAppendCounts.get(path) ?? 0;\n if (items.length <= emittedAppendCount) continue;\n\n const nextItems = items.slice(emittedAppendCount);\n emittedAppendCounts.set(path, items.length);\n emitStructuredData({\n kind: \"append\",\n path,\n items: nextItems,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n\n for (const fieldPath of textDeltaFieldPaths) {\n const values = extractStreamingStringValues({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, value } of values) {\n const emittedTextValue = emittedTextValues.get(path) ?? \"\";\n if (\n value.length <= emittedTextValue.length ||\n !value.startsWith(emittedTextValue)\n ) {\n continue;\n }\n\n const nextDelta = value.slice(emittedTextValue.length);\n emittedTextValues.set(path, value);\n if (nextDelta.length === 0) continue;\n\n emitStructuredData({\n kind: \"text-delta\",\n path,\n delta: nextDelta,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n };\n}\n","import type { InterruptInput } from \"@kortyx/core\";\nimport { ValidationError } from \"@kortyx/core/errors\";\nimport type { KortyxFinishReason, KortyxUsage } from \"@kortyx/providers\";\nimport type { SchemaLike } from \"../types\";\nimport { parseWithSchema } from \"../validation\";\n\nconst tryJsonParse = (\n value: string,\n):\n | { ok: true; value: unknown; error?: never }\n | { ok: false; error: string } => {\n try {\n return { ok: true, value: JSON.parse(value) };\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n};\n\nconst extractJsonCodeBlock = (value: string): string | null => {\n const match = value.match(/```(?:json)?\\s*([\\s\\S]*?)```/i);\n if (!match || typeof match[1] !== \"string\") return null;\n const inner = match[1].trim();\n return inner.length > 0 ? inner : null;\n};\n\nconst tryStringify = (value: unknown): string => {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nexport const resolveOutputCandidate = (text: string): unknown => {\n const trimmed = text.trim();\n if (!trimmed) return text;\n\n const direct = tryJsonParse(trimmed);\n if (direct.ok) return direct.value;\n\n const block = extractJsonCodeBlock(trimmed);\n if (block) {\n const parsedBlock = tryJsonParse(block);\n if (parsedBlock.ok) return parsedBlock.value;\n }\n\n return text;\n};\n\nconst createTruncatedStructuredOutputError = (\n label: string,\n cause?: unknown,\n): Error =>\n new ValidationError(\n \"OUTPUT_TRUNCATED\",\n `${label} was truncated before producing valid structured output. The model stopped due to output length. Increase maxOutputTokens or simplify the requested output.`,\n cause,\n );\n\nconst createInvalidStructuredOutputError = (\n label: string,\n cause?: unknown,\n): Error =>\n new ValidationError(\n \"INVALID_MODEL_JSON\",\n `${label} did not produce valid structured output. The model returned text instead of the expected JSON payload. Check the output contract or outputSchema and provider structured-output settings.`,\n cause,\n );\n\nexport const parseReasonOutputWithSchema = <TOutput>(args: {\n text: string;\n schema: SchemaLike<TOutput>;\n finishReason?: KortyxFinishReason;\n usage?: KortyxUsage;\n label: string;\n}): TOutput => {\n const candidate = resolveOutputCandidate(args.text);\n const block = extractJsonCodeBlock(args.text.trim());\n const validJson =\n tryJsonParse(args.text.trim()).ok ||\n (block !== null && tryJsonParse(block).ok);\n\n try {\n return parseWithSchema(args.schema, candidate, args.label);\n } catch (error) {\n if (!(error instanceof ValidationError)) throw error;\n const failure =\n args.finishReason?.unified === \"length\"\n ? createTruncatedStructuredOutputError(args.label, error)\n : typeof candidate === \"string\" && !validJson\n ? createInvalidStructuredOutputError(args.label, error)\n : error;\n if (failure && typeof failure === \"object\")\n Object.assign(failure, {\n ...(args.usage ? { usage: args.usage } : {}),\n ...(args.finishReason ? { finishReason: args.finishReason } : {}),\n });\n throw failure;\n }\n};\n\nexport const parseInterruptFirstPassResult = <\n TRequest extends InterruptInput = InterruptInput,\n TOutput = unknown,\n>(args: {\n text: string;\n requestSchema: SchemaLike<TRequest>;\n outputSchema?: SchemaLike<TOutput>;\n finishReason?: KortyxFinishReason;\n usage?: KortyxUsage;\n mode?: \"required\" | \"optional\" | undefined;\n}):\n | {\n draftText: string;\n interruptRequired: boolean;\n request: TRequest;\n output?: TOutput;\n }\n | {\n draftText: string;\n interruptRequired: false;\n request?: undefined;\n output?: TOutput;\n } => {\n try {\n const candidate = resolveOutputCandidate(args.text);\n if (!isRecord(candidate)) {\n if (args.finishReason?.unified === \"length\") {\n throw createTruncatedStructuredOutputError(\"useReason output\");\n }\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\n throw createInvalidStructuredOutputError(\"useReason output\");\n }\n throw new ValidationError(\n \"MODEL_OUTPUT_SCHEMA\",\n \"useReason first pass with interrupt must return a JSON object.\",\n );\n }\n\n const mode = args.mode ?? \"required\";\n let interruptRequired = true;\n if (mode === \"optional\") {\n if (\n candidate.decision !== \"continue\" &&\n candidate.decision !== \"interrupt\"\n ) {\n throw new ValidationError(\n \"MODEL_OUTPUT_SCHEMA\",\n 'useReason optional interrupt first pass must include decision \"continue\" or \"interrupt\".',\n );\n }\n interruptRequired = candidate.decision === \"interrupt\";\n\n if (!interruptRequired) {\n const hasUnexpectedRequest = [\n candidate.interruptRequest,\n candidate.request,\n candidate.interrupt,\n ].some((value) => value !== null && value !== undefined);\n\n if (hasUnexpectedRequest) {\n throw new ValidationError(\n \"MODEL_OUTPUT_SCHEMA\",\n 'useReason optional interrupt first pass with decision \"continue\" must not include an interrupt request.',\n );\n }\n }\n }\n\n let request: TRequest | undefined;\n if (interruptRequired) {\n const requestCandidates: unknown[] = [\n candidate.interruptRequest,\n candidate.request,\n candidate.interrupt,\n mode === \"required\" ? candidate : undefined,\n ];\n const requestPayload = requestCandidates.find(\n (value) => value !== null && value !== undefined,\n );\n\n request = parseWithSchema(\n args.requestSchema,\n requestPayload,\n \"useReason interrupt.request\",\n );\n }\n\n let output: TOutput | undefined;\n if (args.outputSchema) {\n const outputPayload = Object.hasOwn(candidate, \"output\")\n ? candidate.output\n : candidate;\n try {\n output = parseWithSchema(\n args.outputSchema,\n outputPayload,\n \"useReason output\",\n );\n } catch (error) {\n if (!(error instanceof ValidationError)) throw error;\n if (args.finishReason?.unified === \"length\") {\n throw createTruncatedStructuredOutputError(\"useReason output\", error);\n }\n throw error;\n }\n }\n\n const explicitDraft =\n typeof candidate.draftText === \"string\" && candidate.draftText.length > 0\n ? candidate.draftText\n : typeof candidate.text === \"string\" && candidate.text.length > 0\n ? candidate.text\n : undefined;\n\n if (!args.outputSchema && !explicitDraft) {\n throw new ValidationError(\n \"MODEL_OUTPUT_SCHEMA\",\n \"useReason first pass with interrupt requires `draftText` when outputSchema is not provided.\",\n );\n }\n\n const draftText =\n explicitDraft ??\n (output !== undefined ? tryStringify(output) : String(args.text ?? \"\"));\n\n if (!interruptRequired) {\n return {\n draftText,\n interruptRequired: false,\n ...(output !== undefined ? { output } : {}),\n };\n }\n\n return {\n draftText,\n interruptRequired: true,\n request: request as TRequest,\n ...(output !== undefined ? { output } : {}),\n };\n } catch (error) {\n if (error && typeof error === \"object\")\n Object.assign(error, {\n ...(args.usage ? { usage: args.usage } : {}),\n ...(args.finishReason ? { finishReason: args.finishReason } : {}),\n });\n throw error;\n }\n};\n","import type { InterruptInput } from \"@kortyx/core\";\nimport { toJSONSchema } from \"zod\";\nimport type { SchemaLike } from \"../types\";\n\nconst tryStringify = (value: unknown): string => {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nconst tryGetSchemaHint = (schema: unknown): string | undefined => {\n try {\n const hint = toJSONSchema(schema as never);\n return JSON.stringify(hint, null, 2);\n } catch {\n return undefined;\n }\n};\n\nconst withSchemaHint = (\n input: string,\n label: string,\n schema: unknown,\n): string => {\n const hint = tryGetSchemaHint(schema);\n if (!hint) return input;\n return `${input}\\n\\n${label}:\\n${hint}`;\n};\n\nexport const defaultInterruptFirstPassInput = (args: {\n input: string;\n requestSchema: SchemaLike<unknown>;\n outputSchema?: SchemaLike<unknown>;\n mode?: \"required\" | \"optional\" | undefined;\n}): string => {\n const mode = args.mode ?? \"required\";\n const base =\n mode === \"optional\"\n ? args.outputSchema\n ? [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: decision, output, interruptRequest, draftText.\",\n '- decision must be either \"continue\" or \"interrupt\".',\n '- Use decision \"continue\" when you can produce the final output without asking the user.',\n '- Use decision \"interrupt\" only when user input is needed before finalizing.',\n \"- output must match the expected output JSON schema.\",\n '- When decision is \"interrupt\", interruptRequest must match the expected interrupt request JSON schema and must be a non-null object.',\n '- When decision is \"continue\", interruptRequest must be null.',\n \"- draftText should be a concise plain-language summary of output.\",\n ].join(\"\\n\\n\")\n : [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: decision, draftText, interruptRequest.\",\n '- decision must be either \"continue\" or \"interrupt\".',\n '- Use decision \"continue\" when you can produce the final answer without asking the user.',\n '- Use decision \"interrupt\" only when user input is needed before finalizing.',\n \"- draftText should be the current answer text.\",\n '- When decision is \"interrupt\", interruptRequest must match the expected interrupt request JSON schema and must be a non-null object.',\n '- When decision is \"continue\", interruptRequest must be null.',\n ].join(\"\\n\\n\")\n : args.outputSchema\n ? [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: output, interruptRequest, draftText.\",\n \"- output must match the expected output JSON schema.\",\n \"- interruptRequest must match the expected interrupt request JSON schema.\",\n \"- interruptRequest must be a non-null object.\",\n \"- draftText should be a concise plain-language summary of output.\",\n \"- If uncertain, still return a valid interruptRequest with safe default options.\",\n ].join(\"\\n\\n\")\n : [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: draftText, interruptRequest.\",\n \"- draftText should be the current draft answer text.\",\n \"- interruptRequest must match the expected interrupt request JSON schema.\",\n \"- interruptRequest must be a non-null object.\",\n \"- If uncertain, still return a valid interruptRequest with safe default options.\",\n ].join(\"\\n\\n\");\n\n const withInterruptSchema = withSchemaHint(\n base,\n \"Expected interrupt request JSON schema (for `interruptRequest`)\",\n args.requestSchema,\n );\n\n if (!args.outputSchema) return withInterruptSchema;\n const withOutputSchema = withSchemaHint(\n withInterruptSchema,\n \"Expected output JSON schema (for `output`)\",\n args.outputSchema,\n );\n return [\n withOutputSchema,\n \"JSON template:\",\n mode === \"optional\"\n ? '{ \"decision\": \"continue\", \"output\": { ... }, \"interruptRequest\": null, \"draftText\": \"...\" }'\n : '{ \"output\": { ... }, \"interruptRequest\": { ... }, \"draftText\": \"...\" }',\n ].join(\"\\n\\n\");\n};\n\nexport const defaultContinuationInput = (args: {\n input: string;\n draftText: string;\n draftOutput?: unknown;\n request: InterruptInput;\n response: unknown;\n}): string =>\n [\n \"You are continuing a paused reasoning task after user input.\",\n \"Update the previous result using the user response and return the final answer only.\",\n \"If the previous output was JSON, return JSON in the same schema.\",\n \"\",\n `Original request:\\n${args.input}`,\n `Draft answer text:\\n${args.draftText}`,\n `Draft output object:\\n${tryStringify(args.draftOutput ?? args.draftText)}`,\n `Interrupt request shown to user:\\n${tryStringify(args.request)}`,\n `User response:\\n${tryStringify(args.response)}`,\n ].join(\"\\n\\n\");\n\nexport const withOutputGuardrails = (\n input: string,\n schema?: SchemaLike<unknown>,\n): string => {\n const base = [\n input,\n \"Output rules:\",\n \"- Return only JSON, no markdown fences.\",\n \"- Ensure the response conforms to the expected output schema.\",\n \"- Do not include explanatory text outside the JSON object.\",\n ].join(\"\\n\\n\");\n return withSchemaHint(base, \"Expected output JSON schema\", schema);\n};\n\nexport const withStructuredStreamHints = (\n input: string,\n args: {\n setFieldPaths?: string[];\n appendFieldPaths?: string[];\n textDeltaFieldPaths?: string[];\n },\n): string => {\n const rules: string[] = [];\n\n for (const path of args.setFieldPaths ?? []) {\n rules.push(\n `- For the field path pattern \\`${path}\\`, write one stable final value and do not rewrite it after it is complete.`,\n );\n }\n\n for (const path of args.appendFieldPaths ?? []) {\n rules.push(\n `- For the array field path pattern \\`${path}\\`, write items in final order and finish each item before starting the next.`,\n );\n rules.push(\n `- Once an item in \\`${path}\\` is complete, do not rewrite or reorder earlier items.`,\n );\n }\n\n for (const path of args.textDeltaFieldPaths ?? []) {\n rules.push(\n `- For the string field path pattern \\`${path}\\`, write the value progressively by appending text to the end.`,\n );\n rules.push(\n `- Do not rewrite or replace the earlier prefix of \\`${path}\\` once emitted.`,\n );\n }\n\n if (rules.length === 0) return input;\n\n return [\n input,\n \"Streaming rules:\",\n ...rules,\n \"- Keep the overall response as valid JSON.\",\n ].join(\"\\n\\n\");\n};\n","import type {\n KortyxFinishReason,\n KortyxProviderMetadata,\n KortyxUsage,\n KortyxWarning,\n} from \"@kortyx/providers\";\nimport { emitStructuredData, shouldEmitStructured } from \"../structured\";\nimport type { UseReasonArgs } from \"../types\";\n\nexport const mergeUsage = (\n left: KortyxUsage | undefined,\n right: KortyxUsage | undefined,\n): KortyxUsage | undefined => {\n if (!left) return right;\n if (!right) return left;\n\n const sum = (\n a: number | undefined,\n b: number | undefined,\n ): number | undefined =>\n a === undefined && b === undefined ? undefined : (a ?? 0) + (b ?? 0);\n\n const raw =\n left.raw || right.raw\n ? {\n ...(left.raw ?? {}),\n ...(right.raw ?? {}),\n }\n : undefined;\n const input = sum(left.input, right.input);\n const output = sum(left.output, right.output);\n const total = sum(left.total, right.total);\n const reasoning = sum(left.reasoning, right.reasoning);\n const cacheRead = sum(left.cacheRead, right.cacheRead);\n const cacheWrite = sum(left.cacheWrite, right.cacheWrite);\n const cacheWrite1h = sum(left.cacheWrite1h, right.cacheWrite1h);\n const merged: KortyxUsage = {\n ...(right.outputIncludesReasoning !== undefined\n ? { outputIncludesReasoning: right.outputIncludesReasoning }\n : {}),\n ...(right.inputIncludesCacheWrite !== undefined\n ? { inputIncludesCacheWrite: right.inputIncludesCacheWrite }\n : {}),\n ...(right.inputIncludesCacheRead !== undefined\n ? { inputIncludesCacheRead: right.inputIncludesCacheRead }\n : {}),\n };\n\n if (input !== undefined) merged.input = input;\n if (output !== undefined) merged.output = output;\n if (total !== undefined) merged.total = total;\n if (reasoning !== undefined) merged.reasoning = reasoning;\n if (cacheRead !== undefined) merged.cacheRead = cacheRead;\n if (cacheWrite !== undefined) merged.cacheWrite = cacheWrite;\n if (cacheWrite1h !== undefined) merged.cacheWrite1h = cacheWrite1h;\n if (raw) merged.raw = raw;\n\n return merged;\n};\n\nexport const mergeWarnings = (\n left: KortyxWarning[] | undefined,\n right: KortyxWarning[] | undefined,\n): KortyxWarning[] | undefined => {\n if (!left?.length) return right;\n if (!right?.length) return left;\n\n const seen = new Set<string>();\n const merged: KortyxWarning[] = [];\n for (const warning of [...left, ...right]) {\n const key = JSON.stringify(warning);\n if (seen.has(key)) continue;\n seen.add(key);\n merged.push(warning);\n }\n return merged;\n};\n\nexport const mergeProviderMetadata = (\n left: KortyxProviderMetadata | undefined,\n right: KortyxProviderMetadata | undefined,\n): KortyxProviderMetadata | undefined => {\n if (!left) return right;\n if (!right) return left;\n return {\n ...left,\n ...right,\n };\n};\n\nexport const emitReasonStructuredOutput = <TOutput>(args: {\n id?: string;\n opId: string;\n output: TOutput;\n structured: UseReasonArgs<TOutput>[\"structured\"];\n emit: boolean;\n}): void => {\n if (!args.emit || !shouldEmitStructured(args.structured)) return;\n\n emitStructuredData<TOutput>({\n dataType: args.structured?.dataType ?? \"reason-output\",\n data: args.output,\n kind: \"final\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(args.id ? { id: args.id } : {}),\n streamId: args.opId,\n });\n};\n\nexport type ReasonResultAggregation = {\n usage?: KortyxUsage | undefined;\n finishReason?: KortyxFinishReason | undefined;\n providerMetadata?: KortyxProviderMetadata | undefined;\n warnings?: KortyxWarning[] | undefined;\n};\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { combineAbortSignals, throwIfExecutionAborted } from \"@kortyx/core\";\nimport {\n isControlFlowError,\n ProviderRequestError,\n serializeFailure,\n} from \"@kortyx/core/errors\";\nimport type {\n KortyxExecutableTool,\n KortyxFinishReason,\n KortyxPromptMessage,\n KortyxProviderMetadata,\n KortyxToolCall,\n KortyxToolDefinition,\n KortyxToolResult,\n KortyxUsage,\n KortyxWarning,\n} from \"@kortyx/providers\";\nimport { toJSONSchema } from \"zod\";\nimport { accumulateTokenUsage, getHookContext } from \"../context\";\nimport { awaitInterruptInternal } from \"../interrupt\";\nimport {\n interruptControlToolName,\n isInterruptControlToolName,\n isLegacyInterruptContracts,\n normalizeReasonInterrupts,\n} from \"../interrupt-contract\";\nimport {\n isOutputControlToolName,\n outputControlToolName,\n} from \"../output-contract\";\nimport {\n type RunReasonEngineResult,\n resolveProviderOptions,\n} from \"../reason-engine\";\nimport { emitStructuredData, shouldStreamStructured } from \"../structured\";\nimport {\n executeObservedTool,\n observeToolFact,\n replayToolObservations,\n} from \"../tool\";\nimport type { ReasonTraceSpan } from \"../tracing\";\nimport type {\n InterruptContract,\n InterruptContractMap,\n InterruptHistoryEntry,\n OutputContract,\n OutputContractEntry,\n OutputContractMap,\n UseReasonArgs,\n UseReasonResult,\n UseReasonStep,\n} from \"../types\";\nimport { parseWithSchema } from \"../validation\";\nimport { reasonEngine } from \"./engine\";\nimport { inferOutputFormat } from \"./output-format\";\nimport { createStructuredOutputStreamer } from \"./output-stream\";\nimport { parseReasonOutputWithSchema } from \"./parsing\";\nimport { withOutputGuardrails } from \"./prompting\";\nimport {\n emitReasonStructuredOutput,\n mergeProviderMetadata,\n mergeUsage,\n mergeWarnings,\n} from \"./result\";\n\nconst toToolDefinitions = (\n tools: KortyxExecutableTool[],\n): KortyxToolDefinition[] =>\n tools.map((tool) => ({\n name: tool.name,\n ...(tool.title ? { title: tool.title } : {}),\n ...(tool.description ? { description: tool.description } : {}),\n inputSchema: tool.inputSchema,\n ...(tool.outputSchema !== undefined\n ? { outputSchema: tool.outputSchema }\n : {}),\n ...(tool.annotations !== undefined\n ? { annotations: tool.annotations }\n : {}),\n ...(tool.metadata !== undefined ? { metadata: tool.metadata } : {}),\n }));\n\nconst resolveToolExecutionBoolean = (\n value: boolean | Record<string, boolean> | undefined,\n toolName: string,\n fallback: boolean,\n): boolean => {\n if (typeof value === \"boolean\") return value;\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value[toolName] ?? fallback;\n }\n return fallback;\n};\n\nconst normalizeToolResult = (\n toolCall: KortyxToolCall,\n value: KortyxToolResult | unknown,\n): KortyxToolResult => {\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n \"toolCallId\" in value &&\n \"name\" in value &&\n \"content\" in value &&\n typeof value.content === \"string\"\n ) {\n const result = value as KortyxToolResult;\n return { ...result, toolCallId: toolCall.id, name: toolCall.name };\n }\n\n let content: string;\n try {\n content =\n typeof value === \"string\"\n ? value\n : (JSON.stringify(value) ?? String(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 createInitialMessages = (args: {\n system?: string | undefined;\n input: string;\n interruptInstructions?: string | undefined;\n outputInstructions?: string | undefined;\n}): KortyxPromptMessage[] => [\n ...(typeof args.system === \"string\" ||\n args.interruptInstructions ||\n args.outputInstructions\n ? [\n {\n role: \"system\" as const,\n content: [\n args.system,\n args.interruptInstructions,\n args.outputInstructions,\n ]\n .filter((value): value is string => Boolean(value))\n .join(\"\\n\\n\"),\n },\n ]\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 TContracts extends InterruptContractMap = InterruptContractMap,\n TEmit extends OutputContractMap = OutputContractMap,\n TReturn extends OutputContractMap = OutputContractMap,\n>(args: {\n useReasonArgs: UseReasonArgs<\n TOutput,\n TRequest,\n TResponse,\n TContracts,\n TEmit,\n TReturn\n >;\n id?: string | undefined;\n opId: string;\n traceSpan?: ReasonTraceSpan | undefined;\n checkpointKey: string;\n initialWarnings?: KortyxWarning[] | undefined;\n allowValidatedToolOutput?: boolean;\n}): Promise<\n UseReasonResult<TOutput, TResponse, TContracts, TEmit, TReturn>\n> => {\n const { useReasonArgs, id, traceSpan, checkpointKey } = args;\n const ctx = getHookContext();\n const abortSignal = combineAbortSignals(\n ctx.node.abortSignal,\n useReasonArgs.abortSignal,\n useReasonArgs.model.options?.abortSignal,\n );\n const saved = ctx.currentNodeState.byKey[checkpointKey] as\n | ToolLoopCheckpoint\n | undefined;\n const checkpoint = saved?.status === \"tool_loop\" ? saved : undefined;\n const opId = checkpoint?.opId ?? args.opId;\n const tools = useReasonArgs.tools ?? [];\n const interruptConfig = normalizeReasonInterrupts({\n interrupt: useReasonArgs.interrupt,\n interrupts: useReasonArgs.interrupts,\n });\n const interruptByToolName = new Map<\n string,\n { name: string; contract: InterruptContract<unknown, unknown> }\n >();\n const outputByToolName = new Map<\n string,\n {\n name: string;\n kind: \"emit\" | \"return\";\n contract: OutputContract<unknown>;\n stream: boolean;\n }\n >();\n const toolByName = new Map<string, KortyxExecutableTool>();\n let separateOutput = false;\n\n for (const tool of tools) {\n if (\n isInterruptControlToolName(tool.name) ||\n isOutputControlToolName(tool.name)\n )\n throw new Error(\n `useReason tool name \"${tool.name}\" uses a reserved control-tool namespace.`,\n );\n if (toolByName.has(tool.name)) {\n throw new Error(`useReason received duplicate tool name \"${tool.name}\".`);\n }\n toolByName.set(tool.name, tool);\n }\n\n separateOutput = Boolean(\n useReasonArgs.model.provider.getModel(useReasonArgs.model.modelId, {\n ...useReasonArgs.model.options,\n ...(useReasonArgs.reasoning !== undefined\n ? { reasoning: useReasonArgs.reasoning }\n : {}),\n ...(useReasonArgs.responseFormat\n ? { responseFormat: useReasonArgs.responseFormat }\n : {}),\n providerOptions:\n resolveProviderOptions(\n useReasonArgs.model.options?.providerOptions,\n useReasonArgs.providerOptions,\n ) ?? {},\n }).requiresSeparateStructuredOutput,\n );\n\n const interruptDefinitions: KortyxToolDefinition[] = [];\n for (const [name, contract] of Object.entries(\n interruptConfig?.contracts ?? {},\n )) {\n const toolName = interruptControlToolName(name);\n if (toolByName.has(toolName))\n throw new Error(\n `useReason tool name \"${toolName}\" is reserved for interrupt contracts.`,\n );\n let inputSchema: unknown;\n try {\n inputSchema = toJSONSchema(contract.requestSchema as never);\n } catch (error) {\n throw new Error(\n `useReason interrupt contract \"${name}\" requestSchema must support JSON Schema conversion.`,\n { cause: error },\n );\n }\n interruptByToolName.set(toolName, { name, contract });\n interruptDefinitions.push({\n name: toolName,\n title: `Request human input: ${name}`,\n description: [\n contract.description,\n \"Call this only when human input is needed. Execution pauses until the validated response is returned as this tool's result.\",\n ].join(\" \"),\n inputSchema,\n metadata: {\n kortyxControl: \"interrupt\",\n contract: name,\n schemaId: contract.schemaId,\n schemaVersion: contract.schemaVersion,\n },\n });\n }\n const outputDefinitions: KortyxToolDefinition[] = [];\n for (const kind of [\"emit\", \"return\"] as const) {\n for (const [name, contract] of Object.entries(\n useReasonArgs.outputs?.[kind] ?? {},\n )) {\n if (contract.stream) {\n const streamName = outputControlToolName(\n kind === \"emit\" ? \"stream-emit\" : \"stream-return\",\n name,\n );\n outputByToolName.set(streamName, {\n name,\n kind,\n contract,\n stream: true,\n });\n outputDefinitions.push({\n name: streamName,\n title: `Stream structured output: ${name}`,\n description: `${contract.description} Call this to start realtime generation of this structured value. The value is generated in a separate streamed model pass, validated, and ${kind === \"emit\" ? \"returned as a tool result so you can continue\" : \"used to finish this operation\"}.`,\n inputSchema: {\n type: \"object\",\n properties: {\n instruction: {\n type: \"string\",\n description: \"What the streamed output should contain.\",\n },\n },\n required: [\"instruction\"],\n additionalProperties: false,\n },\n metadata: {\n kortyxControl:\n kind === \"emit\" ? \"output.stream.emit\" : \"output.stream.return\",\n contract: name,\n schemaId: contract.schemaId,\n schemaVersion: contract.schemaVersion,\n },\n });\n } else {\n const toolName = outputControlToolName(kind, name);\n outputByToolName.set(toolName, { name, kind, contract, stream: false });\n outputDefinitions.push({\n name: toolName,\n title: `${kind === \"emit\" ? \"Emit\" : \"Return\"} structured output: ${name}`,\n description: `${contract.description} ${kind === \"emit\" ? \"Emit this structured value and continue reasoning.\" : \"Return this structured value and finish reasoning.\"}`,\n inputSchema: toJSONSchema(contract.schema as never),\n metadata: {\n kortyxControl: kind === \"emit\" ? \"output.emit\" : \"output.return\",\n contract: name,\n schemaId: contract.schemaId,\n schemaVersion: contract.schemaVersion,\n },\n });\n }\n }\n }\n const toolDefinitions = [\n ...toToolDefinitions(tools),\n ...interruptDefinitions,\n ...outputDefinitions,\n ];\n let finalizing = checkpoint?.finalizing ?? false;\n let completed = false;\n const maxSteps = Math.max(1, useReasonArgs.toolExecution?.maxSteps ?? 3);\n const messages =\n checkpoint?.messages ??\n createInitialMessages({\n system: useReasonArgs.system,\n input: useReasonArgs.outputSchema\n ? withOutputGuardrails(useReasonArgs.input, useReasonArgs.outputSchema)\n : useReasonArgs.input,\n ...(interruptConfig\n ? {\n interruptInstructions: [\n \"Human-input rules:\",\n \"- The kortyx_request_input__* tools pause this reasoning operation and return the validated human response as a normal tool result.\",\n \"- You may combine human-input tools with domain tools and output controls. Tools, emitted outputs, and human-input requests run in their requested order. Terminal output publishes last using the completed results.\",\n interruptConfig.mode === \"required\"\n ? \"- You must call at least one human-input tool before returning the final answer.\"\n : \"- Human input is optional; call a human-input tool only when the request cannot be completed safely without it.\",\n ].join(\"\\n\"),\n }\n : {}),\n ...(useReasonArgs.outputs\n ? {\n outputInstructions: [\n \"Structured output rules:\",\n \"- The kortyx_emit__* tools publish validated structured output and return an acknowledgement. You may continue with text or more tools afterward.\",\n \"- The kortyx_return__* tools publish a validated result and end this reasoning operation. If return tools are available, call exactly one before finishing.\",\n \"- For contracts with realtime streaming, use kortyx_stream_emit__* or kortyx_stream_return__*. These start a separate streamed JSON generation; its fields become visible as tokens arrive.\",\n \"- You may combine multiple emit controls, domain tools, and human-input requests in one turn. Tools, emitted outputs, and human-input requests run in their requested order; the terminal return runs last. Outputs after domain tools or human input are regenerated using their completed results. Request at most one terminal return per turn.\",\n ].join(\"\\n\"),\n }\n : {}),\n });\n const steps: UseReasonStep[] = checkpoint?.steps ?? [];\n const allToolCalls: KortyxToolCall[] = steps\n .flatMap((step) => step.toolCalls)\n .filter(\n (call) =>\n !interruptByToolName.has(call.name) && !outputByToolName.has(call.name),\n );\n const knownToolCallIds = new Set(\n steps.flatMap((step) => step.toolCalls.map((call) => call.id)),\n );\n const allToolResults: KortyxToolResult[] = steps\n .flatMap((step) => step.toolResults)\n .filter(\n (result) =>\n !interruptByToolName.has(result.name) &&\n !outputByToolName.has(result.name),\n );\n let finalText = \"\";\n let finalRaw: unknown;\n let finalOutput: TOutput | undefined;\n let aggregatedUsage = steps.reduce<KortyxUsage | undefined>(\n (usage, step) => mergeUsage(usage, step.usage),\n undefined,\n );\n let finalFinishReason: KortyxFinishReason | undefined;\n let aggregatedProviderMetadata: KortyxProviderMetadata | undefined;\n let aggregatedWarnings = steps.reduce<KortyxWarning[] | undefined>(\n (warnings, step) => mergeWarnings(warnings, step.warnings),\n args.initialWarnings,\n );\n let pending = checkpoint?.pending;\n let pendingStepIndex = checkpoint?.pendingStepIndex;\n let outputContractCorrections = checkpoint?.outputContractCorrections ?? 0;\n const correctionExhausted = () => {\n const message = `useReason could not complete output-contract correction within toolExecution.maxSteps (${maxSteps}). Select exactly one terminal return contract; multiple emit contracts are allowed. Increase maxSteps to allow correction and output generation.`;\n return new ProviderRequestError(message, {\n code: \"REASON_OUTPUT_CONTRACT_CORRECTION_EXHAUSTED\",\n operation: \"useReason\",\n safeMessage: message,\n retryable: false,\n details: { maxSteps, outputContractCorrections },\n });\n };\n const resolvedInterrupts = checkpoint?.resolvedInterrupts ?? [];\n for (const request of resolvedInterrupts) ctx.node.replayInterrupt?.(request);\n const approvedCalls = checkpoint?.approvedCalls ?? [];\n const interruptHistory = (checkpoint?.interruptHistory ?? []) as Array<\n InterruptHistoryEntry<TContracts>\n >;\n const emissions = (checkpoint?.emissions ??\n []) as OutputContractEntry<TEmit>[];\n let returned = checkpoint?.returned as\n | OutputContractEntry<TReturn>\n | undefined;\n const save = () => {\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"tool_loop\",\n opId,\n messages,\n steps,\n approvedCalls,\n resolvedInterrupts,\n interruptHistory,\n emissions,\n outputContractCorrections,\n ...(returned ? { returned } : {}),\n finalizing,\n ...(pending ? { pending } : {}),\n ...(pending && pendingStepIndex !== undefined\n ? { pendingStepIndex }\n : {}),\n } satisfies ToolLoopCheckpoint;\n ctx.stateDirty = true;\n };\n\n const rememberInterrupt = (request: InterruptInput) => {\n resolvedInterrupts.push(request);\n save();\n };\n\n const emitToolEvent = (\n event: string,\n payload: Record<string, unknown>,\n ): void => {\n ctx.node.emit(event, {\n ...payload,\n node: ctx.node.graph.node,\n ...(id ? { id } : {}),\n opId,\n });\n };\n\n try {\n for (\n let stepIndex = pending\n ? (pendingStepIndex ?? steps.length - 1)\n : steps.length;\n stepIndex < maxSteps;\n stepIndex = steps.length\n ) {\n throwIfExecutionAborted(abortSignal);\n traceSpan?.addEvent?.(\"useReason.tool-step.start\", {\n stepIndex,\n toolCount: toolDefinitions.length,\n });\n\n const reused = Boolean(pending);\n const stream =\n useReasonArgs.stream ?? useReasonArgs.model.options?.streaming ?? true;\n const emit = useReasonArgs.emit ?? true;\n let textStarted = false;\n const segmentId = `step-${stepIndex}`;\n const structuredChunk =\n useReasonArgs.outputSchema &&\n (!separateOutput || finalizing) &&\n stream &&\n emit &&\n shouldStreamStructured(useReasonArgs.structured)\n ? createStructuredOutputStreamer(useReasonArgs, id, opId)\n : undefined;\n const step =\n pending ??\n (await reasonEngine(\n {\n ...useReasonArgs,\n tools: finalizing ? [] : toolDefinitions,\n ...(separateOutput && !finalizing\n ? { responseFormat: { type: \"text\" as const } }\n : {}),\n messages,\n emit: false,\n stream,\n onTextChunk: (delta) => {\n if (structuredChunk) structuredChunk(delta);\n if (!emit || useReasonArgs.outputSchema || !delta) return;\n if (!textStarted) {\n emitToolEvent(\"text-start\", { segmentId });\n textStarted = true;\n }\n emitToolEvent(\"text-delta\", { delta, segmentId });\n },\n },\n { ...(id ? { id } : {}), opId },\n ));\n\n if (textStarted) emitToolEvent(\"text-end\", { segmentId });\n finalText = step.text;\n finalRaw = step.raw;\n if (!reused) {\n aggregatedUsage = mergeUsage(aggregatedUsage, step.usage);\n accumulateTokenUsage(step.usage);\n }\n finalFinishReason = step.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n step.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, step.warnings);\n\n const toolCalls = step.toolCalls ?? [];\n const ids = new Set<string>();\n for (const call of toolCalls) {\n if (\n !call.id ||\n ids.has(call.id) ||\n (!reused && knownToolCallIds.has(call.id))\n )\n throw new Error(\"Model returned duplicate or empty tool call IDs.\");\n ids.add(call.id);\n }\n const toolResults: KortyxToolResult[] = reused\n ? (steps[stepIndex]?.toolResults ?? [])\n : [];\n if (!reused)\n steps.push({\n stepIndex,\n text: step.text,\n toolCalls,\n toolResults,\n ...(step.usage ? { usage: step.usage } : {}),\n ...(step.finishReason ? { finishReason: step.finishReason } : {}),\n ...(step.providerMetadata\n ? { providerMetadata: step.providerMetadata }\n : {}),\n ...(step.warnings ? { warnings: step.warnings } : {}),\n });\n if (!reused) for (const call of toolCalls) knownToolCallIds.add(call.id);\n\n if (toolCalls.length === 0) {\n if (\n Object.keys(useReasonArgs.outputs?.return ?? {}).length > 0 &&\n !returned\n )\n throw new Error(\n \"useReason outputs.return requires one terminal output contract call.\",\n );\n if (\n interruptConfig?.mode === \"required\" &&\n interruptHistory.length === 0\n )\n throw new Error(\n \"useReason interrupts.mode is required, but the model returned a final answer without requesting human input.\",\n );\n if (separateOutput && !finalizing) {\n if (args.allowValidatedToolOutput && useReasonArgs.outputSchema) {\n try {\n finalOutput = parseReasonOutputWithSchema({\n text: step.text,\n schema: useReasonArgs.outputSchema,\n ...(step.finishReason\n ? { finishReason: step.finishReason }\n : {}),\n ...(aggregatedUsage ? { usage: aggregatedUsage } : {}),\n label: \"useReason output\",\n });\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, [\n {\n type: \"compatibility\",\n feature: \"responseFormat\",\n details:\n \"Reused locally validated tool-phase output without an extra native-schema request. Set responseFormat.schema explicitly to require provider schema enforcement.\",\n },\n ]);\n completed = true;\n break;\n } catch {\n // A schema-only pass can repair a nonconforming draft, within the existing limits.\n }\n }\n messages.push({\n role: \"assistant\",\n content: step.text,\n ...(step.continuation ? { continuation: step.continuation } : {}),\n });\n messages.push({\n role: \"user\",\n content:\n \"Return the final answer using the requested output schema and the tool results above.\",\n });\n finalizing = true;\n pending = undefined;\n pendingStepIndex = undefined;\n save();\n continue;\n }\n completed = true;\n break;\n }\n if (finalizing)\n throw new Error(\n \"Provider requested a tool during schema-only finalization.\",\n );\n\n if (!reused) {\n allToolCalls.push(\n ...toolCalls.filter(\n (call) =>\n !interruptByToolName.has(call.name) &&\n !outputByToolName.has(call.name),\n ),\n );\n messages.push({\n role: \"assistant\",\n content: step.text,\n toolCalls,\n ...(step.continuation ? { continuation: step.continuation } : {}),\n });\n }\n pending = step;\n pendingStepIndex = stepIndex;\n save();\n\n const outputCalls = toolCalls.filter((call) =>\n outputByToolName.has(call.name),\n );\n const returnCalls = outputCalls.filter(\n (call) => outputByToolName.get(call.name)?.kind === \"return\",\n );\n if (returnCalls.length > 1) {\n // The public result has one terminal value. Ask the model to select it\n // without replaying completed domain tools, interrupts, or emissions.\n let corrected = false;\n for (const call of returnCalls) {\n if (toolResults.some((result) => result.toolCallId === call.id))\n continue;\n const result: KortyxToolResult = {\n toolCallId: call.id,\n name: call.name,\n isError: true,\n content:\n \"MULTIPLE_TERMINAL_OUTPUTS: No terminal output was published. Select exactly one return contract using the tool and human-input results. Do not repeat completed calls. Multiple emit contracts are allowed.\",\n };\n toolResults.push(result);\n messages.push({ role: \"tool\", ...result });\n corrected = true;\n }\n if (corrected) outputContractCorrections += 1;\n save();\n }\n // Preserve requested order for tools, emissions, and interrupts. A\n // terminal return is a completion barrier and must run after all of them.\n const orderedCalls = [\n ...toolCalls.filter(\n (call) => outputByToolName.get(call.name)?.kind !== \"return\",\n ),\n ...returnCalls,\n ];\n for (const toolCall of orderedCalls) {\n throwIfExecutionAborted(abortSignal);\n if (outputByToolName.has(toolCall.name)) {\n const call = toolCall;\n const hasEvidenceCalls = toolResults.some(\n (result) => !outputByToolName.has(result.name),\n );\n const resolved = outputByToolName.get(call.name);\n if (!resolved)\n throw new Error(\n `Unknown useReason output contract tool \"${call.name}\".`,\n );\n if (toolResults.some((result) => result.toolCallId === call.id)) {\n if (resolved.kind === \"return\" && returned) completed = true;\n continue;\n }\n if (\n resolved.kind === \"emit\" &&\n emissions.length >= (useReasonArgs.outputs?.maxEmissions ?? 16)\n )\n throw new Error(\n `useReason reached outputs.maxEmissions (${useReasonArgs.outputs?.maxEmissions ?? 16}).`,\n );\n let data: unknown;\n if (resolved.stream || hasEvidenceCalls) {\n if (resolved.stream && !stream)\n throw new Error(\n `useReason streaming output contract \"${resolved.name}\" requires stream: true.`,\n );\n if (steps.length >= maxSteps) {\n const message = `useReason output generation requires another model pass within toolExecution.maxSteps (${maxSteps}). Increase maxSteps to allow outputs to use completed tool and interrupt results.`;\n throw new ProviderRequestError(message, {\n code: \"REASON_OUTPUT_BUDGET_EXHAUSTED\",\n operation: \"useReason\",\n safeMessage: message,\n retryable: false,\n details: { maxSteps, modelPasses: steps.length },\n });\n }\n const streamInstruction =\n call.input &&\n typeof call.input === \"object\" &&\n !Array.isArray(call.input)\n ? (call.input as Record<string, unknown>).instruction\n : undefined;\n if (\n resolved.stream &&\n (typeof streamInstruction !== \"string\" ||\n streamInstruction.trim().length === 0)\n )\n throw new Error(\n `useReason streaming output contract \"${resolved.name}\" requires an instruction.`,\n );\n const instruction = [\n `Generate output contract \"${resolved.name}\": ${resolved.contract.description}`,\n \"Use the completed tool and human-input results. Do not assume results for pending calls.\",\n resolved.stream\n ? String(streamInstruction)\n : `Regenerate this original draft, which was written before those results were available: ${JSON.stringify(call.input)}`,\n ].join(\"\\n\\n\");\n const streamId = `${opId}:${resolved.kind}:${resolved.name}:${resolved.kind === \"emit\" ? emissions.length : \"return\"}`;\n const structured = {\n dataType: resolved.contract.schemaId,\n schemaId: resolved.contract.schemaId,\n schemaVersion: resolved.contract.schemaVersion,\n fields: resolved.contract.stream?.fields,\n };\n const inferred = inferOutputFormat(\n resolved.contract.schema,\n undefined,\n );\n const outputRecord: UseReasonStep = {\n stepIndex: steps.length,\n kind: \"output\",\n text: \"\",\n toolCalls: [],\n toolResults: [],\n };\n steps.push(outputRecord);\n save();\n try {\n const outputStep = await reasonEngine(\n {\n ...useReasonArgs,\n tools: [],\n ...(inferred.responseFormat\n ? { responseFormat: inferred.responseFormat }\n : {}),\n messages: [\n ...messages,\n ...toolCalls\n .filter(\n (pendingCall) =>\n !toolResults.some(\n (result) => result.toolCallId === pendingCall.id,\n ),\n )\n .map(\n (pendingCall): KortyxPromptMessage => ({\n role: \"tool\",\n toolCallId: pendingCall.id,\n name: pendingCall.name,\n content:\n \"This call has not completed yet. Use only completed results; do not assume a result for this pending call.\",\n }),\n ),\n {\n role: \"user\",\n content: withOutputGuardrails(\n instruction,\n resolved.contract.schema,\n ),\n },\n ],\n emit: false,\n stream: resolved.stream && stream,\n ...(emit && resolved.stream && stream\n ? {\n onTextChunk: createStructuredOutputStreamer(\n { structured },\n id,\n streamId,\n ),\n }\n : {}),\n },\n { ...(id ? { id } : {}), opId },\n );\n if (outputStep.toolCalls?.length)\n throw new Error(\n `Provider requested a tool during streamed output contract \"${resolved.name}\".`,\n );\n aggregatedUsage = mergeUsage(aggregatedUsage, outputStep.usage);\n accumulateTokenUsage(outputStep.usage);\n aggregatedWarnings = mergeWarnings(\n aggregatedWarnings,\n mergeWarnings(inferred.warnings, outputStep.warnings),\n );\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n outputStep.providerMetadata,\n );\n finalFinishReason = outputStep.finishReason;\n finalRaw = outputStep.raw;\n Object.assign(outputRecord, {\n stepIndex: outputRecord.stepIndex,\n kind: \"output\",\n text: outputStep.text,\n toolCalls: [],\n toolResults: [],\n ...(outputStep.usage ? { usage: outputStep.usage } : {}),\n ...(outputStep.finishReason\n ? { finishReason: outputStep.finishReason }\n : {}),\n ...(outputStep.providerMetadata\n ? { providerMetadata: outputStep.providerMetadata }\n : {}),\n ...(outputStep.warnings\n ? { warnings: outputStep.warnings }\n : {}),\n });\n save();\n data = parseReasonOutputWithSchema({\n text: outputStep.text,\n schema: resolved.contract.schema,\n ...(outputStep.finishReason\n ? { finishReason: outputStep.finishReason }\n : {}),\n ...(aggregatedUsage ? { usage: aggregatedUsage } : {}),\n label: `useReason output contract \"${resolved.name}\"`,\n });\n } catch (error) {\n traceSpan?.addEvent?.(\"useReason.output.invalidated\", {\n contract: resolved.name,\n kind: resolved.kind,\n schemaId: resolved.contract.schemaId,\n schemaVersion: resolved.contract.schemaVersion,\n streamId,\n });\n if (emit && resolved.stream) {\n try {\n ctx.node.emit(\"structured_data_invalidated\", {\n node: ctx.node.graph.node,\n streamId,\n });\n } catch {\n // Reporting must not replace the generation or validation error.\n }\n }\n throw error;\n }\n } else {\n data = parseWithSchema(\n resolved.contract.schema,\n call.input,\n `useReason output contract \"${resolved.name}\"`,\n );\n }\n const entry = { contract: resolved.name, data };\n const emissionIndex = emissions.length;\n if (resolved.kind === \"emit\")\n emissions.push(entry as OutputContractEntry<TEmit>);\n else returned = entry as OutputContractEntry<TReturn>;\n if (emit)\n emitStructuredData({\n kind: \"final\",\n data,\n dataType: resolved.contract.schemaId,\n schemaId: resolved.contract.schemaId,\n schemaVersion: resolved.contract.schemaVersion,\n streamId: `${opId}:${resolved.kind}:${resolved.name}:${resolved.kind === \"emit\" ? emissionIndex : \"return\"}`,\n ...(id ? { id } : {}),\n });\n traceSpan?.addEvent?.(\"useReason.output.emitted\", {\n contract: resolved.name,\n kind: resolved.kind,\n schemaId: resolved.contract.schemaId,\n schemaVersion: resolved.contract.schemaVersion,\n emissionIndex,\n data,\n });\n const result = normalizeToolResult(call, { emitted: true, data });\n toolResults.push(result);\n messages.push({\n role: \"tool\",\n content: result.content,\n toolCallId: result.toolCallId,\n name: result.name,\n });\n if (resolved.kind === \"return\") completed = true;\n save();\n continue;\n }\n if (interruptByToolName.has(toolCall.name)) {\n const resolved = interruptByToolName.get(toolCall.name);\n if (!resolved)\n throw new Error(\n `Unknown useReason interrupt contract tool \"${toolCall.name}\".`,\n );\n if (toolResults.some((result) => result.toolCallId === toolCall.id)) {\n continue;\n }\n if (interruptHistory.length >= (interruptConfig?.maxRequests ?? 1))\n throw new Error(\n `useReason reached interrupts.maxRequests (${interruptConfig?.maxRequests ?? 1}).`,\n );\n const request = parseWithSchema(\n resolved.contract.requestSchema,\n toolCall.input,\n `useReason interrupt contract \"${resolved.name}\" request`,\n );\n traceSpan?.addEvent?.(\"useReason.interrupt.requested\", {\n checkpointKey,\n contract: resolved.name,\n interruptIndex: interruptHistory.length,\n });\n const question =\n request &&\n typeof request === \"object\" &&\n !Array.isArray(request) &&\n typeof (request as Record<string, unknown>).question === \"string\"\n ? String((request as Record<string, unknown>).question)\n : undefined;\n const response = await awaitInterruptInternal({\n onResolved: rememberInterrupt,\n request: {\n kind: \"custom\",\n request,\n contract: resolved.name,\n ...(question ? { question } : {}),\n schemaId: resolved.contract.schemaId,\n schemaVersion: resolved.contract.schemaVersion,\n },\n responseSchema: resolved.contract.responseSchema,\n id: `${id ?? \"reason\"}:${resolved.name}:${interruptHistory.length + 1}`,\n meta: {\n __kortyxReason: {\n opId,\n stepIndex,\n interruptIndex: interruptHistory.length,\n contract: resolved.name,\n },\n },\n });\n const result = normalizeToolResult(toolCall, response);\n toolResults.push(result);\n messages.push({\n role: \"tool\",\n content: result.content,\n toolCallId: result.toolCallId,\n name: result.name,\n });\n interruptHistory.push({\n contract: resolved.name,\n request,\n response,\n } as InterruptHistoryEntry<TContracts>);\n traceSpan?.addEvent?.(\"useReason.interrupt.resolved\", {\n checkpointKey,\n contract: resolved.name,\n interruptIndex: interruptHistory.length - 1,\n });\n save();\n continue;\n }\n if (toolResults.some((result) => result.toolCallId === toolCall.id)) {\n await replayToolObservations(\n steps[stepIndex]?.toolObservations?.filter(\n (observation) =>\n observation.toolCallId === `${opId}:${toolCall.id}`,\n ) ?? [],\n );\n continue;\n }\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 if (shouldEmitTool) {\n emitToolEvent(\"tool-call-start\", {\n tool: tool.name,\n toolCallId: toolCall.id,\n input: toolCall.input,\n });\n }\n\n if (shouldApproveTool && !approvedCalls.includes(toolCall.id)) {\n await observeToolFact(\n {\n version: 1,\n name: tool.name,\n toolCallId: `${opId}:${toolCall.id}`,\n attemptId: `${opId}:${toolCall.id}:approval`,\n callingMode: \"model\",\n executed: false,\n },\n \"waiting\",\n );\n const approval = await awaitInterruptInternal({\n onResolved: rememberInterrupt,\n id: `tool:${toolCall.id}`,\n request: {\n kind: \"choice\",\n question: `Approve ${tool.name}?`,\n options: [\n { id: \"approve\", label: \"Approve\" },\n { id: \"deny\", label: \"Deny\" },\n ],\n },\n meta: {\n tool: tool.name,\n toolCallId: toolCall.id,\n input: toolCall.input,\n },\n });\n\n const approved = Array.isArray(approval)\n ? approval.includes(\"approve\")\n : approval === \"approve\";\n\n if (!approved) {\n const deniedObservation = {\n version: 1 as const,\n name: tool.name,\n toolCallId: `${opId}:${toolCall.id}`,\n attemptId: `${opId}:${toolCall.id}:approval`,\n callingMode: \"model\" as const,\n executed: false,\n outcome: \"denied\" as const,\n denialCode: \"APPROVAL_DENIED\",\n };\n await observeToolFact(deniedObservation);\n const entry = steps[stepIndex];\n if (entry) {\n entry.toolObservations ??= [];\n entry.toolObservations.push(deniedObservation);\n }\n const denied = {\n toolCallId: toolCall.id,\n name: tool.name,\n content: \"Tool call denied by user.\",\n isError: true,\n } satisfies KortyxToolResult;\n toolResults.push(denied);\n allToolResults.push(denied);\n if (shouldEmitTool) {\n emitToolEvent(\"tool-call-result\", {\n tool: tool.name,\n toolCallId: toolCall.id,\n content: denied.content,\n isError: true,\n });\n }\n messages.push({\n role: \"tool\",\n content: denied.content,\n toolCallId: denied.toolCallId,\n name: denied.name,\n isError: true,\n });\n save();\n continue;\n }\n approvedCalls.push(toolCall.id);\n save();\n }\n\n try {\n throwIfExecutionAborted(abortSignal);\n const rawResult = await executeObservedTool({\n tool,\n input: toolCall.input,\n toolCallId: `${opId}:${toolCall.id}`,\n providerToolCallId: toolCall.id,\n callingMode: \"model\",\n abortSignal,\n onObservation: (observation) => {\n const entry = steps[stepIndex];\n if (entry) {\n entry.toolObservations ??= [];\n entry.toolObservations.push(observation);\n save();\n }\n },\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 } catch (error) {\n throwIfExecutionAborted(abortSignal);\n if (isControlFlowError(error)) throw error;\n const result = {\n toolCallId: toolCall.id,\n name: tool.name,\n content: serializeFailure(error).message,\n failure: serializeFailure(error),\n isError: true,\n } satisfies KortyxToolResult;\n toolResults.push(result);\n allToolResults.push(result);\n if (shouldEmitTool) {\n emitToolEvent(\"tool-call-error\", {\n tool: tool.name,\n toolCallId: toolCall.id,\n message: result.content,\n failure: result.failure,\n });\n }\n }\n const completedToolResult = toolResults.at(-1);\n if (completedToolResult)\n messages.push({\n role: \"tool\",\n content: completedToolResult.content,\n toolCallId: completedToolResult.toolCallId,\n name: completedToolResult.name,\n ...(completedToolResult.isError !== undefined\n ? { isError: completedToolResult.isError }\n : {}),\n });\n save();\n }\n pending = undefined;\n pendingStepIndex = undefined;\n save();\n if (completed) break;\n }\n\n if (!completed) {\n if (outputContractCorrections > 0) throw correctionExhausted();\n throw new Error(\n `useReason tool loop reached maxSteps (${maxSteps}) before producing a final response.`,\n );\n }\n\n if (useReasonArgs.outputSchema && finalOutput === undefined) {\n finalOutput = parseReasonOutputWithSchema({\n text: finalText,\n schema: useReasonArgs.outputSchema,\n ...(finalFinishReason ? { finishReason: finalFinishReason } : {}),\n ...(aggregatedUsage ? { usage: aggregatedUsage } : {}),\n label: \"useReason output\",\n });\n }\n\n if (finalOutput !== undefined) {\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: finalOutput,\n structured: useReasonArgs.structured,\n emit: useReasonArgs.emit ?? true,\n });\n }\n\n const result = {\n ...(id ? { id } : {}),\n opId,\n text: useReasonArgs.outputs\n ? steps\n .filter((step) => step.kind !== \"output\")\n .map((step) => step.text)\n .filter(Boolean)\n .join(\"\\n\")\n : 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 ...(emissions.length ? { emissions } : {}),\n ...(returned ? { returned } : {}),\n ...(interruptHistory.length > 0 ? { interruptHistory } : {}),\n ...(isLegacyInterruptContracts(interruptConfig) &&\n interruptHistory.length > 0\n ? {\n interruptResponse: interruptHistory.at(-1)?.response as TResponse,\n }\n : {}),\n } satisfies UseReasonResult<TOutput, TResponse, TContracts>;\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 interruptCount: interruptHistory.length,\n emissionCount: emissions.length,\n ...(returned ? { returnContract: returned.contract } : {}),\n },\n telemetry: {\n ...(useReasonArgs.telemetry ?? {}),\n output:\n useReasonArgs.telemetry?.output ??\n returned?.data ??\n finalOutput ??\n finalText,\n },\n });\n\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"completed\",\n result,\n resolvedInterrupts,\n };\n ctx.stateDirty = true;\n return result;\n } catch (error) {\n try {\n traceSpan?.fail?.(error, {\n attributes: {\n toolStepCount: steps.length,\n toolCallCount: allToolCalls.length,\n },\n });\n } catch {\n /* Reporting must not replace the execution failure. */\n }\n throw error;\n }\n};\n\ninterface ToolLoopCheckpoint {\n status: \"tool_loop\";\n opId: string;\n messages: KortyxPromptMessage[];\n steps: UseReasonStep[];\n pending?: RunReasonEngineResult;\n pendingStepIndex?: number;\n approvedCalls: string[];\n resolvedInterrupts?: InterruptInput[];\n interruptHistory?: Array<{\n contract: string;\n request: unknown;\n response: unknown;\n }>;\n emissions?: Array<{ contract: string; data: unknown }>;\n returned?: { contract: string; data: unknown };\n finalizing?: boolean;\n outputContractCorrections?: number;\n}\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { getHookContext } from \"./context\";\nimport { awaitInterruptInternal } from \"./interrupt\";\nimport { defineInterruptContract } from \"./interrupt-contract\";\nimport { defineOutputContract } from \"./output-contract\";\nimport { useReason as useReasonInternal } from \"./reason/use-reason\";\nimport { emitStructuredData } from \"./structured\";\nimport type {\n InterruptContractMap,\n OutputContractMap,\n UseContractInterruptArgs,\n UseContractStructuredDataArgs,\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonResult,\n UseStructuredDataArgs,\n} from \"./types\";\nimport { parseWithSchema } from \"./validation\";\n\nexport { defineInterruptContract, defineOutputContract };\n\nexport type {\n InterruptContract,\n InterruptContractMap,\n InterruptHistoryEntry,\n OutputContract,\n OutputContractEntry,\n OutputContractMap,\n SchemaLike,\n StructuredDataKind,\n UseContractInterruptArgs,\n UseContractStructuredDataArgs,\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonInterruptConfig,\n UseReasonInterruptsConfig,\n UseReasonOutputsConfig,\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>(\n args: UseContractStructuredDataArgs<TData>,\n): void;\nexport function useStructuredData<TData = unknown>(\n args: UseStructuredDataArgs<TData>,\n): void;\nexport function useStructuredData<TData>(\n args: UseStructuredDataArgs<TData> | UseContractStructuredDataArgs<TData>,\n): void {\n if (\"contract\" in args) {\n const contract = defineOutputContract(args.contract);\n const base = {\n dataType: contract.schemaId,\n schemaId: contract.schemaId,\n schemaVersion: contract.schemaVersion,\n ...(args.id ? { id: args.id } : {}),\n ...(args.streamId ? { streamId: args.streamId } : {}),\n };\n if (\n args.kind === \"set\" ||\n args.kind === \"append\" ||\n args.kind === \"text-delta\"\n ) {\n if (contract.stream?.fields[args.path] !== args.kind)\n throw new Error(\n `Output contract does not allow ${args.kind} at \"${args.path}\".`,\n );\n if (args.kind === \"set\")\n emitStructuredData({\n ...base,\n kind: \"set\",\n path: args.path,\n value: args.value,\n ...(args.valueSchema ? { valueSchema: args.valueSchema } : {}),\n });\n else if (args.kind === \"append\")\n emitStructuredData({\n ...base,\n kind: \"append\",\n path: args.path,\n items: args.items,\n ...(args.itemSchema ? { itemSchema: args.itemSchema } : {}),\n });\n else\n emitStructuredData({\n ...base,\n kind: \"text-delta\",\n path: args.path,\n delta: args.delta,\n });\n return;\n }\n emitStructuredData({\n ...base,\n kind: \"final\",\n data: args.data,\n dataSchema: contract.schema,\n });\n return;\n }\n emitStructuredData(args);\n}\n\nexport function useReason<\n TOutput = unknown,\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n TContracts extends InterruptContractMap = InterruptContractMap,\n TEmit extends OutputContractMap = OutputContractMap,\n TReturn extends OutputContractMap = OutputContractMap,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse, TContracts, TEmit, TReturn>,\n): Promise<UseReasonResult<TOutput, TResponse, TContracts, TEmit, TReturn>> {\n return useReasonInternal(args);\n}\n\nexport function useInterrupt<TRequest, TResponse>(\n args: UseContractInterruptArgs<TRequest, TResponse>,\n): Promise<TResponse>;\nexport function useInterrupt<\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(args: UseInterruptArgs<TRequest, TResponse>): Promise<TResponse>;\nexport function useInterrupt(\n args:\n | UseContractInterruptArgs<unknown, unknown>\n | UseInterruptArgs<InterruptInput, InterruptResult>,\n): Promise<unknown> {\n if (\"contract\" in args) {\n const contract = defineInterruptContract(args.contract);\n return awaitInterruptInternal({\n request: {\n kind: \"custom\",\n request: parseWithSchema(\n contract.requestSchema,\n args.request,\n \"useInterrupt contract request\",\n ),\n schemaId: contract.schemaId,\n schemaVersion: contract.schemaVersion,\n ...(args.id ? { id: args.id } : {}),\n ...(args.meta ? { meta: args.meta } : {}),\n },\n responseSchema: contract.responseSchema,\n });\n }\n return awaitInterruptInternal(args);\n}\n\n/** Live execution signal for cooperative I/O. Never store it in workflow state. */\nexport function useAbortSignal(): AbortSignal | undefined {\n return getHookContext().node.abortSignal;\n}\n\nexport function useRuntimeContext<\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(): TContext {\n const ctx = getHookContext();\n const config = ctx.state.config;\n const context =\n config && typeof config === \"object\" && \"context\" in config\n ? (config as { context?: unknown }).context\n : undefined;\n\n return context && typeof context === \"object\" && !Array.isArray(context)\n ? (context as TContext)\n : ({} as TContext);\n}\n\nexport function useNodeState<T>(initialValue: T): [T, StateSetter<T>] {\n const ctx = getHookContext();\n const nodeState = ctx.currentNodeState;\n\n const index = ctx.nodeStateIndex++;\n if (index >= nodeState.byIndex.length) {\n nodeState.byIndex[index] = initialValue as T;\n ctx.stateDirty = true;\n }\n\n const getValue = () => nodeState.byIndex[index] as T;\n const setValue: StateSetter<T> = (next) => {\n const prev = getValue();\n const resolved =\n typeof next === \"function\" ? (next as (p: T) => T)(prev) : next;\n nodeState.byIndex[index] = resolved;\n ctx.stateDirty = true;\n };\n\n return [getValue(), setValue];\n}\n\nexport function useWorkflowState<T>(\n key: string,\n ...rest: [] | [T]\n): [T, StateSetter<T>] {\n const ctx = getHookContext();\n const workflowState = ctx.workflowState;\n const hasInitial = rest.length > 0;\n const initialValue = rest[0];\n\n if (!Object.hasOwn(workflowState, key) && hasInitial) {\n workflowState[key] = initialValue as T;\n ctx.stateDirty = true;\n }\n\n const getValue = () => workflowState[key] as T;\n const setValue: StateSetter<T> = (next) => {\n const prev = getValue();\n const resolved =\n typeof next === \"function\" ? (next as (p: T) => T)(prev) : next;\n workflowState[key] = resolved;\n ctx.stateDirty = true;\n };\n\n return [getValue(), setValue];\n}\n","import {\n isExecutionCancelled,\n isExecutionLimitReached,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport { type FailureDescriptor, serializeFailure } from \"@kortyx/core/errors\";\nimport { getHookContext } from \"./context\";\nimport { awaitInterruptInternal } from \"./interrupt\";\nimport type { CallRecord } from \"./workflow\";\n\ntype ParallelRecord = {\n version: 1;\n calls: string[];\n interrupts: Array<{ callId: string; index: number }>;\n};\n\nexport type ParallelGroup = {\n key: string;\n record: ParallelRecord;\n restored: boolean;\n ready: Promise<void>;\n};\n\nexport type WorkflowTask = {\n id: string;\n group?: ParallelGroup;\n done: Promise<void>;\n finish: () => void;\n completed: boolean;\n};\n\n/** Internal control flow: the child snapshot is ready for its owning join. */\nexport class ParallelChildWaiting extends Error {\n override name = \"ParallelChildWaiting\";\n}\n\n/** All siblings have settled; results retain the order passed to parallel(). */\nexport class ParallelError extends AggregateError {\n readonly code = \"PARALLEL_FAILED\";\n readonly failure: FailureDescriptor;\n toJSON(): FailureDescriptor {\n return serializeFailure(this);\n }\n constructor(\n public readonly results: readonly PromiseSettledResult<unknown>[],\n ) {\n super(\n results.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n ),\n \"One or more parallel operations failed.\",\n );\n this.name = \"ParallelError\";\n this.failure = serializeFailure({\n version: 1,\n code: this.code,\n category: \"workflow\",\n message: this.message,\n retryable: null,\n results: results.map((result) =>\n result.status === \"fulfilled\"\n ? { status: \"fulfilled\" }\n : { status: \"rejected\", failure: serializeFailure(result.reason) },\n ),\n });\n }\n}\n\nexport function registerWorkflowTask(id: string): WorkflowTask {\n const ctx = getHookContext();\n if (ctx.workflowControlError) throw ctx.workflowControlError;\n if (ctx.workflowContextClosed)\n throw new Error(\"The workflow node activation has finished.\");\n const group = ctx.parallelGroup;\n if (group?.restored && !group.record.calls.includes(id)) {\n throw new Error(`Parallel call membership changed during replay: '${id}'.`);\n }\n let finish!: () => void;\n const task: WorkflowTask = {\n id,\n ...(group ? { group } : {}),\n completed: false,\n done: new Promise<void>((resolve) => {\n finish = resolve;\n }),\n finish: () => {\n task.completed = true;\n finish();\n },\n };\n ctx.workflowTasks.push(task);\n if (group && !group.record.calls.includes(id)) group.record.calls.push(id);\n return task;\n}\n\n/** Join concurrent child calls, preserving their snapshots before suspending. */\nexport function parallel<const T extends readonly unknown[]>(\n values: T,\n): Promise<{ -readonly [K in keyof T]: Awaited<T[K]> }> {\n // Observe inputs immediately, including when context/group validation rejects.\n const settled = Promise.allSettled(values);\n let ctx: ReturnType<typeof getHookContext>;\n try {\n ctx = getHookContext();\n } catch (error) {\n return Promise.reject(error);\n }\n const join = async () => {\n if (ctx.workflowControlError) throw ctx.workflowControlError;\n if (ctx.parallelGroup)\n throw new Error(\n \"Await each parallel group before starting another in the same node.\",\n );\n const key = `__parallel:${ctx.parallelIndex++}`;\n const saved = ctx.currentNodeState.byKey[key] as\n | ParallelRecord\n | null\n | undefined;\n const tasks = ctx.workflowTasks.filter(\n (task) => !task.completed && !task.group,\n );\n const ids = tasks.map((task) => task.id);\n if (\n saved &&\n (saved.version !== 1 || ids.some((id) => !saved.calls.includes(id)))\n ) {\n throw new Error(\"Parallel call membership changed during replay.\");\n }\n const group: ParallelGroup = {\n key,\n record: saved ?? { version: 1, calls: ids, interrupts: [] },\n restored: Boolean(saved),\n ready: Promise.resolve(),\n };\n ctx.currentNodeState.byKey[key] = group.record;\n ctx.stateDirty = true;\n ctx.parallelGroup = group;\n for (const task of tasks) task.group = group;\n const callRecord = (id: string) =>\n ctx.currentNodeState.byKey[`__useWorkflow:${id}`] as\n | CallRecord\n | undefined;\n const bridge = async (callId: string, index: number) => {\n const interruption = callRecord(callId)?.interrupts[index];\n if (!interruption)\n throw new Error(\n \"Parallel interrupt history does not match the saved child.\",\n );\n try {\n interruption.response = await awaitInterruptInternal({\n request: interruption.request,\n ...(interruption.request.meta\n ? { meta: interruption.request.meta }\n : {}),\n });\n } catch (error) {\n ctx.workflowControlError = error;\n throw error;\n }\n };\n group.ready = (async () => {\n // One deterministic parent interrupt journal, independent of child finish order.\n for (const entry of group.record.interrupts)\n await bridge(entry.callId, entry.index);\n })();\n try {\n // Even a replay suspension must settle every already-created child promise.\n const [ready, outcomes] = await Promise.all([\n Promise.allSettled([group.ready]),\n settled,\n ]);\n // Also own calls made by asynchronous custom-hook wrappers in this group.\n let drained = -1;\n while (drained !== ctx.workflowTasks.length) {\n drained = ctx.workflowTasks.length;\n await Promise.all(\n ctx.workflowTasks\n .filter((task) => task.group === group)\n .map((task) => task.done),\n );\n }\n if (ready[0]?.status === \"rejected\") throw ready[0].reason;\n throwIfExecutionAborted(ctx.node.abortSignal);\n if (ctx.workflowControlError) throw ctx.workflowControlError;\n const rejected = outcomes.filter(\n (outcome) => outcome.status === \"rejected\",\n );\n const control = rejected.find(\n (outcome) =>\n isExecutionCancelled(outcome.reason) ||\n isExecutionLimitReached(outcome.reason),\n );\n if (control) {\n ctx.workflowControlError = control.reason;\n throw control.reason;\n }\n const actual = ctx.workflowTasks\n .filter((task) => task.group === group)\n .map((task) => task.id);\n if (\n group.record.calls.length !== actual.length ||\n group.record.calls.some((id) => !actual.includes(id))\n ) {\n throw new Error(\"Parallel call membership changed during replay.\");\n }\n for (const callId of group.record.calls) {\n const record = callRecord(callId);\n if (record?.status !== \"interrupted\") continue;\n const index = record.interrupts.length - 1;\n if (record.interrupts[index]?.response !== undefined) continue;\n group.record.interrupts.push({ callId, index });\n await bridge(callId, index);\n // An unseen interrupt suspends; it must not become a partial result.\n throw new Error(\n \"Parallel interrupt unexpectedly resumed without replay.\",\n );\n }\n if (rejected.length) throw new ParallelError(outcomes);\n return outcomes.map(\n (outcome) => (outcome as PromiseFulfilledResult<unknown>).value,\n ) as { -readonly [K in keyof T]: Awaited<T[K]> };\n } finally {\n ctx.parallelGroup = undefined;\n }\n };\n const promise = join();\n ctx.parallelJoins.push(promise);\n // The node owns this join even if user code forgets to await it.\n void promise.catch(() => {});\n return promise;\n}\n","import { getReasonTraceAdapter } from \"./context\";\nimport type { ReportErrorOptions } from \"./tracing\";\n\n/** Reports a handled error to the configured observer without stopping execution. */\nexport function reportError(\n error: unknown,\n options: ReportErrorOptions = {},\n): void {\n try {\n getReasonTraceAdapter()?.reportError?.(error, options);\n } catch {\n // Observability must never participate in workflow execution.\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n InterruptInput,\n TokenUsage,\n WorkflowDefinition,\n} from \"@kortyx/core\";\nimport {\n isExecutionCancelled,\n isExecutionLimitReached,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport {\n type FailureDescriptor,\n KortyxError,\n serializeFailure,\n WorkflowContractError,\n} from \"@kortyx/core/errors\";\nimport type { ToolObservation } from \"@kortyx/providers\";\nimport type { z } from \"zod\";\nimport { accumulateTokenUsage, getHookContext } from \"./context\";\nimport { awaitInterruptInternal } from \"./interrupt\";\nimport {\n ParallelChildWaiting,\n registerWorkflowTask,\n type WorkflowTask,\n} from \"./parallel\";\nimport { rememberToolObservation, replayToolObservations } from \"./tool\";\nimport { emitWorkflowCall, workflowCallContent } from \"./workflow-telemetry\";\n\nexport type WorkflowCallOutcome =\n | {\n status: \"completed\";\n data: Record<string, unknown>;\n toolObservations?: ToolObservation[];\n usage?: TokenUsage | undefined;\n }\n | {\n status: \"interrupted\";\n request: InterruptInput;\n snapshot: unknown;\n usage?: TokenUsage | undefined;\n };\n\nexport type WorkflowCallService = (args: {\n id: string;\n workflow: string;\n input: unknown;\n snapshot?: unknown;\n definition?: WorkflowDefinition | undefined;\n invocationId: string;\n response?: string | string[] | undefined;\n callerNodeExecutionId?: string | undefined;\n}) => Promise<WorkflowCallOutcome>;\n\nexport type CallRecord = {\n restoredToolBranch?: string;\n toolObservations?: ToolObservation[];\n parallelKey?: string;\n usage?: TokenUsage;\n fingerprint: string;\n sequence?: number;\n telemetry?: Record<string, unknown>;\n invocationId: string;\n status: \"running\" | \"interrupted\" | \"completed\" | \"failed\";\n snapshot?: unknown;\n data?: Record<string, unknown>;\n error?: string;\n failure?: FailureDescriptor;\n interrupts: Array<{ request: InterruptInput; response?: string | string[] }>;\n};\n\nexport class WorkflowCallError extends KortyxError {\n constructor(\n public readonly workflow: string,\n message: string,\n cause?: unknown,\n failure?: FailureDescriptor,\n ) {\n const detail = serializeFailure(\n failure ?? cause ?? new WorkflowContractError(message),\n );\n super(detail.code, `Workflow '${workflow}': ${message}`, {\n ...detail,\n safeMessage: detail.message,\n ...(cause !== undefined ? { cause } : {}),\n });\n Object.assign(this.failure, detail, {\n context: { ...detail.context, workflow },\n });\n this.name = \"WorkflowCallError\";\n }\n}\n\n// Canonicalize JSON so object insertion order cannot change call identity.\nexport function workflowCallFingerprint(value: unknown): string {\n const seen = new Set<object>();\n const canonical = (v: unknown): unknown => {\n if (v === null || typeof v === \"string\" || typeof v === \"boolean\") return v;\n if (typeof v === \"number\" && Number.isFinite(v)) return v;\n if (typeof v !== \"object\" || !v || seen.has(v)) {\n throw new WorkflowContractError(\n \"Workflow input and output must be JSON serializable.\",\n );\n }\n if (!Array.isArray(v) && Object.getPrototypeOf(v) !== Object.prototype) {\n throw new WorkflowContractError(\n \"Workflow input and output must contain plain JSON objects.\",\n );\n }\n seen.add(v);\n const result = Array.isArray(v)\n ? v.map(canonical)\n : Object.fromEntries(\n Object.keys(v)\n .sort()\n .map((key) => [\n key,\n canonical((v as Record<string, unknown>)[key]),\n ]),\n );\n seen.delete(v);\n return result;\n };\n return JSON.stringify(canonical(value));\n}\n\ntype SchematizedWorkflow = WorkflowDefinition & {\n inputSchema: z.ZodType;\n outputSchema: z.ZodType<Record<string, unknown>>;\n};\n\n/** Bind string workflow ids to the same definitions registered with the agent. */\nexport function createWorkflowHooks<\n const W extends Record<string, SchematizedWorkflow>,\n>(workflows: W) {\n return {\n useWorkflow: <K extends keyof W & string>(args: {\n id: string;\n workflow: K;\n input: z.input<W[K][\"inputSchema\"]>;\n }): Promise<{ data: z.output<W[K][\"outputSchema\"]> }> => {\n const workflow = workflows[args.workflow];\n if (!workflow || workflow.id !== args.workflow)\n throw new WorkflowContractError(\n \"Workflow registry keys must match definition ids.\",\n );\n return useWorkflow({ ...args, workflow }) as Promise<{\n data: z.output<W[K][\"outputSchema\"]>;\n }>;\n },\n };\n}\n\n/** Typed references avoid caller-supplied result type assertions. */\nexport function useWorkflow<W extends SchematizedWorkflow>(args: {\n id: string;\n workflow: W;\n input: z.input<W[\"inputSchema\"]>;\n}): Promise<{ data: z.output<W[\"outputSchema\"]> }>;\nexport function useWorkflow(args: {\n id: string;\n workflow: string;\n input: unknown;\n}): Promise<{ data: Record<string, unknown> }>;\nexport async function useWorkflow(args: {\n id: string;\n workflow: string | SchematizedWorkflow;\n input: unknown;\n}): Promise<{ data: Record<string, unknown> }> {\n const task = registerWorkflowTask(args.id);\n try {\n // Give the enclosing parallel([...]) call a chance to claim the eager calls.\n await Promise.resolve();\n if (task.group) await task.group.ready;\n return await runWorkflowCall(args, task);\n } catch (error) {\n if (isExecutionCancelled(error) || isExecutionLimitReached(error))\n getHookContext().workflowControlError = error;\n throw error;\n } finally {\n task.finish();\n }\n}\n\nasync function runWorkflowCall(\n args: {\n id: string;\n workflow: string | SchematizedWorkflow;\n input: unknown;\n },\n task: WorkflowTask,\n): Promise<{ data: Record<string, unknown> }> {\n const ctx = getHookContext();\n throwIfExecutionAborted(ctx.node.abortSignal);\n const service = ctx.node.callWorkflow;\n if (!service)\n throw new WorkflowContractError(\n \"useWorkflow requires an agent workflow registry.\",\n );\n if (!args.id.trim())\n throw new WorkflowContractError(\n \"useWorkflow requires a stable, nonempty id.\",\n );\n if (ctx.workflowCallActive && !task.group)\n throw new WorkflowContractError(\n \"Concurrent workflow calls require parallel([...]); otherwise await each call.\",\n );\n if (ctx.workflowCallIds.has(args.id))\n throw new WorkflowContractError(\n `Duplicate workflow call id '${args.id}' in one node activation.`,\n );\n if (ctx.workflowCallIds.size >= 64)\n throw new WorkflowContractError(\n \"A node may call at most 64 child workflows per activation.\",\n );\n ctx.workflowCallIds.add(args.id);\n const definition =\n typeof args.workflow === \"string\" ? undefined : args.workflow;\n const workflow = definition?.id ?? (args.workflow as string);\n const input = args.input;\n const fingerprint = workflowCallFingerprint({\n workflow,\n input,\n version: definition?.version ?? null,\n });\n const key = `__useWorkflow:${args.id}`;\n let record = ctx.currentNodeState.byKey[key] as CallRecord | undefined;\n if (record && record.parallelKey !== task.group?.key)\n throw new WorkflowCallError(\n workflow,\n \"parallel call membership changed during replay\",\n );\n if (record && record.fingerprint !== fingerprint)\n throw new WorkflowCallError(\n workflow,\n \"call input or target changed during replay\",\n );\n if (!record) ctx.node.consumeExecution?.(\"maxChildInvocations\");\n record ??= {\n fingerprint,\n invocationId: randomUUID(),\n status: \"running\",\n interrupts: [],\n ...(task.group ? { parallelKey: task.group.key } : {}),\n };\n ctx.currentNodeState.byKey[key] = record;\n ctx.stateDirty = true;\n if (!task.group) ctx.workflowCallActive = true;\n const telemetry = ctx.node.workflowCallTelemetry;\n const activationKey = \"__useWorkflowActivation\";\n ctx.currentNodeState.byKey[activationKey] ??= randomUUID();\n const callerNodeExecutionId = ctx.currentNodeState.byKey[\n activationKey\n ] as string;\n const metadata = {\n invocationId: record.invocationId,\n parentInvocationId: telemetry?.correlation?.invocationId ?? null,\n branchId:\n telemetry?.correlation?.branchId ??\n telemetry?.correlation?.runId ??\n \"unknown\",\n callId: args.id,\n callerNodeId: ctx.node.graph.node,\n callerNodeExecutionId,\n sourceWorkflowId: ctx.node.graph.name,\n targetWorkflowId: workflow,\n targetVersion: definition?.version ?? null,\n };\n record.telemetry = metadata;\n const report = (\n status:\n | \"started\"\n | \"suspended\"\n | \"resumed\"\n | \"completed\"\n | \"failed\"\n | \"reused\",\n content: Record<string, unknown> = {},\n ) => {\n record.sequence = (record.sequence ?? 0) + 1;\n emitWorkflowCall(telemetry, `workflow.call.${status}`, {\n ...metadata,\n sequence: record.sequence,\n ...content,\n });\n };\n const recordUsage = (usage: TokenUsage | undefined) => {\n if (!usage) return;\n accumulateTokenUsage({\n input: usage.input - (record.usage?.input ?? 0),\n output: usage.output - (record.usage?.output ?? 0),\n total: usage.total - (record.usage?.total ?? 0),\n });\n record.usage = usage;\n };\n const cached = record.status === \"completed\";\n\n try {\n // Replay every bridged interrupt, even for a completed call. The parent\n // graph assigns resume values by interrupt position within its node.\n for (const interruption of task.group ? [] : record.interrupts) {\n interruption.response = await awaitInterruptInternal({\n request: interruption.request,\n ...(interruption.request.meta\n ? { meta: interruption.request.meta }\n : {}),\n });\n }\n if (record.status === \"failed\")\n throw new WorkflowCallError(\n workflow,\n record.error ?? \"child failed\",\n undefined,\n record.failure ?? serializeFailure(undefined),\n );\n if (\n task.group &&\n record.status === \"interrupted\" &&\n record.interrupts.at(-1)?.response === undefined\n )\n throw new ParallelChildWaiting();\n while (record.status !== \"completed\") {\n let outcome: WorkflowCallOutcome;\n try {\n report(\n record.snapshot ? \"resumed\" : \"started\",\n workflowCallContent(telemetry, \"input\", input),\n );\n outcome = await service({\n callerNodeExecutionId,\n id: args.id,\n workflow,\n input,\n definition,\n invocationId: record.invocationId,\n ...(record.snapshot ? { snapshot: record.snapshot } : {}),\n ...(record.interrupts.length\n ? { response: record.interrupts.at(-1)?.response }\n : {}),\n });\n } catch (error) {\n const child = error as {\n __kortyxChildSnapshot?: unknown;\n __kortyxChildUsage?: TokenUsage;\n } | null;\n recordUsage(child?.__kortyxChildUsage);\n throwIfExecutionAborted(ctx.node.abortSignal);\n if (isExecutionCancelled(error)) throw error;\n if (isExecutionLimitReached(error)) {\n if (child?.__kortyxChildSnapshot)\n record.snapshot = child.__kortyxChildSnapshot;\n report(\"suspended\", {\n reason: \"limit_reached\",\n limit: error.limitReached,\n });\n throw error;\n }\n record.status = \"failed\";\n record.failure = serializeFailure(error);\n record.error = record.failure.message;\n report(\"failed\", { error: \"Child workflow failed\" });\n throw new WorkflowCallError(\n workflow,\n record.error,\n error,\n record.failure,\n );\n }\n throwIfExecutionAborted(ctx.node.abortSignal);\n // Child totals survive suspension; count only newly reported work.\n recordUsage(outcome.usage);\n if (outcome.status === \"completed\") {\n // Validate cached and live outputs against the caller's actual contract.\n record.data = outcome.data;\n workflowCallFingerprint(record.data);\n record.status = \"completed\";\n record.toolObservations = outcome.toolObservations ?? [];\n for (const observation of record.toolObservations)\n rememberToolObservation(observation);\n delete record.snapshot;\n report(\n \"completed\",\n workflowCallContent(telemetry, \"output\", record.data),\n );\n } else {\n record.status = \"interrupted\";\n record.snapshot = outcome.snapshot;\n report(\"suspended\", {\n leaf: outcome.request.meta?.workflowCall ?? null,\n });\n const interruption: CallRecord[\"interrupts\"][number] = {\n request: outcome.request,\n };\n record.interrupts.push(interruption);\n if (task.group) throw new ParallelChildWaiting();\n interruption.response = await awaitInterruptInternal({\n request: interruption.request,\n ...(interruption.request.meta\n ? { meta: interruption.request.meta }\n : {}),\n });\n }\n }\n if (cached) {\n report(\"reused\", workflowCallContent(telemetry, \"output\", record.data));\n if (record.restoredToolBranch !== telemetry?.correlation?.branchId)\n await replayToolObservations(record.toolObservations ?? [], true);\n delete record.restoredToolBranch;\n }\n const data = record.data ?? {};\n return {\n data: JSON.parse(JSON.stringify(data)) as Record<string, unknown>,\n };\n } finally {\n if (!task.group) ctx.workflowCallActive = false;\n }\n}\n"],"mappings":"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","names":["useReason","result","import_zod","import_core","import_node_async_hooks","import_node_crypto","import_core","import_errors","import_telemetry_contracts","import_errors","import_node_crypto","error","import_node_crypto","import_core","import_node_crypto","import_core","import_errors","tools","response","result","createRuntimeId","import_zod","import_errors","isRecord","import_zod","tryStringify","import_core","import_errors","import_zod","tools","result","createRuntimeId","useReason","import_core","import_errors","import_node_crypto","import_core","import_errors"]}
|