@langchain/langgraph 1.2.5 → 1.2.7

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 (111) hide show
  1. package/dist/channels/base.cjs.map +1 -1
  2. package/dist/channels/base.js.map +1 -1
  3. package/dist/channels/binop.cjs.map +1 -1
  4. package/dist/channels/binop.js.map +1 -1
  5. package/dist/constants.cjs.map +1 -1
  6. package/dist/constants.d.cts.map +1 -1
  7. package/dist/constants.d.ts.map +1 -1
  8. package/dist/constants.js.map +1 -1
  9. package/dist/func/types.d.cts.map +1 -1
  10. package/dist/func/types.d.ts.map +1 -1
  11. package/dist/graph/annotation.cjs.map +1 -1
  12. package/dist/graph/annotation.d.cts.map +1 -1
  13. package/dist/graph/annotation.d.ts.map +1 -1
  14. package/dist/graph/annotation.js.map +1 -1
  15. package/dist/graph/graph.cjs +2 -2
  16. package/dist/graph/graph.cjs.map +1 -1
  17. package/dist/graph/graph.d.cts.map +1 -1
  18. package/dist/graph/graph.d.ts.map +1 -1
  19. package/dist/graph/graph.js +2 -2
  20. package/dist/graph/graph.js.map +1 -1
  21. package/dist/graph/state.cjs.map +1 -1
  22. package/dist/graph/state.d.cts.map +1 -1
  23. package/dist/graph/state.d.ts.map +1 -1
  24. package/dist/graph/state.js.map +1 -1
  25. package/dist/graph/types.cjs.map +1 -1
  26. package/dist/graph/types.d.cts.map +1 -1
  27. package/dist/graph/types.d.ts.map +1 -1
  28. package/dist/graph/types.js.map +1 -1
  29. package/dist/graph/zod/meta.cjs.map +1 -1
  30. package/dist/graph/zod/meta.d.cts.map +1 -1
  31. package/dist/graph/zod/meta.d.ts.map +1 -1
  32. package/dist/graph/zod/meta.js.map +1 -1
  33. package/dist/graph/zod/zod-registry.cjs.map +1 -1
  34. package/dist/graph/zod/zod-registry.d.cts.map +1 -1
  35. package/dist/graph/zod/zod-registry.d.ts.map +1 -1
  36. package/dist/graph/zod/zod-registry.js.map +1 -1
  37. package/dist/index.cjs +1 -1
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.d.cts +4 -4
  40. package/dist/index.d.ts +4 -4
  41. package/dist/index.js +1 -1
  42. package/dist/index.js.map +1 -1
  43. package/dist/interrupt.cjs.map +1 -1
  44. package/dist/interrupt.d.cts.map +1 -1
  45. package/dist/interrupt.d.ts.map +1 -1
  46. package/dist/interrupt.js.map +1 -1
  47. package/dist/prebuilt/react_agent_executor.cjs.map +1 -1
  48. package/dist/prebuilt/react_agent_executor.d.cts.map +1 -1
  49. package/dist/prebuilt/react_agent_executor.d.ts.map +1 -1
  50. package/dist/prebuilt/react_agent_executor.js.map +1 -1
  51. package/dist/prebuilt/tool_executor.cjs.map +1 -1
  52. package/dist/prebuilt/tool_executor.d.cts.map +1 -1
  53. package/dist/prebuilt/tool_executor.d.ts.map +1 -1
  54. package/dist/prebuilt/tool_executor.js.map +1 -1
  55. package/dist/pregel/algo.cjs.map +1 -1
  56. package/dist/pregel/algo.js.map +1 -1
  57. package/dist/pregel/debug.cjs.map +1 -1
  58. package/dist/pregel/debug.js.map +1 -1
  59. package/dist/pregel/index.cjs +8 -6
  60. package/dist/pregel/index.cjs.map +1 -1
  61. package/dist/pregel/index.d.cts.map +1 -1
  62. package/dist/pregel/index.d.ts.map +1 -1
  63. package/dist/pregel/index.js +8 -6
  64. package/dist/pregel/index.js.map +1 -1
  65. package/dist/pregel/loop.cjs +20 -4
  66. package/dist/pregel/loop.cjs.map +1 -1
  67. package/dist/pregel/loop.js +20 -4
  68. package/dist/pregel/loop.js.map +1 -1
  69. package/dist/pregel/read.cjs.map +1 -1
  70. package/dist/pregel/read.d.cts.map +1 -1
  71. package/dist/pregel/read.d.ts.map +1 -1
  72. package/dist/pregel/read.js.map +1 -1
  73. package/dist/pregel/remote.cjs.map +1 -1
  74. package/dist/pregel/remote.d.cts.map +1 -1
  75. package/dist/pregel/remote.d.ts.map +1 -1
  76. package/dist/pregel/remote.js.map +1 -1
  77. package/dist/pregel/retry.cjs.map +1 -1
  78. package/dist/pregel/retry.js.map +1 -1
  79. package/dist/pregel/runnable_types.d.cts.map +1 -1
  80. package/dist/pregel/runnable_types.d.ts.map +1 -1
  81. package/dist/pregel/stream.cjs +2 -8
  82. package/dist/pregel/stream.cjs.map +1 -1
  83. package/dist/pregel/stream.js +2 -8
  84. package/dist/pregel/stream.js.map +1 -1
  85. package/dist/pregel/types.cjs.map +1 -1
  86. package/dist/pregel/types.d.cts.map +1 -1
  87. package/dist/pregel/types.d.ts.map +1 -1
  88. package/dist/pregel/types.js.map +1 -1
  89. package/dist/pregel/utils/index.cjs +1 -12
  90. package/dist/pregel/utils/index.cjs.map +1 -1
  91. package/dist/pregel/utils/index.js +1 -12
  92. package/dist/pregel/utils/index.js.map +1 -1
  93. package/dist/pregel/validate.cjs.map +1 -1
  94. package/dist/pregel/validate.js.map +1 -1
  95. package/dist/pregel/write.cjs.map +1 -1
  96. package/dist/pregel/write.js.map +1 -1
  97. package/dist/state/schema.cjs.map +1 -1
  98. package/dist/state/schema.d.cts.map +1 -1
  99. package/dist/state/schema.d.ts.map +1 -1
  100. package/dist/state/schema.js.map +1 -1
  101. package/dist/state/types.cjs.map +1 -1
  102. package/dist/state/types.d.cts.map +1 -1
  103. package/dist/state/types.d.ts.map +1 -1
  104. package/dist/state/types.js.map +1 -1
  105. package/dist/utils.cjs.map +1 -1
  106. package/dist/utils.js.map +1 -1
  107. package/dist/web.cjs +11 -0
  108. package/dist/web.d.cts +6 -3
  109. package/dist/web.d.ts +6 -3
  110. package/dist/web.js +6 -3
  111. package/package.json +8 -20
