@kortyx/runtime 0.16.0 → 0.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/dist/index.js +124 -42
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.17.1](https://github.com/kortyx-io/kortyx/compare/runtime-v0.17.0...runtime-v0.17.1) (2026-09-14)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Dependencies
|
|
7
|
+
|
|
8
|
+
* The following workspace dependencies were updated
|
|
9
|
+
* dependencies
|
|
10
|
+
* @kortyx/hooks bumped to 0.25.1
|
|
11
|
+
|
|
12
|
+
## [0.17.0](https://github.com/kortyx-io/kortyx/compare/runtime-v0.16.0...runtime-v0.17.0) (2026-09-14)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### ⚠ BREAKING CHANGES
|
|
16
|
+
|
|
17
|
+
* **errors:** public failure messages and default HTTP statuses change; malformed streams fail explicitly, provider error classes are shared, and retry helpers exclude control flow. Existing calls and legacy records remain supported. See the error-contract migration and release notes.
|
|
18
|
+
|
|
19
|
+
### Features
|
|
20
|
+
|
|
21
|
+
* **errors:** harden failure contracts across execution and recovery ([#175](https://github.com/kortyx-io/kortyx/issues/175)) ([d231e36](https://github.com/kortyx-io/kortyx/commit/d231e364259a4f23fc3675d8783fde5ba338416e))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### Dependencies
|
|
25
|
+
|
|
26
|
+
* The following workspace dependencies were updated
|
|
27
|
+
* dependencies
|
|
28
|
+
* @kortyx/stream bumped to 0.12.0
|
|
29
|
+
* @kortyx/core bumped to 0.9.0
|
|
30
|
+
* @kortyx/hooks bumped to 0.25.0
|
|
31
|
+
* @kortyx/providers bumped to 0.7.0
|
|
32
|
+
* @kortyx/utils bumped to 0.3.0
|
|
33
|
+
|
|
3
34
|
## [0.16.0](https://github.com/kortyx-io/kortyx/compare/runtime-v0.15.2...runtime-v0.16.0) (2026-09-11)
|
|
4
35
|
|
|
5
36
|
|
package/dist/index.js
CHANGED
|
@@ -267,6 +267,7 @@ function createRedisPendingRequestStore(options) {
|
|
|
267
267
|
}
|
|
268
268
|
|
|
269
269
|
// src/framework/redis/redis-checkpointer.ts
|
|
270
|
+
var import_errors = require("@kortyx/core/errors");
|
|
270
271
|
var import_langgraph_checkpoint2 = require("@langchain/langgraph-checkpoint");
|
|
271
272
|
var utf8Bytes2 = (s) => new Uint8Array(Buffer.from(s, "utf8"));
|
|
272
273
|
var utf8String2 = (u8) => typeof u8 === "string" ? u8 : Buffer.from(u8).toString("utf8");
|
|
@@ -296,7 +297,9 @@ function createRedisCheckpointSaver(options) {
|
|
|
296
297
|
},
|
|
297
298
|
getNextVersion(current) {
|
|
298
299
|
if (typeof current === "string") {
|
|
299
|
-
throw new
|
|
300
|
+
throw new import_errors.PersistenceError(
|
|
301
|
+
"Please override this method to use string versions."
|
|
302
|
+
);
|
|
300
303
|
}
|
|
301
304
|
return current !== void 0 && typeof current === "number" ? current + 1 : 1;
|
|
302
305
|
},
|
|
@@ -362,7 +365,7 @@ function createRedisCheckpointSaver(options) {
|
|
|
362
365
|
const threadId = config.configurable?.thread_id;
|
|
363
366
|
const checkpointNs = config.configurable?.checkpoint_ns ?? "";
|
|
364
367
|
if (!threadId) {
|
|
365
|
-
throw new
|
|
368
|
+
throw new import_errors.PersistenceError(
|
|
366
369
|
'Failed to put checkpoint: missing "thread_id" in config.configurable.'
|
|
367
370
|
);
|
|
368
371
|
}
|
|
@@ -393,12 +396,12 @@ function createRedisCheckpointSaver(options) {
|
|
|
393
396
|
const checkpointNs = config.configurable?.checkpoint_ns;
|
|
394
397
|
const checkpointId = config.configurable?.checkpoint_id;
|
|
395
398
|
if (!threadId) {
|
|
396
|
-
throw new
|
|
399
|
+
throw new import_errors.PersistenceError(
|
|
397
400
|
'Failed to put writes: missing "thread_id" in config.configurable.'
|
|
398
401
|
);
|
|
399
402
|
}
|
|
400
403
|
if (!checkpointId) {
|
|
401
|
-
throw new
|
|
404
|
+
throw new import_errors.PersistenceError(
|
|
402
405
|
'Failed to put writes: missing "checkpoint_id" in config.configurable.'
|
|
403
406
|
);
|
|
404
407
|
}
|
|
@@ -439,9 +442,13 @@ function createRedisCheckpointSaver(options) {
|
|
|
439
442
|
return saver;
|
|
440
443
|
}
|
|
441
444
|
|
|
445
|
+
// src/framework/redis/redis-store.ts
|
|
446
|
+
var import_errors3 = require("@kortyx/core/errors");
|
|
447
|
+
|
|
442
448
|
// src/framework/redis/redis-client.ts
|
|
443
449
|
var import_node_net = require("net");
|
|
444
450
|
var import_node_tls = require("tls");
|
|
451
|
+
var import_errors2 = require("@kortyx/core/errors");
|
|
445
452
|
var encodeBulk = (s) => {
|
|
446
453
|
const b = Buffer.from(s, "utf8");
|
|
447
454
|
return Buffer.concat([
|
|
@@ -579,13 +586,17 @@ function createRedisClient(options) {
|
|
|
579
586
|
if (password) {
|
|
580
587
|
const r = await send("AUTH", [password]);
|
|
581
588
|
if (typeof r === "object" && r && r.type === "error") {
|
|
582
|
-
throw new
|
|
589
|
+
throw new import_errors2.PersistenceError(
|
|
590
|
+
`Redis AUTH failed: ${r.message}`
|
|
591
|
+
);
|
|
583
592
|
}
|
|
584
593
|
}
|
|
585
594
|
if (db && Number.isFinite(db) && db > 0) {
|
|
586
595
|
const r = await send("SELECT", [String(db)]);
|
|
587
596
|
if (typeof r === "object" && r && r.type === "error") {
|
|
588
|
-
throw new
|
|
597
|
+
throw new import_errors2.PersistenceError(
|
|
598
|
+
`Redis SELECT failed: ${r.message}`
|
|
599
|
+
);
|
|
589
600
|
}
|
|
590
601
|
}
|
|
591
602
|
ready = true;
|
|
@@ -607,7 +618,17 @@ function createRedisClient(options) {
|
|
|
607
618
|
// src/framework/redis/redis-store.ts
|
|
608
619
|
var isRedisError = (r) => Boolean(r) && typeof r === "object" && r.type === "error";
|
|
609
620
|
function createRedisFrameworkStore(options) {
|
|
610
|
-
const
|
|
621
|
+
const rawClient = createRedisClient({ url: options.url });
|
|
622
|
+
const client = {
|
|
623
|
+
...rawClient,
|
|
624
|
+
command: async (...args) => {
|
|
625
|
+
try {
|
|
626
|
+
return await rawClient.command(...args);
|
|
627
|
+
} catch (cause) {
|
|
628
|
+
throw new import_errors3.PersistenceError("Redis command failed.", cause);
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
};
|
|
611
632
|
const prefix = options.prefix ?? "kortyx:fw:";
|
|
612
633
|
const k = (key) => `${prefix}${key}`;
|
|
613
634
|
return {
|
|
@@ -617,7 +638,7 @@ function createRedisFrameworkStore(options) {
|
|
|
617
638
|
[...new Set(keys)].map(async (key) => {
|
|
618
639
|
const value = await client.command("GET", [key]);
|
|
619
640
|
if (isRedisError(value))
|
|
620
|
-
throw new
|
|
641
|
+
throw new import_errors3.PersistenceError(`Redis GET error: ${value.message}`);
|
|
621
642
|
return value;
|
|
622
643
|
})
|
|
623
644
|
);
|
|
@@ -627,7 +648,8 @@ function createRedisFrameworkStore(options) {
|
|
|
627
648
|
},
|
|
628
649
|
async take(key) {
|
|
629
650
|
const r = await client.command("GETDEL", [k(key)]);
|
|
630
|
-
if (isRedisError(r))
|
|
651
|
+
if (isRedisError(r))
|
|
652
|
+
throw new import_errors3.PersistenceError(`Redis GETDEL error: ${r.message}`);
|
|
631
653
|
return typeof r === "string" ? r : null;
|
|
632
654
|
},
|
|
633
655
|
async get(key) {
|
|
@@ -635,7 +657,7 @@ function createRedisFrameworkStore(options) {
|
|
|
635
657
|
if (r === null) return null;
|
|
636
658
|
if (typeof r === "string") return r;
|
|
637
659
|
if (isRedisError(r)) {
|
|
638
|
-
throw new
|
|
660
|
+
throw new import_errors3.PersistenceError(`Redis GET error: ${r.message}`);
|
|
639
661
|
}
|
|
640
662
|
return null;
|
|
641
663
|
},
|
|
@@ -643,32 +665,32 @@ function createRedisFrameworkStore(options) {
|
|
|
643
665
|
const args = [k(key), value, "PX", String(Math.max(1, ttlMs))];
|
|
644
666
|
const r = await client.command("SET", args);
|
|
645
667
|
if (isRedisError(r)) {
|
|
646
|
-
throw new
|
|
668
|
+
throw new import_errors3.PersistenceError(`Redis SET error: ${r.message}`);
|
|
647
669
|
}
|
|
648
670
|
},
|
|
649
671
|
async del(key) {
|
|
650
672
|
const r = await client.command("DEL", [k(key)]);
|
|
651
673
|
if (isRedisError(r)) {
|
|
652
|
-
throw new
|
|
674
|
+
throw new import_errors3.PersistenceError(`Redis DEL error: ${r.message}`);
|
|
653
675
|
}
|
|
654
676
|
},
|
|
655
677
|
async hset(key, field, value) {
|
|
656
678
|
const r = await client.command("HSET", [k(key), field, value]);
|
|
657
679
|
if (isRedisError(r)) {
|
|
658
|
-
throw new
|
|
680
|
+
throw new import_errors3.PersistenceError(`Redis HSET error: ${r.message}`);
|
|
659
681
|
}
|
|
660
682
|
},
|
|
661
683
|
async hsetnx(key, field, value) {
|
|
662
684
|
const r = await client.command("HSETNX", [k(key), field, value]);
|
|
663
685
|
if (isRedisError(r)) {
|
|
664
|
-
throw new
|
|
686
|
+
throw new import_errors3.PersistenceError(`Redis HSETNX error: ${r.message}`);
|
|
665
687
|
}
|
|
666
688
|
return typeof r === "number" ? r : 0;
|
|
667
689
|
},
|
|
668
690
|
async hgetall(key) {
|
|
669
691
|
const r = await client.command("HGETALL", [k(key)]);
|
|
670
692
|
if (isRedisError(r)) {
|
|
671
|
-
throw new
|
|
693
|
+
throw new import_errors3.PersistenceError(`Redis HGETALL error: ${r.message}`);
|
|
672
694
|
}
|
|
673
695
|
if (!Array.isArray(r)) return {};
|
|
674
696
|
const out = {};
|
|
@@ -685,7 +707,7 @@ function createRedisFrameworkStore(options) {
|
|
|
685
707
|
String(Math.max(1, ttlMs))
|
|
686
708
|
]);
|
|
687
709
|
if (isRedisError(r)) {
|
|
688
|
-
throw new
|
|
710
|
+
throw new import_errors3.PersistenceError(`Redis PEXPIRE error: ${r.message}`);
|
|
689
711
|
}
|
|
690
712
|
},
|
|
691
713
|
async scanKeys(prefixKey) {
|
|
@@ -700,7 +722,8 @@ function createRedisFrameworkStore(options) {
|
|
|
700
722
|
"COUNT",
|
|
701
723
|
"200"
|
|
702
724
|
]);
|
|
703
|
-
if (isRedisError(r))
|
|
725
|
+
if (isRedisError(r))
|
|
726
|
+
throw new import_errors3.PersistenceError(`Redis SCAN error: ${r.message}`);
|
|
704
727
|
if (!Array.isArray(r) || r.length < 2) break;
|
|
705
728
|
cursor = typeof r[0] === "string" ? r[0] : "0";
|
|
706
729
|
const batch = r[1];
|
|
@@ -716,7 +739,7 @@ function createRedisFrameworkStore(options) {
|
|
|
716
739
|
if (keys.length === 0) return;
|
|
717
740
|
const r = await client.command("DEL", keys);
|
|
718
741
|
if (isRedisError(r)) {
|
|
719
|
-
throw new
|
|
742
|
+
throw new import_errors3.PersistenceError(`Redis DEL error: ${r.message}`);
|
|
720
743
|
}
|
|
721
744
|
}
|
|
722
745
|
};
|
|
@@ -724,6 +747,7 @@ function createRedisFrameworkStore(options) {
|
|
|
724
747
|
|
|
725
748
|
// src/framework/redis/session-checkpoint-store.ts
|
|
726
749
|
var import_node_crypto = require("crypto");
|
|
750
|
+
var import_errors4 = require("@kortyx/core/errors");
|
|
727
751
|
var DEFAULT_MAX_CHECKPOINTS_PER_SESSION = 50;
|
|
728
752
|
var clone = (value) => value === void 0 ? value : JSON.parse(JSON.stringify(value));
|
|
729
753
|
var uniqueStrings = (values) => Array.from(
|
|
@@ -844,7 +868,12 @@ function createRedisSessionCheckpointStore(options) {
|
|
|
844
868
|
},
|
|
845
869
|
async rollbackTo(id) {
|
|
846
870
|
const target = await getRecord(id);
|
|
847
|
-
if (!target)
|
|
871
|
+
if (!target)
|
|
872
|
+
throw new import_errors4.KortyxError("NOT_FOUND", `Checkpoint "${id}" not found.`, {
|
|
873
|
+
category: "request",
|
|
874
|
+
retryable: false,
|
|
875
|
+
safeMessage: "The requested checkpoint was not found."
|
|
876
|
+
});
|
|
848
877
|
const records = await sortedRecords(target.sessionId);
|
|
849
878
|
const trailing = records.filter(
|
|
850
879
|
(record) => record.turnIndex > target.turnIndex
|
|
@@ -870,7 +899,12 @@ function createRedisSessionCheckpointStore(options) {
|
|
|
870
899
|
},
|
|
871
900
|
async fork(id, options2) {
|
|
872
901
|
const source = await getRecord(id);
|
|
873
|
-
if (!source)
|
|
902
|
+
if (!source)
|
|
903
|
+
throw new import_errors4.KortyxError("NOT_FOUND", `Checkpoint "${id}" not found.`, {
|
|
904
|
+
category: "request",
|
|
905
|
+
retryable: false,
|
|
906
|
+
safeMessage: "The requested checkpoint was not found."
|
|
907
|
+
});
|
|
874
908
|
const sessionId = options2?.newSessionId || createId("session");
|
|
875
909
|
const { parentCheckpointId: _parentCheckpointId, ...sourceRecord } = clone(source);
|
|
876
910
|
const runId = source.activePendingRequests.some(
|
|
@@ -906,6 +940,7 @@ function createRedisSessionCheckpointStore(options) {
|
|
|
906
940
|
|
|
907
941
|
// src/framework/session-checkpoints.ts
|
|
908
942
|
var import_node_crypto2 = require("crypto");
|
|
943
|
+
var import_errors5 = require("@kortyx/core/errors");
|
|
909
944
|
var DEFAULT_MAX_CHECKPOINTS_PER_SESSION2 = 50;
|
|
910
945
|
var createCheckpointId = () => `cp-${(0, import_node_crypto2.randomUUID)()}`;
|
|
911
946
|
var createSessionId = () => `session-${(0, import_node_crypto2.randomUUID)()}`;
|
|
@@ -1009,7 +1044,11 @@ function createInMemorySessionCheckpointStore(options) {
|
|
|
1009
1044
|
async rollbackTo(id) {
|
|
1010
1045
|
const target = byId.get(id);
|
|
1011
1046
|
if (!target) {
|
|
1012
|
-
throw new
|
|
1047
|
+
throw new import_errors5.KortyxError("NOT_FOUND", `Checkpoint "${id}" not found.`, {
|
|
1048
|
+
category: "request",
|
|
1049
|
+
retryable: false,
|
|
1050
|
+
safeMessage: "The requested checkpoint was not found."
|
|
1051
|
+
});
|
|
1013
1052
|
}
|
|
1014
1053
|
const records = sortedRecords(target.sessionId);
|
|
1015
1054
|
const trailing = records.filter(
|
|
@@ -1037,7 +1076,11 @@ function createInMemorySessionCheckpointStore(options) {
|
|
|
1037
1076
|
async fork(id, options2) {
|
|
1038
1077
|
const source = byId.get(id);
|
|
1039
1078
|
if (!source) {
|
|
1040
|
-
throw new
|
|
1079
|
+
throw new import_errors5.KortyxError("NOT_FOUND", `Checkpoint "${id}" not found.`, {
|
|
1080
|
+
category: "request",
|
|
1081
|
+
retryable: false,
|
|
1082
|
+
safeMessage: "The requested checkpoint was not found."
|
|
1083
|
+
});
|
|
1041
1084
|
}
|
|
1042
1085
|
const sessionId = options2?.newSessionId || createSessionId();
|
|
1043
1086
|
const { parentCheckpointId: _parentCheckpointId, ...sourceRecord } = clone2(source);
|
|
@@ -1265,6 +1308,7 @@ async function resolveNodeHandler(args) {
|
|
|
1265
1308
|
|
|
1266
1309
|
// src/graph/call-workflow.ts
|
|
1267
1310
|
var import_core = require("@kortyx/core");
|
|
1311
|
+
var import_errors6 = require("@kortyx/core/errors");
|
|
1268
1312
|
var import_hooks = require("@kortyx/hooks");
|
|
1269
1313
|
var import_singletons = require("@langchain/core/singletons");
|
|
1270
1314
|
var import_langgraph = require("@langchain/langgraph");
|
|
@@ -1276,7 +1320,7 @@ function assertSequentialWorkflow(workflow) {
|
|
|
1276
1320
|
else group.plain++;
|
|
1277
1321
|
groups.set(from, group);
|
|
1278
1322
|
if (group.plain > 1 || group.plain > 0 && group.conditional > 0) {
|
|
1279
|
-
throw new
|
|
1323
|
+
throw new import_errors6.WorkflowContractError(
|
|
1280
1324
|
`Workflow '${workflow.id}' has parallel edges; child calls require sequential graphs.`
|
|
1281
1325
|
);
|
|
1282
1326
|
}
|
|
@@ -1289,23 +1333,27 @@ function createWorkflowCallService(config, parent, execution = {}) {
|
|
|
1289
1333
|
if (parent) assertSequentialWorkflow(parent);
|
|
1290
1334
|
const depth = (config.workflowCallDepth ?? 0) + 1;
|
|
1291
1335
|
if (depth > 16)
|
|
1292
|
-
throw new
|
|
1336
|
+
throw new import_errors6.WorkflowContractError(
|
|
1337
|
+
"Maximum child workflow depth (16) exceeded."
|
|
1338
|
+
);
|
|
1293
1339
|
const workflow = await config.selectWorkflow?.(args.workflow);
|
|
1294
1340
|
if (!workflow || workflow.id !== args.workflow)
|
|
1295
|
-
throw new
|
|
1341
|
+
throw new import_errors6.WorkflowContractError(
|
|
1342
|
+
`Workflow '${args.workflow}' is not registered.`
|
|
1343
|
+
);
|
|
1296
1344
|
if (!workflow.inputSchema || !workflow.outputSchema)
|
|
1297
|
-
throw new
|
|
1345
|
+
throw new import_errors6.WorkflowContractError(
|
|
1298
1346
|
`Callable workflow '${workflow.id}' requires inputSchema and outputSchema.`
|
|
1299
1347
|
);
|
|
1300
1348
|
if (args.definition && (args.definition.version !== workflow.version || args.definition.inputSchema !== workflow.inputSchema || args.definition.outputSchema !== workflow.outputSchema)) {
|
|
1301
|
-
throw new
|
|
1349
|
+
throw new import_errors6.WorkflowContractError(
|
|
1302
1350
|
"The typed workflow contract does not match the registered definition."
|
|
1303
1351
|
);
|
|
1304
1352
|
}
|
|
1305
1353
|
assertSequentialWorkflow(workflow);
|
|
1306
1354
|
const snapshot = args.snapshot;
|
|
1307
1355
|
if (snapshot && snapshot.version !== workflow.version)
|
|
1308
|
-
throw new
|
|
1356
|
+
throw new import_errors6.WorkflowContractError(
|
|
1309
1357
|
`Workflow '${workflow.id}' changed since the call was suspended.`
|
|
1310
1358
|
);
|
|
1311
1359
|
const input = snapshot ? void 0 : workflow.inputSchema.parse(args.input);
|
|
@@ -1361,14 +1409,12 @@ function createWorkflowCallService(config, parent, execution = {}) {
|
|
|
1361
1409
|
};
|
|
1362
1410
|
return;
|
|
1363
1411
|
}
|
|
1364
|
-
if (event === "error")
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
)
|
|
1369
|
-
);
|
|
1412
|
+
if (event === "error") {
|
|
1413
|
+
const failure = payload?.failure;
|
|
1414
|
+
throw (0, import_errors6.isFailureDescriptor)(failure) ? (0, import_errors6.errorFromFailure)(failure) : new Error("Child workflow failed.");
|
|
1415
|
+
}
|
|
1370
1416
|
if (event === "transition")
|
|
1371
|
-
throw new
|
|
1417
|
+
throw new import_errors6.WorkflowContractError(
|
|
1372
1418
|
"transitionTo is not supported inside child workflows; useWorkflow returns to its caller."
|
|
1373
1419
|
);
|
|
1374
1420
|
const value = payload;
|
|
@@ -1419,7 +1465,17 @@ function createWorkflowCallService(config, parent, execution = {}) {
|
|
|
1419
1465
|
})
|
|
1420
1466
|
);
|
|
1421
1467
|
} catch (error) {
|
|
1422
|
-
|
|
1468
|
+
(0, import_core.throwIfExecutionAborted)(execution.abortSignal);
|
|
1469
|
+
const checkpoint = await captureGraphSnapshot(saver, threadId).catch(
|
|
1470
|
+
(cause) => {
|
|
1471
|
+
if ((0, import_core.isExecutionLimitReached)(error))
|
|
1472
|
+
throw new import_errors6.PersistenceError(
|
|
1473
|
+
"Cannot checkpoint a suspended child workflow.",
|
|
1474
|
+
cause
|
|
1475
|
+
);
|
|
1476
|
+
return void 0;
|
|
1477
|
+
}
|
|
1478
|
+
);
|
|
1423
1479
|
const state = checkpoint?.checkpoint.channel_values;
|
|
1424
1480
|
const patch = error?.__kortyxHookStatePatch;
|
|
1425
1481
|
const usage = patch?.tokenUsage ?? state?.runtime.tokenUsage;
|
|
@@ -1450,7 +1506,9 @@ function createWorkflowCallService(config, parent, execution = {}) {
|
|
|
1450
1506
|
if (request) {
|
|
1451
1507
|
const checkpoint = await captureGraphSnapshot(saver, threadId);
|
|
1452
1508
|
if (!checkpoint)
|
|
1453
|
-
throw new
|
|
1509
|
+
throw new import_errors6.WorkflowContractError(
|
|
1510
|
+
"Child interrupted without a graph checkpoint."
|
|
1511
|
+
);
|
|
1454
1512
|
return {
|
|
1455
1513
|
status: "interrupted",
|
|
1456
1514
|
usage: request.meta?.__kortyxResumeStatePatch?.tokenUsage ?? result.runtime.tokenUsage,
|
|
@@ -1462,7 +1520,17 @@ function createWorkflowCallService(config, parent, execution = {}) {
|
|
|
1462
1520
|
}
|
|
1463
1521
|
};
|
|
1464
1522
|
}
|
|
1465
|
-
|
|
1523
|
+
let data;
|
|
1524
|
+
try {
|
|
1525
|
+
data = workflow.outputSchema.parse(result.data ?? {});
|
|
1526
|
+
} catch (cause) {
|
|
1527
|
+
if (!Array.isArray((0, import_errors6.errorProperty)(cause, "issues"))) throw cause;
|
|
1528
|
+
throw new import_errors6.ValidationError(
|
|
1529
|
+
"INVALID_OUTPUT",
|
|
1530
|
+
"Child output validation failed.",
|
|
1531
|
+
cause
|
|
1532
|
+
);
|
|
1533
|
+
}
|
|
1466
1534
|
(0, import_hooks.workflowCallFingerprint)(data);
|
|
1467
1535
|
return {
|
|
1468
1536
|
status: "completed",
|
|
@@ -1892,6 +1960,7 @@ function makeRequestId(prefix = "req") {
|
|
|
1892
1960
|
var import_promises2 = require("fs/promises");
|
|
1893
1961
|
var import_node_path2 = require("path");
|
|
1894
1962
|
var import_core3 = require("@kortyx/core");
|
|
1963
|
+
var import_errors7 = require("@kortyx/core/errors");
|
|
1895
1964
|
var DEFAULT_EXTENSIONS = [
|
|
1896
1965
|
".workflow.ts",
|
|
1897
1966
|
".workflow.mts",
|
|
@@ -1965,8 +2034,14 @@ function createFileWorkflowRegistry(options) {
|
|
|
1965
2034
|
const fallback = selectOptions?.fallbackId ?? fallbackId;
|
|
1966
2035
|
const selected = workflows[id] ?? (fallback ? workflows[fallback] : null);
|
|
1967
2036
|
if (!selected) {
|
|
1968
|
-
throw new
|
|
1969
|
-
|
|
2037
|
+
throw new import_errors7.KortyxError(
|
|
2038
|
+
"UNKNOWN_WORKFLOW",
|
|
2039
|
+
`No workflow found for id "${id}" and no fallback "${fallback}" workflow available`,
|
|
2040
|
+
{
|
|
2041
|
+
category: "request",
|
|
2042
|
+
retryable: false,
|
|
2043
|
+
safeMessage: "The requested workflow is not registered."
|
|
2044
|
+
}
|
|
1970
2045
|
);
|
|
1971
2046
|
}
|
|
1972
2047
|
return selected;
|
|
@@ -1984,6 +2059,7 @@ function createFileWorkflowRegistry(options) {
|
|
|
1984
2059
|
}
|
|
1985
2060
|
|
|
1986
2061
|
// src/registry/in-memory-registry.ts
|
|
2062
|
+
var import_errors8 = require("@kortyx/core/errors");
|
|
1987
2063
|
function createInMemoryWorkflowRegistry(workflows, options) {
|
|
1988
2064
|
const byId = /* @__PURE__ */ new Map();
|
|
1989
2065
|
for (const wf of workflows) byId.set(wf.id, wf);
|
|
@@ -1999,8 +2075,14 @@ function createInMemoryWorkflowRegistry(workflows, options) {
|
|
|
1999
2075
|
const fallback = selectOptions?.fallbackId ?? fallbackId;
|
|
2000
2076
|
const wf = byId.get(id) ?? (fallback ? byId.get(fallback) : void 0);
|
|
2001
2077
|
if (!wf) {
|
|
2002
|
-
throw new
|
|
2003
|
-
|
|
2078
|
+
throw new import_errors8.KortyxError(
|
|
2079
|
+
"UNKNOWN_WORKFLOW",
|
|
2080
|
+
`Workflow "${id}" not found${fallback ? ` (fallback "${fallback}" missing too)` : ""}.`,
|
|
2081
|
+
{
|
|
2082
|
+
category: "request",
|
|
2083
|
+
retryable: false,
|
|
2084
|
+
safeMessage: "The requested workflow is not registered."
|
|
2085
|
+
}
|
|
2004
2086
|
);
|
|
2005
2087
|
}
|
|
2006
2088
|
return wf;
|
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/pending-requests.ts","../src/framework/redis/pending-request-store.ts","../src/framework/redis/redis-checkpointer.ts","../src/framework/redis/redis-client.ts","../src/framework/redis/redis-store.ts","../src/framework/redis/session-checkpoint-store.ts","../src/framework/session-checkpoints.ts","../src/framework/adapter.ts","../src/framework/graph-snapshot.ts","../src/graph/create-execution-graph.ts","../src/node-loader.ts","../src/node-registry.ts","../src/graph/call-workflow.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 * from \"./framework/graph-snapshot\";\nexport * from \"./framework/pending-requests\";\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 { GraphState } from \"@kortyx/core\";\nimport type { GraphSnapshotBundle } from \"./graph-snapshot\";\n\nexport type HumanInputKind = \"choice\" | \"multi-choice\" | \"text\";\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 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 const store = new Map<string, PendingRequestRecord>();\n\n const prune = () => {\n const t = Date.now();\n for (const [k, v] of store.entries()) {\n if (t - v.createdAt > v.ttlMs) store.delete(k);\n }\n };\n\n return {\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 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 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 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 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 Error(\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 Error(\n 'Failed to put writes: missing \"thread_id\" in config.configurable.',\n );\n }\n if (!checkpointId) {\n throw new Error(\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 { connect as netConnect, type Socket } from \"node:net\";\nimport { type TLSSocket, connect as tlsConnect } from \"node:tls\";\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 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 buffer = Buffer.concat([buffer, chunk]);\n drainReplies();\n });\n\n s.on(\"error\", (err) => {\n ready = false;\n while (inflight.length) inflight.shift()?.reject(err);\n });\n\n s.on(\"close\", () => {\n ready = false;\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 Error(`Redis AUTH failed: ${(r as any).message}`);\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 Error(`Redis SELECT failed: ${(r as any).message}`);\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 command(cmd: string, args: string[] = []) {\n await ensureConnected();\n return send(cmd, args);\n },\n };\n}\n","import { 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 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 client: RedisClient = createRedisClient({ url: options.url });\n const prefix = options.prefix ?? \"kortyx:fw:\";\n\n const k = (key: string) => `${prefix}${key}`;\n\n return {\n async list(prefixKey) {\n const keys = 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 Error(`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)) throw new Error(`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 Error(`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 Error(`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 Error(`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 Error(`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 Error(`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 Error(`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 Error(`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)) throw new Error(`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 Error(`Redis DEL error: ${r.message}`);\n }\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\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) throw new Error(`Checkpoint \"${id}\" not found.`);\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) throw new Error(`Checkpoint \"${id}\" not found.`);\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 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};\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 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: (id: CheckpointId) => Promise<RollbackSessionCheckpointResult>;\n fork: (\n id: CheckpointId,\n options?: { newSessionId?: string },\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 Error(`Checkpoint \"${id}\" not found.`);\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 Error(`Checkpoint \"${id}\" not found.`);\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 { createInMemoryCheckpointSaver } from \"./in-memory-checkpointer\";\nimport {\n createInMemoryPendingRequestStore,\n type PendingRequestStore,\n} from \"./pending-requests\";\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\";\n pendingRequests: PendingRequestStore;\n sessionCheckpoints: SessionCheckpointStore;\n checkpointer: BaseCheckpointSaver;\n ttlMs: number;\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\nexport type CreateInMemoryFrameworkAdapterOptions = {\n ttlMs?: number;\n maxSessionCheckpoints?: number;\n};\n\nexport function createInMemoryFrameworkAdapter(\n options?: CreateInMemoryFrameworkAdapterOptions,\n): FrameworkAdapter {\n const ttlMs = options?.ttlMs ?? 15 * 60 * 1000;\n const checkpointer = createInMemoryCheckpointSaver();\n return {\n kind: \"in-memory\",\n ttlMs,\n pendingRequests: createInMemoryPendingRequestStore(),\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): FrameworkAdapter {\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 return {\n kind: \"redis\",\n ttlMs,\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}\n\nexport function createFrameworkAdapterFromEnv(\n env: Record<string, string | undefined> = process.env,\n): FrameworkAdapter {\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 (url)\n return createRedisFrameworkAdapter({ url, ...(ttlMs ? { ttlMs } : {}) });\n\n // Dev fallback: in-memory. Not production-safe for resume across processes.\n return createInMemoryFrameworkAdapter({ ...(ttlMs ? { ttlMs } : {}) });\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 { setTimeout as delay } from \"node:timers/promises\";\nimport type {\n GraphState,\n InterruptInput,\n InterruptResult,\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 type { KortyxTelemetryConfig, ReasonTraceAdapter } from \"@kortyx/hooks\";\nimport { runWithHookContext } from \"@kortyx/hooks\";\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\";\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\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 builder.addNode(nodeId, async (state: GraphState) => {\n throwIfExecutionAborted(execution.abortSignal);\n const emitRuntimeEvent = (event: string, payload: unknown) => {\n runtimeConfig.emit(event, payload);\n };\n let suspension: unknown;\n let deniedAdmission: unknown;\n const hookNodeContext = {\n completeResponse: runtimeConfig.workflowCallDepth\n ? undefined\n : execution.completeResponse,\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: (interruptConfig: InterruptInput): InterruptResult => {\n throwIfExecutionAborted(execution.abortSignal);\n if (execution.budget) assertExecutionBudget(execution.budget);\n const { kind, question } = interruptConfig;\n const isMulti =\n kind === \"multi-choice\" ||\n (interruptConfig.kind !== \"text\" &&\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 =\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 = interrupt(payload) as unknown;\n } catch (error) {\n suspension = error;\n emitRuntimeEvent(\"interrupt\", {\n node: nodeId,\n workflow: workflowName,\n input: payload,\n });\n throw error;\n }\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: {\n ...(runtimeConfig.telemetry?.metadata ?? {}),\n ...(context ?? {}),\n },\n tags: runtimeConfig.telemetry?.tags,\n captureContent: runtimeConfig.telemetry?.captureContent,\n },\n };\n const hookRun = activeTrace?.withSpan\n ? await activeTrace.withSpan(spanArgs, runNode)\n : await runNode();\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 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 return updates;\n });\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 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 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 type { WorkflowCallService } from \"@kortyx/hooks\";\nimport { workflowCallFingerprint } from \"@kortyx/hooks\";\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\nfunction assertSequentialWorkflow(workflow: WorkflowDefinition) {\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) group.conditional++;\n else group.plain++;\n groups.set(from, group);\n if (group.plain > 1 || (group.plain > 0 && group.conditional > 0)) {\n throw new Error(\n `Workflow '${workflow.id}' has parallel edges; child calls require sequential graphs.`,\n );\n }\n }\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 if (parent) assertSequentialWorkflow(parent);\n const depth = (config.workflowCallDepth ?? 0) + 1;\n if (depth > 16)\n throw new Error(\"Maximum child workflow depth (16) exceeded.\");\n const workflow = await config.selectWorkflow?.(args.workflow);\n if (!workflow || workflow.id !== args.workflow)\n throw new Error(`Workflow '${args.workflow}' is not registered.`);\n if (!workflow.inputSchema || !workflow.outputSchema)\n throw new Error(\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 Error(\n \"The typed workflow contract does not match the registered definition.\",\n );\n }\n assertSequentialWorkflow(workflow);\n const snapshot = args.snapshot as ChildSnapshot | undefined;\n if (snapshot && snapshot.version !== workflow.version)\n throw new Error(\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 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 throw new Error(\n String(\n (payload as { message?: unknown }).message ??\n \"Child workflow failed.\",\n ),\n );\n if (event === \"transition\")\n throw new Error(\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 const checkpoint = await captureGraphSnapshot(saver, threadId);\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 Error(\"Child interrupted without a graph checkpoint.\");\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 const data = workflow.outputSchema.parse(result.data ?? {});\n workflowCallFingerprint(data);\n return {\n status: \"completed\" as const,\n data,\n usage: result.runtime.tokenUsage,\n };\n };\n const trace = config.telemetry?.trace ?? config.reasonTrace;\n return trace?.withSpan\n ? trace.withSpan(\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 : execute();\n };\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 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 Error(\n `No workflow found for id \"${id}\" and no fallback \"${fallback}\" workflow available`,\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 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 Error(\n `Workflow \"${id}\" not found${fallback ? ` (fallback \"${fallback}\" missing too)` : \"\"}.`,\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":["import_langgraph_checkpoint","utf8Bytes","utf8String","jsonSerde","resolve","tlsConnect","netConnect","options","import_node_crypto","DEFAULT_MAX_CHECKPOINTS_PER_SESSION","createResumeToken","clone","toSummary","uniqueStrings","options","import_core","import_hooks","import_langgraph","delay","import_node_crypto","import_promises","import_node_path","import_core","module"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/framework/in-memory-checkpointer.ts","../src/checkpointer.ts","../src/framework/pending-requests.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/framework/graph-snapshot.ts","../src/graph/create-execution-graph.ts","../src/node-loader.ts","../src/node-registry.ts","../src/graph/call-workflow.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 * from \"./framework/graph-snapshot\";\nexport * from \"./framework/pending-requests\";\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 { GraphState } from \"@kortyx/core\";\nimport type { GraphSnapshotBundle } from \"./graph-snapshot\";\n\nexport type HumanInputKind = \"choice\" | \"multi-choice\" | \"text\";\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 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 const store = new Map<string, PendingRequestRecord>();\n\n const prune = () => {\n const t = Date.now();\n for (const [k, v] of store.entries()) {\n if (t - v.createdAt > v.ttlMs) store.delete(k);\n }\n };\n\n return {\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 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 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 async list(prefixKey) {\n const keys = 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 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 buffer = Buffer.concat([buffer, chunk]);\n drainReplies();\n });\n\n s.on(\"error\", (err) => {\n ready = false;\n while (inflight.length) inflight.shift()?.reject(err);\n });\n\n s.on(\"close\", () => {\n ready = false;\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 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};\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 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: (id: CheckpointId) => Promise<RollbackSessionCheckpointResult>;\n fork: (\n id: CheckpointId,\n options?: { newSessionId?: string },\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 { createInMemoryCheckpointSaver } from \"./in-memory-checkpointer\";\nimport {\n createInMemoryPendingRequestStore,\n type PendingRequestStore,\n} from \"./pending-requests\";\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\";\n pendingRequests: PendingRequestStore;\n sessionCheckpoints: SessionCheckpointStore;\n checkpointer: BaseCheckpointSaver;\n ttlMs: number;\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\nexport type CreateInMemoryFrameworkAdapterOptions = {\n ttlMs?: number;\n maxSessionCheckpoints?: number;\n};\n\nexport function createInMemoryFrameworkAdapter(\n options?: CreateInMemoryFrameworkAdapterOptions,\n): FrameworkAdapter {\n const ttlMs = options?.ttlMs ?? 15 * 60 * 1000;\n const checkpointer = createInMemoryCheckpointSaver();\n return {\n kind: \"in-memory\",\n ttlMs,\n pendingRequests: createInMemoryPendingRequestStore(),\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): FrameworkAdapter {\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 return {\n kind: \"redis\",\n ttlMs,\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}\n\nexport function createFrameworkAdapterFromEnv(\n env: Record<string, string | undefined> = process.env,\n): FrameworkAdapter {\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 (url)\n return createRedisFrameworkAdapter({ url, ...(ttlMs ? { ttlMs } : {}) });\n\n // Dev fallback: in-memory. Not production-safe for resume across processes.\n return createInMemoryFrameworkAdapter({ ...(ttlMs ? { ttlMs } : {}) });\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 { setTimeout as delay } from \"node:timers/promises\";\nimport type {\n GraphState,\n InterruptInput,\n InterruptResult,\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 type { KortyxTelemetryConfig, ReasonTraceAdapter } from \"@kortyx/hooks\";\nimport { runWithHookContext } from \"@kortyx/hooks\";\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\";\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\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 builder.addNode(nodeId, async (state: GraphState) => {\n throwIfExecutionAborted(execution.abortSignal);\n const emitRuntimeEvent = (event: string, payload: unknown) => {\n runtimeConfig.emit(event, payload);\n };\n let suspension: unknown;\n let deniedAdmission: unknown;\n const hookNodeContext = {\n completeResponse: runtimeConfig.workflowCallDepth\n ? undefined\n : execution.completeResponse,\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: (interruptConfig: InterruptInput): InterruptResult => {\n throwIfExecutionAborted(execution.abortSignal);\n if (execution.budget) assertExecutionBudget(execution.budget);\n const { kind, question } = interruptConfig;\n const isMulti =\n kind === \"multi-choice\" ||\n (interruptConfig.kind !== \"text\" &&\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 =\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 = interrupt(payload) as unknown;\n } catch (error) {\n suspension = error;\n emitRuntimeEvent(\"interrupt\", {\n node: nodeId,\n workflow: workflowName,\n input: payload,\n });\n throw error;\n }\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: {\n ...(runtimeConfig.telemetry?.metadata ?? {}),\n ...(context ?? {}),\n },\n tags: runtimeConfig.telemetry?.tags,\n captureContent: runtimeConfig.telemetry?.captureContent,\n },\n };\n const hookRun = activeTrace?.withSpan\n ? await activeTrace.withSpan(spanArgs, runNode)\n : await runNode();\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 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 return updates;\n });\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 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 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 { 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\nfunction assertSequentialWorkflow(workflow: WorkflowDefinition) {\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) group.conditional++;\n else group.plain++;\n groups.set(from, group);\n if (group.plain > 1 || (group.plain > 0 && group.conditional > 0)) {\n throw new WorkflowContractError(\n `Workflow '${workflow.id}' has parallel edges; child calls require sequential graphs.`,\n );\n }\n }\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 if (parent) assertSequentialWorkflow(parent);\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 assertSequentialWorkflow(workflow);\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 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 usage: result.runtime.tokenUsage,\n };\n };\n const trace = config.telemetry?.trace ?? config.reasonTrace;\n return trace?.withSpan\n ? trace.withSpan(\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 : execute();\n };\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":["import_langgraph_checkpoint","utf8Bytes","utf8String","jsonSerde","import_errors","import_errors","resolve","tlsConnect","netConnect","import_errors","options","import_node_crypto","import_errors","DEFAULT_MAX_CHECKPOINTS_PER_SESSION","createResumeToken","clone","toSummary","uniqueStrings","options","import_core","import_hooks","import_langgraph","import_errors","delay","import_node_crypto","import_promises","import_node_path","import_core","import_errors","module","import_errors"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kortyx/runtime",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Runtime/orchestration wiring for Kortyx.",
|
|
6
6
|
"keywords": [
|
|
@@ -36,11 +36,11 @@
|
|
|
36
36
|
"@langchain/langgraph": "^1.1.4",
|
|
37
37
|
"@langchain/langgraph-checkpoint": "^1.0.0",
|
|
38
38
|
"zod": "^4.3.6",
|
|
39
|
-
"@kortyx/stream": "0.
|
|
40
|
-
"@kortyx/
|
|
41
|
-
"@kortyx/
|
|
42
|
-
"@kortyx/
|
|
43
|
-
"@kortyx/
|
|
39
|
+
"@kortyx/stream": "0.12.0",
|
|
40
|
+
"@kortyx/core": "0.9.0",
|
|
41
|
+
"@kortyx/hooks": "0.25.1",
|
|
42
|
+
"@kortyx/providers": "0.7.0",
|
|
43
|
+
"@kortyx/utils": "0.3.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"turbo": "2.6.1",
|