@langchain/langgraph 1.3.7 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/dist/channels/base.cjs +78 -2
  2. package/dist/channels/base.cjs.map +1 -1
  3. package/dist/channels/base.d.cts +35 -2
  4. package/dist/channels/base.d.cts.map +1 -1
  5. package/dist/channels/base.d.ts +35 -2
  6. package/dist/channels/base.d.ts.map +1 -1
  7. package/dist/channels/base.js +77 -4
  8. package/dist/channels/base.js.map +1 -1
  9. package/dist/channels/delta.cjs +136 -0
  10. package/dist/channels/delta.cjs.map +1 -0
  11. package/dist/channels/delta.d.cts +99 -0
  12. package/dist/channels/delta.d.cts.map +1 -0
  13. package/dist/channels/delta.d.ts +99 -0
  14. package/dist/channels/delta.d.ts.map +1 -0
  15. package/dist/channels/delta.js +136 -0
  16. package/dist/channels/delta.js.map +1 -0
  17. package/dist/channels/index.cjs +5 -0
  18. package/dist/channels/index.d.cts +3 -2
  19. package/dist/channels/index.d.ts +3 -2
  20. package/dist/channels/index.js +3 -2
  21. package/dist/constants.cjs +62 -4
  22. package/dist/constants.cjs.map +1 -1
  23. package/dist/constants.d.cts +33 -2
  24. package/dist/constants.d.cts.map +1 -1
  25. package/dist/constants.d.ts +33 -2
  26. package/dist/constants.d.ts.map +1 -1
  27. package/dist/constants.js +59 -5
  28. package/dist/constants.js.map +1 -1
  29. package/dist/errors.cjs +128 -0
  30. package/dist/errors.cjs.map +1 -1
  31. package/dist/errors.d.cts +86 -1
  32. package/dist/errors.d.cts.map +1 -1
  33. package/dist/errors.d.ts +86 -1
  34. package/dist/errors.d.ts.map +1 -1
  35. package/dist/errors.js +123 -1
  36. package/dist/errors.js.map +1 -1
  37. package/dist/func/index.cjs +9 -2
  38. package/dist/func/index.cjs.map +1 -1
  39. package/dist/func/index.d.cts +14 -0
  40. package/dist/func/index.d.cts.map +1 -1
  41. package/dist/func/index.d.ts +14 -0
  42. package/dist/func/index.d.ts.map +1 -1
  43. package/dist/func/index.js +9 -2
  44. package/dist/func/index.js.map +1 -1
  45. package/dist/graph/graph.cjs +44 -7
  46. package/dist/graph/graph.cjs.map +1 -1
  47. package/dist/graph/graph.d.cts +24 -2
  48. package/dist/graph/graph.d.cts.map +1 -1
  49. package/dist/graph/graph.d.ts +24 -2
  50. package/dist/graph/graph.d.ts.map +1 -1
  51. package/dist/graph/graph.js +44 -7
  52. package/dist/graph/graph.js.map +1 -1
  53. package/dist/graph/index.d.ts +3 -3
  54. package/dist/graph/messages_reducer.cjs +55 -0
  55. package/dist/graph/messages_reducer.cjs.map +1 -1
  56. package/dist/graph/messages_reducer.d.cts +28 -1
  57. package/dist/graph/messages_reducer.d.cts.map +1 -1
  58. package/dist/graph/messages_reducer.d.ts +28 -1
  59. package/dist/graph/messages_reducer.d.ts.map +1 -1
  60. package/dist/graph/messages_reducer.js +56 -2
  61. package/dist/graph/messages_reducer.js.map +1 -1
  62. package/dist/graph/state.cjs +174 -7
  63. package/dist/graph/state.cjs.map +1 -1
  64. package/dist/graph/state.d.cts +193 -17
  65. package/dist/graph/state.d.cts.map +1 -1
  66. package/dist/graph/state.d.ts +193 -17
  67. package/dist/graph/state.d.ts.map +1 -1
  68. package/dist/graph/state.js +175 -8
  69. package/dist/graph/state.js.map +1 -1
  70. package/dist/graph/zod/schema.cjs +5 -0
  71. package/dist/graph/zod/schema.cjs.map +1 -1
  72. package/dist/graph/zod/schema.d.cts.map +1 -1
  73. package/dist/graph/zod/schema.d.ts.map +1 -1
  74. package/dist/graph/zod/schema.js +5 -0
  75. package/dist/graph/zod/schema.js.map +1 -1
  76. package/dist/index.cjs +11 -0
  77. package/dist/index.cjs.map +1 -1
  78. package/dist/index.d.cts +11 -8
  79. package/dist/index.d.ts +11 -8
  80. package/dist/index.js +5 -3
  81. package/dist/index.js.map +1 -1
  82. package/dist/prebuilt/react_agent_executor.d.cts +1 -1
  83. package/dist/pregel/algo.cjs +182 -21
  84. package/dist/pregel/algo.cjs.map +1 -1
  85. package/dist/pregel/algo.d.cts +1 -1
  86. package/dist/pregel/algo.d.cts.map +1 -1
  87. package/dist/pregel/algo.d.ts +1 -1
  88. package/dist/pregel/algo.d.ts.map +1 -1
  89. package/dist/pregel/algo.js +185 -25
  90. package/dist/pregel/algo.js.map +1 -1
  91. package/dist/pregel/call.cjs +2 -1
  92. package/dist/pregel/call.cjs.map +1 -1
  93. package/dist/pregel/call.js +2 -1
  94. package/dist/pregel/call.js.map +1 -1
  95. package/dist/pregel/index.cjs +15 -3
  96. package/dist/pregel/index.cjs.map +1 -1
  97. package/dist/pregel/index.d.cts.map +1 -1
  98. package/dist/pregel/index.d.ts.map +1 -1
  99. package/dist/pregel/index.js +17 -5
  100. package/dist/pregel/index.js.map +1 -1
  101. package/dist/pregel/loop.cjs +362 -41
  102. package/dist/pregel/loop.cjs.map +1 -1
  103. package/dist/pregel/loop.js +365 -44
  104. package/dist/pregel/loop.js.map +1 -1
  105. package/dist/pregel/messages-v2.cjs +1 -1
  106. package/dist/pregel/messages-v2.js +1 -1
  107. package/dist/pregel/messages.cjs +1 -1
  108. package/dist/pregel/messages.js +1 -1
  109. package/dist/pregel/read.cjs +15 -5
  110. package/dist/pregel/read.cjs.map +1 -1
  111. package/dist/pregel/read.d.cts +9 -0
  112. package/dist/pregel/read.d.cts.map +1 -1
  113. package/dist/pregel/read.d.ts +9 -0
  114. package/dist/pregel/read.d.ts.map +1 -1
  115. package/dist/pregel/read.js +15 -5
  116. package/dist/pregel/read.js.map +1 -1
  117. package/dist/pregel/remote-run-stream.cjs +107 -0
  118. package/dist/pregel/remote-run-stream.cjs.map +1 -0
  119. package/dist/pregel/remote-run-stream.d.cts +33 -0
  120. package/dist/pregel/remote-run-stream.d.cts.map +1 -0
  121. package/dist/pregel/remote-run-stream.d.ts +33 -0
  122. package/dist/pregel/remote-run-stream.d.ts.map +1 -0
  123. package/dist/pregel/remote-run-stream.js +107 -0
  124. package/dist/pregel/remote-run-stream.js.map +1 -0
  125. package/dist/pregel/remote.cjs +61 -1
  126. package/dist/pregel/remote.cjs.map +1 -1
  127. package/dist/pregel/remote.d.cts +17 -0
  128. package/dist/pregel/remote.d.cts.map +1 -1
  129. package/dist/pregel/remote.d.ts +17 -0
  130. package/dist/pregel/remote.d.ts.map +1 -1
  131. package/dist/pregel/remote.js +61 -1
  132. package/dist/pregel/remote.js.map +1 -1
  133. package/dist/pregel/replay.cjs +62 -0
  134. package/dist/pregel/replay.cjs.map +1 -0
  135. package/dist/pregel/replay.js +62 -0
  136. package/dist/pregel/replay.js.map +1 -0
  137. package/dist/pregel/retry.cjs +8 -6
  138. package/dist/pregel/retry.cjs.map +1 -1
  139. package/dist/pregel/retry.js +8 -6
  140. package/dist/pregel/retry.js.map +1 -1
  141. package/dist/pregel/runnable_types.d.cts +20 -0
  142. package/dist/pregel/runnable_types.d.cts.map +1 -1
  143. package/dist/pregel/runnable_types.d.ts +20 -0
  144. package/dist/pregel/runnable_types.d.ts.map +1 -1
  145. package/dist/pregel/runner.cjs +48 -7
  146. package/dist/pregel/runner.cjs.map +1 -1
  147. package/dist/pregel/runner.js +50 -9
  148. package/dist/pregel/runner.js.map +1 -1
  149. package/dist/pregel/runtime.cjs +64 -0
  150. package/dist/pregel/runtime.cjs.map +1 -0
  151. package/dist/pregel/runtime.d.cts +57 -0
  152. package/dist/pregel/runtime.d.cts.map +1 -0
  153. package/dist/pregel/runtime.d.ts +57 -0
  154. package/dist/pregel/runtime.d.ts.map +1 -0
  155. package/dist/pregel/runtime.js +64 -0
  156. package/dist/pregel/runtime.js.map +1 -0
  157. package/dist/pregel/stream.cjs +2 -0
  158. package/dist/pregel/stream.cjs.map +1 -1
  159. package/dist/pregel/stream.js +2 -0
  160. package/dist/pregel/stream.js.map +1 -1
  161. package/dist/pregel/timeout.cjs +216 -0
  162. package/dist/pregel/timeout.cjs.map +1 -0
  163. package/dist/pregel/timeout.js +216 -0
  164. package/dist/pregel/timeout.js.map +1 -0
  165. package/dist/pregel/types.cjs +3 -1
  166. package/dist/pregel/types.cjs.map +1 -1
  167. package/dist/pregel/types.d.cts +13 -0
  168. package/dist/pregel/types.d.cts.map +1 -1
  169. package/dist/pregel/types.d.ts +14 -1
  170. package/dist/pregel/types.d.ts.map +1 -1
  171. package/dist/pregel/types.js +3 -1
  172. package/dist/pregel/types.js.map +1 -1
  173. package/dist/pregel/utils/config.cjs +3 -1
  174. package/dist/pregel/utils/config.cjs.map +1 -1
  175. package/dist/pregel/utils/config.d.cts.map +1 -1
  176. package/dist/pregel/utils/config.d.ts.map +1 -1
  177. package/dist/pregel/utils/config.js +3 -1
  178. package/dist/pregel/utils/config.js.map +1 -1
  179. package/dist/pregel/utils/index.cjs +1 -0
  180. package/dist/pregel/utils/index.cjs.map +1 -1
  181. package/dist/pregel/utils/index.d.cts +6 -1
  182. package/dist/pregel/utils/index.d.cts.map +1 -1
  183. package/dist/pregel/utils/index.d.ts +6 -1
  184. package/dist/pregel/utils/index.d.ts.map +1 -1
  185. package/dist/pregel/utils/index.js +1 -0
  186. package/dist/pregel/utils/index.js.map +1 -1
  187. package/dist/pregel/utils/timeout.cjs +34 -0
  188. package/dist/pregel/utils/timeout.cjs.map +1 -0
  189. package/dist/pregel/utils/timeout.d.cts +45 -0
  190. package/dist/pregel/utils/timeout.d.cts.map +1 -0
  191. package/dist/pregel/utils/timeout.d.ts +45 -0
  192. package/dist/pregel/utils/timeout.d.ts.map +1 -0
  193. package/dist/pregel/utils/timeout.js +34 -0
  194. package/dist/pregel/utils/timeout.js.map +1 -0
  195. package/dist/web.cjs +11 -0
  196. package/dist/web.d.cts +11 -8
  197. package/dist/web.d.ts +11 -8
  198. package/dist/web.js +5 -3
  199. package/package.json +5 -5
@@ -1,6 +1,6 @@
1
- import { CACHE_NS_WRITES, CONFIG_KEY_CHECKPOINTER, CONFIG_KEY_CHECKPOINT_MAP, CONFIG_KEY_PREVIOUS_STATE, CONFIG_KEY_READ, CONFIG_KEY_RESUME_MAP, CONFIG_KEY_SCRATCHPAD, CONFIG_KEY_SEND, CONFIG_KEY_TASK_ID, ERROR, INTERRUPT, NO_WRITES, PREVIOUS, PULL, PUSH, RESERVED, RESUME, RETURN, Send, TAG_HIDDEN, TASKS, _isSend, _isSendInterface } from "../constants.js";
2
- import { EmptyChannelError, InvalidUpdateError } from "../errors.js";
3
- import { createCheckpoint, emptyChannels, getOnlyChannels } from "../channels/base.js";
1
+ import { CACHE_NS_WRITES, CONFIG_KEY_CHECKPOINTER, CONFIG_KEY_CHECKPOINT_MAP, CONFIG_KEY_NODE_ERROR, CONFIG_KEY_PREVIOUS_STATE, CONFIG_KEY_READ, CONFIG_KEY_RESUME_MAP, CONFIG_KEY_SCRATCHPAD, CONFIG_KEY_SEND, CONFIG_KEY_TASK_ID, ERROR, ERROR_SOURCE_NODE, INTERRUPT, NO_WRITES, PREVIOUS, PULL, PUSH, RESERVED, RESUME, RETURN, Send, TAG_HIDDEN, TASKS, _isSend, _isSendInterface } from "../constants.js";
2
+ import { EmptyChannelError, InvalidUpdateError, NodeError } from "../errors.js";
3
+ import { createCheckpoint, emptyChannels, getOnlyChannels, isDeltaChannel } from "../channels/base.js";
4
4
  import { XXH3 } from "../hash.js";
5
5
  import { readChannel, readChannels } from "./io.js";
6
6
  import { isCall } from "./types.js";
@@ -53,7 +53,13 @@ function _localRead(checkpoint, channels, task, select, fresh = false) {
53
53
  let values;
54
54
  if (fresh && updated.size > 0) {
55
55
  const localChannels = Object.fromEntries(Object.entries(channels).filter(([k, _]) => updated.has(k)));
56
- const newCheckpoint = createCheckpoint(checkpoint, localChannels, -1);
56
+ const channelsToSnapshot = /* @__PURE__ */ new Set();
57
+ for (const k in localChannels) {
58
+ if (!Object.prototype.hasOwnProperty.call(localChannels, k)) continue;
59
+ const ch = localChannels[k];
60
+ if (isDeltaChannel(ch) && ch.isAvailable()) channelsToSnapshot.add(k);
61
+ }
62
+ const newCheckpoint = createCheckpoint(checkpoint, localChannels, -1, { channelsToSnapshot });
57
63
  const newChannels = emptyChannels(localChannels, newCheckpoint);
58
64
  _applyWrites(copyCheckpoint(newCheckpoint), newChannels, [task], void 0, void 0);
59
65
  values = readChannels({
@@ -76,26 +82,34 @@ const IGNORE = new Set([
76
82
  RESUME,
77
83
  INTERRUPT,
78
84
  RETURN,
79
- ERROR
85
+ ERROR,
86
+ ERROR_SOURCE_NODE
80
87
  ]);
88
+ const RESERVED_SET = new Set(RESERVED);
81
89
  function _applyWrites(checkpoint, channels, tasks, getNextVersion, triggerToNodes) {
90
+ const pathCache = /* @__PURE__ */ new Map();
91
+ for (const task of tasks) pathCache.set(task, task.path?.slice(0, 3) || []);
82
92
  tasks.sort((a, b) => {
83
- const aPath = a.path?.slice(0, 3) || [];
84
- const bPath = b.path?.slice(0, 3) || [];
93
+ const aPath = pathCache.get(a);
94
+ const bPath = pathCache.get(b);
85
95
  for (let i = 0; i < Math.min(aPath.length, bPath.length); i += 1) {
86
96
  if (aPath[i] < bPath[i]) return -1;
87
97
  if (aPath[i] > bPath[i]) return 1;
88
98
  }
89
99
  return aPath.length - bPath.length;
90
100
  });
91
- const bumpStep = tasks.some((task) => task.triggers.length > 0);
92
101
  const onlyChannels = getOnlyChannels(channels);
102
+ let bumpStep = false;
103
+ const channelsToConsume = /* @__PURE__ */ new Set();
93
104
  for (const task of tasks) {
105
+ if (task.triggers.length > 0) bumpStep = true;
94
106
  checkpoint.versions_seen[task.name] ??= {};
95
- for (const chan of task.triggers) if (chan in checkpoint.channel_versions) checkpoint.versions_seen[task.name][chan] = checkpoint.channel_versions[chan];
107
+ for (const chan of task.triggers) {
108
+ if (chan in checkpoint.channel_versions) checkpoint.versions_seen[task.name][chan] = checkpoint.channel_versions[chan];
109
+ if (!RESERVED_SET.has(chan)) channelsToConsume.add(chan);
110
+ }
96
111
  }
97
112
  let maxVersion = maxChannelMapVersion(checkpoint.channel_versions);
98
- const channelsToConsume = new Set(tasks.flatMap((task) => task.triggers).filter((chan) => !RESERVED.includes(chan)));
99
113
  let usedNewVersion = false;
100
114
  for (const chan of channelsToConsume) if (chan in onlyChannels && onlyChannels[chan].consume()) {
101
115
  if (getNextVersion !== void 0) {
@@ -167,22 +181,53 @@ function* candidateNodes(checkpoint, processes, extra) {
167
181
  }
168
182
  }
169
183
  /**
184
+ * Build an index over pendingWrites for O(1) lookups.
185
+ *
186
+ * @internal Exported for benchmarks and regression tests only.
187
+ */
188
+ function _indexPendingWrites(pendingWrites) {
189
+ let nullResume;
190
+ const resumeByTaskId = /* @__PURE__ */ new Map();
191
+ const successfulWriteTaskIds = /* @__PURE__ */ new Set();
192
+ if (pendingWrites) for (const [tid, chan, val] of pendingWrites) {
193
+ if (tid === "00000000-0000-0000-0000-000000000000" && chan === "__resume__" && nullResume === void 0) nullResume = val;
194
+ if (chan === "__resume__" && tid !== "00000000-0000-0000-0000-000000000000") {
195
+ let arr = resumeByTaskId.get(tid);
196
+ if (!arr) {
197
+ arr = [];
198
+ resumeByTaskId.set(tid, arr);
199
+ }
200
+ arr.push(val);
201
+ }
202
+ if (chan !== "__error__") successfulWriteTaskIds.add(tid);
203
+ }
204
+ return {
205
+ nullResume,
206
+ resumeByTaskId,
207
+ successfulWriteTaskIds
208
+ };
209
+ }
210
+ /**
170
211
  * Prepare the set of tasks that will make up the next Pregel step.
171
212
  * This is the union of all PUSH tasks (Sends) and PULL tasks (nodes triggered
172
213
  * by edges).
173
214
  */
174
215
  function _prepareNextTasks(checkpoint, pendingWrites, processes, channels, config, forExecution, extra) {
175
216
  const tasks = {};
217
+ const indexedExtra = extra.pendingWritesIndex ? extra : {
218
+ ...extra,
219
+ pendingWritesIndex: _indexPendingWrites(pendingWrites)
220
+ };
176
221
  const tasksChannel = channels[TASKS];
177
222
  if (tasksChannel?.isAvailable()) {
178
223
  const len = tasksChannel.get().length;
179
224
  for (let i = 0; i < len; i += 1) {
180
- const task = _prepareSingleTask([PUSH, i], checkpoint, pendingWrites, processes, channels, config, forExecution, extra);
225
+ const task = _prepareSingleTask([PUSH, i], checkpoint, pendingWrites, processes, channels, config, forExecution, indexedExtra);
181
226
  if (task !== void 0) tasks[task.id] = task;
182
227
  }
183
228
  }
184
- for (const name of candidateNodes(checkpoint, processes, extra)) {
185
- const task = _prepareSingleTask([PULL, name], checkpoint, pendingWrites, processes, channels, config, forExecution, extra);
229
+ for (const name of candidateNodes(checkpoint, processes, indexedExtra)) {
230
+ const task = _prepareSingleTask([PULL, name], checkpoint, pendingWrites, processes, channels, config, forExecution, indexedExtra);
186
231
  if (task !== void 0) tasks[task.id] = task;
187
232
  }
188
233
  return tasks;
@@ -259,7 +304,8 @@ function _prepareSingleTask(taskPath, checkpoint, pendingWrites, processes, chan
259
304
  taskId: id,
260
305
  currentTaskInput: call.input,
261
306
  resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],
262
- namespaceHash: XXH3(taskCheckpointNamespace)
307
+ namespaceHash: XXH3(taskCheckpointNamespace),
308
+ pendingWritesIndex: extra.pendingWritesIndex
263
309
  }),
264
310
  [CONFIG_KEY_PREVIOUS_STATE]: checkpoint.channel_values[PREVIOUS],
265
311
  checkpoint_id: void 0,
@@ -277,7 +323,8 @@ function _prepareSingleTask(taskPath, checkpoint, pendingWrites, processes, chan
277
323
  } : void 0,
278
324
  id,
279
325
  path: outputTaskPath,
280
- writers: []
326
+ writers: [],
327
+ timeout: call.timeout
281
328
  };
282
329
  } else return {
283
330
  id,
@@ -290,7 +337,7 @@ function _prepareSingleTask(taskPath, checkpoint, pendingWrites, processes, chan
290
337
  if (!channels["__pregel_tasks"]?.isAvailable()) return;
291
338
  const sends = channels[TASKS].get();
292
339
  if (index < 0 || index >= sends.length) return;
293
- const packet = _isSendInterface(sends[index]) && !_isSend(sends[index]) ? new Send(sends[index].node, sends[index].args) : sends[index];
340
+ const packet = _isSendInterface(sends[index]) && !_isSend(sends[index]) ? new Send(sends[index].node, sends[index].args, sends[index].timeout !== void 0 ? { timeout: sends[index].timeout } : void 0) : sends[index];
294
341
  if (!_isSendInterface(packet)) {
295
342
  console.warn(`Ignoring invalid packet ${JSON.stringify(packet)} in pending sends.`);
296
343
  return;
@@ -367,7 +414,8 @@ function _prepareSingleTask(taskPath, checkpoint, pendingWrites, processes, chan
367
414
  taskId,
368
415
  currentTaskInput: packet.args,
369
416
  resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],
370
- namespaceHash: XXH3(taskCheckpointNamespace)
417
+ namespaceHash: XXH3(taskCheckpointNamespace),
418
+ pendingWritesIndex: extra.pendingWritesIndex
371
419
  }),
372
420
  [CONFIG_KEY_PREVIOUS_STATE]: checkpoint.channel_values[PREVIOUS],
373
421
  checkpoint_id: void 0,
@@ -389,7 +437,8 @@ function _prepareSingleTask(taskPath, checkpoint, pendingWrites, processes, chan
389
437
  } : void 0,
390
438
  id: taskId,
391
439
  path: taskPath,
392
- writers: proc.getWriters()
440
+ writers: proc.getWriters(),
441
+ timeout: packet.timeout ?? proc.timeout
393
442
  };
394
443
  }
395
444
  } else return {
@@ -411,7 +460,7 @@ function _prepareSingleTask(taskPath, checkpoint, pendingWrites, processes, chan
411
460
  PULL,
412
461
  name
413
462
  ]), checkpoint.id);
414
- if (pendingWrites.some((w) => w[0] === taskId && w[1] !== "__error__")) return;
463
+ if (extra.pendingWritesIndex ? extra.pendingWritesIndex.successfulWriteTaskIds.has(taskId) : pendingWrites.some((w) => w[0] === taskId && w[1] !== "__error__")) return;
415
464
  }
