@kortyx/runtime 0.21.6 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/framework/in-memory-checkpointer.ts","../src/checkpointer.ts","../src/framework/caching.ts","../src/framework/maintenance.ts","../src/framework/pending-requests.ts","../src/framework/postgres/adapter.ts","../src/framework/postgres/checkpointer.ts","../src/framework/postgres/store.ts","../src/framework/postgres/migrations/index.ts","../src/framework/postgres/migrations/0001-initial-runtime.ts","../src/framework/postgres/maintenance.ts","../src/framework/postgres/pending-request-store.ts","../src/framework/postgres/session-checkpoint-store.ts","../src/framework/graph-snapshot.ts","../src/framework/redis/pending-request-store.ts","../src/framework/redis/redis-checkpointer.ts","../src/framework/redis/redis-store.ts","../src/framework/redis/redis-client.ts","../src/framework/redis/session-checkpoint-store.ts","../src/framework/session-checkpoints.ts","../src/framework/adapter.ts","../src/graph/create-execution-graph.ts","../src/node-loader.ts","../src/node-registry.ts","../src/graph/call-workflow.ts","../src/graph/parallel-graph.ts","../src/interrupt/tokens.ts","../src/registry/file-registry.ts","../src/registry/in-memory-registry.ts","../src/state/build-initial-state.ts"],"sourcesContent":["// release-test: 2026-01-22\nexport * from \"./checkpointer\";\nexport * from \"./framework/adapter\";\nexport {\n type CreateCachingFrameworkAdapterOptions,\n createCachingFrameworkAdapter,\n} from \"./framework/caching\";\nexport * from \"./framework/graph-snapshot\";\nexport type {\n PruneRuntimeOptions,\n PruneRuntimeResult,\n RuntimeMaintenance,\n} from \"./framework/maintenance\";\nexport * from \"./framework/pending-requests\";\nexport * from \"./framework/postgres/adapter\";\nexport type { RuntimeRetentionPolicy } from \"./framework/postgres/store\";\nexport * from \"./framework/session-checkpoints\";\nexport * from \"./graph/create-execution-graph\";\nexport * from \"./interrupt/tokens\";\nexport * from \"./node-registry\";\nexport * from \"./registry/file-registry\";\nexport * from \"./registry/in-memory-registry\";\nexport * from \"./registry/interface\";\nexport * from \"./state/build-initial-state\";\n","import type { RunnableConfig } from \"@langchain/core/runnables\";\nimport {\n type BaseCheckpointSaver,\n type Checkpoint,\n type CheckpointListOptions,\n type CheckpointMetadata,\n type CheckpointTuple,\n copyCheckpoint,\n getCheckpointId,\n type PendingWrite,\n WRITES_IDX_MAP,\n} from \"@langchain/langgraph-checkpoint\";\n\ntype SerializerProtocol = {\n dumpsTyped: (data: any) => Promise<[string, Uint8Array]>;\n loadsTyped: (type: string, data: Uint8Array | string) => Promise<any>;\n};\n\ntype StoredCheckpoint = {\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n parentCheckpointId?: string | undefined;\n writes: Map<string, [string, string, unknown]>;\n};\n\nexport type InMemoryCheckpointSaverOptions = {\n /**\n * Maximum number of pending writes stored for a single checkpoint.\n * Prevents unbounded memory growth in dev servers.\n */\n maxWritesPerCheckpoint?: number;\n};\n\nconst utf8Bytes = (s: string) => new Uint8Array(Buffer.from(s, \"utf8\"));\nconst utf8String = (u8: Uint8Array | string) =>\n typeof u8 === \"string\" ? u8 : Buffer.from(u8).toString(\"utf8\");\n\nconst jsonSerde: SerializerProtocol = {\n async dumpsTyped(data: any) {\n return [\"json\", utf8Bytes(JSON.stringify(data))];\n },\n async loadsTyped(_type: string, data: Uint8Array | string) {\n return JSON.parse(utf8String(data));\n },\n};\n\nexport type InMemoryCheckpointSaver = BaseCheckpointSaver & {\n deleteThread: (threadId: string) => Promise<void>;\n deleteCheckpointWrites: (\n threadId: string,\n checkpointNs: string,\n checkpointId: string,\n ) => Promise<void>;\n getLatestCheckpointId: (\n threadId: string,\n checkpointNs?: string,\n ) => Promise<string | undefined>;\n};\n\n/**\n * Bounded in-memory checkpointer:\n * - Keeps only the latest checkpoint per (thread_id, checkpoint_ns)\n * - Keeps only a bounded number of pending writes for that checkpoint\n *\n * This is a safer dev default than the upstream in-memory saver, which can grow without bound.\n */\nexport function createInMemoryCheckpointSaver(\n options?: InMemoryCheckpointSaverOptions,\n): InMemoryCheckpointSaver {\n const maxWritesPerCheckpoint = options?.maxWritesPerCheckpoint ?? 2_000;\n\n // (threadId|ns) -> checkpointId\n const latest = new Map<string, string>();\n // (threadId|ns|id) -> stored\n const checkpoints = new Map<string, StoredCheckpoint>();\n\n const nsKey = (threadId: string, checkpointNs: string) =>\n `${threadId}\\u0001${checkpointNs}`;\n const chkKey = (\n threadId: string,\n checkpointNs: string,\n checkpointId: string,\n ) => `${threadId}\\u0001${checkpointNs}\\u0001${checkpointId}`;\n\n const saver: any = {\n serde: jsonSerde,\n\n async get(config: RunnableConfig) {\n const value = await saver.getTuple(config);\n return value ? value.checkpoint : undefined;\n },\n\n getNextVersion(current: number | string | undefined) {\n if (typeof current === \"string\") {\n throw new Error(\"Please override this method to use string versions.\");\n }\n return current !== undefined && typeof current === \"number\"\n ? current + 1\n : 1;\n },\n\n async getTuple(\n config: RunnableConfig,\n ): Promise<CheckpointTuple | undefined> {\n const threadId = config.configurable?.thread_id as string | undefined;\n const checkpointNs =\n (config.configurable?.checkpoint_ns as string | undefined) ?? \"\";\n if (!threadId) return undefined;\n\n const requested = getCheckpointId(config);\n const id = requested || latest.get(nsKey(threadId, checkpointNs));\n if (!id) return undefined;\n\n const stored = checkpoints.get(chkKey(threadId, checkpointNs, id));\n if (!stored) return undefined;\n\n const pendingWrites = Array.from(stored.writes.values());\n const tuple: CheckpointTuple = {\n config: {\n configurable: {\n thread_id: threadId,\n checkpoint_ns: checkpointNs,\n checkpoint_id: id,\n },\n },\n checkpoint: stored.checkpoint,\n metadata: stored.metadata,\n pendingWrites: pendingWrites as any,\n };\n\n if (stored.parentCheckpointId) {\n tuple.parentConfig = {\n configurable: {\n thread_id: threadId,\n checkpoint_ns: checkpointNs,\n checkpoint_id: stored.parentCheckpointId,\n },\n };\n }\n\n // The engine may mutate returned checkpoints while inspecting state.\n // Never expose the stored object (Redis already returns a decoded copy).\n return JSON.parse(JSON.stringify(tuple)) as CheckpointTuple;\n },\n\n async *list(_config: RunnableConfig, _options?: CheckpointListOptions) {\n // Not required for current runtime behavior.\n },\n\n async put(\n config: RunnableConfig,\n checkpoint: Checkpoint,\n metadata: CheckpointMetadata,\n _newVersions: Record<string, number | string>,\n ): Promise<RunnableConfig> {\n const threadId = config.configurable?.thread_id as string | undefined;\n const checkpointNs =\n (config.configurable?.checkpoint_ns as string | undefined) ?? \"\";\n if (!threadId) {\n throw new Error(\n 'Failed to put checkpoint: missing \"thread_id\" in config.configurable.',\n );\n }\n\n const ns = nsKey(threadId, checkpointNs);\n\n const prepared = copyCheckpoint(checkpoint as any);\n const entry: StoredCheckpoint = {\n checkpoint: prepared as any,\n metadata,\n parentCheckpointId: config.configurable?.checkpoint_id as\n | string\n | undefined,\n writes: new Map(),\n };\n\n const id = checkpoint.id;\n checkpoints.set(chkKey(threadId, checkpointNs, id), entry);\n latest.set(ns, id);\n\n return {\n configurable: {\n thread_id: threadId,\n checkpoint_ns: checkpointNs,\n checkpoint_id: id,\n },\n };\n },\n\n async putWrites(\n config: RunnableConfig,\n writes: PendingWrite[],\n taskId: string,\n ): Promise<void> {\n const threadId = config.configurable?.thread_id as string | undefined;\n const checkpointNs =\n (config.configurable?.checkpoint_ns as string | undefined) ?? \"\";\n const checkpointId = config.configurable?.checkpoint_id as\n | string\n | undefined;\n if (!threadId || !checkpointId) return;\n\n const stored = checkpoints.get(\n chkKey(threadId, checkpointNs, checkpointId),\n );\n if (!stored) return;\n\n for (let idx = 0; idx < writes.length; idx++) {\n const [channel, value] = writes[idx]!;\n const mappedIdx = WRITES_IDX_MAP[channel] ?? idx;\n const key = `${taskId},${mappedIdx}`;\n\n // HSETNX semantics for normal writes; always overwrite for special writes (negative mappedIdx)\n if (mappedIdx >= 0 && stored.writes.has(key)) continue;\n\n // Bound the number of writes to avoid unbounded growth in dev\n if (stored.writes.size >= maxWritesPerCheckpoint) break;\n\n stored.writes.set(key, [taskId, channel, value]);\n }\n },\n\n async deleteThread(threadId: string): Promise<void> {\n for (const k of Array.from(latest.keys())) {\n if (k.startsWith(`${threadId}\\u0001`)) latest.delete(k);\n }\n for (const k of Array.from(checkpoints.keys())) {\n if (k.startsWith(`${threadId}\\u0001`)) checkpoints.delete(k);\n }\n },\n\n async deleteCheckpointWrites(\n threadId: string,\n checkpointNs: string,\n checkpointId: string,\n ): Promise<void> {\n const stored = checkpoints.get(\n chkKey(threadId, checkpointNs, checkpointId),\n );\n stored?.writes.clear();\n },\n\n async getLatestCheckpointId(\n threadId: string,\n checkpointNs = \"\",\n ): Promise<string | undefined> {\n return latest.get(nsKey(threadId, checkpointNs));\n },\n };\n\n return saver as InMemoryCheckpointSaver;\n}\n","import type { BaseCheckpointSaver } from \"@langchain/langgraph-checkpoint\";\nimport { createInMemoryCheckpointSaver } from \"./framework/in-memory-checkpointer\";\n\nconst MAX_CHECKPOINTERS = 200;\nconst map = new Map<string, BaseCheckpointSaver>();\n\nexport function getCheckpointer(key: string): BaseCheckpointSaver {\n const k = key || \"__default__\";\n const existing = map.get(k);\n if (existing) return existing;\n\n const saver = createInMemoryCheckpointSaver();\n map.set(k, saver);\n\n // Simple FIFO eviction to avoid unbounded growth in long-lived dev servers.\n if (map.size > MAX_CHECKPOINTERS) {\n map.delete(map.keys().next().value as string);\n }\n\n return saver;\n}\n","import type { FrameworkAdapter, ManagedFrameworkAdapter } from \"./adapter\";\n\n/** Internal cache capability. It is separate from authoritative framework stores. */\nexport type FrameworkPayloadCache = {\n get: (key: string) => Promise<string | null>;\n set: (key: string, value: string, ttlMs: number) => Promise<void>;\n close?: () => Promise<void>;\n};\n\nconst providers = new WeakMap<\n FrameworkAdapter,\n { cache: FrameworkPayloadCache; ttlMs: number }\n>();\nconst attachedCaches = new WeakSet<FrameworkAdapter>();\nconst storageBindings = new WeakMap<\n FrameworkAdapter,\n (cache: FrameworkPayloadCache, ttlMs: number, timeoutMs: number) => void\n>();\n\nexport function registerFrameworkCache(\n adapter: FrameworkAdapter,\n cache: FrameworkPayloadCache,\n ttlMs: number,\n) {\n providers.set(adapter, { cache, ttlMs });\n}\n\nexport function registerFrameworkCacheStorage(\n adapter: FrameworkAdapter,\n bind: (\n cache: FrameworkPayloadCache,\n ttlMs: number,\n timeoutMs: number,\n ) => void,\n) {\n storageBindings.set(adapter, bind);\n}\n\nexport function validateFrameworkCacheOptions(\n ttlMs: number,\n timeoutMs: number,\n) {\n if (!Number.isSafeInteger(ttlMs) || ttlMs < 1)\n throw new TypeError(\"cache ttlMs must be a positive safe integer.\");\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 1000)\n throw new TypeError(\n \"cache timeoutMs must be a positive integer no greater than 1000.\",\n );\n}\n\nexport type CreateCachingFrameworkAdapterOptions<\n T extends ManagedFrameworkAdapter = ManagedFrameworkAdapter,\n> = {\n /** Authoritative storage. Currently supports the PostgreSQL adapter. */\n storage: T;\n /** Payload cache provider. Currently supports the Redis adapter. */\n cache: FrameworkAdapter;\n /** Cache operation budget. Default: 25 ms, maximum: 1000 ms. */\n timeoutMs?: number;\n};\n\n/** Attaches caching to storage before traffic, preserving every storage method and its identity.\n * The returned adapter owns shutdown of both inputs. Do not use the cache input as another storage backend.\n */\nexport function createCachingFrameworkAdapter<\n T extends ManagedFrameworkAdapter,\n>(options: CreateCachingFrameworkAdapterOptions<T>): T {\n const bind = storageBindings.get(options.storage);\n if (!bind)\n throw new TypeError(\n \"storage must support framework payload caching (currently PostgreSQL).\",\n );\n const provider = providers.get(options.cache);\n if (!provider)\n throw new TypeError(\n \"cache must provide framework payload caching (currently Redis).\",\n );\n if (attachedCaches.has(options.cache))\n throw new TypeError(\"The cache adapter already has a storage owner.\");\n const timeoutMs = options.timeoutMs ?? 25;\n validateFrameworkCacheOptions(provider.ttlMs, timeoutMs);\n bind(provider.cache, provider.ttlMs, timeoutMs);\n attachedCaches.add(options.cache);\n return options.storage;\n}\n","export type PruneRuntimeOptions = {\n /** Defaults to wall-clock time; future timestamps are rejected. */\n now?: Date;\n /** Maximum parent records removed per table. Default: 500, maximum: 1000. */\n batchSize?: number;\n};\n\nexport type PruneRuntimeResult = {\n skipped: boolean;\n hasMore: boolean;\n deleted: {\n pendingRequests: number;\n sessionCheckpoints: number;\n graphCheckpoints: number;\n sessions: number;\n runs: number;\n };\n};\n\nexport type RuntimeMaintenance = {\n /** Explicit, idempotent backend setup. Complete before serving requests. */\n setup: () => Promise<void>;\n /** App-scheduled cleanup. Redis uses native TTL; memory uses lazy expiry/count limits. */\n prune: (options?: PruneRuntimeOptions) => Promise<PruneRuntimeResult>;\n};\n\nexport function resolvePruneOptions(options: PruneRuntimeOptions = {}) {\n const now = options.now?.getTime() ?? Date.now();\n if (!Number.isSafeInteger(now) || now < 0 || now > Date.now())\n throw new TypeError(\n \"prune now must be a valid date no later than the current time.\",\n );\n const batchSize = options.batchSize ?? 500;\n if (!Number.isSafeInteger(batchSize) || batchSize < 1 || batchSize > 1000)\n throw new TypeError(\n \"batchSize must be a positive integer no greater than 1000.\",\n );\n return { now, batchSize };\n}\n\nexport function emptyPruneResult(): PruneRuntimeResult {\n return {\n skipped: false,\n hasMore: false,\n deleted: {\n pendingRequests: 0,\n sessionCheckpoints: 0,\n graphCheckpoints: 0,\n sessions: 0,\n runs: 0,\n },\n };\n}\n","import type { GraphState } from \"@kortyx/core\";\nimport type { GraphSnapshotBundle } from \"./graph-snapshot\";\n\nexport type HumanInputKind = \"choice\" | \"multi-choice\" | \"text\" | \"custom\";\n\nexport interface HumanInputOption {\n id: string;\n label: string;\n description?: string;\n value?: unknown;\n}\n\nexport interface PendingRequestRecord {\n ready?: boolean;\n responseCompleted?: boolean;\n token: string;\n requestId: string;\n sessionId?: string | undefined;\n /**\n * Framework run identifier used by the checkpointer (thread_id).\n * This must be stable across interrupt/resume, but should not be reused for new messages.\n */\n runId: string;\n /**\n * LangGraph checkpoint id for the paused interrupt within the run thread.\n * Used to resume from the correct interrupt after session rollback.\n */\n graphCheckpointId?: string | undefined;\n graphSnapshot?: GraphSnapshotBundle;\n workflow: string;\n node: string;\n state?: GraphState;\n schema: {\n kind: HumanInputKind;\n multiple: boolean;\n question?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n contract?: string;\n request?: unknown;\n meta?: Record<string, unknown>;\n };\n options: HumanInputOption[];\n createdAt: number;\n ttlMs: number;\n}\n\nexport interface PendingRequestStore {\n list?: () => Promise<PendingRequestRecord[]>;\n take?: (token: string) => Promise<PendingRequestRecord | null>;\n save: (rec: PendingRequestRecord) => Promise<void>;\n get: (token: string) => Promise<PendingRequestRecord | null>;\n delete: (token: string) => Promise<void>;\n update: (\n token: string,\n patch: Partial<PendingRequestRecord>,\n ) => Promise<void>;\n}\n\nexport function createInMemoryPendingRequestStore(): PendingRequestStore & {\n pruneExpired: (now: number, batchSize: number) => number;\n} {\n const store = new Map<string, PendingRequestRecord>();\n\n const pruneExpired = (t: number, batchSize: number) => {\n let deleted = 0;\n for (const [k, v] of store.entries()) {\n if (deleted === batchSize) break;\n if (t - v.createdAt > v.ttlMs) {\n store.delete(k);\n deleted++;\n }\n }\n return deleted;\n };\n const prune = () => pruneExpired(Date.now(), Number.POSITIVE_INFINITY);\n\n return {\n pruneExpired,\n async list() {\n prune();\n return JSON.parse(\n JSON.stringify([...store.values()]),\n ) as PendingRequestRecord[];\n },\n async take(token) {\n prune();\n const record = store.get(token);\n store.delete(token);\n return record\n ? (JSON.parse(JSON.stringify(record)) as PendingRequestRecord)\n : null;\n },\n async save(rec) {\n prune();\n store.set(rec.token, rec);\n },\n async get(token) {\n prune();\n return store.get(token) ?? null;\n },\n async delete(token) {\n store.delete(token);\n },\n async update(token, patch) {\n const prev = store.get(token);\n if (!prev) return;\n store.set(token, { ...prev, ...patch });\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { PersistenceError } from \"@kortyx/core/errors\";\nimport type { ManagedFrameworkAdapter } from \"../adapter\";\nimport { registerFrameworkCacheStorage } from \"../caching\";\nimport { PostgresCheckpointSaver } from \"./checkpointer\";\nimport { createRuntimeMaintenance } from \"./maintenance\";\nimport { createPostgresPendingRequestStore } from \"./pending-request-store\";\nimport { createPostgresSessionCheckpointStore } from \"./session-checkpoint-store\";\nimport {\n PostgresRuntimeStore,\n positiveInteger,\n type RuntimeRetentionPolicy,\n} from \"./store\";\n\nexport type CreatePostgresFrameworkAdapterOptions = {\n connectionString: string;\n /** Isolates applications sharing the runtime tables. Default: \"default\". */\n namespace?: string;\n /** Interrupt lifetime, independent of checkpoint retention. Default: 15 minutes. */\n ttlMs?: number;\n retention?: RuntimeRetentionPolicy;\n};\n\nexport type PostgresFrameworkAdapter = ManagedFrameworkAdapter & {\n kind: \"postgres\";\n checkpointer: PostgresCheckpointSaver;\n /** Closes owned connections. Call after in-flight executions have completed. */\n close: () => Promise<void>;\n};\n\nexport function createPostgresFrameworkAdapter(\n options: CreatePostgresFrameworkAdapterOptions,\n): PostgresFrameworkAdapter {\n const ttlMs = positiveInteger(\"ttlMs\", options.ttlMs ?? 15 * 60 * 1000);\n const store = new PostgresRuntimeStore(\n options.connectionString,\n options.namespace ?? \"default\",\n options.retention ?? {},\n );\n const saver = new PostgresCheckpointSaver(store);\n const adapter: PostgresFrameworkAdapter = {\n kind: \"postgres\",\n ttlMs,\n checkpointer: saver,\n pendingRequests: createPostgresPendingRequestStore(store),\n sessionCheckpoints: createPostgresSessionCheckpointStore(store, saver),\n maintenance: createRuntimeMaintenance(store),\n // Completed runs remain available until maintenance applies retention.\n cleanupRun: async (runId) =>\n store.transaction((sql) => store.touchRun(sql, runId)),\n acquireRunLease: async ({ runId, sessionId, onLost }) => {\n const token = randomUUID();\n const renew = async () => {\n await store.transaction(async (sql) => {\n if (sessionId) await store.touchSession(sql, sessionId);\n const rows =\n await sql`UPDATE kortyx_runtime_runs SET lease_until = ${Date.now() + 120_000}, last_activity = ${Date.now()}\n WHERE scope = ${store.scope} AND id = ${runId} AND lease_token = ${token}\n AND lease_until > ${Date.now()} RETURNING id`;\n if (!rows.length)\n throw new PersistenceError(\"The runtime execution lease was lost.\");\n });\n };\n await store.transaction(async (sql) => {\n if (sessionId) await store.touchSession(sql, sessionId);\n const rows =\n await sql`INSERT INTO kortyx_runtime_runs AS r (scope, id, last_activity, lease_token, lease_until, session_id)\n VALUES (${store.scope}, ${runId}, ${Date.now()}, ${token}, ${Date.now() + 120_000}, ${sessionId ?? null})\n ON CONFLICT (scope, id) DO UPDATE SET last_activity = EXCLUDED.last_activity,\n revision = r.revision + 1, lease_token = EXCLUDED.lease_token,\n lease_until = EXCLUDED.lease_until, session_id = EXCLUDED.session_id\n WHERE r.lease_until <= ${Date.now()} RETURNING id`;\n if (!rows.length)\n throw new PersistenceError(\"This runtime run is already executing.\");\n });\n let renewing: Promise<void> | undefined;\n let stopped = false;\n let deadline: NodeJS.Timeout;\n const lost = (cause: unknown) => {\n if (stopped) return;\n stopped = true;\n clearInterval(timer);\n clearTimeout(deadline);\n onLost(cause);\n };\n const armDeadline = () => {\n clearTimeout(deadline);\n // Abort before the database lease expires, including when a renewal is hung on I/O.\n deadline = setTimeout(\n () =>\n lost(new PersistenceError(\"Execution lease renewal timed out.\")),\n 90_000,\n );\n deadline.unref();\n };\n const timer = setInterval(() => {\n if (stopped || renewing) return;\n renewing = renew()\n .then(() => {\n if (!stopped) armDeadline();\n })\n .catch(lost)\n .finally(() => {\n renewing = undefined;\n });\n }, 30_000);\n timer.unref();\n armDeadline();\n return async () => {\n stopped = true;\n clearInterval(timer);\n clearTimeout(deadline);\n await renewing;\n await store.transaction(async (sql) => {\n await sql`UPDATE kortyx_runtime_runs SET lease_token = NULL, lease_until = 0, last_activity = ${Date.now()}\n WHERE scope = ${store.scope} AND id = ${runId} AND lease_token = ${token}`;\n });\n };\n },\n close: () => store.close(),\n };\n registerFrameworkCacheStorage(adapter, (cache, ttlMs, timeoutMs) =>\n store.attachCache(cache, ttlMs, timeoutMs),\n );\n return adapter;\n}\n","import { PersistenceError } from \"@kortyx/core/errors\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport {\n BaseCheckpointSaver,\n type Checkpoint,\n type CheckpointListOptions,\n type CheckpointMetadata,\n type CheckpointTuple,\n copyCheckpoint,\n getCheckpointId,\n type PendingWrite,\n WRITES_IDX_MAP,\n} from \"@langchain/langgraph-checkpoint\";\nimport type postgres from \"postgres\";\nimport { clone, type PostgresRuntimeStore } from \"./store\";\n\nconst configFor = (runId: string, ns: string, id: string): RunnableConfig => ({\n configurable: { thread_id: runId, checkpoint_ns: ns, checkpoint_id: id },\n});\n\ntype StoredGraphCheckpoint = {\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n parentCheckpointId?: string;\n};\n\n/** Kortyx-owned checkpoint format and relational persistence, independent of LangGraph saver packages. */\nexport class PostgresCheckpointSaver extends BaseCheckpointSaver {\n constructor(private readonly store: PostgresRuntimeStore) {\n super({\n dumpsTyped: async (data: unknown): Promise<[string, Uint8Array]> => [\n \"json\",\n Buffer.from(JSON.stringify(data)),\n ],\n loadsTyped: async (_type: string, data: Uint8Array | string) =>\n JSON.parse(\n typeof data === \"string\" ? data : Buffer.from(data).toString(\"utf8\"),\n ),\n });\n }\n\n override async getTuple(\n config: RunnableConfig,\n ): Promise<CheckpointTuple | undefined> {\n const runId = config.configurable?.thread_id as string | undefined;\n if (!runId) return undefined;\n const ns = (config.configurable?.checkpoint_ns as string | undefined) ?? \"\";\n const id = getCheckpointId(config);\n const { sql, scope } = this.store;\n const rows = await this.store.query(sql`SELECT g.id, g.position, r.revision\n FROM kortyx_runtime_graph_checkpoints g\n JOIN kortyx_runtime_runs r ON r.scope = g.scope AND r.id = g.run_id\n WHERE g.scope = ${scope} AND g.run_id = ${runId} AND g.ns = ${ns}\n AND g.record ? 'checkpoint'\n ${id ? sql`AND g.id = ${id}` : sql``}\n AND ${this.store.liveRun(sql, Date.now())}\n ORDER BY g.position DESC LIMIT 1`);\n const row = rows[0];\n if (!row) return undefined;\n // Validate existence and visibility in PostgreSQL even on a cache hit. Revision covers pending writes.\n return this.store.payload(\n [\"graph\", runId, ns, row.id, row.position, row.revision],\n async () => {\n const [records, writes] = await Promise.all([\n this.store.query(sql`SELECT record FROM kortyx_runtime_graph_checkpoints\n WHERE scope = ${scope} AND run_id = ${runId} AND ns = ${ns} AND id = ${row.id}`),\n this.store.query(sql`SELECT task_id, channel, value FROM kortyx_runtime_graph_writes\n WHERE scope = ${scope} AND run_id = ${runId} AND ns = ${ns} AND checkpoint_id = ${row.id}\n ORDER BY task_id, idx`),\n ]);\n if (!records[0]) return undefined;\n const record = records[0].record as StoredGraphCheckpoint;\n return {\n config: configFor(runId, ns, row.id),\n checkpoint: record.checkpoint,\n metadata: record.metadata,\n ...(record.parentCheckpointId\n ? { parentConfig: configFor(runId, ns, record.parentCheckpointId) }\n : {}),\n pendingWrites: writes.map(\n (write) =>\n [\n write.task_id,\n write.channel,\n (write.value as { value: unknown }).value,\n ] as [string, string, unknown],\n ),\n };\n },\n );\n }\n\n override async *list(\n config: RunnableConfig,\n options?: CheckpointListOptions,\n ): AsyncGenerator<CheckpointTuple> {\n const { sql, scope } = this.store;\n const runId = config.configurable?.thread_id as string | undefined;\n const ns = config.configurable?.checkpoint_ns as string | undefined;\n const id = getCheckpointId(config);\n const before = options?.before\n ? getCheckpointId(options.before)\n : undefined;\n const rows =\n await this.store.query(sql`SELECT g.run_id, g.ns, g.id FROM kortyx_runtime_graph_checkpoints g\n JOIN kortyx_runtime_runs r ON r.scope = g.scope AND r.id = g.run_id\n WHERE g.scope = ${scope} AND ${this.store.liveRun(sql, Date.now())}\n AND g.record ? 'checkpoint'\n ${runId ? sql`AND g.run_id = ${runId}` : sql``}\n ${ns !== undefined ? sql`AND g.ns = ${ns}` : sql``}\n ${id ? sql`AND g.id = ${id}` : sql``}\n ${before ? sql`AND g.id < ${before}` : sql``}\n ${options?.filter ? sql`AND g.record->'metadata' @> ${sql.json(clone(options.filter))}` : sql``}\n ORDER BY g.id DESC ${options?.limit !== undefined ? sql`LIMIT ${options.limit}` : sql``}`);\n for (const row of rows) {\n const tuple = await this.getTuple(configFor(row.run_id, row.ns, row.id));\n if (tuple) yield tuple;\n }\n }\n\n override async put(\n config: RunnableConfig,\n checkpoint: Checkpoint,\n metadata: CheckpointMetadata,\n _newVersions: Record<string, number | string>,\n ): Promise<RunnableConfig> {\n const runId = config.configurable?.thread_id as string | undefined;\n if (!runId)\n throw new PersistenceError(\n 'Failed to put checkpoint: missing \"thread_id\".',\n );\n const ns = (config.configurable?.checkpoint_ns as string | undefined) ?? \"\";\n const parentCheckpointId = config.configurable?.checkpoint_id as\n | string\n | undefined;\n const record: StoredGraphCheckpoint = {\n checkpoint: copyCheckpoint(checkpoint),\n metadata,\n ...(parentCheckpointId ? { parentCheckpointId } : {}),\n };\n await this.store.transaction(async (sql) => {\n await this.store.touchRun(sql, runId);\n await sql`INSERT INTO kortyx_runtime_graph_checkpoints (scope, run_id, ns, id, record)\n VALUES (${this.store.scope}, ${runId}, ${ns}, ${checkpoint.id}, ${sql.json(clone(record) as unknown as postgres.JSONValue)})\n ON CONFLICT (scope, run_id, ns, id) DO UPDATE SET record = EXCLUDED.record,\n position = EXCLUDED.position`;\n });\n return configFor(runId, ns, checkpoint.id);\n }\n\n override async putWrites(\n config: RunnableConfig,\n writes: PendingWrite[],\n taskId: string,\n ): Promise<void> {\n const runId = config.configurable?.thread_id as string | undefined;\n const id = getCheckpointId(config);\n if (!runId || !id)\n throw new PersistenceError(\n 'Failed to put writes: missing \"thread_id\" or \"checkpoint_id\".',\n );\n const ns = (config.configurable?.checkpoint_ns as string | undefined) ?? \"\";\n await this.store.transaction(async (sql) => {\n await this.store.touchRun(sql, runId);\n // The engine may enqueue task writes before its asynchronous checkpoint save.\n // An unreadable placeholder preserves the foreign key and cascaded cleanup;\n // put() publishes the complete record without discarding those early writes.\n await sql`INSERT INTO kortyx_runtime_graph_checkpoints (scope, run_id, ns, id, record)\n VALUES (${this.store.scope}, ${runId}, ${ns}, ${id}, ${sql.json({})})\n ON CONFLICT (scope, run_id, ns, id) DO NOTHING`;\n const rows = new Map<\n number,\n {\n scope: string;\n run_id: string;\n ns: string;\n checkpoint_id: string;\n task_id: string;\n idx: number;\n channel: string;\n value: ReturnType<typeof sql.json>;\n }\n >();\n for (const [idx, [channel, value]] of writes.entries()) {\n const mapped = WRITES_IDX_MAP[channel] ?? idx;\n rows.set(mapped, {\n scope: this.store.scope,\n run_id: runId,\n ns,\n checkpoint_id: id,\n task_id: taskId,\n idx: mapped,\n channel,\n value: sql.json({\n value: clone(value ?? null),\n } as postgres.JSONValue),\n });\n }\n if (rows.size)\n await sql`INSERT INTO kortyx_runtime_graph_writes\n ${sql([...rows.values()], \"scope\", \"run_id\", \"ns\", \"checkpoint_id\", \"task_id\", \"idx\", \"channel\", \"value\")}\n ON CONFLICT (scope, run_id, ns, checkpoint_id, task_id, idx)\n DO UPDATE SET channel = EXCLUDED.channel, value = EXCLUDED.value WHERE EXCLUDED.idx < 0`;\n });\n }\n\n override async deleteThread(runId: string): Promise<void> {\n await this.store.transaction(async (sql) => {\n await sql`DELETE FROM kortyx_runtime_runs WHERE scope = ${this.store.scope} AND id = ${runId}`;\n });\n }\n\n async deleteCheckpointWrites(\n runId: string,\n ns: string,\n id: string,\n ): Promise<void> {\n await this.store.transaction(async (sql) => {\n await this.store.touchRun(sql, runId);\n await sql`DELETE FROM kortyx_runtime_graph_writes\n WHERE scope = ${this.store.scope} AND run_id = ${runId} AND ns = ${ns} AND checkpoint_id = ${id}`;\n });\n }\n\n async getLatestCheckpointId(\n runId: string,\n ns = \"\",\n ): Promise<string | undefined> {\n return (\n await this.getTuple({\n configurable: { thread_id: runId, checkpoint_ns: ns },\n })\n )?.checkpoint.id;\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { KortyxError, PersistenceError } from \"@kortyx/core/errors\";\nimport postgres from \"postgres\";\nimport {\n type FrameworkPayloadCache,\n validateFrameworkCacheOptions,\n} from \"../caching\";\nimport type { RedisFrameworkStore } from \"../redis/redis-store\";\nimport { runRuntimeMigrations } from \"./migrations\";\n\nexport type RuntimeSql = postgres.Sql | postgres.TransactionSql;\n\nexport type RuntimeRetentionPolicy = {\n /** Rolling history window. The current head and live runs are protected. Default: 30. */\n checkpointHistoryDays?: number;\n /** Inactivity window for a session. Unexpired interrupts and live runs protect it. Default: 30. */\n inactiveSessionDays?: number;\n};\n\nexport const positiveInteger = (name: string, value: number): number => {\n if (!Number.isSafeInteger(value) || value <= 0)\n throw new TypeError(`${name} must be a positive safe integer.`);\n return value;\n};\n\nexport const clone = <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T;\n\n/** Internal relational storage. Redis never controls visibility or token consumption. */\nexport class PostgresRuntimeStore {\n readonly sql: postgres.Sql;\n readonly scope: string;\n readonly historyMs: number;\n readonly sessionMs: number;\n private readonly cachePrefix: string;\n private cacheRetryAfter = 0;\n private cacheClosed = false;\n private readonly cachePopulations = new Map<string, Promise<void>>();\n\n constructor(\n connectionString: string,\n namespace: string,\n retention: RuntimeRetentionPolicy,\n private cache?: Pick<RedisFrameworkStore, \"get\" | \"set\" | \"close\">,\n private cacheTtlMs = 15 * 60 * 1000,\n private cacheTimeoutMs = 25,\n ) {\n const url = new URL(connectionString);\n if (![\"postgres:\", \"postgresql:\"].includes(url.protocol))\n throw new TypeError(\"connectionString must be a PostgreSQL URL.\");\n if (!namespace) throw new TypeError(\"namespace must not be empty.\");\n this.scope = namespace;\n this.historyMs =\n positiveInteger(\n \"checkpointHistoryDays\",\n retention.checkpointHistoryDays ?? 30,\n ) * 86_400_000;\n this.sessionMs =\n positiveInteger(\n \"inactiveSessionDays\",\n retention.inactiveSessionDays ?? 30,\n ) * 86_400_000;\n positiveInteger(\"checkpoint history duration\", this.historyMs);\n positiveInteger(\"session retention duration\", this.sessionMs);\n validateFrameworkCacheOptions(cacheTtlMs, cacheTimeoutMs);\n this.sql = postgres(connectionString, {\n max: 10,\n connect_timeout: 5,\n onnotice: () => {},\n });\n this.cachePrefix = createHash(\"sha256\")\n .update(`${connectionString}\\0${namespace}`)\n .digest(\"hex\");\n }\n\n get cacheEnabled(): boolean {\n return Boolean(this.cache);\n }\n\n attachCache(\n cache: FrameworkPayloadCache,\n ttlMs: number,\n timeoutMs: number,\n ): void {\n if (this.cacheClosed)\n throw new TypeError(\"Cannot configure a closed storage adapter.\");\n if (this.cache)\n throw new TypeError(\"Storage already has a framework cache.\");\n validateFrameworkCacheOptions(ttlMs, timeoutMs);\n this.cache = cache;\n this.cacheTtlMs = ttlMs;\n this.cacheTimeoutMs = timeoutMs;\n }\n\n async setup(): Promise<void> {\n await this.query(runRuntimeMigrations(this.sql));\n }\n\n async query<T>(query: PromiseLike<T>): Promise<T> {\n try {\n return await query;\n } catch (cause) {\n if (cause instanceof KortyxError) throw cause;\n throw new PersistenceError(\"PostgreSQL runtime operation failed.\", cause);\n }\n }\n\n async transaction<T>(\n operation: (sql: postgres.TransactionSql) => Promise<T>,\n ): Promise<T> {\n try {\n return (await this.sql.begin(async (sql) => {\n // Maintenance takes the exclusive counterpart. Ordinary mutations may run concurrently.\n await sql`SELECT pg_advisory_xact_lock_shared(hashtextextended(${`kortyx:runtime:${this.scope}`}, 0))`;\n return operation(sql);\n })) as T;\n } catch (cause) {\n if (cause instanceof KortyxError) throw cause;\n throw new PersistenceError(\"PostgreSQL runtime operation failed.\", cause);\n }\n }\n\n liveSession(sql: RuntimeSql, now: number) {\n return sql`(s.last_activity > ${now - this.sessionMs}\n OR EXISTS (SELECT 1 FROM kortyx_runtime_pending_requests p\n WHERE p.scope = s.scope AND p.session_id = s.id AND p.expires_at > ${now})\n OR EXISTS (SELECT 1 FROM kortyx_runtime_runs r\n WHERE r.scope = s.scope AND r.session_id = s.id AND r.lease_until > ${now}))`;\n }\n\n liveCheckpoint(sql: RuntimeSql, now: number) {\n return sql`(c.created_at > ${now - this.historyMs} OR s.head_id = c.id\n OR EXISTS (SELECT 1 FROM kortyx_runtime_pending_requests p\n WHERE p.scope = c.scope AND p.run_id = c.run_id AND p.expires_at > ${now})\n OR EXISTS (SELECT 1 FROM kortyx_runtime_runs r\n WHERE r.scope = c.scope AND r.id = c.run_id AND r.lease_until > ${now}))`;\n }\n\n liveRun(sql: RuntimeSql, now: number) {\n return sql`(r.last_activity > ${now - this.historyMs} OR r.lease_until > ${now}\n OR EXISTS (SELECT 1 FROM kortyx_runtime_pending_requests p\n WHERE p.scope = r.scope AND p.run_id = r.id AND p.expires_at > ${now})\n OR EXISTS (SELECT 1 FROM kortyx_runtime_session_checkpoints c\n JOIN kortyx_runtime_sessions s ON s.scope = c.scope AND s.id = c.session_id\n WHERE c.scope = r.scope AND c.run_id = r.id\n AND ${this.liveSession(sql, now)} AND ${this.liveCheckpoint(sql, now)}))`;\n }\n\n async touchRun(sql: postgres.TransactionSql, runId: string): Promise<void> {\n await sql`INSERT INTO kortyx_runtime_runs (scope, id, last_activity)\n VALUES (${this.scope}, ${runId}, ${Date.now()})\n ON CONFLICT (scope, id) DO UPDATE SET last_activity = EXCLUDED.last_activity,\n revision = kortyx_runtime_runs.revision + 1`;\n }\n\n async touchSession(\n sql: postgres.TransactionSql,\n sessionId: string,\n ): Promise<void> {\n const updated =\n await sql`INSERT INTO kortyx_runtime_sessions AS s (scope, id, last_activity)\n VALUES (${this.scope}, ${sessionId}, ${Date.now()})\n ON CONFLICT (scope, id) DO UPDATE SET last_activity = EXCLUDED.last_activity\n WHERE ${this.liveSession(sql, Date.now())} RETURNING id`;\n if (!updated.length)\n throw new KortyxError(\n \"SESSION_EXPIRED\",\n \"The runtime session has expired. Start a new session.\",\n {\n category: \"request\",\n retryable: false,\n safeMessage: \"This session has expired. Start a new session.\",\n },\n );\n }\n\n async payload<T>(key: unknown[], load: () => Promise<T>): Promise<T> {\n const cacheKey = `${this.cachePrefix}:${createHash(\"sha256\").update(JSON.stringify(key)).digest(\"hex\")}`;\n const cache = this.cache;\n if (cache && !this.cacheClosed && Date.now() >= this.cacheRetryAfter) {\n try {\n const raw = await this.cacheCall(() => cache.get(cacheKey));\n if (raw) return JSON.parse(raw) as T;\n } catch {\n this.cacheRetryAfter = Date.now() + 5000;\n /* PostgreSQL remains available when Redis fails. */\n }\n }\n const value = await load();\n if (\n cache &&\n !this.cacheClosed &&\n Date.now() >= this.cacheRetryAfter &&\n value !== undefined &&\n value !== null &&\n !this.cachePopulations.has(cacheKey) &&\n this.cachePopulations.size < 10\n ) {\n // Payload cache writes never delay authoritative reads. Bound and deduplicate\n // work so a slow cache cannot create an unbounded background queue.\n const population = this.cacheCall(() =>\n cache.set(cacheKey, JSON.stringify(value), this.cacheTtlMs),\n )\n .then(() => {})\n .catch(() => {\n this.cacheRetryAfter = Date.now() + 5000;\n })\n .finally(() => {\n this.cachePopulations.delete(cacheKey);\n });\n this.cachePopulations.set(cacheKey, population);\n }\n return value;\n }\n\n private async cacheCall<T>(operation: () => Promise<T>): Promise<T> {\n let timer: NodeJS.Timeout | undefined;\n try {\n return await Promise.race([\n operation(),\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n void this.cache?.close?.().catch(() => {});\n reject(new Error(\"Runtime cache operation timed out.\"));\n }, this.cacheTimeoutMs);\n timer.unref();\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n }\n\n async close(): Promise<void> {\n this.cacheClosed = true;\n try {\n await Promise.all(this.cachePopulations.values());\n await this.cache?.close?.();\n } finally {\n await this.sql.end({ timeout: 5 });\n }\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { PersistenceError } from \"@kortyx/core/errors\";\nimport type postgres from \"postgres\";\nimport { initialRuntimeMigration } from \"./0001-initial-runtime\";\n\nexport type RuntimeMigration = {\n readonly version: number;\n readonly description: string;\n readonly sql: string;\n};\n\n/** Bundle SQL into the SDK; no filesystem reads or extra migration dependency. */\nexport const runtimeMigrations: readonly RuntimeMigration[] = Object.freeze([\n initialRuntimeMigration,\n]);\n\n/** Internal runner. The explicit migration list is used by real-database upgrade tests. */\nexport async function runRuntimeMigrations(\n database: postgres.Sql,\n migrations: readonly RuntimeMigration[] = runtimeMigrations,\n): Promise<void> {\n if (!migrations.length)\n throw new TypeError(\"Runtime migrations must include version 1.\");\n for (const [index, migration] of migrations.entries()) {\n if (migration.version !== index + 1 || !migration.sql.trim())\n throw new TypeError(\n \"Runtime migrations must contain nonempty SQL with consecutive versions starting at 1.\",\n );\n }\n\n const checksums = migrations.map((migration) =>\n createHash(\"sha256\").update(migration.sql).digest(\"hex\"),\n );\n\n for (const migration of migrations) {\n try {\n await database.begin(\"isolation level read committed\", async (sql) => {\n // Recheck history under the lock for every version: concurrent setup calls\n // may interleave between commits, but a version can only be applied once.\n // Bound both advisory and DDL lock waits without relaxing a stricter\n // deployment-configured timeout. Transaction-local settings do not leak\n // into the pool's application queries.\n await sql`SELECT set_config('lock_timeout', CASE WHEN current_setting('lock_timeout')::interval = interval '0' OR current_setting('lock_timeout')::interval > interval '5 seconds' THEN '5s' ELSE current_setting('lock_timeout') END, true)`;\n await sql`SELECT pg_advisory_xact_lock(hashtextextended('kortyx:runtime:schema', 0))`;\n await sql`CREATE TABLE IF NOT EXISTS kortyx_runtime_migrations (version integer PRIMARY KEY, checksum text)`;\n const checksumColumn =\n await sql`SELECT 1 FROM pg_attribute WHERE attrelid = 'kortyx_runtime_migrations'::regclass AND attname = 'checksum' AND NOT attisdropped`;\n const legacyLedger = !checksumColumn.length;\n if (legacyLedger)\n await sql`ALTER TABLE kortyx_runtime_migrations ADD COLUMN checksum text`;\n const applied = await sql<\n { version: number; checksum: string | null }[]\n >`SELECT version, checksum FROM kortyx_runtime_migrations ORDER BY version`;\n if (applied.some((row) => row.version > migrations.length))\n throw new PersistenceError(\n \"The runtime schema is newer than this SDK supports.\",\n );\n if (\n applied.some((row, index) => row.version !== index + 1) ||\n applied.length < migration.version - 1\n )\n throw new PersistenceError(\n \"The runtime migration history is not a consecutive sequence starting at version 1.\",\n );\n for (const row of applied) {\n const expected = checksums[row.version - 1]!;\n // The original unreleased v1 bootstrap recorded only its version.\n // Adopt that baseline once; its prior SQL cannot be verified retroactively.\n if (legacyLedger && applied.length === 1 && row.version === 1) {\n await sql`UPDATE kortyx_runtime_migrations SET checksum = ${expected} WHERE version = 1`;\n } else if (row.checksum !== expected) {\n throw new PersistenceError(\n `Runtime migration ${row.version} checksum does not match this SDK. Restore the original migration; add a new version for changes.`,\n );\n }\n }\n if (migration.version <= applied.length) return;\n\n await sql.unsafe(migration.sql);\n await sql`INSERT INTO kortyx_runtime_migrations (version, checksum) VALUES (${migration.version}, ${checksums[migration.version - 1]!})`;\n });\n } catch (cause) {\n if (cause instanceof PersistenceError) throw cause;\n throw new PersistenceError(\n `Runtime migration ${migration.version} (${migration.description}) failed.`,\n cause,\n );\n }\n }\n}\n","// Released migrations are immutable. Add a new numbered migration for schema changes.\nexport const initialRuntimeMigration = Object.freeze({\n version: 1,\n description: \"Initial runtime persistence tables\",\n sql: `\nCREATE TABLE IF NOT EXISTS kortyx_runtime_sessions (\n scope text NOT NULL, id text NOT NULL, head_id text,\n last_activity bigint NOT NULL, next_turn bigint NOT NULL DEFAULT 0,\n PRIMARY KEY (scope, id)\n);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_sessions_activity\n ON kortyx_runtime_sessions (scope, last_activity);\nCREATE TABLE IF NOT EXISTS kortyx_runtime_runs (\n scope text NOT NULL, id text NOT NULL, session_id text,\n last_activity bigint NOT NULL, revision bigint NOT NULL DEFAULT 0,\n lease_token text, lease_until bigint NOT NULL DEFAULT 0,\n PRIMARY KEY (scope, id)\n);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_runs_activity\n ON kortyx_runtime_runs (scope, last_activity);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_runs_session\n ON kortyx_runtime_runs (scope, session_id);\nCREATE TABLE IF NOT EXISTS kortyx_runtime_graph_checkpoints (\n scope text NOT NULL, run_id text NOT NULL, ns text NOT NULL, id text NOT NULL,\n position bigserial NOT NULL, record jsonb NOT NULL,\n PRIMARY KEY (scope, run_id, ns, id),\n FOREIGN KEY (scope, run_id) REFERENCES kortyx_runtime_runs (scope, id) ON DELETE CASCADE\n);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_graph_latest\n ON kortyx_runtime_graph_checkpoints (scope, run_id, ns, position DESC);\nCREATE TABLE IF NOT EXISTS kortyx_runtime_graph_writes (\n scope text NOT NULL, run_id text NOT NULL, ns text NOT NULL, checkpoint_id text NOT NULL,\n task_id text NOT NULL, idx integer NOT NULL, channel text NOT NULL, value jsonb NOT NULL,\n PRIMARY KEY (scope, run_id, ns, checkpoint_id, task_id, idx),\n FOREIGN KEY (scope, run_id, ns, checkpoint_id)\n REFERENCES kortyx_runtime_graph_checkpoints (scope, run_id, ns, id) ON DELETE CASCADE\n);\nCREATE TABLE IF NOT EXISTS kortyx_runtime_session_checkpoints (\n scope text NOT NULL, id text NOT NULL, session_id text NOT NULL, run_id text NOT NULL,\n created_at bigint NOT NULL, turn_index bigint NOT NULL, active boolean NOT NULL DEFAULT true,\n record jsonb NOT NULL,\n PRIMARY KEY (scope, id),\n FOREIGN KEY (scope, session_id) REFERENCES kortyx_runtime_sessions (scope, id) ON DELETE CASCADE\n);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_session_history\n ON kortyx_runtime_session_checkpoints (scope, session_id, turn_index);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_session_runs\n ON kortyx_runtime_session_checkpoints (scope, run_id);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_checkpoint_age\n ON kortyx_runtime_session_checkpoints (scope, created_at);\nCREATE TABLE IF NOT EXISTS kortyx_runtime_pending_requests (\n scope text NOT NULL, token text NOT NULL, run_id text NOT NULL, session_id text,\n expires_at bigint NOT NULL, record jsonb NOT NULL,\n PRIMARY KEY (scope, token)\n);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_pending_expiry\n ON kortyx_runtime_pending_requests (scope, expires_at);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_pending_runs\n ON kortyx_runtime_pending_requests (scope, run_id);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_pending_sessions\n ON kortyx_runtime_pending_requests (scope, session_id);\n`,\n});\n","import {\n type PruneRuntimeResult,\n type RuntimeMaintenance,\n resolvePruneOptions,\n} from \"../maintenance\";\nimport type { PostgresRuntimeStore } from \"./store\";\n\nexport function createRuntimeMaintenance(\n store: PostgresRuntimeStore,\n): RuntimeMaintenance {\n return {\n setup: () => store.setup(),\n async prune(options = {}) {\n const { now, batchSize: batch } = resolvePruneOptions(options);\n return (await store.query(\n store.sql.begin(async (sql) => {\n const deleted = {\n pendingRequests: 0,\n sessionCheckpoints: 0,\n graphCheckpoints: 0,\n sessions: 0,\n runs: 0,\n };\n const locks =\n await sql`SELECT pg_try_advisory_xact_lock(hashtextextended(${`kortyx:runtime:${store.scope}`}, 0)) AS acquired`;\n if (!locks[0]?.acquired)\n return { skipped: true, hasMore: false, deleted };\n const pending =\n await sql`DELETE FROM kortyx_runtime_pending_requests WHERE (scope, token) IN (\n SELECT scope, token FROM kortyx_runtime_pending_requests\n WHERE scope = ${store.scope} AND expires_at <= ${now} ORDER BY expires_at LIMIT ${batch}\n ) RETURNING token`;\n deleted.pendingRequests = pending.length;\n const checkpoints =\n await sql`DELETE FROM kortyx_runtime_session_checkpoints WHERE (scope, id) IN (\n SELECT c.scope, c.id FROM kortyx_runtime_session_checkpoints c\n JOIN kortyx_runtime_sessions s ON s.scope = c.scope AND s.id = c.session_id\n WHERE c.scope = ${store.scope}\n AND (NOT ${store.liveSession(sql, now)} OR NOT ${store.liveCheckpoint(sql, now)})\n ORDER BY c.created_at LIMIT ${batch}\n ) RETURNING id`;\n deleted.sessionCheckpoints = checkpoints.length;\n // Remove large runs incrementally rather than cascading an entire run's history in one batch.\n const graph =\n await sql`DELETE FROM kortyx_runtime_graph_checkpoints WHERE (scope, run_id, ns, id) IN (\n SELECT g.scope, g.run_id, g.ns, g.id FROM kortyx_runtime_graph_checkpoints g\n JOIN kortyx_runtime_runs r ON r.scope = g.scope AND r.id = g.run_id\n WHERE g.scope = ${store.scope} AND NOT ${store.liveRun(sql, now)}\n AND NOT EXISTS (SELECT 1 FROM kortyx_runtime_session_checkpoints c WHERE c.scope = r.scope AND c.run_id = r.id)\n ORDER BY g.position LIMIT ${batch}\n ) RETURNING id`;\n deleted.graphCheckpoints = graph.length;\n const sessions =\n await sql`DELETE FROM kortyx_runtime_sessions WHERE (scope, id) IN (\n SELECT s.scope, s.id FROM kortyx_runtime_sessions s\n WHERE s.scope = ${store.scope} AND NOT ${store.liveSession(sql, now)}\n AND NOT EXISTS (SELECT 1 FROM kortyx_runtime_session_checkpoints c WHERE c.scope = s.scope AND c.session_id = s.id)\n AND NOT EXISTS (SELECT 1 FROM kortyx_runtime_pending_requests p WHERE p.scope = s.scope AND p.session_id = s.id)\n ORDER BY s.last_activity LIMIT ${batch}\n ) RETURNING id`;\n deleted.sessions = sessions.length;\n const runs =\n await sql`DELETE FROM kortyx_runtime_runs WHERE (scope, id) IN (\n SELECT r.scope, r.id FROM kortyx_runtime_runs r\n WHERE r.scope = ${store.scope} AND NOT ${store.liveRun(sql, now)}\n AND NOT EXISTS (SELECT 1 FROM kortyx_runtime_graph_checkpoints g WHERE g.scope = r.scope AND g.run_id = r.id)\n AND NOT EXISTS (SELECT 1 FROM kortyx_runtime_session_checkpoints c WHERE c.scope = r.scope AND c.run_id = r.id)\n AND NOT EXISTS (SELECT 1 FROM kortyx_runtime_pending_requests p WHERE p.scope = r.scope AND p.run_id = r.id)\n ORDER BY r.last_activity LIMIT ${batch}\n ) RETURNING id`;\n deleted.runs = runs.length;\n return {\n skipped: false,\n hasMore: Object.values(deleted).some((count) => count === batch),\n deleted,\n };\n }),\n )) as PruneRuntimeResult;\n },\n };\n}\n","import type postgres from \"postgres\";\nimport type {\n PendingRequestRecord,\n PendingRequestStore,\n} from \"../pending-requests\";\nimport { clone, type PostgresRuntimeStore, positiveInteger } from \"./store\";\n\nexport async function savePendingRequest(\n store: PostgresRuntimeStore,\n sql: postgres.TransactionSql,\n record: PendingRequestRecord,\n): Promise<void> {\n positiveInteger(\"interrupt ttlMs\", record.ttlMs);\n const expiresAt = record.createdAt + record.ttlMs;\n if (\n !Number.isSafeInteger(record.createdAt) ||\n record.createdAt < 0 ||\n !Number.isSafeInteger(expiresAt)\n )\n throw new TypeError(\"Interrupt timestamps must be safe integers.\");\n if (expiresAt <= Date.now()) {\n await store.query(\n sql`DELETE FROM kortyx_runtime_pending_requests WHERE scope = ${store.scope} AND token = ${record.token}`,\n );\n return;\n }\n if (record.sessionId) await store.touchSession(sql, record.sessionId);\n await store.touchRun(sql, record.runId);\n await store.query(sql`INSERT INTO kortyx_runtime_pending_requests (scope, token, run_id, session_id, expires_at, record)\n VALUES (${store.scope}, ${record.token}, ${record.runId}, ${record.sessionId ?? null}, ${expiresAt},\n ${sql.json(clone(record) as unknown as postgres.JSONValue)})\n ON CONFLICT (scope, token) DO UPDATE SET run_id = EXCLUDED.run_id, session_id = EXCLUDED.session_id,\n expires_at = EXCLUDED.expires_at, record = EXCLUDED.record`);\n}\n\nexport function createPostgresPendingRequestStore(\n store: PostgresRuntimeStore,\n): PendingRequestStore {\n return {\n async list() {\n const rows =\n await store.query(store.sql`SELECT record FROM kortyx_runtime_pending_requests\n WHERE scope = ${store.scope} AND expires_at > ${Date.now()} ORDER BY token`);\n return rows.map((row) => row.record as PendingRequestRecord);\n },\n async get(token) {\n const rows =\n await store.query(store.sql`SELECT record FROM kortyx_runtime_pending_requests\n WHERE scope = ${store.scope} AND token = ${token} AND expires_at > ${Date.now()}`);\n return rows[0] ? (rows[0].record as PendingRequestRecord) : null;\n },\n async take(token) {\n return store.transaction(async (sql) => {\n const rows = await sql`DELETE FROM kortyx_runtime_pending_requests\n WHERE scope = ${store.scope} AND token = ${token} RETURNING record, expires_at`;\n return rows[0] && Number(rows[0].expires_at) > Date.now()\n ? (rows[0].record as PendingRequestRecord)\n : null;\n });\n },\n async save(record) {\n await store.transaction((sql) => savePendingRequest(store, sql, record));\n },\n async delete(token) {\n await store.transaction(async (sql) => {\n await sql`DELETE FROM kortyx_runtime_pending_requests WHERE scope = ${store.scope} AND token = ${token}`;\n });\n },\n async update(token, patch) {\n await store.transaction(async (sql) => {\n // Match the session -> run -> pending lock order used by save/rollback.\n const found =\n await sql`SELECT run_id, session_id FROM kortyx_runtime_pending_requests\n WHERE scope = ${store.scope} AND token = ${token}`;\n if (!found[0]) return;\n if (found[0].session_id)\n await store.touchSession(sql, found[0].session_id);\n await store.touchRun(sql, found[0].run_id);\n const rows =\n await sql`SELECT record FROM kortyx_runtime_pending_requests\n WHERE scope = ${store.scope} AND token = ${token} AND expires_at > ${Date.now()} FOR UPDATE`;\n if (!rows[0]) return;\n const previous = rows[0].record as PendingRequestRecord;\n await savePendingRequest(store, sql, {\n ...previous,\n ...patch,\n token: previous.token,\n runId: previous.runId,\n sessionId: previous.sessionId,\n createdAt: previous.createdAt,\n ttlMs: previous.ttlMs,\n });\n });\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { KortyxError, PersistenceError } from \"@kortyx/core/errors\";\nimport type postgres from \"postgres\";\nimport { captureGraphSnapshot } from \"../graph-snapshot\";\nimport type { PendingRequestRecord } from \"../pending-requests\";\nimport type {\n CheckpointSummary,\n SessionCheckpointRecord,\n SessionCheckpointStore,\n} from \"../session-checkpoints\";\nimport type { PostgresCheckpointSaver } from \"./checkpointer\";\nimport { savePendingRequest } from \"./pending-request-store\";\nimport { clone, type PostgresRuntimeStore, type RuntimeSql } from \"./store\";\n\nconst unique = (values: Array<string | undefined>): string[] => [\n ...new Set(values.filter((value): value is string => Boolean(value))),\n];\nconst notFound = (id: string) =>\n new KortyxError(\n \"NOT_FOUND\",\n `Checkpoint \"${id}\" was not found or has expired.`,\n {\n category: \"request\",\n retryable: false,\n safeMessage: \"The requested checkpoint was not found or has expired.\",\n },\n );\nconst assertInterruptsLive = (requests: PendingRequestRecord[]): void => {\n if (\n requests.some((request) => request.createdAt + request.ttlMs <= Date.now())\n )\n throw new KortyxError(\n \"INTERRUPT_EXPIRED\",\n \"The checkpoint contains an expired interrupt.\",\n {\n category: \"request\",\n retryable: false,\n safeMessage: \"This checkpoint's approval or input request has expired.\",\n },\n );\n};\n\nexport function createPostgresSessionCheckpointStore(\n store: PostgresRuntimeStore,\n saver: PostgresCheckpointSaver,\n): SessionCheckpointStore {\n const visible = (sql: RuntimeSql, now: number) => sql`c.scope = ${store.scope}\n AND ${store.liveSession(sql, now)} AND ${store.liveCheckpoint(sql, now)}`;\n const read = async (\n row:\n | { id: string; active: boolean; record?: SessionCheckpointRecord }\n | undefined,\n ) => {\n if (!row) return null;\n const record = store.cacheEnabled\n ? await store.payload([\"session\", row.id], async () => {\n const records =\n await store.query(store.sql`SELECT record FROM kortyx_runtime_session_checkpoints\n WHERE scope = ${store.scope} AND id = ${row.id}`);\n return records[0]\n ? (records[0].record as SessionCheckpointRecord)\n : null;\n })\n : row.record;\n return record\n ? {\n ...record,\n branchStatus: row.active\n ? (\"active\" as const)\n : (\"abandoned\" as const),\n }\n : null;\n };\n const get = async (id: string): Promise<SessionCheckpointRecord | null> => {\n const { sql } = store;\n const rows =\n await store.query(sql`SELECT c.id, c.active ${store.cacheEnabled ? sql`` : sql`, c.record`} FROM kortyx_runtime_session_checkpoints c\n JOIN kortyx_runtime_sessions s ON s.scope = c.scope AND s.id = c.session_id\n WHERE c.id = ${id} AND ${visible(sql, Date.now())}`);\n return read(\n rows[0] as\n | { id: string; active: boolean; record?: SessionCheckpointRecord }\n | undefined,\n );\n };\n\n const sealRequests = async (\n requests: PendingRequestRecord[],\n ): Promise<PendingRequestRecord[]> => {\n return Promise.all(\n requests.map(async (request) => {\n if (request.graphSnapshot) return clone(request);\n const graphSnapshot = await captureGraphSnapshot(\n saver,\n request.runId,\n request.graphCheckpointId,\n );\n if (!graphSnapshot)\n throw new KortyxError(\n \"CHECKPOINT_INCOMPLETE\",\n \"A paused checkpoint needs a complete execution snapshot.\",\n {\n category: \"persistence\",\n retryable: false,\n safeMessage:\n \"The paused execution could not be saved completely.\",\n },\n );\n return { ...clone(request), graphSnapshot };\n }),\n );\n };\n\n const insert = async (\n sql: postgres.TransactionSql,\n record: SessionCheckpointRecord,\n ): Promise<void> => {\n await store.query(sql`INSERT INTO kortyx_runtime_session_checkpoints (scope, id, session_id, run_id, created_at, turn_index, record)\n VALUES (${store.scope}, ${record.id}, ${record.sessionId}, ${record.runId}, ${record.createdAt}, ${record.turnIndex},\n ${sql.json(clone(record) as unknown as postgres.JSONValue)})`);\n await store.query(sql`UPDATE kortyx_runtime_sessions SET head_id = ${record.id}, next_turn = ${record.turnIndex + 1}\n WHERE scope = ${store.scope} AND id = ${record.sessionId}`);\n };\n\n return {\n managesPendingRequests: true,\n get,\n async list(sessionId) {\n const { sql } = store;\n const rows =\n await store.query(sql`SELECT c.record, c.active FROM kortyx_runtime_session_checkpoints c\n JOIN kortyx_runtime_sessions s ON s.scope = c.scope AND s.id = c.session_id\n WHERE c.session_id = ${sessionId} AND ${visible(sql, Date.now())} ORDER BY c.turn_index`);\n return rows.map((row) => {\n const {\n state: _state,\n effects: _effects,\n activePendingRequests: _pending,\n runId: _runId,\n graphCheckpointId: _graphId,\n ...summary\n } = row.record as SessionCheckpointRecord;\n return {\n ...summary,\n branchStatus: row.active ? \"active\" : \"abandoned\",\n } as CheckpointSummary;\n });\n },\n async getHead(sessionId) {\n const { sql } = store;\n const rows =\n await store.query(sql`SELECT c.id, c.active ${store.cacheEnabled ? sql`` : sql`, c.record`}\n FROM kortyx_runtime_sessions s JOIN kortyx_runtime_session_checkpoints c\n ON c.scope = s.scope AND c.id = s.head_id\n WHERE s.id = ${sessionId} AND ${visible(sql, Date.now())}`);\n return read(\n rows[0] as\n | { id: string; active: boolean; record?: SessionCheckpointRecord }\n | undefined,\n );\n },\n async append(args) {\n const requests = await sealRequests(args.pendingRequests ?? []);\n return store.transaction(async (sql) => {\n await store.touchSession(sql, args.sessionId);\n const sessions =\n await sql`SELECT head_id, next_turn FROM kortyx_runtime_sessions\n WHERE scope = ${store.scope} AND id = ${args.sessionId} FOR UPDATE`;\n const session = sessions[0];\n if (!session)\n throw new PersistenceError(\n \"The session disappeared during checkpoint append.\",\n );\n const record: SessionCheckpointRecord = {\n id: `cp-${randomUUID()}`,\n sessionId: args.sessionId,\n runId: args.runId,\n turnIndex: Number(session.next_turn),\n createdAt: Date.now(),\n workflow: args.workflow,\n state: clone(args.state),\n nodes: unique(args.nodes ?? []),\n effects: {\n structuredStreamIds: unique(args.structuredStreamIds ?? []),\n interruptTokens: unique(requests.map((request) => request.token)),\n },\n activePendingRequests: requests,\n ...(session.head_id ? { parentCheckpointId: session.head_id } : {}),\n ...(args.graphCheckpointId\n ? { graphCheckpointId: args.graphCheckpointId }\n : {}),\n ...(args.label ? { label: args.label } : {}),\n ...(args.workflowVersion\n ? { workflowVersion: args.workflowVersion }\n : {}),\n ...(args.buildId ? { buildId: args.buildId } : {}),\n };\n await insert(sql, record);\n return record;\n });\n },\n async rollbackTo(id, options) {\n return store.transaction(async (sql) => {\n const targets =\n await sql`SELECT c.record FROM kortyx_runtime_session_checkpoints c\n JOIN kortyx_runtime_sessions s ON s.scope = c.scope AND s.id = c.session_id\n WHERE c.id = ${id} AND ${visible(sql, Date.now())} FOR UPDATE OF s`;\n if (!targets[0]) throw notFound(id);\n const target = targets[0].record as SessionCheckpointRecord;\n assertInterruptsLive(target.activePendingRequests);\n const liveRuns = await sql`SELECT id FROM kortyx_runtime_runs\n WHERE scope = ${store.scope} AND session_id = ${target.sessionId} AND lease_until > ${Date.now()}`;\n if (liveRuns.length)\n throw new KortyxError(\n \"SESSION_BUSY\",\n \"Cannot roll back a session while execution is active.\",\n { category: \"request\", retryable: true },\n );\n const ancestry = await sql`WITH RECURSIVE ancestors(id) AS (\n SELECT ${id}::text UNION\n SELECT c.record->>'parentCheckpointId' FROM kortyx_runtime_session_checkpoints c\n JOIN ancestors a ON a.id = c.id WHERE c.scope = ${store.scope} AND c.record ? 'parentCheckpointId'\n ) SELECT id FROM ancestors`;\n const ancestorIds = ancestry.map((row) => row.id as string);\n const trailing =\n await sql`SELECT record FROM kortyx_runtime_session_checkpoints\n WHERE scope = ${store.scope} AND session_id = ${target.sessionId} AND active AND id NOT IN ${sql(ancestorIds)}`;\n const records = trailing.map(\n (row) => row.record as SessionCheckpointRecord,\n );\n const streams = unique(\n records.flatMap((record) => record.effects.structuredStreamIds),\n );\n const tokens = unique(\n records.flatMap((record) => [\n ...record.effects.interruptTokens,\n ...record.activePendingRequests.map((request) => request.token),\n ]),\n );\n await sql`UPDATE kortyx_runtime_session_checkpoints SET active = (id IN ${sql(ancestorIds)})\n WHERE scope = ${store.scope} AND session_id = ${target.sessionId}`;\n await store.touchSession(sql, target.sessionId);\n await sql`UPDATE kortyx_runtime_sessions SET head_id = ${id} WHERE scope = ${store.scope} AND id = ${target.sessionId}`;\n if (tokens.length)\n await sql`DELETE FROM kortyx_runtime_pending_requests WHERE scope = ${store.scope} AND token IN ${sql(tokens)}`;\n const requests = clone(target.activePendingRequests);\n options?.preparePendingRequests?.(requests);\n for (const request of requests)\n await savePendingRequest(store, sql, request);\n return {\n sessionId: target.sessionId,\n head: id,\n invalidatedStructuredStreamIds: streams,\n invalidatedInterruptTokens: tokens,\n activePendingRequests: requests,\n };\n });\n },\n async fork(id, options) {\n const source = await get(id);\n if (!source) throw notFound(id);\n assertInterruptsLive(source.activePendingRequests);\n const sessionId = options?.newSessionId || `session-${randomUUID()}`;\n const runId = source.activePendingRequests.length\n ? `run-${randomUUID()}`\n : source.runId;\n const {\n parentCheckpointId: _parent,\n branchStatus: _branch,\n ...sourceRecord\n } = source;\n const checkpoint: SessionCheckpointRecord = {\n ...clone(sourceRecord),\n id: `cp-${randomUUID()}`,\n sessionId,\n runId,\n createdAt: Date.now(),\n parentSessionId: source.sessionId,\n forkedFrom: source.id,\n activePendingRequests: source.activePendingRequests.map((request) => ({\n ...clone(request),\n runId,\n sessionId,\n token: randomUUID(),\n requestId: `human-${randomUUID()}`,\n })),\n };\n checkpoint.effects.interruptTokens = checkpoint.activePendingRequests.map(\n (request) => request.token,\n );\n options?.preparePendingRequests?.(checkpoint.activePendingRequests);\n // Resume restores this fork's complete snapshot into its own run. No parent storage is required.\n await store.transaction(async (sql) => {\n const existing =\n await sql`SELECT id FROM kortyx_runtime_sessions WHERE scope = ${store.scope} AND id = ${sessionId}`;\n if (existing.length)\n throw new KortyxError(\n \"SESSION_EXISTS\",\n \"The fork session already exists.\",\n { category: \"request\", retryable: false },\n );\n // INSERT, rather than UPSERT, also rejects concurrent attempts to fork to the same session.\n await sql`INSERT INTO kortyx_runtime_sessions (scope, id, last_activity) VALUES (${store.scope}, ${sessionId}, ${Date.now()})`;\n await insert(sql, checkpoint);\n for (const request of checkpoint.activePendingRequests)\n await savePendingRequest(store, sql, request);\n });\n return {\n sessionId,\n parentSessionId: source.sessionId,\n forkedFrom: source.id,\n checkpoint,\n };\n },\n };\n}\n","import type {\n BaseCheckpointSaver,\n CheckpointTuple,\n} from \"@langchain/langgraph-checkpoint\";\n\n/** A self-contained, JSON snapshot, including pending writes needed for replay. */\nexport type GraphSnapshotBundle = CheckpointTuple;\n\nexport async function captureGraphSnapshot(\n saver: BaseCheckpointSaver,\n threadId: string,\n checkpointId?: string,\n): Promise<GraphSnapshotBundle | undefined> {\n const tuple = await saver.getTuple({\n configurable: {\n thread_id: threadId,\n checkpoint_ns: \"\",\n ...(checkpointId ? { checkpoint_id: checkpointId } : {}),\n },\n });\n // Functions/services in GraphState.config are intentionally not persisted.\n return tuple\n ? (JSON.parse(JSON.stringify(tuple)) as GraphSnapshotBundle)\n : undefined;\n}\n\nexport async function restoreGraphSnapshot(\n saver: BaseCheckpointSaver,\n snapshot: GraphSnapshotBundle,\n threadId: string,\n): Promise<void> {\n const copy = JSON.parse(JSON.stringify(snapshot)) as GraphSnapshotBundle;\n const config = await saver.put(\n { configurable: { thread_id: threadId, checkpoint_ns: \"\" } },\n copy.checkpoint,\n copy.metadata!,\n copy.checkpoint.channel_versions,\n );\n const reset = saver as BaseCheckpointSaver & {\n deleteCheckpointWrites?: (\n threadId: string,\n ns: string,\n id: string,\n ) => Promise<void>;\n };\n if (reset.deleteCheckpointWrites)\n await reset.deleteCheckpointWrites(threadId, \"\", copy.checkpoint.id);\n const writes = new Map<string, Array<[string, unknown]>>();\n for (const [task, channel, value] of copy.pendingWrites ?? []) {\n const group = writes.get(task) ?? [];\n group.push([channel, value]);\n writes.set(task, group);\n }\n for (const [task, group] of writes)\n await saver.putWrites(config, group, task);\n}\n","import type {\n PendingRequestRecord,\n PendingRequestStore,\n} from \"../pending-requests\";\nimport type { RedisFrameworkStore } from \"./redis-store\";\n\nexport type RedisPendingRequestStoreOptions = {\n store: RedisFrameworkStore;\n prefix?: string;\n};\n\nexport function createRedisPendingRequestStore(\n options: RedisPendingRequestStoreOptions,\n): PendingRequestStore {\n const prefix = options.prefix ?? \"kortyx:pending:\";\n const key = (token: string) => `${prefix}${token}`;\n\n return {\n ...(options.store.list\n ? {\n list: async () =>\n (await options.store.list!(prefix)).map(\n (raw) => JSON.parse(raw) as PendingRequestRecord,\n ),\n }\n : {}),\n ...(options.store.take\n ? {\n take: async (token: string): Promise<PendingRequestRecord | null> => {\n const raw = await options.store.take!(key(token));\n return raw ? (JSON.parse(raw) as PendingRequestRecord) : null;\n },\n }\n : {}),\n async save(rec: PendingRequestRecord) {\n await options.store.set(key(rec.token), JSON.stringify(rec), rec.ttlMs);\n },\n async get(token: string) {\n const raw = await options.store.get(key(token));\n if (!raw) return null;\n return JSON.parse(raw) as PendingRequestRecord;\n },\n async delete(token: string) {\n await options.store.del(key(token));\n },\n async update(token: string, patch: Partial<PendingRequestRecord>) {\n const prevRaw = await options.store.get(key(token));\n if (!prevRaw) return;\n const prev = JSON.parse(prevRaw) as PendingRequestRecord;\n const next = { ...prev, ...patch } as PendingRequestRecord;\n const ttlLeft = Math.max(1, next.ttlMs - (Date.now() - next.createdAt));\n await options.store.set(key(token), JSON.stringify(next), ttlLeft);\n },\n };\n}\n","import { PersistenceError } from \"@kortyx/core/errors\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport {\n type BaseCheckpointSaver,\n type Checkpoint,\n type CheckpointListOptions,\n type CheckpointMetadata,\n type CheckpointTuple,\n copyCheckpoint,\n getCheckpointId,\n type PendingWrite,\n WRITES_IDX_MAP,\n} from \"@langchain/langgraph-checkpoint\";\nimport type { RedisFrameworkStore } from \"./redis-store\";\n\ntype SerializerProtocol = {\n dumpsTyped: (data: any) => Promise<[string, Uint8Array]>;\n loadsTyped: (type: string, data: Uint8Array | string) => Promise<any>;\n};\n\ntype RedisCheckpointSaverOptions = {\n store: RedisFrameworkStore;\n prefix?: string;\n ttlMs: number;\n};\n\nconst utf8Bytes = (s: string) => new Uint8Array(Buffer.from(s, \"utf8\"));\nconst utf8String = (u8: Uint8Array | string) =>\n typeof u8 === \"string\" ? u8 : Buffer.from(u8).toString(\"utf8\");\n\nconst jsonSerde: SerializerProtocol = {\n async dumpsTyped(data: any) {\n return [\"json\", utf8Bytes(JSON.stringify(data))];\n },\n async loadsTyped(_type: string, data: Uint8Array | string) {\n return JSON.parse(utf8String(data));\n },\n};\n\nconst b64FromBytes = (u8: Uint8Array) => Buffer.from(u8).toString(\"base64\");\nconst bytesFromB64 = (s: string) => new Uint8Array(Buffer.from(s, \"base64\"));\n\ntype StoredCheckpoint = {\n checkpoint: string; // base64\n metadata: string; // base64\n parentCheckpointId?: string | undefined;\n};\n\ntype StoredWrite = {\n taskId: string;\n channel: string;\n value: string; // base64\n};\n\nexport type RedisCheckpointSaver = BaseCheckpointSaver & {\n deleteThread: (threadId: string) => Promise<void>;\n deleteCheckpointWrites: (\n threadId: string,\n checkpointNs: string,\n checkpointId: string,\n ) => Promise<void>;\n getLatestCheckpointId: (\n threadId: string,\n checkpointNs?: string,\n ) => Promise<string | undefined>;\n};\n\nexport function createRedisCheckpointSaver(\n options: RedisCheckpointSaverOptions,\n): RedisCheckpointSaver {\n const store = options.store;\n const ttlMs = options.ttlMs;\n const prefix = options.prefix ?? \"kortyx:cp:\";\n\n const latestKey = (threadId: string, checkpointNs: string) =>\n `${prefix}latest:${threadId}:${checkpointNs}`;\n const checkpointKey = (\n threadId: string,\n checkpointNs: string,\n checkpointId: string,\n ) => `${prefix}chk:${threadId}:${checkpointNs}:${checkpointId}`;\n const writesKey = (\n threadId: string,\n checkpointNs: string,\n checkpointId: string,\n ) => `${prefix}wr:${threadId}:${checkpointNs}:${checkpointId}`;\n\n const serde = jsonSerde;\n\n const saver: any = {\n serde,\n\n async get(config: RunnableConfig) {\n const value = await saver.getTuple(config);\n return value ? value.checkpoint : undefined;\n },\n\n getNextVersion(current: number | string | undefined) {\n if (typeof current === \"string\") {\n throw new PersistenceError(\n \"Please override this method to use string versions.\",\n );\n }\n return current !== undefined && typeof current === \"number\"\n ? current + 1\n : 1;\n },\n\n async getTuple(\n config: RunnableConfig,\n ): Promise<CheckpointTuple | undefined> {\n const threadId = config.configurable?.thread_id as string | undefined;\n const checkpointNs =\n (config.configurable?.checkpoint_ns as string | undefined) ?? \"\";\n if (!threadId) return undefined;\n\n const requested = getCheckpointId(config);\n const checkpointId =\n requested || (await store.get(latestKey(threadId, checkpointNs))) || \"\";\n if (!checkpointId) return undefined;\n\n const raw = await store.get(\n checkpointKey(threadId, checkpointNs, checkpointId),\n );\n if (!raw) return undefined;\n const parsed = JSON.parse(raw) as StoredCheckpoint;\n\n const checkpoint = (await serde.loadsTyped(\n \"json\",\n bytesFromB64(parsed.checkpoint),\n )) as Checkpoint;\n const metadata = (await serde.loadsTyped(\n \"json\",\n bytesFromB64(parsed.metadata),\n )) as CheckpointMetadata;\n\n const writes = await store.hgetall(\n writesKey(threadId, checkpointNs, checkpointId),\n );\n const pendingWrites = await Promise.all(\n Object.values(writes).map(async (v) => {\n const w = JSON.parse(v) as StoredWrite;\n return [\n w.taskId,\n w.channel,\n await serde.loadsTyped(\"json\", bytesFromB64(w.value)),\n ] as any;\n }),\n );\n\n const tuple: CheckpointTuple = {\n config: {\n configurable: {\n thread_id: threadId,\n checkpoint_ns: checkpointNs,\n checkpoint_id: checkpointId,\n },\n },\n checkpoint,\n metadata,\n pendingWrites,\n };\n\n if (parsed.parentCheckpointId) {\n tuple.parentConfig = {\n configurable: {\n thread_id: threadId,\n checkpoint_ns: checkpointNs,\n checkpoint_id: parsed.parentCheckpointId,\n },\n };\n }\n\n return tuple;\n },\n\n async *list(_config: RunnableConfig, _options?: CheckpointListOptions) {\n // Minimal implementation: list is not needed for core runtime behavior today.\n // If needed later (studio/time-travel), implement scanning by prefix.\n },\n\n async put(\n config: RunnableConfig,\n checkpoint: Checkpoint,\n metadata: CheckpointMetadata,\n _newVersions: Record<string, number | string>,\n ): Promise<RunnableConfig> {\n const threadId = config.configurable?.thread_id as string | undefined;\n const checkpointNs =\n (config.configurable?.checkpoint_ns as string | undefined) ?? \"\";\n if (!threadId) {\n throw new PersistenceError(\n 'Failed to put checkpoint: missing \"thread_id\" in config.configurable.',\n );\n }\n\n const prepared = copyCheckpoint(checkpoint as any);\n const [[, chkBytes], [, metaBytes]] = await Promise.all([\n serde.dumpsTyped(prepared),\n serde.dumpsTyped(metadata),\n ]);\n\n const checkpointId = checkpoint.id;\n const key = checkpointKey(threadId, checkpointNs, checkpointId);\n const stored: StoredCheckpoint = {\n checkpoint: b64FromBytes(chkBytes),\n metadata: b64FromBytes(metaBytes),\n parentCheckpointId: config.configurable?.checkpoint_id as\n | string\n | undefined,\n };\n\n await store.set(key, JSON.stringify(stored), ttlMs);\n await store.set(latestKey(threadId, checkpointNs), checkpointId, ttlMs);\n\n return {\n configurable: {\n thread_id: threadId,\n checkpoint_ns: checkpointNs,\n checkpoint_id: checkpointId,\n },\n };\n },\n\n async putWrites(\n config: RunnableConfig,\n writes: PendingWrite[],\n taskId: string,\n ): Promise<void> {\n const threadId = config.configurable?.thread_id as string | undefined;\n const checkpointNs = config.configurable?.checkpoint_ns as\n | string\n | undefined;\n const checkpointId = config.configurable?.checkpoint_id as\n | string\n | undefined;\n if (!threadId) {\n throw new PersistenceError(\n 'Failed to put writes: missing \"thread_id\" in config.configurable.',\n );\n }\n if (!checkpointId) {\n throw new PersistenceError(\n 'Failed to put writes: missing \"checkpoint_id\" in config.configurable.',\n );\n }\n\n const outer = writesKey(threadId, checkpointNs ?? \"\", checkpointId);\n await store.expire(outer, ttlMs);\n\n await Promise.all(\n writes.map(async ([channel, value], idx) => {\n const [, vBytes] = await serde.dumpsTyped(value as any);\n const mappedIdx = WRITES_IDX_MAP[channel] ?? idx;\n const innerKeyStr = `${taskId},${mappedIdx}`;\n const payload: StoredWrite = {\n taskId,\n channel,\n value: b64FromBytes(vBytes),\n };\n const serialized = JSON.stringify(payload);\n if (mappedIdx >= 0) {\n await store.hsetnx(outer, innerKeyStr, serialized);\n } else {\n await store.hset(outer, innerKeyStr, serialized);\n }\n }),\n );\n },\n\n async deleteThread(threadId: string): Promise<void> {\n const chkKeys = await store.scanKeys(`${prefix}chk:${threadId}:`);\n const wrKeys = await store.scanKeys(`${prefix}wr:${threadId}:`);\n const latestKeys = await store.scanKeys(`${prefix}latest:${threadId}:`);\n await store.delRaw([...chkKeys, ...wrKeys, ...latestKeys]);\n },\n\n async deleteCheckpointWrites(\n threadId: string,\n checkpointNs: string,\n checkpointId: string,\n ): Promise<void> {\n await store.del(writesKey(threadId, checkpointNs, checkpointId));\n },\n\n async getLatestCheckpointId(\n threadId: string,\n checkpointNs = \"\",\n ): Promise<string | undefined> {\n return (await store.get(latestKey(threadId, checkpointNs))) ?? undefined;\n },\n };\n\n return saver as RedisCheckpointSaver;\n}\n","import { PersistenceError } from \"@kortyx/core/errors\";\nimport { createRedisClient, type RedisClient } from \"./redis-client\";\n\nexport type RedisFrameworkStoreOptions = {\n url: string;\n prefix?: string;\n};\n\nexport type FrameworkTtl = {\n ttlMs: number;\n};\n\nexport type RedisFrameworkStore = {\n close?: () => Promise<void>;\n list?: (prefix: string) => Promise<string[]>;\n take?: (key: string) => Promise<string | null>;\n get: (key: string) => Promise<string | null>;\n set: (key: string, value: string, ttlMs: number) => Promise<void>;\n del: (key: string) => Promise<void>;\n hset: (key: string, field: string, value: string) => Promise<void>;\n hsetnx: (key: string, field: string, value: string) => Promise<number>;\n hgetall: (key: string) => Promise<Record<string, string>>;\n expire: (key: string, ttlMs: number) => Promise<void>;\n scanKeys: (prefix: string) => Promise<string[]>;\n delRaw: (keys: string[]) => Promise<void>;\n};\n\ntype RedisErrorReply = { type: \"error\"; message: string };\nconst isRedisError = (r: unknown): r is RedisErrorReply =>\n Boolean(r) && typeof r === \"object\" && (r as any).type === \"error\";\n\nexport function createRedisFrameworkStore(\n options: RedisFrameworkStoreOptions,\n): RedisFrameworkStore {\n const rawClient = createRedisClient({ url: options.url });\n const client: RedisClient = {\n ...rawClient,\n command: async (...args) => {\n try {\n return await rawClient.command(...args);\n } catch (cause) {\n throw new PersistenceError(\"Redis command failed.\", cause);\n }\n },\n };\n const prefix = options.prefix ?? \"kortyx:fw:\";\n\n const k = (key: string) => `${prefix}${key}`;\n\n return {\n close: async () => rawClient.close?.(),\n async list(prefixKey) {\n const keys: string[] = await this.scanKeys(prefixKey);\n const values = await Promise.all(\n [...new Set(keys)].map(async (key) => {\n const value = await client.command(\"GET\", [key]);\n if (isRedisError(value))\n throw new PersistenceError(`Redis GET error: ${value.message}`);\n return value;\n }),\n );\n return values.filter(\n (value): value is string => typeof value === \"string\",\n );\n },\n async take(key: string): Promise<string | null> {\n const r = await client.command(\"GETDEL\", [k(key)]);\n if (isRedisError(r))\n throw new PersistenceError(`Redis GETDEL error: ${r.message}`);\n return typeof r === \"string\" ? r : null;\n },\n async get(key: string): Promise<string | null> {\n const r = await client.command(\"GET\", [k(key)]);\n if (r === null) return null;\n if (typeof r === \"string\") return r;\n if (isRedisError(r)) {\n throw new PersistenceError(`Redis GET error: ${r.message}`);\n }\n return null;\n },\n\n async set(key: string, value: string, ttlMs: number): Promise<void> {\n const args = [k(key), value, \"PX\", String(Math.max(1, ttlMs))];\n const r = await client.command(\"SET\", args);\n if (isRedisError(r)) {\n throw new PersistenceError(`Redis SET error: ${r.message}`);\n }\n },\n\n async del(key: string): Promise<void> {\n const r = await client.command(\"DEL\", [k(key)]);\n if (isRedisError(r)) {\n throw new PersistenceError(`Redis DEL error: ${r.message}`);\n }\n },\n\n async hset(key: string, field: string, value: string): Promise<void> {\n const r = await client.command(\"HSET\", [k(key), field, value]);\n if (isRedisError(r)) {\n throw new PersistenceError(`Redis HSET error: ${r.message}`);\n }\n },\n\n async hsetnx(key: string, field: string, value: string): Promise<number> {\n const r = await client.command(\"HSETNX\", [k(key), field, value]);\n if (isRedisError(r)) {\n throw new PersistenceError(`Redis HSETNX error: ${r.message}`);\n }\n return typeof r === \"number\" ? r : 0;\n },\n\n async hgetall(key: string): Promise<Record<string, string>> {\n const r = await client.command(\"HGETALL\", [k(key)]);\n if (isRedisError(r)) {\n throw new PersistenceError(`Redis HGETALL error: ${r.message}`);\n }\n if (!Array.isArray(r)) return {};\n const out: Record<string, string> = {};\n for (let i = 0; i < r.length; i += 2) {\n const kk = r[i];\n const v = r[i + 1];\n if (typeof kk === \"string\" && typeof v === \"string\") out[kk] = v;\n }\n return out;\n },\n\n async expire(key: string, ttlMs: number): Promise<void> {\n const r = await client.command(\"PEXPIRE\", [\n k(key),\n String(Math.max(1, ttlMs)),\n ]);\n if (isRedisError(r)) {\n throw new PersistenceError(`Redis PEXPIRE error: ${r.message}`);\n }\n },\n\n async scanKeys(prefixKey: string): Promise<string[]> {\n const fullPrefix = k(prefixKey);\n let cursor = \"0\";\n const keys: string[] = [];\n do {\n const r = await client.command(\"SCAN\", [\n cursor,\n \"MATCH\",\n `${fullPrefix}*`,\n \"COUNT\",\n \"200\",\n ]);\n if (isRedisError(r))\n throw new PersistenceError(`Redis SCAN error: ${r.message}`);\n if (!Array.isArray(r) || r.length < 2) break;\n cursor = typeof r[0] === \"string\" ? r[0] : \"0\";\n const batch = r[1];\n if (Array.isArray(batch)) {\n for (const key of batch) {\n if (typeof key === \"string\") keys.push(key);\n }\n }\n } while (cursor !== \"0\");\n return keys;\n },\n\n async delRaw(keys: string[]): Promise<void> {\n if (keys.length === 0) return;\n const r = await client.command(\"DEL\", keys);\n if (isRedisError(r)) {\n throw new PersistenceError(`Redis DEL error: ${r.message}`);\n }\n },\n };\n}\n","import { connect as netConnect, type Socket } from \"node:net\";\nimport { type TLSSocket, connect as tlsConnect } from \"node:tls\";\nimport { PersistenceError } from \"@kortyx/core/errors\";\n\nexport type RedisReply =\n | string\n | number\n | null\n | RedisReply[]\n | { type: \"error\"; message: string };\n\nexport type RedisClientOptions = {\n url: string;\n connectTimeoutMs?: number;\n};\n\nconst encodeBulk = (s: string) => {\n const b = Buffer.from(s, \"utf8\");\n return Buffer.concat([\n Buffer.from(`$${b.length}\\r\\n`),\n b,\n Buffer.from(\"\\r\\n\"),\n ]);\n};\n\nconst encodeCommand = (cmd: string, args: string[]) => {\n const parts = [cmd, ...args];\n const bufs: Buffer[] = [Buffer.from(`*${parts.length}\\r\\n`)];\n for (const p of parts) bufs.push(encodeBulk(p));\n return Buffer.concat(bufs);\n};\n\nfunction readLine(buf: Buffer, start: number) {\n const idx = buf.indexOf(\"\\r\\n\", start);\n if (idx === -1) return null;\n return { line: buf.subarray(start, idx).toString(\"utf8\"), next: idx + 2 };\n}\n\nfunction parseReply(\n buf: Buffer,\n start: number,\n): { value: RedisReply; next: number } | null {\n if (start >= buf.length) return null;\n const byte = buf[start];\n if (byte === undefined) return null;\n const prefix = String.fromCharCode(byte);\n if (prefix === \"+\" || prefix === \"-\" || prefix === \":\") {\n const line = readLine(buf, start + 1);\n if (!line) return null;\n if (prefix === \"+\") return { value: line.line, next: line.next };\n if (prefix === \":\")\n return { value: Number.parseInt(line.line, 10), next: line.next };\n return { value: { type: \"error\", message: line.line }, next: line.next };\n }\n\n if (prefix === \"$\") {\n const line = readLine(buf, start + 1);\n if (!line) return null;\n const len = Number.parseInt(line.line, 10);\n if (len === -1) return { value: null, next: line.next };\n const end = line.next + len;\n if (end + 2 > buf.length) return null;\n const data = buf.subarray(line.next, end).toString(\"utf8\");\n return { value: data, next: end + 2 };\n }\n\n if (prefix === \"*\") {\n const line = readLine(buf, start + 1);\n if (!line) return null;\n const count = Number.parseInt(line.line, 10);\n if (count === -1) return { value: null, next: line.next };\n const items: RedisReply[] = [];\n let cursor = line.next;\n for (let i = 0; i < count; i++) {\n const parsed = parseReply(buf, cursor);\n if (!parsed) return null;\n items.push(parsed.value);\n cursor = parsed.next;\n }\n return { value: items, next: cursor };\n }\n\n return {\n value: { type: \"error\", message: `Unknown RESP prefix: ${prefix}` },\n next: buf.length,\n };\n}\n\nexport type RedisClient = {\n close?: () => Promise<void>;\n command: (cmd: string, args?: string[]) => Promise<RedisReply>;\n};\n\nexport function createRedisClient(options: RedisClientOptions): RedisClient {\n const resolvedOptions: Required<\n Pick<RedisClientOptions, \"connectTimeoutMs\">\n > &\n Omit<RedisClientOptions, \"connectTimeoutMs\"> = {\n connectTimeoutMs: options.connectTimeoutMs ?? 5_000,\n url: options.url,\n };\n\n let socket: Socket | TLSSocket | null = null;\n let buffer = Buffer.alloc(0);\n const inflight: Array<{\n resolve: (v: RedisReply) => void;\n reject: (e: unknown) => void;\n }> = [];\n\n let connecting: Promise<void> | null = null;\n let ready = false;\n\n const drainReplies = () => {\n while (inflight.length) {\n const parsed = parseReply(buffer, 0);\n if (!parsed) return;\n const waiter = inflight.shift()!;\n buffer = buffer.subarray(parsed.next);\n waiter.resolve(parsed.value);\n }\n };\n\n const send = (cmd: string, args: string[] = []): Promise<RedisReply> => {\n if (!socket) return Promise.reject(new Error(\"Redis socket not available\"));\n const payload = encodeCommand(cmd, args);\n return new Promise<RedisReply>((resolve, reject) => {\n inflight.push({ resolve, reject });\n socket?.write(payload);\n });\n };\n\n const ensureConnected = async () => {\n if (ready) return;\n if (connecting) return connecting;\n\n connecting = (async () => {\n const u = new URL(resolvedOptions.url);\n const isTls = u.protocol === \"rediss:\";\n const host = u.hostname || \"127.0.0.1\";\n const port = u.port ? Number(u.port) : isTls ? 6380 : 6379;\n const password = u.password ? decodeURIComponent(u.password) : \"\";\n const db =\n u.pathname && u.pathname !== \"/\" ? Number(u.pathname.slice(1)) : 0;\n\n const s = isTls\n ? tlsConnect({ host, port, servername: host })\n : netConnect({ host, port });\n socket = s;\n\n s.setNoDelay(true);\n s.setKeepAlive(true);\n\n s.on(\"data\", (chunk) => {\n if (socket !== s) return;\n buffer = Buffer.concat([buffer, chunk]);\n drainReplies();\n });\n\n s.on(\"error\", (err) => {\n if (socket !== s) return;\n ready = false;\n while (inflight.length) inflight.shift()?.reject(err);\n });\n\n s.on(\"close\", () => {\n if (socket !== s) return;\n ready = false;\n socket = null;\n buffer = Buffer.alloc(0);\n while (inflight.length)\n inflight.shift()?.reject(new Error(\"Redis socket closed\"));\n });\n\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(\n () => reject(new Error(\"Redis connect timeout\")),\n resolvedOptions.connectTimeoutMs,\n );\n\n const onConnect = () => {\n clearTimeout(timer);\n resolve();\n };\n\n // net: \"connect\", tls: \"secureConnect\" (TLSSocket can also emit \"connect\")\n s.once(\"connect\", onConnect);\n (s as any).once?.(\"secureConnect\", onConnect);\n s.once(\"error\", (e) => {\n clearTimeout(timer);\n reject(e);\n });\n });\n\n if (password) {\n const r = await send(\"AUTH\", [password]);\n if (typeof r === \"object\" && r && (r as any).type === \"error\") {\n throw new PersistenceError(\n `Redis AUTH failed: ${(r as any).message}`,\n );\n }\n }\n\n if (db && Number.isFinite(db) && db > 0) {\n const r = await send(\"SELECT\", [String(db)]);\n if (typeof r === \"object\" && r && (r as any).type === \"error\") {\n throw new PersistenceError(\n `Redis SELECT failed: ${(r as any).message}`,\n );\n }\n }\n\n ready = true;\n })();\n\n try {\n await connecting;\n } finally {\n connecting = null;\n }\n };\n\n return {\n async close() {\n socket?.destroy();\n socket = null;\n buffer = Buffer.alloc(0);\n ready = false;\n while (inflight.length)\n inflight.shift()?.reject(new Error(\"Redis socket closed\"));\n },\n async command(cmd: string, args: string[] = []) {\n await ensureConnected();\n return send(cmd, args);\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { KortyxError } from \"@kortyx/core/errors\";\nimport type {\n AppendSessionCheckpointArgs,\n CheckpointId,\n CheckpointSummary,\n ForkSessionCheckpointResult,\n RollbackSessionCheckpointResult,\n SessionCheckpointRecord,\n SessionCheckpointStore,\n SessionCheckpointStoreOptions,\n} from \"../session-checkpoints\";\nimport type { RedisFrameworkStore } from \"./redis-store\";\n\nexport type RedisSessionCheckpointStoreOptions =\n SessionCheckpointStoreOptions & {\n store: RedisFrameworkStore;\n prefix?: string;\n ttlMs: number;\n };\n\nconst DEFAULT_MAX_CHECKPOINTS_PER_SESSION = 50;\n\nconst clone = <T>(value: T): T =>\n value === undefined ? value : (JSON.parse(JSON.stringify(value)) as T);\n\nconst uniqueStrings = (values: Iterable<string | undefined>): string[] =>\n Array.from(\n new Set(\n Array.from(values).filter(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0,\n ),\n ),\n );\n\nconst createId = (prefix: string): string => {\n return `${prefix}-${randomUUID()}`;\n};\nconst createResumeToken = (): string => randomUUID();\n\nconst toSummary = (record: SessionCheckpointRecord): CheckpointSummary => ({\n id: record.id,\n sessionId: record.sessionId,\n turnIndex: record.turnIndex,\n createdAt: record.createdAt,\n nodes: [...record.nodes],\n workflow: record.workflow,\n ...(record.label ? { label: record.label } : {}),\n ...(record.parentCheckpointId\n ? { parentCheckpointId: record.parentCheckpointId }\n : {}),\n ...(record.parentSessionId\n ? { parentSessionId: record.parentSessionId }\n : {}),\n ...(record.forkedFrom ? { forkedFrom: record.forkedFrom } : {}),\n ...(record.workflowVersion\n ? { workflowVersion: record.workflowVersion }\n : {}),\n ...(record.buildId ? { buildId: record.buildId } : {}),\n});\n\nexport function createRedisSessionCheckpointStore(\n options: RedisSessionCheckpointStoreOptions,\n): SessionCheckpointStore {\n const store = options.store;\n const ttlMs = options.ttlMs;\n const prefix = options.prefix ?? \"kortyx:session-cp:\";\n const maxCheckpointsPerSession =\n options.maxCheckpointsPerSession ?? DEFAULT_MAX_CHECKPOINTS_PER_SESSION;\n\n const byIdKey = (id: string) => `${prefix}by-id:${id}`;\n const sessionRecordKey = (sessionId: string, id: string) =>\n `${prefix}session:${sessionId}:${id}`;\n const sessionPrefix = (sessionId: string) => `${prefix}session:${sessionId}:`;\n const headKey = (sessionId: string) => `${prefix}head:${sessionId}`;\n\n const saveRecord = async (record: SessionCheckpointRecord): Promise<void> => {\n const serialized = JSON.stringify(record);\n await Promise.all([\n store.set(byIdKey(record.id), serialized, ttlMs),\n store.set(\n sessionRecordKey(record.sessionId, record.id),\n serialized,\n ttlMs,\n ),\n store.set(headKey(record.sessionId), record.id, ttlMs),\n ]);\n };\n\n const deleteRecord = async (\n record: SessionCheckpointRecord,\n ): Promise<void> => {\n await Promise.all([\n store.del(byIdKey(record.id)),\n store.del(sessionRecordKey(record.sessionId, record.id)),\n ]);\n };\n\n const getRecord = async (\n id: string,\n ): Promise<SessionCheckpointRecord | null> => {\n const raw = await store.get(byIdKey(id));\n return raw ? (JSON.parse(raw) as SessionCheckpointRecord) : null;\n };\n\n const sortedRecords = async (\n sessionId: string,\n ): Promise<SessionCheckpointRecord[]> => {\n const keys = await store.scanKeys(sessionPrefix(sessionId));\n const records = await Promise.all(\n keys.map(async (rawKey) => {\n const logicalKey = rawKey.includes(sessionPrefix(sessionId))\n ? rawKey.slice(rawKey.indexOf(sessionPrefix(sessionId)))\n : rawKey;\n const raw = await store.get(logicalKey);\n return raw ? (JSON.parse(raw) as SessionCheckpointRecord) : null;\n }),\n );\n return records\n .filter((record): record is SessionCheckpointRecord => Boolean(record))\n .sort((a, b) => a.turnIndex - b.turnIndex || a.createdAt - b.createdAt);\n };\n\n const prune = async (sessionId: string): Promise<void> => {\n const records = await sortedRecords(sessionId);\n const overflow = Math.max(0, records.length - maxCheckpointsPerSession);\n await Promise.all(records.slice(0, overflow).map(deleteRecord));\n };\n\n const getHead = async (\n sessionId: string,\n ): Promise<SessionCheckpointRecord | null> => {\n const headId = await store.get(headKey(sessionId));\n if (!headId) return null;\n const record = await getRecord(headId);\n return record ? clone(record) : null;\n };\n\n return {\n async list(sessionId) {\n return (await sortedRecords(sessionId)).map(toSummary);\n },\n\n async get(id) {\n const record = await getRecord(id);\n return record ? clone(record) : null;\n },\n\n getHead,\n\n async append(args: AppendSessionCheckpointArgs) {\n const previousHead = await getHead(args.sessionId);\n const pendingRequests = args.pendingRequests ?? [];\n const record: SessionCheckpointRecord = {\n id: createId(\"cp\"),\n sessionId: args.sessionId,\n runId: args.runId,\n ...(args.graphCheckpointId\n ? { graphCheckpointId: args.graphCheckpointId }\n : {}),\n turnIndex: previousHead ? previousHead.turnIndex + 1 : 0,\n createdAt: Date.now(),\n workflow: args.workflow,\n state: clone(args.state),\n nodes: uniqueStrings(args.nodes ?? []),\n effects: {\n structuredStreamIds: uniqueStrings(args.structuredStreamIds ?? []),\n interruptTokens: uniqueStrings(\n pendingRequests.map((request) => request.token),\n ),\n },\n activePendingRequests: clone(pendingRequests),\n ...(previousHead ? { parentCheckpointId: previousHead.id } : {}),\n ...(args.label ? { label: args.label } : {}),\n ...(args.workflowVersion\n ? { workflowVersion: args.workflowVersion }\n : {}),\n ...(args.buildId ? { buildId: args.buildId } : {}),\n };\n\n await saveRecord(record);\n await prune(args.sessionId);\n return clone(record);\n },\n\n async rollbackTo(\n id: CheckpointId,\n ): Promise<RollbackSessionCheckpointResult> {\n const target = await getRecord(id);\n if (!target)\n throw new KortyxError(\"NOT_FOUND\", `Checkpoint \"${id}\" not found.`, {\n category: \"request\",\n retryable: false,\n safeMessage: \"The requested checkpoint was not found.\",\n });\n\n const records = await sortedRecords(target.sessionId);\n const trailing = records.filter(\n (record) => record.turnIndex > target.turnIndex,\n );\n const invalidatedStructuredStreamIds = uniqueStrings(\n trailing.flatMap((record) => record.effects.structuredStreamIds),\n );\n const invalidatedInterruptTokens = uniqueStrings(\n trailing.flatMap((record) => [\n ...record.effects.interruptTokens,\n ...record.activePendingRequests.map((request) => request.token),\n ]),\n );\n\n await Promise.all(trailing.map(deleteRecord));\n await store.set(headKey(target.sessionId), target.id, ttlMs);\n\n return {\n sessionId: target.sessionId,\n head: target.id,\n invalidatedStructuredStreamIds,\n invalidatedInterruptTokens,\n activePendingRequests: clone(target.activePendingRequests),\n };\n },\n\n async fork(\n id: CheckpointId,\n options?: { newSessionId?: string },\n ): Promise<ForkSessionCheckpointResult> {\n const source = await getRecord(id);\n if (!source)\n throw new KortyxError(\"NOT_FOUND\", `Checkpoint \"${id}\" not found.`, {\n category: \"request\",\n retryable: false,\n safeMessage: \"The requested checkpoint was not found.\",\n });\n\n const sessionId = options?.newSessionId || createId(\"session\");\n const { parentCheckpointId: _parentCheckpointId, ...sourceRecord } =\n clone(source);\n const runId = source.activePendingRequests.some(\n (request) => request.graphSnapshot,\n )\n ? `run-${randomUUID()}`\n : source.runId;\n const forked: SessionCheckpointRecord = {\n ...sourceRecord,\n runId,\n id: createId(\"cp\"),\n sessionId,\n parentSessionId: source.sessionId,\n forkedFrom: source.id,\n activePendingRequests: clone(source.activePendingRequests).map(\n (request) => ({\n ...request,\n runId,\n token: createResumeToken(),\n requestId: createId(\"human\"),\n sessionId,\n }),\n ),\n };\n\n await saveRecord(forked);\n return {\n sessionId,\n parentSessionId: source.sessionId,\n forkedFrom: source.id,\n checkpoint: clone(forked),\n };\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { GraphState } from \"@kortyx/core\";\nimport { KortyxError } from \"@kortyx/core/errors\";\nimport type { PendingRequestRecord } from \"./pending-requests\";\n\nexport type CheckpointId = string;\n\nexport type CheckpointSummary = {\n id: CheckpointId;\n sessionId: string;\n turnIndex: number;\n createdAt: number;\n nodes: string[];\n workflow: string;\n label?: string;\n parentCheckpointId?: string;\n parentSessionId?: string;\n forkedFrom?: string;\n workflowVersion?: string;\n buildId?: string;\n /** PostgreSQL retains abandoned branches until their history window expires. */\n branchStatus?: \"active\" | \"abandoned\";\n};\n\nexport type SessionCheckpointRecord = CheckpointSummary & {\n runId: string;\n graphCheckpointId?: string;\n state: GraphState;\n effects: {\n structuredStreamIds: string[];\n interruptTokens: string[];\n };\n activePendingRequests: PendingRequestRecord[];\n};\n\nexport type AppendSessionCheckpointArgs = {\n sessionId: string;\n runId: string;\n graphCheckpointId?: string;\n workflow: string;\n state: GraphState;\n nodes?: string[];\n structuredStreamIds?: string[];\n pendingRequests?: PendingRequestRecord[];\n label?: string;\n workflowVersion?: string;\n buildId?: string;\n};\n\nexport type RollbackSessionCheckpointResult = {\n sessionId: string;\n head: CheckpointId;\n invalidatedStructuredStreamIds: string[];\n invalidatedInterruptTokens: string[];\n activePendingRequests: PendingRequestRecord[];\n};\n\nexport type ForkSessionCheckpointResult = {\n sessionId: string;\n parentSessionId: string;\n forkedFrom: CheckpointId;\n checkpoint: SessionCheckpointRecord;\n};\n\nexport type SessionCheckpointStore = {\n /** The store publishes pending requests in the same transaction as the session transition. */\n managesPendingRequests?: boolean;\n list: (sessionId: string) => Promise<CheckpointSummary[]>;\n get: (id: CheckpointId) => Promise<SessionCheckpointRecord | null>;\n getHead: (sessionId: string) => Promise<SessionCheckpointRecord | null>;\n append: (\n args: AppendSessionCheckpointArgs,\n ) => Promise<SessionCheckpointRecord>;\n rollbackTo: (\n id: CheckpointId,\n options?: {\n preparePendingRequests?: (requests: PendingRequestRecord[]) => void;\n },\n ) => Promise<RollbackSessionCheckpointResult>;\n fork: (\n id: CheckpointId,\n options?: {\n newSessionId?: string;\n preparePendingRequests?: (requests: PendingRequestRecord[]) => void;\n },\n ) => Promise<ForkSessionCheckpointResult>;\n};\n\nexport type SessionCheckpointStoreOptions = {\n maxCheckpointsPerSession?: number;\n};\n\nconst DEFAULT_MAX_CHECKPOINTS_PER_SESSION = 50;\n\nconst createCheckpointId = (): string => `cp-${randomUUID()}`;\nconst createSessionId = (): string => `session-${randomUUID()}`;\nconst createResumeToken = (): string => randomUUID();\nconst createRequestId = (): string => `human-${randomUUID()}`;\n\nconst clone = <T>(value: T): T =>\n value === undefined ? value : (JSON.parse(JSON.stringify(value)) as T);\n\nconst toSummary = (record: SessionCheckpointRecord): CheckpointSummary => ({\n id: record.id,\n sessionId: record.sessionId,\n turnIndex: record.turnIndex,\n createdAt: record.createdAt,\n nodes: [...record.nodes],\n workflow: record.workflow,\n ...(record.label ? { label: record.label } : {}),\n ...(record.parentCheckpointId\n ? { parentCheckpointId: record.parentCheckpointId }\n : {}),\n ...(record.parentSessionId\n ? { parentSessionId: record.parentSessionId }\n : {}),\n ...(record.forkedFrom ? { forkedFrom: record.forkedFrom } : {}),\n ...(record.workflowVersion\n ? { workflowVersion: record.workflowVersion }\n : {}),\n ...(record.buildId ? { buildId: record.buildId } : {}),\n});\n\nconst uniqueStrings = (values: Iterable<string | undefined>): string[] =>\n Array.from(\n new Set(\n Array.from(values).filter(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0,\n ),\n ),\n );\n\nexport function createInMemorySessionCheckpointStore(\n options?: SessionCheckpointStoreOptions,\n): SessionCheckpointStore {\n const maxCheckpointsPerSession =\n options?.maxCheckpointsPerSession ?? DEFAULT_MAX_CHECKPOINTS_PER_SESSION;\n const byId = new Map<string, SessionCheckpointRecord>();\n const bySession = new Map<string, string[]>();\n const headBySession = new Map<string, string>();\n\n const sortedRecords = (sessionId: string): SessionCheckpointRecord[] =>\n (bySession.get(sessionId) ?? [])\n .map((id) => byId.get(id))\n .filter((record): record is SessionCheckpointRecord => Boolean(record))\n .sort((a, b) => a.turnIndex - b.turnIndex || a.createdAt - b.createdAt);\n\n const saveRecord = (record: SessionCheckpointRecord): void => {\n byId.set(record.id, clone(record));\n const ids = bySession.get(record.sessionId) ?? [];\n /* v8 ignore next -- checkpoint ids are generated internally, so public store calls cannot save the same id twice. */\n if (!ids.includes(record.id)) ids.push(record.id);\n bySession.set(record.sessionId, ids);\n headBySession.set(record.sessionId, record.id);\n };\n\n const deleteRecord = (record: SessionCheckpointRecord): void => {\n byId.delete(record.id);\n bySession.set(\n record.sessionId,\n /* v8 ignore next -- deleteRecord only receives records that came from this session index. */\n (bySession.get(record.sessionId) ?? []).filter((id) => id !== record.id),\n );\n };\n\n const prune = (sessionId: string): void => {\n const records = sortedRecords(sessionId);\n const overflow = Math.max(0, records.length - maxCheckpointsPerSession);\n for (const record of records.slice(0, overflow)) {\n deleteRecord(record);\n }\n };\n\n const getHead = async (\n sessionId: string,\n ): Promise<SessionCheckpointRecord | null> => {\n const headId = headBySession.get(sessionId);\n if (!headId) return null;\n const record = byId.get(headId);\n return record ? clone(record) : null;\n };\n\n return {\n async list(sessionId) {\n return sortedRecords(sessionId).map(toSummary);\n },\n\n async get(id) {\n const record = byId.get(id);\n return record ? clone(record) : null;\n },\n\n getHead,\n\n async append(args) {\n const previousHead = await getHead(args.sessionId);\n const turnIndex = previousHead ? previousHead.turnIndex + 1 : 0;\n const pendingRequests = args.pendingRequests ?? [];\n const record: SessionCheckpointRecord = {\n id: createCheckpointId(),\n sessionId: args.sessionId,\n runId: args.runId,\n ...(args.graphCheckpointId\n ? { graphCheckpointId: args.graphCheckpointId }\n : {}),\n turnIndex,\n createdAt: Date.now(),\n workflow: args.workflow,\n state: clone(args.state),\n nodes: uniqueStrings(args.nodes ?? []),\n effects: {\n structuredStreamIds: uniqueStrings(args.structuredStreamIds ?? []),\n interruptTokens: uniqueStrings(\n pendingRequests.map((request) => request.token),\n ),\n },\n activePendingRequests: clone(pendingRequests),\n ...(previousHead ? { parentCheckpointId: previousHead.id } : {}),\n ...(args.label ? { label: args.label } : {}),\n ...(args.workflowVersion\n ? { workflowVersion: args.workflowVersion }\n : {}),\n ...(args.buildId ? { buildId: args.buildId } : {}),\n };\n\n saveRecord(record);\n prune(args.sessionId);\n return clone(record);\n },\n\n async rollbackTo(id) {\n const target = byId.get(id);\n if (!target) {\n throw new KortyxError(\"NOT_FOUND\", `Checkpoint \"${id}\" not found.`, {\n category: \"request\",\n retryable: false,\n safeMessage: \"The requested checkpoint was not found.\",\n });\n }\n\n const records = sortedRecords(target.sessionId);\n const trailing = records.filter(\n (record) => record.turnIndex > target.turnIndex,\n );\n const invalidatedStructuredStreamIds = uniqueStrings(\n trailing.flatMap((record) => record.effects.structuredStreamIds),\n );\n const invalidatedInterruptTokens = uniqueStrings(\n trailing.flatMap((record) => [\n ...record.effects.interruptTokens,\n ...record.activePendingRequests.map((request) => request.token),\n ]),\n );\n\n for (const record of trailing) deleteRecord(record);\n headBySession.set(target.sessionId, target.id);\n\n return {\n sessionId: target.sessionId,\n head: target.id,\n invalidatedStructuredStreamIds,\n invalidatedInterruptTokens,\n activePendingRequests: clone(target.activePendingRequests),\n };\n },\n\n async fork(id, options) {\n const source = byId.get(id);\n if (!source) {\n throw new KortyxError(\"NOT_FOUND\", `Checkpoint \"${id}\" not found.`, {\n category: \"request\",\n retryable: false,\n safeMessage: \"The requested checkpoint was not found.\",\n });\n }\n\n const sessionId = options?.newSessionId || createSessionId();\n const { parentCheckpointId: _parentCheckpointId, ...sourceRecord } =\n clone(source);\n const runId = source.activePendingRequests.some(\n (request) => request.graphSnapshot,\n )\n ? `run-${randomUUID()}`\n : source.runId;\n const forked: SessionCheckpointRecord = {\n ...sourceRecord,\n runId,\n id: createCheckpointId(),\n sessionId,\n parentSessionId: source.sessionId,\n forkedFrom: source.id,\n activePendingRequests: clone(source.activePendingRequests).map(\n (request) => ({\n ...request,\n runId,\n token: createResumeToken(),\n requestId: createRequestId(),\n sessionId,\n }),\n ),\n };\n\n saveRecord(forked);\n return {\n sessionId,\n parentSessionId: source.sessionId,\n forkedFrom: source.id,\n checkpoint: clone(forked),\n };\n },\n };\n}\n","import type { BaseCheckpointSaver } from \"@langchain/langgraph-checkpoint\";\nimport {\n createCachingFrameworkAdapter,\n registerFrameworkCache,\n} from \"./caching\";\nimport { createInMemoryCheckpointSaver } from \"./in-memory-checkpointer\";\nimport {\n emptyPruneResult,\n type RuntimeMaintenance,\n resolvePruneOptions,\n} from \"./maintenance\";\nimport {\n createInMemoryPendingRequestStore,\n type PendingRequestStore,\n} from \"./pending-requests\";\nimport {\n createPostgresFrameworkAdapter,\n type PostgresFrameworkAdapter,\n} from \"./postgres/adapter\";\nimport { createRedisPendingRequestStore } from \"./redis/pending-request-store\";\nimport { createRedisCheckpointSaver } from \"./redis/redis-checkpointer\";\nimport { createRedisFrameworkStore } from \"./redis/redis-store\";\nimport { createRedisSessionCheckpointStore } from \"./redis/session-checkpoint-store\";\nimport {\n createInMemorySessionCheckpointStore,\n type SessionCheckpointStore,\n} from \"./session-checkpoints\";\n\nexport type FrameworkAdapter = {\n kind: \"in-memory\" | \"redis\" | \"postgres\";\n pendingRequests: PendingRequestStore;\n sessionCheckpoints: SessionCheckpointStore;\n checkpointer: BaseCheckpointSaver;\n ttlMs: number;\n /** Optional for legacy custom adapters; required on every built-in adapter. */\n maintenance?: RuntimeMaintenance;\n /** Optional for legacy custom adapters; closes owned connections. */\n close?: () => Promise<void>;\n /** Protects execution from concurrent retention cleanup. Released after the entire outcome is persisted. */\n acquireRunLease?: (args: {\n runId: string;\n sessionId?: string;\n onLost: (cause: unknown) => void;\n }) => Promise<() => Promise<void>>;\n /**\n * Best-effort cleanup for ephemeral framework state for a single run.\n * Called when a workflow completes without pausing for an interrupt.\n */\n cleanupRun?: (runId: string, namespaces: string[]) => Promise<void>;\n};\n\n/** Shared lifecycle contract implemented by every built-in adapter.\n * FrameworkAdapter remains available for existing custom implementations.\n */\nexport type ManagedFrameworkAdapter = FrameworkAdapter & {\n maintenance: RuntimeMaintenance;\n /** Close owned connections after in-flight executions finish. */\n close: () => Promise<void>;\n};\n\nexport type CreateInMemoryFrameworkAdapterOptions = {\n ttlMs?: number;\n maxSessionCheckpoints?: number;\n};\n\nexport function createInMemoryFrameworkAdapter(\n options?: CreateInMemoryFrameworkAdapterOptions,\n): ManagedFrameworkAdapter {\n const ttlMs = options?.ttlMs ?? 15 * 60 * 1000;\n const checkpointer = createInMemoryCheckpointSaver();\n const pendingRequests = createInMemoryPendingRequestStore();\n return {\n kind: \"in-memory\",\n ttlMs,\n pendingRequests,\n maintenance: {\n setup: async () => {},\n prune: async (options) => {\n const { now, batchSize } = resolvePruneOptions(options);\n const result = emptyPruneResult();\n result.deleted.pendingRequests = pendingRequests.pruneExpired(\n now,\n batchSize,\n );\n result.hasMore = result.deleted.pendingRequests === batchSize;\n return result;\n },\n },\n close: async () => {},\n sessionCheckpoints: createInMemorySessionCheckpointStore({\n ...(options?.maxSessionCheckpoints !== undefined\n ? { maxCheckpointsPerSession: options.maxSessionCheckpoints }\n : {}),\n }),\n checkpointer,\n cleanupRun: async (runId: string) => {\n try {\n await checkpointer.deleteThread(runId);\n } catch {\n // best-effort cleanup only\n }\n },\n };\n}\n\nexport type CreateRedisFrameworkAdapterOptions = {\n url: string;\n ttlMs?: number;\n prefix?: string;\n maxSessionCheckpoints?: number;\n};\n\nexport function createRedisFrameworkAdapter(\n options: CreateRedisFrameworkAdapterOptions,\n): ManagedFrameworkAdapter {\n const ttlMs = options.ttlMs ?? 15 * 60 * 1000;\n const store = createRedisFrameworkStore({\n url: options.url,\n prefix: options.prefix ?? \"kortyx:fw:\",\n });\n const cpPrefix = \"kortyx:cp:\";\n const adapter: ManagedFrameworkAdapter = {\n kind: \"redis\",\n ttlMs,\n maintenance: {\n setup: async () => {},\n prune: async (options) => {\n resolvePruneOptions(options);\n // Redis owns physical expiry through native key TTL; no scan/delete job is needed.\n return emptyPruneResult();\n },\n },\n close: async () => {\n await store.close?.();\n },\n pendingRequests: createRedisPendingRequestStore({\n store,\n prefix: \"kortyx:pending:\",\n }),\n sessionCheckpoints: createRedisSessionCheckpointStore({\n store,\n ttlMs,\n prefix: \"kortyx:session-cp:\",\n ...(options.maxSessionCheckpoints !== undefined\n ? { maxCheckpointsPerSession: options.maxSessionCheckpoints }\n : {}),\n }),\n checkpointer: createRedisCheckpointSaver({\n store,\n ttlMs,\n prefix: cpPrefix,\n }),\n cleanupRun: async (runId: string, namespaces: string[]) => {\n // Avoid SCAN-based deletes in hot paths. We can deterministically delete\n // keys by reading the per-namespace latest pointer.\n const nsList = namespaces.length > 0 ? namespaces : [\"\"];\n await Promise.all(\n nsList.map(async (checkpointNs) => {\n const ns = String(checkpointNs ?? \"\");\n const latestKey = `${cpPrefix}latest:${runId}:${ns}`;\n const checkpointId = (await store.get(latestKey)) ?? \"\";\n if (!checkpointId) return;\n await Promise.all([\n store.del(`${cpPrefix}chk:${runId}:${ns}:${checkpointId}`),\n store.del(`${cpPrefix}wr:${runId}:${ns}:${checkpointId}`),\n store.del(latestKey),\n ]);\n }),\n );\n },\n };\n registerFrameworkCache(\n adapter,\n {\n get: (key) => store.get(`kortyx:runtime-cache:${key}`),\n set: (key, value, ttl) =>\n store.set(`kortyx:runtime-cache:${key}`, value, ttl),\n close: () => adapter.close(),\n },\n ttlMs,\n );\n return adapter;\n}\n\nexport function createFrameworkAdapterFromEnv(\n env: Record<string, string | undefined> = process.env,\n):\n | (ManagedFrameworkAdapter & { kind: \"in-memory\" | \"redis\" })\n | PostgresFrameworkAdapter {\n const url =\n env.KORTYX_REDIS_URL ||\n env.REDIS_URL ||\n env.KORTYX_FRAMEWORK_REDIS_URL ||\n \"\";\n const ttlMsRaw = env.KORTYX_FRAMEWORK_TTL_MS || env.KORTYX_TTL_MS || \"\";\n const ttlMs = ttlMsRaw ? Number(ttlMsRaw) : undefined;\n\n if (env.KORTYX_POSTGRES_URL) {\n const storage = createPostgresFrameworkAdapter({\n connectionString: env.KORTYX_POSTGRES_URL,\n ...(ttlMs !== undefined ? { ttlMs } : {}),\n });\n return url\n ? createCachingFrameworkAdapter({\n storage,\n cache: createRedisFrameworkAdapter({ url }),\n })\n : storage;\n }\n\n if (url)\n return createRedisFrameworkAdapter({\n url,\n ...(ttlMs ? { ttlMs } : {}),\n }) as ManagedFrameworkAdapter & { kind: \"redis\" };\n\n // Dev fallback: in-memory. Not production-safe for resume across processes.\n return createInMemoryFrameworkAdapter({\n ...(ttlMs ? { ttlMs } : {}),\n }) as ManagedFrameworkAdapter & { kind: \"in-memory\" };\n}\n","import { setTimeout as delay } from \"node:timers/promises\";\nimport type {\n GraphState,\n InterruptInput,\n InterruptResumeValue,\n NodeConfig,\n NodeResult,\n WorkflowDefinition,\n} from \"@kortyx/core\";\nimport {\n assertExecutionBudget,\n consumeExecutionBudget,\n isExecutionCancelled,\n isExecutionLimitReached,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport { KortyxError } from \"@kortyx/core/errors\";\nimport type { KortyxTelemetryConfig, ReasonTraceAdapter } from \"@kortyx/hooks\";\nimport { runWithHookContext } from \"@kortyx/hooks\";\nimport {\n safeTelemetryMetadata,\n withSafeTraceSpan,\n} from \"@kortyx/hooks/internal\";\nimport type { GetProviderFn } from \"@kortyx/providers\";\nimport { deepMergeWithArrayOverwrite } from \"@kortyx/utils\";\nimport {\n Annotation,\n interrupt,\n isGraphInterrupt,\n StateGraph,\n} from \"@langchain/langgraph\";\nimport type { BaseCheckpointSaver } from \"@langchain/langgraph-checkpoint\";\nimport { getCheckpointer } from \"../checkpointer\";\nimport { resolveNodeHandler } from \"../node-loader\";\nimport { createWorkflowCallService } from \"./call-workflow\";\nimport {\n addParallelGraphCoordinator,\n hasParallelEdges,\n type NodeExecutor,\n} from \"./parallel-graph\";\n\ninterface CompiledGraphBase {\n invoke(state: unknown, options?: Record<string, unknown>): Promise<unknown>;\n streamEvents(\n state: GraphState,\n options?: { version?: string; configurable?: Record<string, unknown> },\n ): AsyncIterable<unknown> | AsyncGenerator<unknown>;\n}\n\nexport type ExecutionControl = {\n completeResponse?:\n | ((\n options: import(\"@kortyx/hooks\").CompleteResponseOptions,\n state: GraphState,\n ) => Promise<void>)\n | undefined;\n abortSignal?: AbortSignal | undefined;\n budget?: import(\"@kortyx/core\").ExecutionBudget | undefined;\n};\n\ninterface GraphExtensions {\n execution: ExecutionControl;\n name: string;\n config: ExecutionRuntimeConfig;\n resume(state: GraphState, input: unknown): Promise<GraphState>;\n timeTravelTo(state: GraphState, checkpointId: string): Promise<GraphState>;\n}\n\ninterface InterruptResultWithId {\n id: string;\n}\n\ninterface HookPatchError {\n __kortyxHookStatePatch?: Record<string, unknown> | null;\n}\n\nexport interface ExecutionRuntimeConfig {\n executionRunId?: string | undefined;\n executionBranchId?: string | undefined;\n prepareChildTelemetry?:\n | ((\n workflow: WorkflowDefinition,\n config: ExecutionRuntimeConfig,\n ) => ExecutionRuntimeConfig)\n | undefined;\n selectWorkflow?: ((id: string) => Promise<WorkflowDefinition>) | undefined;\n workflowCallDepth?: number;\n invocationPath?: string;\n emit?: (event: string, payload: unknown) => void;\n onCheckpoint?: (args: { nodeId: string; state: GraphState }) => void;\n checkpointer?: BaseCheckpointSaver;\n reasonTrace?: ReasonTraceAdapter | undefined;\n telemetry?: KortyxTelemetryConfig | undefined;\n getProvider?: GetProviderFn | undefined;\n [key: string]: unknown;\n}\n\nexport async function createExecutionGraph(\n workflow: WorkflowDefinition,\n config: ExecutionRuntimeConfig,\n execution: ExecutionControl = {},\n) {\n const StateAnnotation = Annotation.Root({\n currentWorkflow: Annotation<string>,\n input: Annotation<unknown>,\n output: Annotation<string>,\n lastNode: Annotation<string>,\n lastCondition: Annotation<string>,\n lastIntent: Annotation<string>,\n runtime: Annotation<Record<string, unknown>>({\n reducer: (l, r) => deepMergeWithArrayOverwrite(l ?? {}, r ?? {}),\n default: () => ({}),\n }),\n config: Annotation<unknown>,\n transitionTo: Annotation<string | null>,\n data: Annotation<Record<string, unknown>>({\n reducer: (l, r) => deepMergeWithArrayOverwrite(l ?? {}, r ?? {}),\n default: () => ({}),\n }),\n conversationHistory: Annotation<\n Array<{ node: string; message: string; timestamp: string }>\n >({\n reducer: (l, r) => [...(l ?? []), ...(r ?? [])],\n default: () => [],\n }),\n awaitingHumanInput: Annotation<boolean>,\n });\n\n const builder = new StateGraph(StateAnnotation);\n const edgeApi = builder as unknown as {\n addEdge: (from: string, to: string) => void;\n addConditionalEdges: (\n from: string,\n fn: (s: GraphState) => string,\n mapping: Record<string, string>,\n ) => void;\n compile: (args: { checkpointer: BaseCheckpointSaver }) => CompiledGraphBase;\n };\n const workflowName = workflow.id;\n const parallelGraph = hasParallelEdges(workflow);\n const nodeExecutors: Record<string, NodeExecutor> = {};\n\n // Ensure an emit function exists so internal hook plumbing can emit events.\n type WithEmit = ExecutionRuntimeConfig & {\n emit: (event: string, payload: unknown) => void;\n };\n const runtimeConfig = config as WithEmit;\n if (!runtimeConfig.emit) {\n runtimeConfig.emit = () => {};\n }\n\n const isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\n const traceAdapter = (): ReasonTraceAdapter | undefined =>\n runtimeConfig.telemetry?.trace ?? runtimeConfig.reasonTrace;\n\n const telemetryCorrelation = () => runtimeConfig.telemetry?.correlation;\n\n const configContext = (): Record<string, unknown> | undefined =>\n isRecord(runtimeConfig.context) ? runtimeConfig.context : undefined;\n\n const toRecordInput = (value: unknown): Record<string, unknown> => {\n if (isRecord(value)) return value;\n if (value === undefined) return {};\n return { rawInput: value };\n };\n\n const buildNodeConfig = (\n params: Record<string, unknown> | undefined,\n nodeBehavior: Record<string, unknown> | undefined,\n ): NodeConfig => {\n const model = isRecord(params?.model)\n ? (params.model as NodeConfig[\"model\"])\n : undefined;\n const tool = isRecord(params?.tool)\n ? (params.tool as NodeConfig[\"tool\"])\n : undefined;\n const behaviorFromParams = isRecord(params?.behavior)\n ? (params.behavior as NodeConfig[\"behavior\"])\n : undefined;\n const behavior: NonNullable<NodeConfig[\"behavior\"]> = {\n ...(behaviorFromParams ?? {}),\n ...(nodeBehavior ?? {}),\n };\n const options = params ?? undefined;\n return {\n ...(model ? { model } : {}),\n ...(tool ? { tool } : {}),\n ...(Object.keys(behavior).length > 0 ? { behavior } : {}),\n ...(options ? { options } : {}),\n } as NodeConfig;\n };\n\n for (const [nodeId, nodeDef] of Object.entries(workflow.nodes ?? {})) {\n const resolvedRun = await resolveNodeHandler({\n run: nodeDef.run,\n workflow,\n });\n const nodeParams = (nodeDef.params ?? undefined) as\n | Record<string, unknown>\n | undefined;\n const nodeConfig: NodeConfig = buildNodeConfig(\n nodeParams,\n (nodeDef.behavior ?? undefined) as unknown as\n | Record<string, unknown>\n | undefined,\n );\n const behavior = nodeConfig.behavior ?? {};\n\n const executeNode: NodeExecutor = async (\n state,\n awaitInput,\n snapshotGraph,\n ) => {\n throwIfExecutionAborted(execution.abortSignal);\n const emitRuntimeEvent = (event: string, payload: unknown) => {\n runtimeConfig.emit(event, payload);\n };\n if (awaitInput)\n emitRuntimeEvent(\"status\", {\n node: nodeId,\n message: `Processing node: ${nodeId}`,\n });\n let suspension: unknown;\n let deniedAdmission: unknown;\n const hookNodeContext = {\n completeResponse: runtimeConfig.workflowCallDepth\n ? undefined\n : execution.completeResponse\n ? async (\n options: import(\"@kortyx/hooks\").CompleteResponseOptions,\n nodeState: GraphState,\n ) => {\n await execution.completeResponse?.(\n options,\n snapshotGraph ? snapshotGraph(nodeState) : nodeState,\n );\n }\n : undefined,\n abortSignal: execution.abortSignal,\n consumeExecution: (limit: import(\"@kortyx/core\").ExecutionLimit) => {\n throwIfExecutionAborted(execution.abortSignal);\n if (suspension) throw suspension;\n try {\n if (execution.budget)\n consumeExecutionBudget(execution.budget, limit);\n } catch (error) {\n deniedAdmission = error;\n throw error;\n }\n },\n workflowCallTelemetry: runtimeConfig.telemetry\n ? {\n ...runtimeConfig.telemetry,\n correlation: {\n ...runtimeConfig.telemetry.correlation,\n runId: runtimeConfig.executionRunId,\n branchId:\n runtimeConfig.executionBranchId ??\n runtimeConfig.executionRunId,\n },\n }\n : undefined,\n ...(runtimeConfig.selectWorkflow\n ? {\n callWorkflow: createWorkflowCallService(\n {\n ...runtimeConfig,\n context: state.config?.context ?? runtimeConfig.context,\n },\n workflow,\n execution,\n ),\n }\n : {}),\n graph: { name: workflowName, node: nodeId },\n config: nodeConfig,\n emit: emitRuntimeEvent,\n awaitInterrupt: (\n interruptConfig: InterruptInput,\n ): InterruptResumeValue => {\n throwIfExecutionAborted(execution.abortSignal);\n if (execution.budget) assertExecutionBudget(execution.budget);\n const { kind, question } = interruptConfig;\n const isCustom = kind === \"custom\";\n const isMulti =\n kind === \"multi-choice\" ||\n (interruptConfig.kind === \"choice\" &&\n interruptConfig.multiple === true);\n const sharedInterruptFields = {\n ...(typeof interruptConfig.id === \"string\" &&\n interruptConfig.id.length > 0\n ? { id: interruptConfig.id }\n : {}),\n ...(typeof interruptConfig.schemaId === \"string\" &&\n interruptConfig.schemaId.length > 0\n ? { schemaId: interruptConfig.schemaId }\n : {}),\n ...(typeof interruptConfig.schemaVersion === \"string\" &&\n interruptConfig.schemaVersion.length > 0\n ? { schemaVersion: interruptConfig.schemaVersion }\n : {}),\n ...(interruptConfig.meta &&\n typeof interruptConfig.meta === \"object\" &&\n !Array.isArray(interruptConfig.meta)\n ? { meta: interruptConfig.meta }\n : {}),\n };\n const payload: InterruptInput = isCustom\n ? {\n kind: \"custom\",\n request: interruptConfig.request,\n ...(question ? { question } : {}),\n ...(interruptConfig.contract\n ? { contract: interruptConfig.contract }\n : {}),\n schemaId: interruptConfig.schemaId,\n schemaVersion: interruptConfig.schemaVersion,\n ...sharedInterruptFields,\n }\n : interruptConfig.kind === \"text\"\n ? {\n kind: \"text\",\n ...(question ? { question } : {}),\n ...sharedInterruptFields,\n }\n : {\n kind: interruptConfig.kind,\n multiple: isMulti,\n question: interruptConfig.question,\n options: interruptConfig.options,\n ...sharedInterruptFields,\n };\n let resumed: unknown;\n try {\n resumed = awaitInput ? awaitInput(payload) : interrupt(payload);\n } catch (error) {\n suspension = error;\n if (!awaitInput)\n emitRuntimeEvent(\"interrupt\", {\n node: nodeId,\n workflow: workflowName,\n input: payload,\n });\n throw error;\n }\n if (isCustom) return resumed;\n if (isMulti) {\n if (Array.isArray(resumed)) {\n return (resumed as unknown[])\n .map((v) =>\n typeof v === \"string\"\n ? v\n : v &&\n typeof v === \"object\" &&\n \"id\" in v &&\n typeof (v as InterruptResultWithId).id === \"string\"\n ? (v as InterruptResultWithId).id\n : \"\",\n )\n .filter(Boolean);\n }\n if (typeof resumed === \"string\") return [resumed];\n return [];\n }\n if (typeof resumed === \"string\") return resumed;\n if (\n resumed &&\n typeof resumed === \"object\" &&\n \"id\" in resumed &&\n typeof (resumed as InterruptResultWithId).id === \"string\"\n ) {\n return String((resumed as InterruptResultWithId).id);\n }\n return \"\";\n },\n };\n\n if (behavior.checkpoint && config?.onCheckpoint) {\n config.onCheckpoint({ nodeId, state });\n }\n\n const maxAttempts = behavior.retry?.maxAttempts ?? 1;\n let attempt = 0;\n let nodeResult: NodeResult | undefined;\n let hookRuntimeUpdates: Record<string, unknown> | null = null;\n let retryHookRuntime: Record<string, unknown> | null = null;\n\n while (attempt < maxAttempts) {\n try {\n throwIfExecutionAborted(execution.abortSignal);\n attempt++;\n const attemptState =\n retryHookRuntime && typeof retryHookRuntime === \"object\"\n ? ({\n ...state,\n runtime: deepMergeWithArrayOverwrite(\n (state.runtime ?? {}) as Record<string, unknown>,\n retryHookRuntime,\n ),\n } as GraphState)\n : state;\n const activeTrace = traceAdapter();\n const hookContext = {\n node: hookNodeContext,\n state: attemptState,\n reasonTrace: activeTrace,\n };\n const runNode = () =>\n runWithHookContext(hookContext, async () => {\n try {\n hookNodeContext.consumeExecution(\"maxNodeExecutions\");\n const result = await resolvedRun({\n input: state.input,\n params: (nodeParams ?? {}) as Record<string, unknown>,\n });\n throwIfExecutionAborted(execution.abortSignal);\n // A sibling may exhaust the shared budget while this admitted\n // node completes. Preserve its result; only its own denial\n // prevents a caught limit from committing fallback output.\n if (deniedAdmission) throw deniedAdmission;\n if (suspension) throw suspension;\n return result;\n } catch (error) {\n throwIfExecutionAborted(execution.abortSignal);\n if (deniedAdmission) throw deniedAdmission;\n throw error;\n }\n });\n const context = configContext();\n const spanArgs = {\n name: \"kortyx.node\",\n attributes: {\n ...(typeof telemetryCorrelation()?.runId === \"string\"\n ? { runId: telemetryCorrelation()?.runId }\n : {}),\n ...(typeof telemetryCorrelation()?.sessionId === \"string\"\n ? { sessionId: telemetryCorrelation()?.sessionId }\n : {}),\n workflowId: workflowName,\n ...(typeof telemetryCorrelation()?.workflowRevisionId === \"string\"\n ? {\n workflowRevisionId:\n telemetryCorrelation()?.workflowRevisionId,\n }\n : {}),\n ...(typeof telemetryCorrelation()?.topologyHash === \"string\"\n ? { topologyHash: telemetryCorrelation()?.topologyHash }\n : {}),\n invocationId: runtimeConfig.telemetry?.correlation?.invocationId,\n branchId:\n runtimeConfig.executionBranchId ?? runtimeConfig.executionRunId,\n nodeId,\n attempt,\n ...(typeof context?.userId === \"string\"\n ? { userId: context.userId }\n : {}),\n ...(typeof context?.tenantId === \"string\"\n ? { tenantId: context.tenantId }\n : {}),\n },\n telemetry: {\n metadata: safeTelemetryMetadata({\n ...(runtimeConfig.telemetry?.metadata ?? {}),\n }),\n tags: runtimeConfig.telemetry?.tags,\n captureContent: runtimeConfig.telemetry?.captureContent,\n },\n };\n const hookRun = await withSafeTraceSpan(\n activeTrace,\n spanArgs,\n runNode,\n );\n nodeResult = hookRun.result as NodeResult;\n hookRuntimeUpdates = hookRun.runtimeUpdates;\n break;\n } catch (err) {\n const patch = (err as HookPatchError)?.__kortyxHookStatePatch as\n | Record<string, unknown>\n | null\n | undefined;\n if (patch && typeof patch === \"object\") {\n // Preserve hook runtime state even when execution pauses via interrupt.\n // Without this merge, checkpointed hook state (e.g. useReason drafts)\n // can be lost before resume.\n state.runtime = deepMergeWithArrayOverwrite(\n (state.runtime ?? {}) as Record<string, unknown>,\n patch,\n );\n retryHookRuntime = deepMergeWithArrayOverwrite(\n (retryHookRuntime ?? {}) as Record<string, unknown>,\n patch,\n );\n }\n throwIfExecutionAborted(execution.abortSignal);\n if (isExecutionLimitReached(err)) {\n Object.assign(err, { nodeId, workflowId: workflowName });\n throw err;\n }\n if (isExecutionCancelled(err) || isGraphInterrupt(err)) throw err;\n const hasMore = attempt < maxAttempts;\n const delayMs = behavior.retry?.delayMs ?? 0;\n if (hasMore && delayMs > 0) {\n await delay(delayMs, undefined, { signal: execution.abortSignal });\n continue;\n }\n if (!hasMore) throw err;\n }\n }\n\n throwIfExecutionAborted(execution.abortSignal);\n const res: NodeResult = (nodeResult ?? {}) as NodeResult;\n if (hookRuntimeUpdates) {\n res.infra = {\n ...(res.infra ?? {}),\n runtime: deepMergeWithArrayOverwrite(\n ((res.infra?.runtime ?? {}) as Record<string, unknown>) || {},\n hookRuntimeUpdates,\n ),\n };\n }\n const uiMessage = res.ui?.message;\n const shouldRespond =\n typeof uiMessage === \"string\" && uiMessage.trim().length > 0;\n\n if (shouldRespond) {\n emitRuntimeEvent(\"message\", { node: nodeId, content: uiMessage });\n }\n\n if (res.transitionTo) {\n if (awaitInput)\n throw Object.assign(\n new KortyxError(\n \"GRAPH_BRANCH_HANDOFF\",\n \"transitionTo cannot hand off from a parallel branch; useWorkflow returns to its caller.\",\n {\n category: \"workflow\",\n retryable: false,\n safeMessage:\n \"transitionTo cannot hand off from a parallel branch; useWorkflow returns to its caller.\",\n },\n ),\n { __kortyxHookStatePatch: hookRuntimeUpdates },\n );\n emitRuntimeEvent(\"transition\", {\n node: nodeId,\n workflow: workflowName,\n transitionTo: res.transitionTo,\n payload: res.data ?? {},\n });\n }\n\n const updates: Record<string, unknown> = {};\n\n if (typeof res.condition === \"string\")\n updates.lastCondition = res.condition;\n if (typeof res.intent === \"string\") updates.lastIntent = res.intent;\n\n if (res.data && typeof res.data === \"object\") {\n // Treat node `data` as the flowing payload between nodes.\n // Accumulate by merging into the previous input (if any).\n updates.input = deepMergeWithArrayOverwrite(\n toRecordInput(state.input),\n res.data as Record<string, unknown>,\n );\n updates.data = deepMergeWithArrayOverwrite(\n (state.data ?? {}) as Record<string, unknown>,\n res.data as Record<string, unknown>,\n );\n }\n if (res.infra?.runtime && typeof res.infra.runtime === \"object\") {\n updates.runtime = deepMergeWithArrayOverwrite(\n (state.runtime ?? {}) as Record<string, unknown>,\n res.infra.runtime as Record<string, unknown>,\n );\n }\n\n if (res.ui) {\n updates.ui = {\n message:\n typeof res.ui.message === \"string\"\n ? res.ui.message\n : (state.ui?.message ?? \"\"),\n structured: deepMergeWithArrayOverwrite(\n (state.ui?.structured ?? {}) as Record<string, unknown>,\n (res.ui.structured ?? {}) as Record<string, unknown>,\n ),\n };\n }\n\n if (shouldRespond && uiMessage) {\n updates.conversationHistory = [\n ...(state.conversationHistory ?? []),\n {\n node: nodeId,\n message: uiMessage,\n timestamp: new Date().toISOString(),\n },\n ];\n }\n\n if (res.ui?.structured) {\n const payload = res.ui.structured as Record<string, unknown>;\n const inferredType =\n payload && typeof payload === \"object\" && \"jobs\" in payload\n ? \"jobs\"\n : typeof (payload as { summary?: unknown }).summary === \"string\" ||\n (payload as { topJobs?: unknown }).topJobs\n ? \"summary\"\n : \"generic\";\n emitRuntimeEvent(\"structured_data\", {\n node: nodeId,\n dataType: inferredType,\n data: payload,\n });\n }\n\n if (awaitInput) updates.__kortyxNodeData = res.data ?? {};\n if (awaitInput)\n emitRuntimeEvent(\"status\", {\n node: nodeId,\n message: `✅ Completed node: ${nodeId}`,\n });\n return updates;\n };\n Object.defineProperty(nodeExecutors, nodeId, {\n value: executeNode,\n enumerable: true,\n });\n if (!parallelGraph)\n builder.addNode(nodeId, (state: GraphState) => executeNode(state));\n }\n\n type EdgeTriple = readonly [string, string, { when?: string }?];\n const condGroups: Record<string, Array<{ when: string; to: string }>> = {};\n const plainEdges: Array<[string, string]> = [];\n\n for (const edge of workflow.edges as unknown as EdgeTriple[]) {\n const [from, to, condition] = edge as unknown as EdgeTriple;\n if (condition && typeof condition.when === \"string\" && condition.when) {\n if (!condGroups[from]) condGroups[from] = [];\n condGroups[from].push({ when: condition.when, to });\n } else {\n plainEdges.push([from, to]);\n }\n }\n\n if (parallelGraph) {\n addParallelGraphCoordinator(\n builder as unknown as Parameters<typeof addParallelGraphCoordinator>[0],\n workflow,\n runtimeConfig,\n execution,\n nodeExecutors,\n );\n } else {\n for (const [from, to] of plainEdges) {\n edgeApi.addEdge(from, to);\n }\n\n for (const [from, rules] of Object.entries(condGroups)) {\n const mapping: Record<string, string> = Object.fromEntries(\n rules.map((r) => [r.when, r.to]),\n );\n const fallbackKey = `__default__:${from}`;\n mapping[fallbackKey] = \"__end__\";\n edgeApi.addConditionalEdges(\n from,\n (s: GraphState) => {\n const trigger = s.lastCondition ?? s.lastIntent;\n if (trigger && Object.hasOwn(mapping, trigger as string)) {\n return trigger as string;\n }\n return fallbackKey;\n },\n mapping,\n );\n }\n }\n\n const sessionId =\n typeof config.session === \"object\" &&\n config.session &&\n \"id\" in config.session &&\n typeof config.session.id === \"string\"\n ? config.session.id\n : \"__default__\";\n const checkpointer = config.checkpointer ?? getCheckpointer(sessionId);\n const graph = edgeApi.compile({ checkpointer });\n\n type RuntimeGraph = typeof graph & GraphExtensions;\n\n const runtimeGraph = graph as RuntimeGraph;\n runtimeGraph.name = workflow.id;\n runtimeGraph.config = config;\n runtimeGraph.execution = execution;\n\n runtimeGraph.resume = async (state: GraphState, input: unknown) => {\n const resumed = { ...state, input, awaitingHumanInput: false };\n return (await graph.invoke(resumed)) as GraphState;\n };\n\n runtimeGraph.timeTravelTo = async (\n state: GraphState,\n checkpointId: string,\n ) => {\n const checkpoints = (\n state.runtime as { checkpoints?: Record<string, { snapshot: unknown }> }\n )?.checkpoints;\n const snapshot = checkpoints?.[checkpointId];\n if (!snapshot) throw new Error(`Checkpoint '${checkpointId}' not found`);\n return graph.invoke(\n snapshot.snapshot as unknown as Partial<\n (typeof StateAnnotation)[\"State\"]\n >,\n ) as unknown as GraphState;\n };\n\n return runtimeGraph;\n}\n","import { dirname, isAbsolute, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { NodeFn, WorkflowDefinition } from \"@kortyx/core\";\nimport { resolveNode } from \"./node-registry\";\n\ntype LoadedNodeModule = Record<string, unknown>;\n\nconst dynamicImport = new Function(\n \"specifier\",\n // Avoid bundler static analysis of `import(...)` (e.g. Next.js/Turbopack).\n // This is only used on the server.\n \"return import(specifier)\",\n) as (specifier: string) => Promise<LoadedNodeModule>;\n\nfunction looksLikePath(specifier: string) {\n if (specifier.startsWith(\"file:\")) return true;\n if (specifier.startsWith(\"./\") || specifier.startsWith(\"../\")) return true;\n if (specifier.startsWith(\"/\")) return true;\n return specifier.includes(\"/\");\n}\n\nfunction getWorkflowBaseDir(\n workflow: WorkflowDefinition | undefined,\n cwd: string,\n): string {\n const meta = workflow?.metadata as Record<string, unknown> | undefined;\n const filePath = meta?.__filePath;\n if (typeof filePath === \"string\" && filePath.length > 0) {\n return dirname(filePath);\n }\n return cwd;\n}\n\nfunction pickNodeExport(mod: LoadedNodeModule, exportName?: string): NodeFn {\n if (exportName) {\n const candidate = mod[exportName];\n if (typeof candidate === \"function\") return candidate as NodeFn;\n throw new Error(`Node export \"${exportName}\" not found or not a function.`);\n }\n\n const defaultExport = mod.default;\n if (typeof defaultExport === \"function\") return defaultExport as NodeFn;\n\n const fnExports = Object.entries(mod).filter(\n ([, v]) => typeof v === \"function\",\n );\n if (fnExports.length === 1) return fnExports[0]?.[1] as NodeFn;\n\n const names = fnExports.map(([k]) => k).sort();\n throw new Error(\n `Node module must export a default function or exactly one named function (found: ${\n names.join(\", \") || \"none\"\n }).`,\n );\n}\n\nexport async function resolveNodeHandler(args: {\n run: string | NodeFn;\n workflow?: WorkflowDefinition;\n cwd?: string;\n}): Promise<NodeFn> {\n const { run, workflow } = args;\n const cwd = args.cwd ?? process.cwd();\n\n if (typeof run === \"function\") return run;\n\n // New DX: YAML/JSON specify module path (optionally with #exportName)\n if (looksLikePath(run)) {\n const [moduleRef, exportName] = run.split(\"#\", 2) as [\n string,\n string | undefined,\n ];\n const baseDir = getWorkflowBaseDir(workflow, cwd);\n\n const specifier = moduleRef.startsWith(\"file:\")\n ? moduleRef\n : isAbsolute(moduleRef)\n ? pathToFileURL(moduleRef).href\n : pathToFileURL(resolve(baseDir, moduleRef)).href;\n\n const mod = await dynamicImport(specifier);\n return pickNodeExport(mod, exportName);\n }\n\n // Back-compat: symbolic node registry name\n return resolveNode(run);\n}\n","import type { NodeFn } from \"@kortyx/core\";\n\nconst registry = new Map<string, NodeFn>();\n\nexport function registerNode(id: string, fn: NodeFn): void {\n registry.set(id, fn);\n}\n\nexport function getRegisteredNode(id: string): NodeFn | null {\n return registry.get(id) ?? null;\n}\n\nexport function listRegisteredNodes(): string[] {\n return [...registry.keys()].sort();\n}\n\nexport function clearRegisteredNodes(): void {\n registry.clear();\n}\n\nexport function resolveNode(id: string): NodeFn {\n const fn = registry.get(id);\n if (!fn) {\n throw new Error(\n `Node '${id}' is not registered. Call registerNode('${id}', fn) before running workflows that reference it.`,\n );\n }\n return fn;\n}\n","import type {\n GraphState,\n InterruptInput,\n TokenUsage,\n WorkflowDefinition,\n} from \"@kortyx/core\";\nimport { isExecutionLimitReached, throwIfExecutionAborted } from \"@kortyx/core\";\nimport {\n errorFromFailure,\n errorProperty,\n isFailureDescriptor,\n PersistenceError,\n ValidationError,\n WorkflowContractError,\n} from \"@kortyx/core/errors\";\nimport type { WorkflowCallService } from \"@kortyx/hooks\";\nimport { workflowCallFingerprint } from \"@kortyx/hooks\";\nimport { withSafeTraceSpan } from \"@kortyx/hooks/internal\";\nimport { AsyncLocalStorageProviderSingleton } from \"@langchain/core/singletons\";\nimport { Command } from \"@langchain/langgraph\";\nimport {\n captureGraphSnapshot,\n type GraphSnapshotBundle,\n restoreGraphSnapshot,\n} from \"../framework/graph-snapshot\";\nimport { createInMemoryCheckpointSaver } from \"../framework/in-memory-checkpointer\";\nimport {\n createExecutionGraph,\n type ExecutionControl,\n type ExecutionRuntimeConfig,\n} from \"./create-execution-graph\";\n\ntype ChildSnapshot = {\n version: string;\n checkpoint: GraphSnapshotBundle;\n request?: InterruptInput;\n limitPaused?: boolean;\n};\n\n/** Children have private engine state. Their snapshots travel in parent hook state. */\nexport function createWorkflowCallService(\n config: ExecutionRuntimeConfig,\n _parent?: WorkflowDefinition,\n execution: ExecutionControl = {},\n): WorkflowCallService {\n return async (args) => {\n const execute = async () => {\n throwIfExecutionAborted(execution.abortSignal);\n const depth = (config.workflowCallDepth ?? 0) + 1;\n if (depth > 16)\n throw new WorkflowContractError(\n \"Maximum child workflow depth (16) exceeded.\",\n );\n const workflow = await config.selectWorkflow?.(args.workflow);\n if (!workflow || workflow.id !== args.workflow)\n throw new WorkflowContractError(\n `Workflow '${args.workflow}' is not registered.`,\n );\n if (!workflow.inputSchema || !workflow.outputSchema)\n throw new WorkflowContractError(\n `Callable workflow '${workflow.id}' requires inputSchema and outputSchema.`,\n );\n if (\n args.definition &&\n (args.definition.version !== workflow.version ||\n args.definition.inputSchema !== workflow.inputSchema ||\n args.definition.outputSchema !== workflow.outputSchema)\n ) {\n throw new WorkflowContractError(\n \"The typed workflow contract does not match the registered definition.\",\n );\n }\n const snapshot = args.snapshot as ChildSnapshot | undefined;\n if (snapshot && snapshot.version !== workflow.version)\n throw new WorkflowContractError(\n `Workflow '${workflow.id}' changed since the call was suspended.`,\n );\n // The checkpoint already contains parsed input. Re-running a transform\n // during resume could change its meaning or repeat validation effects.\n const input = snapshot\n ? undefined\n : workflow.inputSchema.parse(args.input);\n if (!snapshot) workflowCallFingerprint(input);\n const saver = createInMemoryCheckpointSaver();\n const threadId = \"child\";\n let request: InterruptInput | undefined;\n const invocationPath = `${config.invocationPath ?? \"root\"}/${encodeURIComponent(args.id)}:${args.invocationId}`;\n let childConfig: ExecutionRuntimeConfig = {\n resume: Boolean(snapshot),\n executionBranchId: config.executionBranchId,\n prepareChildTelemetry: config.prepareChildTelemetry,\n context: config.context,\n session: config.session,\n selectWorkflow: config.selectWorkflow,\n getProvider: config.getProvider,\n telemetry: config.telemetry\n ? {\n ...config.telemetry,\n correlation: {\n runId: config.telemetry.correlation?.runId,\n sessionId: config.telemetry.correlation?.sessionId,\n workflowId: workflow.id,\n invocationId: args.invocationId,\n parentInvocationId: config.telemetry.correlation?.invocationId,\n branchId: config.executionBranchId ?? config.executionRunId,\n },\n }\n : undefined,\n reasonTrace: config.reasonTrace,\n checkpointer: saver,\n executionRunId: config.executionRunId,\n workflowCallDepth: depth,\n invocationPath,\n emit: (event, payload) => {\n if (event === \"interrupt\") {\n const original = (payload as { input: InterruptInput }).input;\n request = {\n ...original,\n meta: {\n ...original.meta,\n workflowCallPath: [\n {\n workflowId: workflow.id,\n invocationId: args.invocationId,\n callId: args.id,\n },\n ...(Array.isArray(original.meta?.workflowCallPath)\n ? original.meta.workflowCallPath\n : []),\n ],\n workflowCall: original.meta?.workflowCall ?? {\n invocationId: args.invocationId,\n workflowId: workflow.id,\n nodeId: (payload as { node?: string }).node,\n },\n },\n };\n return;\n }\n if (event === \"error\") {\n const failure = (payload as { failure?: unknown })?.failure;\n throw isFailureDescriptor(failure)\n ? errorFromFailure(failure)\n : new Error(\"Child workflow failed.\");\n }\n if (event === \"transition\")\n throw new WorkflowContractError(\n \"transitionTo is not supported inside child workflows; useWorkflow returns to its caller.\",\n );\n const value = payload as Record<string, unknown>;\n const scoped = { ...value, workflow: workflow.id, invocationPath };\n for (const key of [\"node\", \"streamId\", \"opId\", \"segmentId\"]) {\n if (typeof value[key] === \"string\")\n (scoped as Record<string, unknown>)[key] =\n `${config.executionRunId ?? \"run\"}/${args.invocationId}/${value[key]}`;\n }\n config.emit?.(event, scoped);\n },\n };\n childConfig =\n config.prepareChildTelemetry?.(workflow, childConfig) ?? childConfig;\n if (snapshot) {\n if (snapshot.limitPaused)\n snapshot.checkpoint.checkpoint.channel_values.config = childConfig;\n await restoreGraphSnapshot(saver, snapshot.checkpoint, threadId);\n }\n const graph = await createExecutionGraph(\n workflow,\n childConfig,\n execution,\n );\n const initial: GraphState = {\n input,\n data: {},\n runtime: {},\n config: childConfig,\n currentWorkflow: workflow.id,\n lastNode: \"__start__\",\n awaitingHumanInput: false,\n conversationHistory: [],\n };\n const resumePatch = snapshot?.request?.meta?.__kortyxResumeStatePatch;\n const command = snapshot?.limitPaused\n ? null\n : snapshot\n ? new Command({\n resume: args.response,\n update: {\n config: childConfig,\n ...(resumePatch ? { runtime: resumePatch } : {}),\n },\n })\n : initial;\n // Do not inherit the parent's engine task/scratchpad/callbacks. Child\n // interrupts are bridged deliberately, and child completion stays internal.\n let result: GraphState;\n try {\n result = (await AsyncLocalStorageProviderSingleton.runWithConfig(\n {},\n () =>\n graph.invoke(command, {\n configurable: { thread_id: threadId, checkpoint_ns: \"\" },\n callbacks: [],\n }),\n )) as GraphState;\n } catch (error) {\n throwIfExecutionAborted(execution.abortSignal);\n const checkpoint = await captureGraphSnapshot(saver, threadId).catch(\n (cause) => {\n // A failed diagnostic snapshot must not replace the child failure.\n // Limit suspension, however, requires a recoverable checkpoint.\n if (isExecutionLimitReached(error))\n throw new PersistenceError(\n \"Cannot checkpoint a suspended child workflow.\",\n cause,\n );\n return undefined;\n },\n );\n const state = checkpoint?.checkpoint.channel_values as\n | GraphState\n | undefined;\n const patch = (\n error as { __kortyxHookStatePatch?: Record<string, unknown> } | null\n )?.__kortyxHookStatePatch;\n const usage = (patch?.tokenUsage ?? state?.runtime.tokenUsage) as\n | TokenUsage\n | undefined;\n if (error && typeof error === \"object\")\n Object.assign(error, { __kortyxChildUsage: usage });\n try {\n throwIfExecutionAborted(execution.abortSignal);\n } catch (cancelled) {\n Object.assign(cancelled as object, { __kortyxChildUsage: usage });\n throw cancelled;\n }\n if (isExecutionLimitReached(error)) {\n if (checkpoint && state) {\n if (patch) state.runtime = { ...state.runtime, ...patch };\n Object.assign(error, {\n __kortyxChildSnapshot: {\n version: workflow.version,\n checkpoint,\n limitPaused: true,\n } satisfies ChildSnapshot,\n __kortyxChildUsage: state.runtime.tokenUsage,\n });\n }\n }\n throw error;\n }\n throwIfExecutionAborted(execution.abortSignal);\n if (request) {\n const checkpoint = await captureGraphSnapshot(saver, threadId);\n if (!checkpoint)\n throw new WorkflowContractError(\n \"Child interrupted without a graph checkpoint.\",\n );\n return {\n status: \"interrupted\" as const,\n usage:\n (\n request.meta?.__kortyxResumeStatePatch as\n | { tokenUsage?: TokenUsage }\n | undefined\n )?.tokenUsage ?? result.runtime.tokenUsage,\n request,\n snapshot: {\n version: workflow.version,\n checkpoint,\n request,\n } satisfies ChildSnapshot,\n };\n }\n let data: Record<string, unknown>;\n try {\n data = workflow.outputSchema.parse(result.data ?? {});\n } catch (cause) {\n if (!Array.isArray(errorProperty(cause, \"issues\"))) throw cause;\n throw new ValidationError(\n \"INVALID_OUTPUT\",\n \"Child output validation failed.\",\n cause,\n );\n }\n workflowCallFingerprint(data);\n return {\n status: \"completed\" as const,\n data,\n toolObservations:\n (\n (result.runtime as unknown as Record<string, unknown>).__kortyx as\n | {\n workflowState?: {\n __kortyxToolObservations?: import(\"@kortyx/providers\").ToolObservation[];\n };\n }\n | undefined\n )?.workflowState?.__kortyxToolObservations ?? [],\n usage: result.runtime.tokenUsage,\n };\n };\n const trace = config.telemetry?.trace ?? config.reasonTrace;\n return withSafeTraceSpan(\n trace,\n {\n name: \"kortyx.workflow.call\",\n attributes: {\n workflowId: args.workflow,\n runId: config.executionRunId,\n branchId: config.executionBranchId ?? config.executionRunId,\n parentInvocationId: config.telemetry?.correlation?.invocationId,\n callerNodeExecutionId: args.callerNodeExecutionId,\n callId: args.id,\n invocationId: args.invocationId,\n },\n },\n execute,\n );\n };\n}\n","import type {\n GraphState,\n InterruptInput,\n TokenUsage,\n WorkflowDefinition,\n} from \"@kortyx/core\";\nimport {\n isExecutionCancelled,\n isExecutionLimitReached,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport {\n errorFromFailure,\n type FailureDescriptor,\n KortyxError,\n serializeFailure,\n WorkflowContractError,\n} from \"@kortyx/core/errors\";\nimport { deepMergeWithArrayOverwrite } from \"@kortyx/utils\";\nimport {\n GraphInterrupt,\n interrupt,\n isGraphInterrupt,\n} from \"@langchain/langgraph\";\nimport type {\n ExecutionControl,\n ExecutionRuntimeConfig,\n} from \"./create-execution-graph\";\n\nexport type NodeExecutor = (\n state: GraphState,\n awaitInput?: (request: InterruptInput) => unknown,\n snapshotGraph?: (nodeState: GraphState) => GraphState,\n) => Promise<Record<string, unknown>>;\n\nconst WORK = \"__kortyx_parallel_work\";\nconst WAIT = \"__kortyx_parallel_wait\";\nconst FINISH = \"__kortyx_parallel_finish\";\nconst KEY = \"__kortyxParallelGraph\";\nconst record = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\nconst clone = <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T;\nconst zeroUsage = (): TokenUsage => ({ input: 0, output: 0, total: 0 });\n\ntype Field = { writer: string; value: unknown };\ntype Fields = Record<string, Field>;\ntype NodeRecord = {\n id: string;\n ancestors: string[];\n status:\n | \"pending\"\n | \"running\"\n | \"waiting\"\n | \"limited\"\n | \"completed\"\n | \"failed\"\n | \"skipped\";\n responses: unknown[];\n runtime: Record<string, unknown>;\n fields: Fields;\n workflowFields: Fields;\n runtimeFields: Fields;\n selected: string[];\n request?: InterruptInput;\n failure?: FailureDescriptor;\n history?: GraphState[\"conversationHistory\"];\n};\ntype Journal = {\n version: 1;\n runId?: string | undefined;\n workflowVersion: string;\n initialInput: unknown;\n initialData: Record<string, unknown>;\n initialRuntime: Record<string, unknown>;\n nodes: Record<string, NodeRecord>;\n waitingNode?: string | undefined;\n};\ntype Builder = {\n addNode: (\n id: string,\n fn: (\n state: GraphState,\n ) => Promise<Record<string, unknown>> | Record<string, unknown>,\n ) => unknown;\n addEdge: (from: string, to: string) => unknown;\n addConditionalEdges: (\n from: string,\n fn: (state: GraphState) => string,\n mapping: Record<string, string>,\n ) => unknown;\n};\n\nexport function hasParallelEdges(workflow: WorkflowDefinition): boolean {\n const groups = new Map<string, { plain: number; conditional: number }>();\n for (const [from, , condition] of workflow.edges) {\n const group = groups.get(from) ?? { plain: 0, conditional: 0 };\n if (condition?.when) group.conditional++;\n else group.plain++;\n groups.set(from, group);\n if (group.plain > 1 || (group.plain && group.conditional)) return true;\n }\n return false;\n}\n\n/** The root engine owns checkpoints; node activations own their replay journals. */\nexport function addParallelGraphCoordinator(\n builder: Builder,\n workflow: WorkflowDefinition,\n config: ExecutionRuntimeConfig,\n execution: ExecutionControl,\n executors: Record<string, NodeExecutor>,\n): void {\n const ids = [...Object.keys(workflow.nodes), \"__end__\"];\n const incoming = new Map(ids.map((id) => [id, [] as string[]]));\n const outgoing = new Map<string, Array<{ to: string; when?: string }>>();\n for (const [from, to, condition] of workflow.edges) {\n if (\n from === \"__end__\" ||\n to === \"__start__\" ||\n (from !== \"__start__\" && !Object.hasOwn(workflow.nodes, from)) ||\n !incoming.has(to)\n )\n throw new WorkflowContractError(\n `Invalid parallel graph edge '${from}' → '${to}'.`,\n );\n if (!incoming.get(to)?.includes(from)) incoming.get(to)?.push(from);\n const edges = outgoing.get(from) ?? [];\n if (!edges.some((edge) => edge.to === to && edge.when === condition?.when))\n edges.push({ to, ...(condition ? { when: condition.when } : {}) });\n outgoing.set(from, edges);\n }\n const ancestors = new Map<string, Set<string>>([[\"__start__\", new Set()]]);\n const remaining = new Set(ids);\n const ordered: string[] = [];\n while (remaining.size) {\n const ready = [...remaining].filter((id) =>\n incoming.get(id)?.every((from) => ancestors.has(from)),\n );\n if (!ready.length)\n throw new KortyxError(\n \"GRAPH_CYCLE\",\n \"Parallel graph back-edges are not supported: use a sequential child workflow for loops.\",\n {\n category: \"workflow\",\n retryable: false,\n safeMessage:\n \"Parallel graph back-edges are not supported: use a sequential child workflow for loops.\",\n },\n );\n for (const id of ready) {\n const parents = incoming.get(id) ?? [];\n ancestors.set(\n id,\n new Set(\n parents.flatMap((from) => [from, ...(ancestors.get(from) ?? [])]),\n ),\n );\n remaining.delete(id);\n ordered.push(id);\n }\n }\n ids.splice(0, ids.length, ...ordered);\n\n const failure = (\n code: string,\n message: string,\n node: string,\n cause?: unknown,\n ) =>\n new KortyxError(code, message, {\n category: \"workflow\",\n retryable: false,\n safeMessage: message,\n context: { workflow: workflow.id, node },\n ...(cause ? { cause } : {}),\n });\n const mergeFields = (\n parents: NodeRecord[],\n node: string,\n property: \"fields\" | \"workflowFields\" | \"runtimeFields\",\n journal: Journal,\n ): Fields => {\n const merged: Fields = {};\n for (const parent of parents) {\n for (const [key, field] of Object.entries(parent[property])) {\n const previous = Object.hasOwn(merged, key) ? merged[key] : undefined;\n if (\n property === \"workflowFields\" &&\n key === \"__kortyxToolObservations\" &&\n previous &&\n Array.isArray(previous.value) &&\n Array.isArray(field.value)\n ) {\n // Runtime-owned observation history is append-only across branches.\n const observations = new Map<string, unknown>();\n for (const observation of [...previous.value, ...field.value]) {\n if (\n record(observation) &&\n typeof observation.attemptId === \"string\"\n )\n observations.set(observation.attemptId, observation);\n }\n Object.defineProperty(merged, key, {\n value: { writer: field.writer, value: [...observations.values()] },\n enumerable: true,\n configurable: true,\n writable: true,\n });\n continue;\n }\n if (previous && previous.writer !== field.writer) {\n if (journal.nodes[previous.writer]?.ancestors.includes(field.writer))\n continue;\n if (!journal.nodes[field.writer]?.ancestors.includes(previous.writer))\n throw failure(\n \"GRAPH_OUTPUT_CONFLICT\",\n `Node '${node}' cannot combine ${property === \"fields\" ? \"data\" : property === \"workflowFields\" ? \"workflow state\" : \"runtime\"} field '${key}': branches '${previous.writer}' and '${field.writer}' both wrote it. Return separate fields in application logic.`,\n node,\n );\n }\n Object.defineProperty(merged, key, {\n value: field,\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n }\n return merged;\n };\n const values = (fields: Fields) =>\n Object.fromEntries(\n Object.entries(fields).map(([key, field]) => [key, field.value]),\n );\n const initialWorkflowState = (journal: Journal) => {\n const internal = journal.initialRuntime.__kortyx;\n return record(internal) && record(internal.workflowState)\n ? internal.workflowState\n : {};\n };\n const usage = (journal: Journal) => {\n const total = {\n ...zeroUsage(),\n ...(journal.initialRuntime.tokenUsage as TokenUsage | undefined),\n };\n for (const node of Object.values(journal.nodes)) {\n const used = node.runtime.tokenUsage as TokenUsage | undefined;\n if (used)\n for (const key of [\"input\", \"output\", \"total\"] as const)\n total[key] += used[key] ?? 0;\n }\n return total;\n };\n const runtimePatch = (journal: Journal) => ({\n [KEY]: journal,\n tokenUsage: usage(journal),\n });\n const load = (state: GraphState): Journal => {\n const saved = (state.runtime as Record<string, unknown>)[KEY];\n if (\n saved &&\n (config.resume === true ||\n !config.executionRunId ||\n (saved as Journal).runId === config.executionRunId)\n ) {\n const journal = clone(saved) as Journal;\n if (journal.version !== 1 || journal.workflowVersion !== workflow.version)\n throw new WorkflowContractError(\n \"Parallel workflow changed since its execution was suspended.\",\n );\n return journal;\n }\n const initialRuntime = clone(state.runtime) as Record<string, unknown>;\n delete initialRuntime[KEY];\n return {\n version: 1,\n runId: config.executionRunId,\n workflowVersion: workflow.version,\n initialInput: state.input,\n initialData: clone(state.data ?? {}),\n initialRuntime,\n nodes: Object.fromEntries(\n ids.map((id) => [\n id,\n {\n id,\n ancestors: [],\n status: \"pending\",\n responses: [],\n runtime: {},\n fields: {},\n workflowFields: {},\n runtimeFields: {},\n selected: [],\n },\n ]),\n ),\n };\n };\n const terminal = (node: NodeRecord) =>\n [\"completed\", \"failed\", \"skipped\"].includes(node.status);\n\n builder.addNode(WORK, async (state) => {\n const journal = load(state);\n let control: unknown;\n const running = new Map<string, Promise<void>>();\n // Continue re-admits only the limited activations; waiting siblings remain waiting.\n for (const node of Object.values(journal.nodes))\n if (node.status === \"limited\") node.status = \"pending\";\n const start = async (id: string, parents: NodeRecord[]) => {\n const node = journal.nodes[id] as NodeRecord;\n let privateState: GraphState | undefined;\n try {\n node.ancestors = [\n ...new Set(\n parents.flatMap((parent) => [parent.id, ...parent.ancestors]),\n ),\n ];\n const failed = parents.find((parent) => parent.status === \"failed\");\n if (failed)\n throw failure(\n \"GRAPH_DEPENDENCY_FAILED\",\n `Node '${id}' did not run because required dependency '${failed.id}' failed.`,\n id,\n failed.failure,\n );\n node.fields = mergeFields(parents, id, \"fields\", journal);\n node.workflowFields = mergeFields(\n parents,\n id,\n \"workflowFields\",\n journal,\n );\n node.runtimeFields = mergeFields(parents, id, \"runtimeFields\", journal);\n if (id === \"__end__\") {\n node.status = \"completed\";\n return;\n }\n const data = deepMergeWithArrayOverwrite(\n journal.initialData,\n values(node.fields),\n );\n const nodeInput = Object.keys(node.fields).length\n ? deepMergeWithArrayOverwrite(\n record(journal.initialInput)\n ? journal.initialInput\n : { rawInput: journal.initialInput },\n values(node.fields),\n )\n : journal.initialInput;\n const workflowState = deepMergeWithArrayOverwrite(\n initialWorkflowState(journal),\n values(node.workflowFields),\n );\n const ownInternal = node.runtime.__kortyx;\n const inheritedRuntime = deepMergeWithArrayOverwrite(\n journal.initialRuntime,\n values(node.runtimeFields),\n );\n privateState = {\n ...state,\n input: nodeInput === undefined ? undefined : clone(nodeInput),\n data: clone(data),\n runtime: clone({\n ...inheritedRuntime,\n tokenUsage: zeroUsage(),\n ...node.runtime,\n __kortyx: {\n ...(record(ownInternal) ? ownInternal : {}),\n workflowState:\n record(ownInternal) && record(ownInternal.workflowState)\n ? ownInternal.workflowState\n : workflowState,\n },\n }) as GraphState[\"runtime\"],\n conversationHistory: [],\n awaitingHumanInput: false,\n };\n let index = 0;\n node.status = \"running\";\n const updates = await (executors[id] as NodeExecutor)(\n privateState,\n (request) => {\n const position = index++;\n if (position < node.responses.length)\n return node.responses[position];\n node.request = request;\n throw new GraphInterrupt([]);\n },\n (nodeState) => {\n const snapshot = clone(journal);\n (snapshot.nodes[id] as NodeRecord).runtime = clone(\n nodeState.runtime,\n );\n for (const activation of Object.values(snapshot.nodes))\n if (activation.status === \"running\")\n activation.status = \"pending\";\n return {\n ...state,\n lastNode: id,\n input: nodeState.input,\n data: nodeState.data ?? {},\n conversationHistory: [\n ...state.conversationHistory,\n ...ids.flatMap(\n (nodeId) => snapshot.nodes[nodeId]?.history ?? [],\n ),\n ],\n runtime: { ...nodeState.runtime, ...runtimePatch(snapshot) },\n };\n },\n );\n node.runtime =\n (updates.runtime as Record<string, unknown> | undefined) ??\n (privateState.runtime as Record<string, unknown>);\n const delta = updates.__kortyxNodeData as Record<string, unknown>;\n const updatedData = updates.data as Record<string, unknown> | undefined;\n for (const key of Object.keys(delta))\n Object.defineProperty(node.fields, key, {\n value: { writer: id, value: updatedData?.[key] },\n enumerable: true,\n configurable: true,\n writable: true,\n });\n const internal = node.runtime.__kortyx;\n for (const [key, value] of Object.entries(node.runtime)) {\n if ([KEY, \"__kortyx\", \"tokenUsage\"].includes(key)) continue;\n if (JSON.stringify(value) !== JSON.stringify(inheritedRuntime[key]))\n Object.defineProperty(node.runtimeFields, key, {\n value: { writer: id, value },\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n const updatedWorkflow =\n record(internal) && record(internal.workflowState)\n ? internal.workflowState\n : {};\n for (const [key, value] of Object.entries(updatedWorkflow)) {\n if (JSON.stringify(value) !== JSON.stringify(workflowState[key]))\n Object.defineProperty(node.workflowFields, key, {\n value: { writer: id, value },\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n node.history =\n (updates.conversationHistory as\n | GraphState[\"conversationHistory\"]\n | undefined) ?? [];\n node.selected = (outgoing.get(id) ?? [])\n .filter(\n (edge) =>\n !edge.when ||\n edge.when === (updates.lastCondition ?? updates.lastIntent),\n )\n .map((edge) => edge.to);\n node.status = \"completed\";\n delete node.request;\n } catch (error) {\n const patch = (\n error as { __kortyxHookStatePatch?: Record<string, unknown> } | null\n )?.__kortyxHookStatePatch;\n if (privateState) node.runtime = { ...privateState.runtime, ...patch };\n if (isGraphInterrupt(error)) node.status = \"waiting\";\n else if (isExecutionLimitReached(error)) {\n node.status = \"limited\";\n control ??= error;\n } else if (\n isExecutionCancelled(error) ||\n execution.abortSignal?.aborted\n ) {\n control ??= error;\n } else if (serializeFailure(error).category === \"persistence\")\n control ??= error;\n else {\n node.failure = serializeFailure(error);\n node.failure.context = {\n ...node.failure.context,\n node: id,\n workflow: workflow.id,\n };\n node.status = \"failed\";\n node.selected = (outgoing.get(id) ?? []).map((edge) => edge.to);\n }\n }\n };\n const launch = () => {\n if (control || execution.abortSignal?.aborted) return;\n for (const id of ids) {\n if (id === \"__end__\") continue;\n const node = journal.nodes[id] as NodeRecord;\n if (node.status !== \"pending\" || running.has(id)) continue;\n const sources = incoming.get(id) ?? [];\n if (\n !sources.every(\n (from) =>\n from === \"__start__\" ||\n terminal(journal.nodes[from] as NodeRecord),\n )\n )\n continue;\n const activeSources = sources.filter((from) =>\n from === \"__start__\"\n ? (outgoing.get(from) ?? []).some(\n (edge) =>\n edge.to === id &&\n (!edge.when ||\n edge.when === (state.lastCondition ?? state.lastIntent)),\n )\n : journal.nodes[from]?.selected.includes(id),\n );\n if (!activeSources.length) {\n node.status = \"skipped\";\n continue;\n }\n const task = start(\n id,\n activeSources\n .filter((from) => from !== \"__start__\")\n .map((from) => journal.nodes[from] as NodeRecord),\n );\n running.set(\n id,\n task.finally(() => running.delete(id)),\n );\n }\n };\n try {\n while (true) {\n launch();\n if (!running.size) break;\n await Promise.race(running.values());\n }\n throwIfExecutionAborted(execution.abortSignal);\n if (control) throw control;\n } catch (error) {\n // Drain admitted work before persisting a pause or reporting cancellation.\n await Promise.allSettled(running.values());\n if (error && typeof error === \"object\")\n Object.assign(error, { __kortyxHookStatePatch: runtimePatch(journal) });\n throw error;\n }\n journal.waitingNode = ids.find(\n (id) => journal.nodes[id]?.status === \"waiting\",\n );\n if (!journal.waitingNode) {\n const leaves = ids.filter(\n (id) =>\n id !== \"__end__\" &&\n journal.nodes[id]?.status !== \"skipped\" &&\n !journal.nodes[id]?.selected.some((to) => to !== \"__end__\"),\n );\n await start(\n \"__end__\",\n leaves.map((id) => journal.nodes[id] as NodeRecord),\n );\n }\n const end = journal.nodes.__end__ as NodeRecord;\n return {\n runtime: {\n ...(end.status === \"completed\" ? values(end.runtimeFields) : {}),\n ...runtimePatch(journal),\n },\n ...(end.status === \"completed\"\n ? {\n input: Object.keys(end.fields).length\n ? deepMergeWithArrayOverwrite(\n record(journal.initialInput)\n ? journal.initialInput\n : { rawInput: journal.initialInput },\n values(end.fields),\n )\n : journal.initialInput,\n data: deepMergeWithArrayOverwrite(\n journal.initialData,\n values(end.fields),\n ),\n conversationHistory: ids.flatMap(\n (id) => journal.nodes[id]?.history ?? [],\n ),\n }\n : {}),\n };\n });\n\n builder.addNode(WAIT, (state) => {\n const journal = load(state);\n const id = journal.waitingNode;\n const node = id ? journal.nodes[id] : undefined;\n if (!id || !node?.request)\n throw new WorkflowContractError(\"Missing waiting parallel node.\");\n // One engine interrupt per suspension revision. Its answer belongs only to this activation.\n const request: InterruptInput = {\n ...node.request,\n meta: {\n ...node.request.meta,\n __kortyxResumeStatePatch: runtimePatch(journal),\n },\n };\n let response: unknown;\n try {\n response = interrupt(request);\n } catch (error) {\n config.emit?.(\"interrupt\", {\n node: id,\n workflow: workflow.id,\n input: request,\n });\n throw error;\n }\n node.responses.push(response);\n node.status = \"pending\";\n delete journal.waitingNode;\n return { runtime: runtimePatch(journal) };\n });\n builder.addNode(FINISH, (state) => {\n const journal = load(state);\n const failed = ids.filter((id) => journal.nodes[id]?.status === \"failed\");\n if (failed.length) {\n const relevant =\n [...failed].reverse().find((id) => id !== \"__end__\") ??\n (failed[0] as string);\n const detail = journal.nodes[relevant]?.failure as FailureDescriptor;\n const error = errorFromFailure({\n ...detail,\n results: failed.map((id) => ({\n status: \"rejected\",\n failure: journal.nodes[id]?.failure,\n })),\n });\n Object.assign(error, { __kortyxHookStatePatch: runtimePatch(journal) });\n throw error;\n }\n return {\n runtime: {\n [KEY]: null,\n __kortyx: {\n workflowState: deepMergeWithArrayOverwrite(\n initialWorkflowState(journal),\n values(journal.nodes.__end__?.workflowFields ?? {}),\n ),\n },\n },\n };\n });\n builder.addEdge(\"__start__\", WORK);\n builder.addConditionalEdges(\n WORK,\n (state) => (load(state).waitingNode ? \"wait\" : \"finish\"),\n { wait: WAIT, finish: FINISH },\n );\n builder.addEdge(WAIT, WORK);\n builder.addEdge(FINISH, \"__end__\");\n}\n","import { randomUUID } from \"node:crypto\";\n\nexport function makeResumeToken(): string {\n return randomUUID();\n}\n\nexport function makeRequestId(prefix = \"req\"): string {\n return `${prefix}-${randomUUID()}`;\n}\n","import { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { WorkflowDefinition } from \"@kortyx/core\";\nimport { loadWorkflow } from \"@kortyx/core\";\nimport { KortyxError } from \"@kortyx/core/errors\";\nimport type { WorkflowRegistry } from \"./interface\";\n\nexport interface FileWorkflowRegistryOptions {\n workflowsDir: string;\n fallbackId?: string;\n cache?: boolean;\n extensions?: string[];\n}\n\ntype AnyWorkflow = WorkflowDefinition;\n\nconst DEFAULT_EXTENSIONS = [\n \".workflow.ts\",\n \".workflow.mts\",\n \".workflow.js\",\n \".workflow.mjs\",\n \".workflow.json\",\n \".workflow.yml\",\n \".workflow.yaml\",\n];\n\nfunction isWorkflowFile(name: string, extensions: string[]) {\n return extensions.some((ext) => name.endsWith(ext));\n}\n\nfunction isDeclarativeWorkflowFile(name: string) {\n return (\n name.endsWith(\".workflow.json\") ||\n name.endsWith(\".workflow.yml\") ||\n name.endsWith(\".workflow.yaml\")\n );\n}\n\nexport function createFileWorkflowRegistry(\n options: FileWorkflowRegistryOptions,\n): WorkflowRegistry {\n const workflowsDir = options.workflowsDir;\n const fallbackId = options.fallbackId ?? \"general-chat\";\n const extensions = options.extensions ?? DEFAULT_EXTENSIONS;\n const shouldCache = options.cache ?? true;\n\n let workflowCache: Record<string, AnyWorkflow> | null = null;\n\n async function loadWorkflows(): Promise<Record<string, AnyWorkflow>> {\n if (shouldCache && workflowCache) return workflowCache;\n\n const files = await readdir(workflowsDir, { withFileTypes: true });\n const workflowFiles = files\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name)\n .filter((file) => isWorkflowFile(file, extensions));\n\n const workflows: Record<string, AnyWorkflow> = {};\n\n for (const file of workflowFiles) {\n try {\n const modulePath = join(workflowsDir, file);\n\n // For declarative JSON/YAML workflows\n if (isDeclarativeWorkflowFile(file)) {\n const raw = await readFile(modulePath, \"utf8\");\n const workflow = loadWorkflow(raw) as unknown as AnyWorkflow;\n (workflow as any).metadata = {\n ...(((workflow as any).metadata ?? {}) as Record<string, unknown>),\n __filePath: modulePath,\n };\n workflows[workflow.id] = workflow;\n continue;\n }\n\n // For TS/JS module workflows\n const module = await import(modulePath);\n const workflowExport = Object.values(module).find(\n (exp): exp is AnyWorkflow => {\n const obj = exp as {\n id?: unknown;\n nodes?: unknown;\n edges?: unknown;\n };\n return (\n exp !== null &&\n typeof exp === \"object\" &&\n typeof obj.id === \"string\" &&\n typeof obj.nodes === \"object\" &&\n obj.nodes !== null &&\n Array.isArray(obj.edges)\n );\n },\n );\n\n if (workflowExport) {\n (workflowExport as any).metadata = {\n ...(((workflowExport as any).metadata ?? {}) as Record<\n string,\n unknown\n >),\n __filePath: modulePath,\n };\n workflows[workflowExport.id] = workflowExport;\n }\n } catch (error) {\n console.warn(`Failed to load workflow from ${file}:`, error);\n }\n }\n\n if (shouldCache) workflowCache = workflows;\n return workflows;\n }\n\n async function list(): Promise<AnyWorkflow[]> {\n const workflows = await loadWorkflows();\n return Object.values(workflows);\n }\n\n async function get(id: string): Promise<AnyWorkflow | null> {\n const workflows = await loadWorkflows();\n return workflows[id] ?? null;\n }\n\n async function select(\n id: string,\n selectOptions?: { fallbackId?: string },\n ): Promise<AnyWorkflow> {\n const workflows = await loadWorkflows();\n const fallback = selectOptions?.fallbackId ?? fallbackId;\n const selected = workflows[id] ?? (fallback ? workflows[fallback] : null);\n\n if (!selected) {\n throw new KortyxError(\n \"UNKNOWN_WORKFLOW\",\n `No workflow found for id \"${id}\" and no fallback \"${fallback}\" workflow available`,\n {\n category: \"request\",\n retryable: false,\n safeMessage: \"The requested workflow is not registered.\",\n },\n );\n }\n\n return selected;\n }\n\n async function refresh() {\n workflowCache = null;\n await loadWorkflows();\n }\n\n return {\n list,\n get,\n select,\n refresh,\n } satisfies WorkflowRegistry;\n}\n","import type { WorkflowDefinition } from \"@kortyx/core\";\nimport { KortyxError } from \"@kortyx/core/errors\";\nimport type { WorkflowRegistry } from \"./interface\";\n\nexport function createInMemoryWorkflowRegistry(\n workflows: WorkflowDefinition[],\n options?: { fallbackId?: string },\n): WorkflowRegistry {\n const byId = new Map<string, WorkflowDefinition>();\n for (const wf of workflows) byId.set(wf.id, wf);\n\n const fallbackId = options?.fallbackId ?? \"general-chat\";\n\n return {\n async list() {\n return Array.from(byId.values());\n },\n async get(id: string) {\n return byId.get(id) ?? null;\n },\n async select(id: string, selectOptions?: { fallbackId?: string }) {\n const fallback = selectOptions?.fallbackId ?? fallbackId;\n const wf = byId.get(id) ?? (fallback ? byId.get(fallback) : undefined);\n if (!wf) {\n throw new KortyxError(\n \"UNKNOWN_WORKFLOW\",\n `Workflow \"${id}\" not found${fallback ? ` (fallback \"${fallback}\" missing too)` : \"\"}.`,\n {\n category: \"request\",\n retryable: false,\n safeMessage: \"The requested workflow is not registered.\",\n },\n );\n }\n return wf;\n },\n };\n}\n","import type { GraphState, RuntimeEnvelope } from \"@kortyx/core\";\n\n/**\n * Prepares the initial graph state from chat context, runtime state, and runtime config.\n * This stays deliberately generic in the config type so apps can shape it.\n */\nexport interface InitialStateArgs<Config = unknown> {\n input: unknown;\n runtime: RuntimeEnvelope;\n config: Config;\n defaultWorkflowId?: string;\n}\n\nexport async function buildInitialGraphState<Config>({\n input,\n runtime,\n config,\n defaultWorkflowId,\n}: InitialStateArgs<Config>): Promise<GraphState> {\n const currentWorkflow =\n (runtime.requestedWorkflow as any) || (defaultWorkflowId as any);\n if (!currentWorkflow) {\n throw new Error(\n \"No workflow selected. Provide defaultWorkflowId (or set runtime.requestedWorkflow) before starting the graph.\",\n );\n }\n\n return {\n input,\n lastNode: \"__start__\",\n runtime,\n config: config as unknown,\n conversationHistory: [],\n currentWorkflow,\n awaitingHumanInput: false,\n } as GraphState;\n}\n"],"mappings":"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","names":["record","import_node_crypto","import_errors","import_errors","import_langgraph_checkpoint","import_node_crypto","import_errors","postgres","record","record","import_node_crypto","import_errors","record","ttlMs","import_errors","import_langgraph_checkpoint","utf8Bytes","utf8String","jsonSerde","import_errors","import_errors","resolve","tlsConnect","netConnect","import_node_crypto","import_errors","clone","record","options","import_node_crypto","import_errors","DEFAULT_MAX_CHECKPOINTS_PER_SESSION","createResumeToken","clone","toSummary","record","uniqueStrings","options","options","import_core","import_errors","import_hooks","import_internal","import_utils","import_langgraph","import_errors","import_core","import_errors","import_langgraph","clone","delay","import_node_crypto","import_promises","import_node_path","import_core","import_errors","module","import_errors"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/framework/in-memory-checkpointer.ts","../src/checkpointer.ts","../src/framework/caching.ts","../src/framework/maintenance.ts","../src/framework/pending-requests.ts","../src/framework/postgres/adapter.ts","../src/framework/postgres/checkpointer.ts","../src/framework/postgres/store.ts","../src/framework/postgres/migrations/index.ts","../src/framework/postgres/migrations/0001-initial-runtime.ts","../src/framework/postgres/maintenance.ts","../src/framework/postgres/pending-request-store.ts","../src/framework/postgres/session-checkpoint-store.ts","../src/framework/graph-snapshot.ts","../src/framework/redis/pending-request-store.ts","../src/framework/redis/redis-checkpointer.ts","../src/framework/redis/redis-store.ts","../src/framework/redis/redis-client.ts","../src/framework/redis/session-checkpoint-store.ts","../src/framework/session-checkpoints.ts","../src/framework/adapter.ts","../src/graph/create-execution-graph.ts","../src/node-loader.ts","../src/node-registry.ts","../src/graph/call-workflow.ts","../src/graph/parallel-graph.ts","../src/interrupt/tokens.ts","../src/registry/file-registry.ts","../src/registry/in-memory-registry.ts","../src/state/build-initial-state.ts"],"sourcesContent":["// release-test: 2026-01-22\nexport * from \"./checkpointer\";\nexport * from \"./framework/adapter\";\nexport {\n type CreateCachingFrameworkAdapterOptions,\n createCachingFrameworkAdapter,\n} from \"./framework/caching\";\nexport * from \"./framework/graph-snapshot\";\nexport type {\n PruneRuntimeOptions,\n PruneRuntimeResult,\n RuntimeMaintenance,\n} from \"./framework/maintenance\";\nexport * from \"./framework/pending-requests\";\nexport * from \"./framework/postgres/adapter\";\nexport type { RuntimeRetentionPolicy } from \"./framework/postgres/store\";\nexport * from \"./framework/session-checkpoints\";\nexport * from \"./graph/create-execution-graph\";\nexport * from \"./interrupt/tokens\";\nexport * from \"./node-registry\";\nexport * from \"./registry/file-registry\";\nexport * from \"./registry/in-memory-registry\";\nexport * from \"./registry/interface\";\nexport * from \"./state/build-initial-state\";\n","import type { RunnableConfig } from \"@langchain/core/runnables\";\nimport {\n type BaseCheckpointSaver,\n type Checkpoint,\n type CheckpointListOptions,\n type CheckpointMetadata,\n type CheckpointTuple,\n copyCheckpoint,\n getCheckpointId,\n type PendingWrite,\n WRITES_IDX_MAP,\n} from \"@langchain/langgraph-checkpoint\";\n\ntype SerializerProtocol = {\n dumpsTyped: (data: any) => Promise<[string, Uint8Array]>;\n loadsTyped: (type: string, data: Uint8Array | string) => Promise<any>;\n};\n\ntype StoredCheckpoint = {\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n parentCheckpointId?: string | undefined;\n writes: Map<string, [string, string, unknown]>;\n};\n\nexport type InMemoryCheckpointSaverOptions = {\n /**\n * Maximum number of pending writes stored for a single checkpoint.\n * Prevents unbounded memory growth in dev servers.\n */\n maxWritesPerCheckpoint?: number;\n};\n\nconst utf8Bytes = (s: string) => new Uint8Array(Buffer.from(s, \"utf8\"));\nconst utf8String = (u8: Uint8Array | string) =>\n typeof u8 === \"string\" ? u8 : Buffer.from(u8).toString(\"utf8\");\n\nconst jsonSerde: SerializerProtocol = {\n async dumpsTyped(data: any) {\n return [\"json\", utf8Bytes(JSON.stringify(data))];\n },\n async loadsTyped(_type: string, data: Uint8Array | string) {\n return JSON.parse(utf8String(data));\n },\n};\n\nexport type InMemoryCheckpointSaver = BaseCheckpointSaver & {\n deleteThread: (threadId: string) => Promise<void>;\n deleteCheckpointWrites: (\n threadId: string,\n checkpointNs: string,\n checkpointId: string,\n ) => Promise<void>;\n getLatestCheckpointId: (\n threadId: string,\n checkpointNs?: string,\n ) => Promise<string | undefined>;\n};\n\n/**\n * Bounded in-memory checkpointer:\n * - Keeps only the latest checkpoint per (thread_id, checkpoint_ns)\n * - Keeps only a bounded number of pending writes for that checkpoint\n *\n * This is a safer dev default than the upstream in-memory saver, which can grow without bound.\n */\nexport function createInMemoryCheckpointSaver(\n options?: InMemoryCheckpointSaverOptions,\n): InMemoryCheckpointSaver {\n const maxWritesPerCheckpoint = options?.maxWritesPerCheckpoint ?? 2_000;\n\n // (threadId|ns) -> checkpointId\n const latest = new Map<string, string>();\n // (threadId|ns|id) -> stored\n const checkpoints = new Map<string, StoredCheckpoint>();\n\n const nsKey = (threadId: string, checkpointNs: string) =>\n `${threadId}\\u0001${checkpointNs}`;\n const chkKey = (\n threadId: string,\n checkpointNs: string,\n checkpointId: string,\n ) => `${threadId}\\u0001${checkpointNs}\\u0001${checkpointId}`;\n\n const saver: any = {\n serde: jsonSerde,\n\n async get(config: RunnableConfig) {\n const value = await saver.getTuple(config);\n return value ? value.checkpoint : undefined;\n },\n\n getNextVersion(current: number | string | undefined) {\n if (typeof current === \"string\") {\n throw new Error(\"Please override this method to use string versions.\");\n }\n return current !== undefined && typeof current === \"number\"\n ? current + 1\n : 1;\n },\n\n async getTuple(\n config: RunnableConfig,\n ): Promise<CheckpointTuple | undefined> {\n const threadId = config.configurable?.thread_id as string | undefined;\n const checkpointNs =\n (config.configurable?.checkpoint_ns as string | undefined) ?? \"\";\n if (!threadId) return undefined;\n\n const requested = getCheckpointId(config);\n const id = requested || latest.get(nsKey(threadId, checkpointNs));\n if (!id) return undefined;\n\n const stored = checkpoints.get(chkKey(threadId, checkpointNs, id));\n if (!stored) return undefined;\n\n const pendingWrites = Array.from(stored.writes.values());\n const tuple: CheckpointTuple = {\n config: {\n configurable: {\n thread_id: threadId,\n checkpoint_ns: checkpointNs,\n checkpoint_id: id,\n },\n },\n checkpoint: stored.checkpoint,\n metadata: stored.metadata,\n pendingWrites: pendingWrites as any,\n };\n\n if (stored.parentCheckpointId) {\n tuple.parentConfig = {\n configurable: {\n thread_id: threadId,\n checkpoint_ns: checkpointNs,\n checkpoint_id: stored.parentCheckpointId,\n },\n };\n }\n\n // The engine may mutate returned checkpoints while inspecting state.\n // Never expose the stored object (Redis already returns a decoded copy).\n return JSON.parse(JSON.stringify(tuple)) as CheckpointTuple;\n },\n\n async *list(_config: RunnableConfig, _options?: CheckpointListOptions) {\n // Not required for current runtime behavior.\n },\n\n async put(\n config: RunnableConfig,\n checkpoint: Checkpoint,\n metadata: CheckpointMetadata,\n _newVersions: Record<string, number | string>,\n ): Promise<RunnableConfig> {\n const threadId = config.configurable?.thread_id as string | undefined;\n const checkpointNs =\n (config.configurable?.checkpoint_ns as string | undefined) ?? \"\";\n if (!threadId) {\n throw new Error(\n 'Failed to put checkpoint: missing \"thread_id\" in config.configurable.',\n );\n }\n\n const ns = nsKey(threadId, checkpointNs);\n\n const prepared = copyCheckpoint(checkpoint as any);\n const entry: StoredCheckpoint = {\n checkpoint: prepared as any,\n metadata,\n parentCheckpointId: config.configurable?.checkpoint_id as\n | string\n | undefined,\n writes: new Map(),\n };\n\n const id = checkpoint.id;\n checkpoints.set(chkKey(threadId, checkpointNs, id), entry);\n latest.set(ns, id);\n\n return {\n configurable: {\n thread_id: threadId,\n checkpoint_ns: checkpointNs,\n checkpoint_id: id,\n },\n };\n },\n\n async putWrites(\n config: RunnableConfig,\n writes: PendingWrite[],\n taskId: string,\n ): Promise<void> {\n const threadId = config.configurable?.thread_id as string | undefined;\n const checkpointNs =\n (config.configurable?.checkpoint_ns as string | undefined) ?? \"\";\n const checkpointId = config.configurable?.checkpoint_id as\n | string\n | undefined;\n if (!threadId || !checkpointId) return;\n\n const stored = checkpoints.get(\n chkKey(threadId, checkpointNs, checkpointId),\n );\n if (!stored) return;\n\n for (let idx = 0; idx < writes.length; idx++) {\n const [channel, value] = writes[idx]!;\n const mappedIdx = WRITES_IDX_MAP[channel] ?? idx;\n const key = `${taskId},${mappedIdx}`;\n\n // HSETNX semantics for normal writes; always overwrite for special writes (negative mappedIdx)\n if (mappedIdx >= 0 && stored.writes.has(key)) continue;\n\n // Bound the number of writes to avoid unbounded growth in dev\n if (stored.writes.size >= maxWritesPerCheckpoint) break;\n\n stored.writes.set(key, [taskId, channel, value]);\n }\n },\n\n async deleteThread(threadId: string): Promise<void> {\n for (const k of Array.from(latest.keys())) {\n if (k.startsWith(`${threadId}\\u0001`)) latest.delete(k);\n }\n for (const k of Array.from(checkpoints.keys())) {\n if (k.startsWith(`${threadId}\\u0001`)) checkpoints.delete(k);\n }\n },\n\n async deleteCheckpointWrites(\n threadId: string,\n checkpointNs: string,\n checkpointId: string,\n ): Promise<void> {\n const stored = checkpoints.get(\n chkKey(threadId, checkpointNs, checkpointId),\n );\n stored?.writes.clear();\n },\n\n async getLatestCheckpointId(\n threadId: string,\n checkpointNs = \"\",\n ): Promise<string | undefined> {\n return latest.get(nsKey(threadId, checkpointNs));\n },\n };\n\n return saver as InMemoryCheckpointSaver;\n}\n","import type { BaseCheckpointSaver } from \"@langchain/langgraph-checkpoint\";\nimport { createInMemoryCheckpointSaver } from \"./framework/in-memory-checkpointer\";\n\nconst MAX_CHECKPOINTERS = 200;\nconst map = new Map<string, BaseCheckpointSaver>();\n\nexport function getCheckpointer(key: string): BaseCheckpointSaver {\n const k = key || \"__default__\";\n const existing = map.get(k);\n if (existing) return existing;\n\n const saver = createInMemoryCheckpointSaver();\n map.set(k, saver);\n\n // Simple FIFO eviction to avoid unbounded growth in long-lived dev servers.\n if (map.size > MAX_CHECKPOINTERS) {\n map.delete(map.keys().next().value as string);\n }\n\n return saver;\n}\n","import type { FrameworkAdapter, ManagedFrameworkAdapter } from \"./adapter\";\n\n/** Internal cache capability. It is separate from authoritative framework stores. */\nexport type FrameworkPayloadCache = {\n get: (key: string) => Promise<string | null>;\n set: (key: string, value: string, ttlMs: number) => Promise<void>;\n close?: () => Promise<void>;\n};\n\nconst providers = new WeakMap<\n FrameworkAdapter,\n { cache: FrameworkPayloadCache; ttlMs: number }\n>();\nconst attachedCaches = new WeakSet<FrameworkAdapter>();\nconst storageBindings = new WeakMap<\n FrameworkAdapter,\n (cache: FrameworkPayloadCache, ttlMs: number, timeoutMs: number) => void\n>();\n\nexport function registerFrameworkCache(\n adapter: FrameworkAdapter,\n cache: FrameworkPayloadCache,\n ttlMs: number,\n) {\n providers.set(adapter, { cache, ttlMs });\n}\n\nexport function registerFrameworkCacheStorage(\n adapter: FrameworkAdapter,\n bind: (\n cache: FrameworkPayloadCache,\n ttlMs: number,\n timeoutMs: number,\n ) => void,\n) {\n storageBindings.set(adapter, bind);\n}\n\nexport function validateFrameworkCacheOptions(\n ttlMs: number,\n timeoutMs: number,\n) {\n if (!Number.isSafeInteger(ttlMs) || ttlMs < 1)\n throw new TypeError(\"cache ttlMs must be a positive safe integer.\");\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 1000)\n throw new TypeError(\n \"cache timeoutMs must be a positive integer no greater than 1000.\",\n );\n}\n\nexport type CreateCachingFrameworkAdapterOptions<\n T extends ManagedFrameworkAdapter = ManagedFrameworkAdapter,\n> = {\n /** Authoritative storage. Currently supports the PostgreSQL adapter. */\n storage: T;\n /** Payload cache provider. Currently supports the Redis adapter. */\n cache: FrameworkAdapter;\n /** Cache operation budget. Default: 25 ms, maximum: 1000 ms. */\n timeoutMs?: number;\n};\n\n/** Attaches caching to storage before traffic, preserving every storage method and its identity.\n * The returned adapter owns shutdown of both inputs. Do not use the cache input as another storage backend.\n */\nexport function createCachingFrameworkAdapter<\n T extends ManagedFrameworkAdapter,\n>(options: CreateCachingFrameworkAdapterOptions<T>): T {\n const bind = storageBindings.get(options.storage);\n if (!bind)\n throw new TypeError(\n \"storage must support framework payload caching (currently PostgreSQL).\",\n );\n const provider = providers.get(options.cache);\n if (!provider)\n throw new TypeError(\n \"cache must provide framework payload caching (currently Redis).\",\n );\n if (attachedCaches.has(options.cache))\n throw new TypeError(\"The cache adapter already has a storage owner.\");\n const timeoutMs = options.timeoutMs ?? 25;\n validateFrameworkCacheOptions(provider.ttlMs, timeoutMs);\n bind(provider.cache, provider.ttlMs, timeoutMs);\n attachedCaches.add(options.cache);\n return options.storage;\n}\n","export type PruneRuntimeOptions = {\n /** Defaults to wall-clock time; future timestamps are rejected. */\n now?: Date;\n /** Maximum parent records removed per table. Default: 500, maximum: 1000. */\n batchSize?: number;\n};\n\nexport type PruneRuntimeResult = {\n skipped: boolean;\n hasMore: boolean;\n deleted: {\n pendingRequests: number;\n sessionCheckpoints: number;\n graphCheckpoints: number;\n sessions: number;\n runs: number;\n };\n};\n\nexport type RuntimeMaintenance = {\n /** Explicit, idempotent backend setup. Complete before serving requests. */\n setup: () => Promise<void>;\n /** App-scheduled cleanup. Redis uses native TTL; memory uses lazy expiry/count limits. */\n prune: (options?: PruneRuntimeOptions) => Promise<PruneRuntimeResult>;\n};\n\nexport function resolvePruneOptions(options: PruneRuntimeOptions = {}) {\n const now = options.now?.getTime() ?? Date.now();\n if (!Number.isSafeInteger(now) || now < 0 || now > Date.now())\n throw new TypeError(\n \"prune now must be a valid date no later than the current time.\",\n );\n const batchSize = options.batchSize ?? 500;\n if (!Number.isSafeInteger(batchSize) || batchSize < 1 || batchSize > 1000)\n throw new TypeError(\n \"batchSize must be a positive integer no greater than 1000.\",\n );\n return { now, batchSize };\n}\n\nexport function emptyPruneResult(): PruneRuntimeResult {\n return {\n skipped: false,\n hasMore: false,\n deleted: {\n pendingRequests: 0,\n sessionCheckpoints: 0,\n graphCheckpoints: 0,\n sessions: 0,\n runs: 0,\n },\n };\n}\n","import type { GraphState } from \"@kortyx/core\";\nimport type { GraphSnapshotBundle } from \"./graph-snapshot\";\n\nexport type HumanInputKind = \"choice\" | \"multi-choice\" | \"text\" | \"custom\";\n\nexport interface HumanInputOption {\n id: string;\n label: string;\n description?: string;\n value?: unknown;\n}\n\nexport interface PendingRequestRecord {\n ready?: boolean;\n responseCompleted?: boolean;\n token: string;\n requestId: string;\n sessionId?: string | undefined;\n /**\n * Framework run identifier used by the checkpointer (thread_id).\n * This must be stable across interrupt/resume, but should not be reused for new messages.\n */\n runId: string;\n /**\n * LangGraph checkpoint id for the paused interrupt within the run thread.\n * Used to resume from the correct interrupt after session rollback.\n */\n graphCheckpointId?: string | undefined;\n graphSnapshot?: GraphSnapshotBundle;\n workflow: string;\n node: string;\n state?: GraphState;\n schema: {\n kind: HumanInputKind;\n multiple: boolean;\n question?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n contract?: string;\n request?: unknown;\n meta?: Record<string, unknown>;\n };\n options: HumanInputOption[];\n createdAt: number;\n ttlMs: number;\n}\n\nexport interface PendingRequestStore {\n list?: () => Promise<PendingRequestRecord[]>;\n take?: (token: string) => Promise<PendingRequestRecord | null>;\n save: (rec: PendingRequestRecord) => Promise<void>;\n get: (token: string) => Promise<PendingRequestRecord | null>;\n delete: (token: string) => Promise<void>;\n update: (\n token: string,\n patch: Partial<PendingRequestRecord>,\n ) => Promise<void>;\n}\n\nexport function createInMemoryPendingRequestStore(): PendingRequestStore & {\n pruneExpired: (now: number, batchSize: number) => number;\n} {\n const store = new Map<string, PendingRequestRecord>();\n\n const pruneExpired = (t: number, batchSize: number) => {\n let deleted = 0;\n for (const [k, v] of store.entries()) {\n if (deleted === batchSize) break;\n if (t - v.createdAt > v.ttlMs) {\n store.delete(k);\n deleted++;\n }\n }\n return deleted;\n };\n const prune = () => pruneExpired(Date.now(), Number.POSITIVE_INFINITY);\n\n return {\n pruneExpired,\n async list() {\n prune();\n return JSON.parse(\n JSON.stringify([...store.values()]),\n ) as PendingRequestRecord[];\n },\n async take(token) {\n prune();\n const record = store.get(token);\n store.delete(token);\n return record\n ? (JSON.parse(JSON.stringify(record)) as PendingRequestRecord)\n : null;\n },\n async save(rec) {\n prune();\n store.set(rec.token, rec);\n },\n async get(token) {\n prune();\n return store.get(token) ?? null;\n },\n async delete(token) {\n store.delete(token);\n },\n async update(token, patch) {\n const prev = store.get(token);\n if (!prev) return;\n store.set(token, { ...prev, ...patch });\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { PersistenceError } from \"@kortyx/core/errors\";\nimport type { ManagedFrameworkAdapter } from \"../adapter\";\nimport { registerFrameworkCacheStorage } from \"../caching\";\nimport { PostgresCheckpointSaver } from \"./checkpointer\";\nimport { createRuntimeMaintenance } from \"./maintenance\";\nimport { createPostgresPendingRequestStore } from \"./pending-request-store\";\nimport { createPostgresSessionCheckpointStore } from \"./session-checkpoint-store\";\nimport {\n PostgresRuntimeStore,\n positiveInteger,\n type RuntimeRetentionPolicy,\n} from \"./store\";\n\nexport type CreatePostgresFrameworkAdapterOptions = {\n connectionString: string;\n /** Isolates applications sharing the runtime tables. Default: \"default\". */\n namespace?: string;\n /** Interrupt lifetime, independent of checkpoint retention. Default: 15 minutes. */\n ttlMs?: number;\n retention?: RuntimeRetentionPolicy;\n};\n\nexport type PostgresFrameworkAdapter = ManagedFrameworkAdapter & {\n kind: \"postgres\";\n checkpointer: PostgresCheckpointSaver;\n /** Closes owned connections. Call after in-flight executions have completed. */\n close: () => Promise<void>;\n};\n\nexport function createPostgresFrameworkAdapter(\n options: CreatePostgresFrameworkAdapterOptions,\n): PostgresFrameworkAdapter {\n const ttlMs = positiveInteger(\"ttlMs\", options.ttlMs ?? 15 * 60 * 1000);\n const store = new PostgresRuntimeStore(\n options.connectionString,\n options.namespace ?? \"default\",\n options.retention ?? {},\n );\n const saver = new PostgresCheckpointSaver(store);\n const adapter: PostgresFrameworkAdapter = {\n kind: \"postgres\",\n ttlMs,\n checkpointer: saver,\n pendingRequests: createPostgresPendingRequestStore(store),\n sessionCheckpoints: createPostgresSessionCheckpointStore(store, saver),\n maintenance: createRuntimeMaintenance(store),\n // Completed runs remain available until maintenance applies retention.\n cleanupRun: async (runId) =>\n store.transaction((sql) => store.touchRun(sql, runId)),\n acquireRunLease: async ({ runId, sessionId, onLost }) => {\n const token = randomUUID();\n const renew = async () => {\n await store.transaction(async (sql) => {\n if (sessionId) await store.touchSession(sql, sessionId);\n const rows =\n await sql`UPDATE kortyx_runtime_runs SET lease_until = ${Date.now() + 120_000}, last_activity = ${Date.now()}\n WHERE scope = ${store.scope} AND id = ${runId} AND lease_token = ${token}\n AND lease_until > ${Date.now()} RETURNING id`;\n if (!rows.length)\n throw new PersistenceError(\"The runtime execution lease was lost.\");\n });\n };\n await store.transaction(async (sql) => {\n if (sessionId) await store.touchSession(sql, sessionId);\n const rows =\n await sql`INSERT INTO kortyx_runtime_runs AS r (scope, id, last_activity, lease_token, lease_until, session_id)\n VALUES (${store.scope}, ${runId}, ${Date.now()}, ${token}, ${Date.now() + 120_000}, ${sessionId ?? null})\n ON CONFLICT (scope, id) DO UPDATE SET last_activity = EXCLUDED.last_activity,\n revision = r.revision + 1, lease_token = EXCLUDED.lease_token,\n lease_until = EXCLUDED.lease_until, session_id = EXCLUDED.session_id\n WHERE r.lease_until <= ${Date.now()} RETURNING id`;\n if (!rows.length)\n throw new PersistenceError(\"This runtime run is already executing.\");\n });\n let renewing: Promise<void> | undefined;\n let stopped = false;\n let deadline: NodeJS.Timeout;\n const lost = (cause: unknown) => {\n if (stopped) return;\n stopped = true;\n clearInterval(timer);\n clearTimeout(deadline);\n onLost(cause);\n };\n const armDeadline = () => {\n clearTimeout(deadline);\n // Abort before the database lease expires, including when a renewal is hung on I/O.\n deadline = setTimeout(\n () =>\n lost(new PersistenceError(\"Execution lease renewal timed out.\")),\n 90_000,\n );\n deadline.unref();\n };\n const timer = setInterval(() => {\n if (stopped || renewing) return;\n renewing = renew()\n .then(() => {\n if (!stopped) armDeadline();\n })\n .catch(lost)\n .finally(() => {\n renewing = undefined;\n });\n }, 30_000);\n timer.unref();\n armDeadline();\n return async () => {\n stopped = true;\n clearInterval(timer);\n clearTimeout(deadline);\n await renewing;\n await store.transaction(async (sql) => {\n await sql`UPDATE kortyx_runtime_runs SET lease_token = NULL, lease_until = 0, last_activity = ${Date.now()}\n WHERE scope = ${store.scope} AND id = ${runId} AND lease_token = ${token}`;\n });\n };\n },\n close: () => store.close(),\n };\n registerFrameworkCacheStorage(adapter, (cache, ttlMs, timeoutMs) =>\n store.attachCache(cache, ttlMs, timeoutMs),\n );\n return adapter;\n}\n","import { PersistenceError } from \"@kortyx/core/errors\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport {\n BaseCheckpointSaver,\n type Checkpoint,\n type CheckpointListOptions,\n type CheckpointMetadata,\n type CheckpointTuple,\n copyCheckpoint,\n getCheckpointId,\n type PendingWrite,\n WRITES_IDX_MAP,\n} from \"@langchain/langgraph-checkpoint\";\nimport type postgres from \"postgres\";\nimport { clone, type PostgresRuntimeStore } from \"./store\";\n\nconst configFor = (runId: string, ns: string, id: string): RunnableConfig => ({\n configurable: { thread_id: runId, checkpoint_ns: ns, checkpoint_id: id },\n});\n\ntype StoredGraphCheckpoint = {\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n parentCheckpointId?: string;\n};\n\n/** Kortyx-owned checkpoint format and relational persistence, independent of LangGraph saver packages. */\nexport class PostgresCheckpointSaver extends BaseCheckpointSaver {\n constructor(private readonly store: PostgresRuntimeStore) {\n super({\n dumpsTyped: async (data: unknown): Promise<[string, Uint8Array]> => [\n \"json\",\n Buffer.from(JSON.stringify(data)),\n ],\n loadsTyped: async (_type: string, data: Uint8Array | string) =>\n JSON.parse(\n typeof data === \"string\" ? data : Buffer.from(data).toString(\"utf8\"),\n ),\n });\n }\n\n override async getTuple(\n config: RunnableConfig,\n ): Promise<CheckpointTuple | undefined> {\n const runId = config.configurable?.thread_id as string | undefined;\n if (!runId) return undefined;\n const ns = (config.configurable?.checkpoint_ns as string | undefined) ?? \"\";\n const id = getCheckpointId(config);\n const { sql, scope } = this.store;\n const rows = await this.store.query(sql`SELECT g.id, g.position, r.revision\n FROM kortyx_runtime_graph_checkpoints g\n JOIN kortyx_runtime_runs r ON r.scope = g.scope AND r.id = g.run_id\n WHERE g.scope = ${scope} AND g.run_id = ${runId} AND g.ns = ${ns}\n AND g.record ? 'checkpoint'\n ${id ? sql`AND g.id = ${id}` : sql``}\n AND ${this.store.liveRun(sql, Date.now())}\n ORDER BY g.position DESC LIMIT 1`);\n const row = rows[0];\n if (!row) return undefined;\n // Validate existence and visibility in PostgreSQL even on a cache hit. Revision covers pending writes.\n return this.store.payload(\n [\"graph\", runId, ns, row.id, row.position, row.revision],\n async () => {\n const [records, writes] = await Promise.all([\n this.store.query(sql`SELECT record FROM kortyx_runtime_graph_checkpoints\n WHERE scope = ${scope} AND run_id = ${runId} AND ns = ${ns} AND id = ${row.id}`),\n this.store.query(sql`SELECT task_id, channel, value FROM kortyx_runtime_graph_writes\n WHERE scope = ${scope} AND run_id = ${runId} AND ns = ${ns} AND checkpoint_id = ${row.id}\n ORDER BY task_id, idx`),\n ]);\n if (!records[0]) return undefined;\n const record = records[0].record as StoredGraphCheckpoint;\n return {\n config: configFor(runId, ns, row.id),\n checkpoint: record.checkpoint,\n metadata: record.metadata,\n ...(record.parentCheckpointId\n ? { parentConfig: configFor(runId, ns, record.parentCheckpointId) }\n : {}),\n pendingWrites: writes.map(\n (write) =>\n [\n write.task_id,\n write.channel,\n (write.value as { value: unknown }).value,\n ] as [string, string, unknown],\n ),\n };\n },\n );\n }\n\n override async *list(\n config: RunnableConfig,\n options?: CheckpointListOptions,\n ): AsyncGenerator<CheckpointTuple> {\n const { sql, scope } = this.store;\n const runId = config.configurable?.thread_id as string | undefined;\n const ns = config.configurable?.checkpoint_ns as string | undefined;\n const id = getCheckpointId(config);\n const before = options?.before\n ? getCheckpointId(options.before)\n : undefined;\n const rows =\n await this.store.query(sql`SELECT g.run_id, g.ns, g.id FROM kortyx_runtime_graph_checkpoints g\n JOIN kortyx_runtime_runs r ON r.scope = g.scope AND r.id = g.run_id\n WHERE g.scope = ${scope} AND ${this.store.liveRun(sql, Date.now())}\n AND g.record ? 'checkpoint'\n ${runId ? sql`AND g.run_id = ${runId}` : sql``}\n ${ns !== undefined ? sql`AND g.ns = ${ns}` : sql``}\n ${id ? sql`AND g.id = ${id}` : sql``}\n ${before ? sql`AND g.id < ${before}` : sql``}\n ${options?.filter ? sql`AND g.record->'metadata' @> ${sql.json(clone(options.filter))}` : sql``}\n ORDER BY g.id DESC ${options?.limit !== undefined ? sql`LIMIT ${options.limit}` : sql``}`);\n for (const row of rows) {\n const tuple = await this.getTuple(configFor(row.run_id, row.ns, row.id));\n if (tuple) yield tuple;\n }\n }\n\n override async put(\n config: RunnableConfig,\n checkpoint: Checkpoint,\n metadata: CheckpointMetadata,\n _newVersions: Record<string, number | string>,\n ): Promise<RunnableConfig> {\n const runId = config.configurable?.thread_id as string | undefined;\n if (!runId)\n throw new PersistenceError(\n 'Failed to put checkpoint: missing \"thread_id\".',\n );\n const ns = (config.configurable?.checkpoint_ns as string | undefined) ?? \"\";\n const parentCheckpointId = config.configurable?.checkpoint_id as\n | string\n | undefined;\n const record: StoredGraphCheckpoint = {\n checkpoint: copyCheckpoint(checkpoint),\n metadata,\n ...(parentCheckpointId ? { parentCheckpointId } : {}),\n };\n await this.store.transaction(async (sql) => {\n await this.store.touchRun(sql, runId);\n await sql`INSERT INTO kortyx_runtime_graph_checkpoints (scope, run_id, ns, id, record)\n VALUES (${this.store.scope}, ${runId}, ${ns}, ${checkpoint.id}, ${sql.json(clone(record) as unknown as postgres.JSONValue)})\n ON CONFLICT (scope, run_id, ns, id) DO UPDATE SET record = EXCLUDED.record,\n position = EXCLUDED.position`;\n });\n return configFor(runId, ns, checkpoint.id);\n }\n\n override async putWrites(\n config: RunnableConfig,\n writes: PendingWrite[],\n taskId: string,\n ): Promise<void> {\n const runId = config.configurable?.thread_id as string | undefined;\n const id = getCheckpointId(config);\n if (!runId || !id)\n throw new PersistenceError(\n 'Failed to put writes: missing \"thread_id\" or \"checkpoint_id\".',\n );\n const ns = (config.configurable?.checkpoint_ns as string | undefined) ?? \"\";\n await this.store.transaction(async (sql) => {\n await this.store.touchRun(sql, runId);\n // The engine may enqueue task writes before its asynchronous checkpoint save.\n // An unreadable placeholder preserves the foreign key and cascaded cleanup;\n // put() publishes the complete record without discarding those early writes.\n await sql`INSERT INTO kortyx_runtime_graph_checkpoints (scope, run_id, ns, id, record)\n VALUES (${this.store.scope}, ${runId}, ${ns}, ${id}, ${sql.json({})})\n ON CONFLICT (scope, run_id, ns, id) DO NOTHING`;\n const rows = new Map<\n number,\n {\n scope: string;\n run_id: string;\n ns: string;\n checkpoint_id: string;\n task_id: string;\n idx: number;\n channel: string;\n value: ReturnType<typeof sql.json>;\n }\n >();\n for (const [idx, [channel, value]] of writes.entries()) {\n const mapped = WRITES_IDX_MAP[channel] ?? idx;\n rows.set(mapped, {\n scope: this.store.scope,\n run_id: runId,\n ns,\n checkpoint_id: id,\n task_id: taskId,\n idx: mapped,\n channel,\n value: sql.json({\n value: clone(value ?? null),\n } as postgres.JSONValue),\n });\n }\n if (rows.size)\n await sql`INSERT INTO kortyx_runtime_graph_writes\n ${sql([...rows.values()], \"scope\", \"run_id\", \"ns\", \"checkpoint_id\", \"task_id\", \"idx\", \"channel\", \"value\")}\n ON CONFLICT (scope, run_id, ns, checkpoint_id, task_id, idx)\n DO UPDATE SET channel = EXCLUDED.channel, value = EXCLUDED.value WHERE EXCLUDED.idx < 0`;\n });\n }\n\n override async deleteThread(runId: string): Promise<void> {\n await this.store.transaction(async (sql) => {\n await sql`DELETE FROM kortyx_runtime_runs WHERE scope = ${this.store.scope} AND id = ${runId}`;\n });\n }\n\n async deleteCheckpointWrites(\n runId: string,\n ns: string,\n id: string,\n ): Promise<void> {\n await this.store.transaction(async (sql) => {\n await this.store.touchRun(sql, runId);\n await sql`DELETE FROM kortyx_runtime_graph_writes\n WHERE scope = ${this.store.scope} AND run_id = ${runId} AND ns = ${ns} AND checkpoint_id = ${id}`;\n });\n }\n\n async getLatestCheckpointId(\n runId: string,\n ns = \"\",\n ): Promise<string | undefined> {\n return (\n await this.getTuple({\n configurable: { thread_id: runId, checkpoint_ns: ns },\n })\n )?.checkpoint.id;\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { KortyxError, PersistenceError } from \"@kortyx/core/errors\";\nimport postgres from \"postgres\";\nimport {\n type FrameworkPayloadCache,\n validateFrameworkCacheOptions,\n} from \"../caching\";\nimport type { RedisFrameworkStore } from \"../redis/redis-store\";\nimport { runRuntimeMigrations } from \"./migrations\";\n\nexport type RuntimeSql = postgres.Sql | postgres.TransactionSql;\n\nexport type RuntimeRetentionPolicy = {\n /** Rolling history window. The current head and live runs are protected. Default: 30. */\n checkpointHistoryDays?: number;\n /** Inactivity window for a session. Unexpired interrupts and live runs protect it. Default: 30. */\n inactiveSessionDays?: number;\n};\n\nexport const positiveInteger = (name: string, value: number): number => {\n if (!Number.isSafeInteger(value) || value <= 0)\n throw new TypeError(`${name} must be a positive safe integer.`);\n return value;\n};\n\nexport const clone = <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T;\n\n/** Internal relational storage. Redis never controls visibility or token consumption. */\nexport class PostgresRuntimeStore {\n readonly sql: postgres.Sql;\n readonly scope: string;\n readonly historyMs: number;\n readonly sessionMs: number;\n private readonly cachePrefix: string;\n private cacheRetryAfter = 0;\n private cacheClosed = false;\n private readonly cachePopulations = new Map<string, Promise<void>>();\n\n constructor(\n connectionString: string,\n namespace: string,\n retention: RuntimeRetentionPolicy,\n private cache?: Pick<RedisFrameworkStore, \"get\" | \"set\" | \"close\">,\n private cacheTtlMs = 15 * 60 * 1000,\n private cacheTimeoutMs = 25,\n ) {\n const url = new URL(connectionString);\n if (![\"postgres:\", \"postgresql:\"].includes(url.protocol))\n throw new TypeError(\"connectionString must be a PostgreSQL URL.\");\n if (!namespace) throw new TypeError(\"namespace must not be empty.\");\n this.scope = namespace;\n this.historyMs =\n positiveInteger(\n \"checkpointHistoryDays\",\n retention.checkpointHistoryDays ?? 30,\n ) * 86_400_000;\n this.sessionMs =\n positiveInteger(\n \"inactiveSessionDays\",\n retention.inactiveSessionDays ?? 30,\n ) * 86_400_000;\n positiveInteger(\"checkpoint history duration\", this.historyMs);\n positiveInteger(\"session retention duration\", this.sessionMs);\n validateFrameworkCacheOptions(cacheTtlMs, cacheTimeoutMs);\n this.sql = postgres(connectionString, {\n max: 10,\n connect_timeout: 5,\n onnotice: () => {},\n });\n this.cachePrefix = createHash(\"sha256\")\n .update(`${connectionString}\\0${namespace}`)\n .digest(\"hex\");\n }\n\n get cacheEnabled(): boolean {\n return Boolean(this.cache);\n }\n\n attachCache(\n cache: FrameworkPayloadCache,\n ttlMs: number,\n timeoutMs: number,\n ): void {\n if (this.cacheClosed)\n throw new TypeError(\"Cannot configure a closed storage adapter.\");\n if (this.cache)\n throw new TypeError(\"Storage already has a framework cache.\");\n validateFrameworkCacheOptions(ttlMs, timeoutMs);\n this.cache = cache;\n this.cacheTtlMs = ttlMs;\n this.cacheTimeoutMs = timeoutMs;\n }\n\n async setup(): Promise<void> {\n await this.query(runRuntimeMigrations(this.sql));\n }\n\n async query<T>(query: PromiseLike<T>): Promise<T> {\n try {\n return await query;\n } catch (cause) {\n if (cause instanceof KortyxError) throw cause;\n throw new PersistenceError(\"PostgreSQL runtime operation failed.\", cause);\n }\n }\n\n async transaction<T>(\n operation: (sql: postgres.TransactionSql) => Promise<T>,\n ): Promise<T> {\n try {\n return (await this.sql.begin(async (sql) => {\n // Maintenance takes the exclusive counterpart. Ordinary mutations may run concurrently.\n await sql`SELECT pg_advisory_xact_lock_shared(hashtextextended(${`kortyx:runtime:${this.scope}`}, 0))`;\n return operation(sql);\n })) as T;\n } catch (cause) {\n if (cause instanceof KortyxError) throw cause;\n throw new PersistenceError(\"PostgreSQL runtime operation failed.\", cause);\n }\n }\n\n liveSession(sql: RuntimeSql, now: number) {\n return sql`(s.last_activity > ${now - this.sessionMs}\n OR EXISTS (SELECT 1 FROM kortyx_runtime_pending_requests p\n WHERE p.scope = s.scope AND p.session_id = s.id AND p.expires_at > ${now})\n OR EXISTS (SELECT 1 FROM kortyx_runtime_runs r\n WHERE r.scope = s.scope AND r.session_id = s.id AND r.lease_until > ${now}))`;\n }\n\n liveCheckpoint(sql: RuntimeSql, now: number) {\n return sql`(c.created_at > ${now - this.historyMs} OR s.head_id = c.id\n OR EXISTS (SELECT 1 FROM kortyx_runtime_pending_requests p\n WHERE p.scope = c.scope AND p.run_id = c.run_id AND p.expires_at > ${now})\n OR EXISTS (SELECT 1 FROM kortyx_runtime_runs r\n WHERE r.scope = c.scope AND r.id = c.run_id AND r.lease_until > ${now}))`;\n }\n\n liveRun(sql: RuntimeSql, now: number) {\n return sql`(r.last_activity > ${now - this.historyMs} OR r.lease_until > ${now}\n OR EXISTS (SELECT 1 FROM kortyx_runtime_pending_requests p\n WHERE p.scope = r.scope AND p.run_id = r.id AND p.expires_at > ${now})\n OR EXISTS (SELECT 1 FROM kortyx_runtime_session_checkpoints c\n JOIN kortyx_runtime_sessions s ON s.scope = c.scope AND s.id = c.session_id\n WHERE c.scope = r.scope AND c.run_id = r.id\n AND ${this.liveSession(sql, now)} AND ${this.liveCheckpoint(sql, now)}))`;\n }\n\n async touchRun(sql: postgres.TransactionSql, runId: string): Promise<void> {\n await sql`INSERT INTO kortyx_runtime_runs (scope, id, last_activity)\n VALUES (${this.scope}, ${runId}, ${Date.now()})\n ON CONFLICT (scope, id) DO UPDATE SET last_activity = EXCLUDED.last_activity,\n revision = kortyx_runtime_runs.revision + 1`;\n }\n\n async touchSession(\n sql: postgres.TransactionSql,\n sessionId: string,\n ): Promise<void> {\n const updated =\n await sql`INSERT INTO kortyx_runtime_sessions AS s (scope, id, last_activity)\n VALUES (${this.scope}, ${sessionId}, ${Date.now()})\n ON CONFLICT (scope, id) DO UPDATE SET last_activity = EXCLUDED.last_activity\n WHERE ${this.liveSession(sql, Date.now())} RETURNING id`;\n if (!updated.length)\n throw new KortyxError(\n \"SESSION_EXPIRED\",\n \"The runtime session has expired. Start a new session.\",\n {\n category: \"request\",\n retryable: false,\n safeMessage: \"This session has expired. Start a new session.\",\n },\n );\n }\n\n async payload<T>(key: unknown[], load: () => Promise<T>): Promise<T> {\n const cacheKey = `${this.cachePrefix}:${createHash(\"sha256\").update(JSON.stringify(key)).digest(\"hex\")}`;\n const cache = this.cache;\n if (cache && !this.cacheClosed && Date.now() >= this.cacheRetryAfter) {\n try {\n const raw = await this.cacheCall(() => cache.get(cacheKey));\n if (raw) return JSON.parse(raw) as T;\n } catch {\n this.cacheRetryAfter = Date.now() + 5000;\n /* PostgreSQL remains available when Redis fails. */\n }\n }\n const value = await load();\n if (\n cache &&\n !this.cacheClosed &&\n Date.now() >= this.cacheRetryAfter &&\n value !== undefined &&\n value !== null &&\n !this.cachePopulations.has(cacheKey) &&\n this.cachePopulations.size < 10\n ) {\n // Payload cache writes never delay authoritative reads. Bound and deduplicate\n // work so a slow cache cannot create an unbounded background queue.\n const population = this.cacheCall(() =>\n cache.set(cacheKey, JSON.stringify(value), this.cacheTtlMs),\n )\n .then(() => {})\n .catch(() => {\n this.cacheRetryAfter = Date.now() + 5000;\n })\n .finally(() => {\n this.cachePopulations.delete(cacheKey);\n });\n this.cachePopulations.set(cacheKey, population);\n }\n return value;\n }\n\n private async cacheCall<T>(operation: () => Promise<T>): Promise<T> {\n let timer: NodeJS.Timeout | undefined;\n try {\n return await Promise.race([\n operation(),\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n void this.cache?.close?.().catch(() => {});\n reject(new Error(\"Runtime cache operation timed out.\"));\n }, this.cacheTimeoutMs);\n timer.unref();\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n }\n\n async close(): Promise<void> {\n this.cacheClosed = true;\n try {\n await Promise.all(this.cachePopulations.values());\n await this.cache?.close?.();\n } finally {\n await this.sql.end({ timeout: 5 });\n }\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { PersistenceError } from \"@kortyx/core/errors\";\nimport type postgres from \"postgres\";\nimport { initialRuntimeMigration } from \"./0001-initial-runtime\";\n\nexport type RuntimeMigration = {\n readonly version: number;\n readonly description: string;\n readonly sql: string;\n};\n\n/** Bundle SQL into the SDK; no filesystem reads or extra migration dependency. */\nexport const runtimeMigrations: readonly RuntimeMigration[] = Object.freeze([\n initialRuntimeMigration,\n]);\n\n/** Internal runner. The explicit migration list is used by real-database upgrade tests. */\nexport async function runRuntimeMigrations(\n database: postgres.Sql,\n migrations: readonly RuntimeMigration[] = runtimeMigrations,\n): Promise<void> {\n if (!migrations.length)\n throw new TypeError(\"Runtime migrations must include version 1.\");\n for (const [index, migration] of migrations.entries()) {\n if (migration.version !== index + 1 || !migration.sql.trim())\n throw new TypeError(\n \"Runtime migrations must contain nonempty SQL with consecutive versions starting at 1.\",\n );\n }\n\n const checksums = migrations.map((migration) =>\n createHash(\"sha256\").update(migration.sql).digest(\"hex\"),\n );\n\n for (const migration of migrations) {\n try {\n await database.begin(\"isolation level read committed\", async (sql) => {\n // Recheck history under the lock for every version: concurrent setup calls\n // may interleave between commits, but a version can only be applied once.\n // Bound both advisory and DDL lock waits without relaxing a stricter\n // deployment-configured timeout. Transaction-local settings do not leak\n // into the pool's application queries.\n await sql`SELECT set_config('lock_timeout', CASE WHEN current_setting('lock_timeout')::interval = interval '0' OR current_setting('lock_timeout')::interval > interval '5 seconds' THEN '5s' ELSE current_setting('lock_timeout') END, true)`;\n await sql`SELECT pg_advisory_xact_lock(hashtextextended('kortyx:runtime:schema', 0))`;\n await sql`CREATE TABLE IF NOT EXISTS kortyx_runtime_migrations (version integer PRIMARY KEY, checksum text)`;\n const checksumColumn =\n await sql`SELECT 1 FROM pg_attribute WHERE attrelid = 'kortyx_runtime_migrations'::regclass AND attname = 'checksum' AND NOT attisdropped`;\n const legacyLedger = !checksumColumn.length;\n if (legacyLedger)\n await sql`ALTER TABLE kortyx_runtime_migrations ADD COLUMN checksum text`;\n const applied = await sql<\n { version: number; checksum: string | null }[]\n >`SELECT version, checksum FROM kortyx_runtime_migrations ORDER BY version`;\n if (applied.some((row) => row.version > migrations.length))\n throw new PersistenceError(\n \"The runtime schema is newer than this SDK supports.\",\n );\n if (\n applied.some((row, index) => row.version !== index + 1) ||\n applied.length < migration.version - 1\n )\n throw new PersistenceError(\n \"The runtime migration history is not a consecutive sequence starting at version 1.\",\n );\n for (const row of applied) {\n const expected = checksums[row.version - 1]!;\n // The original unreleased v1 bootstrap recorded only its version.\n // Adopt that baseline once; its prior SQL cannot be verified retroactively.\n if (legacyLedger && applied.length === 1 && row.version === 1) {\n await sql`UPDATE kortyx_runtime_migrations SET checksum = ${expected} WHERE version = 1`;\n } else if (row.checksum !== expected) {\n throw new PersistenceError(\n `Runtime migration ${row.version} checksum does not match this SDK. Restore the original migration; add a new version for changes.`,\n );\n }\n }\n if (migration.version <= applied.length) return;\n\n await sql.unsafe(migration.sql);\n await sql`INSERT INTO kortyx_runtime_migrations (version, checksum) VALUES (${migration.version}, ${checksums[migration.version - 1]!})`;\n });\n } catch (cause) {\n if (cause instanceof PersistenceError) throw cause;\n throw new PersistenceError(\n `Runtime migration ${migration.version} (${migration.description}) failed.`,\n cause,\n );\n }\n }\n}\n","// Released migrations are immutable. Add a new numbered migration for schema changes.\nexport const initialRuntimeMigration = Object.freeze({\n version: 1,\n description: \"Initial runtime persistence tables\",\n sql: `\nCREATE TABLE IF NOT EXISTS kortyx_runtime_sessions (\n scope text NOT NULL, id text NOT NULL, head_id text,\n last_activity bigint NOT NULL, next_turn bigint NOT NULL DEFAULT 0,\n PRIMARY KEY (scope, id)\n);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_sessions_activity\n ON kortyx_runtime_sessions (scope, last_activity);\nCREATE TABLE IF NOT EXISTS kortyx_runtime_runs (\n scope text NOT NULL, id text NOT NULL, session_id text,\n last_activity bigint NOT NULL, revision bigint NOT NULL DEFAULT 0,\n lease_token text, lease_until bigint NOT NULL DEFAULT 0,\n PRIMARY KEY (scope, id)\n);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_runs_activity\n ON kortyx_runtime_runs (scope, last_activity);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_runs_session\n ON kortyx_runtime_runs (scope, session_id);\nCREATE TABLE IF NOT EXISTS kortyx_runtime_graph_checkpoints (\n scope text NOT NULL, run_id text NOT NULL, ns text NOT NULL, id text NOT NULL,\n position bigserial NOT NULL, record jsonb NOT NULL,\n PRIMARY KEY (scope, run_id, ns, id),\n FOREIGN KEY (scope, run_id) REFERENCES kortyx_runtime_runs (scope, id) ON DELETE CASCADE\n);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_graph_latest\n ON kortyx_runtime_graph_checkpoints (scope, run_id, ns, position DESC);\nCREATE TABLE IF NOT EXISTS kortyx_runtime_graph_writes (\n scope text NOT NULL, run_id text NOT NULL, ns text NOT NULL, checkpoint_id text NOT NULL,\n task_id text NOT NULL, idx integer NOT NULL, channel text NOT NULL, value jsonb NOT NULL,\n PRIMARY KEY (scope, run_id, ns, checkpoint_id, task_id, idx),\n FOREIGN KEY (scope, run_id, ns, checkpoint_id)\n REFERENCES kortyx_runtime_graph_checkpoints (scope, run_id, ns, id) ON DELETE CASCADE\n);\nCREATE TABLE IF NOT EXISTS kortyx_runtime_session_checkpoints (\n scope text NOT NULL, id text NOT NULL, session_id text NOT NULL, run_id text NOT NULL,\n created_at bigint NOT NULL, turn_index bigint NOT NULL, active boolean NOT NULL DEFAULT true,\n record jsonb NOT NULL,\n PRIMARY KEY (scope, id),\n FOREIGN KEY (scope, session_id) REFERENCES kortyx_runtime_sessions (scope, id) ON DELETE CASCADE\n);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_session_history\n ON kortyx_runtime_session_checkpoints (scope, session_id, turn_index);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_session_runs\n ON kortyx_runtime_session_checkpoints (scope, run_id);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_checkpoint_age\n ON kortyx_runtime_session_checkpoints (scope, created_at);\nCREATE TABLE IF NOT EXISTS kortyx_runtime_pending_requests (\n scope text NOT NULL, token text NOT NULL, run_id text NOT NULL, session_id text,\n expires_at bigint NOT NULL, record jsonb NOT NULL,\n PRIMARY KEY (scope, token)\n);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_pending_expiry\n ON kortyx_runtime_pending_requests (scope, expires_at);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_pending_runs\n ON kortyx_runtime_pending_requests (scope, run_id);\nCREATE INDEX IF NOT EXISTS kortyx_runtime_pending_sessions\n ON kortyx_runtime_pending_requests (scope, session_id);\n`,\n});\n","import {\n type PruneRuntimeResult,\n type RuntimeMaintenance,\n resolvePruneOptions,\n} from \"../maintenance\";\nimport type { PostgresRuntimeStore } from \"./store\";\n\nexport function createRuntimeMaintenance(\n store: PostgresRuntimeStore,\n): RuntimeMaintenance {\n return {\n setup: () => store.setup(),\n async prune(options = {}) {\n const { now, batchSize: batch } = resolvePruneOptions(options);\n return (await store.query(\n store.sql.begin(async (sql) => {\n const deleted = {\n pendingRequests: 0,\n sessionCheckpoints: 0,\n graphCheckpoints: 0,\n sessions: 0,\n runs: 0,\n };\n const locks =\n await sql`SELECT pg_try_advisory_xact_lock(hashtextextended(${`kortyx:runtime:${store.scope}`}, 0)) AS acquired`;\n if (!locks[0]?.acquired)\n return { skipped: true, hasMore: false, deleted };\n const pending =\n await sql`DELETE FROM kortyx_runtime_pending_requests WHERE (scope, token) IN (\n SELECT scope, token FROM kortyx_runtime_pending_requests\n WHERE scope = ${store.scope} AND expires_at <= ${now} ORDER BY expires_at LIMIT ${batch}\n ) RETURNING token`;\n deleted.pendingRequests = pending.length;\n const checkpoints =\n await sql`DELETE FROM kortyx_runtime_session_checkpoints WHERE (scope, id) IN (\n SELECT c.scope, c.id FROM kortyx_runtime_session_checkpoints c\n JOIN kortyx_runtime_sessions s ON s.scope = c.scope AND s.id = c.session_id\n WHERE c.scope = ${store.scope}\n AND (NOT ${store.liveSession(sql, now)} OR NOT ${store.liveCheckpoint(sql, now)})\n ORDER BY c.created_at LIMIT ${batch}\n ) RETURNING id`;\n deleted.sessionCheckpoints = checkpoints.length;\n // Remove large runs incrementally rather than cascading an entire run's history in one batch.\n const graph =\n await sql`DELETE FROM kortyx_runtime_graph_checkpoints WHERE (scope, run_id, ns, id) IN (\n SELECT g.scope, g.run_id, g.ns, g.id FROM kortyx_runtime_graph_checkpoints g\n JOIN kortyx_runtime_runs r ON r.scope = g.scope AND r.id = g.run_id\n WHERE g.scope = ${store.scope} AND NOT ${store.liveRun(sql, now)}\n AND NOT EXISTS (SELECT 1 FROM kortyx_runtime_session_checkpoints c WHERE c.scope = r.scope AND c.run_id = r.id)\n ORDER BY g.position LIMIT ${batch}\n ) RETURNING id`;\n deleted.graphCheckpoints = graph.length;\n const sessions =\n await sql`DELETE FROM kortyx_runtime_sessions WHERE (scope, id) IN (\n SELECT s.scope, s.id FROM kortyx_runtime_sessions s\n WHERE s.scope = ${store.scope} AND NOT ${store.liveSession(sql, now)}\n AND NOT EXISTS (SELECT 1 FROM kortyx_runtime_session_checkpoints c WHERE c.scope = s.scope AND c.session_id = s.id)\n AND NOT EXISTS (SELECT 1 FROM kortyx_runtime_pending_requests p WHERE p.scope = s.scope AND p.session_id = s.id)\n ORDER BY s.last_activity LIMIT ${batch}\n ) RETURNING id`;\n deleted.sessions = sessions.length;\n const runs =\n await sql`DELETE FROM kortyx_runtime_runs WHERE (scope, id) IN (\n SELECT r.scope, r.id FROM kortyx_runtime_runs r\n WHERE r.scope = ${store.scope} AND NOT ${store.liveRun(sql, now)}\n AND NOT EXISTS (SELECT 1 FROM kortyx_runtime_graph_checkpoints g WHERE g.scope = r.scope AND g.run_id = r.id)\n AND NOT EXISTS (SELECT 1 FROM kortyx_runtime_session_checkpoints c WHERE c.scope = r.scope AND c.run_id = r.id)\n AND NOT EXISTS (SELECT 1 FROM kortyx_runtime_pending_requests p WHERE p.scope = r.scope AND p.run_id = r.id)\n ORDER BY r.last_activity LIMIT ${batch}\n ) RETURNING id`;\n deleted.runs = runs.length;\n return {\n skipped: false,\n hasMore: Object.values(deleted).some((count) => count === batch),\n deleted,\n };\n }),\n )) as PruneRuntimeResult;\n },\n };\n}\n","import type postgres from \"postgres\";\nimport type {\n PendingRequestRecord,\n PendingRequestStore,\n} from \"../pending-requests\";\nimport { clone, type PostgresRuntimeStore, positiveInteger } from \"./store\";\n\nexport async function savePendingRequest(\n store: PostgresRuntimeStore,\n sql: postgres.TransactionSql,\n record: PendingRequestRecord,\n): Promise<void> {\n positiveInteger(\"interrupt ttlMs\", record.ttlMs);\n const expiresAt = record.createdAt + record.ttlMs;\n if (\n !Number.isSafeInteger(record.createdAt) ||\n record.createdAt < 0 ||\n !Number.isSafeInteger(expiresAt)\n )\n throw new TypeError(\"Interrupt timestamps must be safe integers.\");\n if (expiresAt <= Date.now()) {\n await store.query(\n sql`DELETE FROM kortyx_runtime_pending_requests WHERE scope = ${store.scope} AND token = ${record.token}`,\n );\n return;\n }\n if (record.sessionId) await store.touchSession(sql, record.sessionId);\n await store.touchRun(sql, record.runId);\n await store.query(sql`INSERT INTO kortyx_runtime_pending_requests (scope, token, run_id, session_id, expires_at, record)\n VALUES (${store.scope}, ${record.token}, ${record.runId}, ${record.sessionId ?? null}, ${expiresAt},\n ${sql.json(clone(record) as unknown as postgres.JSONValue)})\n ON CONFLICT (scope, token) DO UPDATE SET run_id = EXCLUDED.run_id, session_id = EXCLUDED.session_id,\n expires_at = EXCLUDED.expires_at, record = EXCLUDED.record`);\n}\n\nexport function createPostgresPendingRequestStore(\n store: PostgresRuntimeStore,\n): PendingRequestStore {\n return {\n async list() {\n const rows =\n await store.query(store.sql`SELECT record FROM kortyx_runtime_pending_requests\n WHERE scope = ${store.scope} AND expires_at > ${Date.now()} ORDER BY token`);\n return rows.map((row) => row.record as PendingRequestRecord);\n },\n async get(token) {\n const rows =\n await store.query(store.sql`SELECT record FROM kortyx_runtime_pending_requests\n WHERE scope = ${store.scope} AND token = ${token} AND expires_at > ${Date.now()}`);\n return rows[0] ? (rows[0].record as PendingRequestRecord) : null;\n },\n async take(token) {\n return store.transaction(async (sql) => {\n const rows = await sql`DELETE FROM kortyx_runtime_pending_requests\n WHERE scope = ${store.scope} AND token = ${token} RETURNING record, expires_at`;\n return rows[0] && Number(rows[0].expires_at) > Date.now()\n ? (rows[0].record as PendingRequestRecord)\n : null;\n });\n },\n async save(record) {\n await store.transaction((sql) => savePendingRequest(store, sql, record));\n },\n async delete(token) {\n await store.transaction(async (sql) => {\n await sql`DELETE FROM kortyx_runtime_pending_requests WHERE scope = ${store.scope} AND token = ${token}`;\n });\n },\n async update(token, patch) {\n await store.transaction(async (sql) => {\n // Match the session -> run -> pending lock order used by save/rollback.\n const found =\n await sql`SELECT run_id, session_id FROM kortyx_runtime_pending_requests\n WHERE scope = ${store.scope} AND token = ${token}`;\n if (!found[0]) return;\n if (found[0].session_id)\n await store.touchSession(sql, found[0].session_id);\n await store.touchRun(sql, found[0].run_id);\n const rows =\n await sql`SELECT record FROM kortyx_runtime_pending_requests\n WHERE scope = ${store.scope} AND token = ${token} AND expires_at > ${Date.now()} FOR UPDATE`;\n if (!rows[0]) return;\n const previous = rows[0].record as PendingRequestRecord;\n await savePendingRequest(store, sql, {\n ...previous,\n ...patch,\n token: previous.token,\n runId: previous.runId,\n sessionId: previous.sessionId,\n createdAt: previous.createdAt,\n ttlMs: previous.ttlMs,\n });\n });\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { KortyxError, PersistenceError } from \"@kortyx/core/errors\";\nimport type postgres from \"postgres\";\nimport { captureGraphSnapshot } from \"../graph-snapshot\";\nimport type { PendingRequestRecord } from \"../pending-requests\";\nimport type {\n CheckpointSummary,\n SessionCheckpointRecord,\n SessionCheckpointStore,\n} from \"../session-checkpoints\";\nimport type { PostgresCheckpointSaver } from \"./checkpointer\";\nimport { savePendingRequest } from \"./pending-request-store\";\nimport { clone, type PostgresRuntimeStore, type RuntimeSql } from \"./store\";\n\nconst unique = (values: Array<string | undefined>): string[] => [\n ...new Set(values.filter((value): value is string => Boolean(value))),\n];\nconst notFound = (id: string) =>\n new KortyxError(\n \"NOT_FOUND\",\n `Checkpoint \"${id}\" was not found or has expired.`,\n {\n category: \"request\",\n retryable: false,\n safeMessage: \"The requested checkpoint was not found or has expired.\",\n },\n );\nconst assertInterruptsLive = (requests: PendingRequestRecord[]): void => {\n if (\n requests.some((request) => request.createdAt + request.ttlMs <= Date.now())\n )\n throw new KortyxError(\n \"INTERRUPT_EXPIRED\",\n \"The checkpoint contains an expired interrupt.\",\n {\n category: \"request\",\n retryable: false,\n safeMessage: \"This checkpoint's approval or input request has expired.\",\n },\n );\n};\n\nexport function createPostgresSessionCheckpointStore(\n store: PostgresRuntimeStore,\n saver: PostgresCheckpointSaver,\n): SessionCheckpointStore {\n const visible = (sql: RuntimeSql, now: number) => sql`c.scope = ${store.scope}\n AND ${store.liveSession(sql, now)} AND ${store.liveCheckpoint(sql, now)}`;\n const read = async (\n row:\n | { id: string; active: boolean; record?: SessionCheckpointRecord }\n | undefined,\n ) => {\n if (!row) return null;\n const record = store.cacheEnabled\n ? await store.payload([\"session\", row.id], async () => {\n const records =\n await store.query(store.sql`SELECT record FROM kortyx_runtime_session_checkpoints\n WHERE scope = ${store.scope} AND id = ${row.id}`);\n return records[0]\n ? (records[0].record as SessionCheckpointRecord)\n : null;\n })\n : row.record;\n return record\n ? {\n ...record,\n branchStatus: row.active\n ? (\"active\" as const)\n : (\"abandoned\" as const),\n }\n : null;\n };\n const get = async (id: string): Promise<SessionCheckpointRecord | null> => {\n const { sql } = store;\n const rows =\n await store.query(sql`SELECT c.id, c.active ${store.cacheEnabled ? sql`` : sql`, c.record`} FROM kortyx_runtime_session_checkpoints c\n JOIN kortyx_runtime_sessions s ON s.scope = c.scope AND s.id = c.session_id\n WHERE c.id = ${id} AND ${visible(sql, Date.now())}`);\n return read(\n rows[0] as\n | { id: string; active: boolean; record?: SessionCheckpointRecord }\n | undefined,\n );\n };\n\n const sealRequests = async (\n requests: PendingRequestRecord[],\n ): Promise<PendingRequestRecord[]> => {\n return Promise.all(\n requests.map(async (request) => {\n if (request.graphSnapshot) return clone(request);\n const graphSnapshot = await captureGraphSnapshot(\n saver,\n request.runId,\n request.graphCheckpointId,\n );\n if (!graphSnapshot)\n throw new KortyxError(\n \"CHECKPOINT_INCOMPLETE\",\n \"A paused checkpoint needs a complete execution snapshot.\",\n {\n category: \"persistence\",\n retryable: false,\n safeMessage:\n \"The paused execution could not be saved completely.\",\n },\n );\n return { ...clone(request), graphSnapshot };\n }),\n );\n };\n\n const insert = async (\n sql: postgres.TransactionSql,\n record: SessionCheckpointRecord,\n ): Promise<void> => {\n await store.query(sql`INSERT INTO kortyx_runtime_session_checkpoints (scope, id, session_id, run_id, created_at, turn_index, record)\n VALUES (${store.scope}, ${record.id}, ${record.sessionId}, ${record.runId}, ${record.createdAt}, ${record.turnIndex},\n ${sql.json(clone(record) as unknown as postgres.JSONValue)})`);\n await store.query(sql`UPDATE kortyx_runtime_sessions SET head_id = ${record.id}, next_turn = ${record.turnIndex + 1}\n WHERE scope = ${store.scope} AND id = ${record.sessionId}`);\n };\n\n return {\n managesPendingRequests: true,\n get,\n async list(sessionId) {\n const { sql } = store;\n const rows =\n await store.query(sql`SELECT c.record, c.active FROM kortyx_runtime_session_checkpoints c\n JOIN kortyx_runtime_sessions s ON s.scope = c.scope AND s.id = c.session_id\n WHERE c.session_id = ${sessionId} AND ${visible(sql, Date.now())} ORDER BY c.turn_index`);\n return rows.map((row) => {\n const {\n state: _state,\n effects: _effects,\n activePendingRequests: _pending,\n runId: _runId,\n graphCheckpointId: _graphId,\n ...summary\n } = row.record as SessionCheckpointRecord;\n return {\n ...summary,\n branchStatus: row.active ? \"active\" : \"abandoned\",\n } as CheckpointSummary;\n });\n },\n async getHead(sessionId) {\n const { sql } = store;\n const rows =\n await store.query(sql`SELECT c.id, c.active ${store.cacheEnabled ? sql`` : sql`, c.record`}\n FROM kortyx_runtime_sessions s JOIN kortyx_runtime_session_checkpoints c\n ON c.scope = s.scope AND c.id = s.head_id\n WHERE s.id = ${sessionId} AND ${visible(sql, Date.now())}`);\n return read(\n rows[0] as\n | { id: string; active: boolean; record?: SessionCheckpointRecord }\n | undefined,\n );\n },\n async append(args) {\n const requests = await sealRequests(args.pendingRequests ?? []);\n return store.transaction(async (sql) => {\n await store.touchSession(sql, args.sessionId);\n const sessions =\n await sql`SELECT head_id, next_turn FROM kortyx_runtime_sessions\n WHERE scope = ${store.scope} AND id = ${args.sessionId} FOR UPDATE`;\n const session = sessions[0];\n if (!session)\n throw new PersistenceError(\n \"The session disappeared during checkpoint append.\",\n );\n const record: SessionCheckpointRecord = {\n id: `cp-${randomUUID()}`,\n sessionId: args.sessionId,\n runId: args.runId,\n turnIndex: Number(session.next_turn),\n createdAt: Date.now(),\n workflow: args.workflow,\n state: clone(args.state),\n nodes: unique(args.nodes ?? []),\n effects: {\n structuredStreamIds: unique(args.structuredStreamIds ?? []),\n interruptTokens: unique(requests.map((request) => request.token)),\n },\n activePendingRequests: requests,\n ...(session.head_id ? { parentCheckpointId: session.head_id } : {}),\n ...(args.graphCheckpointId\n ? { graphCheckpointId: args.graphCheckpointId }\n : {}),\n ...(args.label ? { label: args.label } : {}),\n ...(args.workflowVersion\n ? { workflowVersion: args.workflowVersion }\n : {}),\n ...(args.buildId ? { buildId: args.buildId } : {}),\n };\n await insert(sql, record);\n return record;\n });\n },\n async rollbackTo(id, options) {\n return store.transaction(async (sql) => {\n const targets =\n await sql`SELECT c.record FROM kortyx_runtime_session_checkpoints c\n JOIN kortyx_runtime_sessions s ON s.scope = c.scope AND s.id = c.session_id\n WHERE c.id = ${id} AND ${visible(sql, Date.now())} FOR UPDATE OF s`;\n if (!targets[0]) throw notFound(id);\n const target = targets[0].record as SessionCheckpointRecord;\n assertInterruptsLive(target.activePendingRequests);\n const liveRuns = await sql`SELECT id FROM kortyx_runtime_runs\n WHERE scope = ${store.scope} AND session_id = ${target.sessionId} AND lease_until > ${Date.now()}`;\n if (liveRuns.length)\n throw new KortyxError(\n \"SESSION_BUSY\",\n \"Cannot roll back a session while execution is active.\",\n { category: \"request\", retryable: true },\n );\n const ancestry = await sql`WITH RECURSIVE ancestors(id) AS (\n SELECT ${id}::text UNION\n SELECT c.record->>'parentCheckpointId' FROM kortyx_runtime_session_checkpoints c\n JOIN ancestors a ON a.id = c.id WHERE c.scope = ${store.scope} AND c.record ? 'parentCheckpointId'\n ) SELECT id FROM ancestors`;\n const ancestorIds = ancestry.map((row) => row.id as string);\n const trailing =\n await sql`SELECT record FROM kortyx_runtime_session_checkpoints\n WHERE scope = ${store.scope} AND session_id = ${target.sessionId} AND active AND id NOT IN ${sql(ancestorIds)}`;\n const records = trailing.map(\n (row) => row.record as SessionCheckpointRecord,\n );\n const streams = unique(\n records.flatMap((record) => record.effects.structuredStreamIds),\n );\n const tokens = unique(\n records.flatMap((record) => [\n ...record.effects.interruptTokens,\n ...record.activePendingRequests.map((request) => request.token),\n ]),\n );\n await sql`UPDATE kortyx_runtime_session_checkpoints SET active = (id IN ${sql(ancestorIds)})\n WHERE scope = ${store.scope} AND session_id = ${target.sessionId}`;\n await store.touchSession(sql, target.sessionId);\n await sql`UPDATE kortyx_runtime_sessions SET head_id = ${id} WHERE scope = ${store.scope} AND id = ${target.sessionId}`;\n if (tokens.length)\n await sql`DELETE FROM kortyx_runtime_pending_requests WHERE scope = ${store.scope} AND token IN ${sql(tokens)}`;\n const requests = clone(target.activePendingRequests);\n options?.preparePendingRequests?.(requests);\n for (const request of requests)\n await savePendingRequest(store, sql, request);\n return {\n sessionId: target.sessionId,\n head: id,\n invalidatedStructuredStreamIds: streams,\n invalidatedInterruptTokens: tokens,\n activePendingRequests: requests,\n };\n });\n },\n async fork(id, options) {\n const source = await get(id);\n if (!source) throw notFound(id);\n assertInterruptsLive(source.activePendingRequests);\n const sessionId = options?.newSessionId || `session-${randomUUID()}`;\n const runId = source.activePendingRequests.length\n ? `run-${randomUUID()}`\n : source.runId;\n const {\n parentCheckpointId: _parent,\n branchStatus: _branch,\n ...sourceRecord\n } = source;\n const checkpoint: SessionCheckpointRecord = {\n ...clone(sourceRecord),\n id: `cp-${randomUUID()}`,\n sessionId,\n runId,\n createdAt: Date.now(),\n parentSessionId: source.sessionId,\n forkedFrom: source.id,\n activePendingRequests: source.activePendingRequests.map((request) => ({\n ...clone(request),\n runId,\n sessionId,\n token: randomUUID(),\n requestId: `human-${randomUUID()}`,\n })),\n };\n checkpoint.effects.interruptTokens = checkpoint.activePendingRequests.map(\n (request) => request.token,\n );\n options?.preparePendingRequests?.(checkpoint.activePendingRequests);\n // Resume restores this fork's complete snapshot into its own run. No parent storage is required.\n await store.transaction(async (sql) => {\n const existing =\n await sql`SELECT id FROM kortyx_runtime_sessions WHERE scope = ${store.scope} AND id = ${sessionId}`;\n if (existing.length)\n throw new KortyxError(\n \"SESSION_EXISTS\",\n \"The fork session already exists.\",\n { category: \"request\", retryable: false },\n );\n // INSERT, rather than UPSERT, also rejects concurrent attempts to fork to the same session.\n await sql`INSERT INTO kortyx_runtime_sessions (scope, id, last_activity) VALUES (${store.scope}, ${sessionId}, ${Date.now()})`;\n await insert(sql, checkpoint);\n for (const request of checkpoint.activePendingRequests)\n await savePendingRequest(store, sql, request);\n });\n return {\n sessionId,\n parentSessionId: source.sessionId,\n forkedFrom: source.id,\n checkpoint,\n };\n },\n };\n}\n","import type {\n BaseCheckpointSaver,\n CheckpointTuple,\n} from \"@langchain/langgraph-checkpoint\";\n\n/** A self-contained, JSON snapshot, including pending writes needed for replay. */\nexport type GraphSnapshotBundle = CheckpointTuple;\n\nexport async function captureGraphSnapshot(\n saver: BaseCheckpointSaver,\n threadId: string,\n checkpointId?: string,\n): Promise<GraphSnapshotBundle | undefined> {\n const tuple = await saver.getTuple({\n configurable: {\n thread_id: threadId,\n checkpoint_ns: \"\",\n ...(checkpointId ? { checkpoint_id: checkpointId } : {}),\n },\n });\n // Functions/services in GraphState.config are intentionally not persisted.\n return tuple\n ? (JSON.parse(JSON.stringify(tuple)) as GraphSnapshotBundle)\n : undefined;\n}\n\nexport async function restoreGraphSnapshot(\n saver: BaseCheckpointSaver,\n snapshot: GraphSnapshotBundle,\n threadId: string,\n): Promise<void> {\n const copy = JSON.parse(JSON.stringify(snapshot)) as GraphSnapshotBundle;\n const config = await saver.put(\n { configurable: { thread_id: threadId, checkpoint_ns: \"\" } },\n copy.checkpoint,\n copy.metadata!,\n copy.checkpoint.channel_versions,\n );\n const reset = saver as BaseCheckpointSaver & {\n deleteCheckpointWrites?: (\n threadId: string,\n ns: string,\n id: string,\n ) => Promise<void>;\n };\n if (reset.deleteCheckpointWrites)\n await reset.deleteCheckpointWrites(threadId, \"\", copy.checkpoint.id);\n const writes = new Map<string, Array<[string, unknown]>>();\n for (const [task, channel, value] of copy.pendingWrites ?? []) {\n const group = writes.get(task) ?? [];\n group.push([channel, value]);\n writes.set(task, group);\n }\n for (const [task, group] of writes)\n await saver.putWrites(config, group, task);\n}\n","import type {\n PendingRequestRecord,\n PendingRequestStore,\n} from \"../pending-requests\";\nimport type { RedisFrameworkStore } from \"./redis-store\";\n\nexport type RedisPendingRequestStoreOptions = {\n store: RedisFrameworkStore;\n prefix?: string;\n};\n\nexport function createRedisPendingRequestStore(\n options: RedisPendingRequestStoreOptions,\n): PendingRequestStore {\n const prefix = options.prefix ?? \"kortyx:pending:\";\n const key = (token: string) => `${prefix}${token}`;\n\n return {\n ...(options.store.list\n ? {\n list: async () =>\n (await options.store.list!(prefix)).map(\n (raw) => JSON.parse(raw) as PendingRequestRecord,\n ),\n }\n : {}),\n ...(options.store.take\n ? {\n take: async (token: string): Promise<PendingRequestRecord | null> => {\n const raw = await options.store.take!(key(token));\n return raw ? (JSON.parse(raw) as PendingRequestRecord) : null;\n },\n }\n : {}),\n async save(rec: PendingRequestRecord) {\n await options.store.set(key(rec.token), JSON.stringify(rec), rec.ttlMs);\n },\n async get(token: string) {\n const raw = await options.store.get(key(token));\n if (!raw) return null;\n return JSON.parse(raw) as PendingRequestRecord;\n },\n async delete(token: string) {\n await options.store.del(key(token));\n },\n async update(token: string, patch: Partial<PendingRequestRecord>) {\n const prevRaw = await options.store.get(key(token));\n if (!prevRaw) return;\n const prev = JSON.parse(prevRaw) as PendingRequestRecord;\n const next = { ...prev, ...patch } as PendingRequestRecord;\n const ttlLeft = Math.max(1, next.ttlMs - (Date.now() - next.createdAt));\n await options.store.set(key(token), JSON.stringify(next), ttlLeft);\n },\n };\n}\n","import { PersistenceError } from \"@kortyx/core/errors\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport {\n type BaseCheckpointSaver,\n type Checkpoint,\n type CheckpointListOptions,\n type CheckpointMetadata,\n type CheckpointTuple,\n copyCheckpoint,\n getCheckpointId,\n type PendingWrite,\n WRITES_IDX_MAP,\n} from \"@langchain/langgraph-checkpoint\";\nimport type { RedisFrameworkStore } from \"./redis-store\";\n\ntype SerializerProtocol = {\n dumpsTyped: (data: any) => Promise<[string, Uint8Array]>;\n loadsTyped: (type: string, data: Uint8Array | string) => Promise<any>;\n};\n\ntype RedisCheckpointSaverOptions = {\n store: RedisFrameworkStore;\n prefix?: string;\n ttlMs: number;\n};\n\nconst utf8Bytes = (s: string) => new Uint8Array(Buffer.from(s, \"utf8\"));\nconst utf8String = (u8: Uint8Array | string) =>\n typeof u8 === \"string\" ? u8 : Buffer.from(u8).toString(\"utf8\");\n\nconst jsonSerde: SerializerProtocol = {\n async dumpsTyped(data: any) {\n return [\"json\", utf8Bytes(JSON.stringify(data))];\n },\n async loadsTyped(_type: string, data: Uint8Array | string) {\n return JSON.parse(utf8String(data));\n },\n};\n\nconst b64FromBytes = (u8: Uint8Array) => Buffer.from(u8).toString(\"base64\");\nconst bytesFromB64 = (s: string) => new Uint8Array(Buffer.from(s, \"base64\"));\n\ntype StoredCheckpoint = {\n checkpoint: string; // base64\n metadata: string; // base64\n parentCheckpointId?: string | undefined;\n};\n\ntype StoredWrite = {\n taskId: string;\n channel: string;\n value: string; // base64\n};\n\nexport type RedisCheckpointSaver = BaseCheckpointSaver & {\n deleteThread: (threadId: string) => Promise<void>;\n deleteCheckpointWrites: (\n threadId: string,\n checkpointNs: string,\n checkpointId: string,\n ) => Promise<void>;\n getLatestCheckpointId: (\n threadId: string,\n checkpointNs?: string,\n ) => Promise<string | undefined>;\n};\n\nexport function createRedisCheckpointSaver(\n options: RedisCheckpointSaverOptions,\n): RedisCheckpointSaver {\n const store = options.store;\n const ttlMs = options.ttlMs;\n const prefix = options.prefix ?? \"kortyx:cp:\";\n\n const latestKey = (threadId: string, checkpointNs: string) =>\n `${prefix}latest:${threadId}:${checkpointNs}`;\n const checkpointKey = (\n threadId: string,\n checkpointNs: string,\n checkpointId: string,\n ) => `${prefix}chk:${threadId}:${checkpointNs}:${checkpointId}`;\n const writesKey = (\n threadId: string,\n checkpointNs: string,\n checkpointId: string,\n ) => `${prefix}wr:${threadId}:${checkpointNs}:${checkpointId}`;\n\n const serde = jsonSerde;\n\n const saver: any = {\n serde,\n\n async get(config: RunnableConfig) {\n const value = await saver.getTuple(config);\n return value ? value.checkpoint : undefined;\n },\n\n getNextVersion(current: number | string | undefined) {\n if (typeof current === \"string\") {\n throw new PersistenceError(\n \"Please override this method to use string versions.\",\n );\n }\n return current !== undefined && typeof current === \"number\"\n ? current + 1\n : 1;\n },\n\n async getTuple(\n config: RunnableConfig,\n ): Promise<CheckpointTuple | undefined> {\n const threadId = config.configurable?.thread_id as string | undefined;\n const checkpointNs =\n (config.configurable?.checkpoint_ns as string | undefined) ?? \"\";\n if (!threadId) return undefined;\n\n const requested = getCheckpointId(config);\n const checkpointId =\n requested || (await store.get(latestKey(threadId, checkpointNs))) || \"\";\n if (!checkpointId) return undefined;\n\n const raw = await store.get(\n checkpointKey(threadId, checkpointNs, checkpointId),\n );\n if (!raw) return undefined;\n const parsed = JSON.parse(raw) as StoredCheckpoint;\n\n const checkpoint = (await serde.loadsTyped(\n \"json\",\n bytesFromB64(parsed.checkpoint),\n )) as Checkpoint;\n const metadata = (await serde.loadsTyped(\n \"json\",\n bytesFromB64(parsed.metadata),\n )) as CheckpointMetadata;\n\n const writes = await store.hgetall(\n writesKey(threadId, checkpointNs, checkpointId),\n );\n const pendingWrites = await Promise.all(\n Object.values(writes).map(async (v) => {\n const w = JSON.parse(v) as StoredWrite;\n return [\n w.taskId,\n w.channel,\n await serde.loadsTyped(\"json\", bytesFromB64(w.value)),\n ] as any;\n }),\n );\n\n const tuple: CheckpointTuple = {\n config: {\n configurable: {\n thread_id: threadId,\n checkpoint_ns: checkpointNs,\n checkpoint_id: checkpointId,\n },\n },\n checkpoint,\n metadata,\n pendingWrites,\n };\n\n if (parsed.parentCheckpointId) {\n tuple.parentConfig = {\n configurable: {\n thread_id: threadId,\n checkpoint_ns: checkpointNs,\n checkpoint_id: parsed.parentCheckpointId,\n },\n };\n }\n\n return tuple;\n },\n\n async *list(_config: RunnableConfig, _options?: CheckpointListOptions) {\n // Minimal implementation: list is not needed for core runtime behavior today.\n // If needed later (studio/time-travel), implement scanning by prefix.\n },\n\n async put(\n config: RunnableConfig,\n checkpoint: Checkpoint,\n metadata: CheckpointMetadata,\n _newVersions: Record<string, number | string>,\n ): Promise<RunnableConfig> {\n const threadId = config.configurable?.thread_id as string | undefined;\n const checkpointNs =\n (config.configurable?.checkpoint_ns as string | undefined) ?? \"\";\n if (!threadId) {\n throw new PersistenceError(\n 'Failed to put checkpoint: missing \"thread_id\" in config.configurable.',\n );\n }\n\n const prepared = copyCheckpoint(checkpoint as any);\n const [[, chkBytes], [, metaBytes]] = await Promise.all([\n serde.dumpsTyped(prepared),\n serde.dumpsTyped(metadata),\n ]);\n\n const checkpointId = checkpoint.id;\n const key = checkpointKey(threadId, checkpointNs, checkpointId);\n const stored: StoredCheckpoint = {\n checkpoint: b64FromBytes(chkBytes),\n metadata: b64FromBytes(metaBytes),\n parentCheckpointId: config.configurable?.checkpoint_id as\n | string\n | undefined,\n };\n\n await store.set(key, JSON.stringify(stored), ttlMs);\n await store.set(latestKey(threadId, checkpointNs), checkpointId, ttlMs);\n\n return {\n configurable: {\n thread_id: threadId,\n checkpoint_ns: checkpointNs,\n checkpoint_id: checkpointId,\n },\n };\n },\n\n async putWrites(\n config: RunnableConfig,\n writes: PendingWrite[],\n taskId: string,\n ): Promise<void> {\n const threadId = config.configurable?.thread_id as string | undefined;\n const checkpointNs = config.configurable?.checkpoint_ns as\n | string\n | undefined;\n const checkpointId = config.configurable?.checkpoint_id as\n | string\n | undefined;\n if (!threadId) {\n throw new PersistenceError(\n 'Failed to put writes: missing \"thread_id\" in config.configurable.',\n );\n }\n if (!checkpointId) {\n throw new PersistenceError(\n 'Failed to put writes: missing \"checkpoint_id\" in config.configurable.',\n );\n }\n\n const outer = writesKey(threadId, checkpointNs ?? \"\", checkpointId);\n await store.expire(outer, ttlMs);\n\n await Promise.all(\n writes.map(async ([channel, value], idx) => {\n const [, vBytes] = await serde.dumpsTyped(value as any);\n const mappedIdx = WRITES_IDX_MAP[channel] ?? idx;\n const innerKeyStr = `${taskId},${mappedIdx}`;\n const payload: StoredWrite = {\n taskId,\n channel,\n value: b64FromBytes(vBytes),\n };\n const serialized = JSON.stringify(payload);\n if (mappedIdx >= 0) {\n await store.hsetnx(outer, innerKeyStr, serialized);\n } else {\n await store.hset(outer, innerKeyStr, serialized);\n }\n }),\n );\n },\n\n async deleteThread(threadId: string): Promise<void> {\n const chkKeys = await store.scanKeys(`${prefix}chk:${threadId}:`);\n const wrKeys = await store.scanKeys(`${prefix}wr:${threadId}:`);\n const latestKeys = await store.scanKeys(`${prefix}latest:${threadId}:`);\n await store.delRaw([...chkKeys, ...wrKeys, ...latestKeys]);\n },\n\n async deleteCheckpointWrites(\n threadId: string,\n checkpointNs: string,\n checkpointId: string,\n ): Promise<void> {\n await store.del(writesKey(threadId, checkpointNs, checkpointId));\n },\n\n async getLatestCheckpointId(\n threadId: string,\n checkpointNs = \"\",\n ): Promise<string | undefined> {\n return (await store.get(latestKey(threadId, checkpointNs))) ?? undefined;\n },\n };\n\n return saver as RedisCheckpointSaver;\n}\n","import { PersistenceError } from \"@kortyx/core/errors\";\nimport { createRedisClient, type RedisClient } from \"./redis-client\";\n\nexport type RedisFrameworkStoreOptions = {\n url: string;\n prefix?: string;\n};\n\nexport type FrameworkTtl = {\n ttlMs: number;\n};\n\nexport type RedisFrameworkStore = {\n close?: () => Promise<void>;\n list?: (prefix: string) => Promise<string[]>;\n take?: (key: string) => Promise<string | null>;\n get: (key: string) => Promise<string | null>;\n set: (key: string, value: string, ttlMs: number) => Promise<void>;\n del: (key: string) => Promise<void>;\n hset: (key: string, field: string, value: string) => Promise<void>;\n hsetnx: (key: string, field: string, value: string) => Promise<number>;\n hgetall: (key: string) => Promise<Record<string, string>>;\n expire: (key: string, ttlMs: number) => Promise<void>;\n scanKeys: (prefix: string) => Promise<string[]>;\n delRaw: (keys: string[]) => Promise<void>;\n};\n\ntype RedisErrorReply = { type: \"error\"; message: string };\nconst isRedisError = (r: unknown): r is RedisErrorReply =>\n Boolean(r) && typeof r === \"object\" && (r as any).type === \"error\";\n\nexport function createRedisFrameworkStore(\n options: RedisFrameworkStoreOptions,\n): RedisFrameworkStore {\n const rawClient = createRedisClient({ url: options.url });\n const client: RedisClient = {\n ...rawClient,\n command: async (...args) => {\n try {\n return await rawClient.command(...args);\n } catch (cause) {\n throw new PersistenceError(\"Redis command failed.\", cause);\n }\n },\n };\n const prefix = options.prefix ?? \"kortyx:fw:\";\n\n const k = (key: string) => `${prefix}${key}`;\n\n return {\n close: async () => rawClient.close?.(),\n async list(prefixKey) {\n const keys: string[] = await this.scanKeys(prefixKey);\n const values = await Promise.all(\n [...new Set(keys)].map(async (key) => {\n const value = await client.command(\"GET\", [key]);\n if (isRedisError(value))\n throw new PersistenceError(`Redis GET error: ${value.message}`);\n return value;\n }),\n );\n return values.filter(\n (value): value is string => typeof value === \"string\",\n );\n },\n async take(key: string): Promise<string | null> {\n const r = await client.command(\"GETDEL\", [k(key)]);\n if (isRedisError(r))\n throw new PersistenceError(`Redis GETDEL error: ${r.message}`);\n return typeof r === \"string\" ? r : null;\n },\n async get(key: string): Promise<string | null> {\n const r = await client.command(\"GET\", [k(key)]);\n if (r === null) return null;\n if (typeof r === \"string\") return r;\n if (isRedisError(r)) {\n throw new PersistenceError(`Redis GET error: ${r.message}`);\n }\n return null;\n },\n\n async set(key: string, value: string, ttlMs: number): Promise<void> {\n const args = [k(key), value, \"PX\", String(Math.max(1, ttlMs))];\n const r = await client.command(\"SET\", args);\n if (isRedisError(r)) {\n throw new PersistenceError(`Redis SET error: ${r.message}`);\n }\n },\n\n async del(key: string): Promise<void> {\n const r = await client.command(\"DEL\", [k(key)]);\n if (isRedisError(r)) {\n throw new PersistenceError(`Redis DEL error: ${r.message}`);\n }\n },\n\n async hset(key: string, field: string, value: string): Promise<void> {\n const r = await client.command(\"HSET\", [k(key), field, value]);\n if (isRedisError(r)) {\n throw new PersistenceError(`Redis HSET error: ${r.message}`);\n }\n },\n\n async hsetnx(key: string, field: string, value: string): Promise<number> {\n const r = await client.command(\"HSETNX\", [k(key), field, value]);\n if (isRedisError(r)) {\n throw new PersistenceError(`Redis HSETNX error: ${r.message}`);\n }\n return typeof r === \"number\" ? r : 0;\n },\n\n async hgetall(key: string): Promise<Record<string, string>> {\n const r = await client.command(\"HGETALL\", [k(key)]);\n if (isRedisError(r)) {\n throw new PersistenceError(`Redis HGETALL error: ${r.message}`);\n }\n if (!Array.isArray(r)) return {};\n const out: Record<string, string> = {};\n for (let i = 0; i < r.length; i += 2) {\n const kk = r[i];\n const v = r[i + 1];\n if (typeof kk === \"string\" && typeof v === \"string\") out[kk] = v;\n }\n return out;\n },\n\n async expire(key: string, ttlMs: number): Promise<void> {\n const r = await client.command(\"PEXPIRE\", [\n k(key),\n String(Math.max(1, ttlMs)),\n ]);\n if (isRedisError(r)) {\n throw new PersistenceError(`Redis PEXPIRE error: ${r.message}`);\n }\n },\n\n async scanKeys(prefixKey: string): Promise<string[]> {\n const fullPrefix = k(prefixKey);\n let cursor = \"0\";\n const keys: string[] = [];\n do {\n const r = await client.command(\"SCAN\", [\n cursor,\n \"MATCH\",\n `${fullPrefix}*`,\n \"COUNT\",\n \"200\",\n ]);\n if (isRedisError(r))\n throw new PersistenceError(`Redis SCAN error: ${r.message}`);\n if (!Array.isArray(r) || r.length < 2) break;\n cursor = typeof r[0] === \"string\" ? r[0] : \"0\";\n const batch = r[1];\n if (Array.isArray(batch)) {\n for (const key of batch) {\n if (typeof key === \"string\") keys.push(key);\n }\n }\n } while (cursor !== \"0\");\n return keys;\n },\n\n async delRaw(keys: string[]): Promise<void> {\n if (keys.length === 0) return;\n const r = await client.command(\"DEL\", keys);\n if (isRedisError(r)) {\n throw new PersistenceError(`Redis DEL error: ${r.message}`);\n }\n },\n };\n}\n","import { connect as netConnect, type Socket } from \"node:net\";\nimport { type TLSSocket, connect as tlsConnect } from \"node:tls\";\nimport { PersistenceError } from \"@kortyx/core/errors\";\n\nexport type RedisReply =\n | string\n | number\n | null\n | RedisReply[]\n | { type: \"error\"; message: string };\n\nexport type RedisClientOptions = {\n url: string;\n connectTimeoutMs?: number;\n};\n\nconst encodeBulk = (s: string) => {\n const b = Buffer.from(s, \"utf8\");\n return Buffer.concat([\n Buffer.from(`$${b.length}\\r\\n`),\n b,\n Buffer.from(\"\\r\\n\"),\n ]);\n};\n\nconst encodeCommand = (cmd: string, args: string[]) => {\n const parts = [cmd, ...args];\n const bufs: Buffer[] = [Buffer.from(`*${parts.length}\\r\\n`)];\n for (const p of parts) bufs.push(encodeBulk(p));\n return Buffer.concat(bufs);\n};\n\nfunction readLine(buf: Buffer, start: number) {\n const idx = buf.indexOf(\"\\r\\n\", start);\n if (idx === -1) return null;\n return { line: buf.subarray(start, idx).toString(\"utf8\"), next: idx + 2 };\n}\n\nfunction parseReply(\n buf: Buffer,\n start: number,\n): { value: RedisReply; next: number } | null {\n if (start >= buf.length) return null;\n const byte = buf[start];\n if (byte === undefined) return null;\n const prefix = String.fromCharCode(byte);\n if (prefix === \"+\" || prefix === \"-\" || prefix === \":\") {\n const line = readLine(buf, start + 1);\n if (!line) return null;\n if (prefix === \"+\") return { value: line.line, next: line.next };\n if (prefix === \":\")\n return { value: Number.parseInt(line.line, 10), next: line.next };\n return { value: { type: \"error\", message: line.line }, next: line.next };\n }\n\n if (prefix === \"$\") {\n const line = readLine(buf, start + 1);\n if (!line) return null;\n const len = Number.parseInt(line.line, 10);\n if (len === -1) return { value: null, next: line.next };\n const end = line.next + len;\n if (end + 2 > buf.length) return null;\n const data = buf.subarray(line.next, end).toString(\"utf8\");\n return { value: data, next: end + 2 };\n }\n\n if (prefix === \"*\") {\n const line = readLine(buf, start + 1);\n if (!line) return null;\n const count = Number.parseInt(line.line, 10);\n if (count === -1) return { value: null, next: line.next };\n const items: RedisReply[] = [];\n let cursor = line.next;\n for (let i = 0; i < count; i++) {\n const parsed = parseReply(buf, cursor);\n if (!parsed) return null;\n items.push(parsed.value);\n cursor = parsed.next;\n }\n return { value: items, next: cursor };\n }\n\n return {\n value: { type: \"error\", message: `Unknown RESP prefix: ${prefix}` },\n next: buf.length,\n };\n}\n\nexport type RedisClient = {\n close?: () => Promise<void>;\n command: (cmd: string, args?: string[]) => Promise<RedisReply>;\n};\n\nexport function createRedisClient(options: RedisClientOptions): RedisClient {\n const resolvedOptions: Required<\n Pick<RedisClientOptions, \"connectTimeoutMs\">\n > &\n Omit<RedisClientOptions, \"connectTimeoutMs\"> = {\n connectTimeoutMs: options.connectTimeoutMs ?? 5_000,\n url: options.url,\n };\n\n let socket: Socket | TLSSocket | null = null;\n let buffer = Buffer.alloc(0);\n const inflight: Array<{\n resolve: (v: RedisReply) => void;\n reject: (e: unknown) => void;\n }> = [];\n\n let connecting: Promise<void> | null = null;\n let ready = false;\n\n const drainReplies = () => {\n while (inflight.length) {\n const parsed = parseReply(buffer, 0);\n if (!parsed) return;\n const waiter = inflight.shift()!;\n buffer = buffer.subarray(parsed.next);\n waiter.resolve(parsed.value);\n }\n };\n\n const send = (cmd: string, args: string[] = []): Promise<RedisReply> => {\n if (!socket) return Promise.reject(new Error(\"Redis socket not available\"));\n const payload = encodeCommand(cmd, args);\n return new Promise<RedisReply>((resolve, reject) => {\n inflight.push({ resolve, reject });\n socket?.write(payload);\n });\n };\n\n const ensureConnected = async () => {\n if (ready) return;\n if (connecting) return connecting;\n\n connecting = (async () => {\n const u = new URL(resolvedOptions.url);\n const isTls = u.protocol === \"rediss:\";\n const host = u.hostname || \"127.0.0.1\";\n const port = u.port ? Number(u.port) : isTls ? 6380 : 6379;\n const password = u.password ? decodeURIComponent(u.password) : \"\";\n const db =\n u.pathname && u.pathname !== \"/\" ? Number(u.pathname.slice(1)) : 0;\n\n const s = isTls\n ? tlsConnect({ host, port, servername: host })\n : netConnect({ host, port });\n socket = s;\n\n s.setNoDelay(true);\n s.setKeepAlive(true);\n\n s.on(\"data\", (chunk) => {\n if (socket !== s) return;\n buffer = Buffer.concat([buffer, chunk]);\n drainReplies();\n });\n\n s.on(\"error\", (err) => {\n if (socket !== s) return;\n ready = false;\n while (inflight.length) inflight.shift()?.reject(err);\n });\n\n s.on(\"close\", () => {\n if (socket !== s) return;\n ready = false;\n socket = null;\n buffer = Buffer.alloc(0);\n while (inflight.length)\n inflight.shift()?.reject(new Error(\"Redis socket closed\"));\n });\n\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(\n () => reject(new Error(\"Redis connect timeout\")),\n resolvedOptions.connectTimeoutMs,\n );\n\n const onConnect = () => {\n clearTimeout(timer);\n resolve();\n };\n\n // net: \"connect\", tls: \"secureConnect\" (TLSSocket can also emit \"connect\")\n s.once(\"connect\", onConnect);\n (s as any).once?.(\"secureConnect\", onConnect);\n s.once(\"error\", (e) => {\n clearTimeout(timer);\n reject(e);\n });\n });\n\n if (password) {\n const r = await send(\"AUTH\", [password]);\n if (typeof r === \"object\" && r && (r as any).type === \"error\") {\n throw new PersistenceError(\n `Redis AUTH failed: ${(r as any).message}`,\n );\n }\n }\n\n if (db && Number.isFinite(db) && db > 0) {\n const r = await send(\"SELECT\", [String(db)]);\n if (typeof r === \"object\" && r && (r as any).type === \"error\") {\n throw new PersistenceError(\n `Redis SELECT failed: ${(r as any).message}`,\n );\n }\n }\n\n ready = true;\n })();\n\n try {\n await connecting;\n } finally {\n connecting = null;\n }\n };\n\n return {\n async close() {\n socket?.destroy();\n socket = null;\n buffer = Buffer.alloc(0);\n ready = false;\n while (inflight.length)\n inflight.shift()?.reject(new Error(\"Redis socket closed\"));\n },\n async command(cmd: string, args: string[] = []) {\n await ensureConnected();\n return send(cmd, args);\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { KortyxError } from \"@kortyx/core/errors\";\nimport type {\n AppendSessionCheckpointArgs,\n CheckpointId,\n CheckpointSummary,\n ForkSessionCheckpointResult,\n RollbackSessionCheckpointResult,\n SessionCheckpointRecord,\n SessionCheckpointStore,\n SessionCheckpointStoreOptions,\n} from \"../session-checkpoints\";\nimport type { RedisFrameworkStore } from \"./redis-store\";\n\nexport type RedisSessionCheckpointStoreOptions =\n SessionCheckpointStoreOptions & {\n store: RedisFrameworkStore;\n prefix?: string;\n ttlMs: number;\n };\n\nconst DEFAULT_MAX_CHECKPOINTS_PER_SESSION = 50;\n\nconst clone = <T>(value: T): T =>\n value === undefined ? value : (JSON.parse(JSON.stringify(value)) as T);\n\nconst uniqueStrings = (values: Iterable<string | undefined>): string[] =>\n Array.from(\n new Set(\n Array.from(values).filter(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0,\n ),\n ),\n );\n\nconst createId = (prefix: string): string => {\n return `${prefix}-${randomUUID()}`;\n};\nconst createResumeToken = (): string => randomUUID();\n\nconst toSummary = (record: SessionCheckpointRecord): CheckpointSummary => ({\n id: record.id,\n sessionId: record.sessionId,\n turnIndex: record.turnIndex,\n createdAt: record.createdAt,\n nodes: [...record.nodes],\n workflow: record.workflow,\n ...(record.label ? { label: record.label } : {}),\n ...(record.parentCheckpointId\n ? { parentCheckpointId: record.parentCheckpointId }\n : {}),\n ...(record.parentSessionId\n ? { parentSessionId: record.parentSessionId }\n : {}),\n ...(record.forkedFrom ? { forkedFrom: record.forkedFrom } : {}),\n ...(record.workflowVersion\n ? { workflowVersion: record.workflowVersion }\n : {}),\n ...(record.buildId ? { buildId: record.buildId } : {}),\n});\n\nexport function createRedisSessionCheckpointStore(\n options: RedisSessionCheckpointStoreOptions,\n): SessionCheckpointStore {\n const store = options.store;\n const ttlMs = options.ttlMs;\n const prefix = options.prefix ?? \"kortyx:session-cp:\";\n const maxCheckpointsPerSession =\n options.maxCheckpointsPerSession ?? DEFAULT_MAX_CHECKPOINTS_PER_SESSION;\n\n const byIdKey = (id: string) => `${prefix}by-id:${id}`;\n const sessionRecordKey = (sessionId: string, id: string) =>\n `${prefix}session:${sessionId}:${id}`;\n const sessionPrefix = (sessionId: string) => `${prefix}session:${sessionId}:`;\n const headKey = (sessionId: string) => `${prefix}head:${sessionId}`;\n\n const saveRecord = async (record: SessionCheckpointRecord): Promise<void> => {\n const serialized = JSON.stringify(record);\n await Promise.all([\n store.set(byIdKey(record.id), serialized, ttlMs),\n store.set(\n sessionRecordKey(record.sessionId, record.id),\n serialized,\n ttlMs,\n ),\n store.set(headKey(record.sessionId), record.id, ttlMs),\n ]);\n };\n\n const deleteRecord = async (\n record: SessionCheckpointRecord,\n ): Promise<void> => {\n await Promise.all([\n store.del(byIdKey(record.id)),\n store.del(sessionRecordKey(record.sessionId, record.id)),\n ]);\n };\n\n const getRecord = async (\n id: string,\n ): Promise<SessionCheckpointRecord | null> => {\n const raw = await store.get(byIdKey(id));\n return raw ? (JSON.parse(raw) as SessionCheckpointRecord) : null;\n };\n\n const sortedRecords = async (\n sessionId: string,\n ): Promise<SessionCheckpointRecord[]> => {\n const keys = await store.scanKeys(sessionPrefix(sessionId));\n const records = await Promise.all(\n keys.map(async (rawKey) => {\n const logicalKey = rawKey.includes(sessionPrefix(sessionId))\n ? rawKey.slice(rawKey.indexOf(sessionPrefix(sessionId)))\n : rawKey;\n const raw = await store.get(logicalKey);\n return raw ? (JSON.parse(raw) as SessionCheckpointRecord) : null;\n }),\n );\n return records\n .filter((record): record is SessionCheckpointRecord => Boolean(record))\n .sort((a, b) => a.turnIndex - b.turnIndex || a.createdAt - b.createdAt);\n };\n\n const prune = async (sessionId: string): Promise<void> => {\n const records = await sortedRecords(sessionId);\n const overflow = Math.max(0, records.length - maxCheckpointsPerSession);\n await Promise.all(records.slice(0, overflow).map(deleteRecord));\n };\n\n const getHead = async (\n sessionId: string,\n ): Promise<SessionCheckpointRecord | null> => {\n const headId = await store.get(headKey(sessionId));\n if (!headId) return null;\n const record = await getRecord(headId);\n return record ? clone(record) : null;\n };\n\n return {\n async list(sessionId) {\n return (await sortedRecords(sessionId)).map(toSummary);\n },\n\n async get(id) {\n const record = await getRecord(id);\n return record ? clone(record) : null;\n },\n\n getHead,\n\n async append(args: AppendSessionCheckpointArgs) {\n const previousHead = await getHead(args.sessionId);\n const pendingRequests = args.pendingRequests ?? [];\n const record: SessionCheckpointRecord = {\n id: createId(\"cp\"),\n sessionId: args.sessionId,\n runId: args.runId,\n ...(args.graphCheckpointId\n ? { graphCheckpointId: args.graphCheckpointId }\n : {}),\n turnIndex: previousHead ? previousHead.turnIndex + 1 : 0,\n createdAt: Date.now(),\n workflow: args.workflow,\n state: clone(args.state),\n nodes: uniqueStrings(args.nodes ?? []),\n effects: {\n structuredStreamIds: uniqueStrings(args.structuredStreamIds ?? []),\n interruptTokens: uniqueStrings(\n pendingRequests.map((request) => request.token),\n ),\n },\n activePendingRequests: clone(pendingRequests),\n ...(previousHead ? { parentCheckpointId: previousHead.id } : {}),\n ...(args.label ? { label: args.label } : {}),\n ...(args.workflowVersion\n ? { workflowVersion: args.workflowVersion }\n : {}),\n ...(args.buildId ? { buildId: args.buildId } : {}),\n };\n\n await saveRecord(record);\n await prune(args.sessionId);\n return clone(record);\n },\n\n async rollbackTo(\n id: CheckpointId,\n ): Promise<RollbackSessionCheckpointResult> {\n const target = await getRecord(id);\n if (!target)\n throw new KortyxError(\"NOT_FOUND\", `Checkpoint \"${id}\" not found.`, {\n category: \"request\",\n retryable: false,\n safeMessage: \"The requested checkpoint was not found.\",\n });\n\n const records = await sortedRecords(target.sessionId);\n const trailing = records.filter(\n (record) => record.turnIndex > target.turnIndex,\n );\n const invalidatedStructuredStreamIds = uniqueStrings(\n trailing.flatMap((record) => record.effects.structuredStreamIds),\n );\n const invalidatedInterruptTokens = uniqueStrings(\n trailing.flatMap((record) => [\n ...record.effects.interruptTokens,\n ...record.activePendingRequests.map((request) => request.token),\n ]),\n );\n\n await Promise.all(trailing.map(deleteRecord));\n await store.set(headKey(target.sessionId), target.id, ttlMs);\n\n return {\n sessionId: target.sessionId,\n head: target.id,\n invalidatedStructuredStreamIds,\n invalidatedInterruptTokens,\n activePendingRequests: clone(target.activePendingRequests),\n };\n },\n\n async fork(\n id: CheckpointId,\n options?: { newSessionId?: string },\n ): Promise<ForkSessionCheckpointResult> {\n const source = await getRecord(id);\n if (!source)\n throw new KortyxError(\"NOT_FOUND\", `Checkpoint \"${id}\" not found.`, {\n category: \"request\",\n retryable: false,\n safeMessage: \"The requested checkpoint was not found.\",\n });\n\n const sessionId = options?.newSessionId || createId(\"session\");\n const { parentCheckpointId: _parentCheckpointId, ...sourceRecord } =\n clone(source);\n const runId = source.activePendingRequests.some(\n (request) => request.graphSnapshot,\n )\n ? `run-${randomUUID()}`\n : source.runId;\n const forked: SessionCheckpointRecord = {\n ...sourceRecord,\n runId,\n id: createId(\"cp\"),\n sessionId,\n parentSessionId: source.sessionId,\n forkedFrom: source.id,\n activePendingRequests: clone(source.activePendingRequests).map(\n (request) => ({\n ...request,\n runId,\n token: createResumeToken(),\n requestId: createId(\"human\"),\n sessionId,\n }),\n ),\n };\n\n await saveRecord(forked);\n return {\n sessionId,\n parentSessionId: source.sessionId,\n forkedFrom: source.id,\n checkpoint: clone(forked),\n };\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { GraphState } from \"@kortyx/core\";\nimport { KortyxError } from \"@kortyx/core/errors\";\nimport type { PendingRequestRecord } from \"./pending-requests\";\n\nexport type CheckpointId = string;\n\nexport type CheckpointSummary = {\n id: CheckpointId;\n sessionId: string;\n turnIndex: number;\n createdAt: number;\n nodes: string[];\n workflow: string;\n label?: string;\n parentCheckpointId?: string;\n parentSessionId?: string;\n forkedFrom?: string;\n workflowVersion?: string;\n buildId?: string;\n /** PostgreSQL retains abandoned branches until their history window expires. */\n branchStatus?: \"active\" | \"abandoned\";\n};\n\nexport type SessionCheckpointRecord = CheckpointSummary & {\n runId: string;\n graphCheckpointId?: string;\n state: GraphState;\n effects: {\n structuredStreamIds: string[];\n interruptTokens: string[];\n };\n activePendingRequests: PendingRequestRecord[];\n};\n\nexport type AppendSessionCheckpointArgs = {\n sessionId: string;\n runId: string;\n graphCheckpointId?: string;\n workflow: string;\n state: GraphState;\n nodes?: string[];\n structuredStreamIds?: string[];\n pendingRequests?: PendingRequestRecord[];\n label?: string;\n workflowVersion?: string;\n buildId?: string;\n};\n\nexport type RollbackSessionCheckpointResult = {\n sessionId: string;\n head: CheckpointId;\n invalidatedStructuredStreamIds: string[];\n invalidatedInterruptTokens: string[];\n activePendingRequests: PendingRequestRecord[];\n};\n\nexport type ForkSessionCheckpointResult = {\n sessionId: string;\n parentSessionId: string;\n forkedFrom: CheckpointId;\n checkpoint: SessionCheckpointRecord;\n};\n\nexport type SessionCheckpointStore = {\n /** The store publishes pending requests in the same transaction as the session transition. */\n managesPendingRequests?: boolean;\n list: (sessionId: string) => Promise<CheckpointSummary[]>;\n get: (id: CheckpointId) => Promise<SessionCheckpointRecord | null>;\n getHead: (sessionId: string) => Promise<SessionCheckpointRecord | null>;\n append: (\n args: AppendSessionCheckpointArgs,\n ) => Promise<SessionCheckpointRecord>;\n rollbackTo: (\n id: CheckpointId,\n options?: {\n preparePendingRequests?: (requests: PendingRequestRecord[]) => void;\n },\n ) => Promise<RollbackSessionCheckpointResult>;\n fork: (\n id: CheckpointId,\n options?: {\n newSessionId?: string;\n preparePendingRequests?: (requests: PendingRequestRecord[]) => void;\n },\n ) => Promise<ForkSessionCheckpointResult>;\n};\n\nexport type SessionCheckpointStoreOptions = {\n maxCheckpointsPerSession?: number;\n};\n\nconst DEFAULT_MAX_CHECKPOINTS_PER_SESSION = 50;\n\nconst createCheckpointId = (): string => `cp-${randomUUID()}`;\nconst createSessionId = (): string => `session-${randomUUID()}`;\nconst createResumeToken = (): string => randomUUID();\nconst createRequestId = (): string => `human-${randomUUID()}`;\n\nconst clone = <T>(value: T): T =>\n value === undefined ? value : (JSON.parse(JSON.stringify(value)) as T);\n\nconst toSummary = (record: SessionCheckpointRecord): CheckpointSummary => ({\n id: record.id,\n sessionId: record.sessionId,\n turnIndex: record.turnIndex,\n createdAt: record.createdAt,\n nodes: [...record.nodes],\n workflow: record.workflow,\n ...(record.label ? { label: record.label } : {}),\n ...(record.parentCheckpointId\n ? { parentCheckpointId: record.parentCheckpointId }\n : {}),\n ...(record.parentSessionId\n ? { parentSessionId: record.parentSessionId }\n : {}),\n ...(record.forkedFrom ? { forkedFrom: record.forkedFrom } : {}),\n ...(record.workflowVersion\n ? { workflowVersion: record.workflowVersion }\n : {}),\n ...(record.buildId ? { buildId: record.buildId } : {}),\n});\n\nconst uniqueStrings = (values: Iterable<string | undefined>): string[] =>\n Array.from(\n new Set(\n Array.from(values).filter(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0,\n ),\n ),\n );\n\nexport function createInMemorySessionCheckpointStore(\n options?: SessionCheckpointStoreOptions,\n): SessionCheckpointStore {\n const maxCheckpointsPerSession =\n options?.maxCheckpointsPerSession ?? DEFAULT_MAX_CHECKPOINTS_PER_SESSION;\n const byId = new Map<string, SessionCheckpointRecord>();\n const bySession = new Map<string, string[]>();\n const headBySession = new Map<string, string>();\n\n const sortedRecords = (sessionId: string): SessionCheckpointRecord[] =>\n (bySession.get(sessionId) ?? [])\n .map((id) => byId.get(id))\n .filter((record): record is SessionCheckpointRecord => Boolean(record))\n .sort((a, b) => a.turnIndex - b.turnIndex || a.createdAt - b.createdAt);\n\n const saveRecord = (record: SessionCheckpointRecord): void => {\n byId.set(record.id, clone(record));\n const ids = bySession.get(record.sessionId) ?? [];\n /* v8 ignore next -- checkpoint ids are generated internally, so public store calls cannot save the same id twice. */\n if (!ids.includes(record.id)) ids.push(record.id);\n bySession.set(record.sessionId, ids);\n headBySession.set(record.sessionId, record.id);\n };\n\n const deleteRecord = (record: SessionCheckpointRecord): void => {\n byId.delete(record.id);\n bySession.set(\n record.sessionId,\n /* v8 ignore next -- deleteRecord only receives records that came from this session index. */\n (bySession.get(record.sessionId) ?? []).filter((id) => id !== record.id),\n );\n };\n\n const prune = (sessionId: string): void => {\n const records = sortedRecords(sessionId);\n const overflow = Math.max(0, records.length - maxCheckpointsPerSession);\n for (const record of records.slice(0, overflow)) {\n deleteRecord(record);\n }\n };\n\n const getHead = async (\n sessionId: string,\n ): Promise<SessionCheckpointRecord | null> => {\n const headId = headBySession.get(sessionId);\n if (!headId) return null;\n const record = byId.get(headId);\n return record ? clone(record) : null;\n };\n\n return {\n async list(sessionId) {\n return sortedRecords(sessionId).map(toSummary);\n },\n\n async get(id) {\n const record = byId.get(id);\n return record ? clone(record) : null;\n },\n\n getHead,\n\n async append(args) {\n const previousHead = await getHead(args.sessionId);\n const turnIndex = previousHead ? previousHead.turnIndex + 1 : 0;\n const pendingRequests = args.pendingRequests ?? [];\n const record: SessionCheckpointRecord = {\n id: createCheckpointId(),\n sessionId: args.sessionId,\n runId: args.runId,\n ...(args.graphCheckpointId\n ? { graphCheckpointId: args.graphCheckpointId }\n : {}),\n turnIndex,\n createdAt: Date.now(),\n workflow: args.workflow,\n state: clone(args.state),\n nodes: uniqueStrings(args.nodes ?? []),\n effects: {\n structuredStreamIds: uniqueStrings(args.structuredStreamIds ?? []),\n interruptTokens: uniqueStrings(\n pendingRequests.map((request) => request.token),\n ),\n },\n activePendingRequests: clone(pendingRequests),\n ...(previousHead ? { parentCheckpointId: previousHead.id } : {}),\n ...(args.label ? { label: args.label } : {}),\n ...(args.workflowVersion\n ? { workflowVersion: args.workflowVersion }\n : {}),\n ...(args.buildId ? { buildId: args.buildId } : {}),\n };\n\n saveRecord(record);\n prune(args.sessionId);\n return clone(record);\n },\n\n async rollbackTo(id) {\n const target = byId.get(id);\n if (!target) {\n throw new KortyxError(\"NOT_FOUND\", `Checkpoint \"${id}\" not found.`, {\n category: \"request\",\n retryable: false,\n safeMessage: \"The requested checkpoint was not found.\",\n });\n }\n\n const records = sortedRecords(target.sessionId);\n const trailing = records.filter(\n (record) => record.turnIndex > target.turnIndex,\n );\n const invalidatedStructuredStreamIds = uniqueStrings(\n trailing.flatMap((record) => record.effects.structuredStreamIds),\n );\n const invalidatedInterruptTokens = uniqueStrings(\n trailing.flatMap((record) => [\n ...record.effects.interruptTokens,\n ...record.activePendingRequests.map((request) => request.token),\n ]),\n );\n\n for (const record of trailing) deleteRecord(record);\n headBySession.set(target.sessionId, target.id);\n\n return {\n sessionId: target.sessionId,\n head: target.id,\n invalidatedStructuredStreamIds,\n invalidatedInterruptTokens,\n activePendingRequests: clone(target.activePendingRequests),\n };\n },\n\n async fork(id, options) {\n const source = byId.get(id);\n if (!source) {\n throw new KortyxError(\"NOT_FOUND\", `Checkpoint \"${id}\" not found.`, {\n category: \"request\",\n retryable: false,\n safeMessage: \"The requested checkpoint was not found.\",\n });\n }\n\n const sessionId = options?.newSessionId || createSessionId();\n const { parentCheckpointId: _parentCheckpointId, ...sourceRecord } =\n clone(source);\n const runId = source.activePendingRequests.some(\n (request) => request.graphSnapshot,\n )\n ? `run-${randomUUID()}`\n : source.runId;\n const forked: SessionCheckpointRecord = {\n ...sourceRecord,\n runId,\n id: createCheckpointId(),\n sessionId,\n parentSessionId: source.sessionId,\n forkedFrom: source.id,\n activePendingRequests: clone(source.activePendingRequests).map(\n (request) => ({\n ...request,\n runId,\n token: createResumeToken(),\n requestId: createRequestId(),\n sessionId,\n }),\n ),\n };\n\n saveRecord(forked);\n return {\n sessionId,\n parentSessionId: source.sessionId,\n forkedFrom: source.id,\n checkpoint: clone(forked),\n };\n },\n };\n}\n","import type { BaseCheckpointSaver } from \"@langchain/langgraph-checkpoint\";\nimport {\n createCachingFrameworkAdapter,\n registerFrameworkCache,\n} from \"./caching\";\nimport { createInMemoryCheckpointSaver } from \"./in-memory-checkpointer\";\nimport {\n emptyPruneResult,\n type RuntimeMaintenance,\n resolvePruneOptions,\n} from \"./maintenance\";\nimport {\n createInMemoryPendingRequestStore,\n type PendingRequestStore,\n} from \"./pending-requests\";\nimport {\n createPostgresFrameworkAdapter,\n type PostgresFrameworkAdapter,\n} from \"./postgres/adapter\";\nimport { createRedisPendingRequestStore } from \"./redis/pending-request-store\";\nimport { createRedisCheckpointSaver } from \"./redis/redis-checkpointer\";\nimport { createRedisFrameworkStore } from \"./redis/redis-store\";\nimport { createRedisSessionCheckpointStore } from \"./redis/session-checkpoint-store\";\nimport {\n createInMemorySessionCheckpointStore,\n type SessionCheckpointStore,\n} from \"./session-checkpoints\";\n\nexport type FrameworkAdapter = {\n kind: \"in-memory\" | \"redis\" | \"postgres\";\n pendingRequests: PendingRequestStore;\n sessionCheckpoints: SessionCheckpointStore;\n checkpointer: BaseCheckpointSaver;\n ttlMs: number;\n /** Optional for legacy custom adapters; required on every built-in adapter. */\n maintenance?: RuntimeMaintenance;\n /** Optional for legacy custom adapters; closes owned connections. */\n close?: () => Promise<void>;\n /** Protects execution from concurrent retention cleanup. Released after the entire outcome is persisted. */\n acquireRunLease?: (args: {\n runId: string;\n sessionId?: string;\n onLost: (cause: unknown) => void;\n }) => Promise<() => Promise<void>>;\n /**\n * Best-effort cleanup for ephemeral framework state for a single run.\n * Called when a workflow completes without pausing for an interrupt.\n */\n cleanupRun?: (runId: string, namespaces: string[]) => Promise<void>;\n};\n\n/** Shared lifecycle contract implemented by every built-in adapter.\n * FrameworkAdapter remains available for existing custom implementations.\n */\nexport type ManagedFrameworkAdapter = FrameworkAdapter & {\n maintenance: RuntimeMaintenance;\n /** Close owned connections after in-flight executions finish. */\n close: () => Promise<void>;\n};\n\nexport type CreateInMemoryFrameworkAdapterOptions = {\n ttlMs?: number;\n maxSessionCheckpoints?: number;\n};\n\nexport function createInMemoryFrameworkAdapter(\n options?: CreateInMemoryFrameworkAdapterOptions,\n): ManagedFrameworkAdapter {\n const ttlMs = options?.ttlMs ?? 15 * 60 * 1000;\n const checkpointer = createInMemoryCheckpointSaver();\n const pendingRequests = createInMemoryPendingRequestStore();\n return {\n kind: \"in-memory\",\n ttlMs,\n pendingRequests,\n maintenance: {\n setup: async () => {},\n prune: async (options) => {\n const { now, batchSize } = resolvePruneOptions(options);\n const result = emptyPruneResult();\n result.deleted.pendingRequests = pendingRequests.pruneExpired(\n now,\n batchSize,\n );\n result.hasMore = result.deleted.pendingRequests === batchSize;\n return result;\n },\n },\n close: async () => {},\n sessionCheckpoints: createInMemorySessionCheckpointStore({\n ...(options?.maxSessionCheckpoints !== undefined\n ? { maxCheckpointsPerSession: options.maxSessionCheckpoints }\n : {}),\n }),\n checkpointer,\n cleanupRun: async (runId: string) => {\n try {\n await checkpointer.deleteThread(runId);\n } catch {\n // best-effort cleanup only\n }\n },\n };\n}\n\nexport type CreateRedisFrameworkAdapterOptions = {\n url: string;\n ttlMs?: number;\n prefix?: string;\n maxSessionCheckpoints?: number;\n};\n\nexport function createRedisFrameworkAdapter(\n options: CreateRedisFrameworkAdapterOptions,\n): ManagedFrameworkAdapter {\n const ttlMs = options.ttlMs ?? 15 * 60 * 1000;\n const store = createRedisFrameworkStore({\n url: options.url,\n prefix: options.prefix ?? \"kortyx:fw:\",\n });\n const cpPrefix = \"kortyx:cp:\";\n const adapter: ManagedFrameworkAdapter = {\n kind: \"redis\",\n ttlMs,\n maintenance: {\n setup: async () => {},\n prune: async (options) => {\n resolvePruneOptions(options);\n // Redis owns physical expiry through native key TTL; no scan/delete job is needed.\n return emptyPruneResult();\n },\n },\n close: async () => {\n await store.close?.();\n },\n pendingRequests: createRedisPendingRequestStore({\n store,\n prefix: \"kortyx:pending:\",\n }),\n sessionCheckpoints: createRedisSessionCheckpointStore({\n store,\n ttlMs,\n prefix: \"kortyx:session-cp:\",\n ...(options.maxSessionCheckpoints !== undefined\n ? { maxCheckpointsPerSession: options.maxSessionCheckpoints }\n : {}),\n }),\n checkpointer: createRedisCheckpointSaver({\n store,\n ttlMs,\n prefix: cpPrefix,\n }),\n cleanupRun: async (runId: string, namespaces: string[]) => {\n // Avoid SCAN-based deletes in hot paths. We can deterministically delete\n // keys by reading the per-namespace latest pointer.\n const nsList = namespaces.length > 0 ? namespaces : [\"\"];\n await Promise.all(\n nsList.map(async (checkpointNs) => {\n const ns = String(checkpointNs ?? \"\");\n const latestKey = `${cpPrefix}latest:${runId}:${ns}`;\n const checkpointId = (await store.get(latestKey)) ?? \"\";\n if (!checkpointId) return;\n await Promise.all([\n store.del(`${cpPrefix}chk:${runId}:${ns}:${checkpointId}`),\n store.del(`${cpPrefix}wr:${runId}:${ns}:${checkpointId}`),\n store.del(latestKey),\n ]);\n }),\n );\n },\n };\n registerFrameworkCache(\n adapter,\n {\n get: (key) => store.get(`kortyx:runtime-cache:${key}`),\n set: (key, value, ttl) =>\n store.set(`kortyx:runtime-cache:${key}`, value, ttl),\n close: () => adapter.close(),\n },\n ttlMs,\n );\n return adapter;\n}\n\nexport function createFrameworkAdapterFromEnv(\n env: Record<string, string | undefined> = process.env,\n):\n | (ManagedFrameworkAdapter & { kind: \"in-memory\" | \"redis\" })\n | PostgresFrameworkAdapter {\n const url =\n env.KORTYX_REDIS_URL ||\n env.REDIS_URL ||\n env.KORTYX_FRAMEWORK_REDIS_URL ||\n \"\";\n const ttlMsRaw = env.KORTYX_FRAMEWORK_TTL_MS || env.KORTYX_TTL_MS || \"\";\n const ttlMs = ttlMsRaw ? Number(ttlMsRaw) : undefined;\n\n if (env.KORTYX_POSTGRES_URL) {\n const storage = createPostgresFrameworkAdapter({\n connectionString: env.KORTYX_POSTGRES_URL,\n ...(ttlMs !== undefined ? { ttlMs } : {}),\n });\n return url\n ? createCachingFrameworkAdapter({\n storage,\n cache: createRedisFrameworkAdapter({ url }),\n })\n : storage;\n }\n\n if (url)\n return createRedisFrameworkAdapter({\n url,\n ...(ttlMs ? { ttlMs } : {}),\n }) as ManagedFrameworkAdapter & { kind: \"redis\" };\n\n // Dev fallback: in-memory. Not production-safe for resume across processes.\n return createInMemoryFrameworkAdapter({\n ...(ttlMs ? { ttlMs } : {}),\n }) as ManagedFrameworkAdapter & { kind: \"in-memory\" };\n}\n","import { setTimeout as delay } from \"node:timers/promises\";\nimport type {\n GraphState,\n InterruptInput,\n InterruptResumeValue,\n NodeConfig,\n NodeResult,\n WorkflowDefinition,\n} from \"@kortyx/core\";\nimport {\n assertExecutionBudget,\n consumeExecutionBudget,\n isExecutionCancelled,\n isExecutionLimitReached,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport { KortyxError } from \"@kortyx/core/errors\";\nimport type { KortyxTelemetryConfig, ReasonTraceAdapter } from \"@kortyx/hooks\";\nimport { runWithHookContext } from \"@kortyx/hooks\";\nimport {\n safeTelemetryMetadata,\n withSafeTraceSpan,\n} from \"@kortyx/hooks/internal\";\nimport type { GetProviderFn } from \"@kortyx/providers\";\nimport { deepMergeWithArrayOverwrite } from \"@kortyx/utils\";\nimport {\n Annotation,\n interrupt,\n isGraphInterrupt,\n StateGraph,\n} from \"@langchain/langgraph\";\nimport type { BaseCheckpointSaver } from \"@langchain/langgraph-checkpoint\";\nimport { getCheckpointer } from \"../checkpointer\";\nimport { resolveNodeHandler } from \"../node-loader\";\nimport { createWorkflowCallService } from \"./call-workflow\";\nimport {\n addParallelGraphCoordinator,\n hasParallelEdges,\n type NodeExecutor,\n} from \"./parallel-graph\";\n\ninterface CompiledGraphBase {\n invoke(state: unknown, options?: Record<string, unknown>): Promise<unknown>;\n streamEvents(\n state: GraphState,\n options?: { version?: string; configurable?: Record<string, unknown> },\n ): AsyncIterable<unknown> | AsyncGenerator<unknown>;\n}\n\nexport type ExecutionControl = {\n completeResponse?:\n | ((\n options: import(\"@kortyx/hooks\").CompleteResponseOptions,\n state: GraphState,\n ) => Promise<void>)\n | undefined;\n abortSignal?: AbortSignal | undefined;\n budget?: import(\"@kortyx/core\").ExecutionBudget | undefined;\n};\n\ninterface GraphExtensions {\n execution: ExecutionControl;\n name: string;\n config: ExecutionRuntimeConfig;\n resume(state: GraphState, input: unknown): Promise<GraphState>;\n timeTravelTo(state: GraphState, checkpointId: string): Promise<GraphState>;\n}\n\ninterface InterruptResultWithId {\n id: string;\n}\n\ninterface HookPatchError {\n __kortyxHookStatePatch?: Record<string, unknown> | null;\n}\n\nexport interface ExecutionRuntimeConfig {\n executionRunId?: string | undefined;\n executionBranchId?: string | undefined;\n prepareChildTelemetry?:\n | ((\n workflow: WorkflowDefinition,\n config: ExecutionRuntimeConfig,\n ) => ExecutionRuntimeConfig)\n | undefined;\n selectWorkflow?: ((id: string) => Promise<WorkflowDefinition>) | undefined;\n workflowCallDepth?: number;\n invocationPath?: string;\n emit?: (event: string, payload: unknown) => void;\n onCheckpoint?: (args: { nodeId: string; state: GraphState }) => void;\n checkpointer?: BaseCheckpointSaver;\n reasonTrace?: ReasonTraceAdapter | undefined;\n telemetry?: KortyxTelemetryConfig | undefined;\n getProvider?: GetProviderFn | undefined;\n [key: string]: unknown;\n}\n\nexport async function createExecutionGraph(\n workflow: WorkflowDefinition,\n config: ExecutionRuntimeConfig,\n execution: ExecutionControl = {},\n) {\n const StateAnnotation = Annotation.Root({\n currentWorkflow: Annotation<string>,\n input: Annotation<unknown>,\n output: Annotation<string>,\n lastNode: Annotation<string>,\n lastCondition: Annotation<string>,\n lastIntent: Annotation<string>,\n runtime: Annotation<Record<string, unknown>>({\n reducer: (l, r) => deepMergeWithArrayOverwrite(l ?? {}, r ?? {}),\n default: () => ({}),\n }),\n config: Annotation<unknown>,\n transitionTo: Annotation<string | null>,\n data: Annotation<Record<string, unknown>>({\n reducer: (l, r) => deepMergeWithArrayOverwrite(l ?? {}, r ?? {}),\n default: () => ({}),\n }),\n conversationHistory: Annotation<\n Array<{ node: string; message: string; timestamp: string }>\n >({\n reducer: (l, r) => [...(l ?? []), ...(r ?? [])],\n default: () => [],\n }),\n awaitingHumanInput: Annotation<boolean>,\n });\n\n const builder = new StateGraph(StateAnnotation);\n const edgeApi = builder as unknown as {\n addEdge: (from: string, to: string) => void;\n addConditionalEdges: (\n from: string,\n fn: (s: GraphState) => string,\n mapping: Record<string, string>,\n ) => void;\n compile: (args: { checkpointer: BaseCheckpointSaver }) => CompiledGraphBase;\n };\n const workflowName = workflow.id;\n const parallelGraph = hasParallelEdges(workflow);\n const nodeExecutors: Record<string, NodeExecutor> = {};\n\n // Ensure an emit function exists so internal hook plumbing can emit events.\n type WithEmit = ExecutionRuntimeConfig & {\n emit: (event: string, payload: unknown) => void;\n };\n const runtimeConfig = config as WithEmit;\n if (!runtimeConfig.emit) {\n runtimeConfig.emit = () => {};\n }\n\n const isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\n const traceAdapter = (): ReasonTraceAdapter | undefined =>\n runtimeConfig.telemetry?.trace ?? runtimeConfig.reasonTrace;\n\n const telemetryCorrelation = () => runtimeConfig.telemetry?.correlation;\n\n const configContext = (): Record<string, unknown> | undefined =>\n isRecord(runtimeConfig.context) ? runtimeConfig.context : undefined;\n\n const toRecordInput = (value: unknown): Record<string, unknown> => {\n if (isRecord(value)) return value;\n if (value === undefined) return {};\n return { rawInput: value };\n };\n\n const buildNodeConfig = (\n params: Record<string, unknown> | undefined,\n nodeBehavior: Record<string, unknown> | undefined,\n ): NodeConfig => {\n const model = isRecord(params?.model)\n ? (params.model as NodeConfig[\"model\"])\n : undefined;\n const tool = isRecord(params?.tool)\n ? (params.tool as NodeConfig[\"tool\"])\n : undefined;\n const behaviorFromParams = isRecord(params?.behavior)\n ? (params.behavior as NodeConfig[\"behavior\"])\n : undefined;\n const behavior: NonNullable<NodeConfig[\"behavior\"]> = {\n ...(behaviorFromParams ?? {}),\n ...(nodeBehavior ?? {}),\n };\n const options = params ?? undefined;\n return {\n ...(model ? { model } : {}),\n ...(tool ? { tool } : {}),\n ...(Object.keys(behavior).length > 0 ? { behavior } : {}),\n ...(options ? { options } : {}),\n } as NodeConfig;\n };\n\n for (const [nodeId, nodeDef] of Object.entries(workflow.nodes ?? {})) {\n const resolvedRun = await resolveNodeHandler({\n run: nodeDef.run,\n workflow,\n });\n const nodeParams = (nodeDef.params ?? undefined) as\n | Record<string, unknown>\n | undefined;\n const nodeConfig: NodeConfig = buildNodeConfig(\n nodeParams,\n (nodeDef.behavior ?? undefined) as unknown as\n | Record<string, unknown>\n | undefined,\n );\n const behavior = nodeConfig.behavior ?? {};\n\n const executeNode: NodeExecutor = async (\n state,\n awaitInput,\n snapshotGraph,\n ) => {\n throwIfExecutionAborted(execution.abortSignal);\n const emitRuntimeEvent = (event: string, payload: unknown) => {\n runtimeConfig.emit(event, payload);\n };\n if (awaitInput)\n emitRuntimeEvent(\"status\", {\n node: nodeId,\n message: `Processing node: ${nodeId}`,\n });\n let suspension: unknown;\n let deniedAdmission: unknown;\n const hookNodeContext = {\n completeResponse: runtimeConfig.workflowCallDepth\n ? undefined\n : execution.completeResponse\n ? async (\n options: import(\"@kortyx/hooks\").CompleteResponseOptions,\n nodeState: GraphState,\n ) => {\n await execution.completeResponse?.(\n options,\n snapshotGraph ? snapshotGraph(nodeState) : nodeState,\n );\n }\n : undefined,\n abortSignal: execution.abortSignal,\n consumeExecution: (limit: import(\"@kortyx/core\").ExecutionLimit) => {\n throwIfExecutionAborted(execution.abortSignal);\n if (suspension) throw suspension;\n try {\n if (execution.budget)\n consumeExecutionBudget(execution.budget, limit);\n } catch (error) {\n deniedAdmission = error;\n throw error;\n }\n },\n workflowCallTelemetry: runtimeConfig.telemetry\n ? {\n ...runtimeConfig.telemetry,\n correlation: {\n ...runtimeConfig.telemetry.correlation,\n runId: runtimeConfig.executionRunId,\n branchId:\n runtimeConfig.executionBranchId ??\n runtimeConfig.executionRunId,\n },\n }\n : undefined,\n ...(runtimeConfig.selectWorkflow\n ? {\n callWorkflow: createWorkflowCallService(\n {\n ...runtimeConfig,\n context: state.config?.context ?? runtimeConfig.context,\n },\n workflow,\n execution,\n ),\n }\n : {}),\n graph: { name: workflowName, node: nodeId },\n config: nodeConfig,\n emit: emitRuntimeEvent,\n replayInterrupt: (request: InterruptInput): void => {\n throwIfExecutionAborted(execution.abortSignal);\n // Both LangGraph and the parallel coordinator consume responses by\n // position. Durable hooks skip completed work, but must still advance\n // those response slots before asking their next question.\n if (awaitInput) awaitInput(request);\n else interrupt(request);\n },\n awaitInterrupt: (\n interruptConfig: InterruptInput,\n ): InterruptResumeValue => {\n throwIfExecutionAborted(execution.abortSignal);\n if (execution.budget) assertExecutionBudget(execution.budget);\n const { kind, question } = interruptConfig;\n const isCustom = kind === \"custom\";\n const isMulti =\n kind === \"multi-choice\" ||\n (interruptConfig.kind === \"choice\" &&\n interruptConfig.multiple === true);\n const sharedInterruptFields = {\n ...(typeof interruptConfig.id === \"string\" &&\n interruptConfig.id.length > 0\n ? { id: interruptConfig.id }\n : {}),\n ...(typeof interruptConfig.schemaId === \"string\" &&\n interruptConfig.schemaId.length > 0\n ? { schemaId: interruptConfig.schemaId }\n : {}),\n ...(typeof interruptConfig.schemaVersion === \"string\" &&\n interruptConfig.schemaVersion.length > 0\n ? { schemaVersion: interruptConfig.schemaVersion }\n : {}),\n ...(interruptConfig.meta &&\n typeof interruptConfig.meta === \"object\" &&\n !Array.isArray(interruptConfig.meta)\n ? { meta: interruptConfig.meta }\n : {}),\n };\n const payload: InterruptInput = isCustom\n ? {\n kind: \"custom\",\n request: interruptConfig.request,\n ...(question ? { question } : {}),\n ...(interruptConfig.contract\n ? { contract: interruptConfig.contract }\n : {}),\n schemaId: interruptConfig.schemaId,\n schemaVersion: interruptConfig.schemaVersion,\n ...sharedInterruptFields,\n }\n : interruptConfig.kind === \"text\"\n ? {\n kind: \"text\",\n ...(question ? { question } : {}),\n ...sharedInterruptFields,\n }\n : {\n kind: interruptConfig.kind,\n multiple: isMulti,\n question: interruptConfig.question,\n options: interruptConfig.options,\n ...sharedInterruptFields,\n };\n let resumed: unknown;\n try {\n resumed = awaitInput ? awaitInput(payload) : interrupt(payload);\n } catch (error) {\n suspension = error;\n if (!awaitInput)\n emitRuntimeEvent(\"interrupt\", {\n node: nodeId,\n workflow: workflowName,\n input: payload,\n });\n throw error;\n }\n if (isCustom) return resumed;\n if (isMulti) {\n if (Array.isArray(resumed)) {\n return (resumed as unknown[])\n .map((v) =>\n typeof v === \"string\"\n ? v\n : v &&\n typeof v === \"object\" &&\n \"id\" in v &&\n typeof (v as InterruptResultWithId).id === \"string\"\n ? (v as InterruptResultWithId).id\n : \"\",\n )\n .filter(Boolean);\n }\n if (typeof resumed === \"string\") return [resumed];\n return [];\n }\n if (typeof resumed === \"string\") return resumed;\n if (\n resumed &&\n typeof resumed === \"object\" &&\n \"id\" in resumed &&\n typeof (resumed as InterruptResultWithId).id === \"string\"\n ) {\n return String((resumed as InterruptResultWithId).id);\n }\n return \"\";\n },\n };\n\n if (behavior.checkpoint && config?.onCheckpoint) {\n config.onCheckpoint({ nodeId, state });\n }\n\n const maxAttempts = behavior.retry?.maxAttempts ?? 1;\n let attempt = 0;\n let nodeResult: NodeResult | undefined;\n let hookRuntimeUpdates: Record<string, unknown> | null = null;\n let retryHookRuntime: Record<string, unknown> | null = null;\n\n while (attempt < maxAttempts) {\n try {\n throwIfExecutionAborted(execution.abortSignal);\n attempt++;\n const attemptState =\n retryHookRuntime && typeof retryHookRuntime === \"object\"\n ? ({\n ...state,\n runtime: deepMergeWithArrayOverwrite(\n (state.runtime ?? {}) as Record<string, unknown>,\n retryHookRuntime,\n ),\n } as GraphState)\n : state;\n const activeTrace = traceAdapter();\n const hookContext = {\n node: hookNodeContext,\n state: attemptState,\n reasonTrace: activeTrace,\n };\n const runNode = () =>\n runWithHookContext(hookContext, async () => {\n try {\n hookNodeContext.consumeExecution(\"maxNodeExecutions\");\n const result = await resolvedRun({\n input: state.input,\n params: (nodeParams ?? {}) as Record<string, unknown>,\n });\n throwIfExecutionAborted(execution.abortSignal);\n // A sibling may exhaust the shared budget while this admitted\n // node completes. Preserve its result; only its own denial\n // prevents a caught limit from committing fallback output.\n if (deniedAdmission) throw deniedAdmission;\n if (suspension) throw suspension;\n return result;\n } catch (error) {\n throwIfExecutionAborted(execution.abortSignal);\n if (deniedAdmission) throw deniedAdmission;\n throw error;\n }\n });\n const context = configContext();\n const spanArgs = {\n name: \"kortyx.node\",\n attributes: {\n ...(typeof telemetryCorrelation()?.runId === \"string\"\n ? { runId: telemetryCorrelation()?.runId }\n : {}),\n ...(typeof telemetryCorrelation()?.sessionId === \"string\"\n ? { sessionId: telemetryCorrelation()?.sessionId }\n : {}),\n workflowId: workflowName,\n ...(typeof telemetryCorrelation()?.workflowRevisionId === \"string\"\n ? {\n workflowRevisionId:\n telemetryCorrelation()?.workflowRevisionId,\n }\n : {}),\n ...(typeof telemetryCorrelation()?.topologyHash === \"string\"\n ? { topologyHash: telemetryCorrelation()?.topologyHash }\n : {}),\n invocationId: runtimeConfig.telemetry?.correlation?.invocationId,\n branchId:\n runtimeConfig.executionBranchId ?? runtimeConfig.executionRunId,\n nodeId,\n attempt,\n ...(typeof context?.userId === \"string\"\n ? { userId: context.userId }\n : {}),\n ...(typeof context?.tenantId === \"string\"\n ? { tenantId: context.tenantId }\n : {}),\n },\n telemetry: {\n metadata: safeTelemetryMetadata({\n ...(runtimeConfig.telemetry?.metadata ?? {}),\n }),\n tags: runtimeConfig.telemetry?.tags,\n captureContent: runtimeConfig.telemetry?.captureContent,\n },\n };\n const hookRun = await withSafeTraceSpan(\n activeTrace,\n spanArgs,\n runNode,\n );\n nodeResult = hookRun.result as NodeResult;\n hookRuntimeUpdates = hookRun.runtimeUpdates;\n break;\n } catch (err) {\n const patch = (err as HookPatchError)?.__kortyxHookStatePatch as\n | Record<string, unknown>\n | null\n | undefined;\n if (patch && typeof patch === \"object\") {\n // Preserve hook runtime state even when execution pauses via interrupt.\n // Without this merge, checkpointed hook state (e.g. useReason drafts)\n // can be lost before resume.\n state.runtime = deepMergeWithArrayOverwrite(\n (state.runtime ?? {}) as Record<string, unknown>,\n patch,\n );\n retryHookRuntime = deepMergeWithArrayOverwrite(\n (retryHookRuntime ?? {}) as Record<string, unknown>,\n patch,\n );\n }\n throwIfExecutionAborted(execution.abortSignal);\n if (isExecutionLimitReached(err)) {\n Object.assign(err, { nodeId, workflowId: workflowName });\n throw err;\n }\n if (isExecutionCancelled(err) || isGraphInterrupt(err)) throw err;\n const hasMore = attempt < maxAttempts;\n const delayMs = behavior.retry?.delayMs ?? 0;\n if (hasMore && delayMs > 0) {\n await delay(delayMs, undefined, { signal: execution.abortSignal });\n continue;\n }\n if (!hasMore) throw err;\n }\n }\n\n throwIfExecutionAborted(execution.abortSignal);\n const res: NodeResult = (nodeResult ?? {}) as NodeResult;\n if (hookRuntimeUpdates) {\n res.infra = {\n ...(res.infra ?? {}),\n runtime: deepMergeWithArrayOverwrite(\n ((res.infra?.runtime ?? {}) as Record<string, unknown>) || {},\n hookRuntimeUpdates,\n ),\n };\n }\n const uiMessage = res.ui?.message;\n const shouldRespond =\n typeof uiMessage === \"string\" && uiMessage.trim().length > 0;\n\n if (shouldRespond) {\n emitRuntimeEvent(\"message\", { node: nodeId, content: uiMessage });\n }\n\n if (res.transitionTo) {\n if (awaitInput)\n throw Object.assign(\n new KortyxError(\n \"GRAPH_BRANCH_HANDOFF\",\n \"transitionTo cannot hand off from a parallel branch; useWorkflow returns to its caller.\",\n {\n category: \"workflow\",\n retryable: false,\n safeMessage:\n \"transitionTo cannot hand off from a parallel branch; useWorkflow returns to its caller.\",\n },\n ),\n { __kortyxHookStatePatch: hookRuntimeUpdates },\n );\n emitRuntimeEvent(\"transition\", {\n node: nodeId,\n workflow: workflowName,\n transitionTo: res.transitionTo,\n payload: res.data ?? {},\n });\n }\n\n const updates: Record<string, unknown> = {};\n\n if (typeof res.condition === \"string\")\n updates.lastCondition = res.condition;\n if (typeof res.intent === \"string\") updates.lastIntent = res.intent;\n\n if (res.data && typeof res.data === \"object\") {\n // Treat node `data` as the flowing payload between nodes.\n // Accumulate by merging into the previous input (if any).\n updates.input = deepMergeWithArrayOverwrite(\n toRecordInput(state.input),\n res.data as Record<string, unknown>,\n );\n updates.data = deepMergeWithArrayOverwrite(\n (state.data ?? {}) as Record<string, unknown>,\n res.data as Record<string, unknown>,\n );\n }\n if (res.infra?.runtime && typeof res.infra.runtime === \"object\") {\n updates.runtime = deepMergeWithArrayOverwrite(\n (state.runtime ?? {}) as Record<string, unknown>,\n res.infra.runtime as Record<string, unknown>,\n );\n }\n\n if (res.ui) {\n updates.ui = {\n message:\n typeof res.ui.message === \"string\"\n ? res.ui.message\n : (state.ui?.message ?? \"\"),\n structured: deepMergeWithArrayOverwrite(\n (state.ui?.structured ?? {}) as Record<string, unknown>,\n (res.ui.structured ?? {}) as Record<string, unknown>,\n ),\n };\n }\n\n if (shouldRespond && uiMessage) {\n updates.conversationHistory = [\n ...(state.conversationHistory ?? []),\n {\n node: nodeId,\n message: uiMessage,\n timestamp: new Date().toISOString(),\n },\n ];\n }\n\n if (res.ui?.structured) {\n const payload = res.ui.structured as Record<string, unknown>;\n const inferredType =\n payload && typeof payload === \"object\" && \"jobs\" in payload\n ? \"jobs\"\n : typeof (payload as { summary?: unknown }).summary === \"string\" ||\n (payload as { topJobs?: unknown }).topJobs\n ? \"summary\"\n : \"generic\";\n emitRuntimeEvent(\"structured_data\", {\n node: nodeId,\n dataType: inferredType,\n data: payload,\n });\n }\n\n if (awaitInput) updates.__kortyxNodeData = res.data ?? {};\n if (awaitInput)\n emitRuntimeEvent(\"status\", {\n node: nodeId,\n message: `✅ Completed node: ${nodeId}`,\n });\n return updates;\n };\n Object.defineProperty(nodeExecutors, nodeId, {\n value: executeNode,\n enumerable: true,\n });\n if (!parallelGraph)\n builder.addNode(nodeId, (state: GraphState) => executeNode(state));\n }\n\n type EdgeTriple = readonly [string, string, { when?: string }?];\n const condGroups: Record<string, Array<{ when: string; to: string }>> = {};\n const plainEdges: Array<[string, string]> = [];\n\n for (const edge of workflow.edges as unknown as EdgeTriple[]) {\n const [from, to, condition] = edge as unknown as EdgeTriple;\n if (condition && typeof condition.when === \"string\" && condition.when) {\n if (!condGroups[from]) condGroups[from] = [];\n condGroups[from].push({ when: condition.when, to });\n } else {\n plainEdges.push([from, to]);\n }\n }\n\n if (parallelGraph) {\n addParallelGraphCoordinator(\n builder as unknown as Parameters<typeof addParallelGraphCoordinator>[0],\n workflow,\n runtimeConfig,\n execution,\n nodeExecutors,\n );\n } else {\n for (const [from, to] of plainEdges) {\n edgeApi.addEdge(from, to);\n }\n\n for (const [from, rules] of Object.entries(condGroups)) {\n const mapping: Record<string, string> = Object.fromEntries(\n rules.map((r) => [r.when, r.to]),\n );\n const fallbackKey = `__default__:${from}`;\n mapping[fallbackKey] = \"__end__\";\n edgeApi.addConditionalEdges(\n from,\n (s: GraphState) => {\n const trigger = s.lastCondition ?? s.lastIntent;\n if (trigger && Object.hasOwn(mapping, trigger as string)) {\n return trigger as string;\n }\n return fallbackKey;\n },\n mapping,\n );\n }\n }\n\n const sessionId =\n typeof config.session === \"object\" &&\n config.session &&\n \"id\" in config.session &&\n typeof config.session.id === \"string\"\n ? config.session.id\n : \"__default__\";\n const checkpointer = config.checkpointer ?? getCheckpointer(sessionId);\n const graph = edgeApi.compile({ checkpointer });\n\n type RuntimeGraph = typeof graph & GraphExtensions;\n\n const runtimeGraph = graph as RuntimeGraph;\n runtimeGraph.name = workflow.id;\n runtimeGraph.config = config;\n runtimeGraph.execution = execution;\n\n runtimeGraph.resume = async (state: GraphState, input: unknown) => {\n const resumed = { ...state, input, awaitingHumanInput: false };\n return (await graph.invoke(resumed)) as GraphState;\n };\n\n runtimeGraph.timeTravelTo = async (\n state: GraphState,\n checkpointId: string,\n ) => {\n const checkpoints = (\n state.runtime as { checkpoints?: Record<string, { snapshot: unknown }> }\n )?.checkpoints;\n const snapshot = checkpoints?.[checkpointId];\n if (!snapshot) throw new Error(`Checkpoint '${checkpointId}' not found`);\n return graph.invoke(\n snapshot.snapshot as unknown as Partial<\n (typeof StateAnnotation)[\"State\"]\n >,\n ) as unknown as GraphState;\n };\n\n return runtimeGraph;\n}\n","import { dirname, isAbsolute, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { NodeFn, WorkflowDefinition } from \"@kortyx/core\";\nimport { resolveNode } from \"./node-registry\";\n\ntype LoadedNodeModule = Record<string, unknown>;\n\nconst dynamicImport = new Function(\n \"specifier\",\n // Avoid bundler static analysis of `import(...)` (e.g. Next.js/Turbopack).\n // This is only used on the server.\n \"return import(specifier)\",\n) as (specifier: string) => Promise<LoadedNodeModule>;\n\nfunction looksLikePath(specifier: string) {\n if (specifier.startsWith(\"file:\")) return true;\n if (specifier.startsWith(\"./\") || specifier.startsWith(\"../\")) return true;\n if (specifier.startsWith(\"/\")) return true;\n return specifier.includes(\"/\");\n}\n\nfunction getWorkflowBaseDir(\n workflow: WorkflowDefinition | undefined,\n cwd: string,\n): string {\n const meta = workflow?.metadata as Record<string, unknown> | undefined;\n const filePath = meta?.__filePath;\n if (typeof filePath === \"string\" && filePath.length > 0) {\n return dirname(filePath);\n }\n return cwd;\n}\n\nfunction pickNodeExport(mod: LoadedNodeModule, exportName?: string): NodeFn {\n if (exportName) {\n const candidate = mod[exportName];\n if (typeof candidate === \"function\") return candidate as NodeFn;\n throw new Error(`Node export \"${exportName}\" not found or not a function.`);\n }\n\n const defaultExport = mod.default;\n if (typeof defaultExport === \"function\") return defaultExport as NodeFn;\n\n const fnExports = Object.entries(mod).filter(\n ([, v]) => typeof v === \"function\",\n );\n if (fnExports.length === 1) return fnExports[0]?.[1] as NodeFn;\n\n const names = fnExports.map(([k]) => k).sort();\n throw new Error(\n `Node module must export a default function or exactly one named function (found: ${\n names.join(\", \") || \"none\"\n }).`,\n );\n}\n\nexport async function resolveNodeHandler(args: {\n run: string | NodeFn;\n workflow?: WorkflowDefinition;\n cwd?: string;\n}): Promise<NodeFn> {\n const { run, workflow } = args;\n const cwd = args.cwd ?? process.cwd();\n\n if (typeof run === \"function\") return run;\n\n // New DX: YAML/JSON specify module path (optionally with #exportName)\n if (looksLikePath(run)) {\n const [moduleRef, exportName] = run.split(\"#\", 2) as [\n string,\n string | undefined,\n ];\n const baseDir = getWorkflowBaseDir(workflow, cwd);\n\n const specifier = moduleRef.startsWith(\"file:\")\n ? moduleRef\n : isAbsolute(moduleRef)\n ? pathToFileURL(moduleRef).href\n : pathToFileURL(resolve(baseDir, moduleRef)).href;\n\n const mod = await dynamicImport(specifier);\n return pickNodeExport(mod, exportName);\n }\n\n // Back-compat: symbolic node registry name\n return resolveNode(run);\n}\n","import type { NodeFn } from \"@kortyx/core\";\n\nconst registry = new Map<string, NodeFn>();\n\nexport function registerNode(id: string, fn: NodeFn): void {\n registry.set(id, fn);\n}\n\nexport function getRegisteredNode(id: string): NodeFn | null {\n return registry.get(id) ?? null;\n}\n\nexport function listRegisteredNodes(): string[] {\n return [...registry.keys()].sort();\n}\n\nexport function clearRegisteredNodes(): void {\n registry.clear();\n}\n\nexport function resolveNode(id: string): NodeFn {\n const fn = registry.get(id);\n if (!fn) {\n throw new Error(\n `Node '${id}' is not registered. Call registerNode('${id}', fn) before running workflows that reference it.`,\n );\n }\n return fn;\n}\n","import type {\n GraphState,\n InterruptInput,\n TokenUsage,\n WorkflowDefinition,\n} from \"@kortyx/core\";\nimport { isExecutionLimitReached, throwIfExecutionAborted } from \"@kortyx/core\";\nimport {\n errorFromFailure,\n errorProperty,\n isFailureDescriptor,\n PersistenceError,\n ValidationError,\n WorkflowContractError,\n} from \"@kortyx/core/errors\";\nimport type { WorkflowCallService } from \"@kortyx/hooks\";\nimport { workflowCallFingerprint } from \"@kortyx/hooks\";\nimport { withSafeTraceSpan } from \"@kortyx/hooks/internal\";\nimport { AsyncLocalStorageProviderSingleton } from \"@langchain/core/singletons\";\nimport { Command } from \"@langchain/langgraph\";\nimport {\n captureGraphSnapshot,\n type GraphSnapshotBundle,\n restoreGraphSnapshot,\n} from \"../framework/graph-snapshot\";\nimport { createInMemoryCheckpointSaver } from \"../framework/in-memory-checkpointer\";\nimport {\n createExecutionGraph,\n type ExecutionControl,\n type ExecutionRuntimeConfig,\n} from \"./create-execution-graph\";\n\ntype ChildSnapshot = {\n version: string;\n checkpoint: GraphSnapshotBundle;\n request?: InterruptInput;\n limitPaused?: boolean;\n};\n\n/** Children have private engine state. Their snapshots travel in parent hook state. */\nexport function createWorkflowCallService(\n config: ExecutionRuntimeConfig,\n _parent?: WorkflowDefinition,\n execution: ExecutionControl = {},\n): WorkflowCallService {\n return async (args) => {\n const execute = async () => {\n throwIfExecutionAborted(execution.abortSignal);\n const depth = (config.workflowCallDepth ?? 0) + 1;\n if (depth > 16)\n throw new WorkflowContractError(\n \"Maximum child workflow depth (16) exceeded.\",\n );\n const workflow = await config.selectWorkflow?.(args.workflow);\n if (!workflow || workflow.id !== args.workflow)\n throw new WorkflowContractError(\n `Workflow '${args.workflow}' is not registered.`,\n );\n if (!workflow.inputSchema || !workflow.outputSchema)\n throw new WorkflowContractError(\n `Callable workflow '${workflow.id}' requires inputSchema and outputSchema.`,\n );\n if (\n args.definition &&\n (args.definition.version !== workflow.version ||\n args.definition.inputSchema !== workflow.inputSchema ||\n args.definition.outputSchema !== workflow.outputSchema)\n ) {\n throw new WorkflowContractError(\n \"The typed workflow contract does not match the registered definition.\",\n );\n }\n const snapshot = args.snapshot as ChildSnapshot | undefined;\n if (snapshot && snapshot.version !== workflow.version)\n throw new WorkflowContractError(\n `Workflow '${workflow.id}' changed since the call was suspended.`,\n );\n // The checkpoint already contains parsed input. Re-running a transform\n // during resume could change its meaning or repeat validation effects.\n const input = snapshot\n ? undefined\n : workflow.inputSchema.parse(args.input);\n if (!snapshot) workflowCallFingerprint(input);\n const saver = createInMemoryCheckpointSaver();\n const threadId = \"child\";\n let request: InterruptInput | undefined;\n const invocationPath = `${config.invocationPath ?? \"root\"}/${encodeURIComponent(args.id)}:${args.invocationId}`;\n let childConfig: ExecutionRuntimeConfig = {\n resume: Boolean(snapshot),\n executionBranchId: config.executionBranchId,\n prepareChildTelemetry: config.prepareChildTelemetry,\n context: config.context,\n session: config.session,\n selectWorkflow: config.selectWorkflow,\n getProvider: config.getProvider,\n telemetry: config.telemetry\n ? {\n ...config.telemetry,\n correlation: {\n runId: config.telemetry.correlation?.runId,\n sessionId: config.telemetry.correlation?.sessionId,\n workflowId: workflow.id,\n invocationId: args.invocationId,\n parentInvocationId: config.telemetry.correlation?.invocationId,\n branchId: config.executionBranchId ?? config.executionRunId,\n },\n }\n : undefined,\n reasonTrace: config.reasonTrace,\n checkpointer: saver,\n executionRunId: config.executionRunId,\n workflowCallDepth: depth,\n invocationPath,\n emit: (event, payload) => {\n if (event === \"interrupt\") {\n const original = (payload as { input: InterruptInput }).input;\n request = {\n ...original,\n meta: {\n ...original.meta,\n workflowCallPath: [\n {\n workflowId: workflow.id,\n invocationId: args.invocationId,\n callId: args.id,\n },\n ...(Array.isArray(original.meta?.workflowCallPath)\n ? original.meta.workflowCallPath\n : []),\n ],\n workflowCall: original.meta?.workflowCall ?? {\n invocationId: args.invocationId,\n workflowId: workflow.id,\n nodeId: (payload as { node?: string }).node,\n },\n },\n };\n return;\n }\n if (event === \"error\") {\n const failure = (payload as { failure?: unknown })?.failure;\n throw isFailureDescriptor(failure)\n ? errorFromFailure(failure)\n : new Error(\"Child workflow failed.\");\n }\n if (event === \"transition\")\n throw new WorkflowContractError(\n \"transitionTo is not supported inside child workflows; useWorkflow returns to its caller.\",\n );\n const value = payload as Record<string, unknown>;\n const scoped = { ...value, workflow: workflow.id, invocationPath };\n for (const key of [\"node\", \"streamId\", \"opId\", \"segmentId\"]) {\n if (typeof value[key] === \"string\")\n (scoped as Record<string, unknown>)[key] =\n `${config.executionRunId ?? \"run\"}/${args.invocationId}/${value[key]}`;\n }\n config.emit?.(event, scoped);\n },\n };\n childConfig =\n config.prepareChildTelemetry?.(workflow, childConfig) ?? childConfig;\n if (snapshot) {\n if (snapshot.limitPaused)\n snapshot.checkpoint.checkpoint.channel_values.config = childConfig;\n await restoreGraphSnapshot(saver, snapshot.checkpoint, threadId);\n }\n const graph = await createExecutionGraph(\n workflow,\n childConfig,\n execution,\n );\n const initial: GraphState = {\n input,\n data: {},\n runtime: {},\n config: childConfig,\n currentWorkflow: workflow.id,\n lastNode: \"__start__\",\n awaitingHumanInput: false,\n conversationHistory: [],\n };\n const resumePatch = snapshot?.request?.meta?.__kortyxResumeStatePatch;\n const command = snapshot?.limitPaused\n ? null\n : snapshot\n ? new Command({\n resume: args.response,\n update: {\n config: childConfig,\n ...(resumePatch ? { runtime: resumePatch } : {}),\n },\n })\n : initial;\n // Do not inherit the parent's engine task/scratchpad/callbacks. Child\n // interrupts are bridged deliberately, and child completion stays internal.\n let result: GraphState;\n try {\n result = (await AsyncLocalStorageProviderSingleton.runWithConfig(\n {},\n () =>\n graph.invoke(command, {\n configurable: { thread_id: threadId, checkpoint_ns: \"\" },\n callbacks: [],\n }),\n )) as GraphState;\n } catch (error) {\n throwIfExecutionAborted(execution.abortSignal);\n const checkpoint = await captureGraphSnapshot(saver, threadId).catch(\n (cause) => {\n // A failed diagnostic snapshot must not replace the child failure.\n // Limit suspension, however, requires a recoverable checkpoint.\n if (isExecutionLimitReached(error))\n throw new PersistenceError(\n \"Cannot checkpoint a suspended child workflow.\",\n cause,\n );\n return undefined;\n },\n );\n const state = checkpoint?.checkpoint.channel_values as\n | GraphState\n | undefined;\n const patch = (\n error as { __kortyxHookStatePatch?: Record<string, unknown> } | null\n )?.__kortyxHookStatePatch;\n const usage = (patch?.tokenUsage ?? state?.runtime.tokenUsage) as\n | TokenUsage\n | undefined;\n if (error && typeof error === \"object\")\n Object.assign(error, { __kortyxChildUsage: usage });\n try {\n throwIfExecutionAborted(execution.abortSignal);\n } catch (cancelled) {\n Object.assign(cancelled as object, { __kortyxChildUsage: usage });\n throw cancelled;\n }\n if (isExecutionLimitReached(error)) {\n if (checkpoint && state) {\n if (patch) state.runtime = { ...state.runtime, ...patch };\n Object.assign(error, {\n __kortyxChildSnapshot: {\n version: workflow.version,\n checkpoint,\n limitPaused: true,\n } satisfies ChildSnapshot,\n __kortyxChildUsage: state.runtime.tokenUsage,\n });\n }\n }\n throw error;\n }\n throwIfExecutionAborted(execution.abortSignal);\n if (request) {\n const checkpoint = await captureGraphSnapshot(saver, threadId);\n if (!checkpoint)\n throw new WorkflowContractError(\n \"Child interrupted without a graph checkpoint.\",\n );\n return {\n status: \"interrupted\" as const,\n usage:\n (\n request.meta?.__kortyxResumeStatePatch as\n | { tokenUsage?: TokenUsage }\n | undefined\n )?.tokenUsage ?? result.runtime.tokenUsage,\n request,\n snapshot: {\n version: workflow.version,\n checkpoint,\n request,\n } satisfies ChildSnapshot,\n };\n }\n let data: Record<string, unknown>;\n try {\n data = workflow.outputSchema.parse(result.data ?? {});\n } catch (cause) {\n if (!Array.isArray(errorProperty(cause, \"issues\"))) throw cause;\n throw new ValidationError(\n \"INVALID_OUTPUT\",\n \"Child output validation failed.\",\n cause,\n );\n }\n workflowCallFingerprint(data);\n return {\n status: \"completed\" as const,\n data,\n toolObservations:\n (\n (result.runtime as unknown as Record<string, unknown>).__kortyx as\n | {\n workflowState?: {\n __kortyxToolObservations?: import(\"@kortyx/providers\").ToolObservation[];\n };\n }\n | undefined\n )?.workflowState?.__kortyxToolObservations ?? [],\n usage: result.runtime.tokenUsage,\n };\n };\n const trace = config.telemetry?.trace ?? config.reasonTrace;\n return withSafeTraceSpan(\n trace,\n {\n name: \"kortyx.workflow.call\",\n attributes: {\n workflowId: args.workflow,\n runId: config.executionRunId,\n branchId: config.executionBranchId ?? config.executionRunId,\n parentInvocationId: config.telemetry?.correlation?.invocationId,\n callerNodeExecutionId: args.callerNodeExecutionId,\n callId: args.id,\n invocationId: args.invocationId,\n },\n },\n execute,\n );\n };\n}\n","import type {\n GraphState,\n InterruptInput,\n TokenUsage,\n WorkflowDefinition,\n} from \"@kortyx/core\";\nimport {\n isExecutionCancelled,\n isExecutionLimitReached,\n throwIfExecutionAborted,\n} from \"@kortyx/core\";\nimport {\n errorFromFailure,\n type FailureDescriptor,\n KortyxError,\n serializeFailure,\n WorkflowContractError,\n} from \"@kortyx/core/errors\";\nimport { deepMergeWithArrayOverwrite } from \"@kortyx/utils\";\nimport {\n GraphInterrupt,\n interrupt,\n isGraphInterrupt,\n} from \"@langchain/langgraph\";\nimport type {\n ExecutionControl,\n ExecutionRuntimeConfig,\n} from \"./create-execution-graph\";\n\nexport type NodeExecutor = (\n state: GraphState,\n awaitInput?: (request: InterruptInput) => unknown,\n snapshotGraph?: (nodeState: GraphState) => GraphState,\n) => Promise<Record<string, unknown>>;\n\nconst WORK = \"__kortyx_parallel_work\";\nconst WAIT = \"__kortyx_parallel_wait\";\nconst FINISH = \"__kortyx_parallel_finish\";\nconst KEY = \"__kortyxParallelGraph\";\nconst record = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\nconst clone = <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T;\nconst zeroUsage = (): TokenUsage => ({ input: 0, output: 0, total: 0 });\n\ntype Field = { writer: string; value: unknown };\ntype Fields = Record<string, Field>;\ntype NodeRecord = {\n id: string;\n ancestors: string[];\n status:\n | \"pending\"\n | \"running\"\n | \"waiting\"\n | \"limited\"\n | \"completed\"\n | \"failed\"\n | \"skipped\";\n responses: unknown[];\n runtime: Record<string, unknown>;\n fields: Fields;\n workflowFields: Fields;\n runtimeFields: Fields;\n selected: string[];\n request?: InterruptInput;\n failure?: FailureDescriptor;\n history?: GraphState[\"conversationHistory\"];\n};\ntype Journal = {\n version: 1;\n runId?: string | undefined;\n workflowVersion: string;\n initialInput: unknown;\n initialData: Record<string, unknown>;\n initialRuntime: Record<string, unknown>;\n nodes: Record<string, NodeRecord>;\n waitingNode?: string | undefined;\n};\ntype Builder = {\n addNode: (\n id: string,\n fn: (\n state: GraphState,\n ) => Promise<Record<string, unknown>> | Record<string, unknown>,\n ) => unknown;\n addEdge: (from: string, to: string) => unknown;\n addConditionalEdges: (\n from: string,\n fn: (state: GraphState) => string,\n mapping: Record<string, string>,\n ) => unknown;\n};\n\nexport function hasParallelEdges(workflow: WorkflowDefinition): boolean {\n const groups = new Map<string, { plain: number; conditional: number }>();\n for (const [from, , condition] of workflow.edges) {\n const group = groups.get(from) ?? { plain: 0, conditional: 0 };\n if (condition?.when) group.conditional++;\n else group.plain++;\n groups.set(from, group);\n if (group.plain > 1 || (group.plain && group.conditional)) return true;\n }\n return false;\n}\n\n/** The root engine owns checkpoints; node activations own their replay journals. */\nexport function addParallelGraphCoordinator(\n builder: Builder,\n workflow: WorkflowDefinition,\n config: ExecutionRuntimeConfig,\n execution: ExecutionControl,\n executors: Record<string, NodeExecutor>,\n): void {\n const ids = [...Object.keys(workflow.nodes), \"__end__\"];\n const incoming = new Map(ids.map((id) => [id, [] as string[]]));\n const outgoing = new Map<string, Array<{ to: string; when?: string }>>();\n for (const [from, to, condition] of workflow.edges) {\n if (\n from === \"__end__\" ||\n to === \"__start__\" ||\n (from !== \"__start__\" && !Object.hasOwn(workflow.nodes, from)) ||\n !incoming.has(to)\n )\n throw new WorkflowContractError(\n `Invalid parallel graph edge '${from}' → '${to}'.`,\n );\n if (!incoming.get(to)?.includes(from)) incoming.get(to)?.push(from);\n const edges = outgoing.get(from) ?? [];\n if (!edges.some((edge) => edge.to === to && edge.when === condition?.when))\n edges.push({ to, ...(condition ? { when: condition.when } : {}) });\n outgoing.set(from, edges);\n }\n const ancestors = new Map<string, Set<string>>([[\"__start__\", new Set()]]);\n const remaining = new Set(ids);\n const ordered: string[] = [];\n while (remaining.size) {\n const ready = [...remaining].filter((id) =>\n incoming.get(id)?.every((from) => ancestors.has(from)),\n );\n if (!ready.length)\n throw new KortyxError(\n \"GRAPH_CYCLE\",\n \"Parallel graph back-edges are not supported: use a sequential child workflow for loops.\",\n {\n category: \"workflow\",\n retryable: false,\n safeMessage:\n \"Parallel graph back-edges are not supported: use a sequential child workflow for loops.\",\n },\n );\n for (const id of ready) {\n const parents = incoming.get(id) ?? [];\n ancestors.set(\n id,\n new Set(\n parents.flatMap((from) => [from, ...(ancestors.get(from) ?? [])]),\n ),\n );\n remaining.delete(id);\n ordered.push(id);\n }\n }\n ids.splice(0, ids.length, ...ordered);\n\n const failure = (\n code: string,\n message: string,\n node: string,\n cause?: unknown,\n ) =>\n new KortyxError(code, message, {\n category: \"workflow\",\n retryable: false,\n safeMessage: message,\n context: { workflow: workflow.id, node },\n ...(cause ? { cause } : {}),\n });\n const mergeFields = (\n parents: NodeRecord[],\n node: string,\n property: \"fields\" | \"workflowFields\" | \"runtimeFields\",\n journal: Journal,\n ): Fields => {\n const merged: Fields = {};\n for (const parent of parents) {\n for (const [key, field] of Object.entries(parent[property])) {\n const previous = Object.hasOwn(merged, key) ? merged[key] : undefined;\n if (\n property === \"workflowFields\" &&\n key === \"__kortyxToolObservations\" &&\n previous &&\n Array.isArray(previous.value) &&\n Array.isArray(field.value)\n ) {\n // Runtime-owned observation history is append-only across branches.\n const observations = new Map<string, unknown>();\n for (const observation of [...previous.value, ...field.value]) {\n if (\n record(observation) &&\n typeof observation.attemptId === \"string\"\n )\n observations.set(observation.attemptId, observation);\n }\n Object.defineProperty(merged, key, {\n value: { writer: field.writer, value: [...observations.values()] },\n enumerable: true,\n configurable: true,\n writable: true,\n });\n continue;\n }\n if (previous && previous.writer !== field.writer) {\n if (journal.nodes[previous.writer]?.ancestors.includes(field.writer))\n continue;\n if (!journal.nodes[field.writer]?.ancestors.includes(previous.writer))\n throw failure(\n \"GRAPH_OUTPUT_CONFLICT\",\n `Node '${node}' cannot combine ${property === \"fields\" ? \"data\" : property === \"workflowFields\" ? \"workflow state\" : \"runtime\"} field '${key}': branches '${previous.writer}' and '${field.writer}' both wrote it. Return separate fields in application logic.`,\n node,\n );\n }\n Object.defineProperty(merged, key, {\n value: field,\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n }\n return merged;\n };\n const values = (fields: Fields) =>\n Object.fromEntries(\n Object.entries(fields).map(([key, field]) => [key, field.value]),\n );\n const initialWorkflowState = (journal: Journal) => {\n const internal = journal.initialRuntime.__kortyx;\n return record(internal) && record(internal.workflowState)\n ? internal.workflowState\n : {};\n };\n const usage = (journal: Journal) => {\n const total = {\n ...zeroUsage(),\n ...(journal.initialRuntime.tokenUsage as TokenUsage | undefined),\n };\n for (const node of Object.values(journal.nodes)) {\n const used = node.runtime.tokenUsage as TokenUsage | undefined;\n if (used)\n for (const key of [\"input\", \"output\", \"total\"] as const)\n total[key] += used[key] ?? 0;\n }\n return total;\n };\n const runtimePatch = (journal: Journal) => ({\n [KEY]: journal,\n tokenUsage: usage(journal),\n });\n const load = (state: GraphState): Journal => {\n const saved = (state.runtime as Record<string, unknown>)[KEY];\n if (\n saved &&\n (config.resume === true ||\n !config.executionRunId ||\n (saved as Journal).runId === config.executionRunId)\n ) {\n const journal = clone(saved) as Journal;\n if (journal.version !== 1 || journal.workflowVersion !== workflow.version)\n throw new WorkflowContractError(\n \"Parallel workflow changed since its execution was suspended.\",\n );\n return journal;\n }\n const initialRuntime = clone(state.runtime) as Record<string, unknown>;\n delete initialRuntime[KEY];\n return {\n version: 1,\n runId: config.executionRunId,\n workflowVersion: workflow.version,\n initialInput: state.input,\n initialData: clone(state.data ?? {}),\n initialRuntime,\n nodes: Object.fromEntries(\n ids.map((id) => [\n id,\n {\n id,\n ancestors: [],\n status: \"pending\",\n responses: [],\n runtime: {},\n fields: {},\n workflowFields: {},\n runtimeFields: {},\n selected: [],\n },\n ]),\n ),\n };\n };\n const terminal = (node: NodeRecord) =>\n [\"completed\", \"failed\", \"skipped\"].includes(node.status);\n\n builder.addNode(WORK, async (state) => {\n const journal = load(state);\n let control: unknown;\n const running = new Map<string, Promise<void>>();\n // Continue re-admits only the limited activations; waiting siblings remain waiting.\n for (const node of Object.values(journal.nodes))\n if (node.status === \"limited\") node.status = \"pending\";\n const start = async (id: string, parents: NodeRecord[]) => {\n const node = journal.nodes[id] as NodeRecord;\n let privateState: GraphState | undefined;\n try {\n node.ancestors = [\n ...new Set(\n parents.flatMap((parent) => [parent.id, ...parent.ancestors]),\n ),\n ];\n const failed = parents.find((parent) => parent.status === \"failed\");\n if (failed)\n throw failure(\n \"GRAPH_DEPENDENCY_FAILED\",\n `Node '${id}' did not run because required dependency '${failed.id}' failed.`,\n id,\n failed.failure,\n );\n node.fields = mergeFields(parents, id, \"fields\", journal);\n node.workflowFields = mergeFields(\n parents,\n id,\n \"workflowFields\",\n journal,\n );\n node.runtimeFields = mergeFields(parents, id, \"runtimeFields\", journal);\n if (id === \"__end__\") {\n node.status = \"completed\";\n return;\n }\n const data = deepMergeWithArrayOverwrite(\n journal.initialData,\n values(node.fields),\n );\n const nodeInput = Object.keys(node.fields).length\n ? deepMergeWithArrayOverwrite(\n record(journal.initialInput)\n ? journal.initialInput\n : { rawInput: journal.initialInput },\n values(node.fields),\n )\n : journal.initialInput;\n const workflowState = deepMergeWithArrayOverwrite(\n initialWorkflowState(journal),\n values(node.workflowFields),\n );\n const ownInternal = node.runtime.__kortyx;\n const inheritedRuntime = deepMergeWithArrayOverwrite(\n journal.initialRuntime,\n values(node.runtimeFields),\n );\n privateState = {\n ...state,\n input: nodeInput === undefined ? undefined : clone(nodeInput),\n data: clone(data),\n runtime: clone({\n ...inheritedRuntime,\n tokenUsage: zeroUsage(),\n ...node.runtime,\n __kortyx: {\n ...(record(ownInternal) ? ownInternal : {}),\n workflowState:\n record(ownInternal) && record(ownInternal.workflowState)\n ? ownInternal.workflowState\n : workflowState,\n },\n }) as GraphState[\"runtime\"],\n conversationHistory: [],\n awaitingHumanInput: false,\n };\n let index = 0;\n node.status = \"running\";\n const updates = await (executors[id] as NodeExecutor)(\n privateState,\n (request) => {\n const position = index++;\n if (position < node.responses.length)\n return node.responses[position];\n node.request = request;\n throw new GraphInterrupt([]);\n },\n (nodeState) => {\n const snapshot = clone(journal);\n (snapshot.nodes[id] as NodeRecord).runtime = clone(\n nodeState.runtime,\n );\n for (const activation of Object.values(snapshot.nodes))\n if (activation.status === \"running\")\n activation.status = \"pending\";\n return {\n ...state,\n lastNode: id,\n input: nodeState.input,\n data: nodeState.data ?? {},\n conversationHistory: [\n ...state.conversationHistory,\n ...ids.flatMap(\n (nodeId) => snapshot.nodes[nodeId]?.history ?? [],\n ),\n ],\n runtime: { ...nodeState.runtime, ...runtimePatch(snapshot) },\n };\n },\n );\n node.runtime =\n (updates.runtime as Record<string, unknown> | undefined) ??\n (privateState.runtime as Record<string, unknown>);\n const delta = updates.__kortyxNodeData as Record<string, unknown>;\n const updatedData = updates.data as Record<string, unknown> | undefined;\n for (const key of Object.keys(delta))\n Object.defineProperty(node.fields, key, {\n value: { writer: id, value: updatedData?.[key] },\n enumerable: true,\n configurable: true,\n writable: true,\n });\n const internal = node.runtime.__kortyx;\n for (const [key, value] of Object.entries(node.runtime)) {\n if ([KEY, \"__kortyx\", \"tokenUsage\"].includes(key)) continue;\n if (JSON.stringify(value) !== JSON.stringify(inheritedRuntime[key]))\n Object.defineProperty(node.runtimeFields, key, {\n value: { writer: id, value },\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n const updatedWorkflow =\n record(internal) && record(internal.workflowState)\n ? internal.workflowState\n : {};\n for (const [key, value] of Object.entries(updatedWorkflow)) {\n if (JSON.stringify(value) !== JSON.stringify(workflowState[key]))\n Object.defineProperty(node.workflowFields, key, {\n value: { writer: id, value },\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n node.history =\n (updates.conversationHistory as\n | GraphState[\"conversationHistory\"]\n | undefined) ?? [];\n node.selected = (outgoing.get(id) ?? [])\n .filter(\n (edge) =>\n !edge.when ||\n edge.when === (updates.lastCondition ?? updates.lastIntent),\n )\n .map((edge) => edge.to);\n node.status = \"completed\";\n delete node.request;\n } catch (error) {\n const patch = (\n error as { __kortyxHookStatePatch?: Record<string, unknown> } | null\n )?.__kortyxHookStatePatch;\n if (privateState) node.runtime = { ...privateState.runtime, ...patch };\n if (isGraphInterrupt(error)) node.status = \"waiting\";\n else if (isExecutionLimitReached(error)) {\n node.status = \"limited\";\n control ??= error;\n } else if (\n isExecutionCancelled(error) ||\n execution.abortSignal?.aborted\n ) {\n control ??= error;\n } else if (serializeFailure(error).category === \"persistence\")\n control ??= error;\n else {\n node.failure = serializeFailure(error);\n node.failure.context = {\n ...node.failure.context,\n node: id,\n workflow: workflow.id,\n };\n node.status = \"failed\";\n node.selected = (outgoing.get(id) ?? []).map((edge) => edge.to);\n }\n }\n };\n const launch = () => {\n if (control || execution.abortSignal?.aborted) return;\n for (const id of ids) {\n if (id === \"__end__\") continue;\n const node = journal.nodes[id] as NodeRecord;\n if (node.status !== \"pending\" || running.has(id)) continue;\n const sources = incoming.get(id) ?? [];\n if (\n !sources.every(\n (from) =>\n from === \"__start__\" ||\n terminal(journal.nodes[from] as NodeRecord),\n )\n )\n continue;\n const activeSources = sources.filter((from) =>\n from === \"__start__\"\n ? (outgoing.get(from) ?? []).some(\n (edge) =>\n edge.to === id &&\n (!edge.when ||\n edge.when === (state.lastCondition ?? state.lastIntent)),\n )\n : journal.nodes[from]?.selected.includes(id),\n );\n if (!activeSources.length) {\n node.status = \"skipped\";\n continue;\n }\n const task = start(\n id,\n activeSources\n .filter((from) => from !== \"__start__\")\n .map((from) => journal.nodes[from] as NodeRecord),\n );\n running.set(\n id,\n task.finally(() => running.delete(id)),\n );\n }\n };\n try {\n while (true) {\n launch();\n if (!running.size) break;\n await Promise.race(running.values());\n }\n throwIfExecutionAborted(execution.abortSignal);\n if (control) throw control;\n } catch (error) {\n // Drain admitted work before persisting a pause or reporting cancellation.\n await Promise.allSettled(running.values());\n if (error && typeof error === \"object\")\n Object.assign(error, { __kortyxHookStatePatch: runtimePatch(journal) });\n throw error;\n }\n journal.waitingNode = ids.find(\n (id) => journal.nodes[id]?.status === \"waiting\",\n );\n if (!journal.waitingNode) {\n const leaves = ids.filter(\n (id) =>\n id !== \"__end__\" &&\n journal.nodes[id]?.status !== \"skipped\" &&\n !journal.nodes[id]?.selected.some((to) => to !== \"__end__\"),\n );\n await start(\n \"__end__\",\n leaves.map((id) => journal.nodes[id] as NodeRecord),\n );\n }\n const end = journal.nodes.__end__ as NodeRecord;\n return {\n runtime: {\n ...(end.status === \"completed\" ? values(end.runtimeFields) : {}),\n ...runtimePatch(journal),\n },\n ...(end.status === \"completed\"\n ? {\n input: Object.keys(end.fields).length\n ? deepMergeWithArrayOverwrite(\n record(journal.initialInput)\n ? journal.initialInput\n : { rawInput: journal.initialInput },\n values(end.fields),\n )\n : journal.initialInput,\n data: deepMergeWithArrayOverwrite(\n journal.initialData,\n values(end.fields),\n ),\n conversationHistory: ids.flatMap(\n (id) => journal.nodes[id]?.history ?? [],\n ),\n }\n : {}),\n };\n });\n\n builder.addNode(WAIT, (state) => {\n const journal = load(state);\n const id = journal.waitingNode;\n const node = id ? journal.nodes[id] : undefined;\n if (!id || !node?.request)\n throw new WorkflowContractError(\"Missing waiting parallel node.\");\n // One engine interrupt per suspension revision. Its answer belongs only to this activation.\n const request: InterruptInput = {\n ...node.request,\n meta: {\n ...node.request.meta,\n __kortyxResumeStatePatch: runtimePatch(journal),\n },\n };\n let response: unknown;\n try {\n response = interrupt(request);\n } catch (error) {\n config.emit?.(\"interrupt\", {\n node: id,\n workflow: workflow.id,\n input: request,\n });\n throw error;\n }\n node.responses.push(response);\n node.status = \"pending\";\n delete journal.waitingNode;\n return { runtime: runtimePatch(journal) };\n });\n builder.addNode(FINISH, (state) => {\n const journal = load(state);\n const failed = ids.filter((id) => journal.nodes[id]?.status === \"failed\");\n if (failed.length) {\n const relevant =\n [...failed].reverse().find((id) => id !== \"__end__\") ??\n (failed[0] as string);\n const detail = journal.nodes[relevant]?.failure as FailureDescriptor;\n const error = errorFromFailure({\n ...detail,\n results: failed.map((id) => ({\n status: \"rejected\",\n failure: journal.nodes[id]?.failure,\n })),\n });\n Object.assign(error, { __kortyxHookStatePatch: runtimePatch(journal) });\n throw error;\n }\n return {\n runtime: {\n [KEY]: null,\n __kortyx: {\n workflowState: deepMergeWithArrayOverwrite(\n initialWorkflowState(journal),\n values(journal.nodes.__end__?.workflowFields ?? {}),\n ),\n },\n },\n };\n });\n builder.addEdge(\"__start__\", WORK);\n builder.addConditionalEdges(\n WORK,\n (state) => (load(state).waitingNode ? \"wait\" : \"finish\"),\n { wait: WAIT, finish: FINISH },\n );\n builder.addEdge(WAIT, WORK);\n builder.addEdge(FINISH, \"__end__\");\n}\n","import { randomUUID } from \"node:crypto\";\n\nexport function makeResumeToken(): string {\n return randomUUID();\n}\n\nexport function makeRequestId(prefix = \"req\"): string {\n return `${prefix}-${randomUUID()}`;\n}\n","import { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { WorkflowDefinition } from \"@kortyx/core\";\nimport { loadWorkflow } from \"@kortyx/core\";\nimport { KortyxError } from \"@kortyx/core/errors\";\nimport type { WorkflowRegistry } from \"./interface\";\n\nexport interface FileWorkflowRegistryOptions {\n workflowsDir: string;\n fallbackId?: string;\n cache?: boolean;\n extensions?: string[];\n}\n\ntype AnyWorkflow = WorkflowDefinition;\n\nconst DEFAULT_EXTENSIONS = [\n \".workflow.ts\",\n \".workflow.mts\",\n \".workflow.js\",\n \".workflow.mjs\",\n \".workflow.json\",\n \".workflow.yml\",\n \".workflow.yaml\",\n];\n\nfunction isWorkflowFile(name: string, extensions: string[]) {\n return extensions.some((ext) => name.endsWith(ext));\n}\n\nfunction isDeclarativeWorkflowFile(name: string) {\n return (\n name.endsWith(\".workflow.json\") ||\n name.endsWith(\".workflow.yml\") ||\n name.endsWith(\".workflow.yaml\")\n );\n}\n\nexport function createFileWorkflowRegistry(\n options: FileWorkflowRegistryOptions,\n): WorkflowRegistry {\n const workflowsDir = options.workflowsDir;\n const fallbackId = options.fallbackId ?? \"general-chat\";\n const extensions = options.extensions ?? DEFAULT_EXTENSIONS;\n const shouldCache = options.cache ?? true;\n\n let workflowCache: Record<string, AnyWorkflow> | null = null;\n\n async function loadWorkflows(): Promise<Record<string, AnyWorkflow>> {\n if (shouldCache && workflowCache) return workflowCache;\n\n const files = await readdir(workflowsDir, { withFileTypes: true });\n const workflowFiles = files\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name)\n .filter((file) => isWorkflowFile(file, extensions));\n\n const workflows: Record<string, AnyWorkflow> = {};\n\n for (const file of workflowFiles) {\n try {\n const modulePath = join(workflowsDir, file);\n\n // For declarative JSON/YAML workflows\n if (isDeclarativeWorkflowFile(file)) {\n const raw = await readFile(modulePath, \"utf8\");\n const workflow = loadWorkflow(raw) as unknown as AnyWorkflow;\n (workflow as any).metadata = {\n ...(((workflow as any).metadata ?? {}) as Record<string, unknown>),\n __filePath: modulePath,\n };\n workflows[workflow.id] = workflow;\n continue;\n }\n\n // For TS/JS module workflows\n const module = await import(modulePath);\n const workflowExport = Object.values(module).find(\n (exp): exp is AnyWorkflow => {\n const obj = exp as {\n id?: unknown;\n nodes?: unknown;\n edges?: unknown;\n };\n return (\n exp !== null &&\n typeof exp === \"object\" &&\n typeof obj.id === \"string\" &&\n typeof obj.nodes === \"object\" &&\n obj.nodes !== null &&\n Array.isArray(obj.edges)\n );\n },\n );\n\n if (workflowExport) {\n (workflowExport as any).metadata = {\n ...(((workflowExport as any).metadata ?? {}) as Record<\n string,\n unknown\n >),\n __filePath: modulePath,\n };\n workflows[workflowExport.id] = workflowExport;\n }\n } catch (error) {\n console.warn(`Failed to load workflow from ${file}:`, error);\n }\n }\n\n if (shouldCache) workflowCache = workflows;\n return workflows;\n }\n\n async function list(): Promise<AnyWorkflow[]> {\n const workflows = await loadWorkflows();\n return Object.values(workflows);\n }\n\n async function get(id: string): Promise<AnyWorkflow | null> {\n const workflows = await loadWorkflows();\n return workflows[id] ?? null;\n }\n\n async function select(\n id: string,\n selectOptions?: { fallbackId?: string },\n ): Promise<AnyWorkflow> {\n const workflows = await loadWorkflows();\n const fallback = selectOptions?.fallbackId ?? fallbackId;\n const selected = workflows[id] ?? (fallback ? workflows[fallback] : null);\n\n if (!selected) {\n throw new KortyxError(\n \"UNKNOWN_WORKFLOW\",\n `No workflow found for id \"${id}\" and no fallback \"${fallback}\" workflow available`,\n {\n category: \"request\",\n retryable: false,\n safeMessage: \"The requested workflow is not registered.\",\n },\n );\n }\n\n return selected;\n }\n\n async function refresh() {\n workflowCache = null;\n await loadWorkflows();\n }\n\n return {\n list,\n get,\n select,\n refresh,\n } satisfies WorkflowRegistry;\n}\n","import type { WorkflowDefinition } from \"@kortyx/core\";\nimport { KortyxError } from \"@kortyx/core/errors\";\nimport type { WorkflowRegistry } from \"./interface\";\n\nexport function createInMemoryWorkflowRegistry(\n workflows: WorkflowDefinition[],\n options?: { fallbackId?: string },\n): WorkflowRegistry {\n const byId = new Map<string, WorkflowDefinition>();\n for (const wf of workflows) byId.set(wf.id, wf);\n\n const fallbackId = options?.fallbackId ?? \"general-chat\";\n\n return {\n async list() {\n return Array.from(byId.values());\n },\n async get(id: string) {\n return byId.get(id) ?? null;\n },\n async select(id: string, selectOptions?: { fallbackId?: string }) {\n const fallback = selectOptions?.fallbackId ?? fallbackId;\n const wf = byId.get(id) ?? (fallback ? byId.get(fallback) : undefined);\n if (!wf) {\n throw new KortyxError(\n \"UNKNOWN_WORKFLOW\",\n `Workflow \"${id}\" not found${fallback ? ` (fallback \"${fallback}\" missing too)` : \"\"}.`,\n {\n category: \"request\",\n retryable: false,\n safeMessage: \"The requested workflow is not registered.\",\n },\n );\n }\n return wf;\n },\n };\n}\n","import type { GraphState, RuntimeEnvelope } from \"@kortyx/core\";\n\n/**\n * Prepares the initial graph state from chat context, runtime state, and runtime config.\n * This stays deliberately generic in the config type so apps can shape it.\n */\nexport interface InitialStateArgs<Config = unknown> {\n input: unknown;\n runtime: RuntimeEnvelope;\n config: Config;\n defaultWorkflowId?: string;\n}\n\nexport async function buildInitialGraphState<Config>({\n input,\n runtime,\n config,\n defaultWorkflowId,\n}: InitialStateArgs<Config>): Promise<GraphState> {\n const currentWorkflow =\n (runtime.requestedWorkflow as any) || (defaultWorkflowId as any);\n if (!currentWorkflow) {\n throw new Error(\n \"No workflow selected. Provide defaultWorkflowId (or set runtime.requestedWorkflow) before starting the graph.\",\n );\n }\n\n return {\n input,\n lastNode: \"__start__\",\n runtime,\n config: config as unknown,\n conversationHistory: [],\n currentWorkflow,\n awaitingHumanInput: false,\n } as GraphState;\n}\n"],"mappings":"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","names":["record","import_node_crypto","import_errors","import_errors","import_langgraph_checkpoint","import_node_crypto","import_errors","postgres","record","record","import_node_crypto","import_errors","record","ttlMs","import_errors","import_langgraph_checkpoint","utf8Bytes","utf8String","jsonSerde","import_errors","import_errors","resolve","tlsConnect","netConnect","import_node_crypto","import_errors","clone","record","options","import_node_crypto","import_errors","DEFAULT_MAX_CHECKPOINTS_PER_SESSION","createResumeToken","clone","toSummary","record","uniqueStrings","options","options","import_core","import_errors","import_hooks","import_internal","import_utils","import_langgraph","import_errors","import_core","import_errors","import_langgraph","clone","delay","import_node_crypto","import_promises","import_node_path","import_core","import_errors","module","import_errors"]}
|