@@ -74,9 +74,25 @@ var PregelLoop = class PregelLoop {
74
74
  status = "pending";
75
75
  tasks = {};
76
76
  stream;
77
- checkpointerPromises = [];
77
+ checkpointerPromises = /* @__PURE__ */ new Set();
78
78
  isNested;
79
79
  _checkpointerChainedPromise = Promise.resolve();
80
+ /**
81
+ * Track a checkpointer promise, removing it from the set on success.
82
+ * Failed promises are kept so that Promise.all() in the finally block
83
+ * of _streamIterator can surface the error.
84
+ *
85
+ * @internal
86
+ */
87
+ _trackCheckpointerPromise(promise) {
88
+ const tracked = promise.then((value) => {
89
+ this.checkpointerPromises.delete(tracked);
90
+ return value;
91
+ }, (error) => {
92
+ throw error;
93
+ });
94
+ this.checkpointerPromises.add(tracked);
95
+ }
80
96
  store;
81
97
  cache;
82
98
  manager;
@@ -210,7 +226,7 @@ var PregelLoop = class PregelLoop {
210
226
  this._checkpointerChainedPromise = this._checkpointerChainedPromise.then(() => {
211
227
  return this.checkpointer?.put(input.config, input.checkpoint, input.metadata, input.newVersions);
212
228
  });
213
- this.checkpointerPromises.push(this._checkpointerChainedPromise);
229
+ this._trackCheckpointerPromise(this._checkpointerChainedPromise);
214
230
  }
215
231
  /**
216
232
  * Put writes for a task, to be read by the next tick.
@@ -246,7 +262,7 @@ var PregelLoop = class PregelLoop {
246
262
  [require_constants.CONFIG_KEY_CHECKPOINT_NS]: this.config.configurable?.checkpoint_ns ?? "",
247
263
  [require_constants.CONFIG_KEY_CHECKPOINT_ID]: this.checkpoint.id
248
264
  });
249
- if (this.durability !== "exit" && this.checkpointer != null) this.checkpointerPromises.push(this.checkpointer.putWrites(config, writesToSave, taskId));
265
+ if (this.durability !== "exit" && this.checkpointer != null) this._trackCheckpointerPromise(this.checkpointer.putWrites(config, writesToSave, taskId));
250
266
  if (this.tasks) this._outputWrites(taskId, writesCopy);
251
267
  if (!writes.length || !this.cache || !this.tasks) return;
252
268
  const task = this.tasks[taskId];
@@ -542,7 +558,7 @@ var PregelLoop = class PregelLoop {
542
558
  byTask[tid] ??= [];
543
559
  byTask[tid].push([key, value]);
544
560
  }
545
- for (const [tid, ws] of Object.entries(byTask)) this.checkpointerPromises.push(this.checkpointer.putWrites(config, ws, tid));
561
+ for (const [tid, ws] of Object.entries(byTask)) this._trackCheckpointerPromise(this.checkpointer.putWrites(config, ws, tid));
546
562
  }
547
563
  _matchWrites(tasks) {
548
564
  for (const [tid, k, v] of this.checkpointPendingWrites) {
@@ -1 +1 @@
1
- {"version":3,"file":"loop.cjs","names":["IterableReadableWritableStream","BaseCache","isCommand","increment","CONFIG_KEY_STREAM","CONFIG_KEY_SCRATCHPAD","patchConfigurable","CONFIG_KEY_CHECKPOINT_NS","CONFIG_KEY_READ","CONFIG_KEY_CHECKPOINT_MAP","emptyChannels","AsyncBatchedStore","WRITES_IDX_MAP","_isSend","sanitizeUntrackedValuesInSend","CONFIG_KEY_CHECKPOINT_ID","INTERRUPT","gatherIteratorSync","prefixGenerator","mapOutputUpdates","mapDebugTaskResults","GraphInterrupt","_applyWrites","gatherIterator","mapOutputValues","shouldInterrupt","CONFIG_KEY_RESUMING","_prepareNextTasks","mapDebugCheckpoint","mapDebugTasks","readChannels","isGraphInterrupt","_prepareSingleTask","PUSH","NULL_TASK_ID","RESUME","isXXH3","CONFIG_KEY_RESUME_MAP","mapCommand","EmptyInputError","INPUT","mapInput","getNewChannelVersions","createCheckpoint"],"sources":["../../src/pregel/loop.ts"],"sourcesContent":["import type { RunnableConfig } from \"@langchain/core/runnables\";\nimport type { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport {\n BaseCheckpointSaver,\n Checkpoint,\n CheckpointTuple,\n copyCheckpoint,\n emptyCheckpoint,\n PendingWrite,\n CheckpointPendingWrite,\n CheckpointMetadata,\n All,\n BaseStore,\n AsyncBatchedStore,\n WRITES_IDX_MAP,\n BaseCache,\n CacheFullKey,\n CacheNamespace,\n} from \"@langchain/langgraph-checkpoint\";\n\nimport {\n BaseChannel,\n createCheckpoint,\n emptyChannels,\n} from \"../channels/base.js\";\nimport type {\n Call,\n CallTaskPath,\n Durability,\n PregelExecutableTask,\n PregelScratchpad,\n StreamMode,\n} from \"./types.js\";\nimport {\n isCommand,\n _isSend,\n CHECKPOINT_NAMESPACE_SEPARATOR,\n Command,\n CONFIG_KEY_CHECKPOINT_MAP,\n CONFIG_KEY_READ,\n CONFIG_KEY_RESUMING,\n CONFIG_KEY_STREAM,\n ERROR,\n INPUT,\n INTERRUPT,\n NULL_TASK_ID,\n RESUME,\n TAG_HIDDEN,\n TASKS,\n PUSH,\n CONFIG_KEY_SCRATCHPAD,\n CONFIG_KEY_CHECKPOINT_NS,\n CHECKPOINT_NAMESPACE_END,\n CONFIG_KEY_CHECKPOINT_ID,\n CONFIG_KEY_RESUME_MAP,\n START,\n} from \"../constants.js\";\nimport {\n _applyWrites,\n _prepareNextTasks,\n _prepareSingleTask,\n increment,\n shouldInterrupt,\n sanitizeUntrackedValuesInSend,\n WritesProtocol,\n} from \"./algo.js\";\nimport {\n gatherIterator,\n gatherIteratorSync,\n prefixGenerator,\n} from \"../utils.js\";\nimport {\n mapCommand,\n mapInput,\n mapOutputUpdates,\n mapOutputValues,\n readChannels,\n} from \"./io.js\";\nimport {\n EmptyInputError,\n GraphInterrupt,\n isGraphInterrupt,\n} from \"../errors.js\";\nimport { getNewChannelVersions, patchConfigurable } from \"./utils/index.js\";\nimport {\n mapDebugTasks,\n mapDebugCheckpoint,\n mapDebugTaskResults,\n printStepTasks,\n} from \"./debug.js\";\nimport { PregelNode } from \"./read.js\";\nimport { LangGraphRunnableConfig } from \"./runnable_types.js\";\nimport { IterableReadableWritableStream, StreamChunk } from \"./stream.js\";\nimport { isXXH3 } from \"../hash.js\";\n\nconst INPUT_DONE = Symbol.for(\"INPUT_DONE\");\nconst INPUT_RESUMING = Symbol.for(\"INPUT_RESUMING\");\nconst DEFAULT_LOOP_LIMIT = 25;\n\nexport type PregelLoopInitializeParams = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input?: any | Command;\n config: RunnableConfig;\n checkpointer?: BaseCheckpointSaver;\n outputKeys: string | string[];\n streamKeys: string | string[];\n nodes: Record<string, PregelNode>;\n channelSpecs: Record<string, BaseChannel>;\n stream: IterableReadableWritableStream;\n store?: BaseStore;\n cache?: BaseCache<PendingWrite<string>[]>;\n interruptAfter: string[] | All;\n interruptBefore: string[] | All;\n durability: Durability;\n manager?: CallbackManagerForChainRun;\n debug: boolean;\n triggerToNodes: Record<string, string[]>;\n};\n\ntype PregelLoopParams = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input?: any | Command;\n config: RunnableConfig;\n checkpointer?: BaseCheckpointSaver;\n checkpoint: Checkpoint;\n checkpointMetadata: CheckpointMetadata;\n checkpointPreviousVersions: Record<string, string | number>;\n checkpointPendingWrites: CheckpointPendingWrite[];\n checkpointConfig: RunnableConfig;\n channels: Record<string, BaseChannel>;\n step: number;\n stop: number;\n outputKeys: string | string[];\n streamKeys: string | string[];\n nodes: Record<string, PregelNode>;\n checkpointNamespace: string[];\n skipDoneTasks: boolean;\n isNested: boolean;\n manager?: CallbackManagerForChainRun;\n stream: IterableReadableWritableStream;\n store?: AsyncBatchedStore;\n cache?: BaseCache<PendingWrite<string>[]>;\n prevCheckpointConfig: RunnableConfig | undefined;\n interruptAfter: string[] | All;\n interruptBefore: string[] | All;\n durability: Durability;\n debug: boolean;\n triggerToNodes: Record<string, string[]>;\n};\n\nfunction createDuplexStream(...streams: IterableReadableWritableStream[]) {\n return new IterableReadableWritableStream({\n passthroughFn: (value: StreamChunk) => {\n for (const stream of streams) {\n if (stream.modes.has(value[1])) {\n stream.push(value);\n }\n }\n },\n modes: new Set(streams.flatMap((s) => Array.from(s.modes))),\n });\n}\n\nclass AsyncBatchedCache extends BaseCache<PendingWrite<string>[]> {\n protected cache: BaseCache<PendingWrite<string>[]>;\n\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(cache: BaseCache<unknown>) {\n super();\n this.cache = cache as BaseCache<PendingWrite<string>[]>;\n }\n\n async get(keys: CacheFullKey[]) {\n return this.enqueueOperation(\"get\", keys);\n }\n\n async set(\n pairs: {\n key: CacheFullKey;\n value: PendingWrite<string>[];\n ttl?: number;\n }[]\n ) {\n return this.enqueueOperation(\"set\", pairs);\n }\n\n async clear(namespaces: CacheNamespace[]) {\n return this.enqueueOperation(\"clear\", namespaces);\n }\n\n async stop() {\n await this.queue;\n }\n\n private enqueueOperation<Type extends \"get\" | \"set\" | \"clear\">(\n type: Type,\n ...args: Parameters<(typeof this.cache)[Type]>\n ) {\n const newPromise = this.queue.then(() => {\n // @ts-expect-error Tuple type warning\n return this.cache[type](...args) as Promise<\n ReturnType<(typeof this.cache)[Type]>\n >;\n });\n\n this.queue = newPromise.then(\n () => void 0,\n () => void 0\n );\n\n return newPromise;\n }\n}\n\nexport class PregelLoop {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected input?: any | Command;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n output: any;\n\n config: LangGraphRunnableConfig;\n\n protected checkpointer?: BaseCheckpointSaver;\n\n protected checkpointerGetNextVersion: (current: number | undefined) => number;\n\n channels: Record<string, BaseChannel>;\n\n protected checkpoint: Checkpoint;\n\n protected checkpointIdSaved: string | undefined;\n\n protected checkpointConfig: RunnableConfig;\n\n checkpointMetadata: CheckpointMetadata;\n\n protected checkpointNamespace: string[];\n\n protected checkpointPendingWrites: CheckpointPendingWrite[] = [];\n\n protected checkpointPreviousVersions: Record<string, string | number>;\n\n step: number;\n\n protected stop: number;\n\n protected durability: Durability;\n\n protected outputKeys: string | string[];\n\n protected streamKeys: string | string[];\n\n protected nodes: Record<string, PregelNode>;\n\n protected skipDoneTasks: boolean;\n\n protected prevCheckpointConfig: RunnableConfig | undefined;\n\n protected updatedChannels: Set<string> | undefined;\n\n status:\n | \"pending\"\n | \"done\"\n | \"interrupt_before\"\n | \"interrupt_after\"\n | \"out_of_steps\" = \"pending\";\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tasks: Record<string, PregelExecutableTask<any, any>> = {};\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n stream: IterableReadableWritableStream;\n\n checkpointerPromises: Promise<unknown>[] = [];\n\n isNested: boolean;\n\n protected _checkpointerChainedPromise: Promise<unknown> = Promise.resolve();\n\n store?: AsyncBatchedStore;\n\n cache?: AsyncBatchedCache;\n\n manager?: CallbackManagerForChainRun;\n\n interruptAfter: string[] | All;\n\n interruptBefore: string[] | All;\n\n toInterrupt: PregelExecutableTask<string, string>[] = [];\n\n debug: boolean = false;\n\n triggerToNodes: Record<string, string[]>;\n\n get isResuming() {\n let hasChannelVersions = false;\n if (START in this.checkpoint.channel_versions) {\n // For common channels, we can short-circuit the check\n hasChannelVersions = true;\n } else {\n for (const chan in this.checkpoint.channel_versions) {\n if (\n Object.prototype.hasOwnProperty.call(\n this.checkpoint.channel_versions,\n chan\n )\n ) {\n hasChannelVersions = true;\n break;\n }\n }\n }\n\n const configHasResumingFlag =\n this.config.configurable?.[CONFIG_KEY_RESUMING] !== undefined;\n const configIsResuming =\n configHasResumingFlag && this.config.configurable?.[CONFIG_KEY_RESUMING];\n\n const inputIsNullOrUndefined =\n this.input === null || this.input === undefined;\n const inputIsCommandResuming =\n isCommand(this.input) && this.input.resume != null;\n const inputIsResuming = this.input === INPUT_RESUMING;\n\n const runIdMatchesPrevious =\n !this.isNested &&\n this.config.metadata?.run_id !== undefined &&\n (this.checkpointMetadata as { run_id?: unknown })?.run_id !== undefined &&\n this.config.metadata.run_id ===\n (this.checkpointMetadata as { run_id?: unknown })?.run_id;\n\n return (\n hasChannelVersions &&\n (configIsResuming ||\n inputIsNullOrUndefined ||\n inputIsCommandResuming ||\n inputIsResuming ||\n runIdMatchesPrevious)\n );\n }\n\n constructor(params: PregelLoopParams) {\n this.input = params.input;\n this.checkpointer = params.checkpointer;\n // TODO: if managed values no longer needs graph we can replace with\n // managed_specs, channel_specs\n if (this.checkpointer !== undefined) {\n this.checkpointerGetNextVersion = this.checkpointer.getNextVersion.bind(\n this.checkpointer\n );\n } else {\n this.checkpointerGetNextVersion = increment;\n }\n this.checkpoint = params.checkpoint;\n this.checkpointMetadata = params.checkpointMetadata;\n this.checkpointPreviousVersions = params.checkpointPreviousVersions;\n this.channels = params.channels;\n this.checkpointPendingWrites = params.checkpointPendingWrites;\n this.step = params.step;\n this.stop = params.stop;\n this.config = params.config;\n this.checkpointConfig = params.checkpointConfig;\n this.isNested = params.isNested;\n this.manager = params.manager;\n this.outputKeys = params.outputKeys;\n this.streamKeys = params.streamKeys;\n this.nodes = params.nodes;\n this.skipDoneTasks = params.skipDoneTasks;\n this.store = params.store;\n this.cache = params.cache ? new AsyncBatchedCache(params.cache) : undefined;\n this.stream = params.stream;\n this.checkpointNamespace = params.checkpointNamespace;\n this.prevCheckpointConfig = params.prevCheckpointConfig;\n this.interruptAfter = params.interruptAfter;\n this.interruptBefore = params.interruptBefore;\n this.durability = params.durability;\n this.debug = params.debug;\n this.triggerToNodes = params.triggerToNodes;\n }\n\n static async initialize(params: PregelLoopInitializeParams) {\n let { config, stream } = params;\n if (\n stream !== undefined &&\n config.configurable?.[CONFIG_KEY_STREAM] !== undefined\n ) {\n stream = createDuplexStream(\n stream,\n config.configurable[CONFIG_KEY_STREAM]\n );\n }\n const skipDoneTasks = config.configurable\n ? !(\"checkpoint_id\" in config.configurable)\n : true;\n\n const scratchpad = config.configurable?.[CONFIG_KEY_SCRATCHPAD] as\n | PregelScratchpad\n | undefined;\n\n if (config.configurable && scratchpad) {\n if (scratchpad.subgraphCounter > 0) {\n config = patchConfigurable(config, {\n [CONFIG_KEY_CHECKPOINT_NS]: [\n config.configurable[CONFIG_KEY_CHECKPOINT_NS],\n scratchpad.subgraphCounter.toString(),\n ].join(CHECKPOINT_NAMESPACE_SEPARATOR),\n });\n }\n\n scratchpad.subgraphCounter += 1;\n }\n\n const isNested = CONFIG_KEY_READ in (config.configurable ?? {});\n if (\n !isNested &&\n config.configurable?.checkpoint_ns !== undefined &&\n config.configurable?.checkpoint_ns !== \"\"\n ) {\n config = patchConfigurable(config, {\n checkpoint_ns: \"\",\n checkpoint_id: undefined,\n });\n }\n let checkpointConfig = config;\n if (\n config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP] !== undefined &&\n config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP]?.[\n config.configurable?.checkpoint_ns\n ]\n ) {\n checkpointConfig = patchConfigurable(config, {\n checkpoint_id:\n config.configurable[CONFIG_KEY_CHECKPOINT_MAP][\n config.configurable?.checkpoint_ns\n ],\n });\n }\n const checkpointNamespace =\n config.configurable?.checkpoint_ns?.split(\n CHECKPOINT_NAMESPACE_SEPARATOR\n ) ?? [];\n\n const saved: CheckpointTuple = (await params.checkpointer?.getTuple(\n checkpointConfig\n )) ?? {\n config,\n checkpoint: emptyCheckpoint(),\n metadata: { source: \"input\", step: -2, parents: {} },\n pendingWrites: [],\n };\n checkpointConfig = {\n ...config,\n ...saved.config,\n configurable: {\n checkpoint_ns: \"\",\n ...config.configurable,\n ...saved.config.configurable,\n },\n };\n const prevCheckpointConfig = saved.parentConfig;\n const checkpoint = copyCheckpoint(saved.checkpoint);\n const checkpointMetadata = { ...saved.metadata } as CheckpointMetadata;\n const checkpointPendingWrites = saved.pendingWrites ?? [];\n\n const channels = emptyChannels(params.channelSpecs, checkpoint);\n\n const step = (checkpointMetadata.step ?? 0) + 1;\n const stop = step + (config.recursionLimit ?? DEFAULT_LOOP_LIMIT) + 1;\n const checkpointPreviousVersions = { ...checkpoint.channel_versions };\n\n const store = params.store\n ? new AsyncBatchedStore(params.store)\n : undefined;\n\n if (store) {\n // Start the store. This is a batch store, so it will run continuously\n await store.start();\n }\n return new PregelLoop({\n input: params.input,\n config,\n checkpointer: params.checkpointer,\n checkpoint,\n checkpointMetadata,\n checkpointConfig,\n prevCheckpointConfig,\n checkpointNamespace,\n channels,\n isNested,\n manager: params.manager,\n skipDoneTasks,\n step,\n stop,\n checkpointPreviousVersions,\n checkpointPendingWrites,\n outputKeys: params.outputKeys ?? [],\n streamKeys: params.streamKeys ?? [],\n nodes: params.nodes,\n stream,\n store,\n cache: params.cache,\n interruptAfter: params.interruptAfter,\n interruptBefore: params.interruptBefore,\n durability: params.durability,\n debug: params.debug,\n triggerToNodes: params.triggerToNodes,\n });\n }\n\n protected _checkpointerPutAfterPrevious(input: {\n config: RunnableConfig;\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n newVersions: Record<string, string | number>;\n }) {\n this._checkpointerChainedPromise = this._checkpointerChainedPromise.then(\n () => {\n return this.checkpointer?.put(\n input.config,\n input.checkpoint,\n input.metadata,\n input.newVersions\n );\n }\n );\n this.checkpointerPromises.push(this._checkpointerChainedPromise);\n }\n\n /**\n * Put writes for a task, to be read by the next tick.\n * @param taskId\n * @param writes\n */\n putWrites(taskId: string, writes: PendingWrite<string>[]) {\n let writesCopy = writes;\n if (writesCopy.length === 0) return;\n\n // deduplicate writes to special channels, last write wins\n if (writesCopy.every(([key]) => key in WRITES_IDX_MAP)) {\n writesCopy = Array.from(\n new Map(writesCopy.map((w) => [w[0], w])).values()\n );\n }\n\n // Check if any channels are UntrackedValue (manual loop for perf)\n let hasUntrackedChannels = false;\n for (const key in this.channels) {\n if (Object.prototype.hasOwnProperty.call(this.channels, key)) {\n const channel = this.channels[key];\n if (channel.lc_graph_name === \"UntrackedValue\") {\n hasUntrackedChannels = true;\n break;\n }\n }\n }\n\n // Sanitize writes for checkpointing: remove UntrackedValue writes and sanitize Send packets\n let writesToSave = writesCopy;\n if (hasUntrackedChannels) {\n writesToSave = writesCopy\n .filter(([c]) => {\n // Don't persist UntrackedValue channel writes\n const channel = this.channels[c];\n return !channel || channel.lc_graph_name !== \"UntrackedValue\";\n })\n .map(([c, v]) => {\n // Sanitize UntrackedValues nested within Send packets\n if (c === TASKS && _isSend(v)) {\n return [c, sanitizeUntrackedValuesInSend(v, this.channels)] as [\n string,\n unknown\n ];\n }\n return [c, v] as [string, unknown];\n });\n }\n\n // remove existing writes for this task\n this.checkpointPendingWrites = this.checkpointPendingWrites.filter(\n (w) => w[0] !== taskId\n );\n\n // save writes\n for (const [c, v] of writesToSave) {\n this.checkpointPendingWrites.push([taskId, c, v]);\n }\n\n const config = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]: this.config.configurable?.checkpoint_ns ?? \"\",\n [CONFIG_KEY_CHECKPOINT_ID]: this.checkpoint.id,\n });\n\n if (this.durability !== \"exit\" && this.checkpointer != null) {\n this.checkpointerPromises.push(\n // Use sanitized writes for checkpointer\n this.checkpointer.putWrites(config, writesToSave, taskId)\n );\n }\n\n if (this.tasks) {\n this._outputWrites(taskId, writesCopy);\n }\n\n if (!writes.length || !this.cache || !this.tasks) {\n return;\n }\n\n // only cache tasks with a cache key\n const task = this.tasks[taskId];\n if (task == null || task.cache_key == null) {\n return;\n }\n\n // only cache successful tasks\n if (writes[0][0] === ERROR || writes[0][0] === INTERRUPT) {\n return;\n }\n\n void this.cache.set([\n {\n key: [task.cache_key.ns, task.cache_key.key],\n value: task.writes,\n ttl: task.cache_key.ttl,\n },\n ]);\n }\n\n _outputWrites(taskId: string, writes: [string, unknown][], cached = false) {\n const task = this.tasks[taskId];\n if (task !== undefined) {\n if (\n task.config !== undefined &&\n (task.config.tags ?? []).includes(TAG_HIDDEN)\n ) {\n return;\n }\n\n if (writes.length > 0) {\n if (writes[0][0] === INTERRUPT) {\n // in `algo.ts` we append a bool to the task path to indicate\n // whether or not a call was present. If so, we don't emit the\n // the interrupt as it'll be emitted by the parent.\n if (\n task.path?.[0] === PUSH &&\n task.path?.[task.path.length - 1] === true\n )\n return;\n\n const interruptWrites = writes\n .filter((w) => w[0] === INTERRUPT)\n .flatMap((w) => w[1] as string[]);\n\n this._emit([\n [\"updates\", { [INTERRUPT]: interruptWrites }],\n [\"values\", { [INTERRUPT]: interruptWrites }],\n ]);\n } else if (writes[0][0] !== ERROR) {\n this._emit(\n gatherIteratorSync(\n prefixGenerator(\n mapOutputUpdates(this.outputKeys, [[task, writes]], cached),\n \"updates\"\n )\n )\n );\n }\n }\n if (!cached) {\n this._emit(\n gatherIteratorSync(\n prefixGenerator(\n mapDebugTaskResults([[task, writes]], this.streamKeys),\n \"tasks\"\n )\n )\n );\n }\n }\n }\n\n async _matchCachedWrites() {\n if (!this.cache) return [];\n\n const matched: {\n task: PregelExecutableTask<string, string>;\n result: unknown;\n }[] = [];\n\n const serializeKey = ([ns, key]: CacheFullKey) => {\n return `ns:${ns.join(\",\")}|key:${key}`;\n };\n\n const keys: CacheFullKey[] = [];\n const keyMap: Record<string, PregelExecutableTask<string, string>> = {};\n\n for (const task of Object.values(this.tasks)) {\n if (task.cache_key != null && !task.writes.length) {\n keys.push([task.cache_key.ns, task.cache_key.key]);\n keyMap[serializeKey([task.cache_key.ns, task.cache_key.key])] = task;\n }\n }\n\n if (keys.length === 0) return [];\n const cache = await this.cache.get(keys);\n\n for (const { key, value } of cache) {\n const task = keyMap[serializeKey(key)];\n if (task != null) {\n // update the task with the cached writes\n task.writes.push(...value);\n matched.push({ task, result: value });\n }\n }\n\n return matched;\n }\n\n /**\n * Execute a single iteration of the Pregel loop.\n * Returns true if more iterations are needed.\n * @param params\n */\n async tick(params: { inputKeys?: string | string[] }): Promise<boolean> {\n if (this.store && !this.store.isRunning) {\n await this.store?.start();\n }\n const { inputKeys = [] } = params;\n if (this.status !== \"pending\") {\n throw new Error(\n `Cannot tick when status is no longer \"pending\". Current status: \"${this.status}\"`\n );\n }\n if (![INPUT_DONE, INPUT_RESUMING].includes(this.input)) {\n await this._first(inputKeys);\n } else if (this.toInterrupt.length > 0) {\n this.status = \"interrupt_before\";\n throw new GraphInterrupt();\n } else if (\n Object.values(this.tasks).every((task) => task.writes.length > 0)\n ) {\n // finish superstep\n const writes = Object.values(this.tasks).flatMap((t) => t.writes);\n // All tasks have finished\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n Object.values(this.tasks),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n // produce values output\n const valuesOutput = await gatherIterator(\n prefixGenerator(\n mapOutputValues(this.outputKeys, writes, this.channels),\n \"values\"\n )\n );\n this._emit(valuesOutput);\n // clear pending writes\n this.checkpointPendingWrites = [];\n await this._putCheckpoint({ source: \"loop\" });\n // after execution, check if we should interrupt\n if (\n shouldInterrupt(\n this.checkpoint,\n this.interruptAfter,\n Object.values(this.tasks)\n )\n ) {\n this.status = \"interrupt_after\";\n throw new GraphInterrupt();\n }\n\n // unset resuming flag\n if (this.config.configurable?.[CONFIG_KEY_RESUMING] !== undefined) {\n delete this.config.configurable?.[CONFIG_KEY_RESUMING];\n }\n } else {\n return false;\n }\n if (this.step > this.stop) {\n this.status = \"out_of_steps\";\n return false;\n }\n\n const nextTasks = _prepareNextTasks(\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n this.config,\n true,\n {\n step: this.step,\n checkpointer: this.checkpointer,\n isResuming: this.isResuming,\n manager: this.manager,\n store: this.store,\n stream: this.stream,\n triggerToNodes: this.triggerToNodes,\n updatedChannels: this.updatedChannels,\n }\n );\n this.tasks = nextTasks;\n\n // Produce debug output\n if (this.checkpointer) {\n this._emit(\n await gatherIterator(\n prefixGenerator(\n mapDebugCheckpoint(\n this.checkpointConfig,\n this.channels,\n this.streamKeys,\n this.checkpointMetadata,\n Object.values(this.tasks),\n this.checkpointPendingWrites,\n this.prevCheckpointConfig,\n this.outputKeys\n ),\n \"checkpoints\"\n )\n )\n );\n }\n\n if (Object.values(this.tasks).length === 0) {\n this.status = \"done\";\n return false;\n }\n // if there are pending writes from a previous loop, apply them\n if (this.skipDoneTasks && this.checkpointPendingWrites.length > 0) {\n for (const [tid, k, v] of this.checkpointPendingWrites) {\n if (k === ERROR || k === INTERRUPT || k === RESUME) {\n continue;\n }\n const task = Object.values(this.tasks).find((t) => t.id === tid);\n if (task) {\n task.writes.push([k, v]);\n }\n }\n for (const task of Object.values(this.tasks)) {\n if (task.writes.length > 0) {\n this._outputWrites(task.id, task.writes, true);\n }\n }\n }\n // if all tasks have finished, re-tick\n if (Object.values(this.tasks).every((task) => task.writes.length > 0)) {\n return this.tick({ inputKeys });\n }\n\n // Before execution, check if we should interrupt\n if (\n shouldInterrupt(\n this.checkpoint,\n this.interruptBefore,\n Object.values(this.tasks)\n )\n ) {\n this.status = \"interrupt_before\";\n throw new GraphInterrupt();\n }\n\n // Produce debug output\n const debugOutput = await gatherIterator(\n prefixGenerator(mapDebugTasks(Object.values(this.tasks)), \"tasks\")\n );\n this._emit(debugOutput);\n\n return true;\n }\n\n async finishAndHandleError(error?: Error) {\n // persist current checkpoint and writes\n if (\n this.durability === \"exit\" &&\n // if it's a top graph\n (!this.isNested ||\n // or a nested graph with error or interrupt\n typeof error !== \"undefined\" ||\n // or a nested graph with checkpointer: true\n this.checkpointNamespace.every(\n (part) => !part.includes(CHECKPOINT_NAMESPACE_END)\n ))\n ) {\n this._putCheckpoint(this.checkpointMetadata);\n this._flushPendingWrites();\n }\n\n const suppress = this._suppressInterrupt(error);\n if (suppress || error === undefined) {\n this.output = readChannels(this.channels, this.outputKeys);\n }\n if (suppress) {\n // emit one last \"values\" event, with pending writes applied\n if (\n this.tasks !== undefined &&\n this.checkpointPendingWrites.length > 0 &&\n Object.values(this.tasks).some((task) => task.writes.length > 0)\n ) {\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n Object.values(this.tasks),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n\n this._emit(\n gatherIteratorSync(\n prefixGenerator(\n mapOutputValues(\n this.outputKeys,\n Object.values(this.tasks).flatMap((t) => t.writes),\n this.channels\n ),\n \"values\"\n )\n )\n );\n }\n\n // Emit INTERRUPT event\n if (isGraphInterrupt(error) && !error.interrupts.length) {\n this._emit([\n [\"updates\", { [INTERRUPT]: [] }],\n [\"values\", { [INTERRUPT]: [] }],\n ]);\n }\n }\n return suppress;\n }\n\n async acceptPush(\n task: PregelExecutableTask<string, string>,\n writeIdx: number,\n call?: Call\n ): Promise<PregelExecutableTask<string, string> | void> {\n if (\n this.interruptAfter?.length > 0 &&\n shouldInterrupt(this.checkpoint, this.interruptAfter, [task])\n ) {\n this.toInterrupt.push(task);\n return;\n }\n\n const pushed = _prepareSingleTask(\n [PUSH, task.path ?? [], writeIdx, task.id, call] as CallTaskPath,\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n task.config ?? {},\n true,\n {\n step: this.step,\n checkpointer: this.checkpointer,\n manager: this.manager,\n store: this.store,\n stream: this.stream,\n }\n );\n\n if (!pushed) return;\n if (\n this.interruptBefore?.length > 0 &&\n shouldInterrupt(this.checkpoint, this.interruptBefore, [pushed])\n ) {\n this.toInterrupt.push(pushed);\n return;\n }\n\n this._emit(\n gatherIteratorSync(prefixGenerator(mapDebugTasks([pushed]), \"tasks\"))\n );\n\n if (this.debug) printStepTasks(this.step, [pushed]);\n this.tasks[pushed.id] = pushed;\n if (this.skipDoneTasks) this._matchWrites({ [pushed.id]: pushed });\n\n const tasks = await this._matchCachedWrites();\n for (const { task } of tasks) {\n this._outputWrites(task.id, task.writes, true);\n }\n\n return pushed;\n }\n\n protected _suppressInterrupt(e?: Error): boolean {\n return isGraphInterrupt(e) && !this.isNested;\n }\n\n protected async _first(inputKeys: string | string[]) {\n /*\n * Resuming from previous checkpoint requires\n * - finding a previous checkpoint\n * - receiving null input (outer graph) or RESUMING flag (subgraph)\n */\n\n const { configurable } = this.config;\n\n // take resume value from parent\n const scratchpad = configurable?.[\n CONFIG_KEY_SCRATCHPAD\n ] as PregelScratchpad;\n\n if (scratchpad && scratchpad.nullResume !== undefined) {\n this.putWrites(NULL_TASK_ID, [[RESUME, scratchpad.nullResume]]);\n }\n\n // map command to writes\n if (isCommand(this.input)) {\n const hasResume = this.input.resume != null;\n\n if (\n this.input.resume != null &&\n typeof this.input.resume === \"object\" &&\n Object.keys(this.input.resume).every(isXXH3)\n ) {\n this.config.configurable ??= {};\n this.config.configurable[CONFIG_KEY_RESUME_MAP] = this.input.resume;\n }\n\n if (hasResume && this.checkpointer == null) {\n throw new Error(\"Cannot use Command(resume=...) without checkpointer\");\n }\n\n const writes: { [key: string]: PendingWrite[] } = {};\n\n // group writes by task id\n for (const [tid, key, value] of mapCommand(\n this.input,\n this.checkpointPendingWrites\n )) {\n writes[tid] ??= [];\n writes[tid].push([key, value]);\n }\n if (Object.keys(writes).length === 0) {\n throw new EmptyInputError(\"Received empty Command input\");\n }\n\n // save writes\n for (const [tid, ws] of Object.entries(writes)) {\n this.putWrites(tid, ws);\n }\n }\n\n // apply null writes\n const nullWrites = (this.checkpointPendingWrites ?? [])\n .filter((w) => w[0] === NULL_TASK_ID)\n .map((w) => w.slice(1)) as PendingWrite<string>[];\n if (nullWrites.length > 0) {\n _applyWrites(\n this.checkpoint,\n this.channels,\n [\n {\n name: INPUT,\n writes: nullWrites,\n triggers: [],\n },\n ],\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n }\n const isCommandUpdateOrGoto =\n isCommand(this.input) && nullWrites.length > 0;\n if (this.isResuming || isCommandUpdateOrGoto) {\n for (const channelName in this.channels) {\n if (!Object.prototype.hasOwnProperty.call(this.channels, channelName))\n continue;\n if (this.checkpoint.channel_versions[channelName] !== undefined) {\n const version = this.checkpoint.channel_versions[channelName];\n this.checkpoint.versions_seen[INTERRUPT] = {\n ...this.checkpoint.versions_seen[INTERRUPT],\n [channelName]: version,\n };\n }\n }\n // produce values output\n const valuesOutput = await gatherIterator(\n prefixGenerator(\n mapOutputValues(this.outputKeys, true, this.channels),\n \"values\"\n )\n );\n this._emit(valuesOutput);\n }\n if (this.isResuming) {\n this.input = INPUT_RESUMING;\n } else if (isCommandUpdateOrGoto) {\n // we need to create a new checkpoint for Command(update=...) or Command(goto=...)\n // in case the result of Command(goto=...) is an interrupt.\n // If not done, the checkpoint containing the interrupt will be lost.\n await this._putCheckpoint({ source: \"input\" });\n this.input = INPUT_DONE;\n } else {\n // map inputs to channel updates\n const inputWrites = await gatherIterator(mapInput(inputKeys, this.input));\n if (inputWrites.length > 0) {\n const discardTasks = _prepareNextTasks(\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n this.config,\n true,\n { step: this.step }\n );\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n (Object.values(discardTasks) as WritesProtocol[]).concat([\n {\n name: INPUT,\n writes: inputWrites as PendingWrite[],\n triggers: [],\n },\n ]),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n // save input checkpoint\n await this._putCheckpoint({ source: \"input\" });\n\n this.input = INPUT_DONE;\n } else if (!(CONFIG_KEY_RESUMING in (this.config.configurable ?? {}))) {\n throw new EmptyInputError(\n `Received no input writes for ${JSON.stringify(inputKeys, null, 2)}`\n );\n } else {\n // done with input\n this.input = INPUT_DONE;\n }\n }\n if (!this.isNested) {\n this.config = patchConfigurable(this.config, {\n [CONFIG_KEY_RESUMING]: this.isResuming,\n });\n }\n }\n\n protected _emit(values: [StreamMode, unknown][]) {\n for (const [mode, payload] of values) {\n if (this.stream.modes.has(mode)) {\n this.stream.push([this.checkpointNamespace, mode, payload]);\n }\n\n // debug mode is a \"checkpoints\" or \"tasks\" wrapped in an object\n // TODO: consider deprecating this in 1.x\n if (\n (mode === \"checkpoints\" || mode === \"tasks\") &&\n this.stream.modes.has(\"debug\")\n ) {\n const step = mode === \"checkpoints\" ? this.step - 1 : this.step;\n const timestamp = new Date().toISOString();\n const type = (() => {\n if (mode === \"checkpoints\") {\n return \"checkpoint\";\n } else if (\n typeof payload === \"object\" &&\n payload != null &&\n \"result\" in payload\n ) {\n return \"task_result\";\n } else {\n return \"task\";\n }\n })();\n\n this.stream.push([\n this.checkpointNamespace,\n \"debug\",\n { step, type, timestamp, payload },\n ]);\n }\n }\n }\n\n protected _putCheckpoint(\n inputMetadata: Omit<CheckpointMetadata, \"step\" | \"parents\">\n ) {\n const exiting = this.checkpointMetadata === inputMetadata;\n\n const doCheckpoint =\n this.checkpointer != null && (this.durability !== \"exit\" || exiting);\n\n const storeCheckpoint = (checkpoint: Checkpoint) => {\n // store the previous checkpoint config for debug events\n this.prevCheckpointConfig = this.checkpointConfig?.configurable\n ?.checkpoint_id\n ? this.checkpointConfig\n : undefined;\n\n // child graphs keep at most one checkpoint per parent checkpoint\n // this is achieved by writing child checkpoints as progress is made\n // (so that error recovery / resuming from interrupt don't lose work)\n // but doing so always with an id equal to that of the parent checkpoint\n this.checkpointConfig = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]:\n this.config.configurable?.checkpoint_ns ?? \"\",\n });\n\n const channelVersions = { ...this.checkpoint.channel_versions };\n const newVersions = getNewChannelVersions(\n this.checkpointPreviousVersions,\n channelVersions\n );\n this.checkpointPreviousVersions = channelVersions;\n // save it, without blocking\n // if there's a previous checkpoint save in progress, wait for it\n // ensuring checkpointers receive checkpoints in order\n void this._checkpointerPutAfterPrevious({\n config: { ...this.checkpointConfig },\n checkpoint: copyCheckpoint(checkpoint),\n metadata: { ...this.checkpointMetadata },\n newVersions,\n });\n this.checkpointConfig = {\n ...this.checkpointConfig,\n configurable: {\n ...this.checkpointConfig.configurable,\n checkpoint_id: this.checkpoint.id,\n },\n };\n };\n\n if (!exiting) {\n this.checkpointMetadata = {\n ...inputMetadata,\n step: this.step,\n parents: this.config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP] ?? {},\n };\n }\n\n // create new checkpoint\n this.checkpoint = createCheckpoint(\n this.checkpoint,\n doCheckpoint ? this.channels : undefined,\n this.step,\n exiting ? { id: this.checkpoint.id } : undefined\n );\n\n // Bail if no checkpointer\n if (doCheckpoint) storeCheckpoint(this.checkpoint);\n\n if (!exiting) {\n // increment step\n this.step += 1;\n }\n }\n\n protected _flushPendingWrites() {\n if (this.checkpointer == null) return;\n if (this.checkpointPendingWrites.length === 0) return;\n\n // patch config\n const config = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]: this.config.configurable?.checkpoint_ns ?? \"\",\n [CONFIG_KEY_CHECKPOINT_ID]: this.checkpoint.id,\n });\n\n // group writes by task id\n const byTask: Record<string, PendingWrite<string>[]> = {};\n for (const [tid, key, value] of this.checkpointPendingWrites) {\n byTask[tid] ??= [];\n byTask[tid].push([key, value]);\n }\n\n // submit writes to checkpointer\n for (const [tid, ws] of Object.entries(byTask)) {\n this.checkpointerPromises.push(\n this.checkpointer.putWrites(config, ws, tid)\n );\n }\n }\n\n protected _matchWrites(\n tasks: Record<string, PregelExecutableTask<string, string>>\n ) {\n for (const [tid, k, v] of this.checkpointPendingWrites) {\n if (k === ERROR || k === INTERRUPT || k === RESUME) {\n continue;\n }\n const task = Object.values(tasks).find((t) => t.id === tid);\n if (task) {\n task.writes.push([k, v]);\n }\n }\n for (const task of Object.values(tasks)) {\n if (task.writes.length > 0) {\n this._outputWrites(task.id, task.writes, true);\n }\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"loop.cjs","names":["IterableReadableWritableStream","BaseCache","isCommand","increment","CONFIG_KEY_STREAM","CONFIG_KEY_SCRATCHPAD","patchConfigurable","CONFIG_KEY_CHECKPOINT_NS","CONFIG_KEY_READ","CONFIG_KEY_CHECKPOINT_MAP","emptyChannels","AsyncBatchedStore","WRITES_IDX_MAP","_isSend","sanitizeUntrackedValuesInSend","CONFIG_KEY_CHECKPOINT_ID","INTERRUPT","gatherIteratorSync","prefixGenerator","mapOutputUpdates","mapDebugTaskResults","GraphInterrupt","_applyWrites","gatherIterator","mapOutputValues","shouldInterrupt","CONFIG_KEY_RESUMING","_prepareNextTasks","mapDebugCheckpoint","mapDebugTasks","readChannels","isGraphInterrupt","_prepareSingleTask","PUSH","NULL_TASK_ID","RESUME","isXXH3","CONFIG_KEY_RESUME_MAP","mapCommand","EmptyInputError","INPUT","mapInput","getNewChannelVersions","createCheckpoint"],"sources":["../../src/pregel/loop.ts"],"sourcesContent":["import type { RunnableConfig } from \"@langchain/core/runnables\";\nimport type { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport {\n BaseCheckpointSaver,\n Checkpoint,\n CheckpointTuple,\n copyCheckpoint,\n emptyCheckpoint,\n PendingWrite,\n CheckpointPendingWrite,\n CheckpointMetadata,\n All,\n BaseStore,\n AsyncBatchedStore,\n WRITES_IDX_MAP,\n BaseCache,\n CacheFullKey,\n CacheNamespace,\n} from \"@langchain/langgraph-checkpoint\";\n\nimport {\n BaseChannel,\n createCheckpoint,\n emptyChannels,\n} from \"../channels/base.js\";\nimport type {\n Call,\n CallTaskPath,\n Durability,\n PregelExecutableTask,\n PregelScratchpad,\n StreamMode,\n} from \"./types.js\";\nimport {\n isCommand,\n _isSend,\n CHECKPOINT_NAMESPACE_SEPARATOR,\n Command,\n CONFIG_KEY_CHECKPOINT_MAP,\n CONFIG_KEY_READ,\n CONFIG_KEY_RESUMING,\n CONFIG_KEY_STREAM,\n ERROR,\n INPUT,\n INTERRUPT,\n NULL_TASK_ID,\n RESUME,\n TAG_HIDDEN,\n TASKS,\n PUSH,\n CONFIG_KEY_SCRATCHPAD,\n CONFIG_KEY_CHECKPOINT_NS,\n CHECKPOINT_NAMESPACE_END,\n CONFIG_KEY_CHECKPOINT_ID,\n CONFIG_KEY_RESUME_MAP,\n START,\n} from \"../constants.js\";\nimport {\n _applyWrites,\n _prepareNextTasks,\n _prepareSingleTask,\n increment,\n shouldInterrupt,\n sanitizeUntrackedValuesInSend,\n WritesProtocol,\n} from \"./algo.js\";\nimport {\n gatherIterator,\n gatherIteratorSync,\n prefixGenerator,\n} from \"../utils.js\";\nimport {\n mapCommand,\n mapInput,\n mapOutputUpdates,\n mapOutputValues,\n readChannels,\n} from \"./io.js\";\nimport {\n EmptyInputError,\n GraphInterrupt,\n isGraphInterrupt,\n} from \"../errors.js\";\nimport { getNewChannelVersions, patchConfigurable } from \"./utils/index.js\";\nimport {\n mapDebugTasks,\n mapDebugCheckpoint,\n mapDebugTaskResults,\n printStepTasks,\n} from \"./debug.js\";\nimport { PregelNode } from \"./read.js\";\nimport { LangGraphRunnableConfig } from \"./runnable_types.js\";\nimport { IterableReadableWritableStream, StreamChunk } from \"./stream.js\";\nimport { isXXH3 } from \"../hash.js\";\n\nconst INPUT_DONE = Symbol.for(\"INPUT_DONE\");\nconst INPUT_RESUMING = Symbol.for(\"INPUT_RESUMING\");\nconst DEFAULT_LOOP_LIMIT = 25;\n\nexport type PregelLoopInitializeParams = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input?: any | Command;\n config: RunnableConfig;\n checkpointer?: BaseCheckpointSaver;\n outputKeys: string | string[];\n streamKeys: string | string[];\n nodes: Record<string, PregelNode>;\n channelSpecs: Record<string, BaseChannel>;\n stream: IterableReadableWritableStream;\n store?: BaseStore;\n cache?: BaseCache<PendingWrite<string>[]>;\n interruptAfter: string[] | All;\n interruptBefore: string[] | All;\n durability: Durability;\n manager?: CallbackManagerForChainRun;\n debug: boolean;\n triggerToNodes: Record<string, string[]>;\n};\n\ntype PregelLoopParams = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input?: any | Command;\n config: RunnableConfig;\n checkpointer?: BaseCheckpointSaver;\n checkpoint: Checkpoint;\n checkpointMetadata: CheckpointMetadata;\n checkpointPreviousVersions: Record<string, string | number>;\n checkpointPendingWrites: CheckpointPendingWrite[];\n checkpointConfig: RunnableConfig;\n channels: Record<string, BaseChannel>;\n step: number;\n stop: number;\n outputKeys: string | string[];\n streamKeys: string | string[];\n nodes: Record<string, PregelNode>;\n checkpointNamespace: string[];\n skipDoneTasks: boolean;\n isNested: boolean;\n manager?: CallbackManagerForChainRun;\n stream: IterableReadableWritableStream;\n store?: AsyncBatchedStore;\n cache?: BaseCache<PendingWrite<string>[]>;\n prevCheckpointConfig: RunnableConfig | undefined;\n interruptAfter: string[] | All;\n interruptBefore: string[] | All;\n durability: Durability;\n debug: boolean;\n triggerToNodes: Record<string, string[]>;\n};\n\nfunction createDuplexStream(...streams: IterableReadableWritableStream[]) {\n return new IterableReadableWritableStream({\n passthroughFn: (value: StreamChunk) => {\n for (const stream of streams) {\n if (stream.modes.has(value[1])) {\n stream.push(value);\n }\n }\n },\n modes: new Set(streams.flatMap((s) => Array.from(s.modes))),\n });\n}\n\nclass AsyncBatchedCache extends BaseCache<PendingWrite<string>[]> {\n protected cache: BaseCache<PendingWrite<string>[]>;\n\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(cache: BaseCache<unknown>) {\n super();\n this.cache = cache as BaseCache<PendingWrite<string>[]>;\n }\n\n async get(keys: CacheFullKey[]) {\n return this.enqueueOperation(\"get\", keys);\n }\n\n async set(\n pairs: {\n key: CacheFullKey;\n value: PendingWrite<string>[];\n ttl?: number;\n }[]\n ) {\n return this.enqueueOperation(\"set\", pairs);\n }\n\n async clear(namespaces: CacheNamespace[]) {\n return this.enqueueOperation(\"clear\", namespaces);\n }\n\n async stop() {\n await this.queue;\n }\n\n private enqueueOperation<Type extends \"get\" | \"set\" | \"clear\">(\n type: Type,\n ...args: Parameters<(typeof this.cache)[Type]>\n ) {\n const newPromise = this.queue.then(() => {\n // @ts-expect-error Tuple type warning\n return this.cache[type](...args) as Promise<\n ReturnType<(typeof this.cache)[Type]>\n >;\n });\n\n this.queue = newPromise.then(\n () => void 0,\n () => void 0\n );\n\n return newPromise;\n }\n}\n\nexport class PregelLoop {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected input?: any | Command;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n output: any;\n\n config: LangGraphRunnableConfig;\n\n protected checkpointer?: BaseCheckpointSaver;\n\n protected checkpointerGetNextVersion: (current: number | undefined) => number;\n\n channels: Record<string, BaseChannel>;\n\n protected checkpoint: Checkpoint;\n\n protected checkpointIdSaved: string | undefined;\n\n protected checkpointConfig: RunnableConfig;\n\n checkpointMetadata: CheckpointMetadata;\n\n protected checkpointNamespace: string[];\n\n protected checkpointPendingWrites: CheckpointPendingWrite[] = [];\n\n protected checkpointPreviousVersions: Record<string, string | number>;\n\n step: number;\n\n protected stop: number;\n\n protected durability: Durability;\n\n protected outputKeys: string | string[];\n\n protected streamKeys: string | string[];\n\n protected nodes: Record<string, PregelNode>;\n\n protected skipDoneTasks: boolean;\n\n protected prevCheckpointConfig: RunnableConfig | undefined;\n\n protected updatedChannels: Set<string> | undefined;\n\n status:\n | \"pending\"\n | \"done\"\n | \"interrupt_before\"\n | \"interrupt_after\"\n | \"out_of_steps\" = \"pending\";\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tasks: Record<string, PregelExecutableTask<any, any>> = {};\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n stream: IterableReadableWritableStream;\n\n checkpointerPromises: Set<Promise<unknown>> = new Set();\n\n isNested: boolean;\n\n protected _checkpointerChainedPromise: Promise<unknown> = Promise.resolve();\n\n /**\n * Track a checkpointer promise, removing it from the set on success.\n * Failed promises are kept so that Promise.all() in the finally block\n * of _streamIterator can surface the error.\n *\n * @internal\n */\n protected _trackCheckpointerPromise(promise: Promise<unknown>) {\n const tracked = promise.then(\n (value) => {\n this.checkpointerPromises.delete(tracked);\n return value;\n },\n (error) => {\n // Keep failed promises in the set so errors surface via Promise.all()\n throw error;\n }\n );\n this.checkpointerPromises.add(tracked);\n }\n\n store?: AsyncBatchedStore;\n\n cache?: AsyncBatchedCache;\n\n manager?: CallbackManagerForChainRun;\n\n interruptAfter: string[] | All;\n\n interruptBefore: string[] | All;\n\n toInterrupt: PregelExecutableTask<string, string>[] = [];\n\n debug: boolean = false;\n\n triggerToNodes: Record<string, string[]>;\n\n get isResuming() {\n let hasChannelVersions = false;\n if (START in this.checkpoint.channel_versions) {\n // For common channels, we can short-circuit the check\n hasChannelVersions = true;\n } else {\n for (const chan in this.checkpoint.channel_versions) {\n if (\n Object.prototype.hasOwnProperty.call(\n this.checkpoint.channel_versions,\n chan\n )\n ) {\n hasChannelVersions = true;\n break;\n }\n }\n }\n\n const configHasResumingFlag =\n this.config.configurable?.[CONFIG_KEY_RESUMING] !== undefined;\n const configIsResuming =\n configHasResumingFlag && this.config.configurable?.[CONFIG_KEY_RESUMING];\n\n const inputIsNullOrUndefined =\n this.input === null || this.input === undefined;\n const inputIsCommandResuming =\n isCommand(this.input) && this.input.resume != null;\n const inputIsResuming = this.input === INPUT_RESUMING;\n\n const runIdMatchesPrevious =\n !this.isNested &&\n this.config.metadata?.run_id !== undefined &&\n (this.checkpointMetadata as { run_id?: unknown })?.run_id !== undefined &&\n this.config.metadata.run_id ===\n (this.checkpointMetadata as { run_id?: unknown })?.run_id;\n\n return (\n hasChannelVersions &&\n (configIsResuming ||\n inputIsNullOrUndefined ||\n inputIsCommandResuming ||\n inputIsResuming ||\n runIdMatchesPrevious)\n );\n }\n\n constructor(params: PregelLoopParams) {\n this.input = params.input;\n this.checkpointer = params.checkpointer;\n // TODO: if managed values no longer needs graph we can replace with\n // managed_specs, channel_specs\n if (this.checkpointer !== undefined) {\n this.checkpointerGetNextVersion = this.checkpointer.getNextVersion.bind(\n this.checkpointer\n );\n } else {\n this.checkpointerGetNextVersion = increment;\n }\n this.checkpoint = params.checkpoint;\n this.checkpointMetadata = params.checkpointMetadata;\n this.checkpointPreviousVersions = params.checkpointPreviousVersions;\n this.channels = params.channels;\n this.checkpointPendingWrites = params.checkpointPendingWrites;\n this.step = params.step;\n this.stop = params.stop;\n this.config = params.config;\n this.checkpointConfig = params.checkpointConfig;\n this.isNested = params.isNested;\n this.manager = params.manager;\n this.outputKeys = params.outputKeys;\n this.streamKeys = params.streamKeys;\n this.nodes = params.nodes;\n this.skipDoneTasks = params.skipDoneTasks;\n this.store = params.store;\n this.cache = params.cache ? new AsyncBatchedCache(params.cache) : undefined;\n this.stream = params.stream;\n this.checkpointNamespace = params.checkpointNamespace;\n this.prevCheckpointConfig = params.prevCheckpointConfig;\n this.interruptAfter = params.interruptAfter;\n this.interruptBefore = params.interruptBefore;\n this.durability = params.durability;\n this.debug = params.debug;\n this.triggerToNodes = params.triggerToNodes;\n }\n\n static async initialize(params: PregelLoopInitializeParams) {\n let { config, stream } = params;\n if (\n stream !== undefined &&\n config.configurable?.[CONFIG_KEY_STREAM] !== undefined\n ) {\n stream = createDuplexStream(\n stream,\n config.configurable[CONFIG_KEY_STREAM]\n );\n }\n const skipDoneTasks = config.configurable\n ? !(\"checkpoint_id\" in config.configurable)\n : true;\n\n const scratchpad = config.configurable?.[CONFIG_KEY_SCRATCHPAD] as\n | PregelScratchpad\n | undefined;\n\n if (config.configurable && scratchpad) {\n if (scratchpad.subgraphCounter > 0) {\n config = patchConfigurable(config, {\n [CONFIG_KEY_CHECKPOINT_NS]: [\n config.configurable[CONFIG_KEY_CHECKPOINT_NS],\n scratchpad.subgraphCounter.toString(),\n ].join(CHECKPOINT_NAMESPACE_SEPARATOR),\n });\n }\n\n scratchpad.subgraphCounter += 1;\n }\n\n const isNested = CONFIG_KEY_READ in (config.configurable ?? {});\n if (\n !isNested &&\n config.configurable?.checkpoint_ns !== undefined &&\n config.configurable?.checkpoint_ns !== \"\"\n ) {\n config = patchConfigurable(config, {\n checkpoint_ns: \"\",\n checkpoint_id: undefined,\n });\n }\n let checkpointConfig = config;\n if (\n config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP] !== undefined &&\n config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP]?.[\n config.configurable?.checkpoint_ns\n ]\n ) {\n checkpointConfig = patchConfigurable(config, {\n checkpoint_id:\n config.configurable[CONFIG_KEY_CHECKPOINT_MAP][\n config.configurable?.checkpoint_ns\n ],\n });\n }\n const checkpointNamespace =\n config.configurable?.checkpoint_ns?.split(\n CHECKPOINT_NAMESPACE_SEPARATOR\n ) ?? [];\n\n const saved: CheckpointTuple = (await params.checkpointer?.getTuple(\n checkpointConfig\n )) ?? {\n config,\n checkpoint: emptyCheckpoint(),\n metadata: { source: \"input\", step: -2, parents: {} },\n pendingWrites: [],\n };\n checkpointConfig = {\n ...config,\n ...saved.config,\n configurable: {\n checkpoint_ns: \"\",\n ...config.configurable,\n ...saved.config.configurable,\n },\n };\n const prevCheckpointConfig = saved.parentConfig;\n const checkpoint = copyCheckpoint(saved.checkpoint);\n const checkpointMetadata = { ...saved.metadata } as CheckpointMetadata;\n const checkpointPendingWrites = saved.pendingWrites ?? [];\n\n const channels = emptyChannels(params.channelSpecs, checkpoint);\n\n const step = (checkpointMetadata.step ?? 0) + 1;\n const stop = step + (config.recursionLimit ?? DEFAULT_LOOP_LIMIT) + 1;\n const checkpointPreviousVersions = { ...checkpoint.channel_versions };\n\n const store = params.store\n ? new AsyncBatchedStore(params.store)\n : undefined;\n\n if (store) {\n // Start the store. This is a batch store, so it will run continuously\n await store.start();\n }\n return new PregelLoop({\n input: params.input,\n config,\n checkpointer: params.checkpointer,\n checkpoint,\n checkpointMetadata,\n checkpointConfig,\n prevCheckpointConfig,\n checkpointNamespace,\n channels,\n isNested,\n manager: params.manager,\n skipDoneTasks,\n step,\n stop,\n checkpointPreviousVersions,\n checkpointPendingWrites,\n outputKeys: params.outputKeys ?? [],\n streamKeys: params.streamKeys ?? [],\n nodes: params.nodes,\n stream,\n store,\n cache: params.cache,\n interruptAfter: params.interruptAfter,\n interruptBefore: params.interruptBefore,\n durability: params.durability,\n debug: params.debug,\n triggerToNodes: params.triggerToNodes,\n });\n }\n\n protected _checkpointerPutAfterPrevious(input: {\n config: RunnableConfig;\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n newVersions: Record<string, string | number>;\n }) {\n this._checkpointerChainedPromise = this._checkpointerChainedPromise.then(\n () => {\n return this.checkpointer?.put(\n input.config,\n input.checkpoint,\n input.metadata,\n input.newVersions\n );\n }\n );\n this._trackCheckpointerPromise(this._checkpointerChainedPromise);\n }\n\n /**\n * Put writes for a task, to be read by the next tick.\n * @param taskId\n * @param writes\n */\n putWrites(taskId: string, writes: PendingWrite<string>[]) {\n let writesCopy = writes;\n if (writesCopy.length === 0) return;\n\n // deduplicate writes to special channels, last write wins\n if (writesCopy.every(([key]) => key in WRITES_IDX_MAP)) {\n writesCopy = Array.from(\n new Map(writesCopy.map((w) => [w[0], w])).values()\n );\n }\n\n // Check if any channels are UntrackedValue (manual loop for perf)\n let hasUntrackedChannels = false;\n for (const key in this.channels) {\n if (Object.prototype.hasOwnProperty.call(this.channels, key)) {\n const channel = this.channels[key];\n if (channel.lc_graph_name === \"UntrackedValue\") {\n hasUntrackedChannels = true;\n break;\n }\n }\n }\n\n // Sanitize writes for checkpointing: remove UntrackedValue writes and sanitize Send packets\n let writesToSave = writesCopy;\n if (hasUntrackedChannels) {\n writesToSave = writesCopy\n .filter(([c]) => {\n // Don't persist UntrackedValue channel writes\n const channel = this.channels[c];\n return !channel || channel.lc_graph_name !== \"UntrackedValue\";\n })\n .map(([c, v]) => {\n // Sanitize UntrackedValues nested within Send packets\n if (c === TASKS && _isSend(v)) {\n return [c, sanitizeUntrackedValuesInSend(v, this.channels)] as [\n string,\n unknown,\n ];\n }\n return [c, v] as [string, unknown];\n });\n }\n\n // remove existing writes for this task\n this.checkpointPendingWrites = this.checkpointPendingWrites.filter(\n (w) => w[0] !== taskId\n );\n\n // save writes\n for (const [c, v] of writesToSave) {\n this.checkpointPendingWrites.push([taskId, c, v]);\n }\n\n const config = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]: this.config.configurable?.checkpoint_ns ?? \"\",\n [CONFIG_KEY_CHECKPOINT_ID]: this.checkpoint.id,\n });\n\n if (this.durability !== \"exit\" && this.checkpointer != null) {\n this._trackCheckpointerPromise(\n // Use sanitized writes for checkpointer\n this.checkpointer.putWrites(config, writesToSave, taskId)\n );\n }\n\n if (this.tasks) {\n this._outputWrites(taskId, writesCopy);\n }\n\n if (!writes.length || !this.cache || !this.tasks) {\n return;\n }\n\n // only cache tasks with a cache key\n const task = this.tasks[taskId];\n if (task == null || task.cache_key == null) {\n return;\n }\n\n // only cache successful tasks\n if (writes[0][0] === ERROR || writes[0][0] === INTERRUPT) {\n return;\n }\n\n void this.cache.set([\n {\n key: [task.cache_key.ns, task.cache_key.key],\n value: task.writes,\n ttl: task.cache_key.ttl,\n },\n ]);\n }\n\n _outputWrites(taskId: string, writes: [string, unknown][], cached = false) {\n const task = this.tasks[taskId];\n if (task !== undefined) {\n if (\n task.config !== undefined &&\n (task.config.tags ?? []).includes(TAG_HIDDEN)\n ) {\n return;\n }\n\n if (writes.length > 0) {\n if (writes[0][0] === INTERRUPT) {\n // in `algo.ts` we append a bool to the task path to indicate\n // whether or not a call was present. If so, we don't emit the\n // the interrupt as it'll be emitted by the parent.\n if (\n task.path?.[0] === PUSH &&\n task.path?.[task.path.length - 1] === true\n )\n return;\n\n const interruptWrites = writes\n .filter((w) => w[0] === INTERRUPT)\n .flatMap((w) => w[1] as string[]);\n\n this._emit([\n [\"updates\", { [INTERRUPT]: interruptWrites }],\n [\"values\", { [INTERRUPT]: interruptWrites }],\n ]);\n } else if (writes[0][0] !== ERROR) {\n this._emit(\n gatherIteratorSync(\n prefixGenerator(\n mapOutputUpdates(this.outputKeys, [[task, writes]], cached),\n \"updates\"\n )\n )\n );\n }\n }\n if (!cached) {\n this._emit(\n gatherIteratorSync(\n prefixGenerator(\n mapDebugTaskResults([[task, writes]], this.streamKeys),\n \"tasks\"\n )\n )\n );\n }\n }\n }\n\n async _matchCachedWrites() {\n if (!this.cache) return [];\n\n const matched: {\n task: PregelExecutableTask<string, string>;\n result: unknown;\n }[] = [];\n\n const serializeKey = ([ns, key]: CacheFullKey) => {\n return `ns:${ns.join(\",\")}|key:${key}`;\n };\n\n const keys: CacheFullKey[] = [];\n const keyMap: Record<string, PregelExecutableTask<string, string>> = {};\n\n for (const task of Object.values(this.tasks)) {\n if (task.cache_key != null && !task.writes.length) {\n keys.push([task.cache_key.ns, task.cache_key.key]);\n keyMap[serializeKey([task.cache_key.ns, task.cache_key.key])] = task;\n }\n }\n\n if (keys.length === 0) return [];\n const cache = await this.cache.get(keys);\n\n for (const { key, value } of cache) {\n const task = keyMap[serializeKey(key)];\n if (task != null) {\n // update the task with the cached writes\n task.writes.push(...value);\n matched.push({ task, result: value });\n }\n }\n\n return matched;\n }\n\n /**\n * Execute a single iteration of the Pregel loop.\n * Returns true if more iterations are needed.\n * @param params\n */\n async tick(params: { inputKeys?: string | string[] }): Promise<boolean> {\n if (this.store && !this.store.isRunning) {\n await this.store?.start();\n }\n const { inputKeys = [] } = params;\n if (this.status !== \"pending\") {\n throw new Error(\n `Cannot tick when status is no longer \"pending\". Current status: \"${this.status}\"`\n );\n }\n if (![INPUT_DONE, INPUT_RESUMING].includes(this.input)) {\n await this._first(inputKeys);\n } else if (this.toInterrupt.length > 0) {\n this.status = \"interrupt_before\";\n throw new GraphInterrupt();\n } else if (\n Object.values(this.tasks).every((task) => task.writes.length > 0)\n ) {\n // finish superstep\n const writes = Object.values(this.tasks).flatMap((t) => t.writes);\n // All tasks have finished\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n Object.values(this.tasks),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n // produce values output\n const valuesOutput = await gatherIterator(\n prefixGenerator(\n mapOutputValues(this.outputKeys, writes, this.channels),\n \"values\"\n )\n );\n this._emit(valuesOutput);\n // clear pending writes\n this.checkpointPendingWrites = [];\n await this._putCheckpoint({ source: \"loop\" });\n // after execution, check if we should interrupt\n if (\n shouldInterrupt(\n this.checkpoint,\n this.interruptAfter,\n Object.values(this.tasks)\n )\n ) {\n this.status = \"interrupt_after\";\n throw new GraphInterrupt();\n }\n\n // unset resuming flag\n if (this.config.configurable?.[CONFIG_KEY_RESUMING] !== undefined) {\n delete this.config.configurable?.[CONFIG_KEY_RESUMING];\n }\n } else {\n return false;\n }\n if (this.step > this.stop) {\n this.status = \"out_of_steps\";\n return false;\n }\n\n const nextTasks = _prepareNextTasks(\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n this.config,\n true,\n {\n step: this.step,\n checkpointer: this.checkpointer,\n isResuming: this.isResuming,\n manager: this.manager,\n store: this.store,\n stream: this.stream,\n triggerToNodes: this.triggerToNodes,\n updatedChannels: this.updatedChannels,\n }\n );\n this.tasks = nextTasks;\n\n // Produce debug output\n if (this.checkpointer) {\n this._emit(\n await gatherIterator(\n prefixGenerator(\n mapDebugCheckpoint(\n this.checkpointConfig,\n this.channels,\n this.streamKeys,\n this.checkpointMetadata,\n Object.values(this.tasks),\n this.checkpointPendingWrites,\n this.prevCheckpointConfig,\n this.outputKeys\n ),\n \"checkpoints\"\n )\n )\n );\n }\n\n if (Object.values(this.tasks).length === 0) {\n this.status = \"done\";\n return false;\n }\n // if there are pending writes from a previous loop, apply them\n if (this.skipDoneTasks && this.checkpointPendingWrites.length > 0) {\n for (const [tid, k, v] of this.checkpointPendingWrites) {\n if (k === ERROR || k === INTERRUPT || k === RESUME) {\n continue;\n }\n const task = Object.values(this.tasks).find((t) => t.id === tid);\n if (task) {\n task.writes.push([k, v]);\n }\n }\n for (const task of Object.values(this.tasks)) {\n if (task.writes.length > 0) {\n this._outputWrites(task.id, task.writes, true);\n }\n }\n }\n // if all tasks have finished, re-tick\n if (Object.values(this.tasks).every((task) => task.writes.length > 0)) {\n return this.tick({ inputKeys });\n }\n\n // Before execution, check if we should interrupt\n if (\n shouldInterrupt(\n this.checkpoint,\n this.interruptBefore,\n Object.values(this.tasks)\n )\n ) {\n this.status = \"interrupt_before\";\n throw new GraphInterrupt();\n }\n\n // Produce debug output\n const debugOutput = await gatherIterator(\n prefixGenerator(mapDebugTasks(Object.values(this.tasks)), \"tasks\")\n );\n this._emit(debugOutput);\n\n return true;\n }\n\n async finishAndHandleError(error?: Error) {\n // persist current checkpoint and writes\n if (\n this.durability === \"exit\" &&\n // if it's a top graph\n (!this.isNested ||\n // or a nested graph with error or interrupt\n typeof error !== \"undefined\" ||\n // or a nested graph with checkpointer: true\n this.checkpointNamespace.every(\n (part) => !part.includes(CHECKPOINT_NAMESPACE_END)\n ))\n ) {\n this._putCheckpoint(this.checkpointMetadata);\n this._flushPendingWrites();\n }\n\n const suppress = this._suppressInterrupt(error);\n if (suppress || error === undefined) {\n this.output = readChannels(this.channels, this.outputKeys);\n }\n if (suppress) {\n // emit one last \"values\" event, with pending writes applied\n if (\n this.tasks !== undefined &&\n this.checkpointPendingWrites.length > 0 &&\n Object.values(this.tasks).some((task) => task.writes.length > 0)\n ) {\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n Object.values(this.tasks),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n\n this._emit(\n gatherIteratorSync(\n prefixGenerator(\n mapOutputValues(\n this.outputKeys,\n Object.values(this.tasks).flatMap((t) => t.writes),\n this.channels\n ),\n \"values\"\n )\n )\n );\n }\n\n // Emit INTERRUPT event\n if (isGraphInterrupt(error) && !error.interrupts.length) {\n this._emit([\n [\"updates\", { [INTERRUPT]: [] }],\n [\"values\", { [INTERRUPT]: [] }],\n ]);\n }\n }\n return suppress;\n }\n\n async acceptPush(\n task: PregelExecutableTask<string, string>,\n writeIdx: number,\n call?: Call\n ): Promise<PregelExecutableTask<string, string> | void> {\n if (\n this.interruptAfter?.length > 0 &&\n shouldInterrupt(this.checkpoint, this.interruptAfter, [task])\n ) {\n this.toInterrupt.push(task);\n return;\n }\n\n const pushed = _prepareSingleTask(\n [PUSH, task.path ?? [], writeIdx, task.id, call] as CallTaskPath,\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n task.config ?? {},\n true,\n {\n step: this.step,\n checkpointer: this.checkpointer,\n manager: this.manager,\n store: this.store,\n stream: this.stream,\n }\n );\n\n if (!pushed) return;\n if (\n this.interruptBefore?.length > 0 &&\n shouldInterrupt(this.checkpoint, this.interruptBefore, [pushed])\n ) {\n this.toInterrupt.push(pushed);\n return;\n }\n\n this._emit(\n gatherIteratorSync(prefixGenerator(mapDebugTasks([pushed]), \"tasks\"))\n );\n\n if (this.debug) printStepTasks(this.step, [pushed]);\n this.tasks[pushed.id] = pushed;\n if (this.skipDoneTasks) this._matchWrites({ [pushed.id]: pushed });\n\n const tasks = await this._matchCachedWrites();\n for (const { task } of tasks) {\n this._outputWrites(task.id, task.writes, true);\n }\n\n return pushed;\n }\n\n protected _suppressInterrupt(e?: Error): boolean {\n return isGraphInterrupt(e) && !this.isNested;\n }\n\n protected async _first(inputKeys: string | string[]) {\n /*\n * Resuming from previous checkpoint requires\n * - finding a previous checkpoint\n * - receiving null input (outer graph) or RESUMING flag (subgraph)\n */\n\n const { configurable } = this.config;\n\n // take resume value from parent\n const scratchpad = configurable?.[\n CONFIG_KEY_SCRATCHPAD\n ] as PregelScratchpad;\n\n if (scratchpad && scratchpad.nullResume !== undefined) {\n this.putWrites(NULL_TASK_ID, [[RESUME, scratchpad.nullResume]]);\n }\n\n // map command to writes\n if (isCommand(this.input)) {\n const hasResume = this.input.resume != null;\n\n if (\n this.input.resume != null &&\n typeof this.input.resume === \"object\" &&\n Object.keys(this.input.resume).every(isXXH3)\n ) {\n this.config.configurable ??= {};\n this.config.configurable[CONFIG_KEY_RESUME_MAP] = this.input.resume;\n }\n\n if (hasResume && this.checkpointer == null) {\n throw new Error(\"Cannot use Command(resume=...) without checkpointer\");\n }\n\n const writes: { [key: string]: PendingWrite[] } = {};\n\n // group writes by task id\n for (const [tid, key, value] of mapCommand(\n this.input,\n this.checkpointPendingWrites\n )) {\n writes[tid] ??= [];\n writes[tid].push([key, value]);\n }\n if (Object.keys(writes).length === 0) {\n throw new EmptyInputError(\"Received empty Command input\");\n }\n\n // save writes\n for (const [tid, ws] of Object.entries(writes)) {\n this.putWrites(tid, ws);\n }\n }\n\n // apply null writes\n const nullWrites = (this.checkpointPendingWrites ?? [])\n .filter((w) => w[0] === NULL_TASK_ID)\n .map((w) => w.slice(1)) as PendingWrite<string>[];\n if (nullWrites.length > 0) {\n _applyWrites(\n this.checkpoint,\n this.channels,\n [\n {\n name: INPUT,\n writes: nullWrites,\n triggers: [],\n },\n ],\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n }\n const isCommandUpdateOrGoto =\n isCommand(this.input) && nullWrites.length > 0;\n if (this.isResuming || isCommandUpdateOrGoto) {\n for (const channelName in this.channels) {\n if (!Object.prototype.hasOwnProperty.call(this.channels, channelName))\n continue;\n if (this.checkpoint.channel_versions[channelName] !== undefined) {\n const version = this.checkpoint.channel_versions[channelName];\n this.checkpoint.versions_seen[INTERRUPT] = {\n ...this.checkpoint.versions_seen[INTERRUPT],\n [channelName]: version,\n };\n }\n }\n // produce values output\n const valuesOutput = await gatherIterator(\n prefixGenerator(\n mapOutputValues(this.outputKeys, true, this.channels),\n \"values\"\n )\n );\n this._emit(valuesOutput);\n }\n if (this.isResuming) {\n this.input = INPUT_RESUMING;\n } else if (isCommandUpdateOrGoto) {\n // we need to create a new checkpoint for Command(update=...) or Command(goto=...)\n // in case the result of Command(goto=...) is an interrupt.\n // If not done, the checkpoint containing the interrupt will be lost.\n await this._putCheckpoint({ source: \"input\" });\n this.input = INPUT_DONE;\n } else {\n // map inputs to channel updates\n const inputWrites = await gatherIterator(mapInput(inputKeys, this.input));\n if (inputWrites.length > 0) {\n const discardTasks = _prepareNextTasks(\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n this.config,\n true,\n { step: this.step }\n );\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n (Object.values(discardTasks) as WritesProtocol[]).concat([\n {\n name: INPUT,\n writes: inputWrites as PendingWrite[],\n triggers: [],\n },\n ]),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n // save input checkpoint\n await this._putCheckpoint({ source: \"input\" });\n\n this.input = INPUT_DONE;\n } else if (!(CONFIG_KEY_RESUMING in (this.config.configurable ?? {}))) {\n throw new EmptyInputError(\n `Received no input writes for ${JSON.stringify(inputKeys, null, 2)}`\n );\n } else {\n // done with input\n this.input = INPUT_DONE;\n }\n }\n if (!this.isNested) {\n this.config = patchConfigurable(this.config, {\n [CONFIG_KEY_RESUMING]: this.isResuming,\n });\n }\n }\n\n protected _emit(values: [StreamMode, unknown][]) {\n for (const [mode, payload] of values) {\n if (this.stream.modes.has(mode)) {\n this.stream.push([this.checkpointNamespace, mode, payload]);\n }\n\n // debug mode is a \"checkpoints\" or \"tasks\" wrapped in an object\n // TODO: consider deprecating this in 1.x\n if (\n (mode === \"checkpoints\" || mode === \"tasks\") &&\n this.stream.modes.has(\"debug\")\n ) {\n const step = mode === \"checkpoints\" ? this.step - 1 : this.step;\n const timestamp = new Date().toISOString();\n const type = (() => {\n if (mode === \"checkpoints\") {\n return \"checkpoint\";\n } else if (\n typeof payload === \"object\" &&\n payload != null &&\n \"result\" in payload\n ) {\n return \"task_result\";\n } else {\n return \"task\";\n }\n })();\n\n this.stream.push([\n this.checkpointNamespace,\n \"debug\",\n { step, type, timestamp, payload },\n ]);\n }\n }\n }\n\n protected _putCheckpoint(\n inputMetadata: Omit<CheckpointMetadata, \"step\" | \"parents\">\n ) {\n const exiting = this.checkpointMetadata === inputMetadata;\n\n const doCheckpoint =\n this.checkpointer != null && (this.durability !== \"exit\" || exiting);\n\n const storeCheckpoint = (checkpoint: Checkpoint) => {\n // store the previous checkpoint config for debug events\n this.prevCheckpointConfig = this.checkpointConfig?.configurable\n ?.checkpoint_id\n ? this.checkpointConfig\n : undefined;\n\n // child graphs keep at most one checkpoint per parent checkpoint\n // this is achieved by writing child checkpoints as progress is made\n // (so that error recovery / resuming from interrupt don't lose work)\n // but doing so always with an id equal to that of the parent checkpoint\n this.checkpointConfig = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]:\n this.config.configurable?.checkpoint_ns ?? \"\",\n });\n\n const channelVersions = { ...this.checkpoint.channel_versions };\n const newVersions = getNewChannelVersions(\n this.checkpointPreviousVersions,\n channelVersions\n );\n this.checkpointPreviousVersions = channelVersions;\n // save it, without blocking\n // if there's a previous checkpoint save in progress, wait for it\n // ensuring checkpointers receive checkpoints in order\n void this._checkpointerPutAfterPrevious({\n config: { ...this.checkpointConfig },\n checkpoint: copyCheckpoint(checkpoint),\n metadata: { ...this.checkpointMetadata },\n newVersions,\n });\n this.checkpointConfig = {\n ...this.checkpointConfig,\n configurable: {\n ...this.checkpointConfig.configurable,\n checkpoint_id: this.checkpoint.id,\n },\n };\n };\n\n if (!exiting) {\n this.checkpointMetadata = {\n ...inputMetadata,\n step: this.step,\n parents: this.config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP] ?? {},\n };\n }\n\n // create new checkpoint\n this.checkpoint = createCheckpoint(\n this.checkpoint,\n doCheckpoint ? this.channels : undefined,\n this.step,\n exiting ? { id: this.checkpoint.id } : undefined\n );\n\n // Bail if no checkpointer\n if (doCheckpoint) storeCheckpoint(this.checkpoint);\n\n if (!exiting) {\n // increment step\n this.step += 1;\n }\n }\n\n protected _flushPendingWrites() {\n if (this.checkpointer == null) return;\n if (this.checkpointPendingWrites.length === 0) return;\n\n // patch config\n const config = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]: this.config.configurable?.checkpoint_ns ?? \"\",\n [CONFIG_KEY_CHECKPOINT_ID]: this.checkpoint.id,\n });\n\n // group writes by task id\n const byTask: Record<string, PendingWrite<string>[]> = {};\n for (const [tid, key, value] of this.checkpointPendingWrites) {\n byTask[tid] ??= [];\n byTask[tid].push([key, value]);\n }\n\n // submit writes to checkpointer\n for (const [tid, ws] of Object.entries(byTask)) {\n this._trackCheckpointerPromise(\n this.checkpointer.putWrites(config, ws, tid)\n );\n }\n }\n\n protected _matchWrites(\n tasks: Record<string, PregelExecutableTask<string, string>>\n ) {\n for (const [tid, k, v] of this.checkpointPendingWrites) {\n if (k === ERROR || k === INTERRUPT || k === RESUME) {\n continue;\n }\n const task = Object.values(tasks).find((t) => t.id === tid);\n if (task) {\n task.writes.push([k, v]);\n }\n }\n for (const task of Object.values(tasks)) {\n if (task.writes.length > 0) {\n this._outputWrites(task.id, task.writes, true);\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -74,9 +74,25 @@ var PregelLoop = class PregelLoop {
74
74
  status = "pending";
75
75
  tasks = {};
76
76
  stream;
77
- checkpointerPromises = [];
77
+ checkpointerPromises = /* @__PURE__ */ new Set();
78
78
  isNested;
79
79
  _checkpointerChainedPromise = Promise.resolve();
80
+ /**
81
+ * Track a checkpointer promise, removing it from the set on success.
82
+ * Failed promises are kept so that Promise.all() in the finally block
83
+ * of _streamIterator can surface the error.
84
+ *
85
+ * @internal
86
+ */
87
+ _trackCheckpointerPromise(promise) {
88
+ const tracked = promise.then((value) => {
89
+ this.checkpointerPromises.delete(tracked);
90
+ return value;
91
+ }, (error) => {
92
+ throw error;
93
+ });
94
+ this.checkpointerPromises.add(tracked);
95
+ }
80
96
  store;
81
97
  cache;
82
98
  manager;
@@ -210,7 +226,7 @@ var PregelLoop = class PregelLoop {
210
226
  this._checkpointerChainedPromise = this._checkpointerChainedPromise.then(() => {
211
227
  return this.checkpointer?.put(input.config, input.checkpoint, input.metadata, input.newVersions);
212
228
  });
213
- this.checkpointerPromises.push(this._checkpointerChainedPromise);
229
+ this._trackCheckpointerPromise(this._checkpointerChainedPromise);
214
230
  }
215
231
  /**
216
232
  * Put writes for a task, to be read by the next tick.
@@ -246,7 +262,7 @@ var PregelLoop = class PregelLoop {
246
262
  [CONFIG_KEY_CHECKPOINT_NS]: this.config.configurable?.checkpoint_ns ?? "",
247
263
  [CONFIG_KEY_CHECKPOINT_ID]: this.checkpoint.id
248
264
  });
249
- if (this.durability !== "exit" && this.checkpointer != null) this.checkpointerPromises.push(this.checkpointer.putWrites(config, writesToSave, taskId));
265
+ if (this.durability !== "exit" && this.checkpointer != null) this._trackCheckpointerPromise(this.checkpointer.putWrites(config, writesToSave, taskId));
250
266
  if (this.tasks) this._outputWrites(taskId, writesCopy);
251
267
  if (!writes.length || !this.cache || !this.tasks) return;
252
268
  const task = this.tasks[taskId];
@@ -542,7 +558,7 @@ var PregelLoop = class PregelLoop {
542
558
  byTask[tid] ??= [];
543
559
  byTask[tid].push([key, value]);
544
560
  }
545
- for (const [tid, ws] of Object.entries(byTask)) this.checkpointerPromises.push(this.checkpointer.putWrites(config, ws, tid));
561
+ for (const [tid, ws] of Object.entries(byTask)) this._trackCheckpointerPromise(this.checkpointer.putWrites(config, ws, tid));
546
562
  }
547
563
  _matchWrites(tasks) {
548
564
  for (const [tid, k, v] of this.checkpointPendingWrites) {