@kortyx/hooks 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/dist/index.d.ts +1 -3
- package/dist/index.js +2 -24
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.7.0](https://github.com/kortyx-io/kortyx/compare/hooks-v0.6.0...hooks-v0.7.0) (2026-03-09)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### ⚠ BREAKING CHANGES
|
|
7
|
+
|
|
8
|
+
* **hooks:** remove useEmit from public API
|
|
9
|
+
* **hooks:** remove keyed useNodeState API
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* **hooks:** remove keyed useNodeState API ([1692d64](https://github.com/kortyx-io/kortyx/commit/1692d648f643471aebb67ed2c26ff4f4cb6fd931))
|
|
14
|
+
* **hooks:** remove useEmit from public API ([c66e3b0](https://github.com/kortyx-io/kortyx/commit/c66e3b012eb822a14067ee0e6f40528fcc7b4711))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Bug Fixes
|
|
18
|
+
|
|
19
|
+
* **release:** rollback accidental 1.0 release commit ([16fa5db](https://github.com/kortyx-io/kortyx/commit/16fa5db300c63d4c985a7475ea8375d9b365b925))
|
|
20
|
+
|
|
3
21
|
## [0.6.0](https://github.com/kortyx-io/kortyx/compare/hooks-v0.5.1...hooks-v0.6.0) (2026-03-08)
|
|
4
22
|
|
|
5
23
|
|
package/dist/index.d.ts
CHANGED
|
@@ -80,13 +80,11 @@ type UseInterruptArgs<TRequest extends InterruptInput = InterruptInput, TRespons
|
|
|
80
80
|
};
|
|
81
81
|
|
|
82
82
|
type StateSetter<T> = (next: T | ((prev: T) => T)) => void;
|
|
83
|
-
declare function useEmit(): NodeContext["emit"];
|
|
84
83
|
declare function useStructuredData<TData = unknown>(args: UseStructuredDataArgs<TData>): void;
|
|
85
84
|
declare function useReason<TOutput = unknown, TRequest extends InterruptInput = InterruptInput, TResponse = InterruptResult>(args: UseReasonArgs<TOutput, TRequest, TResponse>): Promise<UseReasonResult<TOutput, TResponse>>;
|
|
86
85
|
declare function useAiMemory(): MemoryAdapter;
|
|
87
86
|
declare function useInterrupt<TRequest extends InterruptInput = InterruptInput, TResponse = InterruptResult>(args: UseInterruptArgs<TRequest, TResponse>): Promise<TResponse>;
|
|
88
87
|
declare function useNodeState<T>(initialValue: T): [T, StateSetter<T>];
|
|
89
|
-
declare function useNodeState<T>(key: string, initialValue?: T): [T, StateSetter<T>];
|
|
90
88
|
declare function useWorkflowState<T>(key: string, initialValue?: T): [T, StateSetter<T>];
|
|
91
89
|
|
|
92
|
-
export { type HookRuntimeContext, type UseInterruptArgs, type UseReasonArgs, type UseReasonResult, type UseStructuredDataArgs, runWithHookContext, useAiMemory,
|
|
90
|
+
export { type HookRuntimeContext, type UseInterruptArgs, type UseReasonArgs, type UseReasonResult, type UseStructuredDataArgs, runWithHookContext, useAiMemory, useInterrupt, useNodeState, useReason, useStructuredData, useWorkflowState };
|
package/dist/index.js
CHANGED
|
@@ -21,7 +21,6 @@ var index_exports = {};
|
|
|
21
21
|
__export(index_exports, {
|
|
22
22
|
runWithHookContext: () => runWithHookContext,
|
|
23
23
|
useAiMemory: () => useAiMemory,
|
|
24
|
-
useEmit: () => useEmit,
|
|
25
24
|
useInterrupt: () => useInterrupt,
|
|
26
25
|
useNodeState: () => useNodeState,
|
|
27
26
|
useReason: () => useReason2,
|
|
@@ -683,10 +682,6 @@ async function useReason(args) {
|
|
|
683
682
|
}
|
|
684
683
|
|
|
685
684
|
// src/hooks.ts
|
|
686
|
-
function useEmit() {
|
|
687
|
-
const ctx = getHookContext();
|
|
688
|
-
return ctx.node.emit;
|
|
689
|
-
}
|
|
690
685
|
function useStructuredData(args) {
|
|
691
686
|
emitStructuredData(args);
|
|
692
687
|
}
|
|
@@ -703,28 +698,12 @@ function useAiMemory() {
|
|
|
703
698
|
function useInterrupt(args) {
|
|
704
699
|
return awaitInterruptInternal(args);
|
|
705
700
|
}
|
|
706
|
-
function useNodeState(
|
|
701
|
+
function useNodeState(initialValue) {
|
|
707
702
|
const ctx = getHookContext();
|
|
708
703
|
const nodeState = ctx.currentNodeState;
|
|
709
|
-
if (typeof keyOrInitial === "string") {
|
|
710
|
-
const key = keyOrInitial;
|
|
711
|
-
const hasInitial = arguments.length > 1;
|
|
712
|
-
if (!Object.hasOwn(nodeState.byKey, key) && hasInitial) {
|
|
713
|
-
nodeState.byKey[key] = initialValue;
|
|
714
|
-
ctx.dirty = true;
|
|
715
|
-
}
|
|
716
|
-
const getValue2 = () => nodeState.byKey[key];
|
|
717
|
-
const setValue2 = (next) => {
|
|
718
|
-
const prev = getValue2();
|
|
719
|
-
const resolved = typeof next === "function" ? next(prev) : next;
|
|
720
|
-
nodeState.byKey[key] = resolved;
|
|
721
|
-
ctx.dirty = true;
|
|
722
|
-
};
|
|
723
|
-
return [getValue2(), setValue2];
|
|
724
|
-
}
|
|
725
704
|
const index = ctx.nodeStateIndex++;
|
|
726
705
|
if (index >= nodeState.byIndex.length) {
|
|
727
|
-
nodeState.byIndex[index] =
|
|
706
|
+
nodeState.byIndex[index] = initialValue;
|
|
728
707
|
ctx.dirty = true;
|
|
729
708
|
}
|
|
730
709
|
const getValue = () => nodeState.byIndex[index];
|
|
@@ -757,7 +736,6 @@ function useWorkflowState(key, initialValue) {
|
|
|
757
736
|
0 && (module.exports = {
|
|
758
737
|
runWithHookContext,
|
|
759
738
|
useAiMemory,
|
|
760
|
-
useEmit,
|
|
761
739
|
useInterrupt,
|
|
762
740
|
useNodeState,
|
|
763
741
|
useReason,
|
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/reason/checkpoint.ts","../src/reason/engine.ts","../src/reason-engine.ts","../src/reason/parsing.ts","../src/reason/prompting.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 useAiMemory,\n useEmit,\n useInterrupt,\n useNodeState,\n useReason,\n useStructuredData,\n useWorkflowState,\n} from \"./hooks\";\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { GraphState, NodeContext } from \"@kortyx/core\";\nimport type { MemoryAdapter } from \"@kortyx/memory\";\nimport type { GetProviderFn } from \"@kortyx/providers\";\n\ntype NodeStateStore = {\n byIndex: unknown[];\n byKey: Record<string, unknown>;\n};\n\ntype HookMemory = {\n nodeState?: Record<string, unknown>;\n workflowState?: Record<string, unknown>;\n};\n\nexport type HookRuntimeContext = {\n node: NodeContext;\n state: GraphState;\n getProvider?: GetProviderFn;\n memoryAdapter?: MemoryAdapter;\n};\n\ntype HookInternalContext = HookRuntimeContext & {\n nodeStateIndex: number;\n reasonCallIndex: number;\n currentNodeState: NodeStateStore;\n workflowState: Record<string, unknown>;\n dirty: 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 getHookMemory = (state: GraphState): HookMemory => {\n const memory = (state.memory ?? {}) as Record<string, unknown>;\n const internal = isRecord(memory.__kortyx) ? memory.__kortyx : undefined;\n const result: HookMemory = {};\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 hookMemory = getHookMemory(ctx.state);\n const nodeId = ctx.node.graph.node;\n const storedNodeId =\n typeof (hookMemory.nodeState as any)?.nodeId === \"string\"\n ? String((hookMemory.nodeState as any)?.nodeId)\n : \"\";\n const storedState = (hookMemory.nodeState as any)?.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(hookMemory.workflowState),\n dirty: false,\n };\n};\n\nconst buildMemoryUpdates = (ctx: HookInternalContext) => {\n if (!ctx.dirty) return null;\n return {\n __kortyx: {\n nodeState: {\n nodeId: ctx.node.graph.node,\n state: ctx.currentNodeState,\n },\n workflowState: ctx.workflowState,\n },\n } as Record<string, unknown>;\n};\n\nexport async function runWithHookContext<T>(\n ctx: HookRuntimeContext,\n fn: () => Promise<T>,\n): Promise<{ result: T; memoryUpdates: Record<string, unknown> | null }> {\n const internal = createInternalContext(ctx);\n try {\n const result = await storage.run(internal, fn);\n return { result, memoryUpdates: buildMemoryUpdates(internal) };\n } catch (err) {\n const memoryUpdates = buildMemoryUpdates(internal);\n if (memoryUpdates) {\n const currentMemory = isRecord(internal.state.memory)\n ? (internal.state.memory as Record<string, unknown>)\n : {};\n internal.state.memory = {\n ...currentMemory,\n ...memoryUpdates,\n } as unknown as GraphState[\"memory\"];\n if (err && typeof err === \"object\") {\n (err as any).__kortyxMemoryUpdates = memoryUpdates;\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 { getHookContext } from \"./context\";\nimport type {\n StructuredDataMode,\n UseReasonStructuredConfig,\n UseStructuredDataArgs,\n} from \"./types\";\nimport { parseWithSchema } from \"./validation\";\n\nexport const emitStructuredData = <TData = unknown>(\n args: UseStructuredDataArgs<TData>,\n): void => {\n const ctx = getHookContext();\n const validated = parseWithSchema(\n args.dataSchema,\n args.data,\n \"useStructuredData data\",\n );\n\n ctx.node.emit(\"structured_data\", {\n node: ctx.node.graph.node,\n ...(typeof args.dataType === \"string\" && args.dataType.length > 0\n ? { dataType: args.dataType }\n : {}),\n ...(typeof args.mode === \"string\" ? { mode: args.mode } : {}),\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 ...(typeof args.opId === \"string\" && args.opId.length > 0\n ? { opId: args.opId }\n : {}),\n data: validated,\n });\n};\n\nexport const shouldEmitStructured = (\n cfg: UseReasonStructuredConfig | undefined,\n): boolean => (cfg?.stream ?? \"patch\") !== \"off\";\n\nexport const resolveStructuredMode = (\n cfg: UseReasonStructuredConfig | undefined,\n): StructuredDataMode => {\n const mode = cfg?.stream ?? \"patch\";\n if (mode === \"snapshot\") return \"snapshot\";\n if (mode === \"patch\") return \"patch\";\n return \"final\";\n};\n","import type { InterruptInput } from \"@kortyx/core\";\n\nexport type ReasonInterruptCheckpoint = {\n status: \"awaiting_interrupt\";\n request: InterruptInput;\n firstText: string;\n firstRaw?: unknown;\n firstOutput?: 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, \"firstOutput\")\n ? { firstOutput: value.firstOutput }\n : {}),\n };\n};\n\nexport const resolveHookMemoryPatch = (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 { ProviderModelRef } from \"@kortyx/providers\";\nimport { getHookContext } from \"../context\";\nimport type { RunReasonEngineResult } from \"../reason-engine\";\nimport { runReasonEngine } from \"../reason-engine\";\n\nexport type ReasonEngineInput = {\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | undefined;\n emit?: boolean | undefined;\n stream?: boolean | undefined;\n};\n\nexport const createRuntimeId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nexport async function reasonEngine(\n args: ReasonEngineInput,\n meta: { id?: string; opId: string },\n inputOverride?: string,\n): Promise<RunReasonEngineResult> {\n const ctx = getHookContext();\n const getProvider = ctx.getProvider;\n if (!getProvider) {\n throw new Error(\"useReason requires a provider factory in runtime config.\");\n }\n\n return runReasonEngine({\n getProvider,\n model: args.model,\n input: inputOverride ?? args.input,\n system: args.system,\n temperature: args.temperature,\n defaultTemperature: ctx.node.config?.model?.temperature,\n stream: args.stream,\n emit: args.emit,\n nodeId: ctx.node.graph.node,\n emitEvent: ctx.node.emit,\n id: meta.id,\n opId: meta.opId,\n });\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n GetProviderFn,\n KortyxPromptMessage,\n KortyxStreamChunk,\n ProviderModelRef,\n} from \"@kortyx/providers\";\n\nexport interface RunReasonEngineArgs {\n getProvider: GetProviderFn;\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | 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 id?: string | undefined;\n opId?: string | undefined;\n segmentId?: string | undefined;\n}\n\nexport interface RunReasonEngineResult {\n text: string;\n raw?: unknown;\n}\n\nconst chunkToText = (chunk: KortyxStreamChunk | string): string => {\n if (typeof chunk === \"string\") return chunk;\n if (typeof chunk.text === \"string\") return chunk.text;\n if (typeof chunk.content === \"string\") return chunk.content;\n return \"\";\n};\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\n const model = args.getProvider(args.model.providerId, args.model.modelId, {\n ...(temperature !== undefined ? { temperature } : {}),\n streaming: stream,\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\n if (stream) {\n let final = \"\";\n let raw: unknown;\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 const text = chunkToText(chunk);\n if (!text) continue;\n final += text;\n if (typeof chunk === \"object\" && chunk && \"raw\" in chunk) {\n raw = (chunk as KortyxStreamChunk).raw;\n }\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: text,\n });\n }\n }\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n return {\n text: final,\n ...(raw !== undefined ? { raw } : {}),\n };\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 return {\n text: response.content,\n ...(response.raw !== undefined ? { raw: response.raw } : {}),\n };\n}\n","import type { InterruptInput } from \"@kortyx/core\";\nimport type { SchemaLike } from \"../types\";\nimport { parseWithSchema } from \"../validation\";\n\nconst tryJsonParse = (\n value: string,\n): { ok: true; value: unknown } | { ok: false } => {\n try {\n return { ok: true, value: JSON.parse(value) };\n } catch {\n return { ok: false };\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\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}): {\n draftText: string;\n request: TRequest;\n output?: TOutput;\n} => {\n const candidate = resolveOutputCandidate(args.text);\n if (!isRecord(candidate)) {\n throw new Error(\n \"useReason first pass with interrupt must return a JSON object.\",\n );\n }\n\n const requestCandidates: unknown[] = [\n candidate.interruptRequest,\n candidate.request,\n candidate.interrupt,\n candidate,\n ];\n const requestPayload = requestCandidates.find(\n (value) => value !== null && value !== undefined,\n );\n\n const request = parseWithSchema(\n args.requestSchema,\n requestPayload,\n \"useReason interrupt.request\",\n );\n\n let output: TOutput | undefined;\n if (args.outputSchema) {\n const outputPayload = Object.hasOwn(candidate, \"output\")\n ? candidate.output\n : candidate;\n output = parseWithSchema(\n args.outputSchema,\n outputPayload,\n \"useReason output\",\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 return {\n draftText,\n request,\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}): string => {\n const base = 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 '{ \"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","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { getHookContext } from \"../context\";\nimport { awaitInterruptInternal } from \"../interrupt\";\nimport {\n emitStructuredData,\n resolveStructuredMode,\n shouldEmitStructured,\n} from \"../structured\";\nimport type { SchemaLike, UseReasonArgs, UseReasonResult } from \"../types\";\nimport { parseWithSchema } from \"../validation\";\nimport {\n type ReasonInterruptCheckpoint,\n readReasonCheckpoint,\n resolveHookMemoryPatch,\n resolveReasonCheckpointKey,\n} from \"./checkpoint\";\nimport { createRuntimeId, reasonEngine } from \"./engine\";\nimport {\n parseInterruptFirstPassResult,\n resolveOutputCandidate,\n} from \"./parsing\";\nimport {\n defaultContinuationInput,\n defaultInterruptFirstPassInput,\n withOutputGuardrails,\n} from \"./prompting\";\n\nconst emitReasonStructuredOutput = <TOutput>(args: {\n id?: string;\n opId: string;\n output: TOutput;\n structured: UseReasonArgs<TOutput>[\"structured\"];\n}): void => {\n if (!shouldEmitStructured(args.structured)) return;\n\n emitStructuredData<TOutput>({\n dataType: args.structured?.dataType ?? \"reason-output\",\n data: args.output,\n mode: resolveStructuredMode(args.structured),\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 opId: args.opId,\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 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 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 suppressTextStream = Boolean(args.outputSchema || args.interrupt);\n\n let firstText = \"\";\n let firstRaw: unknown;\n let firstOutput: TOutput | undefined;\n let firstInterruptRequest: TRequest | undefined;\n\n let finalText = \"\";\n let finalRaw: unknown;\n let finalOutput: TOutput | undefined;\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 } else {\n const first = await reasonEngine(\n {\n ...args,\n emit: suppressTextStream ? false : args.emit,\n stream: suppressTextStream ? false : args.stream,\n },\n reasonMeta,\n args.interrupt\n ? defaultInterruptFirstPassInput({\n input: args.input,\n requestSchema: args.interrupt.requestSchema,\n ...(args.outputSchema\n ? { outputSchema: args.outputSchema as SchemaLike<unknown> }\n : {}),\n })\n : args.outputSchema\n ? withOutputGuardrails(\n args.input,\n args.outputSchema as SchemaLike<unknown>,\n )\n : undefined,\n );\n firstRaw = first.raw;\n finalRaw = first.raw;\n\n if (args.interrupt) {\n const firstPass = parseInterruptFirstPassResult<TRequest, TOutput>({\n text: first.text,\n requestSchema: args.interrupt.requestSchema,\n ...(args.outputSchema\n ? { outputSchema: args.outputSchema as SchemaLike<TOutput> }\n : {}),\n });\n firstText = firstPass.draftText;\n finalText = firstPass.draftText;\n firstInterruptRequest = firstPass.request;\n firstOutput = firstPass.output;\n finalOutput = firstPass.output;\n\n if (firstOutput !== undefined) {\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: firstOutput,\n structured: args.structured,\n });\n }\n } else {\n firstText = first.text;\n finalText = first.text;\n if (args.outputSchema) {\n firstOutput = parseWithSchema(\n args.outputSchema,\n resolveOutputCandidate(first.text),\n \"useReason output\",\n );\n\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: firstOutput,\n structured: args.structured,\n });\n }\n finalOutput = firstOutput;\n }\n }\n\n let interruptResponse: TResponse | undefined;\n\n if (args.interrupt) {\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 ...(firstOutput !== undefined ? { firstOutput } : {}),\n } satisfies ReasonInterruptCheckpoint;\n ctx.dirty = true;\n }\n\n const resumeMemoryPatch = resolveHookMemoryPatch({\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 __kortyxResumeMemory: resumeMemoryPatch,\n },\n });\n\n if (Object.hasOwn(ctx.currentNodeState.byKey, checkpointKey)) {\n delete ctx.currentNodeState.byKey[checkpointKey];\n ctx.dirty = 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\n if (args.outputSchema) {\n finalOutput = parseWithSchema(\n args.outputSchema,\n resolveOutputCandidate(finalText),\n \"useReason output\",\n );\n\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: finalOutput,\n structured: args.structured,\n });\n }\n }\n\n return {\n ...(id ? { id } : {}),\n opId,\n text: finalText,\n ...(finalRaw !== undefined ? { raw: finalRaw } : {}),\n ...(finalOutput !== undefined ? { output: finalOutput } : {}),\n ...(interruptResponse !== undefined ? { interruptResponse } : {}),\n };\n}\n","import type {\n InterruptInput,\n InterruptResult,\n NodeContext,\n} from \"@kortyx/core\";\nimport type { MemoryAdapter } from \"@kortyx/memory\";\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 StructuredDataMode,\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonInterruptConfig,\n UseReasonResult,\n UseReasonStructuredConfig,\n UseReasonStructuredStreamMode,\n UseStructuredDataArgs,\n} from \"./types\";\n\ntype StateSetter<T> = (next: T | ((prev: T) => T)) => void;\n\nexport function useEmit(): NodeContext[\"emit\"] {\n const ctx = getHookContext();\n return ctx.node.emit;\n}\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 useAiMemory(): MemoryAdapter {\n const ctx = getHookContext();\n if (!ctx.memoryAdapter) {\n throw new Error(\"useAiMemory requires a memory adapter in runtime config.\");\n }\n return ctx.memoryAdapter;\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 useNodeState<T>(initialValue: T): [T, StateSetter<T>];\nexport function useNodeState<T>(\n key: string,\n initialValue?: T,\n): [T, StateSetter<T>];\nexport function useNodeState<T>(\n keyOrInitial: string | T,\n initialValue?: T,\n): [T, StateSetter<T>] {\n const ctx = getHookContext();\n const nodeState = ctx.currentNodeState;\n\n if (typeof keyOrInitial === \"string\") {\n const key = keyOrInitial;\n const hasInitial = arguments.length > 1;\n\n if (!Object.hasOwn(nodeState.byKey, key) && hasInitial) {\n nodeState.byKey[key] = initialValue as T;\n ctx.dirty = true;\n }\n\n const getValue = () => nodeState.byKey[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 nodeState.byKey[key] = resolved;\n ctx.dirty = true;\n };\n\n return [getValue(), setValue];\n }\n\n const index = ctx.nodeStateIndex++;\n if (index >= nodeState.byIndex.length) {\n nodeState.byIndex[index] = keyOrInitial as T;\n ctx.dirty = 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.dirty = true;\n };\n\n return [getValue(), setValue];\n}\n\nexport function useWorkflowState<T>(\n key: string,\n initialValue?: T,\n): [T, StateSetter<T>] {\n const ctx = getHookContext();\n const workflowState = ctx.workflowState;\n const hasInitial = arguments.length > 1;\n\n if (!Object.hasOwn(workflowState, key) && hasInitial) {\n workflowState[key] = initialValue as T;\n ctx.dirty = 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.dirty = true;\n };\n\n return [getValue(), setValue];\n}\n"],"mappings":"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","names":["useReason","import_node_crypto","response","createRuntimeId","isRecord","tryStringify","createRuntimeId","useReason","getValue","setValue"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/context.ts","../src/validation.ts","../src/interrupt.ts","../src/structured.ts","../src/reason/checkpoint.ts","../src/reason/engine.ts","../src/reason-engine.ts","../src/reason/parsing.ts","../src/reason/prompting.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 useAiMemory,\n useInterrupt,\n useNodeState,\n useReason,\n useStructuredData,\n useWorkflowState,\n} from \"./hooks\";\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { GraphState, NodeContext } from \"@kortyx/core\";\nimport type { MemoryAdapter } from \"@kortyx/memory\";\nimport type { GetProviderFn } from \"@kortyx/providers\";\n\ntype NodeStateStore = {\n byIndex: unknown[];\n byKey: Record<string, unknown>;\n};\n\ntype HookMemory = {\n nodeState?: Record<string, unknown>;\n workflowState?: Record<string, unknown>;\n};\n\nexport type HookRuntimeContext = {\n node: NodeContext;\n state: GraphState;\n getProvider?: GetProviderFn;\n memoryAdapter?: MemoryAdapter;\n};\n\ntype HookInternalContext = HookRuntimeContext & {\n nodeStateIndex: number;\n reasonCallIndex: number;\n currentNodeState: NodeStateStore;\n workflowState: Record<string, unknown>;\n dirty: 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 getHookMemory = (state: GraphState): HookMemory => {\n const memory = (state.memory ?? {}) as Record<string, unknown>;\n const internal = isRecord(memory.__kortyx) ? memory.__kortyx : undefined;\n const result: HookMemory = {};\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 hookMemory = getHookMemory(ctx.state);\n const nodeId = ctx.node.graph.node;\n const storedNodeId =\n typeof (hookMemory.nodeState as any)?.nodeId === \"string\"\n ? String((hookMemory.nodeState as any)?.nodeId)\n : \"\";\n const storedState = (hookMemory.nodeState as any)?.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(hookMemory.workflowState),\n dirty: false,\n };\n};\n\nconst buildMemoryUpdates = (ctx: HookInternalContext) => {\n if (!ctx.dirty) return null;\n return {\n __kortyx: {\n nodeState: {\n nodeId: ctx.node.graph.node,\n state: ctx.currentNodeState,\n },\n workflowState: ctx.workflowState,\n },\n } as Record<string, unknown>;\n};\n\nexport async function runWithHookContext<T>(\n ctx: HookRuntimeContext,\n fn: () => Promise<T>,\n): Promise<{ result: T; memoryUpdates: Record<string, unknown> | null }> {\n const internal = createInternalContext(ctx);\n try {\n const result = await storage.run(internal, fn);\n return { result, memoryUpdates: buildMemoryUpdates(internal) };\n } catch (err) {\n const memoryUpdates = buildMemoryUpdates(internal);\n if (memoryUpdates) {\n const currentMemory = isRecord(internal.state.memory)\n ? (internal.state.memory as Record<string, unknown>)\n : {};\n internal.state.memory = {\n ...currentMemory,\n ...memoryUpdates,\n } as unknown as GraphState[\"memory\"];\n if (err && typeof err === \"object\") {\n (err as any).__kortyxMemoryUpdates = memoryUpdates;\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 { getHookContext } from \"./context\";\nimport type {\n StructuredDataMode,\n UseReasonStructuredConfig,\n UseStructuredDataArgs,\n} from \"./types\";\nimport { parseWithSchema } from \"./validation\";\n\nexport const emitStructuredData = <TData = unknown>(\n args: UseStructuredDataArgs<TData>,\n): void => {\n const ctx = getHookContext();\n const validated = parseWithSchema(\n args.dataSchema,\n args.data,\n \"useStructuredData data\",\n );\n\n ctx.node.emit(\"structured_data\", {\n node: ctx.node.graph.node,\n ...(typeof args.dataType === \"string\" && args.dataType.length > 0\n ? { dataType: args.dataType }\n : {}),\n ...(typeof args.mode === \"string\" ? { mode: args.mode } : {}),\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 ...(typeof args.opId === \"string\" && args.opId.length > 0\n ? { opId: args.opId }\n : {}),\n data: validated,\n });\n};\n\nexport const shouldEmitStructured = (\n cfg: UseReasonStructuredConfig | undefined,\n): boolean => (cfg?.stream ?? \"patch\") !== \"off\";\n\nexport const resolveStructuredMode = (\n cfg: UseReasonStructuredConfig | undefined,\n): StructuredDataMode => {\n const mode = cfg?.stream ?? \"patch\";\n if (mode === \"snapshot\") return \"snapshot\";\n if (mode === \"patch\") return \"patch\";\n return \"final\";\n};\n","import type { InterruptInput } from \"@kortyx/core\";\n\nexport type ReasonInterruptCheckpoint = {\n status: \"awaiting_interrupt\";\n request: InterruptInput;\n firstText: string;\n firstRaw?: unknown;\n firstOutput?: 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, \"firstOutput\")\n ? { firstOutput: value.firstOutput }\n : {}),\n };\n};\n\nexport const resolveHookMemoryPatch = (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 { ProviderModelRef } from \"@kortyx/providers\";\nimport { getHookContext } from \"../context\";\nimport type { RunReasonEngineResult } from \"../reason-engine\";\nimport { runReasonEngine } from \"../reason-engine\";\n\nexport type ReasonEngineInput = {\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | undefined;\n emit?: boolean | undefined;\n stream?: boolean | undefined;\n};\n\nexport const createRuntimeId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nexport async function reasonEngine(\n args: ReasonEngineInput,\n meta: { id?: string; opId: string },\n inputOverride?: string,\n): Promise<RunReasonEngineResult> {\n const ctx = getHookContext();\n const getProvider = ctx.getProvider;\n if (!getProvider) {\n throw new Error(\"useReason requires a provider factory in runtime config.\");\n }\n\n return runReasonEngine({\n getProvider,\n model: args.model,\n input: inputOverride ?? args.input,\n system: args.system,\n temperature: args.temperature,\n defaultTemperature: ctx.node.config?.model?.temperature,\n stream: args.stream,\n emit: args.emit,\n nodeId: ctx.node.graph.node,\n emitEvent: ctx.node.emit,\n id: meta.id,\n opId: meta.opId,\n });\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n GetProviderFn,\n KortyxPromptMessage,\n KortyxStreamChunk,\n ProviderModelRef,\n} from \"@kortyx/providers\";\n\nexport interface RunReasonEngineArgs {\n getProvider: GetProviderFn;\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | 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 id?: string | undefined;\n opId?: string | undefined;\n segmentId?: string | undefined;\n}\n\nexport interface RunReasonEngineResult {\n text: string;\n raw?: unknown;\n}\n\nconst chunkToText = (chunk: KortyxStreamChunk | string): string => {\n if (typeof chunk === \"string\") return chunk;\n if (typeof chunk.text === \"string\") return chunk.text;\n if (typeof chunk.content === \"string\") return chunk.content;\n return \"\";\n};\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\n const model = args.getProvider(args.model.providerId, args.model.modelId, {\n ...(temperature !== undefined ? { temperature } : {}),\n streaming: stream,\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\n if (stream) {\n let final = \"\";\n let raw: unknown;\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 const text = chunkToText(chunk);\n if (!text) continue;\n final += text;\n if (typeof chunk === \"object\" && chunk && \"raw\" in chunk) {\n raw = (chunk as KortyxStreamChunk).raw;\n }\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: text,\n });\n }\n }\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n return {\n text: final,\n ...(raw !== undefined ? { raw } : {}),\n };\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 return {\n text: response.content,\n ...(response.raw !== undefined ? { raw: response.raw } : {}),\n };\n}\n","import type { InterruptInput } from \"@kortyx/core\";\nimport type { SchemaLike } from \"../types\";\nimport { parseWithSchema } from \"../validation\";\n\nconst tryJsonParse = (\n value: string,\n): { ok: true; value: unknown } | { ok: false } => {\n try {\n return { ok: true, value: JSON.parse(value) };\n } catch {\n return { ok: false };\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\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}): {\n draftText: string;\n request: TRequest;\n output?: TOutput;\n} => {\n const candidate = resolveOutputCandidate(args.text);\n if (!isRecord(candidate)) {\n throw new Error(\n \"useReason first pass with interrupt must return a JSON object.\",\n );\n }\n\n const requestCandidates: unknown[] = [\n candidate.interruptRequest,\n candidate.request,\n candidate.interrupt,\n candidate,\n ];\n const requestPayload = requestCandidates.find(\n (value) => value !== null && value !== undefined,\n );\n\n const request = parseWithSchema(\n args.requestSchema,\n requestPayload,\n \"useReason interrupt.request\",\n );\n\n let output: TOutput | undefined;\n if (args.outputSchema) {\n const outputPayload = Object.hasOwn(candidate, \"output\")\n ? candidate.output\n : candidate;\n output = parseWithSchema(\n args.outputSchema,\n outputPayload,\n \"useReason output\",\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 return {\n draftText,\n request,\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}): string => {\n const base = 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 '{ \"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","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport { getHookContext } from \"../context\";\nimport { awaitInterruptInternal } from \"../interrupt\";\nimport {\n emitStructuredData,\n resolveStructuredMode,\n shouldEmitStructured,\n} from \"../structured\";\nimport type { SchemaLike, UseReasonArgs, UseReasonResult } from \"../types\";\nimport { parseWithSchema } from \"../validation\";\nimport {\n type ReasonInterruptCheckpoint,\n readReasonCheckpoint,\n resolveHookMemoryPatch,\n resolveReasonCheckpointKey,\n} from \"./checkpoint\";\nimport { createRuntimeId, reasonEngine } from \"./engine\";\nimport {\n parseInterruptFirstPassResult,\n resolveOutputCandidate,\n} from \"./parsing\";\nimport {\n defaultContinuationInput,\n defaultInterruptFirstPassInput,\n withOutputGuardrails,\n} from \"./prompting\";\n\nconst emitReasonStructuredOutput = <TOutput>(args: {\n id?: string;\n opId: string;\n output: TOutput;\n structured: UseReasonArgs<TOutput>[\"structured\"];\n}): void => {\n if (!shouldEmitStructured(args.structured)) return;\n\n emitStructuredData<TOutput>({\n dataType: args.structured?.dataType ?? \"reason-output\",\n data: args.output,\n mode: resolveStructuredMode(args.structured),\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 opId: args.opId,\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 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 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 suppressTextStream = Boolean(args.outputSchema || args.interrupt);\n\n let firstText = \"\";\n let firstRaw: unknown;\n let firstOutput: TOutput | undefined;\n let firstInterruptRequest: TRequest | undefined;\n\n let finalText = \"\";\n let finalRaw: unknown;\n let finalOutput: TOutput | undefined;\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 } else {\n const first = await reasonEngine(\n {\n ...args,\n emit: suppressTextStream ? false : args.emit,\n stream: suppressTextStream ? false : args.stream,\n },\n reasonMeta,\n args.interrupt\n ? defaultInterruptFirstPassInput({\n input: args.input,\n requestSchema: args.interrupt.requestSchema,\n ...(args.outputSchema\n ? { outputSchema: args.outputSchema as SchemaLike<unknown> }\n : {}),\n })\n : args.outputSchema\n ? withOutputGuardrails(\n args.input,\n args.outputSchema as SchemaLike<unknown>,\n )\n : undefined,\n );\n firstRaw = first.raw;\n finalRaw = first.raw;\n\n if (args.interrupt) {\n const firstPass = parseInterruptFirstPassResult<TRequest, TOutput>({\n text: first.text,\n requestSchema: args.interrupt.requestSchema,\n ...(args.outputSchema\n ? { outputSchema: args.outputSchema as SchemaLike<TOutput> }\n : {}),\n });\n firstText = firstPass.draftText;\n finalText = firstPass.draftText;\n firstInterruptRequest = firstPass.request;\n firstOutput = firstPass.output;\n finalOutput = firstPass.output;\n\n if (firstOutput !== undefined) {\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: firstOutput,\n structured: args.structured,\n });\n }\n } else {\n firstText = first.text;\n finalText = first.text;\n if (args.outputSchema) {\n firstOutput = parseWithSchema(\n args.outputSchema,\n resolveOutputCandidate(first.text),\n \"useReason output\",\n );\n\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: firstOutput,\n structured: args.structured,\n });\n }\n finalOutput = firstOutput;\n }\n }\n\n let interruptResponse: TResponse | undefined;\n\n if (args.interrupt) {\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 ...(firstOutput !== undefined ? { firstOutput } : {}),\n } satisfies ReasonInterruptCheckpoint;\n ctx.dirty = true;\n }\n\n const resumeMemoryPatch = resolveHookMemoryPatch({\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 __kortyxResumeMemory: resumeMemoryPatch,\n },\n });\n\n if (Object.hasOwn(ctx.currentNodeState.byKey, checkpointKey)) {\n delete ctx.currentNodeState.byKey[checkpointKey];\n ctx.dirty = 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\n if (args.outputSchema) {\n finalOutput = parseWithSchema(\n args.outputSchema,\n resolveOutputCandidate(finalText),\n \"useReason output\",\n );\n\n emitReasonStructuredOutput<TOutput>({\n ...(id ? { id } : {}),\n opId,\n output: finalOutput,\n structured: args.structured,\n });\n }\n }\n\n return {\n ...(id ? { id } : {}),\n opId,\n text: finalText,\n ...(finalRaw !== undefined ? { raw: finalRaw } : {}),\n ...(finalOutput !== undefined ? { output: finalOutput } : {}),\n ...(interruptResponse !== undefined ? { interruptResponse } : {}),\n };\n}\n","import type { InterruptInput, InterruptResult } from \"@kortyx/core\";\nimport type { MemoryAdapter } from \"@kortyx/memory\";\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 StructuredDataMode,\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonInterruptConfig,\n UseReasonResult,\n UseReasonStructuredConfig,\n UseReasonStructuredStreamMode,\n UseStructuredDataArgs,\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 useAiMemory(): MemoryAdapter {\n const ctx = getHookContext();\n if (!ctx.memoryAdapter) {\n throw new Error(\"useAiMemory requires a memory adapter in runtime config.\");\n }\n return ctx.memoryAdapter;\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 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.dirty = 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.dirty = true;\n };\n\n return [getValue(), setValue];\n}\n\nexport function useWorkflowState<T>(\n key: string,\n initialValue?: T,\n): [T, StateSetter<T>] {\n const ctx = getHookContext();\n const workflowState = ctx.workflowState;\n const hasInitial = arguments.length > 1;\n\n if (!Object.hasOwn(workflowState, key) && hasInitial) {\n workflowState[key] = initialValue as T;\n ctx.dirty = 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.dirty = true;\n };\n\n return [getValue(), setValue];\n}\n"],"mappings":"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","names":["useReason","import_node_crypto","response","createRuntimeId","isRecord","tryStringify","createRuntimeId","useReason"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kortyx/hooks",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Lifecycle hooks and extension points for Kortyx.",
|
|
6
6
|
"keywords": [
|
|
@@ -37,9 +37,9 @@
|
|
|
37
37
|
],
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"zod": "^4.1.13",
|
|
40
|
-
"@kortyx/
|
|
40
|
+
"@kortyx/memory": "0.3.1",
|
|
41
41
|
"@kortyx/providers": "0.3.2",
|
|
42
|
-
"@kortyx/
|
|
42
|
+
"@kortyx/core": "0.4.1"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"turbo": "^2.5.4",
|