416
465
  const nullVersion = getNullChannelVersion(checkpoint.channel_versions);
417
466
  if (nullVersion === void 0) return;
@@ -491,7 +540,8 @@ function _prepareSingleTask(taskPath, checkpoint, pendingWrites, processes, chan
491
540
  taskId,
492
541
  currentTaskInput: val,
493
542
  resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],
494
- namespaceHash: XXH3(taskCheckpointNamespace)
543
+ namespaceHash: XXH3(taskCheckpointNamespace),
544
+ pendingWritesIndex: extra.pendingWritesIndex
495
545
  }),
496
546
  [CONFIG_KEY_PREVIOUS_STATE]: checkpoint.channel_values[PREVIOUS],
497
547
  checkpoint_id: void 0,
@@ -513,7 +563,8 @@ function _prepareSingleTask(taskPath, checkpoint, pendingWrites, processes, chan
513
563
  } : void 0,
514
564
  id: taskId,
515
565
  path: taskPath,
516
- writers: proc.getWriters()
566
+ writers: proc.getWriters(),
567
+ timeout: proc.timeout
517
568
  };
518
569
  }
519
570
  } else return {
@@ -526,6 +577,115 @@ function _prepareSingleTask(taskPath, checkpoint, pendingWrites, processes, chan
526
577
  }
527
578
  }
