@langchain/langgraph 1.4.21 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/channels/base.cjs +113 -8
- package/dist/channels/base.cjs.map +1 -1
- package/dist/channels/base.d.cts +26 -4
- package/dist/channels/base.d.cts.map +1 -1
- package/dist/channels/base.d.ts +26 -4
- package/dist/channels/base.d.ts.map +1 -1
- package/dist/channels/base.js +110 -10
- package/dist/channels/base.js.map +1 -1
- package/dist/channels/index.cjs +2 -0
- package/dist/channels/index.d.cts +2 -2
- package/dist/channels/index.d.ts +2 -2
- package/dist/channels/index.js +2 -2
- package/dist/constants.cjs +14 -0
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts.map +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +13 -1
- package/dist/constants.js.map +1 -1
- package/dist/graph/index.cjs +1 -1
- package/dist/graph/index.js +1 -1
- package/dist/graph/messages_reducer.cjs +7 -0
- package/dist/graph/messages_reducer.cjs.map +1 -1
- package/dist/graph/messages_reducer.js +7 -1
- package/dist/graph/messages_reducer.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/pregel/algo.cjs +46 -45
- package/dist/pregel/algo.cjs.map +1 -1
- package/dist/pregel/algo.d.cts.map +1 -1
- package/dist/pregel/algo.d.ts.map +1 -1
- package/dist/pregel/algo.js +47 -47
- package/dist/pregel/algo.js.map +1 -1
- package/dist/pregel/checkpoint.cjs +70 -0
- package/dist/pregel/checkpoint.cjs.map +1 -0
- package/dist/pregel/checkpoint.js +67 -0
- package/dist/pregel/checkpoint.js.map +1 -0
- package/dist/pregel/index.cjs +87 -34
- package/dist/pregel/index.cjs.map +1 -1
- package/dist/pregel/index.d.cts.map +1 -1
- package/dist/pregel/index.d.ts.map +1 -1
- package/dist/pregel/index.js +91 -38
- package/dist/pregel/index.js.map +1 -1
- package/dist/pregel/loop.cjs +325 -109
- package/dist/pregel/loop.cjs.map +1 -1
- package/dist/pregel/loop.js +330 -115
- package/dist/pregel/loop.js.map +1 -1
- package/dist/state/prebuilt/messages.cjs +1 -1
- package/dist/state/prebuilt/messages.js +1 -1
- package/dist/web.cjs +1 -1
- package/dist/web.js +1 -1
- package/package.json +5 -5
package/dist/pregel/loop.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop.cjs","names":["BaseMessage","BaseCache","isCommand","increment","createDuplexStream","CONFIG_KEY_STREAM","CONFIG_KEY_SCRATCHPAD","patchConfigurable","CONFIG_KEY_CHECKPOINT_NS","CONFIG_KEY_READ","CONFIG_KEY_CHECKPOINT_MAP","CONFIG_KEY_REPLAY_STATE","CONFIG_KEY_RESUMING","RESUME","isDeltaChannel","isDeltaWritesVersioned","channelsFromCheckpoint","AsyncBatchedStore","WRITES_IDX_MAP","_isSend","sanitizeUntrackedValuesInSend","CONFIG_KEY_CHECKPOINT_ID","INTERRUPT","gatherIteratorSync","prefixGenerator","mapOutputUpdates","mapDebugTaskResults","GraphInterrupt","_applyWrites","_isOverwriteValue","gatherIterator","mapOutputValues","shouldInterrupt","_prepareNextTasks","mapDebugCheckpoint","mapDebugTasks","readChannels","isGraphInterrupt","#interruptStreamNamespace","_prepareSingleTask","PUSH","_prepareNodeErrorHandlerTask","ERROR","isXXH3","CONFIG_KEY_RESUME_MAP","mapCommand","EmptyInputError","NULL_TASK_ID","INPUT","mapInput","ReplayState","getNewChannelVersions","DELTA_WRITES_VERSIONED","deltaChannelsToSnapshot","createCheckpoint","exitDeltaTaskId"],"sources":["../../src/pregel/loop.ts"],"sourcesContent":["import type { RunnableConfig } from \"@langchain/core/runnables\";\nimport type { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport { BaseMessage } from \"@langchain/core/messages\";\nimport { v4 as uuidv4 } from \"@langchain/core/utils/uuid\";\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 channelsFromCheckpoint,\n DELTA_WRITES_VERSIONED,\n deltaChannelsToSnapshot,\n exitDeltaTaskId,\n isDeltaChannel,\n isDeltaWritesVersioned,\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 _isOverwriteValue,\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 ERROR_SOURCE_NODE,\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 CONFIG_KEY_REPLAY_STATE,\n START,\n} from \"../constants.js\";\nimport { ReplayState } from \"./replay.js\";\nimport {\n _applyWrites,\n _prepareNextTasks,\n _prepareNodeErrorHandlerTask,\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 type { RunControl } from \"./runtime.js\";\nimport {\n createDuplexStream,\n IterableReadableWritableStream,\n StreamChunkMeta,\n} from \"./stream.js\";\nimport { isXXH3 } from \"../hash.js\";\nimport type {\n GraphLifecycleEvent,\n GraphLifecycleStatus,\n} from \"../callbacks.js\";\n\nconst INPUT_DONE = Symbol.for(\"INPUT_DONE\");\nconst INPUT_RESUMING = Symbol.for(\"INPUT_RESUMING\");\nconst DEFAULT_LOOP_LIMIT = 25;\n\n/**\n * Recursively assign a stable UUID to any {@link BaseMessage} (in a value, an\n * array, or an object's values) that is missing an `id`. Used so DeltaChannel\n * writes — replayed on every read — reconstruct identical message identities.\n */\nfunction ensureMessageIds(value: unknown): void {\n if (value == null || typeof value !== \"object\") return;\n if (BaseMessage.isInstance(value)) {\n const msg = value as BaseMessage;\n if (msg.id == null) {\n msg.id = uuidv4();\n if (msg.lc_kwargs != null) msg.lc_kwargs.id = msg.id;\n }\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) ensureMessageIds(item);\n return;\n }\n}\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 hasGraphCallbacks?: boolean;\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 resumeAtHead: boolean;\n manager?: CallbackManagerForChainRun;\n hasGraphCallbacks?: boolean;\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 hasPersistedParent?: boolean;\n deltaWritesVersioned?: boolean;\n};\n\n/**\n * Split a serialized checkpoint namespace into its path segments.\n *\n * Checkpoint namespaces are stored as a single string whose nested levels are\n * joined by {@link CHECKPOINT_NAMESPACE_SEPARATOR} (e.g. `\"parent|child\"`).\n * The root namespace — represented as `undefined` or the empty string — maps\n * to an empty array.\n *\n * @param ns - The serialized checkpoint namespace, or `undefined`.\n * @returns The namespace as an array of path segments (`[]` for the root).\n */\nfunction checkpointNamespaceFromNs(ns: string | undefined): string[] {\n if (ns === undefined || ns === \"\") return [];\n return ns.split(CHECKPOINT_NAMESPACE_SEPARATOR);\n}\n\n/**\n * Find the most deeply nested namespace recorded in a checkpoint map.\n *\n * The checkpoint map ({@link CONFIG_KEY_CHECKPOINT_MAP}) associates every\n * namespace seen on a thread with its checkpoint id. Because nested namespaces\n * are built by appending segments to their parent, a deeper namespace always\n * yields a longer key — so the longest non-empty key is the deepest one.\n *\n * Used by the loop's `#interruptStreamNamespace()` during subgraph\n * time-travel: interrupt events must be emitted against the active (deepest)\n * subgraph namespace rather than the root graph.\n *\n * @param map - The checkpoint map (namespace -> checkpoint id), or `undefined`.\n * @returns The deepest namespace as path segments, or `[]` when the map is\n * absent, empty, or only contains the root namespace.\n */\nfunction deepestCheckpointMapNamespace(\n map: Record<string, string> | undefined\n): string[] {\n if (!map) return [];\n let deepest = \"\";\n for (const key of Object.keys(map)) {\n if (key !== \"\" && key.length > deepest.length) {\n deepest = key;\n }\n }\n return checkpointNamespaceFromNs(deepest);\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 /**\n * Exit-mode accumulator of DeltaChannel writes across the whole run, as\n * `[step, taskId, channel, value]`. `undefined` outside \"exit\" durability.\n */\n protected _exitDeltaWrites: [number, string, string, unknown][] | undefined;\n\n /**\n * DeltaChannels that saw an Overwrite since the last checkpoint. These\n * channels are force-snapshotted at the next checkpoint so reconstruction\n * starts from the post-overwrite value and never has to replay across the\n * reset (the live `update` discards every sibling write in the overwriting\n * super-step). Cleared once the channel snapshots.\n */\n protected _deltaChannelsWithOverwrite: Set<string> = new Set();\n\n /** Whether a real checkpoint was loaded from the saver at initialization. */\n protected _hasPersistedParent = false;\n\n /**\n * Whether this branch carries {@link DELTA_WRITES_VERSIONED}: a graph with\n * a DeltaChannel on a new thread, or a loaded checkpoint that has it. Every\n * checkpoint this loop writes inherits it.\n */\n protected _deltaWritesVersioned = false;\n\n /** The checkpointConfig as captured at initialization (anchor for exit writes). */\n protected _initialCheckpointConfig: RunnableConfig | 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: GraphLifecycleStatus = \"pending\";\n\n lifecycleEvents?: GraphLifecycleEvent[];\n\n /**\n * Run-scoped control surface for cooperative draining. Populated from the\n * run config. When `control.drainRequested` is true, the loop stops at the\n * next superstep boundary instead of dispatching more tasks.\n */\n control?: RunControl;\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 /** True when an explicit checkpoint_id targets the latest saved checkpoint. */\n protected resumeAtHead: 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 /**\n * Wait for persistence work scheduled by this run up to this point.\n *\n * Taking a snapshot keeps the barrier scoped to the completed superstep:\n * persistence scheduled later cannot extend it, while failures from the\n * captured work are propagated at the superstep boundary.\n */\n protected async _awaitCheckpointerPromises(): Promise<void> {\n await Promise.all([...this.checkpointerPromises]);\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 get isReplaying(): boolean {\n return !this.skipDoneTasks;\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.resumeAtHead = params.resumeAtHead;\n this.manager = params.manager;\n this.lifecycleEvents = params.hasGraphCallbacks ? [] : undefined;\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 this.control = this.config.control;\n // Exit-mode delta-channel accumulator: in \"exit\" durability, per-step\n // writes are not persisted incrementally, so DeltaChannel writes would be\n // lost. Accumulate them across the run and persist (anchored to a parent\n // or stub) at exit. `undefined` outside exit mode disables capture.\n this._exitDeltaWrites =\n this.durability === \"exit\" && this.checkpointer != null ? [] : undefined;\n this._hasPersistedParent = params.hasPersistedParent ?? false;\n this._deltaWritesVersioned = params.deltaWritesVersioned ?? false;\n this._initialCheckpointConfig = params.checkpointConfig;\n this.checkpointIdSaved = params.checkpoint.id;\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 requestedCheckpointId = config.configurable?.checkpoint_id as\n | string\n | undefined;\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?.checkpoint_id === undefined &&\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 = checkpointNamespaceFromNs(\n config.configurable?.checkpoint_ns\n );\n\n let saved: CheckpointTuple | undefined;\n if (!params.checkpointer) {\n saved = undefined;\n } else if (checkpointConfig.configurable?.[CONFIG_KEY_CHECKPOINT_ID]) {\n saved = await params.checkpointer.getTuple(checkpointConfig);\n } else if (config.configurable?.[CONFIG_KEY_REPLAY_STATE]) {\n const replayState = config.configurable[\n CONFIG_KEY_REPLAY_STATE\n ] as ReplayState;\n saved = await replayState.getCheckpoint(\n config.configurable?.[CONFIG_KEY_CHECKPOINT_NS] ?? \"\",\n params.checkpointer,\n checkpointConfig\n );\n if (config.configurable) {\n delete config.configurable[CONFIG_KEY_RESUMING];\n }\n } else {\n saved = await params.checkpointer.getTuple(checkpointConfig);\n }\n const hasPersistedParent = saved !== undefined;\n if (!saved) {\n saved = {\n config,\n checkpoint: emptyCheckpoint(),\n metadata: { source: \"input\", step: -2, parents: {} },\n pendingWrites: [],\n };\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 let checkpointPendingWrites = saved.pendingWrites ?? [];\n const currentCheckpointNamespace = config.configurable?.checkpoint_ns;\n const checkpointMap = config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP];\n const isDirectSubgraphTimeTravel =\n typeof currentCheckpointNamespace === \"string\" &&\n currentCheckpointNamespace !== \"\" &&\n typeof checkpointMap === \"object\" &&\n checkpointMap !== null &&\n currentCheckpointNamespace in checkpointMap;\n\n if (isDirectSubgraphTimeTravel && checkpointPendingWrites.length > 0) {\n // Direct subgraph time-travel should re-fire interrupts instead of\n // consuming stale resume values that were written during the original run.\n checkpointPendingWrites = checkpointPendingWrites.filter(\n ([, channel]) => channel !== RESUME\n );\n }\n\n let resumeAtHead = false;\n const threadId = checkpointConfig.configurable?.thread_id;\n const checkpointNs = checkpointConfig.configurable?.checkpoint_ns ?? \"\";\n if (\n params.checkpointer &&\n requestedCheckpointId &&\n typeof threadId === \"string\"\n ) {\n const latest = await params.checkpointer.getTuple({\n configurable: { thread_id: threadId, checkpoint_ns: checkpointNs },\n });\n resumeAtHead =\n latest?.config.configurable?.checkpoint_id === requestedCheckpointId &&\n checkpointMetadata.source !== \"update\" &&\n checkpointMetadata.source !== \"fork\";\n }\n\n const deltaWritesVersioned =\n Object.values(params.channelSpecs).some(isDeltaChannel) &&\n (!hasPersistedParent || isDeltaWritesVersioned(saved.metadata));\n const channels = await channelsFromCheckpoint(\n params.channelSpecs,\n checkpoint,\n {\n saver: params.checkpointer,\n config: checkpointConfig,\n deltaWritesVersioned,\n }\n );\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 resumeAtHead,\n manager: params.manager,\n hasGraphCallbacks: params.hasGraphCallbacks,\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 hasPersistedParent,\n deltaWritesVersioned,\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 // Assign stable IDs to any id-less BaseMessages in DeltaChannel writes\n // before they are serialised. DeltaChannel state is reconstructed by\n // replaying these stored writes, so without stable IDs every getState()\n // replay would mint a fresh UUID and dedup/RemoveMessage would break.\n for (const [c, v] of writesToSave) {\n const channel = this.channels[c];\n if (channel != null && isDeltaChannel(channel)) {\n ensureMessageIds(v);\n }\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 - The input keys to use for the tick.\n * @returns True if more iterations are needed, false otherwise.\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 const finishTaskList = Object.values(this.tasks);\n // finish superstep\n const writes = finishTaskList.flatMap((t) => t.writes);\n // All tasks have finished\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n finishTaskList,\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n // Track DeltaChannels that saw an Overwrite this super-step. They must\n // snapshot at the next checkpoint so sparse replay starts from the\n // post-overwrite value (live `update` already discarded the siblings).\n for (const [ch, v] of writes) {\n const channel = this.channels[ch];\n if (\n channel != null &&\n isDeltaChannel(channel) &&\n _isOverwriteValue(v)\n ) {\n this._deltaChannelsWithOverwrite.add(ch);\n }\n }\n // produce values output\n const valuesOutput = await gatherIterator(\n prefixGenerator(\n mapOutputValues(this.outputKeys, writes, this.channels),\n \"values\"\n )\n );\n // capture delta-channel writes for the exit-mode accumulator before\n // clearing (in \"exit\" durability they are not persisted incrementally)\n if (this._exitDeltaWrites !== undefined) {\n for (const [tid, ch, v] of this.checkpointPendingWrites) {\n const channel = this.channels[ch];\n if (channel != null && isDeltaChannel(channel)) {\n this._exitDeltaWrites.push([this.step, tid, ch, v]);\n }\n }\n }\n // clear pending writes\n this.checkpointPendingWrites = [];\n // persist the new checkpoint BEFORE emitting values, so the\n // attached `checkpoint` envelope on the values event points at\n // the fork target that captures this superstep's final state.\n await this._putCheckpoint({ source: \"loop\" });\n if (this.durability === \"sync\") {\n // Task writes are persisted as tasks finish, while the checkpoint is\n // scheduled above. Do not prepare the next superstep until all\n // persistence caused by this completed superstep has settled.\n await this._awaitCheckpointerPromises();\n }\n this._emitValuesWithCheckpointMeta(valuesOutput);\n // after execution, check if we should interrupt\n if (\n shouldInterrupt(this.checkpoint, this.interruptAfter, finishTaskList)\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 let taskList = Object.values(this.tasks);\n\n // Full-state checkpoint snapshots are expensive; skip unless a consumer\n // subscribed to \"checkpoints\" or the legacy \"debug\" wrapper mode.\n if (\n this.checkpointer &&\n (this.stream.modes.has(\"checkpoints\") || this.stream.modes.has(\"debug\"))\n ) {\n this._emit(\n await gatherIterator(\n prefixGenerator(\n mapDebugCheckpoint(\n this.checkpointConfig,\n this.channels,\n this.streamKeys,\n this.checkpointMetadata,\n taskList,\n this.checkpointPendingWrites,\n this.prevCheckpointConfig,\n this.outputKeys\n ),\n \"checkpoints\"\n )\n )\n );\n }\n\n if (taskList.length === 0) {\n this.status = \"done\";\n return false;\n }\n // Cooperative drain: the previous superstep's writes have been applied\n // and checkpointed above, and the next tasks have been prepared. If a\n // drain was requested and tasks remain, stop here (without dispatching\n // them) so the run can be resumed later from the saved checkpoint.\n if (this.control != null && this.control.drainRequested) {\n this.status = \"draining\";\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 (\n k === ERROR ||\n k === ERROR_SOURCE_NODE ||\n k === INTERRUPT ||\n k === RESUME\n ) {\n continue;\n }\n const task = taskList.find((t) => t.id === tid);\n if (task) {\n task.writes.push([k, v]);\n }\n }\n // On resume, re-schedule error handlers for nodes that failed in a prior\n // run (recorded via ERROR_SOURCE_NODE) before they completed handling.\n this._resumeErrorHandlersIfApplicable();\n // Re-scheduling can add handler tasks to `this.tasks`, so refresh the\n // cached task list before emitting writes and the downstream re-tick /\n // interrupt / debug checks see the newly scheduled handlers.\n taskList = Object.values(this.tasks);\n for (const task of taskList) {\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 (taskList.every((task) => task.writes.length > 0)) {\n return this.tick({ inputKeys });\n }\n\n // Before execution, check if we should interrupt\n if (shouldInterrupt(this.checkpoint, this.interruptBefore, taskList)) {\n this.status = \"interrupt_before\";\n throw new GraphInterrupt();\n }\n\n if (this.stream.modes.has(\"tasks\") || this.stream.modes.has(\"debug\")) {\n const debugOutput = await gatherIterator(\n prefixGenerator(mapDebugTasks(taskList), \"tasks\")\n );\n this._emit(debugOutput);\n }\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 await this._putExitDeltaWrites();\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._emitValuesWithCheckpointMeta(\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 (not a state snapshot — no checkpoint envelope)\n if (isGraphInterrupt(error) && !error.interrupts.length) {\n this._emit(\n [\n [\"updates\", { [INTERRUPT]: [] }],\n [\"values\", { [INTERRUPT]: [] }],\n ],\n this.#interruptStreamNamespace()\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 if (this.stream.modes.has(\"tasks\") || this.stream.modes.has(\"debug\")) {\n this._emit(\n gatherIteratorSync(prefixGenerator(mapDebugTasks([pushed]), \"tasks\"))\n );\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 /**\n * Returns the name of the error handler node registered for `nodeName`, or\n * `undefined` if none is configured.\n */\n getErrorHandlerNode(nodeName: string): string | undefined {\n return this.nodes[nodeName]?.errorHandlerNode;\n }\n\n /**\n * Whether `nodeName` is itself an auto-generated error handler node.\n */\n isErrorHandlerNode(nodeName: string): boolean {\n return this.nodes[nodeName]?.isErrorHandler === true;\n }\n\n /**\n * Schedule a node-level error handler task for a task that failed after its\n * retry policy was exhausted. Prepares the handler task (injecting a\n * {@link NodeError}), registers it so the runner executes it within the\n * current step, and returns it (or `undefined` if no handler applies).\n *\n * The failure provenance (`ERROR` + `ERROR_SOURCE_NODE`) is checkpointed by\n * the runner via {@link PregelLoop#putWrites} so handlers observe the same\n * context after a resume.\n */\n scheduleErrorHandler(\n failedTask: PregelExecutableTask<string, string>,\n error: Error\n ): PregelExecutableTask<string, string> | undefined {\n const handlerNode = this.getErrorHandlerNode(String(failedTask.name));\n if (!handlerNode) return undefined;\n\n const handlerTask = _prepareNodeErrorHandlerTask(\n failedTask,\n handlerNode,\n error,\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n failedTask.config ?? this.config,\n {\n step: this.step,\n checkpointer: this.checkpointer,\n manager: this.manager,\n store: this.store,\n stream: this.stream,\n }\n ) as PregelExecutableTask<string, string> | undefined;\n\n if (handlerTask === undefined) return undefined;\n\n this.tasks[handlerTask.id] = handlerTask;\n\n this._emit(\n gatherIteratorSync(prefixGenerator(mapDebugTasks([handlerTask]), \"tasks\"))\n );\n if (this.debug) printStepTasks(this.step, [handlerTask]);\n\n return handlerTask;\n }\n\n /**\n * On resume, re-schedule error handlers for tasks that failed in a prior run\n * but had not finished being handled. Scans pending writes for\n * `ERROR_SOURCE_NODE` markers (paired with `ERROR`), marks the originating\n * task as done (so the runner won't re-run it), and prepares a fresh handler\n * task so the runner picks it up.\n */\n protected _resumeErrorHandlersIfApplicable() {\n // Collect failed task ids with both ERROR_SOURCE_NODE and ERROR writes.\n const failed = new Map<string, Error>();\n for (const [tid, chan] of this.checkpointPendingWrites) {\n if (chan !== ERROR_SOURCE_NODE) continue;\n const errorWrite = this.checkpointPendingWrites.find(\n ([t, c]) => t === tid && c === ERROR\n );\n if (errorWrite === undefined) continue;\n const value = errorWrite[2] as { message?: string; name?: string };\n const error = new Error(value?.message ?? String(value));\n if (value?.name) error.name = value.name;\n failed.set(tid, error);\n }\n\n for (const [tid, error] of failed) {\n const task = this.tasks[tid];\n if (task === undefined) continue;\n const handlerNode = this.getErrorHandlerNode(String(task.name));\n if (!handlerNode) continue;\n // Non-empty writes => runner's `writes.length === 0` filter skips it.\n if (task.writes.length === 0) {\n task.writes.push([ERROR, { message: error.message, name: error.name }]);\n }\n this.scheduleErrorHandler(task, error);\n }\n }\n\n protected _suppressInterrupt(e?: Error): boolean {\n if (!isGraphInterrupt(e) || this.isNested) return false;\n this.lifecycleEvents?.push({\n runId: this.manager?.runId,\n status: this.status,\n checkpointId: this.checkpoint.id,\n checkpointNs: [...this.checkpointNamespace],\n interrupts: [...e.interrupts],\n });\n return true;\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 // 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 inputIsCommand = isCommand(this.input);\n const isCommandUpdateOrGoto = inputIsCommand && nullWrites.length > 0;\n\n const isTimeTraveling =\n this.isReplaying &&\n // Time-travel to a subgraph checkpoint: the parent sets RESUMING=True\n // (it can't distinguish time-travel from resume), so we check if this\n // subgraph's own ns is in checkpoint_map.\n ((this.isNested &&\n configurable?.[CONFIG_KEY_CHECKPOINT_NS] !== undefined &&\n configurable?.[CONFIG_KEY_CHECKPOINT_NS] !== \"\" &&\n configurable?.[CONFIG_KEY_CHECKPOINT_MAP] !== undefined &&\n configurable[CONFIG_KEY_CHECKPOINT_NS] in\n configurable[CONFIG_KEY_CHECKPOINT_MAP]) ||\n !(\n (inputIsCommand && (this.input as Command).resume != null) ||\n configurable?.[CONFIG_KEY_RESUMING] === true ||\n this.resumeAtHead\n ));\n\n if (isTimeTraveling) {\n this.checkpointPendingWrites = this.checkpointPendingWrites.filter(\n (w) => w[1] !== RESUME\n );\n }\n\n // Take the resume value from the parent only after the time-travel filter\n // above, which drops this checkpoint's stale RESUME writes, not this one.\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 const cachedIsResuming = this.isResuming;\n if (cachedIsResuming || isCommandUpdateOrGoto) {\n // One spread (O(N)) instead of O(N²) per-channel spreads. Must be a\n // new object — copyCheckpoint shallow-copies versions_seen.\n const interruptSeen: Record<string, string | number> = {\n ...this.checkpoint.versions_seen[INTERRUPT],\n };\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 interruptSeen[channelName] =\n this.checkpoint.channel_versions[channelName];\n }\n }\n this.checkpoint.versions_seen[INTERRUPT] = interruptSeen;\n\n if (\n isTimeTraveling &&\n this.checkpointMetadata.source !== \"update\" &&\n this.checkpointMetadata.source !== \"fork\"\n ) {\n this.checkpointPendingWrites = this.checkpointPendingWrites.filter(\n (w) => w[1] !== INTERRUPT\n );\n await this._putCheckpoint({ source: \"fork\" });\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 // Preserve the original `isResuming`-first priority: when both\n // `isResuming` and `isCommandUpdateOrGoto` are true (resuming from\n // an interrupt with a Command update/goto), the resume path wins\n // and no new input checkpoint is created here.\n if (cachedIsResuming) {\n this.input = INPUT_RESUMING;\n } else if (isCommandUpdateOrGoto) {\n // Persist the input checkpoint BEFORE emitting values so the\n // attached `checkpoint` envelope points at the just-created\n // fork target. We need a new checkpoint for Command(update=...)\n // or Command(goto=...) in case the result of Command(goto=...)\n // is an interrupt. If not done, the checkpoint containing the\n // interrupt will be lost.\n await this._putCheckpoint({ source: \"input\" });\n this.input = INPUT_DONE;\n }\n // Emit after any checkpoint persistence so the `checkpoint` envelope\n // on the values event points at the fork target for the emitted state.\n this._emitValuesWithCheckpointMeta(valuesOutput);\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 // Input writes go through `_applyWrites` directly (above) — they never\n // enter `checkpointPendingWrites`, so the after-tick capture site does\n // not see them.\n const deltaInput = (inputWrites as PendingWrite[]).filter(([c]) => {\n const channel = this.channels[c];\n return channel != null && isDeltaChannel(channel);\n });\n // An Overwrite supplied as input must also force a snapshot.\n for (const [c, v] of deltaInput) {\n if (_isOverwriteValue(v)) this._deltaChannelsWithOverwrite.add(c);\n }\n if (deltaInput.length > 0) {\n if (this._exitDeltaWrites !== undefined) {\n // Exit mode: capture so the accumulator includes input deltas.\n for (const [c, v] of deltaInput) {\n this._exitDeltaWrites.push([this.step, NULL_TASK_ID, c, v]);\n }\n } else if (this.checkpointer != null) {\n // Non-exit: persist so sub-frequency inputs are recoverable via the\n // ancestor walk (StateGraph routes inputs through a START node whose\n // writes are persisted; this covers raw Pregel delta input channels).\n this.putWrites(NULL_TASK_ID, deltaInput);\n }\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 let replayState: ReplayState | undefined;\n // Only pass ReplayState during time-travel, not when resuming from the\n // current head with an explicit checkpoint_id (see Python _loop._first).\n if (isTimeTraveling) {\n let replayCheckpointId = this.checkpoint.id;\n if (\n (this.checkpointMetadata.source === \"update\" ||\n this.checkpointMetadata.source === \"fork\") &&\n this.prevCheckpointConfig\n ) {\n replayCheckpointId =\n this.prevCheckpointConfig.configurable?.[\n CONFIG_KEY_CHECKPOINT_ID\n ] ?? replayCheckpointId;\n }\n replayState = new ReplayState(replayCheckpointId);\n }\n this.config = patchConfigurable(this.config, {\n [CONFIG_KEY_RESUMING]: this.isResuming,\n [CONFIG_KEY_REPLAY_STATE]: replayState,\n });\n }\n if (cachedIsResuming) {\n this.lifecycleEvents?.push({\n runId: this.manager?.runId,\n status: this.status,\n checkpointId: this.checkpoint.id,\n checkpointNs: [...this.checkpointNamespace],\n });\n }\n }\n\n #interruptStreamNamespace(): string[] {\n const ns = this.checkpointNamespace;\n const isRootNamespace =\n ns.length === 0 || (ns.length === 1 && ns[0] === \"\");\n if (\n !isRootNamespace ||\n this.config.configurable?.[CONFIG_KEY_STREAM] === undefined\n ) {\n return ns;\n }\n const deepest = deepestCheckpointMapNamespace(\n this.config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP] as\n | Record<string, string>\n | undefined\n );\n return deepest.length > 0 ? deepest : ns;\n }\n\n protected _emit(\n values: Array<[StreamMode, unknown]>,\n namespace: string[] = this.checkpointNamespace\n ) {\n for (const [mode, payload] of values) {\n if (this.stream.modes.has(mode)) {\n this.stream.push([namespace, 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 namespace,\n \"debug\",\n { step, type, timestamp, payload },\n ]);\n }\n }\n }\n\n /**\n * Build a {@link StreamChunkMeta} describing the currently active checkpoint.\n * Emitted as a separate ``[namespace, \"checkpoints\", envelope]`` chunk before\n * the paired ``values`` chunk. Returns `undefined` if no checkpoint metadata\n * is available yet.\n */\n protected _currentCheckpointMeta(): StreamChunkMeta | undefined {\n if (!this.checkpointMetadata || !this.checkpoint?.id) return undefined;\n const parent_id = this.prevCheckpointConfig?.configurable?.checkpoint_id as\n | string\n | undefined;\n return {\n checkpoint: {\n id: this.checkpoint.id,\n ...(parent_id ? { parent_id } : {}),\n step: this.checkpointMetadata.step,\n source: this.checkpointMetadata.source,\n },\n };\n }\n\n /**\n * Emit stream entries. When checkpoint meta is available, push a lightweight\n * ``[namespace, \"checkpoints\", envelope]`` chunk before each ``values`` chunk.\n */\n protected _emitValuesWithCheckpointMeta(\n entries: [StreamMode, unknown][]\n ): void {\n const meta = this._currentCheckpointMeta();\n for (const [mode, payload] of entries) {\n if (\n mode === \"values\" &&\n meta?.checkpoint != null &&\n !this.stream.modes.has(\"checkpoints\")\n ) {\n this.stream.push([\n this.checkpointNamespace,\n \"checkpoints\",\n meta.checkpoint,\n ]);\n }\n if (this.stream.modes.has(mode)) {\n this.stream.push([this.checkpointNamespace, mode, payload]);\n }\n }\n }\n\n protected _putCheckpoint(\n inputMetadata: Omit<CheckpointMetadata, \"step\" | \"parents\">\n ) {\n const exiting = this.checkpointMetadata === inputMetadata;\n // Nothing ran since this checkpoint was loaded: putting it again would\n // store it as its own parent.\n if (exiting && this.checkpoint.id === this.checkpointIdSaved) return;\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 // Per-delta-channel counter bookkeeping. Each delta channel tracks a\n // [updates, supersteps] pair: `updates` increments only when the channel\n // is written this step; `supersteps` increments every superstep. The exit\n // call must NOT bump again (the last intermediate call already counted the\n // final superstep) or it would double-count.\n let newCounters: Record<string, [number, number]>;\n if (!exiting) {\n const prevCounters =\n this.checkpointMetadata.counters_since_delta_snapshot ?? {};\n newCounters = {};\n const updated = this.updatedChannels ?? new Set<string>();\n for (const chName in this.channels) {\n if (!Object.prototype.hasOwnProperty.call(this.channels, chName))\n continue;\n if (!isDeltaChannel(this.channels[chName])) continue;\n const [u, s] = prevCounters[chName] ?? [0, 0];\n newCounters[chName] = [updated.has(chName) ? u + 1 : u, s + 1];\n }\n this.checkpointMetadata = {\n ...inputMetadata,\n step: this.step,\n parents: this.config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP] ?? {},\n };\n } else {\n newCounters = {\n ...(this.checkpointMetadata.counters_since_delta_snapshot ?? {}),\n };\n }\n if (this._deltaWritesVersioned) {\n (this.checkpointMetadata as Record<string, unknown>)[\n DELTA_WRITES_VERSIONED\n ] = true;\n }\n\n const channelsToSnapshot = doCheckpoint\n ? deltaChannelsToSnapshot(\n this.channels,\n newCounters,\n this._deltaWritesVersioned\n ? this.checkpoint.channel_versions\n : undefined\n )\n : new Set<string>();\n // Force a snapshot for any delta channel that saw an Overwrite since the\n // last checkpoint, so the post-overwrite value is materialized and sparse\n // replay never has to fold across the reset.\n if (doCheckpoint) {\n for (const ch of this._deltaChannelsWithOverwrite)\n channelsToSnapshot.add(ch);\n }\n\n // create new checkpoint\n this.checkpoint = createCheckpoint(\n this.checkpoint,\n doCheckpoint ? this.channels : undefined,\n this.step,\n {\n id: exiting ? this.checkpoint.id : undefined,\n channelsToSnapshot,\n updatedChannels: this.updatedChannels,\n getNextVersion: doCheckpoint\n ? (current) =>\n this.checkpointerGetNextVersion(current as number | undefined)\n : undefined,\n }\n );\n\n // Reset counters for channels that just snapshotted, and persist the\n // non-zero remainder into metadata (or clear the field entirely).\n for (const k of channelsToSnapshot) {\n newCounters[k] = [0, 0];\n // The overwrite was just materialized into `channel_values`; stop\n // forcing a snapshot for it.\n this._deltaChannelsWithOverwrite.delete(k);\n }\n const nonZero: Record<string, [number, number]> = {};\n for (const k in newCounters) {\n if (!Object.prototype.hasOwnProperty.call(newCounters, k)) continue;\n const [u, s] = newCounters[k];\n if (u !== 0 || s !== 0) nonZero[k] = [u, s];\n }\n if (Object.keys(nonZero).length > 0) {\n this.checkpointMetadata.counters_since_delta_snapshot = nonZero;\n } else {\n delete this.checkpointMetadata.counters_since_delta_snapshot;\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 /**\n * Stage the exit-mode accumulator of DeltaChannel writes so the final\n * checkpoint can be reconstructed. In \"exit\" durability per-step writes are\n * not persisted, so delta writes are accumulated across the run and anchored\n * here — under the saved parent, or a freshly-created stub when this is a\n * first run with no persisted parent. Channels that will snapshot in the\n * final checkpoint are excluded (their full value lives in `channel_values`).\n *\n * Must run BEFORE the final `_putCheckpoint` so the stub branch can adjust\n * `checkpointConfig` to anchor the final checkpoint on the stub.\n */\n protected async _putExitDeltaWrites(): Promise<void> {\n if (\n this._exitDeltaWrites === undefined ||\n this._exitDeltaWrites.length === 0 ||\n this.checkpointer == null ||\n this._initialCheckpointConfig === undefined\n ) {\n return;\n }\n\n const counters =\n this.checkpointMetadata.counters_since_delta_snapshot ?? {};\n const channelsToSnapshot = deltaChannelsToSnapshot(\n this.channels,\n counters,\n this._deltaWritesVersioned ? this.checkpoint.channel_versions : undefined\n );\n // Channels that saw an Overwrite are force-snapshotted by the final\n // `_putCheckpoint` (which runs after this), so their accumulated exit\n // writes must NOT also be replayed on top of that snapshot — exclude them.\n for (const ch of this._deltaChannelsWithOverwrite)\n channelsToSnapshot.add(ch);\n\n const pending = this._exitDeltaWrites.filter(\n ([, , ch]) => !channelsToSnapshot.has(ch)\n );\n if (pending.length === 0) return;\n\n let anchorConfig: RunnableConfig;\n if (this._hasPersistedParent) {\n // _initialCheckpointConfig points at the saved parent checkpoint.\n anchorConfig = this._initialCheckpointConfig;\n } else {\n // No persisted parent: create a stub empty checkpoint (no parent) and\n // anchor on it, then point the final checkpoint at the stub.\n const stubCp = emptyCheckpoint();\n stubCp.id = this.checkpointIdSaved ?? stubCp.id;\n stubCp.ts = new Date().toISOString();\n const stubPutConfig = patchConfigurable(this._initialCheckpointConfig, {\n [CONFIG_KEY_CHECKPOINT_ID]: undefined,\n });\n anchorConfig = patchConfigurable(this._initialCheckpointConfig, {\n [CONFIG_KEY_CHECKPOINT_ID]: stubCp.id,\n });\n this._trackCheckpointerPromise(\n this.checkpointer.put(\n stubPutConfig,\n stubCp,\n { source: \"loop\", step: -2, parents: {} },\n {}\n )\n );\n this.checkpointConfig = anchorConfig;\n }\n\n const anchorWriteConfig = patchConfigurable(anchorConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]: this.config.configurable?.checkpoint_ns ?? \"\",\n [CONFIG_KEY_CHECKPOINT_ID]:\n anchorConfig.configurable?.[CONFIG_KEY_CHECKPOINT_ID],\n });\n\n // Group by [step, taskId]; a step-prefixed synthetic task id preserves\n // chronological super-step order under the saver's (task_id, idx) sort.\n const grouped = new Map<string, PendingWrite<string>[]>();\n const order: { key: string; step: number; tid: string }[] = [];\n for (const [step, tid, ch, v] of pending) {\n const key = `${step}\\u0000${tid}`;\n let group = grouped.get(key);\n if (group === undefined) {\n group = [];\n grouped.set(key, group);\n order.push({ key, step, tid });\n }\n group.push([ch, v]);\n }\n for (const { key, step, tid } of order) {\n const synthTid = exitDeltaTaskId(step, tid);\n this._trackCheckpointerPromise(\n this.checkpointer.putWrites(\n anchorWriteConfig,\n grouped.get(key)!,\n synthTid\n )\n );\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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"}
|
|
1
|
+
{"version":3,"file":"loop.cjs","names":["isDeltaChannel","isMessagesDeltaReducer","_getOverwriteValue","Overwrite","BaseMessage","BaseCache","isCommand","increment","createDuplexStream","CONFIG_KEY_STREAM","CONFIG_KEY_SCRATCHPAD","patchConfigurable","CONFIG_KEY_CHECKPOINT_NS","CONFIG_KEY_READ","CONFIG_KEY_CHECKPOINT_MAP","CONFIG_KEY_REPLAY_STATE","CONFIG_KEY_RESUMING","RESUME","checkpointSuperseded","isDeltaWritesVersioned","channelsFromCheckpoint","AsyncBatchedStore","WRITES_IDX_MAP","_isSend","sanitizeUntrackedValuesInSend","CONFIG_KEY_CHECKPOINT_ID","taskPathStr","INTERRUPT","gatherIteratorSync","prefixGenerator","mapOutputUpdates","mapDebugTaskResults","GraphInterrupt","_applyWrites","deltaChannelWrites","_isOverwriteValue","deltaChannelsWithPendingWrites","gatherIterator","mapOutputValues","NULL_TASK_ID","shouldInterrupt","_prepareNextTasks","mapDebugCheckpoint","mapDebugTasks","readChannels","isGraphInterrupt","#interruptStreamNamespace","_prepareSingleTask","PUSH","_prepareNodeErrorHandlerTask","ERROR","isXXH3","CONFIG_KEY_RESUME_MAP","mapCommand","EmptyInputError","INPUT","mapInput","ReplayState","getNewChannelVersions","advanceDeltaCounters","DELTA_WRITES_VERSIONED","deltaChannelsToSnapshot","createCheckpoint","exitDeltaTaskId","exitDeltaLateTaskId"],"sources":["../../src/pregel/loop.ts"],"sourcesContent":["import type { RunnableConfig } from \"@langchain/core/runnables\";\nimport type { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport {\n BaseMessage,\n type BaseMessageLike,\n coerceMessageLikeToMessage,\n} from \"@langchain/core/messages\";\nimport { v4 as uuidv4 } from \"@langchain/core/utils/uuid\";\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 uuid5,\n} from \"@langchain/langgraph-checkpoint\";\n\nimport {\n BaseChannel,\n createCheckpoint,\n channelsFromCheckpoint,\n DELTA_WRITES_VERSIONED,\n deltaChannelsToSnapshot,\n deltaChannelWrites,\n deltaChannelsWithPendingWrites,\n exitDeltaLateTaskId,\n exitDeltaTaskId,\n isDeltaChannel,\n isDeltaWritesVersioned,\n} from \"../channels/base.js\";\nimport type { DeltaChannel } from \"../channels/delta.js\";\nimport { isMessagesDeltaReducer } from \"../graph/messages_reducer.js\";\nimport { advanceDeltaCounters, checkpointSuperseded } from \"./checkpoint.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 _getOverwriteValue,\n _isOverwriteValue,\n Overwrite,\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 ERROR_SOURCE_NODE,\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 CONFIG_KEY_REPLAY_STATE,\n START,\n} from \"../constants.js\";\nimport { ReplayState } from \"./replay.js\";\nimport {\n _applyWrites,\n _prepareNextTasks,\n _prepareNodeErrorHandlerTask,\n _prepareSingleTask,\n increment,\n shouldInterrupt,\n sanitizeUntrackedValuesInSend,\n taskPathStr,\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 type { RunControl } from \"./runtime.js\";\nimport {\n createDuplexStream,\n IterableReadableWritableStream,\n StreamChunkMeta,\n} from \"./stream.js\";\nimport { isXXH3 } from \"../hash.js\";\nimport type {\n GraphLifecycleEvent,\n GraphLifecycleStatus,\n} from \"../callbacks.js\";\n\nconst INPUT_DONE = Symbol.for(\"INPUT_DONE\");\nconst INPUT_RESUMING = Symbol.for(\"INPUT_RESUMING\");\nconst DEFAULT_LOOP_LIMIT = 25;\n\n/**\n * Give the messages written to DeltaChannels stable ids, and return the writes\n * in `writes` that go to a DeltaChannel.\n *\n * A DeltaChannel replays its saved writes on every read, and its reducer may\n * not assign missing ids (`messagesDeltaReducer` doesn't), so a message saved\n * without an id comes back without one, or with a new one on every read, and\n * nothing can target it by id, for example `RemoveMessage`.\n *\n * In a channel whose reducer is {@link messagesDeltaReducer}, every\n * message-like it accepts (a message, a plain object, a string, a\n * `[role, content]` pair; alone, in an array or in an `Overwrite`) gets an id.\n * A plain message object stays plain, with the id on a copy, except in an\n * `Overwrite`, whose value the channel keeps as it is, so there it becomes a\n * message. Other DeltaChannels may hold other data, so there only message\n * objects get ids. Anything that can't become a message is left as it is, so\n * it fails where it always has, when the reducer reads it.\n *\n * A write that changes is replaced in `writes` by a new `[channel, value]`\n * pair: arrays and pairs the caller passed in are never changed, only the ids\n * of message objects.\n */\nexport function ensureDeltaMessageIds<W extends [PropertyKey, unknown]>(\n channels: Record<string, BaseChannel>,\n writes: W[]\n): W[] {\n const deltaWrites: W[] = [];\n for (let i = 0; i < writes.length; i += 1) {\n const [channelName, value] = writes[i];\n const channel = channels[String(channelName)];\n if (!isDeltaChannel(channel)) continue;\n if (isMessagesDeltaReducer((channel as DeltaChannel<unknown>).reducer)) {\n const newValue = withMessageIds(value);\n if (newValue !== value) writes[i] = [channelName, newValue] as W;\n } else {\n stampMessageIds(value);\n }\n deltaWrites.push(writes[i]);\n }\n return deltaWrites;\n}\n\nfunction withMessageIds(value: unknown): unknown {\n const [isOverwrite, overwriteValue] = _getOverwriteValue<unknown>(value);\n if (!isOverwrite) {\n return Array.isArray(value)\n ? mapItems(value, writtenMessageWithId)\n : writtenMessageWithId(value);\n }\n if (!Array.isArray(overwriteValue)) return value;\n const items = mapItems(overwriteValue, messageWithId);\n return items === overwriteValue ? value : new Overwrite(items);\n}\n\nfunction mapItems(items: unknown[], fn: (item: unknown) => unknown): unknown[] {\n const mapped = items.map(fn);\n return mapped.every((item, i) => item === items[i]) ? items : mapped;\n}\n\nfunction writtenMessageWithId(item: unknown): unknown {\n if (!isPlainObject(item)) return messageWithId(item);\n // A plain message object stays plain: it's smaller to save and faster to\n // replay, and the reducer makes the same message from it.\n try {\n if (coerceMessageLikeToMessage(item as BaseMessageLike).id) return item;\n } catch {\n return item;\n }\n return { ...item, id: uuidv4() };\n}\n\nfunction messageWithId(item: unknown): unknown {\n if (BaseMessage.isInstance(item)) {\n stampMessageIds(item);\n return item;\n }\n let message: BaseMessage;\n try {\n message = coerceMessageLikeToMessage(item as BaseMessageLike);\n } catch {\n return item;\n }\n if (!message.id) setMessageId(message);\n return message;\n}\n\nfunction isPlainObject(item: unknown): item is Record<string, unknown> {\n if (typeof item !== \"object\" || item === null) return false;\n const proto = Object.getPrototypeOf(item);\n return (proto === Object.prototype || proto === null) && !(\"lc\" in item);\n}\n\nfunction stampMessageIds(value: unknown): void {\n if (BaseMessage.isInstance(value)) {\n if (value.id == null) setMessageId(value);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) stampMessageIds(item);\n return;\n }\n const [isOverwrite, overwriteValue] = _getOverwriteValue<unknown>(value);\n if (isOverwrite) stampMessageIds(overwriteValue);\n}\n\nfunction setMessageId(message: BaseMessage): void {\n message.id = uuidv4();\n if (message.lc_kwargs != null) message.lc_kwargs.id = message.id;\n}\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 hasGraphCallbacks?: boolean;\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 resumeAtHead: boolean;\n addressedCheckpointSuperseded: boolean;\n manager?: CallbackManagerForChainRun;\n hasGraphCallbacks?: boolean;\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 hasPersistedParent?: boolean;\n loadedLatest?: boolean;\n deltaWritesVersioned?: boolean;\n};\n\n/**\n * Split a serialized checkpoint namespace into its path segments.\n *\n * Checkpoint namespaces are stored as a single string whose nested levels are\n * joined by {@link CHECKPOINT_NAMESPACE_SEPARATOR} (e.g. `\"parent|child\"`).\n * The root namespace — represented as `undefined` or the empty string — maps\n * to an empty array.\n *\n * @param ns - The serialized checkpoint namespace, or `undefined`.\n * @returns The namespace as an array of path segments (`[]` for the root).\n */\nfunction checkpointNamespaceFromNs(ns: string | undefined): string[] {\n if (ns === undefined || ns === \"\") return [];\n return ns.split(CHECKPOINT_NAMESPACE_SEPARATOR);\n}\n\n/**\n * Find the most deeply nested namespace recorded in a checkpoint map.\n *\n * The checkpoint map ({@link CONFIG_KEY_CHECKPOINT_MAP}) associates every\n * namespace seen on a thread with its checkpoint id. Because nested namespaces\n * are built by appending segments to their parent, a deeper namespace always\n * yields a longer key — so the longest non-empty key is the deepest one.\n *\n * Used by the loop's `#interruptStreamNamespace()` during subgraph\n * time-travel: interrupt events must be emitted against the active (deepest)\n * subgraph namespace rather than the root graph.\n *\n * @param map - The checkpoint map (namespace -> checkpoint id), or `undefined`.\n * @returns The deepest namespace as path segments, or `[]` when the map is\n * absent, empty, or only contains the root namespace.\n */\nfunction deepestCheckpointMapNamespace(\n map: Record<string, string> | undefined\n): string[] {\n if (!map) return [];\n let deepest = \"\";\n for (const key of Object.keys(map)) {\n if (key !== \"\" && key.length > deepest.length) {\n deepest = key;\n }\n }\n return checkpointNamespaceFromNs(deepest);\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 /**\n * Exit-mode accumulator of DeltaChannel writes across the whole run, as\n * `[step, taskId, taskPath, channel, value]` — see `_putExitDeltaWrites`\n * for how they are ordered. `undefined` outside \"exit\" durability.\n */\n protected _exitDeltaWrites:\n | [number, string, string, string, unknown][]\n | undefined;\n\n /**\n * The `(taskId, channel)` pairs whose delta writes are stored on the loaded\n * checkpoint, which a resume addressed by `checkpoint_id` can rerun.\n * Captured in the constructor, before this run's Command processing adds\n * writes (mirrors Python's `_first`). Used by the exit-mode accumulator to\n * skip the loaded writes on the first superstep — they are already stored\n * on the checkpoint.\n */\n protected _storedDeltaWrites: Set<string> = new Set();\n\n /**\n * This run's `Command` delta writes (`NULL_TASK_ID`), kept apart from the\n * `NULL_TASK_ID` writes loaded with the checkpoint, which the first\n * superstep skips. Written by the input handler; replayed into the\n * exit-mode accumulator at the first superstep.\n */\n protected _exitCommandWrites: [string, unknown][] = [];\n\n /**\n * The step of the first superstep this run completed (the loaded\n * checkpoint's own), or `null` before it ticks. The exit-mode accumulator\n * keeps that superstep's real task paths so its writes interleave with the\n * loaded ones as live execution did; later supersteps get `~~`-prefixed\n * synthetic paths (see `_putExitDeltaWrites`).\n */\n protected _exitFirstStep: number | null = null;\n\n /**\n * DeltaChannels that must snapshot at the next checkpoint, whatever their\n * cadence counters say:\n * - an Overwrite arrived since the last checkpoint, so sparse replay has to\n * start from the post-overwrite value;\n * - the checkpoint this run starts from has pending writes to them; see\n * {@link deltaChannelsWithPendingWrites}.\n * Cleared once the channel snapshots.\n */\n protected _deltaChannelsForcedSnapshot: Set<string> = new Set();\n\n /**\n * Set by `_first` for a resume: the writes it loaded with the checkpoint,\n * which the end of the superstep checks against the ones handed back to\n * their tasks.\n */\n protected _resumeLoadedWrites: CheckpointPendingWrite[] = [];\n\n /** Tasks a resume handed loaded writes back to. */\n protected _reappliedTaskIds: Set<string> = new Set();\n\n /**\n * An update or fork checkpoint addressed by `checkpoint_id` that the thread\n * has moved past, so it may already have children.\n */\n protected addressedCheckpointSuperseded: boolean;\n\n /** Whether a real checkpoint was loaded from the saver at initialization. */\n protected _hasPersistedParent = false;\n\n /**\n * Whether initialization loaded the thread's latest checkpoint, not one a\n * `checkpoint_id` addressed, so nothing has been built on it yet.\n */\n protected _loadedLatest = false;\n\n /**\n * Whether this branch carries {@link DELTA_WRITES_VERSIONED}: a graph with\n * a DeltaChannel on a new thread, or a loaded checkpoint that has it. Every\n * checkpoint this loop writes inherits it.\n */\n protected _deltaWritesVersioned = false;\n\n /** The checkpointConfig as captured at initialization (anchor for exit writes). */\n protected _initialCheckpointConfig: RunnableConfig | 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: GraphLifecycleStatus = \"pending\";\n\n lifecycleEvents?: GraphLifecycleEvent[];\n\n /**\n * Run-scoped control surface for cooperative draining. Populated from the\n * run config. When `control.drainRequested` is true, the loop stops at the\n * next superstep boundary instead of dispatching more tasks.\n */\n control?: RunControl;\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 /** True when an explicit checkpoint_id targets the latest saved checkpoint. */\n protected resumeAtHead: boolean;\n\n protected _checkpointerChainedPromise: Promise<unknown> = Promise.resolve();\n\n /**\n * The DeltaChannel writes this loop sent to the saver since the last\n * checkpoint save was scheduled. That save waits for them, and a rejection\n * skips it and every later save: a DeltaChannel is rebuilt from its writes\n * along the parent chain, so a checkpoint saved past a missing write or\n * parent reads back short for good.\n */\n protected _pendingDeltaWrites: Promise<unknown>[] = [];\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 // Nothing awaits the tracked promise until a barrier awaits the set, so a\n // write that rejects before then would be reported by the runtime as an\n // unhandled rejection. Mark it handled here; the barrier's Promise.all()\n // still receives the rejection.\n tracked.catch(() => {});\n this.checkpointerPromises.add(tracked);\n }\n\n /**\n * Wait for persistence work scheduled by this run up to this point.\n *\n * Taking a snapshot keeps the barrier scoped to the completed superstep:\n * persistence scheduled later cannot extend it, while failures from the\n * captured work are propagated at the superstep boundary.\n */\n protected async _awaitCheckpointerPromises(): Promise<void> {\n await Promise.all([...this.checkpointerPromises]);\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 get isReplaying(): boolean {\n return !this.skipDoneTasks;\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 // Capture before this run's Command processing adds writes: these are the\n // delta writes already stored on the loaded checkpoint. RESUME writes are\n // never delta-channel writes, so the time-travel filter that drops them\n // below does not affect this set.\n for (const [tid, ch] of this.checkpointPendingWrites) {\n if (\n tid !== NULL_TASK_ID &&\n isDeltaChannel(this.channels[ch] as BaseChannel)\n ) {\n this._storedDeltaWrites.add(`${tid}\\u0000${ch}`);\n }\n }\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.resumeAtHead = params.resumeAtHead;\n this.addressedCheckpointSuperseded = params.addressedCheckpointSuperseded;\n this.manager = params.manager;\n this.lifecycleEvents = params.hasGraphCallbacks ? [] : undefined;\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 this.control = this.config.control;\n // Exit-mode delta-channel accumulator: in \"exit\" durability, per-step\n // writes are not persisted incrementally, so DeltaChannel writes would be\n // lost. Accumulate them across the run and persist (anchored to a parent\n // or stub) at exit. `undefined` outside exit mode disables capture.\n this._exitDeltaWrites =\n this.durability === \"exit\" && this.checkpointer != null ? [] : undefined;\n this._hasPersistedParent = params.hasPersistedParent ?? false;\n this._loadedLatest = params.loadedLatest ?? false;\n this._deltaWritesVersioned = params.deltaWritesVersioned ?? false;\n this._initialCheckpointConfig = params.checkpointConfig;\n this.checkpointIdSaved = params.checkpoint.id;\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?.checkpoint_id === undefined &&\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 = checkpointNamespaceFromNs(\n config.configurable?.checkpoint_ns\n );\n\n let saved: CheckpointTuple | undefined;\n let loadedLatest = false;\n if (!params.checkpointer) {\n saved = undefined;\n } else if (checkpointConfig.configurable?.[CONFIG_KEY_CHECKPOINT_ID]) {\n saved = await params.checkpointer.getTuple(checkpointConfig);\n } else if (config.configurable?.[CONFIG_KEY_REPLAY_STATE]) {\n const replayState = config.configurable[\n CONFIG_KEY_REPLAY_STATE\n ] as ReplayState;\n saved = await replayState.getCheckpoint(\n config.configurable?.[CONFIG_KEY_CHECKPOINT_NS] ?? \"\",\n params.checkpointer,\n checkpointConfig\n );\n if (config.configurable) {\n delete config.configurable[CONFIG_KEY_RESUMING];\n }\n } else {\n saved = await params.checkpointer.getTuple(checkpointConfig);\n loadedLatest = true;\n }\n const hasPersistedParent = saved !== undefined;\n const addressedConfig = checkpointConfig;\n if (!saved) {\n saved = {\n config,\n checkpoint: emptyCheckpoint(),\n metadata: { source: \"input\", step: -2, parents: {} },\n pendingWrites: [],\n };\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 let checkpointPendingWrites = saved.pendingWrites ?? [];\n const currentCheckpointNamespace = config.configurable?.checkpoint_ns;\n const checkpointMap = config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP];\n const isDirectSubgraphTimeTravel =\n typeof currentCheckpointNamespace === \"string\" &&\n currentCheckpointNamespace !== \"\" &&\n typeof checkpointMap === \"object\" &&\n checkpointMap !== null &&\n currentCheckpointNamespace in checkpointMap;\n\n if (isDirectSubgraphTimeTravel && checkpointPendingWrites.length > 0) {\n // Direct subgraph time-travel should re-fire interrupts instead of\n // consuming stale resume values that were written during the original run.\n checkpointPendingWrites = checkpointPendingWrites.filter(\n ([, channel]) => channel !== RESUME\n );\n }\n\n let resumeAtHead = false;\n let addressedCheckpointSuperseded = false;\n // The id the checkpoint was loaded by, which a subgraph replayed through\n // `checkpoint_map` only gets from the map.\n if (params.checkpointer && hasPersistedParent) {\n const superseded = await checkpointSuperseded(\n params.checkpointer,\n addressedConfig,\n saved\n );\n const isUpdateOrFork =\n checkpointMetadata.source === \"update\" ||\n checkpointMetadata.source === \"fork\";\n resumeAtHead =\n addressedConfig.configurable?.checkpoint_id !== undefined &&\n !superseded &&\n !isUpdateOrFork;\n addressedCheckpointSuperseded = superseded && isUpdateOrFork;\n }\n\n const deltaWritesVersioned =\n Object.values(params.channelSpecs).some(isDeltaChannel) &&\n (!hasPersistedParent || isDeltaWritesVersioned(saved.metadata));\n const channels = await channelsFromCheckpoint(\n params.channelSpecs,\n checkpoint,\n {\n saver: params.checkpointer,\n config: checkpointConfig,\n deltaWritesVersioned,\n }\n );\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 resumeAtHead,\n addressedCheckpointSuperseded,\n manager: params.manager,\n hasGraphCallbacks: params.hasGraphCallbacks,\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 hasPersistedParent,\n loadedLatest,\n deltaWritesVersioned,\n });\n }\n\n protected _checkpointerPutAfterPrevious(input: {\n config: RunnableConfig;\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n newVersions: Record<string, string | number>;\n }) {\n const pendingDeltaWrites = this._pendingDeltaWrites;\n this._pendingDeltaWrites = [];\n this._checkpointerChainedPromise = this._checkpointerChainedPromise\n .then(() => Promise.all(pendingDeltaWrites))\n .then(() => {\n return this.checkpointer?.put(\n input.config,\n input.checkpoint,\n input.metadata,\n input.newVersions\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 * @param cached The writes were served from the node cache: stream them as\n * cached and don't write them to the cache again.\n */\n putWrites(taskId: string, writes: PendingWrite<string>[], cached = false) {\n let writesCopy = writes;\n if (writesCopy.length === 0) return;\n // Before the writes are saved, kept in `checkpointPendingWrites` or\n // applied, so all of them hold the same message ids.\n const deltaWrites = ensureDeltaMessageIds(this.channels, writes);\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 const task = this.tasks[taskId];\n // Use sanitized writes for checkpointer; the task's serialized path\n // orders its writes on replay (`writesSortKey`), `\"\"` when the task\n // is unknown (e.g. `NULL_TASK_ID`), matching Python's\n // `task_path_str(task.path) if task else \"\"`.\n const saved = this.checkpointer.putWrites(\n config,\n writesToSave,\n taskId,\n task != null ? taskPathStr(task.path) : \"\"\n );\n this._trackCheckpointerPromise(saved);\n if (deltaWrites.length > 0) this._pendingDeltaWrites.push(saved);\n }\n\n if (this.tasks) {\n this._outputWrites(taskId, writesCopy, cached);\n }\n\n if (cached || !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 /** Streams the writes reapplied to tasks that finished in a previous run. */\n protected _outputCachedWrites(tasks: PregelExecutableTask<any, any>[]) {\n for (const task of tasks) {\n if (task.writes.length > 0) {\n this._outputWrites(task.id, task.writes, true);\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 - The input keys to use for the tick.\n * @returns True if more iterations are needed, false otherwise.\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 const finishTaskList = Object.values(this.tasks);\n // finish superstep\n const writes = finishTaskList.flatMap((t) => t.writes);\n // All tasks have finished\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n finishTaskList,\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n // Track DeltaChannels that saw an Overwrite this super-step. They must\n // snapshot at the next checkpoint so sparse replay starts from the\n // post-overwrite value (live `update` already discarded the siblings).\n for (const [ch, v] of deltaChannelWrites(this.channels, writes)) {\n if (_isOverwriteValue(v)) this._deltaChannelsForcedSnapshot.add(ch);\n }\n if (this._resumeLoadedWrites.length > 0) {\n // A loaded write the resume didn't hand back belongs to a task this\n // run drops or reruns: a `Send` that `Command({ goto })` replaced, or\n // an error handler that runs again.\n for (const ch of deltaChannelsWithPendingWrites(\n this.channels,\n this._resumeLoadedWrites.filter(\n ([tid]) => !this._reappliedTaskIds.has(tid)\n )\n )) {\n this._deltaChannelsForcedSnapshot.add(ch);\n }\n this._resumeLoadedWrites = [];\n }\n // produce values output\n const valuesOutput = await gatherIterator(\n prefixGenerator(\n mapOutputValues(this.outputKeys, writes, this.channels),\n \"values\"\n )\n );\n // capture delta-channel writes for the exit-mode accumulator before\n // clearing (in \"exit\" durability they are not persisted incrementally)\n if (this._exitDeltaWrites !== undefined) {\n // On the first superstep the pending writes still hold the ones\n // loaded with the checkpoint, which are already stored on it.\n const first = this._exitFirstStep === null;\n if (first) {\n this._exitFirstStep = this.step;\n for (const [ch, v] of this._exitCommandWrites) {\n this._exitDeltaWrites.push([this.step, NULL_TASK_ID, \"\", ch, v]);\n }\n }\n for (const [tid, ch, v] of this.checkpointPendingWrites) {\n const channel = this.channels[ch];\n if (channel == null || !isDeltaChannel(channel)) continue;\n if (\n first &&\n (tid === NULL_TASK_ID ||\n this._storedDeltaWrites.has(`${tid}\\u0000${ch}`))\n ) {\n continue;\n }\n const task = this.tasks[tid];\n this._exitDeltaWrites.push([\n this.step,\n tid,\n task != null ? taskPathStr(task.path) : \"\",\n ch,\n v,\n ]);\n }\n }\n // clear pending writes\n this.checkpointPendingWrites = [];\n // persist the new checkpoint BEFORE emitting values, so the\n // attached `checkpoint` envelope on the values event points at\n // the fork target that captures this superstep's final state.\n await this._putCheckpoint({ source: \"loop\" });\n if (this.durability === \"sync\") {\n // Task writes are persisted as tasks finish, while the checkpoint is\n // scheduled above. Do not prepare the next superstep until all\n // persistence caused by this completed superstep has settled.\n await this._awaitCheckpointerPromises();\n }\n this._emitValuesWithCheckpointMeta(valuesOutput);\n // after execution, check if we should interrupt\n if (\n shouldInterrupt(this.checkpoint, this.interruptAfter, finishTaskList)\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 let taskList = Object.values(this.tasks);\n\n // Full-state checkpoint snapshots are expensive; skip unless a consumer\n // subscribed to \"checkpoints\" or the legacy \"debug\" wrapper mode.\n if (\n this.checkpointer &&\n (this.stream.modes.has(\"checkpoints\") || this.stream.modes.has(\"debug\"))\n ) {\n this._emit(\n await gatherIterator(\n prefixGenerator(\n mapDebugCheckpoint(\n this.checkpointConfig,\n this.channels,\n this.streamKeys,\n this.checkpointMetadata,\n taskList,\n this.checkpointPendingWrites,\n this.prevCheckpointConfig,\n this.outputKeys\n ),\n \"checkpoints\"\n )\n )\n );\n }\n\n if (taskList.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 this._reapplyWritesToSucceededNodes(this.tasks);\n // On resume, re-schedule error handlers for nodes that failed in a prior\n // run (recorded via ERROR_SOURCE_NODE) before they completed handling.\n this._resumeErrorHandlersIfApplicable();\n // Re-scheduling can add handler tasks to `this.tasks`, so refresh the\n // cached task list before emitting writes and the downstream re-tick /\n // interrupt / debug checks see the newly scheduled handlers.\n taskList = Object.values(this.tasks);\n }\n // if all tasks have finished, re-tick\n if (taskList.every((task) => task.writes.length > 0)) {\n this._outputCachedWrites(taskList);\n return this.tick({ inputKeys });\n }\n\n // Before execution, check if we should interrupt\n if (shouldInterrupt(this.checkpoint, this.interruptBefore, taskList)) {\n this.status = \"interrupt_before\";\n throw new GraphInterrupt();\n }\n\n // Cooperative drain: the previous superstep's writes have been applied\n // and checkpointed above, and the next tasks have been prepared. If a\n // drain was requested and tasks remain, stop here (without dispatching\n // them) so the run can be resumed later from the saved checkpoint. This\n // comes after the breakpoint check: a resume passes the next step's\n // breakpoints, so draining in front of one would skip it.\n if (this.control != null && this.control.drainRequested) {\n this.status = \"draining\";\n return false;\n }\n\n // Stream the reapplied writes only after the breakpoint and drain checks:\n // a run that stops at either would stream them again when it resumes.\n this._outputCachedWrites(taskList);\n\n if (this.stream.modes.has(\"tasks\") || this.stream.modes.has(\"debug\")) {\n const debugOutput = await gatherIterator(\n prefixGenerator(mapDebugTasks(taskList), \"tasks\")\n );\n this._emit(debugOutput);\n }\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 await this._putExitDeltaWrites();\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._emitValuesWithCheckpointMeta(\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 (not a state snapshot — no checkpoint envelope)\n if (isGraphInterrupt(error) && !error.interrupts.length) {\n this._emit(\n [\n [\"updates\", { [INTERRUPT]: [] }],\n [\"values\", { [INTERRUPT]: [] }],\n ],\n this.#interruptStreamNamespace()\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 if (this.stream.modes.has(\"tasks\") || this.stream.modes.has(\"debug\")) {\n this._emit(\n gatherIteratorSync(prefixGenerator(mapDebugTasks([pushed]), \"tasks\"))\n );\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.putWrites(task.id, task.writes, true);\n }\n\n return pushed;\n }\n\n /**\n * Returns the name of the error handler node registered for `nodeName`, or\n * `undefined` if none is configured.\n */\n getErrorHandlerNode(nodeName: string): string | undefined {\n return this.nodes[nodeName]?.errorHandlerNode;\n }\n\n /**\n * Whether `nodeName` is itself an auto-generated error handler node.\n */\n isErrorHandlerNode(nodeName: string): boolean {\n return this.nodes[nodeName]?.isErrorHandler === true;\n }\n\n /**\n * Schedule a node-level error handler task for a task that failed after its\n * retry policy was exhausted. Prepares the handler task (injecting a\n * {@link NodeError}), registers it so the runner executes it within the\n * current step, and returns it (or `undefined` if no handler applies).\n *\n * The failure provenance (`ERROR` + `ERROR_SOURCE_NODE`) is checkpointed by\n * the runner via {@link PregelLoop#putWrites} so handlers observe the same\n * context after a resume.\n */\n scheduleErrorHandler(\n failedTask: PregelExecutableTask<string, string>,\n error: Error\n ): PregelExecutableTask<string, string> | undefined {\n const handlerNode = this.getErrorHandlerNode(String(failedTask.name));\n if (!handlerNode) return undefined;\n\n const handlerTask = _prepareNodeErrorHandlerTask(\n failedTask,\n handlerNode,\n error,\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n failedTask.config ?? this.config,\n {\n step: this.step,\n checkpointer: this.checkpointer,\n manager: this.manager,\n store: this.store,\n stream: this.stream,\n }\n ) as PregelExecutableTask<string, string> | undefined;\n\n if (handlerTask === undefined) return undefined;\n\n this.tasks[handlerTask.id] = handlerTask;\n\n this._emit(\n gatherIteratorSync(prefixGenerator(mapDebugTasks([handlerTask]), \"tasks\"))\n );\n if (this.debug) printStepTasks(this.step, [handlerTask]);\n\n return handlerTask;\n }\n\n /**\n * On resume, re-schedule error handlers for tasks that failed in a prior run\n * but had not finished being handled. Scans pending writes for\n * `ERROR_SOURCE_NODE` markers (paired with `ERROR`), marks the originating\n * task as done (so the runner won't re-run it), and prepares a fresh handler\n * task so the runner picks it up.\n */\n protected _resumeErrorHandlersIfApplicable() {\n // Collect failed task ids with both ERROR_SOURCE_NODE and ERROR writes.\n const failed = new Map<string, Error>();\n for (const [tid, chan] of this.checkpointPendingWrites) {\n if (chan !== ERROR_SOURCE_NODE) continue;\n const errorWrite = this.checkpointPendingWrites.find(\n ([t, c]) => t === tid && c === ERROR\n );\n if (errorWrite === undefined) continue;\n const value = errorWrite[2] as { message?: string; name?: string };\n const error = new Error(value?.message ?? String(value));\n if (value?.name) error.name = value.name;\n failed.set(tid, error);\n }\n\n for (const [tid, error] of failed) {\n const task = this.tasks[tid];\n if (task === undefined) continue;\n const handlerNode = this.getErrorHandlerNode(String(task.name));\n if (!handlerNode) continue;\n // Non-empty writes => runner's `writes.length === 0` filter skips it.\n if (task.writes.length === 0) {\n task.writes.push([ERROR, { message: error.message, name: error.name }]);\n }\n this.scheduleErrorHandler(task, error);\n }\n }\n\n protected _suppressInterrupt(e?: Error): boolean {\n if (!isGraphInterrupt(e) || this.isNested) return false;\n this.lifecycleEvents?.push({\n runId: this.manager?.runId,\n status: this.status,\n checkpointId: this.checkpoint.id,\n checkpointNs: [...this.checkpointNamespace],\n interrupts: [...e.interrupts],\n });\n return true;\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 const inputIsCommand = isCommand(this.input);\n\n const isTimeTraveling =\n this.isReplaying &&\n // Time-travel to a subgraph checkpoint: the parent sets RESUMING=True\n // (it can't distinguish time-travel from resume), so we check if this\n // subgraph's own ns is in checkpoint_map.\n ((this.isNested &&\n configurable?.[CONFIG_KEY_CHECKPOINT_NS] !== undefined &&\n configurable?.[CONFIG_KEY_CHECKPOINT_NS] !== \"\" &&\n configurable?.[CONFIG_KEY_CHECKPOINT_MAP] !== undefined &&\n configurable[CONFIG_KEY_CHECKPOINT_NS] in\n configurable[CONFIG_KEY_CHECKPOINT_MAP]) ||\n !(\n (inputIsCommand && (this.input as Command).resume != null) ||\n configurable?.[CONFIG_KEY_RESUMING] === true ||\n this.resumeAtHead\n ));\n const isUpdateOrFork =\n this.checkpointMetadata.source === \"update\" ||\n this.checkpointMetadata.source === \"fork\";\n // Whether this run saves a fork checkpoint (below) to start its branch.\n // The fork carries a `Command`'s writes itself, so nothing this run writes\n // is stored on the checkpoint it addressed, which may have children that\n // replay it.\n const forks =\n isTimeTraveling &&\n (inputIsCommand || this.isResuming) &&\n (!isUpdateOrFork || this.addressedCheckpointSuperseded);\n const carried: CheckpointPendingWrite[] = [];\n // A resume that hands the head's pending writes back to their tasks only\n // learns which of them go back once those are scheduled, so the end of\n // the superstep seals the rest. Kept apart from the writes this run adds.\n const reapplies = this.isResuming && this.skipDoneTasks;\n this._resumeLoadedWrites = reapplies\n ? this.checkpointPendingWrites.filter(([tid]) => tid !== NULL_TASK_ID)\n : [];\n this._reappliedTaskIds = new Set();\n this._deltaChannelsForcedSnapshot = reapplies\n ? new Set()\n : deltaChannelsWithPendingWrites(\n this.channels,\n this.checkpointPendingWrites\n );\n\n // map command to writes\n if (inputIsCommand) {\n const command = this.input as Command;\n const hasResume = command.resume != null;\n\n if (\n command.resume != null &&\n typeof command.resume === \"object\" &&\n Object.keys(command.resume).every(isXXH3)\n ) {\n this.config.configurable ??= {};\n this.config.configurable[CONFIG_KEY_RESUME_MAP] = command.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 command,\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 if (forks) {\n // These skip `putWrites`, which gives messages their ids.\n ensureDeltaMessageIds(this.channels, ws);\n for (const [c, v] of ws) carried.push([tid, c, v]);\n } else {\n this.putWrites(tid, ws);\n if (this._exitDeltaWrites !== undefined && tid === NULL_TASK_ID) {\n this._exitCommandWrites.push(\n ...deltaChannelWrites(this.channels, ws)\n );\n }\n }\n }\n for (const ch of deltaChannelsWithPendingWrites(this.channels, carried)) {\n this._deltaChannelsForcedSnapshot.add(ch);\n }\n }\n\n // apply null writes\n const nullWrites = [...(this.checkpointPendingWrites ?? []), ...carried]\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 = inputIsCommand && nullWrites.length > 0;\n\n if (isTimeTraveling) {\n this.checkpointPendingWrites = this.checkpointPendingWrites.filter(\n (w) => w[1] !== RESUME\n );\n }\n\n // Take the resume value from the parent only after the time-travel filter\n // above, which drops this checkpoint's stale RESUME writes, not this one.\n // A run that forks stores it on the fork, below.\n const nullResume = (\n configurable?.[CONFIG_KEY_SCRATCHPAD] as PregelScratchpad | undefined\n )?.nullResume;\n if (nullResume !== undefined && !forks) {\n this.putWrites(NULL_TASK_ID, [[RESUME, nullResume]]);\n }\n\n // The parent checkpoint subgraphs replay from, when the fork below would\n // otherwise move it\n let replayBound: RunnableConfig | undefined;\n const cachedIsResuming = this.isResuming;\n if (cachedIsResuming || isCommandUpdateOrGoto) {\n // One spread (O(N)) instead of O(N²) per-channel spreads. Must be a\n // new object — copyCheckpoint shallow-copies versions_seen.\n const interruptSeen: Record<string, string | number> = {\n ...this.checkpoint.versions_seen[INTERRUPT],\n };\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 interruptSeen[channelName] =\n this.checkpoint.channel_versions[channelName];\n }\n }\n this.checkpoint.versions_seen[INTERRUPT] = interruptSeen;\n\n // An update or fork checkpoint is a branch of its own, unless the thread\n // moved past it: its other children would replay whatever this run\n // stores on it.\n if (forks) {\n if (isUpdateOrFork && this.prevCheckpointConfig) {\n replayBound = this.prevCheckpointConfig;\n }\n this.checkpointPendingWrites = this.checkpointPendingWrites.filter(\n (w) => w[1] !== INTERRUPT\n );\n await this._putCheckpoint({ source: \"fork\" });\n if (nullResume !== undefined) {\n this.putWrites(NULL_TASK_ID, [[RESUME, nullResume]]);\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 // Preserve the original `isResuming`-first priority: when both\n // `isResuming` and `isCommandUpdateOrGoto` are true (resuming from\n // an interrupt with a Command update/goto), the resume path wins\n // and no new input checkpoint is created here.\n if (cachedIsResuming) {\n this.input = INPUT_RESUMING;\n } else if (isCommandUpdateOrGoto) {\n // Persist the input checkpoint BEFORE emitting values so the\n // attached `checkpoint` envelope points at the just-created\n // fork target. We need a new checkpoint for Command(update=...)\n // or Command(goto=...) in case the result of Command(goto=...)\n // is an interrupt. If not done, the checkpoint containing the\n // interrupt will be lost.\n await this._putCheckpoint({ source: \"input\" });\n this.input = INPUT_DONE;\n }\n // Emit after any checkpoint persistence so the `checkpoint` envelope\n // on the values event points at the fork target for the emitted state.\n this._emitValuesWithCheckpointMeta(valuesOutput);\n } else {\n // map inputs to channel updates\n const inputWrites = await gatherIterator(mapInput(inputKeys, this.input));\n if (inputWrites.length > 0) {\n // Before the input is applied, so this run reads the message ids that\n // are saved with it.\n const deltaInput = ensureDeltaMessageIds(\n this.channels,\n inputWrites as PendingWrite[]\n );\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 // An Overwrite supplied as input must also force a snapshot.\n for (const [c, v] of deltaInput) {\n if (_isOverwriteValue(v)) this._deltaChannelsForcedSnapshot.add(c);\n }\n if (deltaInput.length > 0) {\n if (this._exitDeltaWrites !== undefined) {\n // Exit mode: input writes never enter `checkpointPendingWrites`,\n // so the after-tick capture misses them; capture them here.\n for (const [c, v] of deltaInput) {\n this._exitDeltaWrites.push([this.step, NULL_TASK_ID, \"\", c, v]);\n }\n } else if (this.checkpointer != null) {\n // A DeltaChannel reads its input from the writes stored on the\n // checkpoint this run starts from, under a task id of their own:\n // readers apply a checkpoint's NULL_TASK_ID writes as its own\n // state. A new thread has no checkpoint to store them on, and one\n // a `checkpoint_id` addressed may have children that would read\n // them, so then the input checkpoint snapshots the channel instead.\n if (this._hasPersistedParent && this._loadedLatest) {\n this.putWrites(uuid5(INPUT, this.checkpoint.id), deltaInput);\n } else {\n for (const [c] of deltaInput) {\n this._deltaChannelsForcedSnapshot.add(c);\n }\n }\n }\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 let replayState: ReplayState | undefined;\n // Only pass ReplayState during time-travel, not when resuming from the\n // current head with an explicit checkpoint_id (see Python _loop._first).\n if (isTimeTraveling) {\n let replayCheckpointId = this.checkpoint.id;\n if (replayBound !== undefined) {\n replayCheckpointId =\n replayBound.configurable?.[CONFIG_KEY_CHECKPOINT_ID] ??\n replayCheckpointId;\n } else if (\n (this.checkpointMetadata.source === \"update\" ||\n this.checkpointMetadata.source === \"fork\") &&\n this.prevCheckpointConfig\n ) {\n replayCheckpointId =\n this.prevCheckpointConfig.configurable?.[\n CONFIG_KEY_CHECKPOINT_ID\n ] ?? replayCheckpointId;\n }\n replayState = new ReplayState(replayCheckpointId);\n }\n this.config = patchConfigurable(this.config, {\n [CONFIG_KEY_RESUMING]: this.isResuming,\n [CONFIG_KEY_REPLAY_STATE]: replayState,\n });\n }\n if (cachedIsResuming) {\n this.lifecycleEvents?.push({\n runId: this.manager?.runId,\n status: this.status,\n checkpointId: this.checkpoint.id,\n checkpointNs: [...this.checkpointNamespace],\n });\n }\n }\n\n #interruptStreamNamespace(): string[] {\n const ns = this.checkpointNamespace;\n const isRootNamespace =\n ns.length === 0 || (ns.length === 1 && ns[0] === \"\");\n if (\n !isRootNamespace ||\n this.config.configurable?.[CONFIG_KEY_STREAM] === undefined\n ) {\n return ns;\n }\n const deepest = deepestCheckpointMapNamespace(\n this.config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP] as\n | Record<string, string>\n | undefined\n );\n return deepest.length > 0 ? deepest : ns;\n }\n\n protected _emit(\n values: Array<[StreamMode, unknown]>,\n namespace: string[] = this.checkpointNamespace\n ) {\n for (const [mode, payload] of values) {\n if (this.stream.modes.has(mode)) {\n this.stream.push([namespace, 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 namespace,\n \"debug\",\n { step, type, timestamp, payload },\n ]);\n }\n }\n }\n\n /**\n * Build a {@link StreamChunkMeta} describing the currently active checkpoint.\n * Emitted as a separate ``[namespace, \"checkpoints\", envelope]`` chunk before\n * the paired ``values`` chunk. Returns `undefined` if no checkpoint metadata\n * is available yet.\n */\n protected _currentCheckpointMeta(): StreamChunkMeta | undefined {\n if (!this.checkpointMetadata || !this.checkpoint?.id) return undefined;\n const parent_id = this.prevCheckpointConfig?.configurable?.checkpoint_id as\n | string\n | undefined;\n return {\n checkpoint: {\n id: this.checkpoint.id,\n ...(parent_id ? { parent_id } : {}),\n step: this.checkpointMetadata.step,\n source: this.checkpointMetadata.source,\n },\n };\n }\n\n /**\n * Emit stream entries. When checkpoint meta is available, push a lightweight\n * ``[namespace, \"checkpoints\", envelope]`` chunk before each ``values`` chunk.\n */\n protected _emitValuesWithCheckpointMeta(\n entries: [StreamMode, unknown][]\n ): void {\n const meta = this._currentCheckpointMeta();\n for (const [mode, payload] of entries) {\n if (\n mode === \"values\" &&\n meta?.checkpoint != null &&\n !this.stream.modes.has(\"checkpoints\")\n ) {\n this.stream.push([\n this.checkpointNamespace,\n \"checkpoints\",\n meta.checkpoint,\n ]);\n }\n if (this.stream.modes.has(mode)) {\n this.stream.push([this.checkpointNamespace, mode, payload]);\n }\n }\n }\n\n protected _putCheckpoint(\n inputMetadata: Omit<CheckpointMetadata, \"step\" | \"parents\">\n ) {\n const exiting = this.checkpointMetadata === inputMetadata;\n // Nothing ran since this checkpoint was loaded: putting it again would\n // store it as its own parent.\n if (exiting && this.checkpoint.id === this.checkpointIdSaved) return;\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 // The exit call must NOT bump the counters again (the last intermediate\n // call already counted the final superstep) or it would double-count.\n let newCounters: Record<string, [number, number]>;\n if (!exiting) {\n newCounters = advanceDeltaCounters(\n this.channels,\n this.updatedChannels ?? new Set<string>(),\n this.checkpointMetadata.counters_since_delta_snapshot\n );\n this.checkpointMetadata = {\n ...inputMetadata,\n step: this.step,\n parents: this.config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP] ?? {},\n };\n } else {\n newCounters = {\n ...(this.checkpointMetadata.counters_since_delta_snapshot ?? {}),\n };\n }\n if (this._deltaWritesVersioned) {\n (this.checkpointMetadata as Record<string, unknown>)[\n DELTA_WRITES_VERSIONED\n ] = true;\n }\n\n const channelsToSnapshot = doCheckpoint\n ? deltaChannelsToSnapshot(\n this.channels,\n newCounters,\n this._deltaWritesVersioned\n ? this.checkpoint.channel_versions\n : undefined\n )\n : new Set<string>();\n if (doCheckpoint) {\n for (const ch of this._deltaChannelsForcedSnapshot)\n channelsToSnapshot.add(ch);\n }\n\n // create new checkpoint\n this.checkpoint = createCheckpoint(\n this.checkpoint,\n doCheckpoint ? this.channels : undefined,\n this.step,\n {\n id: exiting ? this.checkpoint.id : undefined,\n channelsToSnapshot,\n storedVersions: this.checkpointPreviousVersions,\n getNextVersion: doCheckpoint\n ? (current) =>\n this.checkpointerGetNextVersion(current as number | undefined)\n : undefined,\n triggerToNodes: this.triggerToNodes,\n }\n );\n\n // Reset counters for channels that just snapshotted, and persist the\n // non-zero remainder into metadata (or clear the field entirely).\n for (const k of channelsToSnapshot) {\n newCounters[k] = [0, 0];\n this._deltaChannelsForcedSnapshot.delete(k);\n }\n const nonZero: Record<string, [number, number]> = {};\n for (const k in newCounters) {\n if (!Object.prototype.hasOwnProperty.call(newCounters, k)) continue;\n const [u, s] = newCounters[k];\n if (u !== 0 || s !== 0) nonZero[k] = [u, s];\n }\n if (Object.keys(nonZero).length > 0) {\n this.checkpointMetadata.counters_since_delta_snapshot = nonZero;\n } else {\n delete this.checkpointMetadata.counters_since_delta_snapshot;\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 /**\n * Stage the exit-mode accumulator of DeltaChannel writes so the final\n * checkpoint can be reconstructed. In \"exit\" durability per-step writes are\n * not persisted, so delta writes are accumulated across the run and anchored\n * here — under the saved parent, or a freshly-created stub when this is a\n * first run with no persisted parent. Channels that will snapshot in the\n * final checkpoint are excluded (their full value lives in `channel_values`).\n *\n * Must run BEFORE the final `_putCheckpoint` so the stub branch can adjust\n * `checkpointConfig` to anchor the final checkpoint on the stub.\n */\n protected async _putExitDeltaWrites(): Promise<void> {\n if (\n this._exitDeltaWrites === undefined ||\n this._exitDeltaWrites.length === 0 ||\n this.checkpointer == null ||\n this._initialCheckpointConfig === undefined\n ) {\n return;\n }\n\n // A checkpoint a `checkpoint_id` addressed may already have children,\n // which read the writes stored on it, so then the channels this run wrote\n // snapshot instead.\n if (this._hasPersistedParent && !this._loadedLatest) {\n for (const [, , , ch] of this._exitDeltaWrites)\n this._deltaChannelsForcedSnapshot.add(ch);\n }\n\n const counters =\n this.checkpointMetadata.counters_since_delta_snapshot ?? {};\n const channelsToSnapshot = deltaChannelsToSnapshot(\n this.channels,\n counters,\n this._deltaWritesVersioned ? this.checkpoint.channel_versions : undefined\n );\n // Forced snapshots are taken by the final `_putCheckpoint` (which runs\n // after this), so their accumulated exit writes must NOT also be replayed\n // on top of that snapshot — exclude them.\n for (const ch of this._deltaChannelsForcedSnapshot)\n channelsToSnapshot.add(ch);\n\n const pending = this._exitDeltaWrites.filter(\n ([, , , ch]) => !channelsToSnapshot.has(ch)\n );\n if (pending.length === 0) return;\n\n let anchorConfig: RunnableConfig;\n if (this._hasPersistedParent) {\n // _initialCheckpointConfig points at the saved parent checkpoint.\n anchorConfig = this._initialCheckpointConfig;\n } else {\n // No persisted parent: create a stub empty checkpoint (no parent) and\n // anchor on it, then point the final checkpoint at the stub.\n const stubCp = emptyCheckpoint();\n stubCp.id = this.checkpointIdSaved ?? stubCp.id;\n stubCp.ts = new Date().toISOString();\n const stubPutConfig = patchConfigurable(this._initialCheckpointConfig, {\n [CONFIG_KEY_CHECKPOINT_ID]: undefined,\n });\n anchorConfig = patchConfigurable(this._initialCheckpointConfig, {\n [CONFIG_KEY_CHECKPOINT_ID]: stubCp.id,\n });\n this._checkpointerPutAfterPrevious({\n config: stubPutConfig,\n checkpoint: stubCp,\n metadata: { source: \"loop\", step: -2, parents: {} },\n newVersions: {},\n });\n this.checkpointConfig = anchorConfig;\n }\n\n const anchorWriteConfig = patchConfigurable(anchorConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]: this.config.configurable?.checkpoint_ns ?? \"\",\n [CONFIG_KEY_CHECKPOINT_ID]:\n anchorConfig.configurable?.[CONFIG_KEY_CHECKPOINT_ID],\n });\n\n // The checkpoint's own superstep keeps its real task paths, so it\n // interleaves with the writes a resume loaded from it. Its task ids stay\n // synthetic: under the real id, a run whose final checkpoint fails to\n // save would leave the resumed task looking done to the next resume.\n // Later supersteps sort after every real task path and task id, in step\n // order, so this holds whether a saver orders writes by task path\n // (`writesSortKey`) or by task id only. `NULL_TASK_ID` keeps the empty\n // path, where live execution applies input.\n const grouped = new Map<string, PendingWrite<string>[]>();\n const order: { key: string; tid: string; path: string }[] = [];\n for (const [step, tid, path, ch, v] of pending) {\n let synthTid: string;\n let synthPath: string;\n if (tid === NULL_TASK_ID) {\n synthTid = exitDeltaTaskId(step, tid);\n synthPath = \"\";\n } else if (step === this._exitFirstStep) {\n synthTid = exitDeltaTaskId(step, tid);\n synthPath = path;\n } else {\n synthTid = exitDeltaLateTaskId(step, tid);\n // `~~` sorts after every real path (which starts with a single `~`),\n // in step order — `taskPathStr` gives the sign-aware 10-digit padding.\n synthPath = `~~${taskPathStr(step)}${path}`;\n }\n const key = `${synthTid}\\u0000${synthPath}`;\n let group = grouped.get(key);\n if (group === undefined) {\n group = [];\n grouped.set(key, group);\n order.push({ key, tid: synthTid, path: synthPath });\n }\n group.push([ch, v]);\n }\n for (const { key, tid, path } of order) {\n const saved = this.checkpointer.putWrites(\n anchorWriteConfig,\n grouped.get(key)!,\n tid,\n path\n );\n this._trackCheckpointerPromise(saved);\n this._pendingDeltaWrites.push(saved);\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 const task = this.tasks[tid];\n this._trackCheckpointerPromise(\n this.checkpointer.putWrites(\n config,\n ws,\n tid,\n task != null ? taskPathStr(task.path) : \"\"\n )\n );\n }\n }\n\n /**\n * Hands the writes loaded with the checkpoint back to the finished tasks\n * among `tasks`. A failed or interrupted task keeps empty writes, so it\n * reruns or goes to its error handler.\n */\n protected _reapplyWritesToSucceededNodes(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tasks: Record<string, PregelExecutableTask<any, any>>\n ) {\n for (const [tid, k, v] of this.checkpointPendingWrites) {\n if (\n k === ERROR ||\n k === ERROR_SOURCE_NODE ||\n k === INTERRUPT ||\n k === RESUME\n ) {\n continue;\n }\n const task = tasks[tid];\n if (task) {\n task.writes.push([k, v]);\n this._reappliedTaskIds.add(tid);\n }\n }\n }\n\n protected _matchWrites(\n tasks: Record<string, PregelExecutableTask<string, string>>\n ) {\n this._reapplyWritesToSucceededNodes(tasks);\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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"}
|