@kortyx/hooks 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/context.ts","../src/validation.ts","../src/interrupt.ts","../src/structured.ts","../src/structured-path.ts","../src/reason/checkpoint.ts","../src/reason/engine.ts","../src/reason-engine.ts","../src/reason/parsing.ts","../src/reason/prompting.ts","../src/reason/structured-stream.ts","../src/reason/use-reason.ts","../src/hooks.ts"],"sourcesContent":["// release-test: 2026-01-22\n/**\n * @kortyx/hooks\n *\n * Internal hook implementations resolved via async-local context.\n */\n\nexport type { HookRuntimeContext } from \"./context\";\nexport { runWithHookContext } from \"./context\";\nexport type {\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonResult,\n UseStructuredDataArgs,\n} from \"./hooks\";\nexport {\n useInterrupt,\n useNodeState,\n useReason,\n useRuntimeContext,\n useStructuredData,\n useWorkflowState,\n} from \"./hooks\";\nexport type {\n KortyxTelemetryConfig,\n KortyxTelemetryContentCapture,\n KortyxTelemetryPrompt,\n KortyxTraceAdapter,\n KortyxTraceMetadata,\n ReasonTraceAdapter,\n ReasonTraceAttributes,\n ReasonTraceSpan,\n ReasonTraceSpanEndArgs,\n ReasonTraceSpanStartArgs,\n} from \"./tracing\";\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type {\n GraphState,\n InterruptInput,\n InterruptResult,\n NodeConfig,\n TokenUsage,\n} from \"@kortyx/core\";\nimport type { KortyxUsage } from \"@kortyx/providers\";\nimport type { ReasonTraceAdapter } from \"./tracing\";\n\ntype NodeStateStore = {\n byIndex: unknown[];\n byKey: Record<string, unknown>;\n};\n\ntype HookRuntimeState = {\n nodeState?: Record<string, unknown>;\n workflowState?: Record<string, unknown>;\n};\n\ntype StoredNodeStateEnvelope = {\n nodeId?: unknown;\n state?: unknown;\n};\n\ntype HookStatePatchedError = {\n __kortyxHookStatePatch?: Record<string, unknown>;\n};\n\nexport type HookNodeRuntimeContext = {\n graph: {\n name: string;\n node: string;\n };\n config: NodeConfig;\n emit: (event: string, payload: unknown) => void;\n awaitInterrupt: (args: InterruptInput) => InterruptResult;\n};\n\nexport type HookRuntimeContext = {\n node: HookNodeRuntimeContext;\n state: GraphState;\n reasonTrace?: ReasonTraceAdapter | undefined;\n};\n\ntype HookInternalContext = HookRuntimeContext & {\n nodeStateIndex: number;\n reasonCallIndex: number;\n currentNodeState: NodeStateStore;\n workflowState: Record<string, unknown>;\n tokenUsage?: TokenUsage | undefined;\n stateDirty: boolean;\n runtimeDirty: boolean;\n};\n\nconst storage = new AsyncLocalStorage<HookInternalContext>();\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst normalizeNodeState = (value: unknown): NodeStateStore => {\n if (Array.isArray(value)) {\n return { byIndex: [...value], byKey: {} };\n }\n\n if (isRecord(value)) {\n const byIndex = Array.isArray(value.byIndex) ? [...value.byIndex] : [];\n const byKey = isRecord(value.byKey) ? { ...value.byKey } : {};\n return { byIndex, byKey };\n }\n\n return { byIndex: [], byKey: {} };\n};\n\nconst cloneWorkflowState = (value: unknown): Record<string, unknown> =>\n isRecord(value) ? { ...value } : {};\n\nconst cloneTokenUsage = (value: unknown): TokenUsage | undefined => {\n if (!isRecord(value)) return undefined;\n const input = typeof value.input === \"number\" ? value.input : undefined;\n const output = typeof value.output === \"number\" ? value.output : undefined;\n const total = typeof value.total === \"number\" ? value.total : undefined;\n if (input === undefined && output === undefined && total === undefined) {\n return undefined;\n }\n return {\n input: input ?? 0,\n output: output ?? 0,\n total: total ?? 0,\n };\n};\n\nconst getHookRuntimeState = (state: GraphState): HookRuntimeState => {\n const runtime = (state.runtime ?? {}) as Record<string, unknown>;\n const internal = isRecord(runtime.__kortyx) ? runtime.__kortyx : undefined;\n const result: HookRuntimeState = {};\n if (isRecord(internal?.nodeState)) result.nodeState = internal?.nodeState;\n if (isRecord(internal?.workflowState)) {\n result.workflowState = internal?.workflowState;\n }\n return result;\n};\n\nconst createInternalContext = (\n ctx: HookRuntimeContext,\n): HookInternalContext => {\n const hookRuntimeState = getHookRuntimeState(ctx.state);\n const nodeId = ctx.node.graph.node;\n const storedNodeState = isRecord(hookRuntimeState.nodeState)\n ? (hookRuntimeState.nodeState as StoredNodeStateEnvelope)\n : undefined;\n const storedNodeId =\n typeof storedNodeState?.nodeId === \"string\"\n ? String(storedNodeState.nodeId)\n : \"\";\n const storedState = storedNodeState?.state;\n const currentNodeState =\n storedNodeId && storedNodeId === nodeId\n ? normalizeNodeState(storedState)\n : { byIndex: [], byKey: {} };\n\n return {\n ...ctx,\n nodeStateIndex: 0,\n reasonCallIndex: 0,\n currentNodeState,\n workflowState: cloneWorkflowState(hookRuntimeState.workflowState),\n tokenUsage: cloneTokenUsage(ctx.state.runtime?.tokenUsage),\n stateDirty: false,\n runtimeDirty: false,\n };\n};\n\nconst buildRuntimeStateUpdates = (ctx: HookInternalContext) => {\n const updates: Record<string, unknown> = {};\n\n if (ctx.stateDirty) {\n updates.__kortyx = {\n nodeState: {\n nodeId: ctx.node.graph.node,\n state: ctx.currentNodeState,\n },\n workflowState: ctx.workflowState,\n };\n }\n\n if (ctx.runtimeDirty && ctx.tokenUsage) {\n updates.tokenUsage = ctx.tokenUsage;\n }\n\n return Object.keys(updates).length > 0 ? updates : null;\n};\n\nconst cleanupCompletedReasonCheckpoints = (ctx: HookInternalContext): void => {\n let changed = false;\n\n for (const [key, value] of Object.entries(ctx.currentNodeState.byKey)) {\n if (!key.startsWith(\"__useReason:\")) continue;\n if (!isRecord(value) || value.status !== \"completed\") continue;\n delete ctx.currentNodeState.byKey[key];\n changed = true;\n }\n\n if (changed) ctx.stateDirty = true;\n};\n\nconst toTokenUsageDelta = (\n usage: KortyxUsage | undefined,\n): TokenUsage | undefined => {\n if (!usage) return undefined;\n\n const input = usage.input ?? 0;\n const output = usage.output ?? 0;\n const total = usage.total ?? input + output + (usage.reasoning ?? 0);\n\n if (input === 0 && output === 0 && total === 0) {\n return undefined;\n }\n\n return {\n input,\n output,\n total,\n };\n};\n\nexport function accumulateTokenUsage(usage: KortyxUsage | undefined): void {\n const delta = toTokenUsageDelta(usage);\n if (!delta) return;\n\n const ctx = getHookContext();\n const current = ctx.tokenUsage ?? {\n input: 0,\n output: 0,\n total: 0,\n };\n\n ctx.tokenUsage = {\n input: current.input + delta.input,\n output: current.output + delta.output,\n total: current.total + delta.total,\n };\n ctx.runtimeDirty = true;\n}\n\nexport function getReasonTraceAdapter(): ReasonTraceAdapter | undefined {\n return getHookContext().reasonTrace;\n}\n\nexport async function runWithHookContext<T>(\n ctx: HookRuntimeContext,\n fn: () => Promise<T>,\n): Promise<{ result: T; runtimeUpdates: Record<string, unknown> | null }> {\n const internal = createInternalContext(ctx);\n try {\n const result = await storage.run(internal, fn);\n cleanupCompletedReasonCheckpoints(internal);\n return { result, runtimeUpdates: buildRuntimeStateUpdates(internal) };\n } catch (err) {\n const runtimeUpdates = buildRuntimeStateUpdates(internal);\n if (runtimeUpdates) {\n const currentRuntime = isRecord(internal.state.runtime)\n ? (internal.state.runtime as Record<string, unknown>)\n : {};\n internal.state.runtime = {\n ...currentRuntime,\n ...runtimeUpdates,\n } as unknown as GraphState[\"runtime\"];\n if (err && typeof err === \"object\") {\n (err as HookStatePatchedError).__kortyxHookStatePatch = runtimeUpdates;\n }\n }\n throw err;\n }\n}\n\nexport function getHookContext(): HookInternalContext {\n const ctx = storage.getStore();\n if (!ctx) {\n throw new Error(\"Hooks can only be used while a node is executing.\");\n }\n return ctx;\n}\n","import type { SchemaLike } from \"./types\";\n\nexport const parseWithSchema = <T>(\n schema: SchemaLike<T> | undefined,\n value: unknown,\n label: string,\n): T => {\n if (!schema) return value as T;\n\n const parsed = schema.safeParse(value);\n if (parsed.success) return parsed.data;\n\n const parsedError =\n \"error\" in parsed && parsed.error ? parsed.error : undefined;\n const reason =\n typeof parsedError?.message === \"string\" && parsedError.message.length > 0\n ? parsedError.message\n : \"invalid payload\";\n throw new Error(`${label} validation failed: ${reason}`);\n};\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { getHookContext } from \"./context\";\nimport type { UseInterruptArgs } from \"./types\";\nimport { parseWithSchema } from \"./validation\";\n\nexport const awaitInterruptInternal = <\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(\n args: UseInterruptArgs<TRequest, TResponse>,\n): Promise<TResponse> => {\n const ctx = getHookContext();\n\n const request = parseWithSchema(\n args.requestSchema,\n args.request,\n \"useInterrupt request\",\n );\n\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 ...(args.meta && typeof args.meta === \"object\" && !Array.isArray(args.meta)\n ? { meta: args.meta }\n : {}),\n } as InterruptInput;\n\n const raw = ctx.node.awaitInterrupt(enrichedRequest);\n const response = parseWithSchema(\n args.responseSchema,\n raw,\n \"useInterrupt response\",\n );\n\n return Promise.resolve(response);\n};\n","import { randomUUID } from \"node:crypto\";\nimport { getHookContext } from \"./context\";\nimport { assertStructuredPath } from \"./structured-path\";\nimport type { UseReasonStructuredConfig, UseStructuredDataArgs } from \"./types\";\nimport { parseWithSchema } from \"./validation\";\n\nconst createStructuredStreamId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nexport const emitStructuredData = <TData = unknown>(\n args: UseStructuredDataArgs<TData>,\n): void => {\n const ctx = getHookContext();\n const streamId =\n typeof args.streamId === \"string\" && args.streamId.length > 0\n ? args.streamId\n : createStructuredStreamId();\n const dataType =\n typeof args.dataType === \"string\" && args.dataType.length > 0\n ? args.dataType\n : \"generic\";\n\n const base = {\n node: ctx.node.graph.node,\n streamId,\n dataType,\n ...(typeof args.schemaId === \"string\" && args.schemaId.length > 0\n ? { schemaId: args.schemaId }\n : {}),\n ...(typeof args.schemaVersion === \"string\" && args.schemaVersion.length > 0\n ? { schemaVersion: args.schemaVersion }\n : {}),\n ...(typeof args.id === \"string\" && args.id.length > 0\n ? { id: args.id }\n : {}),\n };\n\n if (args.kind === \"set\") {\n assertStructuredPath(args.path, \"useStructuredData\");\n const value = parseWithSchema(\n args.valueSchema,\n args.value,\n \"useStructuredData value\",\n );\n ctx.node.emit(\"structured_data\", {\n ...base,\n kind: \"set\",\n path: args.path,\n value,\n });\n return;\n }\n\n if (args.kind === \"append\") {\n assertStructuredPath(args.path, \"useStructuredData\");\n const items = args.items.map((item) =>\n parseWithSchema(args.itemSchema, item, \"useStructuredData append item\"),\n );\n ctx.node.emit(\"structured_data\", {\n ...base,\n kind: \"append\",\n path: args.path,\n items,\n });\n return;\n }\n\n if (args.kind === \"text-delta\") {\n assertStructuredPath(args.path, \"useStructuredData\");\n ctx.node.emit(\"structured_data\", {\n ...base,\n kind: \"text-delta\",\n path: args.path,\n delta: args.delta,\n });\n return;\n }\n\n const validated = parseWithSchema(\n args.dataSchema,\n args.data,\n \"useStructuredData data\",\n );\n\n ctx.node.emit(\"structured_data\", {\n ...base,\n kind: \"final\",\n data: validated,\n });\n};\n\nexport const shouldEmitStructured = (\n cfg: UseReasonStructuredConfig | undefined,\n): boolean => Boolean(cfg);\n\nexport const shouldStreamStructured = (\n cfg: UseReasonStructuredConfig | undefined,\n): boolean => Boolean(cfg) && (cfg?.stream ?? true);\n","export const parseStructuredPath = (path: string, source: string): string[] => {\n if (path.length === 0) {\n throw new Error(`${source} path must be a non-empty dot-separated string.`);\n }\n\n const parts = path.split(\".\");\n if (parts.some((part) => part.length === 0)) {\n throw new Error(\n `${source} path \"${path}\" must not contain empty segments.`,\n );\n }\n\n return parts;\n};\n\nexport const assertStructuredPath = (path: string, source: string): void => {\n parseStructuredPath(path, source);\n};\n","import 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 { randomUUID } from \"node:crypto\";\nimport type {\n KortyxReasoningOptions,\n KortyxResponseFormat,\n ProviderModelRef,\n} from \"@kortyx/providers\";\nimport { getHookContext } from \"../context\";\nimport type { RunReasonEngineResult } from \"../reason-engine\";\nimport { runReasonEngine } from \"../reason-engine\";\nimport type { KortyxTraceMetadata } from \"../tracing\";\n\nexport type ReasonEngineInput = {\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | undefined;\n maxOutputTokens?: number | undefined;\n stopSequences?: string[] | undefined;\n abortSignal?: AbortSignal | undefined;\n reasoning?: KortyxReasoningOptions | undefined;\n responseFormat?: KortyxResponseFormat | undefined;\n providerOptions?: Record<string, unknown> | undefined;\n emit?: boolean | undefined;\n stream?: boolean | undefined;\n onTextChunk?: ((text: string) => void) | undefined;\n telemetry?: KortyxTraceMetadata | undefined;\n};\n\nexport const createRuntimeId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nexport async function reasonEngine(\n args: ReasonEngineInput,\n meta: { id?: string; opId: string },\n inputOverride?: string,\n): Promise<RunReasonEngineResult> {\n const ctx = getHookContext();\n\n return runReasonEngine({\n model: args.model,\n input: inputOverride ?? args.input,\n system: args.system,\n temperature: args.temperature,\n maxOutputTokens: args.maxOutputTokens,\n stopSequences: args.stopSequences,\n abortSignal: args.abortSignal,\n reasoning: args.reasoning,\n responseFormat: args.responseFormat,\n providerOptions: args.providerOptions,\n defaultTemperature: ctx.node.config?.model?.temperature,\n stream: args.stream,\n emit: args.emit,\n onTextChunk: args.onTextChunk,\n telemetry: args.telemetry,\n nodeId: ctx.node.graph.node,\n emitEvent: ctx.node.emit,\n reasonTrace: ctx.reasonTrace,\n id: meta.id,\n opId: meta.opId,\n });\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n KortyxFinishReason,\n KortyxPromptMessage,\n KortyxProviderMetadata,\n KortyxReasoningOptions,\n KortyxResponseFormat,\n KortyxUsage,\n KortyxWarning,\n ProviderModelRef,\n} from \"@kortyx/providers\";\nimport type {\n KortyxTraceMetadata,\n ReasonTraceAdapter,\n ReasonTraceSpan,\n} from \"./tracing\";\n\nexport interface RunReasonEngineArgs {\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | undefined;\n maxOutputTokens?: number | undefined;\n stopSequences?: string[] | undefined;\n abortSignal?: AbortSignal | undefined;\n reasoning?: KortyxReasoningOptions | undefined;\n responseFormat?: KortyxResponseFormat | undefined;\n providerOptions?: Record<string, unknown> | undefined;\n defaultTemperature?: number | undefined;\n stream?: boolean | undefined;\n emit?: boolean | undefined;\n nodeId?: string | undefined;\n emitEvent?: ((event: string, payload: unknown) => void) | undefined;\n onTextChunk?: ((text: string) => void) | undefined;\n id?: string | undefined;\n opId?: string | undefined;\n segmentId?: string | undefined;\n telemetry?: KortyxTraceMetadata | undefined;\n reasonTrace?: ReasonTraceAdapter | undefined;\n}\n\nexport interface RunReasonEngineResult {\n text: string;\n raw?: unknown;\n usage?: KortyxUsage;\n finishReason?: KortyxFinishReason;\n providerMetadata?: KortyxProviderMetadata;\n warnings?: KortyxWarning[];\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\nconst createRuntimeId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nconst emitNodeEvent = (\n emitEvent: RunReasonEngineArgs[\"emitEvent\"],\n nodeId: string | undefined,\n event: string,\n payload: Record<string, unknown>,\n): void => {\n if (!emitEvent) return;\n emitEvent(event, {\n ...payload,\n ...(typeof nodeId === \"string\" && nodeId.length > 0\n ? { node: nodeId }\n : {}),\n });\n};\n\nexport async function runReasonEngine(\n args: RunReasonEngineArgs,\n): Promise<RunReasonEngineResult> {\n const stream = args.stream ?? args.model.options?.streaming ?? true;\n const emit = args.emit ?? true;\n const temperature =\n args.temperature ??\n args.model.options?.temperature ??\n args.defaultTemperature;\n const maxOutputTokens =\n args.maxOutputTokens ?? args.model.options?.maxOutputTokens;\n const stopSequences = args.stopSequences ?? args.model.options?.stopSequences;\n const abortSignal = args.abortSignal ?? args.model.options?.abortSignal;\n const reasoning = args.reasoning ?? args.model.options?.reasoning;\n const responseFormat =\n args.responseFormat ?? args.model.options?.responseFormat;\n const providerOptions =\n args.providerOptions ?? args.model.options?.providerOptions;\n\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 ...(providerOptions !== undefined ? { providerOptions } : {}),\n });\n\n const messages: KortyxPromptMessage[] = [];\n if (typeof args.system === \"string\" && args.system.length > 0) {\n messages.push({ role: \"system\", content: args.system });\n }\n messages.push({ role: \"user\", content: String(args.input ?? \"\") });\n\n const opId =\n typeof args.opId === \"string\" && args.opId.length > 0\n ? args.opId\n : createRuntimeId();\n const segmentId =\n typeof args.segmentId === \"string\" && args.segmentId.length > 0\n ? args.segmentId\n : createRuntimeId();\n\n const commonMeta: Record<string, unknown> = {\n ...(typeof args.id === \"string\" && args.id.length > 0\n ? { id: args.id }\n : {}),\n opId,\n segmentId,\n };\n const traceSpan = args.reasonTrace?.startSpan({\n name: \"runReasonEngine\",\n attributes: {\n ...commonMeta,\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n stream,\n emit,\n ...(args.telemetry?.operation\n ? { operation: args.telemetry.operation }\n : {}),\n ...(args.telemetry?.prompt?.name\n ? { promptName: args.telemetry.prompt.name }\n : {}),\n ...(args.telemetry?.prompt?.version !== undefined\n ? { promptVersion: args.telemetry.prompt.version }\n : {}),\n ...(args.telemetry?.prompt?.type\n ? { promptType: args.telemetry.prompt.type }\n : {}),\n ...(typeof args.nodeId === \"string\" && args.nodeId.length > 0\n ? { nodeId: args.nodeId }\n : {}),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n input: args.telemetry?.input ?? messages,\n },\n });\n\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 },\n telemetry: {\n ...(args.telemetry ?? {}),\n output: args.telemetry?.output ?? result.text,\n },\n });\n };\n\n const failTrace = (\n span: ReasonTraceSpan | undefined,\n error: unknown,\n ): void => {\n span?.fail?.(error, {\n attributes: {\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n },\n });\n };\n\n try {\n if (stream) {\n let final = \"\";\n let raw: unknown;\n let usage: KortyxUsage | undefined;\n let finishReason: KortyxFinishReason | undefined;\n let providerMetadata: KortyxProviderMetadata | undefined;\n let warnings: KortyxWarning[] | undefined;\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-start\", {\n ...commonMeta,\n });\n }\n\n const response = await model.stream(messages);\n for await (const chunk of response) {\n switch (chunk.type) {\n case \"text-delta\": {\n if (chunk.delta.length === 0) break;\n final += chunk.delta;\n args.onTextChunk?.(chunk.delta);\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: chunk.delta,\n });\n }\n break;\n }\n case \"finish\": {\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.usage !== undefined) {\n usage = chunk.usage;\n }\n if (chunk.finishReason !== undefined) {\n finishReason = chunk.finishReason;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (chunk.warnings !== undefined) {\n warnings = chunk.warnings;\n }\n break;\n }\n case \"raw\": {\n raw = chunk.raw;\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n break;\n }\n case \"error\": {\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (chunk.warnings !== undefined) {\n warnings = chunk.warnings;\n }\n throw toError(chunk.error);\n }\n }\n }\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n const result = {\n text: final,\n ...(raw !== undefined ? { raw } : {}),\n ...(usage !== undefined ? { usage } : {}),\n ...(finishReason !== undefined ? { finishReason } : {}),\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n ...(warnings !== undefined ? { warnings } : {}),\n };\n endTrace(traceSpan, result);\n return result;\n }\n\n const response = await model.invoke(messages);\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-start\", {\n ...commonMeta,\n });\n if (response.content) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: response.content,\n });\n }\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n const result = {\n text: response.content,\n ...(response.raw !== undefined ? { raw: response.raw } : {}),\n ...(response.usage !== undefined ? { usage: response.usage } : {}),\n ...(response.finishReason !== undefined\n ? { finishReason: response.finishReason }\n : {}),\n ...(response.providerMetadata !== undefined\n ? { providerMetadata: response.providerMetadata }\n : {}),\n ...(response.warnings !== undefined\n ? { warnings: response.warnings }\n : {}),\n };\n endTrace(traceSpan, result);\n return result;\n } catch (error) {\n failTrace(traceSpan, error);\n throw error;\n }\n}\n","import type { InterruptInput } from \"@kortyx/core\";\nimport type { KortyxFinishReason } from \"@kortyx/providers\";\nimport type { SchemaLike } from \"../types\";\nimport { parseWithSchema } from \"../validation\";\n\nconst tryJsonParse = (\n value: string,\n):\n | { ok: true; value: unknown; error?: never }\n | { ok: false; error: string } => {\n try {\n return { ok: true, value: JSON.parse(value) };\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n};\n\nconst extractJsonCodeBlock = (value: string): string | null => {\n const match = value.match(/```(?:json)?\\s*([\\s\\S]*?)```/i);\n if (!match || typeof match[1] !== \"string\") return null;\n const inner = match[1].trim();\n return inner.length > 0 ? inner : null;\n};\n\nconst tryStringify = (value: unknown): string => {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nexport const resolveOutputCandidate = (text: string): unknown => {\n const trimmed = text.trim();\n if (!trimmed) return text;\n\n const direct = tryJsonParse(trimmed);\n if (direct.ok) return direct.value;\n\n const block = extractJsonCodeBlock(trimmed);\n if (block) {\n const parsedBlock = tryJsonParse(block);\n if (parsedBlock.ok) return parsedBlock.value;\n }\n\n return text;\n};\n\nconst looksLikeStructuredJsonAttempt = (value: string): boolean => {\n const trimmed = value.trim();\n if (!trimmed) return false;\n\n return (\n trimmed.startsWith(\"{\") ||\n trimmed.startsWith(\"[\") ||\n /^```(?:json)?/i.test(trimmed)\n );\n};\n\nconst isLikelyTruncatedStructuredOutput = (text: string): boolean => {\n const trimmed = text.trim();\n if (!looksLikeStructuredJsonAttempt(trimmed)) return false;\n\n const direct = tryJsonParse(trimmed);\n if (!direct.ok && direct.error) return true;\n\n const block = extractJsonCodeBlock(trimmed);\n if (!block) return false;\n\n const parsedBlock = tryJsonParse(block);\n return !parsedBlock.ok && Boolean(parsedBlock.error);\n};\n\nconst createTruncatedStructuredOutputError = (label: string): Error =>\n new Error(\n `${label} was truncated before producing valid structured output. The model stopped due to output length. Increase maxOutputTokens or simplify the requested output.`,\n );\n\nconst createInvalidStructuredOutputError = (label: string): Error =>\n new Error(\n `${label} did not produce valid structured output. The model returned text instead of the expected JSON payload. This often happens when output is truncated or the provider does not follow JSON mode. Increase maxOutputTokens or simplify the requested output.`,\n );\n\nexport const parseReasonOutputWithSchema = <TOutput>(args: {\n text: string;\n schema: SchemaLike<TOutput>;\n finishReason?: KortyxFinishReason;\n label: string;\n}): TOutput => {\n const candidate = resolveOutputCandidate(args.text);\n\n try {\n return parseWithSchema(args.schema, candidate, args.label);\n } catch (error) {\n if (\n args.finishReason?.unified === \"length\" ||\n isLikelyTruncatedStructuredOutput(args.text)\n ) {\n throw createTruncatedStructuredOutputError(args.label);\n }\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\n throw createInvalidStructuredOutputError(args.label);\n }\n throw error;\n }\n};\n\nexport const parseInterruptFirstPassResult = <\n TRequest extends InterruptInput = InterruptInput,\n TOutput = unknown,\n>(args: {\n text: string;\n requestSchema: SchemaLike<TRequest>;\n outputSchema?: SchemaLike<TOutput>;\n finishReason?: KortyxFinishReason;\n mode?: \"required\" | \"optional\" | undefined;\n}):\n | {\n draftText: string;\n interruptRequired: boolean;\n request: TRequest;\n output?: TOutput;\n }\n | {\n draftText: string;\n interruptRequired: false;\n request?: undefined;\n output?: TOutput;\n } => {\n const candidate = resolveOutputCandidate(args.text);\n if (!isRecord(candidate)) {\n if (\n args.finishReason?.unified === \"length\" ||\n isLikelyTruncatedStructuredOutput(args.text)\n ) {\n throw createTruncatedStructuredOutputError(\"useReason output\");\n }\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\n throw createInvalidStructuredOutputError(\"useReason output\");\n }\n throw new Error(\n \"useReason first pass with interrupt must return a JSON object.\",\n );\n }\n\n const mode = args.mode ?? \"required\";\n let interruptRequired = true;\n if (mode === \"optional\") {\n if (\n candidate.decision !== \"continue\" &&\n candidate.decision !== \"interrupt\"\n ) {\n throw new Error(\n 'useReason optional interrupt first pass must include decision \"continue\" or \"interrupt\".',\n );\n }\n interruptRequired = candidate.decision === \"interrupt\";\n\n if (!interruptRequired) {\n const hasUnexpectedRequest = [\n candidate.interruptRequest,\n candidate.request,\n candidate.interrupt,\n ].some((value) => value !== null && value !== undefined);\n\n if (hasUnexpectedRequest) {\n throw new Error(\n 'useReason optional interrupt first pass with decision \"continue\" must not include an interrupt request.',\n );\n }\n }\n }\n\n let request: TRequest | undefined;\n if (interruptRequired) {\n const requestCandidates: unknown[] = [\n candidate.interruptRequest,\n candidate.request,\n candidate.interrupt,\n mode === \"required\" ? candidate : undefined,\n ];\n const requestPayload = requestCandidates.find(\n (value) => value !== null && value !== undefined,\n );\n\n request = parseWithSchema(\n args.requestSchema,\n requestPayload,\n \"useReason interrupt.request\",\n );\n }\n\n let output: TOutput | undefined;\n if (args.outputSchema) {\n const outputPayload = Object.hasOwn(candidate, \"output\")\n ? candidate.output\n : candidate;\n try {\n output = parseWithSchema(\n args.outputSchema,\n outputPayload,\n \"useReason output\",\n );\n } catch (error) {\n if (\n args.finishReason?.unified === \"length\" ||\n isLikelyTruncatedStructuredOutput(args.text)\n ) {\n throw createTruncatedStructuredOutputError(\"useReason output\");\n }\n if (\n typeof outputPayload === \"string\" &&\n outputPayload.trim().length > 0\n ) {\n throw createInvalidStructuredOutputError(\"useReason output\");\n }\n throw error;\n }\n }\n\n const explicitDraft =\n typeof candidate.draftText === \"string\" && candidate.draftText.length > 0\n ? candidate.draftText\n : typeof candidate.text === \"string\" && candidate.text.length > 0\n ? candidate.text\n : undefined;\n\n if (!args.outputSchema && !explicitDraft) {\n throw new Error(\n \"useReason first pass with interrupt requires `draftText` when outputSchema is not provided.\",\n );\n }\n\n const draftText =\n explicitDraft ??\n (output !== undefined ? tryStringify(output) : String(args.text ?? \"\"));\n\n if (!interruptRequired) {\n return {\n draftText,\n interruptRequired: false,\n ...(output !== undefined ? { output } : {}),\n };\n }\n\n return {\n draftText,\n interruptRequired: true,\n request: request as TRequest,\n ...(output !== undefined ? { output } : {}),\n };\n};\n","import type { InterruptInput } from \"@kortyx/core\";\nimport { toJSONSchema } from \"zod\";\nimport type { SchemaLike } from \"../types\";\n\nconst tryStringify = (value: unknown): string => {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nconst tryGetSchemaHint = (schema: unknown): string | undefined => {\n try {\n const hint = toJSONSchema(schema as never);\n return JSON.stringify(hint, null, 2);\n } catch {\n return undefined;\n }\n};\n\nconst withSchemaHint = (\n input: string,\n label: string,\n schema: unknown,\n): string => {\n const hint = tryGetSchemaHint(schema);\n if (!hint) return input;\n return `${input}\\n\\n${label}:\\n${hint}`;\n};\n\nexport const defaultInterruptFirstPassInput = (args: {\n input: string;\n requestSchema: SchemaLike<unknown>;\n outputSchema?: SchemaLike<unknown>;\n mode?: \"required\" | \"optional\" | undefined;\n}): string => {\n const mode = args.mode ?? \"required\";\n const base =\n mode === \"optional\"\n ? args.outputSchema\n ? [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: decision, output, interruptRequest, draftText.\",\n '- decision must be either \"continue\" or \"interrupt\".',\n '- Use decision \"continue\" when you can produce the final output without asking the user.',\n '- Use decision \"interrupt\" only when user input is needed before finalizing.',\n \"- output must match the expected output JSON schema.\",\n '- When decision is \"interrupt\", interruptRequest must match the expected interrupt request JSON schema and must be a non-null object.',\n '- When decision is \"continue\", interruptRequest must be null.',\n \"- draftText should be a concise plain-language summary of output.\",\n ].join(\"\\n\\n\")\n : [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: decision, draftText, interruptRequest.\",\n '- decision must be either \"continue\" or \"interrupt\".',\n '- Use decision \"continue\" when you can produce the final answer without asking the user.',\n '- Use decision \"interrupt\" only when user input is needed before finalizing.',\n \"- draftText should be the current answer text.\",\n '- When decision is \"interrupt\", interruptRequest must match the expected interrupt request JSON schema and must be a non-null object.',\n '- When decision is \"continue\", interruptRequest must be null.',\n ].join(\"\\n\\n\")\n : args.outputSchema\n ? [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: output, interruptRequest, draftText.\",\n \"- output must match the expected output JSON schema.\",\n \"- interruptRequest must match the expected interrupt request JSON schema.\",\n \"- interruptRequest must be a non-null object.\",\n \"- draftText should be a concise plain-language summary of output.\",\n \"- If uncertain, still return a valid interruptRequest with safe default options.\",\n ].join(\"\\n\\n\")\n : [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: draftText, interruptRequest.\",\n \"- draftText should be the current draft answer text.\",\n \"- interruptRequest must match the expected interrupt request JSON schema.\",\n \"- interruptRequest must be a non-null object.\",\n \"- If uncertain, still return a valid interruptRequest with safe default options.\",\n ].join(\"\\n\\n\");\n\n const withInterruptSchema = withSchemaHint(\n base,\n \"Expected interrupt request JSON schema (for `interruptRequest`)\",\n args.requestSchema,\n );\n\n if (!args.outputSchema) return withInterruptSchema;\n const withOutputSchema = withSchemaHint(\n withInterruptSchema,\n \"Expected output JSON schema (for `output`)\",\n args.outputSchema,\n );\n return [\n withOutputSchema,\n \"JSON template:\",\n mode === \"optional\"\n ? '{ \"decision\": \"continue\", \"output\": { ... }, \"interruptRequest\": null, \"draftText\": \"...\" }'\n : '{ \"output\": { ... }, \"interruptRequest\": { ... }, \"draftText\": \"...\" }',\n ].join(\"\\n\\n\");\n};\n\nexport const defaultContinuationInput = (args: {\n input: string;\n draftText: string;\n draftOutput?: unknown;\n request: InterruptInput;\n response: unknown;\n}): string =>\n [\n \"You are continuing a paused reasoning task after user input.\",\n \"Update the previous result using the user response and return the final answer only.\",\n \"If the previous output was JSON, return JSON in the same schema.\",\n \"\",\n `Original request:\\n${args.input}`,\n `Draft answer text:\\n${args.draftText}`,\n `Draft output object:\\n${tryStringify(args.draftOutput ?? args.draftText)}`,\n `Interrupt request shown to user:\\n${tryStringify(args.request)}`,\n `User response:\\n${tryStringify(args.response)}`,\n ].join(\"\\n\\n\");\n\nexport const withOutputGuardrails = (\n input: string,\n schema?: SchemaLike<unknown>,\n): string => {\n const base = [\n input,\n \"Output rules:\",\n \"- Return only JSON, no markdown fences.\",\n \"- Ensure the response conforms to the expected output schema.\",\n \"- Do not include explanatory text outside the JSON object.\",\n ].join(\"\\n\\n\");\n return withSchemaHint(base, \"Expected output JSON schema\", schema);\n};\n\nexport const withStructuredStreamHints = (\n input: string,\n args: {\n setFieldPaths?: string[];\n appendFieldPaths?: string[];\n textDeltaFieldPaths?: string[];\n },\n): string => {\n const rules: string[] = [];\n\n for (const path of args.setFieldPaths ?? []) {\n rules.push(\n `- For the field path pattern \\`${path}\\`, write one stable final value and do not rewrite it after it is complete.`,\n );\n }\n\n for (const path of args.appendFieldPaths ?? []) {\n rules.push(\n `- For the array field path pattern \\`${path}\\`, write items in final order and finish each item before starting the next.`,\n );\n rules.push(\n `- Once an item in \\`${path}\\` is complete, do not rewrite or reorder earlier items.`,\n );\n }\n\n for (const path of args.textDeltaFieldPaths ?? []) {\n rules.push(\n `- For the string field path pattern \\`${path}\\`, write the value progressively by appending text to the end.`,\n );\n rules.push(\n `- Do not rewrite or replace the earlier prefix of \\`${path}\\` once emitted.`,\n );\n }\n\n if (rules.length === 0) return input;\n\n return [\n input,\n \"Streaming rules:\",\n ...rules,\n \"- Keep the overall response as valid JSON.\",\n ].join(\"\\n\\n\");\n};\n","import { assertStructuredPath, parseStructuredPath } from \"../structured-path\";\nimport type { UseReasonStructuredConfig } from \"../types\";\n\nexport const resolveAppendFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const appendPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"append\")\n .map(([path]) => path);\n\n for (const path of appendPaths) {\n assertStructuredPath(path, \"useReason structured append\");\n }\n\n return appendPaths;\n};\n\nexport const resolveSetFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const setPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"set\")\n .map(([path]) => path);\n\n for (const path of setPaths) {\n assertStructuredPath(path, \"useReason structured set\");\n }\n\n return setPaths;\n};\n\nexport const resolveTextDeltaFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const textPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"text-delta\")\n .map(([path]) => path);\n\n for (const path of textPaths) {\n assertStructuredPath(path, \"useReason structured text-delta\");\n }\n\n return textPaths;\n};\n\nconst extractCompletedStringValueAt = (args: {\n text: string;\n start: number;\n}): { complete: boolean; value?: string } => {\n let value = \"\";\n\n for (let i = args.start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (ch === '\"') {\n return {\n complete: true,\n value,\n };\n }\n\n if (ch !== \"\\\\\") {\n value += ch;\n continue;\n }\n\n const next = args.text[i + 1];\n if (!next) {\n return {\n complete: false,\n };\n }\n\n if (\n next === '\"' ||\n next === \"\\\\\" ||\n next === \"/\" ||\n next === \"b\" ||\n next === \"f\" ||\n next === \"n\" ||\n next === \"r\" ||\n next === \"t\"\n ) {\n value +=\n next === \"b\"\n ? \"\\b\"\n : next === \"f\"\n ? \"\\f\"\n : next === \"n\"\n ? \"\\n\"\n : next === \"r\"\n ? \"\\r\"\n : next === \"t\"\n ? \"\\t\"\n : next;\n i += 1;\n continue;\n }\n\n if (next === \"u\") {\n const hex = args.text.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n return {\n complete: false,\n };\n }\n value += String.fromCharCode(Number.parseInt(hex, 16));\n i += 5;\n continue;\n }\n\n return {\n complete: false,\n };\n }\n\n return {\n complete: false,\n };\n};\n\nconst skipWhitespace = (text: string, start: number): number => {\n let i = start;\n while (i < text.length && /\\s/.test(text[i] ?? \"\")) i += 1;\n return i;\n};\n\nconst pathSegmentMatches = (patternPart: string, actualPart: string): boolean =>\n patternPart === \"*\" || patternPart === actualPart;\n\nconst pathMatchesPattern = (\n actualParts: string[],\n patternParts: string[],\n): boolean =>\n actualParts.length === patternParts.length &&\n actualParts.every((part, index) =>\n pathSegmentMatches(patternParts[index] ?? \"\", part),\n );\n\nconst isPathPrefix = (prefix: string[], full: string[]): boolean =>\n prefix.length <= full.length &&\n prefix.every((part, index) => pathSegmentMatches(full[index] ?? \"\", part));\n\nconst parseStringToken = (\n text: string,\n start: number,\n): { complete: boolean; end?: number; value?: string } => {\n if (text[start] !== '\"') return { complete: false };\n\n const parsed = extractCompletedStringValueAt({ text, start: start + 1 });\n if (!parsed.complete || parsed.value === undefined)\n return { complete: false };\n\n let inEscape = false;\n for (let i = start + 1; i < text.length; i += 1) {\n const ch = text[i];\n if (ch === undefined) break;\n\n if (inEscape) {\n inEscape = false;\n if (ch === \"u\") i += 4;\n continue;\n }\n\n if (ch === \"\\\\\") {\n inEscape = true;\n continue;\n }\n\n if (ch === '\"') {\n return {\n complete: true,\n end: i + 1,\n value: parsed.value,\n };\n }\n }\n\n return { complete: false };\n};\n\nconst skipNestedValue = (\n text: string,\n start: number,\n): { complete: boolean; end?: number } => {\n const opener = text[start];\n const closer = opener === \"{\" ? \"}\" : \"]\";\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n\n for (let i = start; i < text.length; i += 1) {\n const ch = text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === opener) {\n nesting += 1;\n continue;\n }\n\n if (ch === closer) {\n nesting -= 1;\n if (nesting === 0) {\n return { complete: true, end: i + 1 };\n }\n }\n }\n\n return { complete: false };\n};\n\nconst skipCompleteValue = (\n text: string,\n start: number,\n): { complete: boolean; end?: number } => {\n const i = skipWhitespace(text, start);\n const first = text[i];\n if (!first) return { complete: false };\n\n if (first === '\"') {\n const parsed = parseStringToken(text, i);\n return parsed.complete && parsed.end !== undefined\n ? { complete: true, end: parsed.end }\n : { complete: false };\n }\n\n if (first === \"{\" || first === \"[\") {\n return skipNestedValue(text, i);\n }\n\n for (let j = i; j < text.length; j += 1) {\n const ch = text[j];\n if (ch !== \",\" && ch !== \"}\" && ch !== \"]\") continue;\n\n const raw = text.slice(i, j).trim();\n if (!raw) return { complete: false };\n\n try {\n JSON.parse(raw);\n return { complete: true, end: j };\n } catch {\n return { complete: false };\n }\n }\n\n return { complete: false };\n};\n\nconst locateValueStart = (args: {\n text: string;\n path: string;\n}): { found: boolean; start?: number } => {\n const [first] = locateValueStarts(args);\n return first\n ? {\n found: true,\n start: first.start,\n }\n : {\n found: false,\n };\n};\n\nconst locateValueStarts = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; start: number }> => {\n const targetParts = parseStructuredPath(\n args.path,\n \"useReason structured field\",\n );\n const matches: Array<{ path: string; start: number }> = [];\n\n const visitValue = (start: number, currentParts: string[]): void => {\n const valueStart = skipWhitespace(args.text, start);\n if (pathMatchesPattern(currentParts, targetParts)) {\n matches.push({\n path: currentParts.join(\".\"),\n start: valueStart,\n });\n return;\n }\n\n if (!isPathPrefix(currentParts, targetParts)) {\n return;\n }\n\n const first = args.text[valueStart];\n if (first === \"{\") visitObject(valueStart + 1, currentParts);\n if (first === \"[\") visitArray(valueStart + 1, currentParts);\n };\n\n const visitObject = (start: number, currentParts: string[]): void => {\n let i = skipWhitespace(args.text, start);\n\n while (i < args.text.length) {\n const ch = args.text[i];\n if (ch === \"}\") return;\n if (ch === \",\") {\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (ch !== '\"') return;\n\n const key = parseStringToken(args.text, i);\n if (!key.complete || key.end === undefined || key.value === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, key.end);\n if (args.text[i] !== \":\") return;\n\n const valueStart = skipWhitespace(args.text, i + 1);\n const childParts = [...currentParts, key.value];\n if (pathMatchesPattern(childParts, targetParts)) {\n matches.push({\n path: childParts.join(\".\"),\n start: valueStart,\n });\n } else if (isPathPrefix(childParts, targetParts)) {\n visitValue(valueStart, childParts);\n }\n\n const skipped = skipCompleteValue(args.text, valueStart);\n if (!skipped.complete || skipped.end === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, skipped.end);\n if (args.text[i] === \",\") {\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (args.text[i] === \"}\") return;\n return;\n }\n };\n\n const visitArray = (start: number, currentParts: string[]): void => {\n let i = skipWhitespace(args.text, start);\n let index = 0;\n\n while (i < args.text.length) {\n if (args.text[i] === \"]\") return;\n\n const childParts = [...currentParts, String(index)];\n if (pathMatchesPattern(childParts, targetParts)) {\n matches.push({\n path: childParts.join(\".\"),\n start: i,\n });\n } else if (isPathPrefix(childParts, targetParts)) {\n visitValue(i, childParts);\n }\n\n const skipped = skipCompleteValue(args.text, i);\n if (!skipped.complete || skipped.end === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, skipped.end);\n if (args.text[i] === \",\") {\n index += 1;\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (args.text[i] === \"]\") return;\n return;\n }\n };\n\n visitValue(0, []);\n return matches;\n};\n\nconst extractCompletedValueAt = (args: {\n text: string;\n start: number;\n}): { complete: boolean; value?: unknown } => {\n const start = skipWhitespace(args.text, args.start);\n const first = args.text[start];\n if (!first) return { complete: false };\n\n if (first === '\"') {\n const parsed = extractCompletedStringValueAt({\n text: args.text,\n start: start + 1,\n });\n return parsed.complete\n ? {\n complete: true,\n value: parsed.value,\n }\n : {\n complete: false,\n };\n }\n\n if (first === \"{\") {\n return extractCompletedNestedValueAt({\n text: args.text,\n start,\n opener: \"{\",\n closer: \"}\",\n });\n }\n\n if (first === \"[\") {\n return extractCompletedNestedValueAt({\n text: args.text,\n start,\n opener: \"[\",\n closer: \"]\",\n });\n }\n\n for (let i = start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n if (ch !== \",\" && ch !== \"}\" && ch !== \"]\") continue;\n\n const raw = args.text.slice(start, i).trim();\n if (!raw) return { complete: false };\n\n try {\n return {\n complete: true,\n value: JSON.parse(raw),\n };\n } catch {\n return { complete: false };\n }\n }\n\n return { complete: false };\n};\n\nconst extractCompletedNestedValueAt = (args: {\n text: string;\n start: number;\n opener: \"{\" | \"[\";\n closer: \"}\" | \"]\";\n}): { complete: boolean; value?: unknown } => {\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n\n for (let i = args.start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === args.opener) {\n nesting += 1;\n continue;\n }\n\n if (ch === args.closer) {\n nesting -= 1;\n if (nesting === 0) {\n const raw = args.text.slice(args.start, i + 1);\n try {\n return {\n complete: true,\n value: JSON.parse(raw),\n };\n } catch {\n return {\n complete: false,\n };\n }\n }\n }\n }\n\n return {\n complete: false,\n };\n};\n\nexport const extractCompletedFieldValue = (args: {\n text: string;\n path: string;\n}): { found: boolean; complete: boolean; value?: unknown } => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) {\n return {\n found: located.found,\n complete: false,\n };\n }\n\n const parsed = extractCompletedValueAt({\n text: args.text,\n start: located.start,\n });\n return parsed.complete\n ? {\n found: true,\n complete: true,\n value: parsed.value,\n }\n : {\n found: true,\n complete: false,\n };\n};\n\nexport const extractCompletedFieldValues = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; value: unknown }> => {\n const located = locateValueStarts(args);\n const values: Array<{ path: string; value: unknown }> = [];\n\n for (const match of located) {\n const parsed = extractCompletedValueAt({\n text: args.text,\n start: match.start,\n });\n if (!parsed.complete) continue;\n\n values.push({\n path: match.path,\n value: parsed.value,\n });\n }\n\n return values;\n};\n\nexport const extractCompletedArrayItems = (args: {\n text: string;\n path: string;\n}): unknown[] => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) return [];\n\n const arrayStart = skipWhitespace(args.text, located.start);\n if (args.text[arrayStart] !== \"[\") return [];\n const start = arrayStart + 1;\n\n const items: unknown[] = [];\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n let itemStart = -1;\n\n for (let i = start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n if (itemStart < 0) itemStart = i;\n continue;\n }\n\n if (itemStart < 0) {\n if (/\\s/.test(ch) || ch === \",\") continue;\n if (ch === \"]\") break;\n itemStart = i;\n if (ch === \"{\" || ch === \"[\") {\n nesting = 1;\n } else {\n nesting = 0;\n }\n continue;\n }\n\n if (ch === \"{\" || ch === \"[\") {\n nesting += 1;\n continue;\n }\n\n if (ch === \"}\" || ch === \"]\") {\n if (nesting > 0) {\n nesting -= 1;\n continue;\n }\n }\n\n if (nesting === 0 && (ch === \",\" || ch === \"]\")) {\n const raw = args.text.slice(itemStart, i).trim();\n if (raw) {\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n itemStart = -1;\n if (ch === \"]\") break;\n }\n }\n\n return items;\n};\n\nexport const extractCompletedArrayItemGroups = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; items: unknown[] }> => {\n return locateValueStarts(args).flatMap((match) => {\n const items = extractCompletedArrayItems({\n text: args.text,\n path: match.path,\n });\n return items.length > 0\n ? [\n {\n path: match.path,\n items,\n },\n ]\n : [];\n });\n};\n\nexport const extractStreamingStringValue = (args: {\n text: string;\n path: string;\n}): { found: boolean; complete: boolean; value: string } => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) {\n return {\n found: located.found,\n complete: false,\n value: \"\",\n };\n }\n\n const stringStart = skipWhitespace(args.text, located.start);\n if (args.text[stringStart] !== '\"') {\n return {\n found: true,\n complete: false,\n value: \"\",\n };\n }\n\n let value = \"\";\n\n for (let i = stringStart + 1; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (ch === '\"') {\n return {\n found: true,\n complete: true,\n value,\n };\n }\n\n if (ch !== \"\\\\\") {\n value += ch;\n continue;\n }\n\n const next = args.text[i + 1];\n if (!next) {\n return {\n found: true,\n complete: false,\n value,\n };\n }\n\n if (\n next === '\"' ||\n next === \"\\\\\" ||\n next === \"/\" ||\n next === \"b\" ||\n next === \"f\" ||\n next === \"n\" ||\n next === \"r\" ||\n next === \"t\"\n ) {\n value +=\n next === \"b\"\n ? \"\\b\"\n : next === \"f\"\n ? \"\\f\"\n : next === \"n\"\n ? \"\\n\"\n : next === \"r\"\n ? \"\\r\"\n : next === \"t\"\n ? \"\\t\"\n : next;\n i += 1;\n continue;\n }\n\n if (next === \"u\") {\n const hex = args.text.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n return {\n found: true,\n complete: false,\n value,\n };\n }\n value += String.fromCharCode(Number.parseInt(hex, 16));\n i += 5;\n continue;\n }\n\n return {\n found: true,\n complete: false,\n value,\n };\n }\n\n return {\n found: true,\n complete: false,\n value,\n };\n};\n\nexport const extractStreamingStringValues = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; complete: boolean; value: string }> => {\n return locateValueStarts(args).flatMap((match) => {\n const current = extractStreamingStringValue({\n text: args.text,\n path: match.path,\n });\n return current.found\n ? [\n {\n path: match.path,\n complete: current.complete,\n value: current.value,\n },\n ]\n : [];\n });\n};\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport type {\n 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 {\n emitStructuredData,\n shouldEmitStructured,\n shouldStreamStructured,\n} from \"../structured\";\nimport type { ReasonTraceSpan } from \"../tracing\";\nimport type { SchemaLike, UseReasonArgs, UseReasonResult } from \"../types\";\nimport { parseWithSchema } from \"../validation\";\nimport {\n type ReasonInterruptCheckpoint,\n readReasonCheckpoint,\n readReasonCompletedCheckpoint,\n resolveHookStatePatch,\n resolveReasonCheckpointKey,\n} from \"./checkpoint\";\nimport { createRuntimeId, reasonEngine } from \"./engine\";\nimport {\n parseInterruptFirstPassResult,\n parseReasonOutputWithSchema,\n} from \"./parsing\";\nimport {\n defaultContinuationInput,\n defaultInterruptFirstPassInput,\n withOutputGuardrails,\n withStructuredStreamHints,\n} from \"./prompting\";\nimport {\n extractCompletedArrayItemGroups,\n extractCompletedFieldValues,\n extractStreamingStringValues,\n resolveAppendFieldPaths,\n resolveSetFieldPaths,\n resolveTextDeltaFieldPaths,\n} from \"./structured-stream\";\n\nconst mergeUsage = (\n left: KortyxUsage | undefined,\n right: KortyxUsage | undefined,\n): KortyxUsage | undefined => {\n if (!left) return right;\n if (!right) return left;\n\n const sum = (\n a: number | undefined,\n b: number | undefined,\n ): number | undefined =>\n a === undefined && b === undefined ? undefined : (a ?? 0) + (b ?? 0);\n\n const raw =\n left.raw || right.raw\n ? {\n ...(left.raw ?? {}),\n ...(right.raw ?? {}),\n }\n : undefined;\n const input = sum(left.input, right.input);\n const output = sum(left.output, right.output);\n const total = sum(left.total, right.total);\n const reasoning = sum(left.reasoning, right.reasoning);\n const cacheRead = sum(left.cacheRead, right.cacheRead);\n const cacheWrite = sum(left.cacheWrite, right.cacheWrite);\n const merged: KortyxUsage = {};\n\n if (input !== undefined) merged.input = input;\n if (output !== undefined) merged.output = output;\n if (total !== undefined) merged.total = total;\n if (reasoning !== undefined) merged.reasoning = reasoning;\n if (cacheRead !== undefined) merged.cacheRead = cacheRead;\n if (cacheWrite !== undefined) merged.cacheWrite = cacheWrite;\n if (raw) merged.raw = raw;\n\n return merged;\n};\n\nconst 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\nconst 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\nconst 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\nconst shouldStreamReasonStructured = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): boolean => (args.emit ?? true) && shouldStreamStructured(args.structured);\n\nconst resolveEffectiveReasoningIncludeThoughts = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): boolean =>\n args.reasoning?.includeThoughts ??\n args.model.options?.reasoning?.includeThoughts ??\n false;\n\nconst resolveEffectiveResponseFormatType = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): \"text\" | \"json\" | undefined =>\n args.responseFormat?.type ?? args.model.options?.responseFormat?.type;\n\nconst assertReasoningThoughtsCompatibility = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): void => {\n if (!resolveEffectiveReasoningIncludeThoughts(args)) return;\n\n const usesStructuredOutput =\n Boolean(args.outputSchema) ||\n Boolean(args.interrupt) ||\n Boolean(args.structured) ||\n resolveEffectiveResponseFormatType(args) === \"json\";\n\n if (!usesStructuredOutput) return;\n\n throw new Error(\n \"useReason does not support reasoning.includeThoughts with structured output, interrupt mode, or JSON responseFormat. Disable includeThoughts for this call.\",\n );\n};\n\nexport async function useReason<\n TOutput = unknown,\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): Promise<UseReasonResult<TOutput, TResponse>> {\n assertReasoningThoughtsCompatibility(args);\n const ctx = getHookContext();\n const id =\n typeof args.id === \"string\" && args.id.length > 0 ? args.id : undefined;\n const opId = createRuntimeId();\n const checkpointKey = resolveReasonCheckpointKey({\n ...(id ? { id } : {}),\n autoIndex: ctx.reasonCallIndex++,\n });\n const existingCompleted = readReasonCompletedCheckpoint(\n ctx.currentNodeState.byKey[checkpointKey],\n );\n\n if (existingCompleted) {\n return existingCompleted.result as UseReasonResult<TOutput, TResponse>;\n }\n\n const existingCheckpoint = readReasonCheckpoint(\n ctx.currentNodeState.byKey[checkpointKey],\n );\n\n const reasonMeta =\n typeof id === \"string\" ? ({ id, opId } as const) : ({ opId } as const);\n const traceSpan: ReasonTraceSpan | undefined =\n getReasonTraceAdapter()?.startSpan({\n name: \"useReason\",\n attributes: {\n ...(id ? { id } : {}),\n opId,\n nodeId: ctx.node.graph.node,\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n stream: args.stream ?? args.model.options?.streaming ?? true,\n emit: args.emit ?? true,\n ...(args.telemetry?.operation\n ? { operation: args.telemetry.operation }\n : {}),\n ...(args.telemetry?.prompt?.name\n ? { promptName: args.telemetry.prompt.name }\n : {}),\n ...(args.telemetry?.prompt?.version !== undefined\n ? { promptVersion: args.telemetry.prompt.version }\n : {}),\n ...(args.telemetry?.prompt?.type\n ? { promptType: args.telemetry.prompt.type }\n : {}),\n hasOutputSchema: Boolean(args.outputSchema),\n hasInterrupt: Boolean(args.interrupt),\n hasStructured: Boolean(args.structured),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n input: args.telemetry?.input ?? args.input,\n },\n });\n const suppressTextStream = Boolean(args.outputSchema || args.interrupt);\n const setFieldPaths = resolveSetFieldPaths(args.structured);\n const appendFieldPaths = resolveAppendFieldPaths(args.structured);\n const textDeltaFieldPaths = resolveTextDeltaFieldPaths(args.structured);\n const useStructuredIncrementalStreaming = Boolean(\n args.outputSchema &&\n !args.interrupt &&\n (setFieldPaths.length > 0 ||\n appendFieldPaths.length > 0 ||\n textDeltaFieldPaths.length > 0) &&\n args.stream !== false &&\n shouldStreamReasonStructured(args),\n );\n\n let firstText = \"\";\n let firstRaw: unknown;\n let firstOutput: TOutput | undefined;\n let firstInterruptRequest: TRequest | undefined;\n let firstInterruptRequired = false;\n\n let finalText = \"\";\n let finalRaw: unknown;\n let finalOutput: TOutput | undefined;\n let aggregatedUsage: KortyxUsage | undefined;\n let finalFinishReason: KortyxFinishReason | undefined;\n let aggregatedProviderMetadata: KortyxProviderMetadata | undefined;\n let aggregatedWarnings: KortyxWarning[] | undefined;\n const emittedSetValues = new Map<string, string>();\n const emittedAppendCounts = new Map<string, number>();\n const emittedTextValues = new Map<string, string>();\n\n if (existingCheckpoint) {\n firstText = existingCheckpoint.firstText;\n firstRaw = existingCheckpoint.firstRaw;\n firstOutput = existingCheckpoint.firstOutput as TOutput | undefined;\n finalText = firstText;\n finalRaw = firstRaw;\n finalOutput = firstOutput;\n aggregatedUsage = existingCheckpoint.firstUsage;\n finalFinishReason = existingCheckpoint.firstFinishReason;\n aggregatedProviderMetadata = existingCheckpoint.firstProviderMetadata;\n aggregatedWarnings = existingCheckpoint.firstWarnings;\n traceSpan?.addEvent?.(\"useReason.resume\", {\n checkpointKey,\n });\n } else {\n const first = await reasonEngine(\n {\n ...args,\n emit: suppressTextStream ? false : args.emit,\n stream: useStructuredIncrementalStreaming\n ? true\n : suppressTextStream\n ? false\n : args.stream,\n ...(useStructuredIncrementalStreaming\n ? {\n onTextChunk: (delta: string) => {\n firstText += delta;\n finalText = firstText;\n\n for (const fieldPath of setFieldPaths) {\n const values = extractCompletedFieldValues({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, value } of values) {\n const nextSerialized = JSON.stringify(value);\n if (emittedSetValues.get(path) === nextSerialized) continue;\n\n emittedSetValues.set(path, nextSerialized);\n emitStructuredData({\n kind: \"set\",\n path,\n value,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n\n for (const fieldPath of appendFieldPaths) {\n const groups = extractCompletedArrayItemGroups({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, items } of groups) {\n const emittedAppendCount =\n emittedAppendCounts.get(path) ?? 0;\n if (items.length <= emittedAppendCount) continue;\n\n const nextItems = items.slice(emittedAppendCount);\n emittedAppendCounts.set(path, items.length);\n emitStructuredData({\n kind: \"append\",\n path,\n items: nextItems,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n\n for (const fieldPath of textDeltaFieldPaths) {\n const values = extractStreamingStringValues({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, value } of values) {\n const emittedTextValue = emittedTextValues.get(path) ?? \"\";\n if (\n value.length <= emittedTextValue.length ||\n !value.startsWith(emittedTextValue)\n ) {\n continue;\n }\n\n const nextDelta = value.slice(emittedTextValue.length);\n emittedTextValues.set(path, value);\n if (nextDelta.length === 0) continue;\n\n emitStructuredData({\n kind: \"text-delta\",\n path,\n delta: nextDelta,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n },\n }\n : {}),\n },\n reasonMeta,\n args.interrupt\n ? defaultInterruptFirstPassInput({\n input: args.input,\n requestSchema: args.interrupt.requestSchema,\n mode: args.interrupt.mode ?? \"required\",\n ...(args.outputSchema\n ? { outputSchema: args.outputSchema as SchemaLike<unknown> }\n : {}),\n })\n : args.outputSchema\n ? withOutputGuardrails(\n withStructuredStreamHints(args.input, {\n ...(setFieldPaths.length > 0 ? { setFieldPaths } : {}),\n ...(appendFieldPaths.length > 0 ? { appendFieldPaths } : {}),\n ...(textDeltaFieldPaths.length > 0\n ? { textDeltaFieldPaths }\n : {}),\n }),\n args.outputSchema as SchemaLike<unknown>,\n )\n : undefined,\n );\n firstRaw = first.raw;\n finalRaw = first.raw;\n accumulateTokenUsage(first.usage);\n aggregatedUsage = mergeUsage(aggregatedUsage, first.usage);\n finalFinishReason = first.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n first.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, first.warnings);\n traceSpan?.addEvent?.(\"useReason.first-pass.complete\", {\n textLength: first.text.length,\n hasInterrupt: Boolean(args.interrupt),\n });\n\n if (args.interrupt) {\n const firstPass = parseInterruptFirstPassResult<TRequest, TOutput>({\n text: first.text,\n requestSchema: args.interrupt.requestSchema,\n ...(first.finishReason ? { finishReason: first.finishReason } : {}),\n ...(args.outputSchema\n ? { outputSchema: args.outputSchema as SchemaLike<TOutput> }\n : {}),\n mode: args.interrupt.mode ?? \"required\",\n });\n firstText = firstPass.draftText;\n finalText = firstPass.draftText;\n firstInterruptRequired = firstPass.interruptRequired;\n firstInterruptRequest = firstPass.request;\n firstOutput = firstPass.output;\n finalOutput = firstPass.output;\n } else {\n firstText = first.text;\n finalText = first.text;\n if (args.outputSchema) {\n firstOutput = parseReasonOutputWithSchema({\n text: first.text,\n schema: args.outputSchema,\n ...(first.finishReason ? { finishReason: first.finishReason } : {}),\n label: \"useReason output\",\n });\n }\n finalOutput = firstOutput;\n }\n }\n\n let interruptResponse: TResponse | undefined;\n\n if (args.interrupt && (existingCheckpoint || firstInterruptRequired)) {\n const requestSchema = args.interrupt.requestSchema;\n\n const interruptRequest = existingCheckpoint\n ? parseWithSchema(\n requestSchema,\n existingCheckpoint.request,\n \"useReason interrupt.request\",\n )\n : firstInterruptRequest;\n\n if (!interruptRequest) {\n throw new Error(\n \"useReason interrupt request is missing; first pass did not produce a valid interrupt payload.\",\n );\n }\n\n if (!existingCheckpoint) {\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"awaiting_interrupt\",\n request: interruptRequest,\n firstText,\n ...(firstRaw !== undefined ? { firstRaw } : {}),\n ...(aggregatedUsage !== undefined\n ? { firstUsage: aggregatedUsage }\n : {}),\n ...(finalFinishReason !== undefined\n ? { firstFinishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { firstProviderMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { firstWarnings: aggregatedWarnings }\n : {}),\n ...(firstOutput !== undefined ? { firstOutput } : {}),\n } satisfies ReasonInterruptCheckpoint;\n ctx.stateDirty = true;\n }\n\n const resumeStatePatch = resolveHookStatePatch({\n nodeId: ctx.node.graph.node,\n currentNodeState: ctx.currentNodeState,\n workflowState: ctx.workflowState,\n });\n\n interruptResponse = await awaitInterruptInternal<TRequest, TResponse>({\n request: interruptRequest,\n requestSchema,\n responseSchema: args.interrupt.responseSchema,\n ...(args.interrupt.schemaId ? { schemaId: args.interrupt.schemaId } : {}),\n ...(args.interrupt.schemaVersion\n ? { schemaVersion: args.interrupt.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n meta: {\n __kortyxResumeStatePatch: resumeStatePatch,\n },\n });\n traceSpan?.addEvent?.(\"useReason.interrupt.resolved\", {\n checkpointKey,\n });\n\n if (Object.hasOwn(ctx.currentNodeState.byKey, checkpointKey)) {\n delete ctx.currentNodeState.byKey[checkpointKey];\n ctx.stateDirty = true;\n }\n\n const continuationInput = defaultContinuationInput({\n input: args.input,\n draftText: firstText,\n ...(firstOutput !== undefined ? { draftOutput: firstOutput } : {}),\n request: interruptRequest,\n response: interruptResponse,\n });\n\n const second = await reasonEngine(\n {\n ...args,\n emit: suppressTextStream ? false : args.emit,\n stream: suppressTextStream ? false : args.stream,\n },\n reasonMeta,\n args.outputSchema\n ? withOutputGuardrails(\n continuationInput,\n args.outputSchema as SchemaLike<unknown>,\n )\n : continuationInput,\n );\n finalText = second.text;\n finalRaw = second.raw;\n accumulateTokenUsage(second.usage);\n aggregatedUsage = mergeUsage(aggregatedUsage, second.usage);\n finalFinishReason = second.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n second.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, second.warnings);\n traceSpan?.addEvent?.(\"useReason.continuation.complete\", {\n textLength: second.text.length,\n });\n\n if (args.outputSchema) {\n finalOutput = parseReasonOutputWithSchema({\n text: finalText,\n schema: args.outputSchema,\n ...(second.finishReason ? { finishReason: second.finishReason } : {}),\n label: \"useReason output\",\n });\n }\n }\n\n if (finalOutput !== undefined) {\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: finalOutput,\n structured: args.structured,\n emit: args.emit ?? true,\n });\n }\n\n const result = {\n ...(id ? { id } : {}),\n opId,\n text: finalText,\n ...(finalRaw !== undefined ? { raw: finalRaw } : {}),\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n ...(finalOutput !== undefined ? { output: finalOutput } : {}),\n ...(interruptResponse !== undefined ? { interruptResponse } : {}),\n };\n\n if (args.interrupt) {\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"completed\",\n result,\n };\n ctx.stateDirty = true;\n }\n\n traceSpan?.end?.({\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n attributes: {\n textLength: finalText.length,\n resumedFromCheckpoint: Boolean(existingCheckpoint),\n interrupted: Boolean(interruptResponse !== undefined),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n output: args.telemetry?.output ?? finalOutput ?? finalText,\n },\n });\n\n return result;\n}\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { getHookContext } from \"./context\";\nimport { awaitInterruptInternal } from \"./interrupt\";\nimport { useReason as useReasonInternal } from \"./reason/use-reason\";\nimport { emitStructuredData } from \"./structured\";\nimport type {\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonResult,\n UseStructuredDataArgs,\n} from \"./types\";\n\nexport type {\n SchemaLike,\n StructuredDataKind,\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonInterruptConfig,\n UseReasonResult,\n UseReasonStructuredConfig,\n UseStructuredDataAppendArgs,\n UseStructuredDataArgs,\n UseStructuredDataFinalArgs,\n UseStructuredDataSetArgs,\n UseStructuredDataTextDeltaArgs,\n} from \"./types\";\n\ntype StateSetter<T> = (next: T | ((prev: T) => T)) => void;\n\nexport function useStructuredData<TData = unknown>(\n args: UseStructuredDataArgs<TData>,\n): void {\n emitStructuredData(args);\n}\n\nexport function useReason<\n TOutput = unknown,\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): Promise<UseReasonResult<TOutput, TResponse>> {\n return useReasonInternal(args);\n}\n\nexport function useInterrupt<\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(args: UseInterruptArgs<TRequest, TResponse>): Promise<TResponse> {\n return awaitInterruptInternal(args);\n}\n\nexport function useRuntimeContext<\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(): TContext {\n const ctx = getHookContext();\n const config = ctx.state.config;\n const context =\n config && typeof config === \"object\" && \"context\" in config\n ? (config as { context?: unknown }).context\n : undefined;\n\n return context && typeof context === \"object\" && !Array.isArray(context)\n ? (context as TContext)\n : ({} as TContext);\n}\n\nexport function useNodeState<T>(initialValue: T): [T, StateSetter<T>] {\n const ctx = getHookContext();\n const nodeState = ctx.currentNodeState;\n\n const index = ctx.nodeStateIndex++;\n if (index >= nodeState.byIndex.length) {\n nodeState.byIndex[index] = initialValue as T;\n ctx.stateDirty = true;\n }\n\n const getValue = () => nodeState.byIndex[index] as T;\n const setValue: StateSetter<T> = (next) => {\n const prev = getValue();\n const resolved =\n typeof next === \"function\" ? (next as (p: T) => T)(prev) : next;\n nodeState.byIndex[index] = resolved;\n ctx.stateDirty = true;\n };\n\n return [getValue(), setValue];\n}\n\nexport function useWorkflowState<T>(\n key: string,\n ...rest: [] | [T]\n): [T, StateSetter<T>] {\n const ctx = getHookContext();\n const workflowState = ctx.workflowState;\n const hasInitial = rest.length > 0;\n const initialValue = rest[0];\n\n if (!Object.hasOwn(workflowState, key) && hasInitial) {\n workflowState[key] = initialValue as T;\n ctx.stateDirty = true;\n }\n\n const getValue = () => workflowState[key] as T;\n const setValue: StateSetter<T> = (next) => {\n const prev = getValue();\n const resolved =\n typeof next === \"function\" ? (next as (p: T) => T)(prev) : next;\n workflowState[key] = resolved;\n ctx.stateDirty = true;\n };\n\n return [getValue(), setValue];\n}\n"],"mappings":"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","names":["useReason","import_node_crypto","import_node_crypto","response","result","createRuntimeId","isRecord","tryStringify","createRuntimeId","useReason"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/context.ts","../src/validation.ts","../src/interrupt.ts","../src/structured.ts","../src/structured-path.ts","../src/reason/checkpoint.ts","../src/reason/engine.ts","../src/reason-engine.ts","../src/reason/parsing.ts","../src/reason/prompting.ts","../src/reason/result.ts","../src/reason/structured-stream.ts","../src/reason/tools.ts","../src/reason/use-reason.ts","../src/hooks.ts"],"sourcesContent":["// release-test: 2026-01-22\n/**\n * @kortyx/hooks\n *\n * Internal hook implementations resolved via async-local context.\n */\n\nexport type { HookRuntimeContext } from \"./context\";\nexport { runWithHookContext } from \"./context\";\nexport type {\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonResult,\n UseReasonStep,\n UseReasonToolExecution,\n UseStructuredDataArgs,\n} from \"./hooks\";\nexport {\n useInterrupt,\n useNodeState,\n useReason,\n useRuntimeContext,\n useStructuredData,\n useWorkflowState,\n} from \"./hooks\";\nexport type {\n KortyxTelemetryConfig,\n KortyxTelemetryContentCapture,\n KortyxTelemetryPrompt,\n KortyxTraceAdapter,\n KortyxTraceMetadata,\n ReasonTraceAdapter,\n ReasonTraceAttributes,\n ReasonTraceSpan,\n ReasonTraceSpanEndArgs,\n ReasonTraceSpanStartArgs,\n} from \"./tracing\";\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type {\n GraphState,\n InterruptInput,\n InterruptResult,\n NodeConfig,\n TokenUsage,\n} from \"@kortyx/core\";\nimport type { KortyxUsage } from \"@kortyx/providers\";\nimport type { ReasonTraceAdapter } from \"./tracing\";\n\ntype NodeStateStore = {\n byIndex: unknown[];\n byKey: Record<string, unknown>;\n};\n\ntype HookRuntimeState = {\n nodeState?: Record<string, unknown>;\n workflowState?: Record<string, unknown>;\n};\n\ntype StoredNodeStateEnvelope = {\n nodeId?: unknown;\n state?: unknown;\n};\n\ntype HookStatePatchedError = {\n __kortyxHookStatePatch?: Record<string, unknown>;\n};\n\nexport type HookNodeRuntimeContext = {\n graph: {\n name: string;\n node: string;\n };\n config: NodeConfig;\n emit: (event: string, payload: unknown) => void;\n awaitInterrupt: (args: InterruptInput) => InterruptResult;\n};\n\nexport type HookRuntimeContext = {\n node: HookNodeRuntimeContext;\n state: GraphState;\n reasonTrace?: ReasonTraceAdapter | undefined;\n};\n\ntype HookInternalContext = HookRuntimeContext & {\n nodeStateIndex: number;\n reasonCallIndex: number;\n currentNodeState: NodeStateStore;\n workflowState: Record<string, unknown>;\n tokenUsage?: TokenUsage | undefined;\n stateDirty: boolean;\n runtimeDirty: boolean;\n};\n\nconst storage = new AsyncLocalStorage<HookInternalContext>();\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst normalizeNodeState = (value: unknown): NodeStateStore => {\n if (Array.isArray(value)) {\n return { byIndex: [...value], byKey: {} };\n }\n\n if (isRecord(value)) {\n const byIndex = Array.isArray(value.byIndex) ? [...value.byIndex] : [];\n const byKey = isRecord(value.byKey) ? { ...value.byKey } : {};\n return { byIndex, byKey };\n }\n\n return { byIndex: [], byKey: {} };\n};\n\nconst cloneWorkflowState = (value: unknown): Record<string, unknown> =>\n isRecord(value) ? { ...value } : {};\n\nconst cloneTokenUsage = (value: unknown): TokenUsage | undefined => {\n if (!isRecord(value)) return undefined;\n const input = typeof value.input === \"number\" ? value.input : undefined;\n const output = typeof value.output === \"number\" ? value.output : undefined;\n const total = typeof value.total === \"number\" ? value.total : undefined;\n if (input === undefined && output === undefined && total === undefined) {\n return undefined;\n }\n return {\n input: input ?? 0,\n output: output ?? 0,\n total: total ?? 0,\n };\n};\n\nconst getHookRuntimeState = (state: GraphState): HookRuntimeState => {\n const runtime = (state.runtime ?? {}) as Record<string, unknown>;\n const internal = isRecord(runtime.__kortyx) ? runtime.__kortyx : undefined;\n const result: HookRuntimeState = {};\n if (isRecord(internal?.nodeState)) result.nodeState = internal?.nodeState;\n if (isRecord(internal?.workflowState)) {\n result.workflowState = internal?.workflowState;\n }\n return result;\n};\n\nconst createInternalContext = (\n ctx: HookRuntimeContext,\n): HookInternalContext => {\n const hookRuntimeState = getHookRuntimeState(ctx.state);\n const nodeId = ctx.node.graph.node;\n const storedNodeState = isRecord(hookRuntimeState.nodeState)\n ? (hookRuntimeState.nodeState as StoredNodeStateEnvelope)\n : undefined;\n const storedNodeId =\n typeof storedNodeState?.nodeId === \"string\"\n ? String(storedNodeState.nodeId)\n : \"\";\n const storedState = storedNodeState?.state;\n const currentNodeState =\n storedNodeId && storedNodeId === nodeId\n ? normalizeNodeState(storedState)\n : { byIndex: [], byKey: {} };\n\n return {\n ...ctx,\n nodeStateIndex: 0,\n reasonCallIndex: 0,\n currentNodeState,\n workflowState: cloneWorkflowState(hookRuntimeState.workflowState),\n tokenUsage: cloneTokenUsage(ctx.state.runtime?.tokenUsage),\n stateDirty: false,\n runtimeDirty: false,\n };\n};\n\nconst buildRuntimeStateUpdates = (ctx: HookInternalContext) => {\n const updates: Record<string, unknown> = {};\n\n if (ctx.stateDirty) {\n updates.__kortyx = {\n nodeState: {\n nodeId: ctx.node.graph.node,\n state: ctx.currentNodeState,\n },\n workflowState: ctx.workflowState,\n };\n }\n\n if (ctx.runtimeDirty && ctx.tokenUsage) {\n updates.tokenUsage = ctx.tokenUsage;\n }\n\n return Object.keys(updates).length > 0 ? updates : null;\n};\n\nconst cleanupCompletedReasonCheckpoints = (ctx: HookInternalContext): void => {\n let changed = false;\n\n for (const [key, value] of Object.entries(ctx.currentNodeState.byKey)) {\n if (!key.startsWith(\"__useReason:\")) continue;\n if (!isRecord(value) || value.status !== \"completed\") continue;\n delete ctx.currentNodeState.byKey[key];\n changed = true;\n }\n\n if (changed) ctx.stateDirty = true;\n};\n\nconst toTokenUsageDelta = (\n usage: KortyxUsage | undefined,\n): TokenUsage | undefined => {\n if (!usage) return undefined;\n\n const input = usage.input ?? 0;\n const output = usage.output ?? 0;\n const total = usage.total ?? input + output + (usage.reasoning ?? 0);\n\n if (input === 0 && output === 0 && total === 0) {\n return undefined;\n }\n\n return {\n input,\n output,\n total,\n };\n};\n\nexport function accumulateTokenUsage(usage: KortyxUsage | undefined): void {\n const delta = toTokenUsageDelta(usage);\n if (!delta) return;\n\n const ctx = getHookContext();\n const current = ctx.tokenUsage ?? {\n input: 0,\n output: 0,\n total: 0,\n };\n\n ctx.tokenUsage = {\n input: current.input + delta.input,\n output: current.output + delta.output,\n total: current.total + delta.total,\n };\n ctx.runtimeDirty = true;\n}\n\nexport function getReasonTraceAdapter(): ReasonTraceAdapter | undefined {\n return getHookContext().reasonTrace;\n}\n\nexport async function runWithHookContext<T>(\n ctx: HookRuntimeContext,\n fn: () => Promise<T>,\n): Promise<{ result: T; runtimeUpdates: Record<string, unknown> | null }> {\n const internal = createInternalContext(ctx);\n try {\n const result = await storage.run(internal, fn);\n cleanupCompletedReasonCheckpoints(internal);\n return { result, runtimeUpdates: buildRuntimeStateUpdates(internal) };\n } catch (err) {\n const runtimeUpdates = buildRuntimeStateUpdates(internal);\n if (runtimeUpdates) {\n const currentRuntime = isRecord(internal.state.runtime)\n ? (internal.state.runtime as Record<string, unknown>)\n : {};\n internal.state.runtime = {\n ...currentRuntime,\n ...runtimeUpdates,\n } as unknown as GraphState[\"runtime\"];\n if (err && typeof err === \"object\") {\n (err as HookStatePatchedError).__kortyxHookStatePatch = runtimeUpdates;\n }\n }\n throw err;\n }\n}\n\nexport function getHookContext(): HookInternalContext {\n const ctx = storage.getStore();\n if (!ctx) {\n throw new Error(\"Hooks can only be used while a node is executing.\");\n }\n return ctx;\n}\n","import type { SchemaLike } from \"./types\";\n\nexport const parseWithSchema = <T>(\n schema: SchemaLike<T> | undefined,\n value: unknown,\n label: string,\n): T => {\n if (!schema) return value as T;\n\n const parsed = schema.safeParse(value);\n if (parsed.success) return parsed.data;\n\n const parsedError =\n \"error\" in parsed && parsed.error ? parsed.error : undefined;\n const reason =\n typeof parsedError?.message === \"string\" && parsedError.message.length > 0\n ? parsedError.message\n : \"invalid payload\";\n throw new Error(`${label} validation failed: ${reason}`);\n};\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { getHookContext } from \"./context\";\nimport type { UseInterruptArgs } from \"./types\";\nimport { parseWithSchema } from \"./validation\";\n\nexport const awaitInterruptInternal = <\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(\n args: UseInterruptArgs<TRequest, TResponse>,\n): Promise<TResponse> => {\n const ctx = getHookContext();\n\n const request = parseWithSchema(\n args.requestSchema,\n args.request,\n \"useInterrupt request\",\n );\n\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 ...(args.meta && typeof args.meta === \"object\" && !Array.isArray(args.meta)\n ? { meta: args.meta }\n : {}),\n } as InterruptInput;\n\n const raw = ctx.node.awaitInterrupt(enrichedRequest);\n const response = parseWithSchema(\n args.responseSchema,\n raw,\n \"useInterrupt response\",\n );\n\n return Promise.resolve(response);\n};\n","import { randomUUID } from \"node:crypto\";\nimport { getHookContext } from \"./context\";\nimport { assertStructuredPath } from \"./structured-path\";\nimport type { UseReasonStructuredConfig, UseStructuredDataArgs } from \"./types\";\nimport { parseWithSchema } from \"./validation\";\n\nconst createStructuredStreamId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nexport const emitStructuredData = <TData = unknown>(\n args: UseStructuredDataArgs<TData>,\n): void => {\n const ctx = getHookContext();\n const streamId =\n typeof args.streamId === \"string\" && args.streamId.length > 0\n ? args.streamId\n : createStructuredStreamId();\n const dataType =\n typeof args.dataType === \"string\" && args.dataType.length > 0\n ? args.dataType\n : \"generic\";\n\n const base = {\n node: ctx.node.graph.node,\n streamId,\n dataType,\n ...(typeof args.schemaId === \"string\" && args.schemaId.length > 0\n ? { schemaId: args.schemaId }\n : {}),\n ...(typeof args.schemaVersion === \"string\" && args.schemaVersion.length > 0\n ? { schemaVersion: args.schemaVersion }\n : {}),\n ...(typeof args.id === \"string\" && args.id.length > 0\n ? { id: args.id }\n : {}),\n };\n\n if (args.kind === \"set\") {\n assertStructuredPath(args.path, \"useStructuredData\");\n const value = parseWithSchema(\n args.valueSchema,\n args.value,\n \"useStructuredData value\",\n );\n ctx.node.emit(\"structured_data\", {\n ...base,\n kind: \"set\",\n path: args.path,\n value,\n });\n return;\n }\n\n if (args.kind === \"append\") {\n assertStructuredPath(args.path, \"useStructuredData\");\n const items = args.items.map((item) =>\n parseWithSchema(args.itemSchema, item, \"useStructuredData append item\"),\n );\n ctx.node.emit(\"structured_data\", {\n ...base,\n kind: \"append\",\n path: args.path,\n items,\n });\n return;\n }\n\n if (args.kind === \"text-delta\") {\n assertStructuredPath(args.path, \"useStructuredData\");\n ctx.node.emit(\"structured_data\", {\n ...base,\n kind: \"text-delta\",\n path: args.path,\n delta: args.delta,\n });\n return;\n }\n\n const validated = parseWithSchema(\n args.dataSchema,\n args.data,\n \"useStructuredData data\",\n );\n\n ctx.node.emit(\"structured_data\", {\n ...base,\n kind: \"final\",\n data: validated,\n });\n};\n\nexport const shouldEmitStructured = (\n cfg: UseReasonStructuredConfig | undefined,\n): boolean => Boolean(cfg);\n\nexport const shouldStreamStructured = (\n cfg: UseReasonStructuredConfig | undefined,\n): boolean => Boolean(cfg) && (cfg?.stream ?? true);\n","export const parseStructuredPath = (path: string, source: string): string[] => {\n if (path.length === 0) {\n throw new Error(`${source} path must be a non-empty dot-separated string.`);\n }\n\n const parts = path.split(\".\");\n if (parts.some((part) => part.length === 0)) {\n throw new Error(\n `${source} path \"${path}\" must not contain empty segments.`,\n );\n }\n\n return parts;\n};\n\nexport const assertStructuredPath = (path: string, source: string): void => {\n parseStructuredPath(path, source);\n};\n","import 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 { randomUUID } from \"node:crypto\";\nimport type {\n KortyxPromptMessage,\n KortyxReasoningOptions,\n KortyxResponseFormat,\n KortyxToolDefinition,\n ProviderModelRef,\n} from \"@kortyx/providers\";\nimport { getHookContext } from \"../context\";\nimport type { RunReasonEngineResult } from \"../reason-engine\";\nimport { runReasonEngine } from \"../reason-engine\";\nimport type { KortyxTraceMetadata } from \"../tracing\";\n\nexport type ReasonEngineInput = {\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | undefined;\n maxOutputTokens?: number | undefined;\n stopSequences?: string[] | undefined;\n abortSignal?: AbortSignal | undefined;\n reasoning?: KortyxReasoningOptions | undefined;\n responseFormat?: KortyxResponseFormat | undefined;\n providerOptions?: Record<string, unknown> | undefined;\n tools?: KortyxToolDefinition[] | undefined;\n messages?: KortyxPromptMessage[] | undefined;\n emit?: boolean | undefined;\n stream?: boolean | undefined;\n onTextChunk?: ((text: string) => void) | undefined;\n telemetry?: KortyxTraceMetadata | undefined;\n};\n\nexport const createRuntimeId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nexport async function reasonEngine(\n args: ReasonEngineInput,\n meta: { id?: string; opId: string },\n inputOverride?: string,\n): Promise<RunReasonEngineResult> {\n const ctx = getHookContext();\n\n return runReasonEngine({\n model: args.model,\n input: inputOverride ?? args.input,\n system: args.system,\n temperature: args.temperature,\n maxOutputTokens: args.maxOutputTokens,\n stopSequences: args.stopSequences,\n abortSignal: args.abortSignal,\n reasoning: args.reasoning,\n responseFormat: args.responseFormat,\n providerOptions: args.providerOptions,\n tools: args.tools,\n messages: args.messages,\n defaultTemperature: ctx.node.config?.model?.temperature,\n stream: args.stream,\n emit: args.emit,\n onTextChunk: args.onTextChunk,\n telemetry: args.telemetry,\n nodeId: ctx.node.graph.node,\n emitEvent: ctx.node.emit,\n reasonTrace: ctx.reasonTrace,\n id: meta.id,\n opId: meta.opId,\n });\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n KortyxFinishReason,\n KortyxPromptMessage,\n KortyxProviderMetadata,\n KortyxReasoningOptions,\n KortyxResponseFormat,\n KortyxToolCall,\n KortyxToolDefinition,\n KortyxUsage,\n KortyxWarning,\n ProviderModelRef,\n} from \"@kortyx/providers\";\nimport type {\n KortyxTraceMetadata,\n ReasonTraceAdapter,\n ReasonTraceSpan,\n} from \"./tracing\";\n\nexport interface RunReasonEngineArgs {\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | undefined;\n maxOutputTokens?: number | undefined;\n stopSequences?: string[] | undefined;\n abortSignal?: AbortSignal | undefined;\n reasoning?: KortyxReasoningOptions | undefined;\n responseFormat?: KortyxResponseFormat | undefined;\n providerOptions?: Record<string, unknown> | undefined;\n tools?: KortyxToolDefinition[] | undefined;\n messages?: KortyxPromptMessage[] | undefined;\n defaultTemperature?: number | undefined;\n stream?: boolean | undefined;\n emit?: boolean | undefined;\n nodeId?: string | undefined;\n emitEvent?: ((event: string, payload: unknown) => void) | undefined;\n onTextChunk?: ((text: string) => void) | undefined;\n id?: string | undefined;\n opId?: string | undefined;\n segmentId?: string | undefined;\n telemetry?: KortyxTraceMetadata | undefined;\n reasonTrace?: ReasonTraceAdapter | undefined;\n}\n\nexport interface RunReasonEngineResult {\n text: string;\n raw?: unknown;\n usage?: KortyxUsage;\n finishReason?: KortyxFinishReason;\n toolCalls?: KortyxToolCall[];\n providerMetadata?: KortyxProviderMetadata;\n warnings?: KortyxWarning[];\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\nconst createRuntimeId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nconst emitNodeEvent = (\n emitEvent: RunReasonEngineArgs[\"emitEvent\"],\n nodeId: string | undefined,\n event: string,\n payload: Record<string, unknown>,\n): void => {\n if (!emitEvent) return;\n emitEvent(event, {\n ...payload,\n ...(typeof nodeId === \"string\" && nodeId.length > 0\n ? { node: nodeId }\n : {}),\n });\n};\n\nexport async function runReasonEngine(\n args: RunReasonEngineArgs,\n): Promise<RunReasonEngineResult> {\n const stream = args.stream ?? args.model.options?.streaming ?? true;\n const emit = args.emit ?? true;\n const temperature =\n args.temperature ??\n args.model.options?.temperature ??\n args.defaultTemperature;\n const maxOutputTokens =\n args.maxOutputTokens ?? args.model.options?.maxOutputTokens;\n const stopSequences = args.stopSequences ?? args.model.options?.stopSequences;\n const abortSignal = args.abortSignal ?? args.model.options?.abortSignal;\n const reasoning = args.reasoning ?? args.model.options?.reasoning;\n const responseFormat =\n args.responseFormat ?? args.model.options?.responseFormat;\n const providerOptions =\n args.providerOptions ?? args.model.options?.providerOptions;\n const tools = args.tools ?? args.model.options?.tools;\n\n const model = args.model.provider.getModel(args.model.modelId, {\n ...(temperature !== undefined ? { temperature } : {}),\n streaming: stream,\n ...(maxOutputTokens !== undefined ? { maxOutputTokens } : {}),\n ...(stopSequences !== undefined ? { stopSequences } : {}),\n ...(abortSignal !== undefined ? { abortSignal } : {}),\n ...(reasoning !== undefined ? { reasoning } : {}),\n ...(responseFormat !== undefined ? { responseFormat } : {}),\n ...(tools !== undefined ? { tools } : {}),\n ...(providerOptions !== undefined ? { providerOptions } : {}),\n });\n\n const messages: KortyxPromptMessage[] =\n args.messages !== undefined\n ? args.messages\n : [\n ...(typeof args.system === \"string\" && args.system.length > 0\n ? [{ role: \"system\" as const, content: args.system }]\n : []),\n { role: \"user\" as const, content: String(args.input ?? \"\") },\n ];\n\n const opId =\n typeof args.opId === \"string\" && args.opId.length > 0\n ? args.opId\n : createRuntimeId();\n const segmentId =\n typeof args.segmentId === \"string\" && args.segmentId.length > 0\n ? args.segmentId\n : createRuntimeId();\n\n const commonMeta: Record<string, unknown> = {\n ...(typeof args.id === \"string\" && args.id.length > 0\n ? { id: args.id }\n : {}),\n opId,\n segmentId,\n };\n const traceSpan = args.reasonTrace?.startSpan({\n name: \"runReasonEngine\",\n attributes: {\n ...commonMeta,\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n stream,\n emit,\n ...(args.telemetry?.operation\n ? { operation: args.telemetry.operation }\n : {}),\n ...(args.telemetry?.prompt?.name\n ? { promptName: args.telemetry.prompt.name }\n : {}),\n ...(args.telemetry?.prompt?.version !== undefined\n ? { promptVersion: args.telemetry.prompt.version }\n : {}),\n ...(args.telemetry?.prompt?.type\n ? { promptType: args.telemetry.prompt.type }\n : {}),\n ...(typeof args.nodeId === \"string\" && args.nodeId.length > 0\n ? { nodeId: args.nodeId }\n : {}),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n input: args.telemetry?.input ?? messages,\n },\n });\n\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 },\n telemetry: {\n ...(args.telemetry ?? {}),\n output: args.telemetry?.output ?? result.text,\n },\n });\n };\n\n const failTrace = (\n span: ReasonTraceSpan | undefined,\n error: unknown,\n ): void => {\n span?.fail?.(error, {\n attributes: {\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n },\n });\n };\n\n try {\n if (stream) {\n let final = \"\";\n let raw: unknown;\n let usage: KortyxUsage | undefined;\n let finishReason: KortyxFinishReason | undefined;\n let toolCalls: KortyxToolCall[] | undefined;\n let providerMetadata: KortyxProviderMetadata | undefined;\n let warnings: KortyxWarning[] | undefined;\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-start\", {\n ...commonMeta,\n });\n }\n\n const response = await model.stream(messages);\n for await (const chunk of response) {\n switch (chunk.type) {\n case \"text-delta\": {\n if (chunk.delta.length === 0) break;\n final += chunk.delta;\n args.onTextChunk?.(chunk.delta);\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: chunk.delta,\n });\n }\n break;\n }\n case \"finish\": {\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.usage !== undefined) {\n usage = chunk.usage;\n }\n if (chunk.finishReason !== undefined) {\n finishReason = chunk.finishReason;\n }\n if (chunk.toolCalls !== undefined) {\n toolCalls = chunk.toolCalls;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (chunk.warnings !== undefined) {\n warnings = chunk.warnings;\n }\n break;\n }\n case \"raw\": {\n raw = chunk.raw;\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n break;\n }\n case \"error\": {\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (chunk.warnings !== undefined) {\n warnings = chunk.warnings;\n }\n throw toError(chunk.error);\n }\n }\n }\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n const result = {\n text: final,\n ...(raw !== undefined ? { raw } : {}),\n ...(usage !== undefined ? { usage } : {}),\n ...(finishReason !== undefined ? { finishReason } : {}),\n ...(toolCalls !== undefined ? { toolCalls } : {}),\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n ...(warnings !== undefined ? { warnings } : {}),\n };\n endTrace(traceSpan, result);\n return result;\n }\n\n const response = await model.invoke(messages);\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-start\", {\n ...commonMeta,\n });\n if (response.content) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: response.content,\n });\n }\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n const result = {\n text: response.content,\n ...(response.raw !== undefined ? { raw: response.raw } : {}),\n ...(response.usage !== undefined ? { usage: response.usage } : {}),\n ...(response.finishReason !== undefined\n ? { finishReason: response.finishReason }\n : {}),\n ...(response.toolCalls !== undefined\n ? { toolCalls: response.toolCalls }\n : {}),\n ...(response.providerMetadata !== undefined\n ? { providerMetadata: response.providerMetadata }\n : {}),\n ...(response.warnings !== undefined\n ? { warnings: response.warnings }\n : {}),\n };\n endTrace(traceSpan, result);\n return result;\n } catch (error) {\n failTrace(traceSpan, error);\n throw error;\n }\n}\n","import type { InterruptInput } from \"@kortyx/core\";\nimport type { KortyxFinishReason } from \"@kortyx/providers\";\nimport type { SchemaLike } from \"../types\";\nimport { parseWithSchema } from \"../validation\";\n\nconst tryJsonParse = (\n value: string,\n):\n | { ok: true; value: unknown; error?: never }\n | { ok: false; error: string } => {\n try {\n return { ok: true, value: JSON.parse(value) };\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n};\n\nconst extractJsonCodeBlock = (value: string): string | null => {\n const match = value.match(/```(?:json)?\\s*([\\s\\S]*?)```/i);\n if (!match || typeof match[1] !== \"string\") return null;\n const inner = match[1].trim();\n return inner.length > 0 ? inner : null;\n};\n\nconst tryStringify = (value: unknown): string => {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nexport const resolveOutputCandidate = (text: string): unknown => {\n const trimmed = text.trim();\n if (!trimmed) return text;\n\n const direct = tryJsonParse(trimmed);\n if (direct.ok) return direct.value;\n\n const block = extractJsonCodeBlock(trimmed);\n if (block) {\n const parsedBlock = tryJsonParse(block);\n if (parsedBlock.ok) return parsedBlock.value;\n }\n\n return text;\n};\n\nconst looksLikeStructuredJsonAttempt = (value: string): boolean => {\n const trimmed = value.trim();\n if (!trimmed) return false;\n\n return (\n trimmed.startsWith(\"{\") ||\n trimmed.startsWith(\"[\") ||\n /^```(?:json)?/i.test(trimmed)\n );\n};\n\nconst isLikelyTruncatedStructuredOutput = (text: string): boolean => {\n const trimmed = text.trim();\n if (!looksLikeStructuredJsonAttempt(trimmed)) return false;\n\n const direct = tryJsonParse(trimmed);\n if (!direct.ok && direct.error) return true;\n\n const block = extractJsonCodeBlock(trimmed);\n if (!block) return false;\n\n const parsedBlock = tryJsonParse(block);\n return !parsedBlock.ok && Boolean(parsedBlock.error);\n};\n\nconst createTruncatedStructuredOutputError = (label: string): Error =>\n new Error(\n `${label} was truncated before producing valid structured output. The model stopped due to output length. Increase maxOutputTokens or simplify the requested output.`,\n );\n\nconst createInvalidStructuredOutputError = (label: string): Error =>\n new Error(\n `${label} did not produce valid structured output. The model returned text instead of the expected JSON payload. This often happens when output is truncated or the provider does not follow JSON mode. Increase maxOutputTokens or simplify the requested output.`,\n );\n\nexport const parseReasonOutputWithSchema = <TOutput>(args: {\n text: string;\n schema: SchemaLike<TOutput>;\n finishReason?: KortyxFinishReason;\n label: string;\n}): TOutput => {\n const candidate = resolveOutputCandidate(args.text);\n\n try {\n return parseWithSchema(args.schema, candidate, args.label);\n } catch (error) {\n if (\n args.finishReason?.unified === \"length\" ||\n isLikelyTruncatedStructuredOutput(args.text)\n ) {\n throw createTruncatedStructuredOutputError(args.label);\n }\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\n throw createInvalidStructuredOutputError(args.label);\n }\n throw error;\n }\n};\n\nexport const parseInterruptFirstPassResult = <\n TRequest extends InterruptInput = InterruptInput,\n TOutput = unknown,\n>(args: {\n text: string;\n requestSchema: SchemaLike<TRequest>;\n outputSchema?: SchemaLike<TOutput>;\n finishReason?: KortyxFinishReason;\n mode?: \"required\" | \"optional\" | undefined;\n}):\n | {\n draftText: string;\n interruptRequired: boolean;\n request: TRequest;\n output?: TOutput;\n }\n | {\n draftText: string;\n interruptRequired: false;\n request?: undefined;\n output?: TOutput;\n } => {\n const candidate = resolveOutputCandidate(args.text);\n if (!isRecord(candidate)) {\n if (\n args.finishReason?.unified === \"length\" ||\n isLikelyTruncatedStructuredOutput(args.text)\n ) {\n throw createTruncatedStructuredOutputError(\"useReason output\");\n }\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\n throw createInvalidStructuredOutputError(\"useReason output\");\n }\n throw new Error(\n \"useReason first pass with interrupt must return a JSON object.\",\n );\n }\n\n const mode = args.mode ?? \"required\";\n let interruptRequired = true;\n if (mode === \"optional\") {\n if (\n candidate.decision !== \"continue\" &&\n candidate.decision !== \"interrupt\"\n ) {\n throw new Error(\n 'useReason optional interrupt first pass must include decision \"continue\" or \"interrupt\".',\n );\n }\n interruptRequired = candidate.decision === \"interrupt\";\n\n if (!interruptRequired) {\n const hasUnexpectedRequest = [\n candidate.interruptRequest,\n candidate.request,\n candidate.interrupt,\n ].some((value) => value !== null && value !== undefined);\n\n if (hasUnexpectedRequest) {\n throw new Error(\n 'useReason optional interrupt first pass with decision \"continue\" must not include an interrupt request.',\n );\n }\n }\n }\n\n let request: TRequest | undefined;\n if (interruptRequired) {\n const requestCandidates: unknown[] = [\n candidate.interruptRequest,\n candidate.request,\n candidate.interrupt,\n mode === \"required\" ? candidate : undefined,\n ];\n const requestPayload = requestCandidates.find(\n (value) => value !== null && value !== undefined,\n );\n\n request = parseWithSchema(\n args.requestSchema,\n requestPayload,\n \"useReason interrupt.request\",\n );\n }\n\n let output: TOutput | undefined;\n if (args.outputSchema) {\n const outputPayload = Object.hasOwn(candidate, \"output\")\n ? candidate.output\n : candidate;\n try {\n output = parseWithSchema(\n args.outputSchema,\n outputPayload,\n \"useReason output\",\n );\n } catch (error) {\n if (\n args.finishReason?.unified === \"length\" ||\n isLikelyTruncatedStructuredOutput(args.text)\n ) {\n throw createTruncatedStructuredOutputError(\"useReason output\");\n }\n if (\n typeof outputPayload === \"string\" &&\n outputPayload.trim().length > 0\n ) {\n throw createInvalidStructuredOutputError(\"useReason output\");\n }\n throw error;\n }\n }\n\n const explicitDraft =\n typeof candidate.draftText === \"string\" && candidate.draftText.length > 0\n ? candidate.draftText\n : typeof candidate.text === \"string\" && candidate.text.length > 0\n ? candidate.text\n : undefined;\n\n if (!args.outputSchema && !explicitDraft) {\n throw new Error(\n \"useReason first pass with interrupt requires `draftText` when outputSchema is not provided.\",\n );\n }\n\n const draftText =\n explicitDraft ??\n (output !== undefined ? tryStringify(output) : String(args.text ?? \"\"));\n\n if (!interruptRequired) {\n return {\n draftText,\n interruptRequired: false,\n ...(output !== undefined ? { output } : {}),\n };\n }\n\n return {\n draftText,\n interruptRequired: true,\n request: request as TRequest,\n ...(output !== undefined ? { output } : {}),\n };\n};\n","import type { InterruptInput } from \"@kortyx/core\";\nimport { toJSONSchema } from \"zod\";\nimport type { SchemaLike } from \"../types\";\n\nconst tryStringify = (value: unknown): string => {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nconst tryGetSchemaHint = (schema: unknown): string | undefined => {\n try {\n const hint = toJSONSchema(schema as never);\n return JSON.stringify(hint, null, 2);\n } catch {\n return undefined;\n }\n};\n\nconst withSchemaHint = (\n input: string,\n label: string,\n schema: unknown,\n): string => {\n const hint = tryGetSchemaHint(schema);\n if (!hint) return input;\n return `${input}\\n\\n${label}:\\n${hint}`;\n};\n\nexport const defaultInterruptFirstPassInput = (args: {\n input: string;\n requestSchema: SchemaLike<unknown>;\n outputSchema?: SchemaLike<unknown>;\n mode?: \"required\" | \"optional\" | undefined;\n}): string => {\n const mode = args.mode ?? \"required\";\n const base =\n mode === \"optional\"\n ? args.outputSchema\n ? [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: decision, output, interruptRequest, draftText.\",\n '- decision must be either \"continue\" or \"interrupt\".',\n '- Use decision \"continue\" when you can produce the final output without asking the user.',\n '- Use decision \"interrupt\" only when user input is needed before finalizing.',\n \"- output must match the expected output JSON schema.\",\n '- When decision is \"interrupt\", interruptRequest must match the expected interrupt request JSON schema and must be a non-null object.',\n '- When decision is \"continue\", interruptRequest must be null.',\n \"- draftText should be a concise plain-language summary of output.\",\n ].join(\"\\n\\n\")\n : [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: decision, draftText, interruptRequest.\",\n '- decision must be either \"continue\" or \"interrupt\".',\n '- Use decision \"continue\" when you can produce the final answer without asking the user.',\n '- Use decision \"interrupt\" only when user input is needed before finalizing.',\n \"- draftText should be the current answer text.\",\n '- When decision is \"interrupt\", interruptRequest must match the expected interrupt request JSON schema and must be a non-null object.',\n '- When decision is \"continue\", interruptRequest must be null.',\n ].join(\"\\n\\n\")\n : args.outputSchema\n ? [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: output, interruptRequest, draftText.\",\n \"- output must match the expected output JSON schema.\",\n \"- interruptRequest must match the expected interrupt request JSON schema.\",\n \"- interruptRequest must be a non-null object.\",\n \"- draftText should be a concise plain-language summary of output.\",\n \"- If uncertain, still return a valid interruptRequest with safe default options.\",\n ].join(\"\\n\\n\")\n : [\n args.input,\n \"Output rules:\",\n \"- Return JSON only. No markdown fences.\",\n \"- Return an object with keys: draftText, interruptRequest.\",\n \"- draftText should be the current draft answer text.\",\n \"- interruptRequest must match the expected interrupt request JSON schema.\",\n \"- interruptRequest must be a non-null object.\",\n \"- If uncertain, still return a valid interruptRequest with safe default options.\",\n ].join(\"\\n\\n\");\n\n const withInterruptSchema = withSchemaHint(\n base,\n \"Expected interrupt request JSON schema (for `interruptRequest`)\",\n args.requestSchema,\n );\n\n if (!args.outputSchema) return withInterruptSchema;\n const withOutputSchema = withSchemaHint(\n withInterruptSchema,\n \"Expected output JSON schema (for `output`)\",\n args.outputSchema,\n );\n return [\n withOutputSchema,\n \"JSON template:\",\n mode === \"optional\"\n ? '{ \"decision\": \"continue\", \"output\": { ... }, \"interruptRequest\": null, \"draftText\": \"...\" }'\n : '{ \"output\": { ... }, \"interruptRequest\": { ... }, \"draftText\": \"...\" }',\n ].join(\"\\n\\n\");\n};\n\nexport const defaultContinuationInput = (args: {\n input: string;\n draftText: string;\n draftOutput?: unknown;\n request: InterruptInput;\n response: unknown;\n}): string =>\n [\n \"You are continuing a paused reasoning task after user input.\",\n \"Update the previous result using the user response and return the final answer only.\",\n \"If the previous output was JSON, return JSON in the same schema.\",\n \"\",\n `Original request:\\n${args.input}`,\n `Draft answer text:\\n${args.draftText}`,\n `Draft output object:\\n${tryStringify(args.draftOutput ?? args.draftText)}`,\n `Interrupt request shown to user:\\n${tryStringify(args.request)}`,\n `User response:\\n${tryStringify(args.response)}`,\n ].join(\"\\n\\n\");\n\nexport const withOutputGuardrails = (\n input: string,\n schema?: SchemaLike<unknown>,\n): string => {\n const base = [\n input,\n \"Output rules:\",\n \"- Return only JSON, no markdown fences.\",\n \"- Ensure the response conforms to the expected output schema.\",\n \"- Do not include explanatory text outside the JSON object.\",\n ].join(\"\\n\\n\");\n return withSchemaHint(base, \"Expected output JSON schema\", schema);\n};\n\nexport const withStructuredStreamHints = (\n input: string,\n args: {\n setFieldPaths?: string[];\n appendFieldPaths?: string[];\n textDeltaFieldPaths?: string[];\n },\n): string => {\n const rules: string[] = [];\n\n for (const path of args.setFieldPaths ?? []) {\n rules.push(\n `- For the field path pattern \\`${path}\\`, write one stable final value and do not rewrite it after it is complete.`,\n );\n }\n\n for (const path of args.appendFieldPaths ?? []) {\n rules.push(\n `- For the array field path pattern \\`${path}\\`, write items in final order and finish each item before starting the next.`,\n );\n rules.push(\n `- Once an item in \\`${path}\\` is complete, do not rewrite or reorder earlier items.`,\n );\n }\n\n for (const path of args.textDeltaFieldPaths ?? []) {\n rules.push(\n `- For the string field path pattern \\`${path}\\`, write the value progressively by appending text to the end.`,\n );\n rules.push(\n `- Do not rewrite or replace the earlier prefix of \\`${path}\\` once emitted.`,\n );\n }\n\n if (rules.length === 0) return input;\n\n return [\n input,\n \"Streaming rules:\",\n ...rules,\n \"- Keep the overall response as valid JSON.\",\n ].join(\"\\n\\n\");\n};\n","import type {\n KortyxFinishReason,\n KortyxProviderMetadata,\n KortyxUsage,\n KortyxWarning,\n} from \"@kortyx/providers\";\nimport { emitStructuredData, shouldEmitStructured } from \"../structured\";\nimport type { UseReasonArgs } from \"../types\";\n\nexport const mergeUsage = (\n left: KortyxUsage | undefined,\n right: KortyxUsage | undefined,\n): KortyxUsage | undefined => {\n if (!left) return right;\n if (!right) return left;\n\n const sum = (\n a: number | undefined,\n b: number | undefined,\n ): number | undefined =>\n a === undefined && b === undefined ? undefined : (a ?? 0) + (b ?? 0);\n\n const raw =\n left.raw || right.raw\n ? {\n ...(left.raw ?? {}),\n ...(right.raw ?? {}),\n }\n : undefined;\n const input = sum(left.input, right.input);\n const output = sum(left.output, right.output);\n const total = sum(left.total, right.total);\n const reasoning = sum(left.reasoning, right.reasoning);\n const cacheRead = sum(left.cacheRead, right.cacheRead);\n const cacheWrite = sum(left.cacheWrite, right.cacheWrite);\n const merged: KortyxUsage = {};\n\n if (input !== undefined) merged.input = input;\n if (output !== undefined) merged.output = output;\n if (total !== undefined) merged.total = total;\n if (reasoning !== undefined) merged.reasoning = reasoning;\n if (cacheRead !== undefined) merged.cacheRead = cacheRead;\n if (cacheWrite !== undefined) merged.cacheWrite = cacheWrite;\n if (raw) merged.raw = raw;\n\n return merged;\n};\n\nexport const mergeWarnings = (\n left: KortyxWarning[] | undefined,\n right: KortyxWarning[] | undefined,\n): KortyxWarning[] | undefined => {\n if (!left?.length) return right;\n if (!right?.length) return left;\n\n const seen = new Set<string>();\n const merged: KortyxWarning[] = [];\n for (const warning of [...left, ...right]) {\n const key = JSON.stringify(warning);\n if (seen.has(key)) continue;\n seen.add(key);\n merged.push(warning);\n }\n return merged;\n};\n\nexport const mergeProviderMetadata = (\n left: KortyxProviderMetadata | undefined,\n right: KortyxProviderMetadata | undefined,\n): KortyxProviderMetadata | undefined => {\n if (!left) return right;\n if (!right) return left;\n return {\n ...left,\n ...right,\n };\n};\n\nexport const emitReasonStructuredOutput = <TOutput>(args: {\n id?: string;\n opId: string;\n output: TOutput;\n structured: UseReasonArgs<TOutput>[\"structured\"];\n emit: boolean;\n}): void => {\n if (!args.emit || !shouldEmitStructured(args.structured)) return;\n\n emitStructuredData<TOutput>({\n dataType: args.structured?.dataType ?? \"reason-output\",\n data: args.output,\n kind: \"final\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(args.id ? { id: args.id } : {}),\n streamId: args.opId,\n });\n};\n\nexport type ReasonResultAggregation = {\n usage?: KortyxUsage | undefined;\n finishReason?: KortyxFinishReason | undefined;\n providerMetadata?: KortyxProviderMetadata | undefined;\n warnings?: KortyxWarning[] | undefined;\n};\n","import { assertStructuredPath, parseStructuredPath } from \"../structured-path\";\nimport type { UseReasonStructuredConfig } from \"../types\";\n\nexport const resolveAppendFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const appendPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"append\")\n .map(([path]) => path);\n\n for (const path of appendPaths) {\n assertStructuredPath(path, \"useReason structured append\");\n }\n\n return appendPaths;\n};\n\nexport const resolveSetFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const setPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"set\")\n .map(([path]) => path);\n\n for (const path of setPaths) {\n assertStructuredPath(path, \"useReason structured set\");\n }\n\n return setPaths;\n};\n\nexport const resolveTextDeltaFieldPaths = (\n cfg: UseReasonStructuredConfig | undefined,\n): string[] => {\n const fields = cfg?.fields;\n if (!fields) return [];\n\n const textPaths = Object.entries(fields)\n .filter(([, mode]) => mode === \"text-delta\")\n .map(([path]) => path);\n\n for (const path of textPaths) {\n assertStructuredPath(path, \"useReason structured text-delta\");\n }\n\n return textPaths;\n};\n\nconst extractCompletedStringValueAt = (args: {\n text: string;\n start: number;\n}): { complete: boolean; value?: string } => {\n let value = \"\";\n\n for (let i = args.start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (ch === '\"') {\n return {\n complete: true,\n value,\n };\n }\n\n if (ch !== \"\\\\\") {\n value += ch;\n continue;\n }\n\n const next = args.text[i + 1];\n if (!next) {\n return {\n complete: false,\n };\n }\n\n if (\n next === '\"' ||\n next === \"\\\\\" ||\n next === \"/\" ||\n next === \"b\" ||\n next === \"f\" ||\n next === \"n\" ||\n next === \"r\" ||\n next === \"t\"\n ) {\n value +=\n next === \"b\"\n ? \"\\b\"\n : next === \"f\"\n ? \"\\f\"\n : next === \"n\"\n ? \"\\n\"\n : next === \"r\"\n ? \"\\r\"\n : next === \"t\"\n ? \"\\t\"\n : next;\n i += 1;\n continue;\n }\n\n if (next === \"u\") {\n const hex = args.text.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n return {\n complete: false,\n };\n }\n value += String.fromCharCode(Number.parseInt(hex, 16));\n i += 5;\n continue;\n }\n\n return {\n complete: false,\n };\n }\n\n return {\n complete: false,\n };\n};\n\nconst skipWhitespace = (text: string, start: number): number => {\n let i = start;\n while (i < text.length && /\\s/.test(text[i] ?? \"\")) i += 1;\n return i;\n};\n\nconst pathSegmentMatches = (patternPart: string, actualPart: string): boolean =>\n patternPart === \"*\" || patternPart === actualPart;\n\nconst pathMatchesPattern = (\n actualParts: string[],\n patternParts: string[],\n): boolean =>\n actualParts.length === patternParts.length &&\n actualParts.every((part, index) =>\n pathSegmentMatches(patternParts[index] ?? \"\", part),\n );\n\nconst isPathPrefix = (prefix: string[], full: string[]): boolean =>\n prefix.length <= full.length &&\n prefix.every((part, index) => pathSegmentMatches(full[index] ?? \"\", part));\n\nconst parseStringToken = (\n text: string,\n start: number,\n): { complete: boolean; end?: number; value?: string } => {\n if (text[start] !== '\"') return { complete: false };\n\n const parsed = extractCompletedStringValueAt({ text, start: start + 1 });\n if (!parsed.complete || parsed.value === undefined)\n return { complete: false };\n\n let inEscape = false;\n for (let i = start + 1; i < text.length; i += 1) {\n const ch = text[i];\n if (ch === undefined) break;\n\n if (inEscape) {\n inEscape = false;\n if (ch === \"u\") i += 4;\n continue;\n }\n\n if (ch === \"\\\\\") {\n inEscape = true;\n continue;\n }\n\n if (ch === '\"') {\n return {\n complete: true,\n end: i + 1,\n value: parsed.value,\n };\n }\n }\n\n return { complete: false };\n};\n\nconst skipNestedValue = (\n text: string,\n start: number,\n): { complete: boolean; end?: number } => {\n const opener = text[start];\n const closer = opener === \"{\" ? \"}\" : \"]\";\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n\n for (let i = start; i < text.length; i += 1) {\n const ch = text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === opener) {\n nesting += 1;\n continue;\n }\n\n if (ch === closer) {\n nesting -= 1;\n if (nesting === 0) {\n return { complete: true, end: i + 1 };\n }\n }\n }\n\n return { complete: false };\n};\n\nconst skipCompleteValue = (\n text: string,\n start: number,\n): { complete: boolean; end?: number } => {\n const i = skipWhitespace(text, start);\n const first = text[i];\n if (!first) return { complete: false };\n\n if (first === '\"') {\n const parsed = parseStringToken(text, i);\n return parsed.complete && parsed.end !== undefined\n ? { complete: true, end: parsed.end }\n : { complete: false };\n }\n\n if (first === \"{\" || first === \"[\") {\n return skipNestedValue(text, i);\n }\n\n for (let j = i; j < text.length; j += 1) {\n const ch = text[j];\n if (ch !== \",\" && ch !== \"}\" && ch !== \"]\") continue;\n\n const raw = text.slice(i, j).trim();\n if (!raw) return { complete: false };\n\n try {\n JSON.parse(raw);\n return { complete: true, end: j };\n } catch {\n return { complete: false };\n }\n }\n\n return { complete: false };\n};\n\nconst locateValueStart = (args: {\n text: string;\n path: string;\n}): { found: boolean; start?: number } => {\n const [first] = locateValueStarts(args);\n return first\n ? {\n found: true,\n start: first.start,\n }\n : {\n found: false,\n };\n};\n\nconst locateValueStarts = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; start: number }> => {\n const targetParts = parseStructuredPath(\n args.path,\n \"useReason structured field\",\n );\n const matches: Array<{ path: string; start: number }> = [];\n\n const visitValue = (start: number, currentParts: string[]): void => {\n const valueStart = skipWhitespace(args.text, start);\n if (pathMatchesPattern(currentParts, targetParts)) {\n matches.push({\n path: currentParts.join(\".\"),\n start: valueStart,\n });\n return;\n }\n\n if (!isPathPrefix(currentParts, targetParts)) {\n return;\n }\n\n const first = args.text[valueStart];\n if (first === \"{\") visitObject(valueStart + 1, currentParts);\n if (first === \"[\") visitArray(valueStart + 1, currentParts);\n };\n\n const visitObject = (start: number, currentParts: string[]): void => {\n let i = skipWhitespace(args.text, start);\n\n while (i < args.text.length) {\n const ch = args.text[i];\n if (ch === \"}\") return;\n if (ch === \",\") {\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (ch !== '\"') return;\n\n const key = parseStringToken(args.text, i);\n if (!key.complete || key.end === undefined || key.value === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, key.end);\n if (args.text[i] !== \":\") return;\n\n const valueStart = skipWhitespace(args.text, i + 1);\n const childParts = [...currentParts, key.value];\n if (pathMatchesPattern(childParts, targetParts)) {\n matches.push({\n path: childParts.join(\".\"),\n start: valueStart,\n });\n } else if (isPathPrefix(childParts, targetParts)) {\n visitValue(valueStart, childParts);\n }\n\n const skipped = skipCompleteValue(args.text, valueStart);\n if (!skipped.complete || skipped.end === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, skipped.end);\n if (args.text[i] === \",\") {\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (args.text[i] === \"}\") return;\n return;\n }\n };\n\n const visitArray = (start: number, currentParts: string[]): void => {\n let i = skipWhitespace(args.text, start);\n let index = 0;\n\n while (i < args.text.length) {\n if (args.text[i] === \"]\") return;\n\n const childParts = [...currentParts, String(index)];\n if (pathMatchesPattern(childParts, targetParts)) {\n matches.push({\n path: childParts.join(\".\"),\n start: i,\n });\n } else if (isPathPrefix(childParts, targetParts)) {\n visitValue(i, childParts);\n }\n\n const skipped = skipCompleteValue(args.text, i);\n if (!skipped.complete || skipped.end === undefined) {\n return;\n }\n\n i = skipWhitespace(args.text, skipped.end);\n if (args.text[i] === \",\") {\n index += 1;\n i = skipWhitespace(args.text, i + 1);\n continue;\n }\n if (args.text[i] === \"]\") return;\n return;\n }\n };\n\n visitValue(0, []);\n return matches;\n};\n\nconst extractCompletedValueAt = (args: {\n text: string;\n start: number;\n}): { complete: boolean; value?: unknown } => {\n const start = skipWhitespace(args.text, args.start);\n const first = args.text[start];\n if (!first) return { complete: false };\n\n if (first === '\"') {\n const parsed = extractCompletedStringValueAt({\n text: args.text,\n start: start + 1,\n });\n return parsed.complete\n ? {\n complete: true,\n value: parsed.value,\n }\n : {\n complete: false,\n };\n }\n\n if (first === \"{\") {\n return extractCompletedNestedValueAt({\n text: args.text,\n start,\n opener: \"{\",\n closer: \"}\",\n });\n }\n\n if (first === \"[\") {\n return extractCompletedNestedValueAt({\n text: args.text,\n start,\n opener: \"[\",\n closer: \"]\",\n });\n }\n\n for (let i = start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n if (ch !== \",\" && ch !== \"}\" && ch !== \"]\") continue;\n\n const raw = args.text.slice(start, i).trim();\n if (!raw) return { complete: false };\n\n try {\n return {\n complete: true,\n value: JSON.parse(raw),\n };\n } catch {\n return { complete: false };\n }\n }\n\n return { complete: false };\n};\n\nconst extractCompletedNestedValueAt = (args: {\n text: string;\n start: number;\n opener: \"{\" | \"[\";\n closer: \"}\" | \"]\";\n}): { complete: boolean; value?: unknown } => {\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n\n for (let i = args.start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === args.opener) {\n nesting += 1;\n continue;\n }\n\n if (ch === args.closer) {\n nesting -= 1;\n if (nesting === 0) {\n const raw = args.text.slice(args.start, i + 1);\n try {\n return {\n complete: true,\n value: JSON.parse(raw),\n };\n } catch {\n return {\n complete: false,\n };\n }\n }\n }\n }\n\n return {\n complete: false,\n };\n};\n\nexport const extractCompletedFieldValue = (args: {\n text: string;\n path: string;\n}): { found: boolean; complete: boolean; value?: unknown } => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) {\n return {\n found: located.found,\n complete: false,\n };\n }\n\n const parsed = extractCompletedValueAt({\n text: args.text,\n start: located.start,\n });\n return parsed.complete\n ? {\n found: true,\n complete: true,\n value: parsed.value,\n }\n : {\n found: true,\n complete: false,\n };\n};\n\nexport const extractCompletedFieldValues = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; value: unknown }> => {\n const located = locateValueStarts(args);\n const values: Array<{ path: string; value: unknown }> = [];\n\n for (const match of located) {\n const parsed = extractCompletedValueAt({\n text: args.text,\n start: match.start,\n });\n if (!parsed.complete) continue;\n\n values.push({\n path: match.path,\n value: parsed.value,\n });\n }\n\n return values;\n};\n\nexport const extractCompletedArrayItems = (args: {\n text: string;\n path: string;\n}): unknown[] => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) return [];\n\n const arrayStart = skipWhitespace(args.text, located.start);\n if (args.text[arrayStart] !== \"[\") return [];\n const start = arrayStart + 1;\n\n const items: unknown[] = [];\n let inString = false;\n let isEscaped = false;\n let nesting = 0;\n let itemStart = -1;\n\n for (let i = start; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n if (itemStart < 0) itemStart = i;\n continue;\n }\n\n if (itemStart < 0) {\n if (/\\s/.test(ch) || ch === \",\") continue;\n if (ch === \"]\") break;\n itemStart = i;\n if (ch === \"{\" || ch === \"[\") {\n nesting = 1;\n } else {\n nesting = 0;\n }\n continue;\n }\n\n if (ch === \"{\" || ch === \"[\") {\n nesting += 1;\n continue;\n }\n\n if (ch === \"}\" || ch === \"]\") {\n if (nesting > 0) {\n nesting -= 1;\n continue;\n }\n }\n\n if (nesting === 0 && (ch === \",\" || ch === \"]\")) {\n const raw = args.text.slice(itemStart, i).trim();\n if (raw) {\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n itemStart = -1;\n if (ch === \"]\") break;\n }\n }\n\n return items;\n};\n\nexport const extractCompletedArrayItemGroups = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; items: unknown[] }> => {\n return locateValueStarts(args).flatMap((match) => {\n const items = extractCompletedArrayItems({\n text: args.text,\n path: match.path,\n });\n return items.length > 0\n ? [\n {\n path: match.path,\n items,\n },\n ]\n : [];\n });\n};\n\nexport const extractStreamingStringValue = (args: {\n text: string;\n path: string;\n}): { found: boolean; complete: boolean; value: string } => {\n const located = locateValueStart(args);\n if (!located.found || located.start === undefined) {\n return {\n found: located.found,\n complete: false,\n value: \"\",\n };\n }\n\n const stringStart = skipWhitespace(args.text, located.start);\n if (args.text[stringStart] !== '\"') {\n return {\n found: true,\n complete: false,\n value: \"\",\n };\n }\n\n let value = \"\";\n\n for (let i = stringStart + 1; i < args.text.length; i += 1) {\n const ch = args.text[i];\n if (ch === undefined) break;\n\n if (ch === '\"') {\n return {\n found: true,\n complete: true,\n value,\n };\n }\n\n if (ch !== \"\\\\\") {\n value += ch;\n continue;\n }\n\n const next = args.text[i + 1];\n if (!next) {\n return {\n found: true,\n complete: false,\n value,\n };\n }\n\n if (\n next === '\"' ||\n next === \"\\\\\" ||\n next === \"/\" ||\n next === \"b\" ||\n next === \"f\" ||\n next === \"n\" ||\n next === \"r\" ||\n next === \"t\"\n ) {\n value +=\n next === \"b\"\n ? \"\\b\"\n : next === \"f\"\n ? \"\\f\"\n : next === \"n\"\n ? \"\\n\"\n : next === \"r\"\n ? \"\\r\"\n : next === \"t\"\n ? \"\\t\"\n : next;\n i += 1;\n continue;\n }\n\n if (next === \"u\") {\n const hex = args.text.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n return {\n found: true,\n complete: false,\n value,\n };\n }\n value += String.fromCharCode(Number.parseInt(hex, 16));\n i += 5;\n continue;\n }\n\n return {\n found: true,\n complete: false,\n value,\n };\n }\n\n return {\n found: true,\n complete: false,\n value,\n };\n};\n\nexport const extractStreamingStringValues = (args: {\n text: string;\n path: string;\n}): Array<{ path: string; complete: boolean; value: string }> => {\n return locateValueStarts(args).flatMap((match) => {\n const current = extractStreamingStringValue({\n text: args.text,\n path: match.path,\n });\n return current.found\n ? [\n {\n path: match.path,\n complete: current.complete,\n value: current.value,\n },\n ]\n : [];\n });\n};\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport type {\n KortyxExecutableTool,\n KortyxFinishReason,\n KortyxPromptMessage,\n KortyxProviderMetadata,\n KortyxToolCall,\n KortyxToolDefinition,\n KortyxToolResult,\n KortyxUsage,\n KortyxWarning,\n} from \"@kortyx/providers\";\nimport { getHookContext } from \"../context\";\nimport { awaitInterruptInternal } from \"../interrupt\";\nimport type { ReasonTraceSpan } from \"../tracing\";\nimport type { UseReasonArgs, UseReasonResult, UseReasonStep } from \"../types\";\nimport { reasonEngine } from \"./engine\";\nimport { parseReasonOutputWithSchema } from \"./parsing\";\nimport {\n emitReasonStructuredOutput,\n mergeProviderMetadata,\n mergeUsage,\n mergeWarnings,\n} from \"./result\";\n\nconst toErrorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst toToolDefinitions = (\n tools: KortyxExecutableTool[],\n): KortyxToolDefinition[] =>\n tools.map((tool) => ({\n name: tool.name,\n ...(tool.title ? { title: tool.title } : {}),\n ...(tool.description ? { description: tool.description } : {}),\n inputSchema: tool.inputSchema,\n ...(tool.outputSchema !== undefined\n ? { outputSchema: tool.outputSchema }\n : {}),\n ...(tool.annotations !== undefined\n ? { annotations: tool.annotations }\n : {}),\n ...(tool.metadata !== undefined ? { metadata: tool.metadata } : {}),\n }));\n\nconst resolveToolExecutionBoolean = (\n value: boolean | Record<string, boolean> | undefined,\n toolName: string,\n fallback: boolean,\n): boolean => {\n if (typeof value === \"boolean\") return value;\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value[toolName] ?? fallback;\n }\n return fallback;\n};\n\nconst normalizeToolResult = (\n toolCall: KortyxToolCall,\n value: KortyxToolResult | unknown,\n): KortyxToolResult => {\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n \"toolCallId\" in value &&\n \"name\" in value &&\n \"content\" in value\n ) {\n return value as KortyxToolResult;\n }\n\n let content: string;\n try {\n content = typeof value === \"string\" ? value : JSON.stringify(value);\n } catch {\n content = String(value);\n }\n\n return {\n toolCallId: toolCall.id,\n name: toolCall.name,\n content,\n ...(value !== undefined &&\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ? { structuredContent: value }\n : {}),\n };\n};\n\nconst closeOwnedTools = async (\n tools: KortyxExecutableTool[],\n): Promise<void> => {\n const closeFns = new Set<NonNullable<KortyxExecutableTool[\"close\"]>>();\n for (const tool of tools) {\n if (tool.closeAfterUse === false || !tool.close) continue;\n closeFns.add(tool.close);\n }\n\n await Promise.all(\n [...closeFns].map(async (close) => {\n await close();\n }),\n );\n};\n\nconst createInitialMessages = (args: {\n system?: string | undefined;\n input: string;\n}): KortyxPromptMessage[] => [\n ...(typeof args.system === \"string\" && args.system.length > 0\n ? [{ role: \"system\" as const, content: args.system }]\n : []),\n { role: \"user\" as const, content: String(args.input ?? \"\") },\n];\n\nexport const runReasonToolLoop = async <\n TOutput,\n TRequest extends InterruptInput,\n TResponse = InterruptResult,\n>(args: {\n useReasonArgs: UseReasonArgs<TOutput, TRequest, TResponse>;\n id?: string | undefined;\n opId: string;\n traceSpan?: ReasonTraceSpan | undefined;\n}): Promise<UseReasonResult<TOutput, TResponse>> => {\n const { useReasonArgs, id, opId, traceSpan } = args;\n const ctx = getHookContext();\n const tools = useReasonArgs.tools ?? [];\n const toolByName = new Map<string, KortyxExecutableTool>();\n let validationCompleted = false;\n\n try {\n for (const tool of tools) {\n if (toolByName.has(tool.name)) {\n throw new Error(\n `useReason received duplicate tool name \"${tool.name}\".`,\n );\n }\n toolByName.set(tool.name, tool);\n }\n\n if (useReasonArgs.interrupt) {\n throw new Error(\n \"useReason tools cannot be combined with useReason interrupt mode yet. Use toolExecution.approval for tool approval.\",\n );\n }\n\n validationCompleted = true;\n } finally {\n if (!validationCompleted) {\n await closeOwnedTools(tools);\n }\n }\n\n const toolDefinitions = toToolDefinitions(tools);\n const maxSteps = Math.max(1, useReasonArgs.toolExecution?.maxSteps ?? 3);\n const messages = createInitialMessages({\n system: useReasonArgs.system,\n input: useReasonArgs.input,\n });\n const steps: UseReasonStep[] = [];\n const allToolCalls: KortyxToolCall[] = [];\n const allToolResults: KortyxToolResult[] = [];\n let finalText = \"\";\n let finalRaw: unknown;\n let finalOutput: TOutput | undefined;\n let aggregatedUsage: KortyxUsage | undefined;\n let finalFinishReason: KortyxFinishReason | undefined;\n let aggregatedProviderMetadata: KortyxProviderMetadata | undefined;\n let aggregatedWarnings: KortyxWarning[] | undefined;\n\n const emitToolEvent = (\n event: string,\n payload: Record<string, unknown>,\n ): void => {\n ctx.node.emit(event, {\n ...payload,\n node: ctx.node.graph.node,\n ...(id ? { id } : {}),\n opId,\n });\n };\n\n try {\n for (let stepIndex = 0; stepIndex < maxSteps; stepIndex += 1) {\n traceSpan?.addEvent?.(\"useReason.tool-step.start\", {\n stepIndex,\n toolCount: toolDefinitions.length,\n });\n\n const step = await reasonEngine(\n {\n ...useReasonArgs,\n tools: toolDefinitions,\n messages,\n emit: false,\n stream: false,\n },\n { ...(id ? { id } : {}), opId },\n );\n\n finalText = step.text;\n finalRaw = step.raw;\n aggregatedUsage = mergeUsage(aggregatedUsage, step.usage);\n finalFinishReason = step.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n step.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, step.warnings);\n\n const toolCalls = step.toolCalls ?? [];\n const toolResults: KortyxToolResult[] = [];\n steps.push({\n stepIndex,\n text: step.text,\n toolCalls,\n toolResults,\n ...(step.usage ? { usage: step.usage } : {}),\n ...(step.finishReason ? { finishReason: step.finishReason } : {}),\n ...(step.providerMetadata\n ? { providerMetadata: step.providerMetadata }\n : {}),\n ...(step.warnings ? { warnings: step.warnings } : {}),\n });\n\n if (toolCalls.length === 0) {\n if ((useReasonArgs.emit ?? true) && step.text.length > 0) {\n emitToolEvent(\"text-start\", {});\n emitToolEvent(\"text-delta\", { delta: step.text });\n emitToolEvent(\"text-end\", {});\n }\n break;\n }\n\n allToolCalls.push(...toolCalls);\n messages.push({\n role: \"assistant\",\n content: step.text,\n toolCalls,\n });\n\n for (const toolCall of toolCalls) {\n const tool = toolByName.get(toolCall.name);\n if (!tool) {\n throw new Error(\n `Model requested unknown tool \"${toolCall.name}\" from useReason.`,\n );\n }\n\n const shouldEmitTool = resolveToolExecutionBoolean(\n useReasonArgs.toolExecution?.emit,\n tool.name,\n false,\n );\n const shouldApproveTool = resolveToolExecutionBoolean(\n useReasonArgs.toolExecution?.approval,\n tool.name,\n false,\n );\n\n if (shouldEmitTool) {\n emitToolEvent(\"tool-call-start\", {\n tool: tool.name,\n toolCallId: toolCall.id,\n input: toolCall.input,\n });\n }\n\n if (shouldApproveTool) {\n const approval = await awaitInterruptInternal({\n id: `tool:${toolCall.id}`,\n request: {\n kind: \"choice\",\n question: `Approve ${tool.name}?`,\n options: [\n { id: \"approve\", label: \"Approve\" },\n { id: \"deny\", label: \"Deny\" },\n ],\n meta: {\n tool: tool.name,\n toolCallId: toolCall.id,\n input: toolCall.input,\n },\n },\n });\n\n const approved = Array.isArray(approval)\n ? approval.includes(\"approve\")\n : approval === \"approve\";\n\n if (!approved) {\n const denied = {\n toolCallId: toolCall.id,\n name: tool.name,\n content: \"Tool call denied by user.\",\n isError: true,\n } satisfies KortyxToolResult;\n toolResults.push(denied);\n allToolResults.push(denied);\n if (shouldEmitTool) {\n emitToolEvent(\"tool-call-result\", {\n tool: tool.name,\n toolCallId: toolCall.id,\n content: denied.content,\n isError: true,\n });\n }\n continue;\n }\n }\n\n try {\n const rawResult = await tool.execute(toolCall.input, {\n toolCallId: toolCall.id,\n ...(useReasonArgs.abortSignal\n ? { abortSignal: useReasonArgs.abortSignal }\n : {}),\n });\n const result = normalizeToolResult(toolCall, rawResult);\n toolResults.push(result);\n allToolResults.push(result);\n if (shouldEmitTool) {\n emitToolEvent(\"tool-call-result\", {\n tool: result.name,\n toolCallId: result.toolCallId,\n content: result.content,\n ...(result.structuredContent !== undefined\n ? { structuredContent: result.structuredContent }\n : {}),\n ...(result.isError !== undefined\n ? { isError: result.isError }\n : {}),\n });\n }\n traceSpan?.addEvent?.(\"useReason.tool-call.complete\", {\n stepIndex,\n tool: result.name,\n toolCallId: result.toolCallId,\n isError: Boolean(result.isError),\n });\n } catch (error) {\n const result = {\n toolCallId: toolCall.id,\n name: tool.name,\n content: toErrorMessage(error),\n isError: true,\n } satisfies KortyxToolResult;\n toolResults.push(result);\n allToolResults.push(result);\n if (shouldEmitTool) {\n emitToolEvent(\"tool-call-error\", {\n tool: tool.name,\n toolCallId: toolCall.id,\n message: result.content,\n });\n }\n traceSpan?.addEvent?.(\"useReason.tool-call.error\", {\n stepIndex,\n tool: tool.name,\n toolCallId: toolCall.id,\n message: result.content,\n });\n }\n }\n\n const currentStep = steps[steps.length - 1];\n if (currentStep) {\n steps[steps.length - 1] = {\n ...currentStep,\n toolResults,\n };\n }\n\n for (const result of toolResults) {\n messages.push({\n role: \"tool\",\n content: result.content,\n toolCallId: result.toolCallId,\n name: result.name,\n ...(result.structuredContent !== undefined\n ? { structuredContent: result.structuredContent }\n : {}),\n ...(result.isError !== undefined ? { isError: result.isError } : {}),\n ...(result.raw !== undefined ? { raw: result.raw } : {}),\n });\n }\n }\n\n if (steps.length >= maxSteps && steps.at(-1)?.toolCalls.length) {\n throw new Error(\n `useReason tool loop reached maxSteps (${maxSteps}) before producing a final response.`,\n );\n }\n\n if (useReasonArgs.outputSchema) {\n finalOutput = parseReasonOutputWithSchema({\n text: finalText,\n schema: useReasonArgs.outputSchema,\n ...(finalFinishReason ? { finishReason: finalFinishReason } : {}),\n label: \"useReason output\",\n });\n }\n\n if (finalOutput !== undefined) {\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: finalOutput,\n structured: useReasonArgs.structured,\n emit: useReasonArgs.emit ?? true,\n });\n }\n\n const result = {\n ...(id ? { id } : {}),\n opId,\n text: finalText,\n ...(finalRaw !== undefined ? { raw: finalRaw } : {}),\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n ...(finalOutput !== undefined ? { output: finalOutput } : {}),\n toolCalls: allToolCalls,\n toolResults: allToolResults,\n steps,\n } satisfies UseReasonResult<TOutput, TResponse>;\n\n traceSpan?.end?.({\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n attributes: {\n textLength: finalText.length,\n toolCallCount: allToolCalls.length,\n toolResultCount: allToolResults.length,\n toolStepCount: steps.length,\n },\n telemetry: {\n ...(useReasonArgs.telemetry ?? {}),\n output: useReasonArgs.telemetry?.output ?? finalOutput ?? finalText,\n },\n });\n\n return result;\n } catch (error) {\n traceSpan?.fail?.(error, {\n attributes: {\n toolStepCount: steps.length,\n toolCallCount: allToolCalls.length,\n },\n });\n throw error;\n } finally {\n await closeOwnedTools(tools);\n }\n};\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport type {\n KortyxFinishReason,\n KortyxProviderMetadata,\n KortyxUsage,\n KortyxWarning,\n} from \"@kortyx/providers\";\nimport {\n accumulateTokenUsage,\n getHookContext,\n getReasonTraceAdapter,\n} from \"../context\";\nimport { awaitInterruptInternal } from \"../interrupt\";\nimport { emitStructuredData, shouldStreamStructured } from \"../structured\";\nimport type { ReasonTraceSpan } from \"../tracing\";\nimport type { SchemaLike, UseReasonArgs, UseReasonResult } from \"../types\";\nimport { parseWithSchema } from \"../validation\";\nimport {\n type ReasonInterruptCheckpoint,\n readReasonCheckpoint,\n readReasonCompletedCheckpoint,\n resolveHookStatePatch,\n resolveReasonCheckpointKey,\n} from \"./checkpoint\";\nimport { createRuntimeId, reasonEngine } from \"./engine\";\nimport {\n parseInterruptFirstPassResult,\n parseReasonOutputWithSchema,\n} from \"./parsing\";\nimport {\n defaultContinuationInput,\n defaultInterruptFirstPassInput,\n withOutputGuardrails,\n withStructuredStreamHints,\n} from \"./prompting\";\nimport {\n emitReasonStructuredOutput,\n mergeProviderMetadata,\n mergeUsage,\n mergeWarnings,\n} from \"./result\";\nimport {\n extractCompletedArrayItemGroups,\n extractCompletedFieldValues,\n extractStreamingStringValues,\n resolveAppendFieldPaths,\n resolveSetFieldPaths,\n resolveTextDeltaFieldPaths,\n} from \"./structured-stream\";\nimport { runReasonToolLoop } from \"./tools\";\n\nconst shouldStreamReasonStructured = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): boolean => (args.emit ?? true) && shouldStreamStructured(args.structured);\n\nconst resolveEffectiveReasoningIncludeThoughts = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): boolean =>\n args.reasoning?.includeThoughts ??\n args.model.options?.reasoning?.includeThoughts ??\n false;\n\nconst resolveEffectiveResponseFormatType = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): \"text\" | \"json\" | undefined =>\n args.responseFormat?.type ?? args.model.options?.responseFormat?.type;\n\nconst assertReasoningThoughtsCompatibility = <\n TOutput,\n TRequest extends InterruptInput,\n TResponse,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): void => {\n if (!resolveEffectiveReasoningIncludeThoughts(args)) return;\n\n const usesStructuredOutput =\n Boolean(args.outputSchema) ||\n Boolean(args.interrupt) ||\n Boolean(args.structured) ||\n resolveEffectiveResponseFormatType(args) === \"json\";\n\n if (!usesStructuredOutput) return;\n\n throw new Error(\n \"useReason does not support reasoning.includeThoughts with structured output, interrupt mode, or JSON responseFormat. Disable includeThoughts for this call.\",\n );\n};\n\nexport async function useReason<\n TOutput = unknown,\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): Promise<UseReasonResult<TOutput, TResponse>> {\n assertReasoningThoughtsCompatibility(args);\n const ctx = getHookContext();\n const id =\n typeof args.id === \"string\" && args.id.length > 0 ? args.id : undefined;\n const opId = createRuntimeId();\n const checkpointKey = resolveReasonCheckpointKey({\n ...(id ? { id } : {}),\n autoIndex: ctx.reasonCallIndex++,\n });\n const existingCompleted = readReasonCompletedCheckpoint(\n ctx.currentNodeState.byKey[checkpointKey],\n );\n\n if (existingCompleted) {\n return existingCompleted.result as UseReasonResult<TOutput, TResponse>;\n }\n\n const existingCheckpoint = readReasonCheckpoint(\n ctx.currentNodeState.byKey[checkpointKey],\n );\n\n const reasonMeta =\n typeof id === \"string\" ? ({ id, opId } as const) : ({ opId } as const);\n const traceSpan: ReasonTraceSpan | undefined =\n getReasonTraceAdapter()?.startSpan({\n name: \"useReason\",\n attributes: {\n ...(id ? { id } : {}),\n opId,\n nodeId: ctx.node.graph.node,\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n stream: args.stream ?? args.model.options?.streaming ?? true,\n emit: args.emit ?? true,\n ...(args.telemetry?.operation\n ? { operation: args.telemetry.operation }\n : {}),\n ...(args.telemetry?.prompt?.name\n ? { promptName: args.telemetry.prompt.name }\n : {}),\n ...(args.telemetry?.prompt?.version !== undefined\n ? { promptVersion: args.telemetry.prompt.version }\n : {}),\n ...(args.telemetry?.prompt?.type\n ? { promptType: args.telemetry.prompt.type }\n : {}),\n hasOutputSchema: Boolean(args.outputSchema),\n hasInterrupt: Boolean(args.interrupt),\n hasStructured: Boolean(args.structured),\n hasTools: Boolean(args.tools?.length),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n input: args.telemetry?.input ?? args.input,\n },\n });\n\n if (args.tools?.length) {\n return runReasonToolLoop({\n useReasonArgs: args,\n ...(id ? { id } : {}),\n opId,\n ...(traceSpan ? { traceSpan } : {}),\n });\n }\n const suppressTextStream = Boolean(args.outputSchema || args.interrupt);\n const setFieldPaths = resolveSetFieldPaths(args.structured);\n const appendFieldPaths = resolveAppendFieldPaths(args.structured);\n const textDeltaFieldPaths = resolveTextDeltaFieldPaths(args.structured);\n const useStructuredIncrementalStreaming = Boolean(\n args.outputSchema &&\n !args.interrupt &&\n (setFieldPaths.length > 0 ||\n appendFieldPaths.length > 0 ||\n textDeltaFieldPaths.length > 0) &&\n args.stream !== false &&\n shouldStreamReasonStructured(args),\n );\n\n let firstText = \"\";\n let firstRaw: unknown;\n let firstOutput: TOutput | undefined;\n let firstInterruptRequest: TRequest | undefined;\n let firstInterruptRequired = false;\n\n let finalText = \"\";\n let finalRaw: unknown;\n let finalOutput: TOutput | undefined;\n let aggregatedUsage: KortyxUsage | undefined;\n let finalFinishReason: KortyxFinishReason | undefined;\n let aggregatedProviderMetadata: KortyxProviderMetadata | undefined;\n let aggregatedWarnings: KortyxWarning[] | undefined;\n const emittedSetValues = new Map<string, string>();\n const emittedAppendCounts = new Map<string, number>();\n const emittedTextValues = new Map<string, string>();\n\n if (existingCheckpoint) {\n firstText = existingCheckpoint.firstText;\n firstRaw = existingCheckpoint.firstRaw;\n firstOutput = existingCheckpoint.firstOutput as TOutput | undefined;\n finalText = firstText;\n finalRaw = firstRaw;\n finalOutput = firstOutput;\n aggregatedUsage = existingCheckpoint.firstUsage;\n finalFinishReason = existingCheckpoint.firstFinishReason;\n aggregatedProviderMetadata = existingCheckpoint.firstProviderMetadata;\n aggregatedWarnings = existingCheckpoint.firstWarnings;\n traceSpan?.addEvent?.(\"useReason.resume\", {\n checkpointKey,\n });\n } else {\n const first = await reasonEngine(\n {\n ...args,\n emit: suppressTextStream ? false : args.emit,\n stream: useStructuredIncrementalStreaming\n ? true\n : suppressTextStream\n ? false\n : args.stream,\n ...(useStructuredIncrementalStreaming\n ? {\n onTextChunk: (delta: string) => {\n firstText += delta;\n finalText = firstText;\n\n for (const fieldPath of setFieldPaths) {\n const values = extractCompletedFieldValues({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, value } of values) {\n const nextSerialized = JSON.stringify(value);\n if (emittedSetValues.get(path) === nextSerialized) continue;\n\n emittedSetValues.set(path, nextSerialized);\n emitStructuredData({\n kind: \"set\",\n path,\n value,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n\n for (const fieldPath of appendFieldPaths) {\n const groups = extractCompletedArrayItemGroups({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, items } of groups) {\n const emittedAppendCount =\n emittedAppendCounts.get(path) ?? 0;\n if (items.length <= emittedAppendCount) continue;\n\n const nextItems = items.slice(emittedAppendCount);\n emittedAppendCounts.set(path, items.length);\n emitStructuredData({\n kind: \"append\",\n path,\n items: nextItems,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n\n for (const fieldPath of textDeltaFieldPaths) {\n const values = extractStreamingStringValues({\n text: firstText,\n path: fieldPath,\n });\n\n for (const { path, value } of values) {\n const emittedTextValue = emittedTextValues.get(path) ?? \"\";\n if (\n value.length <= emittedTextValue.length ||\n !value.startsWith(emittedTextValue)\n ) {\n continue;\n }\n\n const nextDelta = value.slice(emittedTextValue.length);\n emittedTextValues.set(path, value);\n if (nextDelta.length === 0) continue;\n\n emitStructuredData({\n kind: \"text-delta\",\n path,\n delta: nextDelta,\n dataType: args.structured?.dataType ?? \"reason-output\",\n ...(args.structured?.schemaId\n ? { schemaId: args.structured.schemaId }\n : {}),\n ...(args.structured?.schemaVersion\n ? { schemaVersion: args.structured.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n streamId: opId,\n });\n }\n }\n },\n }\n : {}),\n },\n reasonMeta,\n args.interrupt\n ? defaultInterruptFirstPassInput({\n input: args.input,\n requestSchema: args.interrupt.requestSchema,\n mode: args.interrupt.mode ?? \"required\",\n ...(args.outputSchema\n ? { outputSchema: args.outputSchema as SchemaLike<unknown> }\n : {}),\n })\n : args.outputSchema\n ? withOutputGuardrails(\n withStructuredStreamHints(args.input, {\n ...(setFieldPaths.length > 0 ? { setFieldPaths } : {}),\n ...(appendFieldPaths.length > 0 ? { appendFieldPaths } : {}),\n ...(textDeltaFieldPaths.length > 0\n ? { textDeltaFieldPaths }\n : {}),\n }),\n args.outputSchema as SchemaLike<unknown>,\n )\n : undefined,\n );\n firstRaw = first.raw;\n finalRaw = first.raw;\n accumulateTokenUsage(first.usage);\n aggregatedUsage = mergeUsage(aggregatedUsage, first.usage);\n finalFinishReason = first.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n first.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, first.warnings);\n traceSpan?.addEvent?.(\"useReason.first-pass.complete\", {\n textLength: first.text.length,\n hasInterrupt: Boolean(args.interrupt),\n });\n\n if (args.interrupt) {\n const firstPass = parseInterruptFirstPassResult<TRequest, TOutput>({\n text: first.text,\n requestSchema: args.interrupt.requestSchema,\n ...(first.finishReason ? { finishReason: first.finishReason } : {}),\n ...(args.outputSchema\n ? { outputSchema: args.outputSchema as SchemaLike<TOutput> }\n : {}),\n mode: args.interrupt.mode ?? \"required\",\n });\n firstText = firstPass.draftText;\n finalText = firstPass.draftText;\n firstInterruptRequired = firstPass.interruptRequired;\n firstInterruptRequest = firstPass.request;\n firstOutput = firstPass.output;\n finalOutput = firstPass.output;\n } else {\n firstText = first.text;\n finalText = first.text;\n if (args.outputSchema) {\n firstOutput = parseReasonOutputWithSchema({\n text: first.text,\n schema: args.outputSchema,\n ...(first.finishReason ? { finishReason: first.finishReason } : {}),\n label: \"useReason output\",\n });\n }\n finalOutput = firstOutput;\n }\n }\n\n let interruptResponse: TResponse | undefined;\n\n if (args.interrupt && (existingCheckpoint || firstInterruptRequired)) {\n const requestSchema = args.interrupt.requestSchema;\n\n const interruptRequest = existingCheckpoint\n ? parseWithSchema(\n requestSchema,\n existingCheckpoint.request,\n \"useReason interrupt.request\",\n )\n : firstInterruptRequest;\n\n if (!interruptRequest) {\n throw new Error(\n \"useReason interrupt request is missing; first pass did not produce a valid interrupt payload.\",\n );\n }\n\n if (!existingCheckpoint) {\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"awaiting_interrupt\",\n request: interruptRequest,\n firstText,\n ...(firstRaw !== undefined ? { firstRaw } : {}),\n ...(aggregatedUsage !== undefined\n ? { firstUsage: aggregatedUsage }\n : {}),\n ...(finalFinishReason !== undefined\n ? { firstFinishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { firstProviderMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { firstWarnings: aggregatedWarnings }\n : {}),\n ...(firstOutput !== undefined ? { firstOutput } : {}),\n } satisfies ReasonInterruptCheckpoint;\n ctx.stateDirty = true;\n }\n\n const resumeStatePatch = resolveHookStatePatch({\n nodeId: ctx.node.graph.node,\n currentNodeState: ctx.currentNodeState,\n workflowState: ctx.workflowState,\n });\n\n interruptResponse = await awaitInterruptInternal<TRequest, TResponse>({\n request: interruptRequest,\n requestSchema,\n responseSchema: args.interrupt.responseSchema,\n ...(args.interrupt.schemaId ? { schemaId: args.interrupt.schemaId } : {}),\n ...(args.interrupt.schemaVersion\n ? { schemaVersion: args.interrupt.schemaVersion }\n : {}),\n ...(id ? { id } : {}),\n meta: {\n __kortyxResumeStatePatch: resumeStatePatch,\n },\n });\n traceSpan?.addEvent?.(\"useReason.interrupt.resolved\", {\n checkpointKey,\n });\n\n if (Object.hasOwn(ctx.currentNodeState.byKey, checkpointKey)) {\n delete ctx.currentNodeState.byKey[checkpointKey];\n ctx.stateDirty = true;\n }\n\n const continuationInput = defaultContinuationInput({\n input: args.input,\n draftText: firstText,\n ...(firstOutput !== undefined ? { draftOutput: firstOutput } : {}),\n request: interruptRequest,\n response: interruptResponse,\n });\n\n const second = await reasonEngine(\n {\n ...args,\n emit: suppressTextStream ? false : args.emit,\n stream: suppressTextStream ? false : args.stream,\n },\n reasonMeta,\n args.outputSchema\n ? withOutputGuardrails(\n continuationInput,\n args.outputSchema as SchemaLike<unknown>,\n )\n : continuationInput,\n );\n finalText = second.text;\n finalRaw = second.raw;\n accumulateTokenUsage(second.usage);\n aggregatedUsage = mergeUsage(aggregatedUsage, second.usage);\n finalFinishReason = second.finishReason;\n aggregatedProviderMetadata = mergeProviderMetadata(\n aggregatedProviderMetadata,\n second.providerMetadata,\n );\n aggregatedWarnings = mergeWarnings(aggregatedWarnings, second.warnings);\n traceSpan?.addEvent?.(\"useReason.continuation.complete\", {\n textLength: second.text.length,\n });\n\n if (args.outputSchema) {\n finalOutput = parseReasonOutputWithSchema({\n text: finalText,\n schema: args.outputSchema,\n ...(second.finishReason ? { finishReason: second.finishReason } : {}),\n label: \"useReason output\",\n });\n }\n }\n\n if (finalOutput !== undefined) {\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: finalOutput,\n structured: args.structured,\n emit: args.emit ?? true,\n });\n }\n\n const result = {\n ...(id ? { id } : {}),\n opId,\n text: finalText,\n ...(finalRaw !== undefined ? { raw: finalRaw } : {}),\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n ...(finalOutput !== undefined ? { output: finalOutput } : {}),\n ...(interruptResponse !== undefined ? { interruptResponse } : {}),\n };\n\n if (args.interrupt) {\n ctx.currentNodeState.byKey[checkpointKey] = {\n status: \"completed\",\n result,\n };\n ctx.stateDirty = true;\n }\n\n traceSpan?.end?.({\n ...(aggregatedUsage !== undefined ? { usage: aggregatedUsage } : {}),\n ...(finalFinishReason !== undefined\n ? { finishReason: finalFinishReason }\n : {}),\n ...(aggregatedProviderMetadata !== undefined\n ? { providerMetadata: aggregatedProviderMetadata }\n : {}),\n ...(aggregatedWarnings !== undefined\n ? { warnings: aggregatedWarnings }\n : {}),\n attributes: {\n textLength: finalText.length,\n resumedFromCheckpoint: Boolean(existingCheckpoint),\n interrupted: Boolean(interruptResponse !== undefined),\n },\n telemetry: {\n ...(args.telemetry ?? {}),\n output: args.telemetry?.output ?? finalOutput ?? finalText,\n },\n });\n\n return result;\n}\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { getHookContext } from \"./context\";\nimport { awaitInterruptInternal } from \"./interrupt\";\nimport { useReason as useReasonInternal } from \"./reason/use-reason\";\nimport { emitStructuredData } from \"./structured\";\nimport type {\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonResult,\n UseStructuredDataArgs,\n} from \"./types\";\n\nexport type {\n SchemaLike,\n StructuredDataKind,\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonInterruptConfig,\n UseReasonResult,\n UseReasonStep,\n UseReasonStructuredConfig,\n UseReasonToolExecution,\n UseStructuredDataAppendArgs,\n UseStructuredDataArgs,\n UseStructuredDataFinalArgs,\n UseStructuredDataSetArgs,\n UseStructuredDataTextDeltaArgs,\n} from \"./types\";\n\ntype StateSetter<T> = (next: T | ((prev: T) => T)) => void;\n\nexport function useStructuredData<TData = unknown>(\n args: UseStructuredDataArgs<TData>,\n): void {\n emitStructuredData(args);\n}\n\nexport function useReason<\n TOutput = unknown,\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(\n args: UseReasonArgs<TOutput, TRequest, TResponse>,\n): Promise<UseReasonResult<TOutput, TResponse>> {\n return useReasonInternal(args);\n}\n\nexport function useInterrupt<\n TRequest extends InterruptInput = InterruptInput,\n TResponse = InterruptResult,\n>(args: UseInterruptArgs<TRequest, TResponse>): Promise<TResponse> {\n return awaitInterruptInternal(args);\n}\n\nexport function useRuntimeContext<\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(): TContext {\n const ctx = getHookContext();\n const config = ctx.state.config;\n const context =\n config && typeof config === \"object\" && \"context\" in config\n ? (config as { context?: unknown }).context\n : undefined;\n\n return context && typeof context === \"object\" && !Array.isArray(context)\n ? (context as TContext)\n : ({} as TContext);\n}\n\nexport function useNodeState<T>(initialValue: T): [T, StateSetter<T>] {\n const ctx = getHookContext();\n const nodeState = ctx.currentNodeState;\n\n const index = ctx.nodeStateIndex++;\n if (index >= nodeState.byIndex.length) {\n nodeState.byIndex[index] = initialValue as T;\n ctx.stateDirty = true;\n }\n\n const getValue = () => nodeState.byIndex[index] as T;\n const setValue: StateSetter<T> = (next) => {\n const prev = getValue();\n const resolved =\n typeof next === \"function\" ? (next as (p: T) => T)(prev) : next;\n nodeState.byIndex[index] = resolved;\n ctx.stateDirty = true;\n };\n\n return [getValue(), setValue];\n}\n\nexport function useWorkflowState<T>(\n key: string,\n ...rest: [] | [T]\n): [T, StateSetter<T>] {\n const ctx = getHookContext();\n const workflowState = ctx.workflowState;\n const hasInitial = rest.length > 0;\n const initialValue = rest[0];\n\n if (!Object.hasOwn(workflowState, key) && hasInitial) {\n workflowState[key] = initialValue as T;\n ctx.stateDirty = true;\n }\n\n const getValue = () => workflowState[key] as T;\n const setValue: StateSetter<T> = (next) => {\n const prev = getValue();\n const resolved =\n typeof next === \"function\" ? (next as (p: T) => T)(prev) : next;\n workflowState[key] = resolved;\n ctx.stateDirty = true;\n };\n\n return [getValue(), setValue];\n}\n"],"mappings":"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","names":["useReason","import_node_crypto","import_node_crypto","response","result","createRuntimeId","isRecord","tryStringify","result","createRuntimeId","useReason"]}