528
579
  /**
580
+ * Prepare an immediate node-level error handler task for a failed task.
581
+ *
582
+ * The handler runs only after the failed node's retry policy is exhausted (the
583
+ * runner schedules it once a non-bubble-up error settles). It is prepared like
584
+ * a PUSH task targeting the auto-generated handler node, receives the failed
585
+ * node's input, and is injected with a {@link NodeError} under
586
+ * {@link CONFIG_KEY_NODE_ERROR} so the handler can inspect the failure
587
+ * provenance (and route via `Command({ goto })`).
588
+ *
589
+ * @internal
590
+ */
591
+ function _prepareNodeErrorHandlerTask(failedTask, handlerNodeName, error, checkpoint, pendingWrites, processes, channels, config, extra) {
592
+ const { step, checkpointer, manager } = extra;
593
+ const proc = processes[handlerNodeName];
594
+ if (proc === void 0) return;
595
+ const node = proc.getNode();
596
+ if (node === void 0) return;
597
+ const configurable = config.configurable ?? {};
598
+ const parentNamespace = configurable.checkpoint_ns ?? "";
599
+ const triggers = [PUSH];
600
+ const checkpointNamespace = parentNamespace === "" ? handlerNodeName : `${parentNamespace}|${handlerNodeName}`;
601
+ const taskId = uuid5(JSON.stringify([
602
+ checkpointNamespace,
603
+ step.toString(),
604
+ handlerNodeName,
605
+ PUSH,
606
+ "node_error_handler",
607
+ failedTask.id
608
+ ]), checkpoint.id);
609
+ const taskCheckpointNamespace = `${checkpointNamespace}:${taskId}`;
610
+ const taskPath = [
611
+ PUSH,
612
+ String(failedTask.name),
613
+ handlerNodeName,
614
+ false
615
+ ];
616
+ let metadata = {
617
+ langgraph_step: step,
618
+ langgraph_node: handlerNodeName,
619
+ langgraph_triggers: triggers,
620
+ langgraph_path: taskPath,
621
+ langgraph_checkpoint_ns: taskCheckpointNamespace,
622
+ checkpoint_ns: taskCheckpointNamespace
623
+ };
624
+ if (proc.metadata !== void 0) metadata = {
625
+ ...metadata,
626
+ ...proc.metadata
627
+ };
628
+ const writes = [];
629
+ const executionInfo = {
630
+ checkpointId: checkpoint.id,
631
+ checkpointNs: taskCheckpointNamespace,
632
+ taskId,
633
+ threadId: configurable.thread_id,
634
+ runId: config.runId != null ? String(config.runId) : void 0,
635
+ nodeAttempt: 1
636
+ };
637
+ return {
638
+ name: handlerNodeName,
639
+ input: failedTask.input,
640
+ proc: node,
641
+ subgraphs: proc.subgraphs,
642
+ writes,
643
+ config: {
644
+ ...patchConfig(mergeConfigs(config, {
645
+ metadata,
646
+ tags: proc.tags,
647
+ store: extra.store ?? config.store
648
+ }), {
649
+ runName: handlerNodeName,
650
+ callbacks: manager?.getChild(`graph:step:${step}`),
651
+ configurable: {
652
+ [CONFIG_KEY_TASK_ID]: taskId,
653
+ [CONFIG_KEY_SEND]: (writes_) => _localWrite((items) => writes.push(...items), processes, writes_),
654
+ [CONFIG_KEY_READ]: (select_, fresh_ = false) => _localRead(checkpoint, channels, {
655
+ name: handlerNodeName,
656
+ writes,
657
+ triggers,
658
+ path: taskPath
659
+ }, select_, fresh_),
660
+ [CONFIG_KEY_CHECKPOINTER]: checkpointer ?? configurable["__pregel_checkpointer"],
661
+ [CONFIG_KEY_CHECKPOINT_MAP]: {
662
+ ...configurable[CONFIG_KEY_CHECKPOINT_MAP],
663
+ [parentNamespace]: checkpoint.id
664
+ },
665
+ [CONFIG_KEY_SCRATCHPAD]: _scratchpad({
666
+ pendingWrites: pendingWrites ?? [],
667
+ taskId,
668
+ currentTaskInput: failedTask.input,
669
+ resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],
670
+ namespaceHash: XXH3(taskCheckpointNamespace)
671
+ }),
672
+ [CONFIG_KEY_PREVIOUS_STATE]: checkpoint.channel_values[PREVIOUS],
673
+ [CONFIG_KEY_NODE_ERROR]: new NodeError(String(failedTask.name), error),
674
+ checkpoint_id: void 0,
675
+ checkpoint_ns: taskCheckpointNamespace
676
+ }
677
+ }),
678
+ executionInfo
679
+ },
680
+ triggers,
681
+ retry_policy: proc.retryPolicy,
682
+ cache_key: void 0,
683
+ id: taskId,
684
+ path: taskPath,
685
+ writers: proc.getWriters()
686
+ };
687
+ }
688
+ /**
529
689
  * Function injected under CONFIG_KEY_READ in task config, to read current state.
530
690
  * Used by conditional edges to read a copy of the state with reflecting the writes
531
691
  * from that node only.
@@ -581,13 +741,13 @@ function sanitizeUntrackedValuesInSend(packet, channels) {
581
741
  }
582
742
  return new Send(packet.node, sanitizedArg);
583
743
  }
584
- function _scratchpad({ pendingWrites, taskId, currentTaskInput, resumeMap, namespaceHash }) {
585
- const nullResume = pendingWrites.find(([writeTaskId, chan]) => writeTaskId === "00000000-0000-0000-0000-000000000000" && chan === "__resume__")?.[2];
744
+ function _scratchpad({ pendingWrites, taskId, currentTaskInput, resumeMap, namespaceHash, pendingWritesIndex }) {
745
+ const nullResume = pendingWritesIndex ? pendingWritesIndex.nullResume : pendingWrites.find(([writeTaskId, chan]) => writeTaskId === "00000000-0000-0000-0000-000000000000" && chan === "__resume__")?.[2];
586
746
  const scratchpad = {
587
747
  callCounter: 0,
588
748
  interruptCounter: -1,
589
749
  resume: (() => {
590
- const result = pendingWrites.filter(([writeTaskId, chan]) => writeTaskId === taskId && chan === "__resume__").flatMap(([_writeTaskId, _chan, resume]) => resume);
750
+ const result = pendingWritesIndex ? (pendingWritesIndex.resumeByTaskId.get(taskId) ?? []).flat() : pendingWrites.filter(([writeTaskId, chan]) => writeTaskId === taskId && chan === "__resume__").flatMap(([_writeTaskId, _chan, resume]) => resume);
591
751
  if (resumeMap != null && namespaceHash in resumeMap) {
592
752
  const mappedResume = resumeMap[namespaceHash];
593
753
  result.push(mappedResume);
@@ -608,6 +768,6 @@ function _scratchpad({ pendingWrites, taskId, currentTaskInput, resumeMap, names
608
768
  return scratchpad;
609
769
  }
610
770
  //#endregion
611
- export { _applyWrites, _localRead, _prepareNextTasks, _prepareSingleTask, increment, sanitizeUntrackedValuesInSend, shouldInterrupt };
771
+ export { _applyWrites, _localRead, _prepareNextTasks, _prepareNodeErrorHandlerTask, _prepareSingleTask, increment, sanitizeUntrackedValuesInSend, shouldInterrupt };
612
772
 
613
773
  //# sourceMappingURL=algo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"algo.js","names":[],"sources":["../../src/pregel/algo.ts"],"sourcesContent":["/* eslint-disable no-param-reassign */\nimport {\n mergeConfigs,\n patchConfig,\n RunnableConfig,\n} from \"@langchain/core/runnables\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport {\n All,\n BaseCheckpointSaver,\n Checkpoint,\n ReadonlyCheckpoint,\n copyCheckpoint,\n type PendingWrite,\n type PendingWriteValue,\n uuid5,\n maxChannelVersion,\n BaseStore,\n CheckpointPendingWrite,\n SendProtocol,\n} from \"@langchain/langgraph-checkpoint\";\nimport {\n BaseChannel,\n createCheckpoint,\n emptyChannels,\n getOnlyChannels,\n} from \"../channels/base.js\";\nimport { PregelNode } from \"./read.js\";\nimport { readChannel, readChannels } from \"./io.js\";\nimport {\n _isSend,\n _isSendInterface,\n CONFIG_KEY_CHECKPOINT_MAP,\n CHECKPOINT_NAMESPACE_SEPARATOR,\n CONFIG_KEY_CHECKPOINTER,\n CONFIG_KEY_READ,\n CONFIG_KEY_TASK_ID,\n CONFIG_KEY_SEND,\n INTERRUPT,\n RESERVED,\n Send,\n TAG_HIDDEN,\n TASKS,\n CHECKPOINT_NAMESPACE_END,\n PUSH,\n PULL,\n RESUME,\n NULL_TASK_ID,\n CONFIG_KEY_SCRATCHPAD,\n RETURN,\n ERROR,\n NO_WRITES,\n CONFIG_KEY_PREVIOUS_STATE,\n PREVIOUS,\n CACHE_NS_WRITES,\n CONFIG_KEY_RESUME_MAP,\n START,\n} from \"../constants.js\";\nimport {\n Call,\n isCall,\n PregelExecutableTask,\n PregelScratchpad,\n PregelTaskDescription,\n SimpleTaskPath,\n TaskPath,\n VariadicTaskPath,\n} from \"./types.js\";\nimport { EmptyChannelError, InvalidUpdateError } from \"../errors.js\";\nimport { getNullChannelVersion } from \"./utils/index.js\";\nimport { ExecutionInfo, LangGraphRunnableConfig } from \"./runnable_types.js\";\nimport { getRunnableForFunc } from \"./call.js\";\nimport { IterableReadableWritableStream } from \"./stream.js\";\nimport { XXH3 } from \"../hash.js\";\nimport { Topic } from \"../channels/topic.js\";\n\n/**\n * Construct a type with a set of properties K of type T\n */\nexport type StrRecord<K extends string, T> = {\n [P in K]: T;\n};\n\nexport type WritesProtocol<C = string> = {\n name: string;\n writes: PendingWrite<C>[];\n triggers: string[];\n path?: TaskPath;\n};\n\nexport const increment = (current?: number) => {\n return current !== undefined ? current + 1 : 1;\n};\n\nfunction triggersNextStep(\n updatedChannels: Set<string>,\n triggerToNodes: Record<string, string[]> | undefined\n) {\n if (triggerToNodes == null) return false;\n\n for (const chan of updatedChannels) {\n if (triggerToNodes[chan]) return true;\n }\n\n return false;\n}\n\n// Avoids unnecessary double iteration\nfunction maxChannelMapVersion(\n channelVersions: Record<string, number | string>\n): number | string | undefined {\n let maxVersion: number | string | undefined;\n for (const chan in channelVersions) {\n if (!Object.prototype.hasOwnProperty.call(channelVersions, chan)) continue;\n if (maxVersion == null) {\n maxVersion = channelVersions[chan];\n } else {\n maxVersion = maxChannelVersion(maxVersion, channelVersions[chan]);\n }\n }\n return maxVersion;\n}\n\nexport function shouldInterrupt<N extends PropertyKey, C extends PropertyKey>(\n checkpoint: Checkpoint,\n interruptNodes: All | N[],\n tasks: PregelExecutableTask<N, C>[]\n): boolean {\n const nullVersion = getNullChannelVersion(checkpoint.channel_versions);\n const seen = checkpoint.versions_seen[INTERRUPT] ?? {};\n\n let anyChannelUpdated = false;\n\n if (\n (checkpoint.channel_versions[START] ?? nullVersion) >\n (seen[START] ?? nullVersion)\n ) {\n anyChannelUpdated = true;\n } else {\n for (const chan in checkpoint.channel_versions) {\n if (\n !Object.prototype.hasOwnProperty.call(checkpoint.channel_versions, chan)\n )\n continue;\n\n if (checkpoint.channel_versions[chan] > (seen[chan] ?? nullVersion)) {\n anyChannelUpdated = true;\n break;\n }\n }\n }\n\n const anyTriggeredNodeInInterruptNodes = tasks.some((task) =>\n interruptNodes === \"*\"\n ? !task.config?.tags?.includes(TAG_HIDDEN)\n : interruptNodes.includes(task.name)\n );\n\n return anyChannelUpdated && anyTriggeredNodeInInterruptNodes;\n}\n\nexport function _localRead<Cc extends Record<string, BaseChannel>>(\n checkpoint: ReadonlyCheckpoint,\n channels: Cc,\n task: WritesProtocol<keyof Cc>,\n select: Array<keyof Cc> | keyof Cc,\n fresh: boolean = false\n): Record<string, unknown> | unknown {\n let updated = new Set<keyof Cc>();\n\n if (!Array.isArray(select)) {\n for (const [c] of task.writes) {\n if (c === select) {\n updated = new Set([c]);\n break;\n }\n }\n updated = updated || new Set();\n } else {\n updated = new Set(\n select.filter((c) => task.writes.some(([key, _]) => key === c))\n );\n }\n\n let values: Record<string, unknown>;\n\n if (fresh && updated.size > 0) {\n const localChannels = Object.fromEntries(\n Object.entries(channels).filter(([k, _]) => updated.has(k as keyof Cc))\n ) as Partial<Cc>;\n\n const newCheckpoint = createCheckpoint(checkpoint, localChannels as Cc, -1);\n const newChannels = emptyChannels(localChannels as Cc, newCheckpoint);\n\n _applyWrites(\n copyCheckpoint(newCheckpoint),\n newChannels,\n [task],\n undefined,\n undefined\n );\n values = readChannels({ ...channels, ...newChannels }, select);\n } else {\n values = readChannels(channels, select);\n }\n\n return values;\n}\n\nexport function _localWrite(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n commit: (writes: [string, any][]) => any,\n processes: Record<string, PregelNode>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n writes: [string, any][]\n) {\n for (const [chan, value] of writes) {\n if ([PUSH, TASKS].includes(chan) && value != null) {\n if (!_isSend(value)) {\n throw new InvalidUpdateError(\n `Invalid packet type, expected SendProtocol, got ${JSON.stringify(\n value\n )}`\n );\n }\n if (!(value.node in processes)) {\n throw new InvalidUpdateError(\n `Invalid node name \"${value.node}\" in Send packet`\n );\n }\n }\n }\n commit(writes);\n}\n\nconst IGNORE = new Set<string | number | symbol>([\n NO_WRITES,\n PUSH,\n RESUME,\n INTERRUPT,\n RETURN,\n ERROR,\n]);\n\nexport function _applyWrites<Cc extends Record<string, BaseChannel>>(\n checkpoint: Checkpoint,\n channels: Cc,\n tasks: WritesProtocol<keyof Cc>[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getNextVersion: ((version: any) => any) | undefined,\n triggerToNodes: Record<string, string[]> | undefined\n): Set<string> {\n // Sort tasks by first 3 path elements for deterministic order\n // Later path parts (like task IDs) are ignored for sorting\n tasks.sort((a, b) => {\n const aPath = a.path?.slice(0, 3) || [];\n const bPath = b.path?.slice(0, 3) || [];\n\n // Compare each path element\n for (let i = 0; i < Math.min(aPath.length, bPath.length); i += 1) {\n if (aPath[i] < bPath[i]) return -1;\n if (aPath[i] > bPath[i]) return 1;\n }\n\n // If one path is shorter, it comes first\n return aPath.length - bPath.length;\n });\n\n // if no task has triggers this is applying writes from the null task only\n // so we don't do anything other than update the channels written to\n const bumpStep = tasks.some((task) => task.triggers.length > 0);\n\n // Filter out non instances of BaseChannel\n const onlyChannels = getOnlyChannels(channels);\n\n // Update seen versions\n for (const task of tasks) {\n checkpoint.versions_seen[task.name] ??= {};\n for (const chan of task.triggers) {\n if (chan in checkpoint.channel_versions) {\n checkpoint.versions_seen[task.name][chan] =\n checkpoint.channel_versions[chan];\n }\n }\n }\n\n // Find the highest version of all channels\n let maxVersion = maxChannelMapVersion(checkpoint.channel_versions);\n\n // Consume all channels that were read\n const channelsToConsume = new Set(\n tasks\n .flatMap((task) => task.triggers)\n .filter((chan) => !RESERVED.includes(chan))\n );\n\n let usedNewVersion = false;\n for (const chan of channelsToConsume) {\n if (chan in onlyChannels && onlyChannels[chan].consume()) {\n if (getNextVersion !== undefined) {\n checkpoint.channel_versions[chan] = getNextVersion(maxVersion);\n usedNewVersion = true;\n }\n }\n }\n\n // Group writes by channel\n const pendingWritesByChannel = {} as Record<keyof Cc, PendingWriteValue[]>;\n for (const task of tasks) {\n for (const [chan, val] of task.writes) {\n if (IGNORE.has(chan)) {\n // do nothing\n } else if (chan in onlyChannels) {\n pendingWritesByChannel[chan] ??= [];\n pendingWritesByChannel[chan].push(val);\n }\n }\n }\n\n // Find the highest version of all channels\n if (maxVersion != null && getNextVersion != null) {\n maxVersion = usedNewVersion ? getNextVersion(maxVersion) : maxVersion;\n }\n\n const updatedChannels: Set<string> = new Set();\n // Apply writes to channels\n for (const [chan, vals] of Object.entries(pendingWritesByChannel)) {\n if (chan in onlyChannels) {\n const channel = onlyChannels[chan];\n let updated;\n try {\n updated = channel.update(vals);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.name === InvalidUpdateError.unminifiable_name) {\n const wrappedError = new InvalidUpdateError(\n `Invalid update for channel \"${chan}\" with values ${JSON.stringify(\n vals\n )}: ${e.message}`\n );\n wrappedError.lc_error_code = e.lc_error_code;\n throw wrappedError;\n } else {\n throw e;\n }\n }\n if (updated && getNextVersion !== undefined) {\n checkpoint.channel_versions[chan] = getNextVersion(maxVersion);\n\n // unavailable channels can't trigger tasks, so don't add them\n if (channel.isAvailable()) updatedChannels.add(chan);\n }\n }\n }\n\n // Channels that weren't updated in this step are notified of a new step\n if (bumpStep) {\n for (const chan in onlyChannels) {\n if (!Object.prototype.hasOwnProperty.call(onlyChannels, chan)) continue;\n\n const channel = onlyChannels[chan];\n if (channel.isAvailable() && !updatedChannels.has(chan)) {\n const updated = channel.update([]);\n\n if (updated && getNextVersion !== undefined) {\n checkpoint.channel_versions[chan] = getNextVersion(maxVersion);\n\n // unavailable channels can't trigger tasks, so don't add them\n if (channel.isAvailable()) updatedChannels.add(chan);\n }\n }\n }\n }\n\n // If this is (tentatively) the last superstep, notify all channels of finish\n if (bumpStep && !triggersNextStep(updatedChannels, triggerToNodes)) {\n for (const chan in onlyChannels) {\n if (!Object.prototype.hasOwnProperty.call(onlyChannels, chan)) continue;\n\n const channel = onlyChannels[chan];\n if (channel.finish() && getNextVersion !== undefined) {\n checkpoint.channel_versions[chan] = getNextVersion(maxVersion);\n\n // unavailable channels can't trigger tasks, so don't add them\n if (channel.isAvailable()) updatedChannels.add(chan);\n }\n }\n }\n\n return updatedChannels;\n}\n\nfunction* candidateNodes(\n checkpoint: ReadonlyCheckpoint,\n processes: StrRecord<string, PregelNode>,\n extra: NextTaskExtraFields\n) {\n // This section is an optimization that allows which\n // nodes will be active during the next step.\n // When there's information about:\n // 1. Which channels were updated in the previous step\n // 2. Which nodes are triggered by which channels\n // Then we can determine which nodes should be triggered\n // in the next step without having to cycle through all nodes.\n if (extra.updatedChannels != null && extra.triggerToNodes != null) {\n const triggeredNodes = new Set<string>();\n\n // Get all nodes that have triggers associated with an updated channel\n for (const channel of extra.updatedChannels) {\n const nodeIds = extra.triggerToNodes[channel];\n for (const id of nodeIds ?? []) triggeredNodes.add(id);\n }\n\n // Sort the nodes to ensure deterministic order\n yield* [...triggeredNodes].sort();\n return;\n }\n\n // If there are no values in checkpoint, no need to run\n // through all the PULL candidates\n const isEmptyChannelVersions = (() => {\n for (const chan in checkpoint.channel_versions) {\n if (checkpoint.channel_versions[chan] !== null) return false;\n }\n return true;\n })();\n\n if (isEmptyChannelVersions) return;\n for (const name in processes) {\n if (!Object.prototype.hasOwnProperty.call(processes, name)) continue;\n yield name;\n }\n}\n\nexport type NextTaskExtraFields = {\n step: number;\n isResuming?: boolean;\n checkpointer?: BaseCheckpointSaver;\n manager?: CallbackManagerForChainRun;\n store?: BaseStore;\n stream?: IterableReadableWritableStream;\n triggerToNodes?: Record<string, string[]>;\n updatedChannels?: Set<string>;\n};\n\nexport type NextTaskExtraFieldsWithStore = NextTaskExtraFields & {\n store?: BaseStore;\n};\n\nexport type NextTaskExtraFieldsWithoutStore = NextTaskExtraFields & {\n store?: never;\n};\n\nexport function _prepareNextTasks<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: [string, string, unknown][] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: false,\n extra: NextTaskExtraFieldsWithoutStore\n): Record<string, PregelTaskDescription>;\n\nexport function _prepareNextTasks<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: [string, string, unknown][] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: true,\n extra: NextTaskExtraFieldsWithStore\n): Record<string, PregelExecutableTask<keyof Nn, keyof Cc>>;\n\n/**\n * Prepare the set of tasks that will make up the next Pregel step.\n * This is the union of all PUSH tasks (Sends) and PULL tasks (nodes triggered\n * by edges).\n */\nexport function _prepareNextTasks<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: [string, string, unknown][] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: boolean,\n extra: NextTaskExtraFieldsWithStore | NextTaskExtraFieldsWithoutStore\n):\n | Record<string, PregelTaskDescription>\n | Record<string, PregelExecutableTask<keyof Nn, keyof Cc>> {\n const tasks:\n | Record<string, PregelExecutableTask<keyof Nn, keyof Cc>>\n | Record<string, PregelTaskDescription> = {};\n\n // Consume pending tasks\n const tasksChannel = channels[TASKS] as Topic<SendProtocol> | undefined;\n\n if (tasksChannel?.isAvailable()) {\n const len = tasksChannel.get().length;\n for (let i = 0; i < len; i += 1) {\n const task = _prepareSingleTask(\n [PUSH, i],\n checkpoint,\n pendingWrites,\n processes,\n channels,\n config,\n forExecution,\n extra\n );\n if (task !== undefined) {\n tasks[task.id] = task;\n }\n }\n }\n\n // Check if any processes should be run in next step\n // If so, prepare the values to be passed to them\n for (const name of candidateNodes(checkpoint, processes, extra)) {\n const task = _prepareSingleTask(\n [PULL, name],\n checkpoint,\n pendingWrites,\n processes,\n channels,\n config,\n forExecution,\n extra\n );\n if (task !== undefined) {\n tasks[task.id] = task;\n }\n }\n return tasks;\n}\n\nexport function _prepareSingleTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n taskPath: SimpleTaskPath,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: false,\n extra: NextTaskExtraFields\n): PregelTaskDescription | undefined;\n\nexport function _prepareSingleTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n taskPath: TaskPath,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: true,\n extra: NextTaskExtraFields\n): PregelExecutableTask<keyof Nn, keyof Cc> | undefined;\n\nexport function _prepareSingleTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n taskPath: TaskPath,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: boolean,\n extra: NextTaskExtraFieldsWithStore\n): PregelTaskDescription | PregelExecutableTask<keyof Nn, keyof Cc> | undefined;\n\n/**\n * Prepares a single task for the next Pregel step, given a task path, which\n * uniquely identifies a PUSH or PULL task within the graph.\n */\nexport function _prepareSingleTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n taskPath: TaskPath,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: LangGraphRunnableConfig,\n forExecution: boolean,\n extra: NextTaskExtraFields\n):\n | PregelTaskDescription\n | PregelExecutableTask<keyof Nn, keyof Cc>\n | undefined {\n const { step, checkpointer, manager } = extra;\n const configurable = config.configurable ?? {};\n const parentNamespace = configurable.checkpoint_ns ?? \"\";\n\n if (taskPath[0] === PUSH && isCall(taskPath[taskPath.length - 1])) {\n const call = taskPath[taskPath.length - 1] as Call;\n const proc = getRunnableForFunc(call.name, call.func);\n const triggers = [PUSH];\n const checkpointNamespace =\n parentNamespace === \"\"\n ? call.name\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${call.name}`;\n const id = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n call.name,\n PUSH,\n taskPath[1],\n taskPath[2],\n ]),\n checkpoint.id\n );\n const taskCheckpointNamespace = `${checkpointNamespace}${CHECKPOINT_NAMESPACE_END}${id}`;\n\n // we append `true` to the task path to indicate that a call is being made\n // so we should not return interrupts from this task (responsibility lies with the parent)\n const outputTaskPath = [...taskPath.slice(0, 3), true] as VariadicTaskPath;\n const metadata = {\n langgraph_step: step,\n langgraph_node: call.name,\n langgraph_triggers: triggers,\n langgraph_path: outputTaskPath,\n langgraph_checkpoint_ns: taskCheckpointNamespace,\n checkpoint_ns: taskCheckpointNamespace,\n };\n if (forExecution) {\n const writes: [keyof Cc, unknown][] = [];\n const executionInfo: ExecutionInfo = {\n checkpointId: checkpoint.id,\n checkpointNs: taskCheckpointNamespace,\n taskId: id,\n threadId: configurable.thread_id as string | undefined,\n runId: config.runId != null ? String(config.runId) : undefined,\n nodeAttempt: 1,\n };\n const task = {\n name: call.name,\n input: call.input,\n proc,\n writes,\n config: {\n ...patchConfig(\n mergeConfigs(config, {\n metadata,\n store: extra.store ?? config.store,\n }),\n {\n runName: call.name,\n callbacks: manager?.getChild(`graph:step:${step}`),\n configurable: {\n [CONFIG_KEY_TASK_ID]: id,\n [CONFIG_KEY_SEND]: (writes_: PendingWrite[]) =>\n _localWrite(\n (items: PendingWrite<keyof Cc>[]) => writes.push(...items),\n processes,\n writes_\n ),\n [CONFIG_KEY_READ]: (\n select_: Array<keyof Cc> | keyof Cc,\n fresh_: boolean = false\n ) =>\n _localRead(\n checkpoint,\n channels,\n {\n name: call.name,\n writes: writes as PendingWrite[],\n triggers,\n path: outputTaskPath,\n },\n select_,\n fresh_\n ),\n [CONFIG_KEY_CHECKPOINTER]:\n checkpointer ?? configurable[CONFIG_KEY_CHECKPOINTER],\n [CONFIG_KEY_CHECKPOINT_MAP]: {\n ...configurable[CONFIG_KEY_CHECKPOINT_MAP],\n [parentNamespace]: checkpoint.id,\n },\n [CONFIG_KEY_SCRATCHPAD]: _scratchpad({\n pendingWrites: pendingWrites ?? [],\n taskId: id,\n currentTaskInput: call.input,\n resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],\n namespaceHash: XXH3(taskCheckpointNamespace),\n }),\n [CONFIG_KEY_PREVIOUS_STATE]:\n checkpoint.channel_values[PREVIOUS],\n checkpoint_id: undefined,\n checkpoint_ns: taskCheckpointNamespace,\n },\n }\n ),\n executionInfo,\n },\n triggers,\n retry_policy: call.retry,\n cache_key: call.cache\n ? {\n key: XXH3((call.cache.keyFunc ?? JSON.stringify)([call.input])),\n ns: [CACHE_NS_WRITES, call.name ?? \"__dynamic__\"],\n ttl: call.cache.ttl,\n }\n : undefined,\n id,\n path: outputTaskPath,\n writers: [],\n } satisfies PregelExecutableTask<keyof Nn, keyof Cc>;\n return task;\n } else {\n return {\n id,\n name: call.name,\n interrupts: [],\n path: outputTaskPath,\n };\n }\n } else if (taskPath[0] === PUSH) {\n const index =\n typeof taskPath[1] === \"number\"\n ? taskPath[1]\n : parseInt(taskPath[1] as string, 10);\n\n if (!channels[TASKS]?.isAvailable()) {\n return undefined;\n }\n\n const sends = channels[TASKS].get() as SendProtocol[];\n if (index < 0 || index >= sends.length) {\n return undefined;\n }\n\n const packet =\n _isSendInterface(sends[index]) && !_isSend(sends[index])\n ? new Send(sends[index].node, sends[index].args)\n : sends[index];\n\n if (!_isSendInterface(packet)) {\n console.warn(\n `Ignoring invalid packet ${JSON.stringify(packet)} in pending sends.`\n );\n return undefined;\n }\n if (!(packet.node in processes)) {\n console.warn(\n `Ignoring unknown node name ${packet.node} in pending sends.`\n );\n return undefined;\n }\n const triggers = [PUSH];\n const checkpointNamespace =\n parentNamespace === \"\"\n ? packet.node\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${packet.node}`;\n const taskId = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n packet.node,\n PUSH,\n index.toString(),\n ]),\n checkpoint.id\n );\n const taskCheckpointNamespace = `${checkpointNamespace}${CHECKPOINT_NAMESPACE_END}${taskId}`;\n let metadata = {\n langgraph_step: step,\n langgraph_node: packet.node,\n langgraph_triggers: triggers,\n langgraph_path: taskPath.slice(0, 3),\n langgraph_checkpoint_ns: taskCheckpointNamespace,\n checkpoint_ns: taskCheckpointNamespace,\n };\n if (forExecution) {\n const proc = processes[packet.node];\n const node = proc.getNode();\n if (node !== undefined) {\n if (proc.metadata !== undefined) {\n metadata = { ...metadata, ...proc.metadata };\n }\n const writes: [keyof Cc, unknown][] = [];\n const executionInfo: ExecutionInfo = {\n checkpointId: checkpoint.id,\n checkpointNs: taskCheckpointNamespace,\n taskId,\n threadId: configurable.thread_id as string | undefined,\n runId: config.runId != null ? String(config.runId) : undefined,\n nodeAttempt: 1,\n };\n return {\n name: packet.node,\n input: packet.args,\n proc: node,\n subgraphs: proc.subgraphs,\n writes,\n config: {\n ...patchConfig(\n mergeConfigs(config, {\n metadata,\n tags: proc.tags,\n store: extra.store ?? config.store,\n }),\n {\n runName: packet.node,\n callbacks: manager?.getChild(`graph:step:${step}`),\n configurable: {\n [CONFIG_KEY_TASK_ID]: taskId,\n [CONFIG_KEY_SEND]: (writes_: PendingWrite[]) =>\n _localWrite(\n (items: PendingWrite<keyof Cc>[]) =>\n writes.push(...items),\n processes,\n writes_\n ),\n [CONFIG_KEY_READ]: (\n select_: Array<keyof Cc> | keyof Cc,\n fresh_: boolean = false\n ) =>\n _localRead(\n checkpoint,\n channels,\n {\n name: packet.node,\n writes: writes as PendingWrite[],\n triggers,\n path: taskPath,\n },\n select_,\n fresh_\n ),\n [CONFIG_KEY_CHECKPOINTER]:\n checkpointer ?? configurable[CONFIG_KEY_CHECKPOINTER],\n [CONFIG_KEY_CHECKPOINT_MAP]: {\n ...configurable[CONFIG_KEY_CHECKPOINT_MAP],\n [parentNamespace]: checkpoint.id,\n },\n [CONFIG_KEY_SCRATCHPAD]: _scratchpad({\n pendingWrites: pendingWrites ?? [],\n taskId,\n currentTaskInput: packet.args,\n resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],\n namespaceHash: XXH3(taskCheckpointNamespace),\n }),\n [CONFIG_KEY_PREVIOUS_STATE]:\n checkpoint.channel_values[PREVIOUS],\n checkpoint_id: undefined,\n checkpoint_ns: taskCheckpointNamespace,\n },\n }\n ),\n executionInfo,\n },\n triggers,\n retry_policy: proc.retryPolicy,\n cache_key: proc.cachePolicy\n ? {\n key: XXH3(\n (proc.cachePolicy.keyFunc ?? JSON.stringify)([packet.args])\n ),\n ns: [CACHE_NS_WRITES, proc.name ?? \"__dynamic__\", packet.node],\n ttl: proc.cachePolicy.ttl,\n }\n : undefined,\n id: taskId,\n path: taskPath,\n writers: proc.getWriters(),\n } satisfies PregelExecutableTask<keyof Nn, keyof Cc>;\n }\n } else {\n return {\n id: taskId,\n name: packet.node,\n interrupts: [],\n path: taskPath,\n } satisfies PregelTaskDescription;\n }\n } else if (taskPath[0] === PULL) {\n const name = taskPath[1].toString();\n const proc = processes[name];\n if (proc === undefined) {\n return undefined;\n }\n\n // Check if this task already has successful writes in the pending writes\n if (pendingWrites?.length) {\n // Find the task ID for this node/path\n const checkpointNamespace =\n parentNamespace === \"\"\n ? name\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${name}`;\n\n const taskId = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n name,\n PULL,\n name,\n ]),\n checkpoint.id\n );\n\n // Check if there are successful writes (not ERROR) for this task ID\n const hasSuccessfulWrites = pendingWrites.some(\n (w) => w[0] === taskId && w[1] !== ERROR\n );\n\n // If task completed successfully, don't include it in next tasks\n if (hasSuccessfulWrites) {\n return undefined;\n }\n }\n\n const nullVersion = getNullChannelVersion(checkpoint.channel_versions);\n if (nullVersion === undefined) {\n return undefined;\n }\n const seen = checkpoint.versions_seen[name] ?? {};\n\n // Find the first trigger that is available and has a new version\n const trigger = proc.triggers.find((chan) => {\n if (!channels[chan].isAvailable()) return false;\n\n return (\n (checkpoint.channel_versions[chan] ?? nullVersion) >\n (seen[chan] ?? nullVersion)\n );\n });\n\n // If any of the channels read by this process were updated\n if (trigger !== undefined) {\n const val = _procInput(proc, channels, forExecution);\n if (val === undefined) {\n return undefined;\n }\n const checkpointNamespace =\n parentNamespace === \"\"\n ? name\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${name}`;\n const taskId = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n name,\n PULL,\n [trigger],\n ]),\n checkpoint.id\n );\n const taskCheckpointNamespace = `${checkpointNamespace}${CHECKPOINT_NAMESPACE_END}${taskId}`;\n let metadata = {\n langgraph_step: step,\n langgraph_node: name,\n langgraph_triggers: [trigger],\n langgraph_path: taskPath,\n langgraph_checkpoint_ns: taskCheckpointNamespace,\n checkpoint_ns: taskCheckpointNamespace,\n };\n if (forExecution) {\n const node = proc.getNode();\n if (node !== undefined) {\n if (proc.metadata !== undefined) {\n metadata = { ...metadata, ...proc.metadata };\n }\n const writes: [keyof Cc, unknown][] = [];\n const executionInfo: ExecutionInfo = {\n checkpointId: checkpoint.id,\n checkpointNs: taskCheckpointNamespace,\n taskId,\n threadId: configurable.thread_id as string | undefined,\n runId: config.runId != null ? String(config.runId) : undefined,\n nodeAttempt: 1,\n };\n return {\n name,\n input: val,\n proc: node,\n subgraphs: proc.subgraphs,\n writes,\n config: {\n ...patchConfig(\n mergeConfigs(config, {\n metadata,\n tags: proc.tags,\n store: extra.store ?? config.store,\n }),\n {\n runName: name,\n callbacks: manager?.getChild(`graph:step:${step}`),\n configurable: {\n [CONFIG_KEY_TASK_ID]: taskId,\n [CONFIG_KEY_SEND]: (writes_: PendingWrite[]) =>\n _localWrite(\n (items: PendingWrite<keyof Cc>[]) => {\n writes.push(...items);\n },\n processes,\n writes_\n ),\n [CONFIG_KEY_READ]: (\n select_: Array<keyof Cc> | keyof Cc,\n fresh_: boolean = false\n ) =>\n _localRead(\n checkpoint,\n channels,\n {\n name,\n writes: writes as PendingWrite[],\n triggers: [trigger],\n path: taskPath,\n },\n select_,\n fresh_\n ),\n [CONFIG_KEY_CHECKPOINTER]:\n checkpointer ?? configurable[CONFIG_KEY_CHECKPOINTER],\n [CONFIG_KEY_CHECKPOINT_MAP]: {\n ...configurable[CONFIG_KEY_CHECKPOINT_MAP],\n [parentNamespace]: checkpoint.id,\n },\n [CONFIG_KEY_SCRATCHPAD]: _scratchpad({\n pendingWrites: pendingWrites ?? [],\n taskId,\n currentTaskInput: val,\n resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],\n namespaceHash: XXH3(taskCheckpointNamespace),\n }),\n [CONFIG_KEY_PREVIOUS_STATE]:\n checkpoint.channel_values[PREVIOUS],\n checkpoint_id: undefined,\n checkpoint_ns: taskCheckpointNamespace,\n },\n }\n ),\n executionInfo,\n },\n triggers: [trigger],\n retry_policy: proc.retryPolicy,\n cache_key: proc.cachePolicy\n ? {\n key: XXH3(\n (proc.cachePolicy.keyFunc ?? JSON.stringify)([val])\n ),\n ns: [CACHE_NS_WRITES, proc.name ?? \"__dynamic__\", name],\n ttl: proc.cachePolicy.ttl,\n }\n : undefined,\n id: taskId,\n path: taskPath,\n writers: proc.getWriters(),\n } satisfies PregelExecutableTask<keyof Nn, keyof Cc>;\n }\n } else {\n return {\n id: taskId,\n name,\n interrupts: [],\n path: taskPath,\n } satisfies PregelTaskDescription;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Function injected under CONFIG_KEY_READ in task config, to read current state.\n * Used by conditional edges to read a copy of the state with reflecting the writes\n * from that node only.\n *\n * @internal\n */\nfunction _procInput(\n proc: PregelNode,\n channels: StrRecord<string, BaseChannel>,\n forExecution: boolean\n) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let val: any;\n\n if (typeof proc.channels === \"object\" && !Array.isArray(proc.channels)) {\n val = {};\n for (const [k, chan] of Object.entries(proc.channels)) {\n if (proc.triggers.includes(chan)) {\n try {\n val[k] = readChannel(channels, chan, false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.name === EmptyChannelError.unminifiable_name) {\n return undefined;\n } else {\n throw e;\n }\n }\n } else if (chan in channels) {\n try {\n val[k] = readChannel(channels, chan, false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.name === EmptyChannelError.unminifiable_name) {\n continue;\n } else {\n throw e;\n }\n }\n }\n }\n } else if (Array.isArray(proc.channels)) {\n let successfulRead = false;\n for (const chan of proc.channels) {\n try {\n val = readChannel(channels, chan, false);\n successfulRead = true;\n break;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.name === EmptyChannelError.unminifiable_name) {\n continue;\n } else {\n throw e;\n }\n }\n }\n if (!successfulRead) {\n return undefined;\n }\n } else {\n throw new Error(\n `Invalid channels type, expected list or dict, got ${proc.channels}`\n );\n }\n\n // If the process has a mapper, apply it to the value\n if (forExecution && proc.mapper !== undefined) {\n val = proc.mapper(val);\n }\n\n return val;\n}\n\n/**\n * Remove any values belonging to UntrackedValue channels from a Send packet\n * before checkpointing.\n *\n * Send is often called with state to be passed to the destination node,\n * which may contain UntrackedValues at the top level.\n *\n * @internal\n */\nexport function sanitizeUntrackedValuesInSend(\n packet: Send,\n channels: StrRecord<string, BaseChannel>\n): Send {\n if (typeof packet.args !== \"object\" || packet.args === null) {\n // Not a dict-like arg\n return packet;\n }\n\n // Top-level keys should be channel names\n const sanitizedArg: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(packet.args)) {\n const channel = channels[key];\n // Check if channel is an UntrackedValue by its lc_graph_name\n if (!channel || channel.lc_graph_name !== \"UntrackedValue\") {\n sanitizedArg[key] = value;\n }\n }\n\n return new Send(packet.node, sanitizedArg);\n}\n\nfunction _scratchpad({\n pendingWrites,\n taskId,\n currentTaskInput,\n resumeMap,\n namespaceHash,\n}: {\n pendingWrites: CheckpointPendingWrite[];\n taskId: string;\n currentTaskInput: unknown;\n resumeMap: Record<string, unknown> | undefined;\n namespaceHash: string;\n}): PregelScratchpad {\n const nullResume = pendingWrites.find(\n ([writeTaskId, chan]) => writeTaskId === NULL_TASK_ID && chan === RESUME\n )?.[2];\n\n const resume = (() => {\n const result = pendingWrites\n .filter(\n ([writeTaskId, chan]) => writeTaskId === taskId && chan === RESUME\n )\n .flatMap(([_writeTaskId, _chan, resume]) => resume);\n\n if (resumeMap != null && namespaceHash in resumeMap) {\n const mappedResume = resumeMap[namespaceHash];\n result.push(mappedResume);\n }\n\n return result;\n })();\n\n const scratchpad = {\n callCounter: 0,\n interruptCounter: -1,\n resume,\n nullResume,\n subgraphCounter: 0,\n currentTaskInput,\n consumeNullResume: () => {\n if (scratchpad.nullResume) {\n delete scratchpad.nullResume;\n pendingWrites.splice(\n pendingWrites.findIndex(\n ([writeTaskId, chan]) =>\n writeTaskId === NULL_TASK_ID && chan === RESUME\n ),\n 1\n );\n return nullResume;\n }\n\n return undefined;\n },\n };\n return scratchpad;\n}\n"],"mappings":";;;;;;;;;;;AA0FA,MAAa,aAAa,YAAqB;AAC7C,QAAO,YAAY,KAAA,IAAY,UAAU,IAAI;;AAG/C,SAAS,iBACP,iBACA,gBACA;AACA,KAAI,kBAAkB,KAAM,QAAO;AAEnC,MAAK,MAAM,QAAQ,gBACjB,KAAI,eAAe,MAAO,QAAO;AAGnC,QAAO;;AAIT,SAAS,qBACP,iBAC6B;CAC7B,IAAI;AACJ,MAAK,MAAM,QAAQ,iBAAiB;AAClC,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,iBAAiB,KAAK,CAAE;AAClE,MAAI,cAAc,KAChB,cAAa,gBAAgB;MAE7B,cAAa,kBAAkB,YAAY,gBAAgB,MAAM;;AAGrE,QAAO;;AAGT,SAAgB,gBACd,YACA,gBACA,OACS;CACT,MAAM,cAAc,sBAAsB,WAAW,iBAAiB;CACtE,MAAM,OAAO,WAAW,cAAA,oBAA4B,EAAE;CAEtD,IAAI,oBAAoB;AAExB,MACG,WAAW,iBAAA,gBAA2B,gBACtC,KAAA,gBAAe,aAEhB,qBAAoB;KAEpB,MAAK,MAAM,QAAQ,WAAW,kBAAkB;AAC9C,MACE,CAAC,OAAO,UAAU,eAAe,KAAK,WAAW,kBAAkB,KAAK,CAExE;AAEF,MAAI,WAAW,iBAAiB,SAAS,KAAK,SAAS,cAAc;AACnE,uBAAoB;AACpB;;;CAKN,MAAM,mCAAmC,MAAM,MAAM,SACnD,mBAAmB,MACf,CAAC,KAAK,QAAQ,MAAM,SAAS,WAAW,GACxC,eAAe,SAAS,KAAK,KAAK,CACvC;AAED,QAAO,qBAAqB;;AAG9B,SAAgB,WACd,YACA,UACA,MACA,QACA,QAAiB,OACkB;CACnC,IAAI,0BAAU,IAAI,KAAe;AAEjC,KAAI,CAAC,MAAM,QAAQ,OAAO,EAAE;AAC1B,OAAK,MAAM,CAAC,MAAM,KAAK,OACrB,KAAI,MAAM,QAAQ;AAChB,aAAU,IAAI,IAAI,CAAC,EAAE,CAAC;AACtB;;AAGJ,YAAU,2BAAW,IAAI,KAAK;OAE9B,WAAU,IAAI,IACZ,OAAO,QAAQ,MAAM,KAAK,OAAO,MAAM,CAAC,KAAK,OAAO,QAAQ,EAAE,CAAC,CAChE;CAGH,IAAI;AAEJ,KAAI,SAAS,QAAQ,OAAO,GAAG;EAC7B,MAAM,gBAAgB,OAAO,YAC3B,OAAO,QAAQ,SAAS,CAAC,QAAQ,CAAC,GAAG,OAAO,QAAQ,IAAI,EAAc,CAAC,CACxE;EAED,MAAM,gBAAgB,iBAAiB,YAAY,eAAqB,GAAG;EAC3E,MAAM,cAAc,cAAc,eAAqB,cAAc;AAErE,eACE,eAAe,cAAc,EAC7B,aACA,CAAC,KAAK,EACN,KAAA,GACA,KAAA,EACD;AACD,WAAS,aAAa;GAAE,GAAG;GAAU,GAAG;GAAa,EAAE,OAAO;OAE9D,UAAS,aAAa,UAAU,OAAO;AAGzC,QAAO;;AAGT,SAAgB,YAEd,QACA,WAEA,QACA;AACA,MAAK,MAAM,CAAC,MAAM,UAAU,OAC1B,KAAI,CAAA,iBAAA,iBAAa,CAAC,SAAS,KAAK,IAAI,SAAS,MAAM;AACjD,MAAI,CAAC,QAAQ,MAAM,CACjB,OAAM,IAAI,mBACR,mDAAmD,KAAK,UACtD,MACD,GACF;AAEH,MAAI,EAAE,MAAM,QAAQ,WAClB,OAAM,IAAI,mBACR,sBAAsB,MAAM,KAAK,kBAClC;;AAIP,QAAO,OAAO;;AAGhB,MAAM,SAAS,IAAI,IAA8B;CAC/C;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,aACd,YACA,UACA,OAEA,gBACA,gBACa;AAGb,OAAM,MAAM,GAAG,MAAM;EACnB,MAAM,QAAQ,EAAE,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE;EACvC,MAAM,QAAQ,EAAE,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE;AAGvC,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,MAAM,QAAQ,MAAM,OAAO,EAAE,KAAK,GAAG;AAChE,OAAI,MAAM,KAAK,MAAM,GAAI,QAAO;AAChC,OAAI,MAAM,KAAK,MAAM,GAAI,QAAO;;AAIlC,SAAO,MAAM,SAAS,MAAM;GAC5B;CAIF,MAAM,WAAW,MAAM,MAAM,SAAS,KAAK,SAAS,SAAS,EAAE;CAG/D,MAAM,eAAe,gBAAgB,SAAS;AAG9C,MAAK,MAAM,QAAQ,OAAO;AACxB,aAAW,cAAc,KAAK,UAAU,EAAE;AAC1C,OAAK,MAAM,QAAQ,KAAK,SACtB,KAAI,QAAQ,WAAW,iBACrB,YAAW,cAAc,KAAK,MAAM,QAClC,WAAW,iBAAiB;;CAMpC,IAAI,aAAa,qBAAqB,WAAW,iBAAiB;CAGlE,MAAM,oBAAoB,IAAI,IAC5B,MACG,SAAS,SAAS,KAAK,SAAS,CAChC,QAAQ,SAAS,CAAC,SAAS,SAAS,KAAK,CAAC,CAC9C;CAED,IAAI,iBAAiB;AACrB,MAAK,MAAM,QAAQ,kBACjB,KAAI,QAAQ,gBAAgB,aAAa,MAAM,SAAS;MAClD,mBAAmB,KAAA,GAAW;AAChC,cAAW,iBAAiB,QAAQ,eAAe,WAAW;AAC9D,oBAAiB;;;CAMvB,MAAM,yBAAyB,EAAE;AACjC,MAAK,MAAM,QAAQ,MACjB,MAAK,MAAM,CAAC,MAAM,QAAQ,KAAK,OAC7B,KAAI,OAAO,IAAI,KAAK,EAAE,YAEX,QAAQ,cAAc;AAC/B,yBAAuB,UAAU,EAAE;AACnC,yBAAuB,MAAM,KAAK,IAAI;;AAM5C,KAAI,cAAc,QAAQ,kBAAkB,KAC1C,cAAa,iBAAiB,eAAe,WAAW,GAAG;CAG7D,MAAM,kCAA+B,IAAI,KAAK;AAE9C,MAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,uBAAuB,CAC/D,KAAI,QAAQ,cAAc;EACxB,MAAM,UAAU,aAAa;EAC7B,IAAI;AACJ,MAAI;AACF,aAAU,QAAQ,OAAO,KAAK;WAEvB,GAAQ;AACf,OAAI,EAAE,SAAS,mBAAmB,mBAAmB;IACnD,MAAM,eAAe,IAAI,mBACvB,+BAA+B,KAAK,gBAAgB,KAAK,UACvD,KACD,CAAC,IAAI,EAAE,UACT;AACD,iBAAa,gBAAgB,EAAE;AAC/B,UAAM;SAEN,OAAM;;AAGV,MAAI,WAAW,mBAAmB,KAAA,GAAW;AAC3C,cAAW,iBAAiB,QAAQ,eAAe,WAAW;AAG9D,OAAI,QAAQ,aAAa,CAAE,iBAAgB,IAAI,KAAK;;;AAM1D,KAAI,SACF,MAAK,MAAM,QAAQ,cAAc;AAC/B,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,cAAc,KAAK,CAAE;EAE/D,MAAM,UAAU,aAAa;AAC7B,MAAI,QAAQ,aAAa,IAAI,CAAC,gBAAgB,IAAI,KAAK;OACrC,QAAQ,OAAO,EAAE,CAAC,IAEnB,mBAAmB,KAAA,GAAW;AAC3C,eAAW,iBAAiB,QAAQ,eAAe,WAAW;AAG9D,QAAI,QAAQ,aAAa,CAAE,iBAAgB,IAAI,KAAK;;;;AAO5D,KAAI,YAAY,CAAC,iBAAiB,iBAAiB,eAAe,CAChE,MAAK,MAAM,QAAQ,cAAc;AAC/B,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,cAAc,KAAK,CAAE;EAE/D,MAAM,UAAU,aAAa;AAC7B,MAAI,QAAQ,QAAQ,IAAI,mBAAmB,KAAA,GAAW;AACpD,cAAW,iBAAiB,QAAQ,eAAe,WAAW;AAG9D,OAAI,QAAQ,aAAa,CAAE,iBAAgB,IAAI,KAAK;;;AAK1D,QAAO;;AAGT,UAAU,eACR,YACA,WACA,OACA;AAQA,KAAI,MAAM,mBAAmB,QAAQ,MAAM,kBAAkB,MAAM;EACjE,MAAM,iCAAiB,IAAI,KAAa;AAGxC,OAAK,MAAM,WAAW,MAAM,iBAAiB;GAC3C,MAAM,UAAU,MAAM,eAAe;AACrC,QAAK,MAAM,MAAM,WAAW,EAAE,CAAE,gBAAe,IAAI,GAAG;;AAIxD,SAAO,CAAC,GAAG,eAAe,CAAC,MAAM;AACjC;;AAYF,YAPsC;AACpC,OAAK,MAAM,QAAQ,WAAW,iBAC5B,KAAI,WAAW,iBAAiB,UAAU,KAAM,QAAO;AAEzD,SAAO;KACL,CAEwB;AAC5B,MAAK,MAAM,QAAQ,WAAW;AAC5B,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,WAAW,KAAK,CAAE;AAC5D,QAAM;;;;;;;;AAsDV,SAAgB,kBAId,YACA,eACA,WACA,UACA,QACA,cACA,OAG2D;CAC3D,MAAM,QAEsC,EAAE;CAG9C,MAAM,eAAe,SAAS;AAE9B,KAAI,cAAc,aAAa,EAAE;EAC/B,MAAM,MAAM,aAAa,KAAK,CAAC;AAC/B,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG;GAC/B,MAAM,OAAO,mBACX,CAAC,MAAM,EAAE,EACT,YACA,eACA,WACA,UACA,QACA,cACA,MACD;AACD,OAAI,SAAS,KAAA,EACX,OAAM,KAAK,MAAM;;;AAOvB,MAAK,MAAM,QAAQ,eAAe,YAAY,WAAW,MAAM,EAAE;EAC/D,MAAM,OAAO,mBACX,CAAC,MAAM,KAAK,EACZ,YACA,eACA,WACA,UACA,QACA,cACA,MACD;AACD,MAAI,SAAS,KAAA,EACX,OAAM,KAAK,MAAM;;AAGrB,QAAO;;;;;;AAiDT,SAAgB,mBAId,UACA,YACA,eACA,WACA,UACA,QACA,cACA,OAIY;CACZ,MAAM,EAAE,MAAM,cAAc,YAAY;CACxC,MAAM,eAAe,OAAO,gBAAgB,EAAE;CAC9C,MAAM,kBAAkB,aAAa,iBAAiB;AAEtD,KAAI,SAAS,OAAA,mBAAe,OAAO,SAAS,SAAS,SAAS,GAAG,EAAE;EACjE,MAAM,OAAO,SAAS,SAAS,SAAS;EACxC,MAAM,OAAO,mBAAmB,KAAK,MAAM,KAAK,KAAK;EACrD,MAAM,WAAW,CAAC,KAAK;EACvB,MAAM,sBACJ,oBAAoB,KAChB,KAAK,OACL,GAAG,mBAAmD,KAAK;EACjE,MAAM,KAAK,MACT,KAAK,UAAU;GACb;GACA,KAAK,UAAU;GACf,KAAK;GACL;GACA,SAAS;GACT,SAAS;GACV,CAAC,EACF,WAAW,GACZ;EACD,MAAM,0BAA0B,GAAG,uBAAiD;EAIpF,MAAM,iBAAiB,CAAC,GAAG,SAAS,MAAM,GAAG,EAAE,EAAE,KAAK;EACtD,MAAM,WAAW;GACf,gBAAgB;GAChB,gBAAgB,KAAK;GACrB,oBAAoB;GACpB,gBAAgB;GAChB,yBAAyB;GACzB,eAAe;GAChB;AACD,MAAI,cAAc;GAChB,MAAM,SAAgC,EAAE;GACxC,MAAM,gBAA+B;IACnC,cAAc,WAAW;IACzB,cAAc;IACd,QAAQ;IACR,UAAU,aAAa;IACvB,OAAO,OAAO,SAAS,OAAO,OAAO,OAAO,MAAM,GAAG,KAAA;IACrD,aAAa;IACd;AA0ED,UAzEa;IACX,MAAM,KAAK;IACX,OAAO,KAAK;IACZ;IACA;IACA,QAAQ;KACN,GAAG,YACD,aAAa,QAAQ;MACnB;MACA,OAAO,MAAM,SAAS,OAAO;MAC9B,CAAC,EACF;MACE,SAAS,KAAK;MACd,WAAW,SAAS,SAAS,cAAc,OAAO;MAClD,cAAc;QACX,qBAAqB;QACrB,mBAAmB,YAClB,aACG,UAAoC,OAAO,KAAK,GAAG,MAAM,EAC1D,WACA,QACD;QACF,mBACC,SACA,SAAkB,UAElB,WACE,YACA,UACA;QACE,MAAM,KAAK;QACH;QACR;QACA,MAAM;QACP,EACD,SACA,OACD;QACF,0BACC,gBAAgB,aAAA;QACjB,4BAA4B;QAC3B,GAAG,aAAa;SACf,kBAAkB,WAAW;QAC/B;QACA,wBAAwB,YAAY;QACnC,eAAe,iBAAiB,EAAE;QAClC,QAAQ;QACR,kBAAkB,KAAK;QACvB,WAAW,OAAO,eAAe;QACjC,eAAe,KAAK,wBAAwB;QAC7C,CAAC;QACD,4BACC,WAAW,eAAe;OAC5B,eAAe,KAAA;OACf,eAAe;OAChB;MACF,CACF;KACD;KACD;IACD;IACA,cAAc,KAAK;IACnB,WAAW,KAAK,QACZ;KACE,KAAK,MAAM,KAAK,MAAM,WAAW,KAAK,WAAW,CAAC,KAAK,MAAM,CAAC,CAAC;KAC/D,IAAI,CAAC,iBAAiB,KAAK,QAAQ,cAAc;KACjD,KAAK,KAAK,MAAM;KACjB,GACD,KAAA;IACJ;IACA,MAAM;IACN,SAAS,EAAE;IACZ;QAGD,QAAO;GACL;GACA,MAAM,KAAK;GACX,YAAY,EAAE;GACd,MAAM;GACP;YAEM,SAAS,OAAA,iBAAa;EAC/B,MAAM,QACJ,OAAO,SAAS,OAAO,WACnB,SAAS,KACT,SAAS,SAAS,IAAc,GAAG;AAEzC,MAAI,CAAC,SAAA,mBAAiB,aAAa,CACjC;EAGF,MAAM,QAAQ,SAAS,OAAO,KAAK;AACnC,MAAI,QAAQ,KAAK,SAAS,MAAM,OAC9B;EAGF,MAAM,SACJ,iBAAiB,MAAM,OAAO,IAAI,CAAC,QAAQ,MAAM,OAAO,GACpD,IAAI,KAAK,MAAM,OAAO,MAAM,MAAM,OAAO,KAAK,GAC9C,MAAM;AAEZ,MAAI,CAAC,iBAAiB,OAAO,EAAE;AAC7B,WAAQ,KACN,2BAA2B,KAAK,UAAU,OAAO,CAAC,oBACnD;AACD;;AAEF,MAAI,EAAE,OAAO,QAAQ,YAAY;AAC/B,WAAQ,KACN,8BAA8B,OAAO,KAAK,oBAC3C;AACD;;EAEF,MAAM,WAAW,CAAC,KAAK;EACvB,MAAM,sBACJ,oBAAoB,KAChB,OAAO,OACP,GAAG,mBAAmD,OAAO;EACnE,MAAM,SAAS,MACb,KAAK,UAAU;GACb;GACA,KAAK,UAAU;GACf,OAAO;GACP;GACA,MAAM,UAAU;GACjB,CAAC,EACF,WAAW,GACZ;EACD,MAAM,0BAA0B,GAAG,uBAAiD;EACpF,IAAI,WAAW;GACb,gBAAgB;GAChB,gBAAgB,OAAO;GACvB,oBAAoB;GACpB,gBAAgB,SAAS,MAAM,GAAG,EAAE;GACpC,yBAAyB;GACzB,eAAe;GAChB;AACD,MAAI,cAAc;GAChB,MAAM,OAAO,UAAU,OAAO;GAC9B,MAAM,OAAO,KAAK,SAAS;AAC3B,OAAI,SAAS,KAAA,GAAW;AACtB,QAAI,KAAK,aAAa,KAAA,EACpB,YAAW;KAAE,GAAG;KAAU,GAAG,KAAK;KAAU;IAE9C,MAAM,SAAgC,EAAE;IACxC,MAAM,gBAA+B;KACnC,cAAc,WAAW;KACzB,cAAc;KACd;KACA,UAAU,aAAa;KACvB,OAAO,OAAO,SAAS,OAAO,OAAO,OAAO,MAAM,GAAG,KAAA;KACrD,aAAa;KACd;AACD,WAAO;KACL,MAAM,OAAO;KACb,OAAO,OAAO;KACd,MAAM;KACN,WAAW,KAAK;KAChB;KACA,QAAQ;MACN,GAAG,YACD,aAAa,QAAQ;OACnB;OACA,MAAM,KAAK;OACX,OAAO,MAAM,SAAS,OAAO;OAC9B,CAAC,EACF;OACE,SAAS,OAAO;OAChB,WAAW,SAAS,SAAS,cAAc,OAAO;OAClD,cAAc;SACX,qBAAqB;SACrB,mBAAmB,YAClB,aACG,UACC,OAAO,KAAK,GAAG,MAAM,EACvB,WACA,QACD;SACF,mBACC,SACA,SAAkB,UAElB,WACE,YACA,UACA;SACE,MAAM,OAAO;SACL;SACR;SACA,MAAM;SACP,EACD,SACA,OACD;SACF,0BACC,gBAAgB,aAAA;SACjB,4BAA4B;SAC3B,GAAG,aAAa;UACf,kBAAkB,WAAW;SAC/B;SACA,wBAAwB,YAAY;SACnC,eAAe,iBAAiB,EAAE;SAClC;SACA,kBAAkB,OAAO;SACzB,WAAW,OAAO,eAAe;SACjC,eAAe,KAAK,wBAAwB;SAC7C,CAAC;SACD,4BACC,WAAW,eAAe;QAC5B,eAAe,KAAA;QACf,eAAe;QAChB;OACF,CACF;MACD;MACD;KACD;KACA,cAAc,KAAK;KACnB,WAAW,KAAK,cACZ;MACE,KAAK,MACF,KAAK,YAAY,WAAW,KAAK,WAAW,CAAC,OAAO,KAAK,CAAC,CAC5D;MACD,IAAI;OAAC;OAAiB,KAAK,QAAQ;OAAe,OAAO;OAAK;MAC9D,KAAK,KAAK,YAAY;MACvB,GACD,KAAA;KACJ,IAAI;KACJ,MAAM;KACN,SAAS,KAAK,YAAY;KAC3B;;QAGH,QAAO;GACL,IAAI;GACJ,MAAM,OAAO;GACb,YAAY,EAAE;GACd,MAAM;GACP;YAEM,SAAS,OAAA,iBAAa;EAC/B,MAAM,OAAO,SAAS,GAAG,UAAU;EACnC,MAAM,OAAO,UAAU;AACvB,MAAI,SAAS,KAAA,EACX;AAIF,MAAI,eAAe,QAAQ;GAEzB,MAAM,sBACJ,oBAAoB,KAChB,OACA,GAAG,mBAAmD;GAE5D,MAAM,SAAS,MACb,KAAK,UAAU;IACb;IACA,KAAK,UAAU;IACf;IACA;IACA;IACD,CAAC,EACF,WAAW,GACZ;AAQD,OAL4B,cAAc,MACvC,MAAM,EAAE,OAAO,UAAU,EAAE,OAAA,YAC7B,CAIC;;EAIJ,MAAM,cAAc,sBAAsB,WAAW,iBAAiB;AACtE,MAAI,gBAAgB,KAAA,EAClB;EAEF,MAAM,OAAO,WAAW,cAAc,SAAS,EAAE;EAGjD,MAAM,UAAU,KAAK,SAAS,MAAM,SAAS;AAC3C,OAAI,CAAC,SAAS,MAAM,aAAa,CAAE,QAAO;AAE1C,WACG,WAAW,iBAAiB,SAAS,gBACrC,KAAK,SAAS;IAEjB;AAGF,MAAI,YAAY,KAAA,GAAW;GACzB,MAAM,MAAM,WAAW,MAAM,UAAU,aAAa;AACpD,OAAI,QAAQ,KAAA,EACV;GAEF,MAAM,sBACJ,oBAAoB,KAChB,OACA,GAAG,mBAAmD;GAC5D,MAAM,SAAS,MACb,KAAK,UAAU;IACb;IACA,KAAK,UAAU;IACf;IACA;IACA,CAAC,QAAQ;IACV,CAAC,EACF,WAAW,GACZ;GACD,MAAM,0BAA0B,GAAG,uBAAiD;GACpF,IAAI,WAAW;IACb,gBAAgB;IAChB,gBAAgB;IAChB,oBAAoB,CAAC,QAAQ;IAC7B,gBAAgB;IAChB,yBAAyB;IACzB,eAAe;IAChB;AACD,OAAI,cAAc;IAChB,MAAM,OAAO,KAAK,SAAS;AAC3B,QAAI,SAAS,KAAA,GAAW;AACtB,SAAI,KAAK,aAAa,KAAA,EACpB,YAAW;MAAE,GAAG;MAAU,GAAG,KAAK;MAAU;KAE9C,MAAM,SAAgC,EAAE;KACxC,MAAM,gBAA+B;MACnC,cAAc,WAAW;MACzB,cAAc;MACd;MACA,UAAU,aAAa;MACvB,OAAO,OAAO,SAAS,OAAO,OAAO,OAAO,MAAM,GAAG,KAAA;MACrD,aAAa;MACd;AACD,YAAO;MACL;MACA,OAAO;MACP,MAAM;MACN,WAAW,KAAK;MAChB;MACA,QAAQ;OACN,GAAG,YACD,aAAa,QAAQ;QACnB;QACA,MAAM,KAAK;QACX,OAAO,MAAM,SAAS,OAAO;QAC9B,CAAC,EACF;QACE,SAAS;QACT,WAAW,SAAS,SAAS,cAAc,OAAO;QAClD,cAAc;UACX,qBAAqB;UACrB,mBAAmB,YAClB,aACG,UAAoC;AACnC,iBAAO,KAAK,GAAG,MAAM;YAEvB,WACA,QACD;UACF,mBACC,SACA,SAAkB,UAElB,WACE,YACA,UACA;UACE;UACQ;UACR,UAAU,CAAC,QAAQ;UACnB,MAAM;UACP,EACD,SACA,OACD;UACF,0BACC,gBAAgB,aAAA;UACjB,4BAA4B;UAC3B,GAAG,aAAa;WACf,kBAAkB,WAAW;UAC/B;UACA,wBAAwB,YAAY;UACnC,eAAe,iBAAiB,EAAE;UAClC;UACA,kBAAkB;UAClB,WAAW,OAAO,eAAe;UACjC,eAAe,KAAK,wBAAwB;UAC7C,CAAC;UACD,4BACC,WAAW,eAAe;SAC5B,eAAe,KAAA;SACf,eAAe;SAChB;QACF,CACF;OACD;OACD;MACD,UAAU,CAAC,QAAQ;MACnB,cAAc,KAAK;MACnB,WAAW,KAAK,cACZ;OACE,KAAK,MACF,KAAK,YAAY,WAAW,KAAK,WAAW,CAAC,IAAI,CAAC,CACpD;OACD,IAAI;QAAC;QAAiB,KAAK,QAAQ;QAAe;QAAK;OACvD,KAAK,KAAK,YAAY;OACvB,GACD,KAAA;MACJ,IAAI;MACJ,MAAM;MACN,SAAS,KAAK,YAAY;MAC3B;;SAGH,QAAO;IACL,IAAI;IACJ;IACA,YAAY,EAAE;IACd,MAAM;IACP;;;;;;;;;;;AAcT,SAAS,WACP,MACA,UACA,cACA;CAEA,IAAI;AAEJ,KAAI,OAAO,KAAK,aAAa,YAAY,CAAC,MAAM,QAAQ,KAAK,SAAS,EAAE;AACtE,QAAM,EAAE;AACR,OAAK,MAAM,CAAC,GAAG,SAAS,OAAO,QAAQ,KAAK,SAAS,CACnD,KAAI,KAAK,SAAS,SAAS,KAAK,CAC9B,KAAI;AACF,OAAI,KAAK,YAAY,UAAU,MAAM,MAAM;WAEpC,GAAQ;AACf,OAAI,EAAE,SAAS,kBAAkB,kBAC/B;OAEA,OAAM;;WAGD,QAAQ,SACjB,KAAI;AACF,OAAI,KAAK,YAAY,UAAU,MAAM,MAAM;WAEpC,GAAQ;AACf,OAAI,EAAE,SAAS,kBAAkB,kBAC/B;OAEA,OAAM;;YAKL,MAAM,QAAQ,KAAK,SAAS,EAAE;EACvC,IAAI,iBAAiB;AACrB,OAAK,MAAM,QAAQ,KAAK,SACtB,KAAI;AACF,SAAM,YAAY,UAAU,MAAM,MAAM;AACxC,oBAAiB;AACjB;WAEO,GAAQ;AACf,OAAI,EAAE,SAAS,kBAAkB,kBAC/B;OAEA,OAAM;;AAIZ,MAAI,CAAC,eACH;OAGF,OAAM,IAAI,MACR,qDAAqD,KAAK,WAC3D;AAIH,KAAI,gBAAgB,KAAK,WAAW,KAAA,EAClC,OAAM,KAAK,OAAO,IAAI;AAGxB,QAAO;;;;;;;;;;;AAYT,SAAgB,8BACd,QACA,UACM;AACN,KAAI,OAAO,OAAO,SAAS,YAAY,OAAO,SAAS,KAErD,QAAO;CAIT,MAAM,eAAwC,EAAE;AAChD,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,KAAK,EAAE;EACtD,MAAM,UAAU,SAAS;AAEzB,MAAI,CAAC,WAAW,QAAQ,kBAAkB,iBACxC,cAAa,OAAO;;AAIxB,QAAO,IAAI,KAAK,OAAO,MAAM,aAAa;;AAG5C,SAAS,YAAY,EACnB,eACA,QACA,kBACA,WACA,iBAOmB;CACnB,MAAM,aAAa,cAAc,MAC9B,CAAC,aAAa,UAAU,gBAAA,0CAAgC,SAAA,aAC1D,GAAG;CAiBJ,MAAM,aAAa;EACjB,aAAa;EACb,kBAAkB;EAClB,eAlBoB;GACpB,MAAM,SAAS,cACZ,QACE,CAAC,aAAa,UAAU,gBAAgB,UAAU,SAAA,aACpD,CACA,SAAS,CAAC,cAAc,OAAO,YAAY,OAAO;AAErD,OAAI,aAAa,QAAQ,iBAAiB,WAAW;IACnD,MAAM,eAAe,UAAU;AAC/B,WAAO,KAAK,aAAa;;AAG3B,UAAO;MACL;EAMF;EACA,iBAAiB;EACjB;EACA,yBAAyB;AACvB,OAAI,WAAW,YAAY;AACzB,WAAO,WAAW;AAClB,kBAAc,OACZ,cAAc,WACX,CAAC,aAAa,UACb,gBAAA,0CAAgC,SAAA,aACnC,EACD,EACD;AACD,WAAO;;;EAKZ;AACD,QAAO"}
1
+ {"version":3,"file":"algo.js","names":[],"sources":["../../src/pregel/algo.ts"],"sourcesContent":["/* eslint-disable no-param-reassign */\nimport {\n mergeConfigs,\n patchConfig,\n RunnableConfig,\n} from \"@langchain/core/runnables\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport {\n All,\n BaseCheckpointSaver,\n Checkpoint,\n ReadonlyCheckpoint,\n copyCheckpoint,\n type PendingWrite,\n type PendingWriteValue,\n uuid5,\n maxChannelVersion,\n BaseStore,\n CheckpointPendingWrite,\n SendProtocol,\n} from \"@langchain/langgraph-checkpoint\";\nimport {\n BaseChannel,\n createCheckpoint,\n emptyChannels,\n isDeltaChannel,\n getOnlyChannels,\n} from \"../channels/base.js\";\nimport { PregelNode } from \"./read.js\";\nimport { readChannel, readChannels } from \"./io.js\";\nimport {\n _isSend,\n _isSendInterface,\n CONFIG_KEY_CHECKPOINT_MAP,\n CHECKPOINT_NAMESPACE_SEPARATOR,\n CONFIG_KEY_CHECKPOINTER,\n CONFIG_KEY_READ,\n CONFIG_KEY_TASK_ID,\n CONFIG_KEY_SEND,\n INTERRUPT,\n RESERVED,\n Send,\n TAG_HIDDEN,\n TASKS,\n CHECKPOINT_NAMESPACE_END,\n PUSH,\n PULL,\n RESUME,\n NULL_TASK_ID,\n CONFIG_KEY_SCRATCHPAD,\n RETURN,\n ERROR,\n ERROR_SOURCE_NODE,\n NO_WRITES,\n CONFIG_KEY_PREVIOUS_STATE,\n PREVIOUS,\n CACHE_NS_WRITES,\n CONFIG_KEY_RESUME_MAP,\n CONFIG_KEY_NODE_ERROR,\n START,\n} from \"../constants.js\";\nimport {\n Call,\n isCall,\n PregelExecutableTask,\n PregelScratchpad,\n PregelTaskDescription,\n SimpleTaskPath,\n TaskPath,\n VariadicTaskPath,\n} from \"./types.js\";\nimport { EmptyChannelError, InvalidUpdateError, NodeError } from \"../errors.js\";\nimport { getNullChannelVersion } from \"./utils/index.js\";\nimport { ExecutionInfo, LangGraphRunnableConfig } from \"./runnable_types.js\";\nimport { getRunnableForFunc } from \"./call.js\";\nimport { IterableReadableWritableStream } from \"./stream.js\";\nimport { XXH3 } from \"../hash.js\";\nimport { Topic } from \"../channels/topic.js\";\n\n/**\n * Construct a type with a set of properties K of type T\n */\nexport type StrRecord<K extends string, T> = {\n [P in K]: T;\n};\n\nexport type WritesProtocol<C = string> = {\n name: string;\n writes: PendingWrite<C>[];\n triggers: string[];\n path?: TaskPath;\n};\n\nexport const increment = (current?: number) => {\n return current !== undefined ? current + 1 : 1;\n};\n\nfunction triggersNextStep(\n updatedChannels: Set<string>,\n triggerToNodes: Record<string, string[]> | undefined\n) {\n if (triggerToNodes == null) return false;\n\n for (const chan of updatedChannels) {\n if (triggerToNodes[chan]) return true;\n }\n\n return false;\n}\n\n// Avoids unnecessary double iteration\nfunction maxChannelMapVersion(\n channelVersions: Record<string, number | string>\n): number | string | undefined {\n let maxVersion: number | string | undefined;\n for (const chan in channelVersions) {\n if (!Object.prototype.hasOwnProperty.call(channelVersions, chan)) continue;\n if (maxVersion == null) {\n maxVersion = channelVersions[chan];\n } else {\n maxVersion = maxChannelVersion(maxVersion, channelVersions[chan]);\n }\n }\n return maxVersion;\n}\n\nexport function shouldInterrupt<N extends PropertyKey, C extends PropertyKey>(\n checkpoint: Checkpoint,\n interruptNodes: All | N[],\n tasks: PregelExecutableTask<N, C>[]\n): boolean {\n const nullVersion = getNullChannelVersion(checkpoint.channel_versions);\n const seen = checkpoint.versions_seen[INTERRUPT] ?? {};\n\n let anyChannelUpdated = false;\n\n if (\n (checkpoint.channel_versions[START] ?? nullVersion) >\n (seen[START] ?? nullVersion)\n ) {\n anyChannelUpdated = true;\n } else {\n for (const chan in checkpoint.channel_versions) {\n if (\n !Object.prototype.hasOwnProperty.call(checkpoint.channel_versions, chan)\n )\n continue;\n\n if (checkpoint.channel_versions[chan] > (seen[chan] ?? nullVersion)) {\n anyChannelUpdated = true;\n break;\n }\n }\n }\n\n const anyTriggeredNodeInInterruptNodes = tasks.some((task) =>\n interruptNodes === \"*\"\n ? !task.config?.tags?.includes(TAG_HIDDEN)\n : interruptNodes.includes(task.name)\n );\n\n return anyChannelUpdated && anyTriggeredNodeInInterruptNodes;\n}\n\nexport function _localRead<Cc extends Record<string, BaseChannel>>(\n checkpoint: ReadonlyCheckpoint,\n channels: Cc,\n task: WritesProtocol<keyof Cc>,\n select: Array<keyof Cc> | keyof Cc,\n fresh: boolean = false\n): Record<string, unknown> | unknown {\n let updated = new Set<keyof Cc>();\n\n if (!Array.isArray(select)) {\n for (const [c] of task.writes) {\n if (c === select) {\n updated = new Set([c]);\n break;\n }\n }\n updated = updated || new Set();\n } else {\n updated = new Set(\n select.filter((c) => task.writes.some(([key, _]) => key === c))\n );\n }\n\n let values: Record<string, unknown>;\n\n if (fresh && updated.size > 0) {\n const localChannels = Object.fromEntries(\n Object.entries(channels).filter(([k, _]) => updated.has(k as keyof Cc))\n ) as Partial<Cc>;\n\n // DeltaChannels are omitted from `channel_values` by default (their state\n // is reconstructed from ancestor writes via the saver). A local read has\n // no saver, so snapshot every delta channel inline to round-trip its full\n // live value through `emptyChannels`.\n const channelsToSnapshot = new Set<string>();\n for (const k in localChannels) {\n if (!Object.prototype.hasOwnProperty.call(localChannels, k)) continue;\n const ch = (localChannels as Record<string, BaseChannel>)[k];\n if (isDeltaChannel(ch) && ch.isAvailable()) channelsToSnapshot.add(k);\n }\n\n const newCheckpoint = createCheckpoint(\n checkpoint,\n localChannels as Cc,\n -1,\n {\n channelsToSnapshot,\n }\n );\n const newChannels = emptyChannels(localChannels as Cc, newCheckpoint);\n\n _applyWrites(\n copyCheckpoint(newCheckpoint),\n newChannels,\n [task],\n undefined,\n undefined\n );\n values = readChannels({ ...channels, ...newChannels }, select);\n } else {\n values = readChannels(channels, select);\n }\n\n return values;\n}\n\nexport function _localWrite(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n commit: (writes: [string, any][]) => any,\n processes: Record<string, PregelNode>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n writes: [string, any][]\n) {\n for (const [chan, value] of writes) {\n if ([PUSH, TASKS].includes(chan) && value != null) {\n if (!_isSend(value)) {\n throw new InvalidUpdateError(\n `Invalid packet type, expected SendProtocol, got ${JSON.stringify(\n value\n )}`\n );\n }\n if (!(value.node in processes)) {\n throw new InvalidUpdateError(\n `Invalid node name \"${value.node}\" in Send packet`\n );\n }\n }\n }\n commit(writes);\n}\n\nconst IGNORE = new Set<string | number | symbol>([\n NO_WRITES,\n PUSH,\n RESUME,\n INTERRUPT,\n RETURN,\n ERROR,\n ERROR_SOURCE_NODE,\n]);\n\nconst RESERVED_SET: ReadonlySet<string> = new Set(RESERVED);\n\nexport function _applyWrites<Cc extends Record<string, BaseChannel>>(\n checkpoint: Checkpoint,\n channels: Cc,\n tasks: WritesProtocol<keyof Cc>[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getNextVersion: ((version: any) => any) | undefined,\n triggerToNodes: Record<string, string[]> | undefined\n): Set<string> {\n // Pre-compute paths once before sorting to avoid repeated .slice() allocations\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const pathCache = new Map<WritesProtocol<keyof Cc>, any[]>();\n for (const task of tasks) {\n pathCache.set(task, task.path?.slice(0, 3) || []);\n }\n\n // Sort tasks by first 3 path elements for deterministic order\n // Later path parts (like task IDs) are ignored for sorting\n tasks.sort((a, b) => {\n const aPath = pathCache.get(a)!;\n const bPath = pathCache.get(b)!;\n\n // Compare each path element\n for (let i = 0; i < Math.min(aPath.length, bPath.length); i += 1) {\n if (aPath[i] < bPath[i]) return -1;\n if (aPath[i] > bPath[i]) return 1;\n }\n\n // If one path is shorter, it comes first\n return aPath.length - bPath.length;\n });\n\n // Filter out non instances of BaseChannel\n const onlyChannels = getOnlyChannels(channels);\n\n // Single pass: update seen versions, check for triggers, collect channels to consume\n let bumpStep = false;\n const channelsToConsume = new Set<string>();\n for (const task of tasks) {\n if (task.triggers.length > 0) bumpStep = true;\n checkpoint.versions_seen[task.name] ??= {};\n for (const chan of task.triggers) {\n if (chan in checkpoint.channel_versions) {\n checkpoint.versions_seen[task.name][chan] =\n checkpoint.channel_versions[chan];\n }\n if (!RESERVED_SET.has(chan)) {\n channelsToConsume.add(chan);\n }\n }\n }\n\n // Find the highest version of all channels\n let maxVersion = maxChannelMapVersion(checkpoint.channel_versions);\n\n let usedNewVersion = false;\n for (const chan of channelsToConsume) {\n if (chan in onlyChannels && onlyChannels[chan].consume()) {\n if (getNextVersion !== undefined) {\n checkpoint.channel_versions[chan] = getNextVersion(maxVersion);\n usedNewVersion = true;\n }\n }\n }\n\n // Group writes by channel\n const pendingWritesByChannel = {} as Record<keyof Cc, PendingWriteValue[]>;\n for (const task of tasks) {\n for (const [chan, val] of task.writes) {\n if (IGNORE.has(chan)) {\n // do nothing\n } else if (chan in onlyChannels) {\n pendingWritesByChannel[chan] ??= [];\n pendingWritesByChannel[chan].push(val);\n }\n }\n }\n\n // Find the highest version of all channels\n if (maxVersion != null && getNextVersion != null) {\n maxVersion = usedNewVersion ? getNextVersion(maxVersion) : maxVersion;\n }\n\n const updatedChannels: Set<string> = new Set();\n // Apply writes to channels\n for (const [chan, vals] of Object.entries(pendingWritesByChannel)) {\n if (chan in onlyChannels) {\n const channel = onlyChannels[chan];\n let updated;\n try {\n updated = channel.update(vals);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.name === InvalidUpdateError.unminifiable_name) {\n const wrappedError = new InvalidUpdateError(\n `Invalid update for channel \"${chan}\" with values ${JSON.stringify(\n vals\n )}: ${e.message}`\n );\n wrappedError.lc_error_code = e.lc_error_code;\n throw wrappedError;\n } else {\n throw e;\n }\n }\n if (updated && getNextVersion !== undefined) {\n checkpoint.channel_versions[chan] = getNextVersion(maxVersion);\n\n // unavailable channels can't trigger tasks, so don't add them\n if (channel.isAvailable()) updatedChannels.add(chan);\n }\n }\n }\n\n // Channels that weren't updated in this step are notified of a new step\n if (bumpStep) {\n for (const chan in onlyChannels) {\n if (!Object.prototype.hasOwnProperty.call(onlyChannels, chan)) continue;\n\n const channel = onlyChannels[chan];\n if (channel.isAvailable() && !updatedChannels.has(chan)) {\n const updated = channel.update([]);\n\n if (updated && getNextVersion !== undefined) {\n checkpoint.channel_versions[chan] = getNextVersion(maxVersion);\n\n // unavailable channels can't trigger tasks, so don't add them\n if (channel.isAvailable()) updatedChannels.add(chan);\n }\n }\n }\n }\n\n // If this is (tentatively) the last superstep, notify all channels of finish\n if (bumpStep && !triggersNextStep(updatedChannels, triggerToNodes)) {\n for (const chan in onlyChannels) {\n if (!Object.prototype.hasOwnProperty.call(onlyChannels, chan)) continue;\n\n const channel = onlyChannels[chan];\n if (channel.finish() && getNextVersion !== undefined) {\n checkpoint.channel_versions[chan] = getNextVersion(maxVersion);\n\n // unavailable channels can't trigger tasks, so don't add them\n if (channel.isAvailable()) updatedChannels.add(chan);\n }\n }\n }\n\n return updatedChannels;\n}\n\nfunction* candidateNodes(\n checkpoint: ReadonlyCheckpoint,\n processes: StrRecord<string, PregelNode>,\n extra: NextTaskExtraFields\n) {\n // This section is an optimization that allows which\n // nodes will be active during the next step.\n // When there's information about:\n // 1. Which channels were updated in the previous step\n // 2. Which nodes are triggered by which channels\n // Then we can determine which nodes should be triggered\n // in the next step without having to cycle through all nodes.\n if (extra.updatedChannels != null && extra.triggerToNodes != null) {\n const triggeredNodes = new Set<string>();\n\n // Get all nodes that have triggers associated with an updated channel\n for (const channel of extra.updatedChannels) {\n const nodeIds = extra.triggerToNodes[channel];\n for (const id of nodeIds ?? []) triggeredNodes.add(id);\n }\n\n // Sort the nodes to ensure deterministic order\n yield* [...triggeredNodes].sort();\n return;\n }\n\n // If there are no values in checkpoint, no need to run\n // through all the PULL candidates\n const isEmptyChannelVersions = (() => {\n for (const chan in checkpoint.channel_versions) {\n if (checkpoint.channel_versions[chan] !== null) return false;\n }\n return true;\n })();\n\n if (isEmptyChannelVersions) return;\n for (const name in processes) {\n if (!Object.prototype.hasOwnProperty.call(processes, name)) continue;\n yield name;\n }\n}\n\n/**\n * Pre-indexed pending writes for O(1) lookups, avoiding repeated\n * linear scans in _prepareSingleTask and _scratchpad.\n */\nexport type PendingWritesIndex = {\n nullResume: unknown | undefined;\n resumeByTaskId: Map<string, unknown[]>;\n successfulWriteTaskIds: Set<string>;\n};\n\n/**\n * Build an index over pendingWrites for O(1) lookups.\n *\n * @internal Exported for benchmarks and regression tests only.\n */\nexport function _indexPendingWrites(\n pendingWrites: [string, string, unknown][] | undefined\n): PendingWritesIndex {\n let nullResume: unknown | undefined;\n const resumeByTaskId = new Map<string, unknown[]>();\n const successfulWriteTaskIds = new Set<string>();\n if (pendingWrites) {\n for (const [tid, chan, val] of pendingWrites) {\n if (tid === NULL_TASK_ID && chan === RESUME && nullResume === undefined) {\n nullResume = val;\n }\n if (chan === RESUME && tid !== NULL_TASK_ID) {\n let arr = resumeByTaskId.get(tid);\n if (!arr) {\n arr = [];\n resumeByTaskId.set(tid, arr);\n }\n arr.push(val);\n }\n if (chan !== ERROR) {\n successfulWriteTaskIds.add(tid);\n }\n }\n }\n return { nullResume, resumeByTaskId, successfulWriteTaskIds };\n}\n\nexport type NextTaskExtraFields = {\n step: number;\n isResuming?: boolean;\n checkpointer?: BaseCheckpointSaver;\n manager?: CallbackManagerForChainRun;\n store?: BaseStore;\n stream?: IterableReadableWritableStream;\n triggerToNodes?: Record<string, string[]>;\n updatedChannels?: Set<string>;\n pendingWritesIndex?: PendingWritesIndex;\n};\n\nexport type NextTaskExtraFieldsWithStore = NextTaskExtraFields & {\n store?: BaseStore;\n};\n\nexport type NextTaskExtraFieldsWithoutStore = NextTaskExtraFields & {\n store?: never;\n};\n\nexport function _prepareNextTasks<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: [string, string, unknown][] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: false,\n extra: NextTaskExtraFieldsWithoutStore\n): Record<string, PregelTaskDescription>;\n\nexport function _prepareNextTasks<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: [string, string, unknown][] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: true,\n extra: NextTaskExtraFieldsWithStore\n): Record<string, PregelExecutableTask<keyof Nn, keyof Cc>>;\n\n/**\n * Prepare the set of tasks that will make up the next Pregel step.\n * This is the union of all PUSH tasks (Sends) and PULL tasks (nodes triggered\n * by edges).\n */\nexport function _prepareNextTasks<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: [string, string, unknown][] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: boolean,\n extra: NextTaskExtraFieldsWithStore | NextTaskExtraFieldsWithoutStore\n):\n | Record<string, PregelTaskDescription>\n | Record<string, PregelExecutableTask<keyof Nn, keyof Cc>> {\n const tasks:\n | Record<string, PregelExecutableTask<keyof Nn, keyof Cc>>\n | Record<string, PregelTaskDescription> = {};\n\n // Pre-index pendingWrites once for O(1) lookups in _prepareSingleTask/_scratchpad\n const indexedExtra: typeof extra = extra.pendingWritesIndex\n ? extra\n : { ...extra, pendingWritesIndex: _indexPendingWrites(pendingWrites) };\n\n // Consume pending tasks\n const tasksChannel = channels[TASKS] as Topic<SendProtocol> | undefined;\n\n if (tasksChannel?.isAvailable()) {\n const len = tasksChannel.get().length;\n for (let i = 0; i < len; i += 1) {\n const task = _prepareSingleTask(\n [PUSH, i],\n checkpoint,\n pendingWrites,\n processes,\n channels,\n config,\n forExecution,\n indexedExtra\n );\n if (task !== undefined) {\n tasks[task.id] = task;\n }\n }\n }\n\n // Check if any processes should be run in next step\n // If so, prepare the values to be passed to them\n for (const name of candidateNodes(checkpoint, processes, indexedExtra)) {\n const task = _prepareSingleTask(\n [PULL, name],\n checkpoint,\n pendingWrites,\n processes,\n channels,\n config,\n forExecution,\n indexedExtra\n );\n if (task !== undefined) {\n tasks[task.id] = task;\n }\n }\n return tasks;\n}\n\nexport function _prepareSingleTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n taskPath: SimpleTaskPath,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: false,\n extra: NextTaskExtraFields\n): PregelTaskDescription | undefined;\n\nexport function _prepareSingleTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n taskPath: TaskPath,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: true,\n extra: NextTaskExtraFields\n): PregelExecutableTask<keyof Nn, keyof Cc> | undefined;\n\nexport function _prepareSingleTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n taskPath: TaskPath,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: boolean,\n extra: NextTaskExtraFieldsWithStore\n): PregelTaskDescription | PregelExecutableTask<keyof Nn, keyof Cc> | undefined;\n\n/**\n * Prepares a single task for the next Pregel step, given a task path, which\n * uniquely identifies a PUSH or PULL task within the graph.\n */\nexport function _prepareSingleTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n taskPath: TaskPath,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: LangGraphRunnableConfig,\n forExecution: boolean,\n extra: NextTaskExtraFields\n):\n | PregelTaskDescription\n | PregelExecutableTask<keyof Nn, keyof Cc>\n | undefined {\n const { step, checkpointer, manager } = extra;\n const configurable = config.configurable ?? {};\n const parentNamespace = configurable.checkpoint_ns ?? \"\";\n\n if (taskPath[0] === PUSH && isCall(taskPath[taskPath.length - 1])) {\n const call = taskPath[taskPath.length - 1] as Call;\n const proc = getRunnableForFunc(call.name, call.func);\n const triggers = [PUSH];\n const checkpointNamespace =\n parentNamespace === \"\"\n ? call.name\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${call.name}`;\n const id = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n call.name,\n PUSH,\n taskPath[1],\n taskPath[2],\n ]),\n checkpoint.id\n );\n const taskCheckpointNamespace = `${checkpointNamespace}${CHECKPOINT_NAMESPACE_END}${id}`;\n\n // we append `true` to the task path to indicate that a call is being made\n // so we should not return interrupts from this task (responsibility lies with the parent)\n const outputTaskPath = [...taskPath.slice(0, 3), true] as VariadicTaskPath;\n const metadata = {\n langgraph_step: step,\n langgraph_node: call.name,\n langgraph_triggers: triggers,\n langgraph_path: outputTaskPath,\n langgraph_checkpoint_ns: taskCheckpointNamespace,\n checkpoint_ns: taskCheckpointNamespace,\n };\n if (forExecution) {\n const writes: [keyof Cc, unknown][] = [];\n const executionInfo: ExecutionInfo = {\n checkpointId: checkpoint.id,\n checkpointNs: taskCheckpointNamespace,\n taskId: id,\n threadId: configurable.thread_id as string | undefined,\n runId: config.runId != null ? String(config.runId) : undefined,\n nodeAttempt: 1,\n };\n const task = {\n name: call.name,\n input: call.input,\n proc,\n writes,\n config: {\n ...patchConfig(\n mergeConfigs(config, {\n metadata,\n store: extra.store ?? config.store,\n }),\n {\n runName: call.name,\n callbacks: manager?.getChild(`graph:step:${step}`),\n configurable: {\n [CONFIG_KEY_TASK_ID]: id,\n [CONFIG_KEY_SEND]: (writes_: PendingWrite[]) =>\n _localWrite(\n (items: PendingWrite<keyof Cc>[]) => writes.push(...items),\n processes,\n writes_\n ),\n [CONFIG_KEY_READ]: (\n select_: Array<keyof Cc> | keyof Cc,\n fresh_: boolean = false\n ) =>\n _localRead(\n checkpoint,\n channels,\n {\n name: call.name,\n writes: writes as PendingWrite[],\n triggers,\n path: outputTaskPath,\n },\n select_,\n fresh_\n ),\n [CONFIG_KEY_CHECKPOINTER]:\n checkpointer ?? configurable[CONFIG_KEY_CHECKPOINTER],\n [CONFIG_KEY_CHECKPOINT_MAP]: {\n ...configurable[CONFIG_KEY_CHECKPOINT_MAP],\n [parentNamespace]: checkpoint.id,\n },\n [CONFIG_KEY_SCRATCHPAD]: _scratchpad({\n pendingWrites: pendingWrites ?? [],\n taskId: id,\n currentTaskInput: call.input,\n resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],\n namespaceHash: XXH3(taskCheckpointNamespace),\n pendingWritesIndex: extra.pendingWritesIndex,\n }),\n [CONFIG_KEY_PREVIOUS_STATE]:\n checkpoint.channel_values[PREVIOUS],\n checkpoint_id: undefined,\n checkpoint_ns: taskCheckpointNamespace,\n },\n }\n ),\n executionInfo,\n },\n triggers,\n retry_policy: call.retry,\n cache_key: call.cache\n ? {\n key: XXH3((call.cache.keyFunc ?? JSON.stringify)([call.input])),\n ns: [CACHE_NS_WRITES, call.name ?? \"__dynamic__\"],\n ttl: call.cache.ttl,\n }\n : undefined,\n id,\n path: outputTaskPath,\n writers: [],\n timeout: call.timeout,\n } satisfies PregelExecutableTask<keyof Nn, keyof Cc>;\n return task;\n } else {\n return {\n id,\n name: call.name,\n interrupts: [],\n path: outputTaskPath,\n };\n }\n } else if (taskPath[0] === PUSH) {\n const index =\n typeof taskPath[1] === \"number\"\n ? taskPath[1]\n : parseInt(taskPath[1] as string, 10);\n\n if (!channels[TASKS]?.isAvailable()) {\n return undefined;\n }\n\n const sends = channels[TASKS].get() as SendProtocol[];\n if (index < 0 || index >= sends.length) {\n return undefined;\n }\n\n const packet =\n _isSendInterface(sends[index]) && !_isSend(sends[index])\n ? new Send(\n sends[index].node,\n sends[index].args,\n sends[index].timeout !== undefined\n ? { timeout: sends[index].timeout }\n : undefined\n )\n : sends[index];\n\n if (!_isSendInterface(packet)) {\n console.warn(\n `Ignoring invalid packet ${JSON.stringify(packet)} in pending sends.`\n );\n return undefined;\n }\n if (!(packet.node in processes)) {\n console.warn(\n `Ignoring unknown node name ${packet.node} in pending sends.`\n );\n return undefined;\n }\n const triggers = [PUSH];\n const checkpointNamespace =\n parentNamespace === \"\"\n ? packet.node\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${packet.node}`;\n const taskId = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n packet.node,\n PUSH,\n index.toString(),\n ]),\n checkpoint.id\n );\n const taskCheckpointNamespace = `${checkpointNamespace}${CHECKPOINT_NAMESPACE_END}${taskId}`;\n let metadata = {\n langgraph_step: step,\n langgraph_node: packet.node,\n langgraph_triggers: triggers,\n langgraph_path: taskPath.slice(0, 3),\n langgraph_checkpoint_ns: taskCheckpointNamespace,\n checkpoint_ns: taskCheckpointNamespace,\n };\n if (forExecution) {\n const proc = processes[packet.node];\n const node = proc.getNode();\n if (node !== undefined) {\n if (proc.metadata !== undefined) {\n metadata = { ...metadata, ...proc.metadata };\n }\n const writes: [keyof Cc, unknown][] = [];\n const executionInfo: ExecutionInfo = {\n checkpointId: checkpoint.id,\n checkpointNs: taskCheckpointNamespace,\n taskId,\n threadId: configurable.thread_id as string | undefined,\n runId: config.runId != null ? String(config.runId) : undefined,\n nodeAttempt: 1,\n };\n return {\n name: packet.node,\n input: packet.args,\n proc: node,\n subgraphs: proc.subgraphs,\n writes,\n config: {\n ...patchConfig(\n mergeConfigs(config, {\n metadata,\n tags: proc.tags,\n store: extra.store ?? config.store,\n }),\n {\n runName: packet.node,\n callbacks: manager?.getChild(`graph:step:${step}`),\n configurable: {\n [CONFIG_KEY_TASK_ID]: taskId,\n [CONFIG_KEY_SEND]: (writes_: PendingWrite[]) =>\n _localWrite(\n (items: PendingWrite<keyof Cc>[]) =>\n writes.push(...items),\n processes,\n writes_\n ),\n [CONFIG_KEY_READ]: (\n select_: Array<keyof Cc> | keyof Cc,\n fresh_: boolean = false\n ) =>\n _localRead(\n checkpoint,\n channels,\n {\n name: packet.node,\n writes: writes as PendingWrite[],\n triggers,\n path: taskPath,\n },\n select_,\n fresh_\n ),\n [CONFIG_KEY_CHECKPOINTER]:\n checkpointer ?? configurable[CONFIG_KEY_CHECKPOINTER],\n [CONFIG_KEY_CHECKPOINT_MAP]: {\n ...configurable[CONFIG_KEY_CHECKPOINT_MAP],\n [parentNamespace]: checkpoint.id,\n },\n [CONFIG_KEY_SCRATCHPAD]: _scratchpad({\n pendingWrites: pendingWrites ?? [],\n taskId,\n currentTaskInput: packet.args,\n resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],\n namespaceHash: XXH3(taskCheckpointNamespace),\n pendingWritesIndex: extra.pendingWritesIndex,\n }),\n [CONFIG_KEY_PREVIOUS_STATE]:\n checkpoint.channel_values[PREVIOUS],\n checkpoint_id: undefined,\n checkpoint_ns: taskCheckpointNamespace,\n },\n }\n ),\n executionInfo,\n },\n triggers,\n retry_policy: proc.retryPolicy,\n cache_key: proc.cachePolicy\n ? {\n key: XXH3(\n (proc.cachePolicy.keyFunc ?? JSON.stringify)([packet.args])\n ),\n ns: [CACHE_NS_WRITES, proc.name ?? \"__dynamic__\", packet.node],\n ttl: proc.cachePolicy.ttl,\n }\n : undefined,\n id: taskId,\n path: taskPath,\n writers: proc.getWriters(),\n // a per-Send timeout overrides the target node's configured timeout\n timeout: packet.timeout ?? proc.timeout,\n } satisfies PregelExecutableTask<keyof Nn, keyof Cc>;\n }\n } else {\n return {\n id: taskId,\n name: packet.node,\n interrupts: [],\n path: taskPath,\n } satisfies PregelTaskDescription;\n }\n } else if (taskPath[0] === PULL) {\n const name = taskPath[1].toString();\n const proc = processes[name];\n if (proc === undefined) {\n return undefined;\n }\n\n // Check if this task already has successful writes in the pending writes\n if (pendingWrites?.length) {\n // Find the task ID for this node/path\n const checkpointNamespace =\n parentNamespace === \"\"\n ? name\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${name}`;\n\n const taskId = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n name,\n PULL,\n name,\n ]),\n checkpoint.id\n );\n\n const hasSuccessfulWrites = extra.pendingWritesIndex\n ? extra.pendingWritesIndex.successfulWriteTaskIds.has(taskId)\n : pendingWrites.some((w) => w[0] === taskId && w[1] !== ERROR);\n\n if (hasSuccessfulWrites) {\n return undefined;\n }\n }\n\n const nullVersion = getNullChannelVersion(checkpoint.channel_versions);\n if (nullVersion === undefined) {\n return undefined;\n }\n const seen = checkpoint.versions_seen[name] ?? {};\n\n // Find the first trigger that is available and has a new version\n const trigger = proc.triggers.find((chan) => {\n if (!channels[chan].isAvailable()) return false;\n\n return (\n (checkpoint.channel_versions[chan] ?? nullVersion) >\n (seen[chan] ?? nullVersion)\n );\n });\n\n // If any of the channels read by this process were updated\n if (trigger !== undefined) {\n const val = _procInput(proc, channels, forExecution);\n if (val === undefined) {\n return undefined;\n }\n const checkpointNamespace =\n parentNamespace === \"\"\n ? name\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${name}`;\n const taskId = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n name,\n PULL,\n [trigger],\n ]),\n checkpoint.id\n );\n const taskCheckpointNamespace = `${checkpointNamespace}${CHECKPOINT_NAMESPACE_END}${taskId}`;\n let metadata = {\n langgraph_step: step,\n langgraph_node: name,\n langgraph_triggers: [trigger],\n langgraph_path: taskPath,\n langgraph_checkpoint_ns: taskCheckpointNamespace,\n checkpoint_ns: taskCheckpointNamespace,\n };\n if (forExecution) {\n const node = proc.getNode();\n if (node !== undefined) {\n if (proc.metadata !== undefined) {\n metadata = { ...metadata, ...proc.metadata };\n }\n const writes: [keyof Cc, unknown][] = [];\n const executionInfo: ExecutionInfo = {\n checkpointId: checkpoint.id,\n checkpointNs: taskCheckpointNamespace,\n taskId,\n threadId: configurable.thread_id as string | undefined,\n runId: config.runId != null ? String(config.runId) : undefined,\n nodeAttempt: 1,\n };\n return {\n name,\n input: val,\n proc: node,\n subgraphs: proc.subgraphs,\n writes,\n config: {\n ...patchConfig(\n mergeConfigs(config, {\n metadata,\n tags: proc.tags,\n store: extra.store ?? config.store,\n }),\n {\n runName: name,\n callbacks: manager?.getChild(`graph:step:${step}`),\n configurable: {\n [CONFIG_KEY_TASK_ID]: taskId,\n [CONFIG_KEY_SEND]: (writes_: PendingWrite[]) =>\n _localWrite(\n (items: PendingWrite<keyof Cc>[]) => {\n writes.push(...items);\n },\n processes,\n writes_\n ),\n [CONFIG_KEY_READ]: (\n select_: Array<keyof Cc> | keyof Cc,\n fresh_: boolean = false\n ) =>\n _localRead(\n checkpoint,\n channels,\n {\n name,\n writes: writes as PendingWrite[],\n triggers: [trigger],\n path: taskPath,\n },\n select_,\n fresh_\n ),\n [CONFIG_KEY_CHECKPOINTER]:\n checkpointer ?? configurable[CONFIG_KEY_CHECKPOINTER],\n [CONFIG_KEY_CHECKPOINT_MAP]: {\n ...configurable[CONFIG_KEY_CHECKPOINT_MAP],\n [parentNamespace]: checkpoint.id,\n },\n [CONFIG_KEY_SCRATCHPAD]: _scratchpad({\n pendingWrites: pendingWrites ?? [],\n taskId,\n currentTaskInput: val,\n resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],\n namespaceHash: XXH3(taskCheckpointNamespace),\n pendingWritesIndex: extra.pendingWritesIndex,\n }),\n [CONFIG_KEY_PREVIOUS_STATE]:\n checkpoint.channel_values[PREVIOUS],\n checkpoint_id: undefined,\n checkpoint_ns: taskCheckpointNamespace,\n },\n }\n ),\n executionInfo,\n },\n triggers: [trigger],\n retry_policy: proc.retryPolicy,\n cache_key: proc.cachePolicy\n ? {\n key: XXH3(\n (proc.cachePolicy.keyFunc ?? JSON.stringify)([val])\n ),\n ns: [CACHE_NS_WRITES, proc.name ?? \"__dynamic__\", name],\n ttl: proc.cachePolicy.ttl,\n }\n : undefined,\n id: taskId,\n path: taskPath,\n writers: proc.getWriters(),\n timeout: proc.timeout,\n } satisfies PregelExecutableTask<keyof Nn, keyof Cc>;\n }\n } else {\n return {\n id: taskId,\n name,\n interrupts: [],\n path: taskPath,\n } satisfies PregelTaskDescription;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Prepare an immediate node-level error handler task for a failed task.\n *\n * The handler runs only after the failed node's retry policy is exhausted (the\n * runner schedules it once a non-bubble-up error settles). It is prepared like\n * a PUSH task targeting the auto-generated handler node, receives the failed\n * node's input, and is injected with a {@link NodeError} under\n * {@link CONFIG_KEY_NODE_ERROR} so the handler can inspect the failure\n * provenance (and route via `Command({ goto })`).\n *\n * @internal\n */\nexport function _prepareNodeErrorHandlerTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n failedTask: PregelExecutableTask<keyof Nn, keyof Cc>,\n handlerNodeName: string,\n error: Error,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: LangGraphRunnableConfig,\n extra: NextTaskExtraFieldsWithStore\n): PregelExecutableTask<keyof Nn, keyof Cc> | undefined {\n const { step, checkpointer, manager } = extra;\n const proc = processes[handlerNodeName as keyof Nn];\n if (proc === undefined) {\n return undefined;\n }\n const node = proc.getNode();\n if (node === undefined) {\n return undefined;\n }\n\n const configurable = config.configurable ?? {};\n const parentNamespace = configurable.checkpoint_ns ?? \"\";\n const triggers = [PUSH];\n const checkpointNamespace =\n parentNamespace === \"\"\n ? handlerNodeName\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${handlerNodeName}`;\n // Deterministic task id (includes the failed task id) so resuming from a\n // checkpoint reconstructs the same handler task.\n const taskId = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n handlerNodeName,\n PUSH,\n \"node_error_handler\",\n failedTask.id,\n ]),\n checkpoint.id\n );\n const taskCheckpointNamespace = `${checkpointNamespace}${CHECKPOINT_NAMESPACE_END}${taskId}`;\n // Last path element is a string (not `true`), so interrupts raised by the\n // handler are surfaced normally rather than deferred to a parent call.\n const taskPath = [\n PUSH,\n String(failedTask.name),\n handlerNodeName,\n false,\n ] as VariadicTaskPath;\n\n let metadata = {\n langgraph_step: step,\n langgraph_node: handlerNodeName,\n langgraph_triggers: triggers,\n langgraph_path: taskPath,\n langgraph_checkpoint_ns: taskCheckpointNamespace,\n checkpoint_ns: taskCheckpointNamespace,\n };\n if (proc.metadata !== undefined) {\n metadata = { ...metadata, ...proc.metadata };\n }\n\n const writes: [keyof Cc, unknown][] = [];\n const executionInfo: ExecutionInfo = {\n checkpointId: checkpoint.id,\n checkpointNs: taskCheckpointNamespace,\n taskId,\n threadId: configurable.thread_id as string | undefined,\n runId: config.runId != null ? String(config.runId) : undefined,\n nodeAttempt: 1,\n };\n\n return {\n name: handlerNodeName as keyof Nn,\n input: failedTask.input,\n proc: node,\n subgraphs: proc.subgraphs,\n writes,\n config: {\n ...patchConfig(\n mergeConfigs(config, {\n metadata,\n tags: proc.tags,\n store: extra.store ?? config.store,\n }),\n {\n runName: handlerNodeName,\n callbacks: manager?.getChild(`graph:step:${step}`),\n configurable: {\n [CONFIG_KEY_TASK_ID]: taskId,\n [CONFIG_KEY_SEND]: (writes_: PendingWrite[]) =>\n _localWrite(\n (items: PendingWrite<keyof Cc>[]) => writes.push(...items),\n processes,\n writes_\n ),\n [CONFIG_KEY_READ]: (\n select_: Array<keyof Cc> | keyof Cc,\n fresh_: boolean = false\n ) =>\n _localRead(\n checkpoint,\n channels,\n {\n name: handlerNodeName,\n writes: writes as PendingWrite[],\n triggers,\n path: taskPath,\n },\n select_,\n fresh_\n ),\n [CONFIG_KEY_CHECKPOINTER]:\n checkpointer ?? configurable[CONFIG_KEY_CHECKPOINTER],\n [CONFIG_KEY_CHECKPOINT_MAP]: {\n ...configurable[CONFIG_KEY_CHECKPOINT_MAP],\n [parentNamespace]: checkpoint.id,\n },\n [CONFIG_KEY_SCRATCHPAD]: _scratchpad({\n pendingWrites: pendingWrites ?? [],\n taskId,\n currentTaskInput: failedTask.input,\n resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],\n namespaceHash: XXH3(taskCheckpointNamespace),\n }),\n [CONFIG_KEY_PREVIOUS_STATE]: checkpoint.channel_values[PREVIOUS],\n [CONFIG_KEY_NODE_ERROR]: new NodeError(\n String(failedTask.name),\n error\n ),\n checkpoint_id: undefined,\n checkpoint_ns: taskCheckpointNamespace,\n },\n }\n ),\n executionInfo,\n },\n triggers,\n retry_policy: proc.retryPolicy,\n cache_key: undefined,\n id: taskId,\n path: taskPath,\n writers: proc.getWriters(),\n } satisfies PregelExecutableTask<keyof Nn, keyof Cc>;\n}\n\n/**\n * Function injected under CONFIG_KEY_READ in task config, to read current state.\n * Used by conditional edges to read a copy of the state with reflecting the writes\n * from that node only.\n *\n * @internal\n */\nfunction _procInput(\n proc: PregelNode,\n channels: StrRecord<string, BaseChannel>,\n forExecution: boolean\n) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let val: any;\n\n if (typeof proc.channels === \"object\" && !Array.isArray(proc.channels)) {\n val = {};\n for (const [k, chan] of Object.entries(proc.channels)) {\n if (proc.triggers.includes(chan)) {\n try {\n val[k] = readChannel(channels, chan, false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.name === EmptyChannelError.unminifiable_name) {\n return undefined;\n } else {\n throw e;\n }\n }\n } else if (chan in channels) {\n try {\n val[k] = readChannel(channels, chan, false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.name === EmptyChannelError.unminifiable_name) {\n continue;\n } else {\n throw e;\n }\n }\n }\n }\n } else if (Array.isArray(proc.channels)) {\n let successfulRead = false;\n for (const chan of proc.channels) {\n try {\n val = readChannel(channels, chan, false);\n successfulRead = true;\n break;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.name === EmptyChannelError.unminifiable_name) {\n continue;\n } else {\n throw e;\n }\n }\n }\n if (!successfulRead) {\n return undefined;\n }\n } else {\n throw new Error(\n `Invalid channels type, expected list or dict, got ${proc.channels}`\n );\n }\n\n // If the process has a mapper, apply it to the value\n if (forExecution && proc.mapper !== undefined) {\n val = proc.mapper(val);\n }\n\n return val;\n}\n\n/**\n * Remove any values belonging to UntrackedValue channels from a Send packet\n * before checkpointing.\n *\n * Send is often called with state to be passed to the destination node,\n * which may contain UntrackedValues at the top level.\n *\n * @internal\n */\nexport function sanitizeUntrackedValuesInSend(\n packet: Send,\n channels: StrRecord<string, BaseChannel>\n): Send {\n if (typeof packet.args !== \"object\" || packet.args === null) {\n // Not a dict-like arg\n return packet;\n }\n\n // Top-level keys should be channel names\n const sanitizedArg: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(packet.args)) {\n const channel = channels[key];\n // Check if channel is an UntrackedValue by its lc_graph_name\n if (!channel || channel.lc_graph_name !== \"UntrackedValue\") {\n sanitizedArg[key] = value;\n }\n }\n\n return new Send(packet.node, sanitizedArg);\n}\n\nfunction _scratchpad({\n pendingWrites,\n taskId,\n currentTaskInput,\n resumeMap,\n namespaceHash,\n pendingWritesIndex,\n}: {\n pendingWrites: CheckpointPendingWrite[];\n taskId: string;\n currentTaskInput: unknown;\n resumeMap: Record<string, unknown> | undefined;\n namespaceHash: string;\n pendingWritesIndex?: PendingWritesIndex;\n}): PregelScratchpad {\n const nullResume = pendingWritesIndex\n ? pendingWritesIndex.nullResume\n : pendingWrites.find(\n ([writeTaskId, chan]) => writeTaskId === NULL_TASK_ID && chan === RESUME\n )?.[2];\n\n const resume = (() => {\n // flatMap flattens array resume values one level; mirror that with .flat()\n const result: unknown[] = pendingWritesIndex\n ? (pendingWritesIndex.resumeByTaskId.get(taskId) ?? []).flat()\n : pendingWrites\n .filter(\n ([writeTaskId, chan]) => writeTaskId === taskId && chan === RESUME\n )\n .flatMap(([_writeTaskId, _chan, resume]) => resume);\n\n if (resumeMap != null && namespaceHash in resumeMap) {\n const mappedResume = resumeMap[namespaceHash];\n result.push(mappedResume);\n }\n\n return result;\n })();\n\n const scratchpad = {\n callCounter: 0,\n interruptCounter: -1,\n resume,\n nullResume,\n subgraphCounter: 0,\n currentTaskInput,\n consumeNullResume: () => {\n if (scratchpad.nullResume) {\n delete scratchpad.nullResume;\n pendingWrites.splice(\n pendingWrites.findIndex(\n ([writeTaskId, chan]) =>\n writeTaskId === NULL_TASK_ID && chan === RESUME\n ),\n 1\n );\n return nullResume;\n }\n\n return undefined;\n },\n };\n return scratchpad;\n}\n"],"mappings":";;;;;;;;;;;AA6FA,MAAa,aAAa,YAAqB;AAC7C,QAAO,YAAY,KAAA,IAAY,UAAU,IAAI;;AAG/C,SAAS,iBACP,iBACA,gBACA;AACA,KAAI,kBAAkB,KAAM,QAAO;AAEnC,MAAK,MAAM,QAAQ,gBACjB,KAAI,eAAe,MAAO,QAAO;AAGnC,QAAO;;AAIT,SAAS,qBACP,iBAC6B;CAC7B,IAAI;AACJ,MAAK,MAAM,QAAQ,iBAAiB;AAClC,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,iBAAiB,KAAK,CAAE;AAClE,MAAI,cAAc,KAChB,cAAa,gBAAgB;MAE7B,cAAa,kBAAkB,YAAY,gBAAgB,MAAM;;AAGrE,QAAO;;AAGT,SAAgB,gBACd,YACA,gBACA,OACS;CACT,MAAM,cAAc,sBAAsB,WAAW,iBAAiB;CACtE,MAAM,OAAO,WAAW,cAAA,oBAA4B,EAAE;CAEtD,IAAI,oBAAoB;AAExB,MACG,WAAW,iBAAA,gBAA2B,gBACtC,KAAA,gBAAe,aAEhB,qBAAoB;KAEpB,MAAK,MAAM,QAAQ,WAAW,kBAAkB;AAC9C,MACE,CAAC,OAAO,UAAU,eAAe,KAAK,WAAW,kBAAkB,KAAK,CAExE;AAEF,MAAI,WAAW,iBAAiB,SAAS,KAAK,SAAS,cAAc;AACnE,uBAAoB;AACpB;;;CAKN,MAAM,mCAAmC,MAAM,MAAM,SACnD,mBAAmB,MACf,CAAC,KAAK,QAAQ,MAAM,SAAS,WAAW,GACxC,eAAe,SAAS,KAAK,KAAK,CACvC;AAED,QAAO,qBAAqB;;AAG9B,SAAgB,WACd,YACA,UACA,MACA,QACA,QAAiB,OACkB;CACnC,IAAI,0BAAU,IAAI,KAAe;AAEjC,KAAI,CAAC,MAAM,QAAQ,OAAO,EAAE;AAC1B,OAAK,MAAM,CAAC,MAAM,KAAK,OACrB,KAAI,MAAM,QAAQ;AAChB,aAAU,IAAI,IAAI,CAAC,EAAE,CAAC;AACtB;;AAGJ,YAAU,2BAAW,IAAI,KAAK;OAE9B,WAAU,IAAI,IACZ,OAAO,QAAQ,MAAM,KAAK,OAAO,MAAM,CAAC,KAAK,OAAO,QAAQ,EAAE,CAAC,CAChE;CAGH,IAAI;AAEJ,KAAI,SAAS,QAAQ,OAAO,GAAG;EAC7B,MAAM,gBAAgB,OAAO,YAC3B,OAAO,QAAQ,SAAS,CAAC,QAAQ,CAAC,GAAG,OAAO,QAAQ,IAAI,EAAc,CAAC,CACxE;EAMD,MAAM,qCAAqB,IAAI,KAAa;AAC5C,OAAK,MAAM,KAAK,eAAe;AAC7B,OAAI,CAAC,OAAO,UAAU,eAAe,KAAK,eAAe,EAAE,CAAE;GAC7D,MAAM,KAAM,cAA8C;AAC1D,OAAI,eAAe,GAAG,IAAI,GAAG,aAAa,CAAE,oBAAmB,IAAI,EAAE;;EAGvE,MAAM,gBAAgB,iBACpB,YACA,eACA,IACA,EACE,oBACD,CACF;EACD,MAAM,cAAc,cAAc,eAAqB,cAAc;AAErE,eACE,eAAe,cAAc,EAC7B,aACA,CAAC,KAAK,EACN,KAAA,GACA,KAAA,EACD;AACD,WAAS,aAAa;GAAE,GAAG;GAAU,GAAG;GAAa,EAAE,OAAO;OAE9D,UAAS,aAAa,UAAU,OAAO;AAGzC,QAAO;;AAGT,SAAgB,YAEd,QACA,WAEA,QACA;AACA,MAAK,MAAM,CAAC,MAAM,UAAU,OAC1B,KAAI,CAAA,iBAAA,iBAAa,CAAC,SAAS,KAAK,IAAI,SAAS,MAAM;AACjD,MAAI,CAAC,QAAQ,MAAM,CACjB,OAAM,IAAI,mBACR,mDAAmD,KAAK,UACtD,MACD,GACF;AAEH,MAAI,EAAE,MAAM,QAAQ,WAClB,OAAM,IAAI,mBACR,sBAAsB,MAAM,KAAK,kBAClC;;AAIP,QAAO,OAAO;;AAGhB,MAAM,SAAS,IAAI,IAA8B;CAC/C;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,eAAoC,IAAI,IAAI,SAAS;AAE3D,SAAgB,aACd,YACA,UACA,OAEA,gBACA,gBACa;CAGb,MAAM,4BAAY,IAAI,KAAsC;AAC5D,MAAK,MAAM,QAAQ,MACjB,WAAU,IAAI,MAAM,KAAK,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,CAAC;AAKnD,OAAM,MAAM,GAAG,MAAM;EACnB,MAAM,QAAQ,UAAU,IAAI,EAAE;EAC9B,MAAM,QAAQ,UAAU,IAAI,EAAE;AAG9B,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,MAAM,QAAQ,MAAM,OAAO,EAAE,KAAK,GAAG;AAChE,OAAI,MAAM,KAAK,MAAM,GAAI,QAAO;AAChC,OAAI,MAAM,KAAK,MAAM,GAAI,QAAO;;AAIlC,SAAO,MAAM,SAAS,MAAM;GAC5B;CAGF,MAAM,eAAe,gBAAgB,SAAS;CAG9C,IAAI,WAAW;CACf,MAAM,oCAAoB,IAAI,KAAa;AAC3C,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,KAAK,SAAS,SAAS,EAAG,YAAW;AACzC,aAAW,cAAc,KAAK,UAAU,EAAE;AAC1C,OAAK,MAAM,QAAQ,KAAK,UAAU;AAChC,OAAI,QAAQ,WAAW,iBACrB,YAAW,cAAc,KAAK,MAAM,QAClC,WAAW,iBAAiB;AAEhC,OAAI,CAAC,aAAa,IAAI,KAAK,CACzB,mBAAkB,IAAI,KAAK;;;CAMjC,IAAI,aAAa,qBAAqB,WAAW,iBAAiB;CAElE,IAAI,iBAAiB;AACrB,MAAK,MAAM,QAAQ,kBACjB,KAAI,QAAQ,gBAAgB,aAAa,MAAM,SAAS;MAClD,mBAAmB,KAAA,GAAW;AAChC,cAAW,iBAAiB,QAAQ,eAAe,WAAW;AAC9D,oBAAiB;;;CAMvB,MAAM,yBAAyB,EAAE;AACjC,MAAK,MAAM,QAAQ,MACjB,MAAK,MAAM,CAAC,MAAM,QAAQ,KAAK,OAC7B,KAAI,OAAO,IAAI,KAAK,EAAE,YAEX,QAAQ,cAAc;AAC/B,yBAAuB,UAAU,EAAE;AACnC,yBAAuB,MAAM,KAAK,IAAI;;AAM5C,KAAI,cAAc,QAAQ,kBAAkB,KAC1C,cAAa,iBAAiB,eAAe,WAAW,GAAG;CAG7D,MAAM,kCAA+B,IAAI,KAAK;AAE9C,MAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,uBAAuB,CAC/D,KAAI,QAAQ,cAAc;EACxB,MAAM,UAAU,aAAa;EAC7B,IAAI;AACJ,MAAI;AACF,aAAU,QAAQ,OAAO,KAAK;WAEvB,GAAQ;AACf,OAAI,EAAE,SAAS,mBAAmB,mBAAmB;IACnD,MAAM,eAAe,IAAI,mBACvB,+BAA+B,KAAK,gBAAgB,KAAK,UACvD,KACD,CAAC,IAAI,EAAE,UACT;AACD,iBAAa,gBAAgB,EAAE;AAC/B,UAAM;SAEN,OAAM;;AAGV,MAAI,WAAW,mBAAmB,KAAA,GAAW;AAC3C,cAAW,iBAAiB,QAAQ,eAAe,WAAW;AAG9D,OAAI,QAAQ,aAAa,CAAE,iBAAgB,IAAI,KAAK;;;AAM1D,KAAI,SACF,MAAK,MAAM,QAAQ,cAAc;AAC/B,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,cAAc,KAAK,CAAE;EAE/D,MAAM,UAAU,aAAa;AAC7B,MAAI,QAAQ,aAAa,IAAI,CAAC,gBAAgB,IAAI,KAAK;OACrC,QAAQ,OAAO,EAAE,CAAC,IAEnB,mBAAmB,KAAA,GAAW;AAC3C,eAAW,iBAAiB,QAAQ,eAAe,WAAW;AAG9D,QAAI,QAAQ,aAAa,CAAE,iBAAgB,IAAI,KAAK;;;;AAO5D,KAAI,YAAY,CAAC,iBAAiB,iBAAiB,eAAe,CAChE,MAAK,MAAM,QAAQ,cAAc;AAC/B,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,cAAc,KAAK,CAAE;EAE/D,MAAM,UAAU,aAAa;AAC7B,MAAI,QAAQ,QAAQ,IAAI,mBAAmB,KAAA,GAAW;AACpD,cAAW,iBAAiB,QAAQ,eAAe,WAAW;AAG9D,OAAI,QAAQ,aAAa,CAAE,iBAAgB,IAAI,KAAK;;;AAK1D,QAAO;;AAGT,UAAU,eACR,YACA,WACA,OACA;AAQA,KAAI,MAAM,mBAAmB,QAAQ,MAAM,kBAAkB,MAAM;EACjE,MAAM,iCAAiB,IAAI,KAAa;AAGxC,OAAK,MAAM,WAAW,MAAM,iBAAiB;GAC3C,MAAM,UAAU,MAAM,eAAe;AACrC,QAAK,MAAM,MAAM,WAAW,EAAE,CAAE,gBAAe,IAAI,GAAG;;AAIxD,SAAO,CAAC,GAAG,eAAe,CAAC,MAAM;AACjC;;AAYF,YAPsC;AACpC,OAAK,MAAM,QAAQ,WAAW,iBAC5B,KAAI,WAAW,iBAAiB,UAAU,KAAM,QAAO;AAEzD,SAAO;KACL,CAEwB;AAC5B,MAAK,MAAM,QAAQ,WAAW;AAC5B,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,WAAW,KAAK,CAAE;AAC5D,QAAM;;;;;;;;AAmBV,SAAgB,oBACd,eACoB;CACpB,IAAI;CACJ,MAAM,iCAAiB,IAAI,KAAwB;CACnD,MAAM,yCAAyB,IAAI,KAAa;AAChD,KAAI,cACF,MAAK,MAAM,CAAC,KAAK,MAAM,QAAQ,eAAe;AAC5C,MAAI,QAAA,0CAAwB,SAAA,gBAAmB,eAAe,KAAA,EAC5D,cAAa;AAEf,MAAI,SAAA,gBAAmB,QAAA,wCAAsB;GAC3C,IAAI,MAAM,eAAe,IAAI,IAAI;AACjC,OAAI,CAAC,KAAK;AACR,UAAM,EAAE;AACR,mBAAe,IAAI,KAAK,IAAI;;AAE9B,OAAI,KAAK,IAAI;;AAEf,MAAI,SAAA,YACF,wBAAuB,IAAI,IAAI;;AAIrC,QAAO;EAAE;EAAY;EAAgB;EAAwB;;;;;;;AAsD/D,SAAgB,kBAId,YACA,eACA,WACA,UACA,QACA,cACA,OAG2D;CAC3D,MAAM,QAEsC,EAAE;CAG9C,MAAM,eAA6B,MAAM,qBACrC,QACA;EAAE,GAAG;EAAO,oBAAoB,oBAAoB,cAAc;EAAE;CAGxE,MAAM,eAAe,SAAS;AAE9B,KAAI,cAAc,aAAa,EAAE;EAC/B,MAAM,MAAM,aAAa,KAAK,CAAC;AAC/B,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG;GAC/B,MAAM,OAAO,mBACX,CAAC,MAAM,EAAE,EACT,YACA,eACA,WACA,UACA,QACA,cACA,aACD;AACD,OAAI,SAAS,KAAA,EACX,OAAM,KAAK,MAAM;;;AAOvB,MAAK,MAAM,QAAQ,eAAe,YAAY,WAAW,aAAa,EAAE;EACtE,MAAM,OAAO,mBACX,CAAC,MAAM,KAAK,EACZ,YACA,eACA,WACA,UACA,QACA,cACA,aACD;AACD,MAAI,SAAS,KAAA,EACX,OAAM,KAAK,MAAM;;AAGrB,QAAO;;;;;;AAiDT,SAAgB,mBAId,UACA,YACA,eACA,WACA,UACA,QACA,cACA,OAIY;CACZ,MAAM,EAAE,MAAM,cAAc,YAAY;CACxC,MAAM,eAAe,OAAO,gBAAgB,EAAE;CAC9C,MAAM,kBAAkB,aAAa,iBAAiB;AAEtD,KAAI,SAAS,OAAA,mBAAe,OAAO,SAAS,SAAS,SAAS,GAAG,EAAE;EACjE,MAAM,OAAO,SAAS,SAAS,SAAS;EACxC,MAAM,OAAO,mBAAmB,KAAK,MAAM,KAAK,KAAK;EACrD,MAAM,WAAW,CAAC,KAAK;EACvB,MAAM,sBACJ,oBAAoB,KAChB,KAAK,OACL,GAAG,mBAAmD,KAAK;EACjE,MAAM,KAAK,MACT,KAAK,UAAU;GACb;GACA,KAAK,UAAU;GACf,KAAK;GACL;GACA,SAAS;GACT,SAAS;GACV,CAAC,EACF,WAAW,GACZ;EACD,MAAM,0BAA0B,GAAG,uBAAiD;EAIpF,MAAM,iBAAiB,CAAC,GAAG,SAAS,MAAM,GAAG,EAAE,EAAE,KAAK;EACtD,MAAM,WAAW;GACf,gBAAgB;GAChB,gBAAgB,KAAK;GACrB,oBAAoB;GACpB,gBAAgB;GAChB,yBAAyB;GACzB,eAAe;GAChB;AACD,MAAI,cAAc;GAChB,MAAM,SAAgC,EAAE;GACxC,MAAM,gBAA+B;IACnC,cAAc,WAAW;IACzB,cAAc;IACd,QAAQ;IACR,UAAU,aAAa;IACvB,OAAO,OAAO,SAAS,OAAO,OAAO,OAAO,MAAM,GAAG,KAAA;IACrD,aAAa;IACd;AA4ED,UA3Ea;IACX,MAAM,KAAK;IACX,OAAO,KAAK;IACZ;IACA;IACA,QAAQ;KACN,GAAG,YACD,aAAa,QAAQ;MACnB;MACA,OAAO,MAAM,SAAS,OAAO;MAC9B,CAAC,EACF;MACE,SAAS,KAAK;MACd,WAAW,SAAS,SAAS,cAAc,OAAO;MAClD,cAAc;QACX,qBAAqB;QACrB,mBAAmB,YAClB,aACG,UAAoC,OAAO,KAAK,GAAG,MAAM,EAC1D,WACA,QACD;QACF,mBACC,SACA,SAAkB,UAElB,WACE,YACA,UACA;QACE,MAAM,KAAK;QACH;QACR;QACA,MAAM;QACP,EACD,SACA,OACD;QACF,0BACC,gBAAgB,aAAA;QACjB,4BAA4B;QAC3B,GAAG,aAAa;SACf,kBAAkB,WAAW;QAC/B;QACA,wBAAwB,YAAY;QACnC,eAAe,iBAAiB,EAAE;QAClC,QAAQ;QACR,kBAAkB,KAAK;QACvB,WAAW,OAAO,eAAe;QACjC,eAAe,KAAK,wBAAwB;QAC5C,oBAAoB,MAAM;QAC3B,CAAC;QACD,4BACC,WAAW,eAAe;OAC5B,eAAe,KAAA;OACf,eAAe;OAChB;MACF,CACF;KACD;KACD;IACD;IACA,cAAc,KAAK;IACnB,WAAW,KAAK,QACZ;KACE,KAAK,MAAM,KAAK,MAAM,WAAW,KAAK,WAAW,CAAC,KAAK,MAAM,CAAC,CAAC;KAC/D,IAAI,CAAC,iBAAiB,KAAK,QAAQ,cAAc;KACjD,KAAK,KAAK,MAAM;KACjB,GACD,KAAA;IACJ;IACA,MAAM;IACN,SAAS,EAAE;IACX,SAAS,KAAK;IACf;QAGD,QAAO;GACL;GACA,MAAM,KAAK;GACX,YAAY,EAAE;GACd,MAAM;GACP;YAEM,SAAS,OAAA,iBAAa;EAC/B,MAAM,QACJ,OAAO,SAAS,OAAO,WACnB,SAAS,KACT,SAAS,SAAS,IAAc,GAAG;AAEzC,MAAI,CAAC,SAAA,mBAAiB,aAAa,CACjC;EAGF,MAAM,QAAQ,SAAS,OAAO,KAAK;AACnC,MAAI,QAAQ,KAAK,SAAS,MAAM,OAC9B;EAGF,MAAM,SACJ,iBAAiB,MAAM,OAAO,IAAI,CAAC,QAAQ,MAAM,OAAO,GACpD,IAAI,KACF,MAAM,OAAO,MACb,MAAM,OAAO,MACb,MAAM,OAAO,YAAY,KAAA,IACrB,EAAE,SAAS,MAAM,OAAO,SAAS,GACjC,KAAA,EACL,GACD,MAAM;AAEZ,MAAI,CAAC,iBAAiB,OAAO,EAAE;AAC7B,WAAQ,KACN,2BAA2B,KAAK,UAAU,OAAO,CAAC,oBACnD;AACD;;AAEF,MAAI,EAAE,OAAO,QAAQ,YAAY;AAC/B,WAAQ,KACN,8BAA8B,OAAO,KAAK,oBAC3C;AACD;;EAEF,MAAM,WAAW,CAAC,KAAK;EACvB,MAAM,sBACJ,oBAAoB,KAChB,OAAO,OACP,GAAG,mBAAmD,OAAO;EACnE,MAAM,SAAS,MACb,KAAK,UAAU;GACb;GACA,KAAK,UAAU;GACf,OAAO;GACP;GACA,MAAM,UAAU;GACjB,CAAC,EACF,WAAW,GACZ;EACD,MAAM,0BAA0B,GAAG,uBAAiD;EACpF,IAAI,WAAW;GACb,gBAAgB;GAChB,gBAAgB,OAAO;GACvB,oBAAoB;GACpB,gBAAgB,SAAS,MAAM,GAAG,EAAE;GACpC,yBAAyB;GACzB,eAAe;GAChB;AACD,MAAI,cAAc;GAChB,MAAM,OAAO,UAAU,OAAO;GAC9B,MAAM,OAAO,KAAK,SAAS;AAC3B,OAAI,SAAS,KAAA,GAAW;AACtB,QAAI,KAAK,aAAa,KAAA,EACpB,YAAW;KAAE,GAAG;KAAU,GAAG,KAAK;KAAU;IAE9C,MAAM,SAAgC,EAAE;IACxC,MAAM,gBAA+B;KACnC,cAAc,WAAW;KACzB,cAAc;KACd;KACA,UAAU,aAAa;KACvB,OAAO,OAAO,SAAS,OAAO,OAAO,OAAO,MAAM,GAAG,KAAA;KACrD,aAAa;KACd;AACD,WAAO;KACL,MAAM,OAAO;KACb,OAAO,OAAO;KACd,MAAM;KACN,WAAW,KAAK;KAChB;KACA,QAAQ;MACN,GAAG,YACD,aAAa,QAAQ;OACnB;OACA,MAAM,KAAK;OACX,OAAO,MAAM,SAAS,OAAO;OAC9B,CAAC,EACF;OACE,SAAS,OAAO;OAChB,WAAW,SAAS,SAAS,cAAc,OAAO;OAClD,cAAc;SACX,qBAAqB;SACrB,mBAAmB,YAClB,aACG,UACC,OAAO,KAAK,GAAG,MAAM,EACvB,WACA,QACD;SACF,mBACC,SACA,SAAkB,UAElB,WACE,YACA,UACA;SACE,MAAM,OAAO;SACL;SACR;SACA,MAAM;SACP,EACD,SACA,OACD;SACF,0BACC,gBAAgB,aAAA;SACjB,4BAA4B;SAC3B,GAAG,aAAa;UACf,kBAAkB,WAAW;SAC/B;SACA,wBAAwB,YAAY;SACnC,eAAe,iBAAiB,EAAE;SAClC;SACA,kBAAkB,OAAO;SACzB,WAAW,OAAO,eAAe;SACjC,eAAe,KAAK,wBAAwB;SAC5C,oBAAoB,MAAM;SAC3B,CAAC;SACD,4BACC,WAAW,eAAe;QAC5B,eAAe,KAAA;QACf,eAAe;QAChB;OACF,CACF;MACD;MACD;KACD;KACA,cAAc,KAAK;KACnB,WAAW,KAAK,cACZ;MACE,KAAK,MACF,KAAK,YAAY,WAAW,KAAK,WAAW,CAAC,OAAO,KAAK,CAAC,CAC5D;MACD,IAAI;OAAC;OAAiB,KAAK,QAAQ;OAAe,OAAO;OAAK;MAC9D,KAAK,KAAK,YAAY;MACvB,GACD,KAAA;KACJ,IAAI;KACJ,MAAM;KACN,SAAS,KAAK,YAAY;KAE1B,SAAS,OAAO,WAAW,KAAK;KACjC;;QAGH,QAAO;GACL,IAAI;GACJ,MAAM,OAAO;GACb,YAAY,EAAE;GACd,MAAM;GACP;YAEM,SAAS,OAAA,iBAAa;EAC/B,MAAM,OAAO,SAAS,GAAG,UAAU;EACnC,MAAM,OAAO,UAAU;AACvB,MAAI,SAAS,KAAA,EACX;AAIF,MAAI,eAAe,QAAQ;GAEzB,MAAM,sBACJ,oBAAoB,KAChB,OACA,GAAG,mBAAmD;GAE5D,MAAM,SAAS,MACb,KAAK,UAAU;IACb;IACA,KAAK,UAAU;IACf;IACA;IACA;IACD,CAAC,EACF,WAAW,GACZ;AAMD,OAJ4B,MAAM,qBAC9B,MAAM,mBAAmB,uBAAuB,IAAI,OAAO,GAC3D,cAAc,MAAM,MAAM,EAAE,OAAO,UAAU,EAAE,OAAA,YAAa,CAG9D;;EAIJ,MAAM,cAAc,sBAAsB,WAAW,iBAAiB;AACtE,MAAI,gBAAgB,KAAA,EAClB;EAEF,MAAM,OAAO,WAAW,cAAc,SAAS,EAAE;EAGjD,MAAM,UAAU,KAAK,SAAS,MAAM,SAAS;AAC3C,OAAI,CAAC,SAAS,MAAM,aAAa,CAAE,QAAO;AAE1C,WACG,WAAW,iBAAiB,SAAS,gBACrC,KAAK,SAAS;IAEjB;AAGF,MAAI,YAAY,KAAA,GAAW;GACzB,MAAM,MAAM,WAAW,MAAM,UAAU,aAAa;AACpD,OAAI,QAAQ,KAAA,EACV;GAEF,MAAM,sBACJ,oBAAoB,KAChB,OACA,GAAG,mBAAmD;GAC5D,MAAM,SAAS,MACb,KAAK,UAAU;IACb;IACA,KAAK,UAAU;IACf;IACA;IACA,CAAC,QAAQ;IACV,CAAC,EACF,WAAW,GACZ;GACD,MAAM,0BAA0B,GAAG,uBAAiD;GACpF,IAAI,WAAW;IACb,gBAAgB;IAChB,gBAAgB;IAChB,oBAAoB,CAAC,QAAQ;IAC7B,gBAAgB;IAChB,yBAAyB;IACzB,eAAe;IAChB;AACD,OAAI,cAAc;IAChB,MAAM,OAAO,KAAK,SAAS;AAC3B,QAAI,SAAS,KAAA,GAAW;AACtB,SAAI,KAAK,aAAa,KAAA,EACpB,YAAW;MAAE,GAAG;MAAU,GAAG,KAAK;MAAU;KAE9C,MAAM,SAAgC,EAAE;KACxC,MAAM,gBAA+B;MACnC,cAAc,WAAW;MACzB,cAAc;MACd;MACA,UAAU,aAAa;MACvB,OAAO,OAAO,SAAS,OAAO,OAAO,OAAO,MAAM,GAAG,KAAA;MACrD,aAAa;MACd;AACD,YAAO;MACL;MACA,OAAO;MACP,MAAM;MACN,WAAW,KAAK;MAChB;MACA,QAAQ;OACN,GAAG,YACD,aAAa,QAAQ;QACnB;QACA,MAAM,KAAK;QACX,OAAO,MAAM,SAAS,OAAO;QAC9B,CAAC,EACF;QACE,SAAS;QACT,WAAW,SAAS,SAAS,cAAc,OAAO;QAClD,cAAc;UACX,qBAAqB;UACrB,mBAAmB,YAClB,aACG,UAAoC;AACnC,iBAAO,KAAK,GAAG,MAAM;YAEvB,WACA,QACD;UACF,mBACC,SACA,SAAkB,UAElB,WACE,YACA,UACA;UACE;UACQ;UACR,UAAU,CAAC,QAAQ;UACnB,MAAM;UACP,EACD,SACA,OACD;UACF,0BACC,gBAAgB,aAAA;UACjB,4BAA4B;UAC3B,GAAG,aAAa;WACf,kBAAkB,WAAW;UAC/B;UACA,wBAAwB,YAAY;UACnC,eAAe,iBAAiB,EAAE;UAClC;UACA,kBAAkB;UAClB,WAAW,OAAO,eAAe;UACjC,eAAe,KAAK,wBAAwB;UAC5C,oBAAoB,MAAM;UAC3B,CAAC;UACD,4BACC,WAAW,eAAe;SAC5B,eAAe,KAAA;SACf,eAAe;SAChB;QACF,CACF;OACD;OACD;MACD,UAAU,CAAC,QAAQ;MACnB,cAAc,KAAK;MACnB,WAAW,KAAK,cACZ;OACE,KAAK,MACF,KAAK,YAAY,WAAW,KAAK,WAAW,CAAC,IAAI,CAAC,CACpD;OACD,IAAI;QAAC;QAAiB,KAAK,QAAQ;QAAe;QAAK;OACvD,KAAK,KAAK,YAAY;OACvB,GACD,KAAA;MACJ,IAAI;MACJ,MAAM;MACN,SAAS,KAAK,YAAY;MAC1B,SAAS,KAAK;MACf;;SAGH,QAAO;IACL,IAAI;IACJ;IACA,YAAY,EAAE;IACd,MAAM;IACP;;;;;;;;;;;;;;;;AAmBT,SAAgB,6BAId,YACA,iBACA,OACA,YACA,eACA,WACA,UACA,QACA,OACsD;CACtD,MAAM,EAAE,MAAM,cAAc,YAAY;CACxC,MAAM,OAAO,UAAU;AACvB,KAAI,SAAS,KAAA,EACX;CAEF,MAAM,OAAO,KAAK,SAAS;AAC3B,KAAI,SAAS,KAAA,EACX;CAGF,MAAM,eAAe,OAAO,gBAAgB,EAAE;CAC9C,MAAM,kBAAkB,aAAa,iBAAiB;CACtD,MAAM,WAAW,CAAC,KAAK;CACvB,MAAM,sBACJ,oBAAoB,KAChB,kBACA,GAAG,mBAAmD;CAG5D,MAAM,SAAS,MACb,KAAK,UAAU;EACb;EACA,KAAK,UAAU;EACf;EACA;EACA;EACA,WAAW;EACZ,CAAC,EACF,WAAW,GACZ;CACD,MAAM,0BAA0B,GAAG,uBAAiD;CAGpF,MAAM,WAAW;EACf;EACA,OAAO,WAAW,KAAK;EACvB;EACA;EACD;CAED,IAAI,WAAW;EACb,gBAAgB;EAChB,gBAAgB;EAChB,oBAAoB;EACpB,gBAAgB;EAChB,yBAAyB;EACzB,eAAe;EAChB;AACD,KAAI,KAAK,aAAa,KAAA,EACpB,YAAW;EAAE,GAAG;EAAU,GAAG,KAAK;EAAU;CAG9C,MAAM,SAAgC,EAAE;CACxC,MAAM,gBAA+B;EACnC,cAAc,WAAW;EACzB,cAAc;EACd;EACA,UAAU,aAAa;EACvB,OAAO,OAAO,SAAS,OAAO,OAAO,OAAO,MAAM,GAAG,KAAA;EACrD,aAAa;EACd;AAED,QAAO;EACL,MAAM;EACN,OAAO,WAAW;EAClB,MAAM;EACN,WAAW,KAAK;EAChB;EACA,QAAQ;GACN,GAAG,YACD,aAAa,QAAQ;IACnB;IACA,MAAM,KAAK;IACX,OAAO,MAAM,SAAS,OAAO;IAC9B,CAAC,EACF;IACE,SAAS;IACT,WAAW,SAAS,SAAS,cAAc,OAAO;IAClD,cAAc;MACX,qBAAqB;MACrB,mBAAmB,YAClB,aACG,UAAoC,OAAO,KAAK,GAAG,MAAM,EAC1D,WACA,QACD;MACF,mBACC,SACA,SAAkB,UAElB,WACE,YACA,UACA;MACE,MAAM;MACE;MACR;MACA,MAAM;MACP,EACD,SACA,OACD;MACF,0BACC,gBAAgB,aAAA;MACjB,4BAA4B;MAC3B,GAAG,aAAa;OACf,kBAAkB,WAAW;MAC/B;MACA,wBAAwB,YAAY;MACnC,eAAe,iBAAiB,EAAE;MAClC;MACA,kBAAkB,WAAW;MAC7B,WAAW,OAAO,eAAe;MACjC,eAAe,KAAK,wBAAwB;MAC7C,CAAC;MACD,4BAA4B,WAAW,eAAe;MACtD,wBAAwB,IAAI,UAC3B,OAAO,WAAW,KAAK,EACvB,MACD;KACD,eAAe,KAAA;KACf,eAAe;KAChB;IACF,CACF;GACD;GACD;EACD;EACA,cAAc,KAAK;EACnB,WAAW,KAAA;EACX,IAAI;EACJ,MAAM;EACN,SAAS,KAAK,YAAY;EAC3B;;;;;;;;;AAUH,SAAS,WACP,MACA,UACA,cACA;CAEA,IAAI;AAEJ,KAAI,OAAO,KAAK,aAAa,YAAY,CAAC,MAAM,QAAQ,KAAK,SAAS,EAAE;AACtE,QAAM,EAAE;AACR,OAAK,MAAM,CAAC,GAAG,SAAS,OAAO,QAAQ,KAAK,SAAS,CACnD,KAAI,KAAK,SAAS,SAAS,KAAK,CAC9B,KAAI;AACF,OAAI,KAAK,YAAY,UAAU,MAAM,MAAM;WAEpC,GAAQ;AACf,OAAI,EAAE,SAAS,kBAAkB,kBAC/B;OAEA,OAAM;;WAGD,QAAQ,SACjB,KAAI;AACF,OAAI,KAAK,YAAY,UAAU,MAAM,MAAM;WAEpC,GAAQ;AACf,OAAI,EAAE,SAAS,kBAAkB,kBAC/B;OAEA,OAAM;;YAKL,MAAM,QAAQ,KAAK,SAAS,EAAE;EACvC,IAAI,iBAAiB;AACrB,OAAK,MAAM,QAAQ,KAAK,SACtB,KAAI;AACF,SAAM,YAAY,UAAU,MAAM,MAAM;AACxC,oBAAiB;AACjB;WAEO,GAAQ;AACf,OAAI,EAAE,SAAS,kBAAkB,kBAC/B;OAEA,OAAM;;AAIZ,MAAI,CAAC,eACH;OAGF,OAAM,IAAI,MACR,qDAAqD,KAAK,WAC3D;AAIH,KAAI,gBAAgB,KAAK,WAAW,KAAA,EAClC,OAAM,KAAK,OAAO,IAAI;AAGxB,QAAO;;;;;;;;;;;AAYT,SAAgB,8BACd,QACA,UACM;AACN,KAAI,OAAO,OAAO,SAAS,YAAY,OAAO,SAAS,KAErD,QAAO;CAIT,MAAM,eAAwC,EAAE;AAChD,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,KAAK,EAAE;EACtD,MAAM,UAAU,SAAS;AAEzB,MAAI,CAAC,WAAW,QAAQ,kBAAkB,iBACxC,cAAa,OAAO;;AAIxB,QAAO,IAAI,KAAK,OAAO,MAAM,aAAa;;AAG5C,SAAS,YAAY,EACnB,eACA,QACA,kBACA,WACA,eACA,sBAQmB;CACnB,MAAM,aAAa,qBACf,mBAAmB,aACnB,cAAc,MACX,CAAC,aAAa,UAAU,gBAAA,0CAAgC,SAAA,aAC1D,GAAG;CAoBR,MAAM,aAAa;EACjB,aAAa;EACb,kBAAkB;EAClB,eArBoB;GAEpB,MAAM,SAAoB,sBACrB,mBAAmB,eAAe,IAAI,OAAO,IAAI,EAAE,EAAE,MAAM,GAC5D,cACG,QACE,CAAC,aAAa,UAAU,gBAAgB,UAAU,SAAA,aACpD,CACA,SAAS,CAAC,cAAc,OAAO,YAAY,OAAO;AAEzD,OAAI,aAAa,QAAQ,iBAAiB,WAAW;IACnD,MAAM,eAAe,UAAU;AAC/B,WAAO,KAAK,aAAa;;AAG3B,UAAO;MACL;EAMF;EACA,iBAAiB;EACjB;EACA,yBAAyB;AACvB,OAAI,WAAW,YAAY;AACzB,WAAO,WAAW;AAClB,kBAAc,OACZ,cAAc,WACX,CAAC,aAAa,UACb,gBAAA,0CAAgC,SAAA,aACnC,EACD,EACD;AACD,WAAO;;;EAKZ;AACD,QAAO"}
@@ -32,11 +32,12 @@ function getRunnableForEntrypoint(name, func) {
32
32
  recurse: false
33
33
  });
34
34
  }
35
- function call({ func, name, cache, retry }, ...args) {
35
+ function call({ func, name, cache, retry, timeout }, ...args) {
36
36
  const config = _langchain_core_singletons.AsyncLocalStorageProviderSingleton.getRunnableConfig();
37
37
  if (typeof config.configurable?.["__pregel_call"] === "function") return config.configurable[require_constants.CONFIG_KEY_CALL](func, name, args, {
38
38
  retry,
39
39
  cache,
40
+ timeout,
40
41
  callbacks: config.callbacks
41
42
  });
42
43
  throw new Error("Async local storage not initialized. Please call initializeAsyncLocalStorageSingleton() before using this function.");