@langchain/langgraph 1.2.8 → 1.3.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/graph/graph.cjs +6 -2
- package/dist/graph/graph.cjs.map +1 -1
- package/dist/graph/graph.d.cts +58 -7
- package/dist/graph/graph.d.cts.map +1 -1
- package/dist/graph/graph.d.ts +58 -7
- package/dist/graph/graph.d.ts.map +1 -1
- package/dist/graph/graph.js +6 -2
- package/dist/graph/graph.js.map +1 -1
- package/dist/graph/index.d.ts +3 -3
- package/dist/graph/state.cjs +3 -2
- package/dist/graph/state.cjs.map +1 -1
- package/dist/graph/state.d.cts +14 -6
- package/dist/graph/state.d.cts.map +1 -1
- package/dist/graph/state.d.ts +14 -6
- package/dist/graph/state.d.ts.map +1 -1
- package/dist/graph/state.js +3 -2
- package/dist/graph/state.js.map +1 -1
- package/dist/index.cjs +34 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -6
- package/dist/index.d.ts +16 -6
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/prebuilt/agent_executor.d.cts +1 -1
- package/dist/prebuilt/agent_executor.d.ts +1 -1
- package/dist/pregel/algo.cjs +6 -3
- package/dist/pregel/algo.cjs.map +1 -1
- package/dist/pregel/algo.js +6 -3
- package/dist/pregel/algo.js.map +1 -1
- package/dist/pregel/index.cjs +96 -25
- package/dist/pregel/index.cjs.map +1 -1
- package/dist/pregel/index.d.cts +25 -3
- package/dist/pregel/index.d.cts.map +1 -1
- package/dist/pregel/index.d.ts +25 -3
- package/dist/pregel/index.d.ts.map +1 -1
- package/dist/pregel/index.js +97 -26
- package/dist/pregel/index.js.map +1 -1
- package/dist/pregel/loop.cjs +51 -10
- package/dist/pregel/loop.cjs.map +1 -1
- package/dist/pregel/loop.js +51 -10
- package/dist/pregel/loop.js.map +1 -1
- package/dist/pregel/messages-v2.cjs +231 -0
- package/dist/pregel/messages-v2.cjs.map +1 -0
- package/dist/pregel/messages-v2.js +231 -0
- package/dist/pregel/messages-v2.js.map +1 -0
- package/dist/pregel/messages.cjs +14 -10
- package/dist/pregel/messages.cjs.map +1 -1
- package/dist/pregel/messages.js +14 -10
- package/dist/pregel/messages.js.map +1 -1
- package/dist/pregel/remote.cjs +15 -0
- package/dist/pregel/remote.cjs.map +1 -1
- package/dist/pregel/remote.d.cts.map +1 -1
- package/dist/pregel/remote.d.ts.map +1 -1
- package/dist/pregel/remote.js +15 -0
- package/dist/pregel/remote.js.map +1 -1
- package/dist/pregel/stream.cjs.map +1 -1
- package/dist/pregel/stream.d.cts +30 -0
- package/dist/pregel/stream.d.cts.map +1 -0
- package/dist/pregel/stream.d.ts +30 -1
- package/dist/pregel/stream.d.ts.map +1 -0
- package/dist/pregel/stream.js.map +1 -1
- package/dist/pregel/types.cjs.map +1 -1
- package/dist/pregel/types.d.cts +8 -1
- package/dist/pregel/types.d.cts.map +1 -1
- package/dist/pregel/types.d.ts +8 -1
- package/dist/pregel/types.d.ts.map +1 -1
- package/dist/pregel/types.js.map +1 -1
- package/dist/pregel/utils/config.cjs +21 -4
- package/dist/pregel/utils/config.cjs.map +1 -1
- package/dist/pregel/utils/config.d.cts.map +1 -1
- package/dist/pregel/utils/config.d.ts.map +1 -1
- package/dist/pregel/utils/config.js +21 -5
- package/dist/pregel/utils/config.js.map +1 -1
- package/dist/pregel/utils/index.d.ts +0 -1
- package/dist/pregel/utils/index.d.ts.map +1 -1
- package/dist/state/index.d.ts +1 -1
- package/dist/state/schema.d.cts +1 -1
- package/dist/state/schema.d.ts +1 -1
- package/dist/stream/convert.cjs +207 -0
- package/dist/stream/convert.cjs.map +1 -0
- package/dist/stream/convert.d.cts +69 -0
- package/dist/stream/convert.d.cts.map +1 -0
- package/dist/stream/convert.d.ts +69 -0
- package/dist/stream/convert.d.ts.map +1 -0
- package/dist/stream/convert.js +206 -0
- package/dist/stream/convert.js.map +1 -0
- package/dist/stream/index.cjs +11 -0
- package/dist/stream/index.d.cts +12 -0
- package/dist/stream/index.d.ts +12 -0
- package/dist/stream/index.js +12 -0
- package/dist/stream/mux.cjs +350 -0
- package/dist/stream/mux.cjs.map +1 -0
- package/dist/stream/mux.d.cts +160 -0
- package/dist/stream/mux.d.cts.map +1 -0
- package/dist/stream/mux.d.ts +160 -0
- package/dist/stream/mux.d.ts.map +1 -0
- package/dist/stream/mux.js +345 -0
- package/dist/stream/mux.js.map +1 -0
- package/dist/stream/run-stream.cjs +439 -0
- package/dist/stream/run-stream.cjs.map +1 -0
- package/dist/stream/run-stream.d.cts +286 -0
- package/dist/stream/run-stream.d.cts.map +1 -0
- package/dist/stream/run-stream.d.ts +285 -0
- package/dist/stream/run-stream.d.ts.map +1 -0
- package/dist/stream/run-stream.js +434 -0
- package/dist/stream/run-stream.js.map +1 -0
- package/dist/stream/stream-channel.cjs +208 -0
- package/dist/stream/stream-channel.cjs.map +1 -0
- package/dist/stream/stream-channel.d.cts +129 -0
- package/dist/stream/stream-channel.d.cts.map +1 -0
- package/dist/stream/stream-channel.d.ts +129 -0
- package/dist/stream/stream-channel.d.ts.map +1 -0
- package/dist/stream/stream-channel.js +207 -0
- package/dist/stream/stream-channel.js.map +1 -0
- package/dist/stream/transformers/index.cjs +4 -0
- package/dist/stream/transformers/index.d.ts +5 -0
- package/dist/stream/transformers/index.js +5 -0
- package/dist/stream/transformers/lifecycle.cjs +326 -0
- package/dist/stream/transformers/lifecycle.cjs.map +1 -0
- package/dist/stream/transformers/lifecycle.d.cts +53 -0
- package/dist/stream/transformers/lifecycle.d.cts.map +1 -0
- package/dist/stream/transformers/lifecycle.d.ts +53 -0
- package/dist/stream/transformers/lifecycle.d.ts.map +1 -0
- package/dist/stream/transformers/lifecycle.js +325 -0
- package/dist/stream/transformers/lifecycle.js.map +1 -0
- package/dist/stream/transformers/messages.cjs +94 -0
- package/dist/stream/transformers/messages.cjs.map +1 -0
- package/dist/stream/transformers/messages.d.cts +23 -0
- package/dist/stream/transformers/messages.d.cts.map +1 -0
- package/dist/stream/transformers/messages.d.ts +23 -0
- package/dist/stream/transformers/messages.d.ts.map +1 -0
- package/dist/stream/transformers/messages.js +94 -0
- package/dist/stream/transformers/messages.js.map +1 -0
- package/dist/stream/transformers/subgraphs.cjs +125 -0
- package/dist/stream/transformers/subgraphs.cjs.map +1 -0
- package/dist/stream/transformers/subgraphs.d.cts +95 -0
- package/dist/stream/transformers/subgraphs.d.cts.map +1 -0
- package/dist/stream/transformers/subgraphs.d.ts +95 -0
- package/dist/stream/transformers/subgraphs.d.ts.map +1 -0
- package/dist/stream/transformers/subgraphs.js +124 -0
- package/dist/stream/transformers/subgraphs.js.map +1 -0
- package/dist/stream/transformers/types.d.cts +89 -0
- package/dist/stream/transformers/types.d.cts.map +1 -0
- package/dist/stream/transformers/types.d.ts +89 -0
- package/dist/stream/transformers/types.d.ts.map +1 -0
- package/dist/stream/transformers/values.cjs +39 -0
- package/dist/stream/transformers/values.cjs.map +1 -0
- package/dist/stream/transformers/values.d.cts +21 -0
- package/dist/stream/transformers/values.d.cts.map +1 -0
- package/dist/stream/transformers/values.d.ts +21 -0
- package/dist/stream/transformers/values.d.ts.map +1 -0
- package/dist/stream/transformers/values.js +39 -0
- package/dist/stream/transformers/values.js.map +1 -0
- package/dist/stream/types.cjs +11 -0
- package/dist/stream/types.cjs.map +1 -0
- package/dist/stream/types.d.cts +255 -0
- package/dist/stream/types.d.cts.map +1 -0
- package/dist/stream/types.d.ts +255 -0
- package/dist/stream/types.d.ts.map +1 -0
- package/dist/stream/types.js +11 -0
- package/dist/stream/types.js.map +1 -0
- package/dist/web.cjs +39 -9
- package/dist/web.d.cts +16 -6
- package/dist/web.d.ts +16 -6
- package/dist/web.js +10 -1
- package/package.json +9 -8
package/dist/pregel/algo.js
CHANGED
|
@@ -215,7 +215,8 @@ function _prepareSingleTask(taskPath, checkpoint, pendingWrites, processes, chan
|
|
|
215
215
|
langgraph_node: call.name,
|
|
216
216
|
langgraph_triggers: triggers,
|
|
217
217
|
langgraph_path: outputTaskPath,
|
|
218
|
-
langgraph_checkpoint_ns: taskCheckpointNamespace
|
|
218
|
+
langgraph_checkpoint_ns: taskCheckpointNamespace,
|
|
219
|
+
checkpoint_ns: taskCheckpointNamespace
|
|
219
220
|
};
|
|
220
221
|
if (forExecution) {
|
|
221
222
|
const writes = [];
|
|
@@ -313,7 +314,8 @@ function _prepareSingleTask(taskPath, checkpoint, pendingWrites, processes, chan
|
|
|
313
314
|
langgraph_node: packet.node,
|
|
314
315
|
langgraph_triggers: triggers,
|
|
315
316
|
langgraph_path: taskPath.slice(0, 3),
|
|
316
|
-
langgraph_checkpoint_ns: taskCheckpointNamespace
|
|
317
|
+
langgraph_checkpoint_ns: taskCheckpointNamespace,
|
|
318
|
+
checkpoint_ns: taskCheckpointNamespace
|
|
317
319
|
};
|
|
318
320
|
if (forExecution) {
|
|
319
321
|
const proc = processes[packet.node];
|
|
@@ -435,7 +437,8 @@ function _prepareSingleTask(taskPath, checkpoint, pendingWrites, processes, chan
|
|
|
435
437
|
langgraph_node: name,
|
|
436
438
|
langgraph_triggers: [trigger],
|
|
437
439
|
langgraph_path: taskPath,
|
|
438
|
-
langgraph_checkpoint_ns: taskCheckpointNamespace
|
|
440
|
+
langgraph_checkpoint_ns: taskCheckpointNamespace,
|
|
441
|
+
checkpoint_ns: taskCheckpointNamespace
|
|
439
442
|
};
|
|
440
443
|
if (forExecution) {
|
|
441
444
|
const node = proc.getNode();
|
package/dist/pregel/algo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"algo.js","names":[],"sources":["../../src/pregel/algo.ts"],"sourcesContent":["/* eslint-disable no-param-reassign */\nimport {\n mergeConfigs,\n patchConfig,\n RunnableConfig,\n} from \"@langchain/core/runnables\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport {\n All,\n BaseCheckpointSaver,\n Checkpoint,\n ReadonlyCheckpoint,\n copyCheckpoint,\n type PendingWrite,\n type PendingWriteValue,\n uuid5,\n maxChannelVersion,\n BaseStore,\n CheckpointPendingWrite,\n SendProtocol,\n} from \"@langchain/langgraph-checkpoint\";\nimport {\n BaseChannel,\n createCheckpoint,\n emptyChannels,\n getOnlyChannels,\n} from \"../channels/base.js\";\nimport { PregelNode } from \"./read.js\";\nimport { readChannel, readChannels } from \"./io.js\";\nimport {\n _isSend,\n _isSendInterface,\n CONFIG_KEY_CHECKPOINT_MAP,\n CHECKPOINT_NAMESPACE_SEPARATOR,\n CONFIG_KEY_CHECKPOINTER,\n CONFIG_KEY_READ,\n CONFIG_KEY_TASK_ID,\n CONFIG_KEY_SEND,\n INTERRUPT,\n RESERVED,\n Send,\n TAG_HIDDEN,\n TASKS,\n CHECKPOINT_NAMESPACE_END,\n PUSH,\n PULL,\n RESUME,\n NULL_TASK_ID,\n CONFIG_KEY_SCRATCHPAD,\n RETURN,\n ERROR,\n NO_WRITES,\n CONFIG_KEY_PREVIOUS_STATE,\n PREVIOUS,\n CACHE_NS_WRITES,\n CONFIG_KEY_RESUME_MAP,\n START,\n} from \"../constants.js\";\nimport {\n Call,\n isCall,\n PregelExecutableTask,\n PregelScratchpad,\n PregelTaskDescription,\n SimpleTaskPath,\n TaskPath,\n VariadicTaskPath,\n} from \"./types.js\";\nimport { EmptyChannelError, InvalidUpdateError } from \"../errors.js\";\nimport { getNullChannelVersion } from \"./utils/index.js\";\nimport { ExecutionInfo, LangGraphRunnableConfig } from \"./runnable_types.js\";\nimport { getRunnableForFunc } from \"./call.js\";\nimport { IterableReadableWritableStream } from \"./stream.js\";\nimport { XXH3 } from \"../hash.js\";\nimport { Topic } from \"../channels/topic.js\";\n\n/**\n * Construct a type with a set of properties K of type T\n */\nexport type StrRecord<K extends string, T> = {\n [P in K]: T;\n};\n\nexport type WritesProtocol<C = string> = {\n name: string;\n writes: PendingWrite<C>[];\n triggers: string[];\n path?: TaskPath;\n};\n\nexport const increment = (current?: number) => {\n return current !== undefined ? current + 1 : 1;\n};\n\nfunction triggersNextStep(\n updatedChannels: Set<string>,\n triggerToNodes: Record<string, string[]> | undefined\n) {\n if (triggerToNodes == null) return false;\n\n for (const chan of updatedChannels) {\n if (triggerToNodes[chan]) return true;\n }\n\n return false;\n}\n\n// Avoids unnecessary double iteration\nfunction maxChannelMapVersion(\n channelVersions: Record<string, number | string>\n): number | string | undefined {\n let maxVersion: number | string | undefined;\n for (const chan in channelVersions) {\n if (!Object.prototype.hasOwnProperty.call(channelVersions, chan)) continue;\n if (maxVersion == null) {\n maxVersion = channelVersions[chan];\n } else {\n maxVersion = maxChannelVersion(maxVersion, channelVersions[chan]);\n }\n }\n return maxVersion;\n}\n\nexport function shouldInterrupt<N extends PropertyKey, C extends PropertyKey>(\n checkpoint: Checkpoint,\n interruptNodes: All | N[],\n tasks: PregelExecutableTask<N, C>[]\n): boolean {\n const nullVersion = getNullChannelVersion(checkpoint.channel_versions);\n const seen = checkpoint.versions_seen[INTERRUPT] ?? {};\n\n let anyChannelUpdated = false;\n\n if (\n (checkpoint.channel_versions[START] ?? nullVersion) >\n (seen[START] ?? nullVersion)\n ) {\n anyChannelUpdated = true;\n } else {\n for (const chan in checkpoint.channel_versions) {\n if (\n !Object.prototype.hasOwnProperty.call(checkpoint.channel_versions, chan)\n )\n continue;\n\n if (checkpoint.channel_versions[chan] > (seen[chan] ?? nullVersion)) {\n anyChannelUpdated = true;\n break;\n }\n }\n }\n\n const anyTriggeredNodeInInterruptNodes = tasks.some((task) =>\n interruptNodes === \"*\"\n ? !task.config?.tags?.includes(TAG_HIDDEN)\n : interruptNodes.includes(task.name)\n );\n\n return anyChannelUpdated && anyTriggeredNodeInInterruptNodes;\n}\n\nexport function _localRead<Cc extends Record<string, BaseChannel>>(\n checkpoint: ReadonlyCheckpoint,\n channels: Cc,\n task: WritesProtocol<keyof Cc>,\n select: Array<keyof Cc> | keyof Cc,\n fresh: boolean = false\n): Record<string, unknown> | unknown {\n let updated = new Set<keyof Cc>();\n\n if (!Array.isArray(select)) {\n for (const [c] of task.writes) {\n if (c === select) {\n updated = new Set([c]);\n break;\n }\n }\n updated = updated || new Set();\n } else {\n updated = new Set(\n select.filter((c) => task.writes.some(([key, _]) => key === c))\n );\n }\n\n let values: Record<string, unknown>;\n\n if (fresh && updated.size > 0) {\n const localChannels = Object.fromEntries(\n Object.entries(channels).filter(([k, _]) => updated.has(k as keyof Cc))\n ) as Partial<Cc>;\n\n const newCheckpoint = createCheckpoint(checkpoint, localChannels as Cc, -1);\n const newChannels = emptyChannels(localChannels as Cc, newCheckpoint);\n\n _applyWrites(\n copyCheckpoint(newCheckpoint),\n newChannels,\n [task],\n undefined,\n undefined\n );\n values = readChannels({ ...channels, ...newChannels }, select);\n } else {\n values = readChannels(channels, select);\n }\n\n return values;\n}\n\nexport function _localWrite(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n commit: (writes: [string, any][]) => any,\n processes: Record<string, PregelNode>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n writes: [string, any][]\n) {\n for (const [chan, value] of writes) {\n if ([PUSH, TASKS].includes(chan) && value != null) {\n if (!_isSend(value)) {\n throw new InvalidUpdateError(\n `Invalid packet type, expected SendProtocol, got ${JSON.stringify(\n value\n )}`\n );\n }\n if (!(value.node in processes)) {\n throw new InvalidUpdateError(\n `Invalid node name \"${value.node}\" in Send packet`\n );\n }\n }\n }\n commit(writes);\n}\n\nconst IGNORE = new Set<string | number | symbol>([\n NO_WRITES,\n PUSH,\n RESUME,\n INTERRUPT,\n RETURN,\n ERROR,\n]);\n\nexport function _applyWrites<Cc extends Record<string, BaseChannel>>(\n checkpoint: Checkpoint,\n channels: Cc,\n tasks: WritesProtocol<keyof Cc>[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getNextVersion: ((version: any) => any) | undefined,\n triggerToNodes: Record<string, string[]> | undefined\n): Set<string> {\n // Sort tasks by first 3 path elements for deterministic order\n // Later path parts (like task IDs) are ignored for sorting\n tasks.sort((a, b) => {\n const aPath = a.path?.slice(0, 3) || [];\n const bPath = b.path?.slice(0, 3) || [];\n\n // Compare each path element\n for (let i = 0; i < Math.min(aPath.length, bPath.length); i += 1) {\n if (aPath[i] < bPath[i]) return -1;\n if (aPath[i] > bPath[i]) return 1;\n }\n\n // If one path is shorter, it comes first\n return aPath.length - bPath.length;\n });\n\n // if no task has triggers this is applying writes from the null task only\n // so we don't do anything other than update the channels written to\n const bumpStep = tasks.some((task) => task.triggers.length > 0);\n\n // Filter out non instances of BaseChannel\n const onlyChannels = getOnlyChannels(channels);\n\n // Update seen versions\n for (const task of tasks) {\n checkpoint.versions_seen[task.name] ??= {};\n for (const chan of task.triggers) {\n if (chan in checkpoint.channel_versions) {\n checkpoint.versions_seen[task.name][chan] =\n checkpoint.channel_versions[chan];\n }\n }\n }\n\n // Find the highest version of all channels\n let maxVersion = maxChannelMapVersion(checkpoint.channel_versions);\n\n // Consume all channels that were read\n const channelsToConsume = new Set(\n tasks\n .flatMap((task) => task.triggers)\n .filter((chan) => !RESERVED.includes(chan))\n );\n\n let usedNewVersion = false;\n for (const chan of channelsToConsume) {\n if (chan in onlyChannels && onlyChannels[chan].consume()) {\n if (getNextVersion !== undefined) {\n checkpoint.channel_versions[chan] = getNextVersion(maxVersion);\n usedNewVersion = true;\n }\n }\n }\n\n // Group writes by channel\n const pendingWritesByChannel = {} as Record<keyof Cc, PendingWriteValue[]>;\n for (const task of tasks) {\n for (const [chan, val] of task.writes) {\n if (IGNORE.has(chan)) {\n // do nothing\n } else if (chan in onlyChannels) {\n pendingWritesByChannel[chan] ??= [];\n pendingWritesByChannel[chan].push(val);\n }\n }\n }\n\n // Find the highest version of all channels\n if (maxVersion != null && getNextVersion != null) {\n maxVersion = usedNewVersion ? getNextVersion(maxVersion) : maxVersion;\n }\n\n const updatedChannels: Set<string> = new Set();\n // Apply writes to channels\n for (const [chan, vals] of Object.entries(pendingWritesByChannel)) {\n if (chan in onlyChannels) {\n const channel = onlyChannels[chan];\n let updated;\n try {\n updated = channel.update(vals);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.name === InvalidUpdateError.unminifiable_name) {\n const wrappedError = new InvalidUpdateError(\n `Invalid update for channel \"${chan}\" with values ${JSON.stringify(\n vals\n )}: ${e.message}`\n );\n wrappedError.lc_error_code = e.lc_error_code;\n throw wrappedError;\n } else {\n throw e;\n }\n }\n if (updated && getNextVersion !== undefined) {\n checkpoint.channel_versions[chan] = getNextVersion(maxVersion);\n\n // unavailable channels can't trigger tasks, so don't add them\n if (channel.isAvailable()) updatedChannels.add(chan);\n }\n }\n }\n\n // Channels that weren't updated in this step are notified of a new step\n if (bumpStep) {\n for (const chan in onlyChannels) {\n if (!Object.prototype.hasOwnProperty.call(onlyChannels, chan)) continue;\n\n const channel = onlyChannels[chan];\n if (channel.isAvailable() && !updatedChannels.has(chan)) {\n const updated = channel.update([]);\n\n if (updated && getNextVersion !== undefined) {\n checkpoint.channel_versions[chan] = getNextVersion(maxVersion);\n\n // unavailable channels can't trigger tasks, so don't add them\n if (channel.isAvailable()) updatedChannels.add(chan);\n }\n }\n }\n }\n\n // If this is (tentatively) the last superstep, notify all channels of finish\n if (bumpStep && !triggersNextStep(updatedChannels, triggerToNodes)) {\n for (const chan in onlyChannels) {\n if (!Object.prototype.hasOwnProperty.call(onlyChannels, chan)) continue;\n\n const channel = onlyChannels[chan];\n if (channel.finish() && getNextVersion !== undefined) {\n checkpoint.channel_versions[chan] = getNextVersion(maxVersion);\n\n // unavailable channels can't trigger tasks, so don't add them\n if (channel.isAvailable()) updatedChannels.add(chan);\n }\n }\n }\n\n return updatedChannels;\n}\n\nfunction* candidateNodes(\n checkpoint: ReadonlyCheckpoint,\n processes: StrRecord<string, PregelNode>,\n extra: NextTaskExtraFields\n) {\n // This section is an optimization that allows which\n // nodes will be active during the next step.\n // When there's information about:\n // 1. Which channels were updated in the previous step\n // 2. Which nodes are triggered by which channels\n // Then we can determine which nodes should be triggered\n // in the next step without having to cycle through all nodes.\n if (extra.updatedChannels != null && extra.triggerToNodes != null) {\n const triggeredNodes = new Set<string>();\n\n // Get all nodes that have triggers associated with an updated channel\n for (const channel of extra.updatedChannels) {\n const nodeIds = extra.triggerToNodes[channel];\n for (const id of nodeIds ?? []) triggeredNodes.add(id);\n }\n\n // Sort the nodes to ensure deterministic order\n yield* [...triggeredNodes].sort();\n return;\n }\n\n // If there are no values in checkpoint, no need to run\n // through all the PULL candidates\n const isEmptyChannelVersions = (() => {\n for (const chan in checkpoint.channel_versions) {\n if (checkpoint.channel_versions[chan] !== null) return false;\n }\n return true;\n })();\n\n if (isEmptyChannelVersions) return;\n for (const name in processes) {\n if (!Object.prototype.hasOwnProperty.call(processes, name)) continue;\n yield name;\n }\n}\n\nexport type NextTaskExtraFields = {\n step: number;\n isResuming?: boolean;\n checkpointer?: BaseCheckpointSaver;\n manager?: CallbackManagerForChainRun;\n store?: BaseStore;\n stream?: IterableReadableWritableStream;\n triggerToNodes?: Record<string, string[]>;\n updatedChannels?: Set<string>;\n};\n\nexport type NextTaskExtraFieldsWithStore = NextTaskExtraFields & {\n store?: BaseStore;\n};\n\nexport type NextTaskExtraFieldsWithoutStore = NextTaskExtraFields & {\n store?: never;\n};\n\nexport function _prepareNextTasks<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: [string, string, unknown][] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: false,\n extra: NextTaskExtraFieldsWithoutStore\n): Record<string, PregelTaskDescription>;\n\nexport function _prepareNextTasks<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: [string, string, unknown][] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: true,\n extra: NextTaskExtraFieldsWithStore\n): Record<string, PregelExecutableTask<keyof Nn, keyof Cc>>;\n\n/**\n * Prepare the set of tasks that will make up the next Pregel step.\n * This is the union of all PUSH tasks (Sends) and PULL tasks (nodes triggered\n * by edges).\n */\nexport function _prepareNextTasks<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: [string, string, unknown][] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: boolean,\n extra: NextTaskExtraFieldsWithStore | NextTaskExtraFieldsWithoutStore\n):\n | Record<string, PregelTaskDescription>\n | Record<string, PregelExecutableTask<keyof Nn, keyof Cc>> {\n const tasks:\n | Record<string, PregelExecutableTask<keyof Nn, keyof Cc>>\n | Record<string, PregelTaskDescription> = {};\n\n // Consume pending tasks\n const tasksChannel = channels[TASKS] as Topic<SendProtocol> | undefined;\n\n if (tasksChannel?.isAvailable()) {\n const len = tasksChannel.get().length;\n for (let i = 0; i < len; i += 1) {\n const task = _prepareSingleTask(\n [PUSH, i],\n checkpoint,\n pendingWrites,\n processes,\n channels,\n config,\n forExecution,\n extra\n );\n if (task !== undefined) {\n tasks[task.id] = task;\n }\n }\n }\n\n // Check if any processes should be run in next step\n // If so, prepare the values to be passed to them\n for (const name of candidateNodes(checkpoint, processes, extra)) {\n const task = _prepareSingleTask(\n [PULL, name],\n checkpoint,\n pendingWrites,\n processes,\n channels,\n config,\n forExecution,\n extra\n );\n if (task !== undefined) {\n tasks[task.id] = task;\n }\n }\n return tasks;\n}\n\nexport function _prepareSingleTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n taskPath: SimpleTaskPath,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: false,\n extra: NextTaskExtraFields\n): PregelTaskDescription | undefined;\n\nexport function _prepareSingleTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n taskPath: TaskPath,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: true,\n extra: NextTaskExtraFields\n): PregelExecutableTask<keyof Nn, keyof Cc> | undefined;\n\nexport function _prepareSingleTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n taskPath: TaskPath,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: boolean,\n extra: NextTaskExtraFieldsWithStore\n): PregelTaskDescription | PregelExecutableTask<keyof Nn, keyof Cc> | undefined;\n\n/**\n * Prepares a single task for the next Pregel step, given a task path, which\n * uniquely identifies a PUSH or PULL task within the graph.\n */\nexport function _prepareSingleTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n taskPath: TaskPath,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: LangGraphRunnableConfig,\n forExecution: boolean,\n extra: NextTaskExtraFields\n):\n | PregelTaskDescription\n | PregelExecutableTask<keyof Nn, keyof Cc>\n | undefined {\n const { step, checkpointer, manager } = extra;\n const configurable = config.configurable ?? {};\n const parentNamespace = configurable.checkpoint_ns ?? \"\";\n\n if (taskPath[0] === PUSH && isCall(taskPath[taskPath.length - 1])) {\n const call = taskPath[taskPath.length - 1] as Call;\n const proc = getRunnableForFunc(call.name, call.func);\n const triggers = [PUSH];\n const checkpointNamespace =\n parentNamespace === \"\"\n ? call.name\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${call.name}`;\n const id = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n call.name,\n PUSH,\n taskPath[1],\n taskPath[2],\n ]),\n checkpoint.id\n );\n const taskCheckpointNamespace = `${checkpointNamespace}${CHECKPOINT_NAMESPACE_END}${id}`;\n\n // we append `true` to the task path to indicate that a call is being made\n // so we should not return interrupts from this task (responsibility lies with the parent)\n const outputTaskPath = [...taskPath.slice(0, 3), true] as VariadicTaskPath;\n const metadata = {\n langgraph_step: step,\n langgraph_node: call.name,\n langgraph_triggers: triggers,\n langgraph_path: outputTaskPath,\n langgraph_checkpoint_ns: taskCheckpointNamespace,\n };\n if (forExecution) {\n const writes: [keyof Cc, unknown][] = [];\n const executionInfo: ExecutionInfo = {\n checkpointId: checkpoint.id,\n checkpointNs: taskCheckpointNamespace,\n taskId: id,\n threadId: configurable.thread_id as string | undefined,\n runId: config.runId != null ? String(config.runId) : undefined,\n nodeAttempt: 1,\n };\n const task = {\n name: call.name,\n input: call.input,\n proc,\n writes,\n config: {\n ...patchConfig(\n mergeConfigs(config, {\n metadata,\n store: extra.store ?? config.store,\n }),\n {\n runName: call.name,\n callbacks: manager?.getChild(`graph:step:${step}`),\n configurable: {\n [CONFIG_KEY_TASK_ID]: id,\n [CONFIG_KEY_SEND]: (writes_: PendingWrite[]) =>\n _localWrite(\n (items: PendingWrite<keyof Cc>[]) => writes.push(...items),\n processes,\n writes_\n ),\n [CONFIG_KEY_READ]: (\n select_: Array<keyof Cc> | keyof Cc,\n fresh_: boolean = false\n ) =>\n _localRead(\n checkpoint,\n channels,\n {\n name: call.name,\n writes: writes as PendingWrite[],\n triggers,\n path: outputTaskPath,\n },\n select_,\n fresh_\n ),\n [CONFIG_KEY_CHECKPOINTER]:\n checkpointer ?? configurable[CONFIG_KEY_CHECKPOINTER],\n [CONFIG_KEY_CHECKPOINT_MAP]: {\n ...configurable[CONFIG_KEY_CHECKPOINT_MAP],\n [parentNamespace]: checkpoint.id,\n },\n [CONFIG_KEY_SCRATCHPAD]: _scratchpad({\n pendingWrites: pendingWrites ?? [],\n taskId: id,\n currentTaskInput: call.input,\n resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],\n namespaceHash: XXH3(taskCheckpointNamespace),\n }),\n [CONFIG_KEY_PREVIOUS_STATE]:\n checkpoint.channel_values[PREVIOUS],\n checkpoint_id: undefined,\n checkpoint_ns: taskCheckpointNamespace,\n },\n }\n ),\n executionInfo,\n },\n triggers,\n retry_policy: call.retry,\n cache_key: call.cache\n ? {\n key: XXH3((call.cache.keyFunc ?? JSON.stringify)([call.input])),\n ns: [CACHE_NS_WRITES, call.name ?? \"__dynamic__\"],\n ttl: call.cache.ttl,\n }\n : undefined,\n id,\n path: outputTaskPath,\n writers: [],\n } satisfies PregelExecutableTask<keyof Nn, keyof Cc>;\n return task;\n } else {\n return {\n id,\n name: call.name,\n interrupts: [],\n path: outputTaskPath,\n };\n }\n } else if (taskPath[0] === PUSH) {\n const index =\n typeof taskPath[1] === \"number\"\n ? taskPath[1]\n : parseInt(taskPath[1] as string, 10);\n\n if (!channels[TASKS]?.isAvailable()) {\n return undefined;\n }\n\n const sends = channels[TASKS].get() as SendProtocol[];\n if (index < 0 || index >= sends.length) {\n return undefined;\n }\n\n const packet =\n _isSendInterface(sends[index]) && !_isSend(sends[index])\n ? new Send(sends[index].node, sends[index].args)\n : sends[index];\n\n if (!_isSendInterface(packet)) {\n console.warn(\n `Ignoring invalid packet ${JSON.stringify(packet)} in pending sends.`\n );\n return undefined;\n }\n if (!(packet.node in processes)) {\n console.warn(\n `Ignoring unknown node name ${packet.node} in pending sends.`\n );\n return undefined;\n }\n const triggers = [PUSH];\n const checkpointNamespace =\n parentNamespace === \"\"\n ? packet.node\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${packet.node}`;\n const taskId = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n packet.node,\n PUSH,\n index.toString(),\n ]),\n checkpoint.id\n );\n const taskCheckpointNamespace = `${checkpointNamespace}${CHECKPOINT_NAMESPACE_END}${taskId}`;\n let metadata = {\n langgraph_step: step,\n langgraph_node: packet.node,\n langgraph_triggers: triggers,\n langgraph_path: taskPath.slice(0, 3),\n langgraph_checkpoint_ns: taskCheckpointNamespace,\n };\n if (forExecution) {\n const proc = processes[packet.node];\n const node = proc.getNode();\n if (node !== undefined) {\n if (proc.metadata !== undefined) {\n metadata = { ...metadata, ...proc.metadata };\n }\n const writes: [keyof Cc, unknown][] = [];\n const executionInfo: ExecutionInfo = {\n checkpointId: checkpoint.id,\n checkpointNs: taskCheckpointNamespace,\n taskId,\n threadId: configurable.thread_id as string | undefined,\n runId: config.runId != null ? String(config.runId) : undefined,\n nodeAttempt: 1,\n };\n return {\n name: packet.node,\n input: packet.args,\n proc: node,\n subgraphs: proc.subgraphs,\n writes,\n config: {\n ...patchConfig(\n mergeConfigs(config, {\n metadata,\n tags: proc.tags,\n store: extra.store ?? config.store,\n }),\n {\n runName: packet.node,\n callbacks: manager?.getChild(`graph:step:${step}`),\n configurable: {\n [CONFIG_KEY_TASK_ID]: taskId,\n [CONFIG_KEY_SEND]: (writes_: PendingWrite[]) =>\n _localWrite(\n (items: PendingWrite<keyof Cc>[]) =>\n writes.push(...items),\n processes,\n writes_\n ),\n [CONFIG_KEY_READ]: (\n select_: Array<keyof Cc> | keyof Cc,\n fresh_: boolean = false\n ) =>\n _localRead(\n checkpoint,\n channels,\n {\n name: packet.node,\n writes: writes as PendingWrite[],\n triggers,\n path: taskPath,\n },\n select_,\n fresh_\n ),\n [CONFIG_KEY_CHECKPOINTER]:\n checkpointer ?? configurable[CONFIG_KEY_CHECKPOINTER],\n [CONFIG_KEY_CHECKPOINT_MAP]: {\n ...configurable[CONFIG_KEY_CHECKPOINT_MAP],\n [parentNamespace]: checkpoint.id,\n },\n [CONFIG_KEY_SCRATCHPAD]: _scratchpad({\n pendingWrites: pendingWrites ?? [],\n taskId,\n currentTaskInput: packet.args,\n resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],\n namespaceHash: XXH3(taskCheckpointNamespace),\n }),\n [CONFIG_KEY_PREVIOUS_STATE]:\n checkpoint.channel_values[PREVIOUS],\n checkpoint_id: undefined,\n checkpoint_ns: taskCheckpointNamespace,\n },\n }\n ),\n executionInfo,\n },\n triggers,\n retry_policy: proc.retryPolicy,\n cache_key: proc.cachePolicy\n ? {\n key: XXH3(\n (proc.cachePolicy.keyFunc ?? JSON.stringify)([packet.args])\n ),\n ns: [CACHE_NS_WRITES, proc.name ?? \"__dynamic__\", packet.node],\n ttl: proc.cachePolicy.ttl,\n }\n : undefined,\n id: taskId,\n path: taskPath,\n writers: proc.getWriters(),\n } satisfies PregelExecutableTask<keyof Nn, keyof Cc>;\n }\n } else {\n return {\n id: taskId,\n name: packet.node,\n interrupts: [],\n path: taskPath,\n } satisfies PregelTaskDescription;\n }\n } else if (taskPath[0] === PULL) {\n const name = taskPath[1].toString();\n const proc = processes[name];\n if (proc === undefined) {\n return undefined;\n }\n\n // Check if this task already has successful writes in the pending writes\n if (pendingWrites?.length) {\n // Find the task ID for this node/path\n const checkpointNamespace =\n parentNamespace === \"\"\n ? name\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${name}`;\n\n const taskId = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n name,\n PULL,\n name,\n ]),\n checkpoint.id\n );\n\n // Check if there are successful writes (not ERROR) for this task ID\n const hasSuccessfulWrites = pendingWrites.some(\n (w) => w[0] === taskId && w[1] !== ERROR\n );\n\n // If task completed successfully, don't include it in next tasks\n if (hasSuccessfulWrites) {\n return undefined;\n }\n }\n\n const nullVersion = getNullChannelVersion(checkpoint.channel_versions);\n if (nullVersion === undefined) {\n return undefined;\n }\n const seen = checkpoint.versions_seen[name] ?? {};\n\n // Find the first trigger that is available and has a new version\n const trigger = proc.triggers.find((chan) => {\n if (!channels[chan].isAvailable()) return false;\n\n return (\n (checkpoint.channel_versions[chan] ?? nullVersion) >\n (seen[chan] ?? nullVersion)\n );\n });\n\n // If any of the channels read by this process were updated\n if (trigger !== undefined) {\n const val = _procInput(proc, channels, forExecution);\n if (val === undefined) {\n return undefined;\n }\n const checkpointNamespace =\n parentNamespace === \"\"\n ? name\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${name}`;\n const taskId = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n name,\n PULL,\n [trigger],\n ]),\n checkpoint.id\n );\n const taskCheckpointNamespace = `${checkpointNamespace}${CHECKPOINT_NAMESPACE_END}${taskId}`;\n let metadata = {\n langgraph_step: step,\n langgraph_node: name,\n langgraph_triggers: [trigger],\n langgraph_path: taskPath,\n langgraph_checkpoint_ns: taskCheckpointNamespace,\n };\n if (forExecution) {\n const node = proc.getNode();\n if (node !== undefined) {\n if (proc.metadata !== undefined) {\n metadata = { ...metadata, ...proc.metadata };\n }\n const writes: [keyof Cc, unknown][] = [];\n const executionInfo: ExecutionInfo = {\n checkpointId: checkpoint.id,\n checkpointNs: taskCheckpointNamespace,\n taskId,\n threadId: configurable.thread_id as string | undefined,\n runId: config.runId != null ? String(config.runId) : undefined,\n nodeAttempt: 1,\n };\n return {\n name,\n input: val,\n proc: node,\n subgraphs: proc.subgraphs,\n writes,\n config: {\n ...patchConfig(\n mergeConfigs(config, {\n metadata,\n tags: proc.tags,\n store: extra.store ?? config.store,\n }),\n {\n runName: name,\n callbacks: manager?.getChild(`graph:step:${step}`),\n configurable: {\n [CONFIG_KEY_TASK_ID]: taskId,\n [CONFIG_KEY_SEND]: (writes_: PendingWrite[]) =>\n _localWrite(\n (items: PendingWrite<keyof Cc>[]) => {\n writes.push(...items);\n },\n processes,\n writes_\n ),\n [CONFIG_KEY_READ]: (\n select_: Array<keyof Cc> | keyof Cc,\n fresh_: boolean = false\n ) =>\n _localRead(\n checkpoint,\n channels,\n {\n name,\n writes: writes as PendingWrite[],\n triggers: [trigger],\n path: taskPath,\n },\n select_,\n fresh_\n ),\n [CONFIG_KEY_CHECKPOINTER]:\n checkpointer ?? configurable[CONFIG_KEY_CHECKPOINTER],\n [CONFIG_KEY_CHECKPOINT_MAP]: {\n ...configurable[CONFIG_KEY_CHECKPOINT_MAP],\n [parentNamespace]: checkpoint.id,\n },\n [CONFIG_KEY_SCRATCHPAD]: _scratchpad({\n pendingWrites: pendingWrites ?? [],\n taskId,\n currentTaskInput: val,\n resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],\n namespaceHash: XXH3(taskCheckpointNamespace),\n }),\n [CONFIG_KEY_PREVIOUS_STATE]:\n checkpoint.channel_values[PREVIOUS],\n checkpoint_id: undefined,\n checkpoint_ns: taskCheckpointNamespace,\n },\n }\n ),\n executionInfo,\n },\n triggers: [trigger],\n retry_policy: proc.retryPolicy,\n cache_key: proc.cachePolicy\n ? {\n key: XXH3(\n (proc.cachePolicy.keyFunc ?? JSON.stringify)([val])\n ),\n ns: [CACHE_NS_WRITES, proc.name ?? \"__dynamic__\", name],\n ttl: proc.cachePolicy.ttl,\n }\n : undefined,\n id: taskId,\n path: taskPath,\n writers: proc.getWriters(),\n } satisfies PregelExecutableTask<keyof Nn, keyof Cc>;\n }\n } else {\n return {\n id: taskId,\n name,\n interrupts: [],\n path: taskPath,\n } satisfies PregelTaskDescription;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Function injected under CONFIG_KEY_READ in task config, to read current state.\n * Used by conditional edges to read a copy of the state with reflecting the writes\n * from that node only.\n *\n * @internal\n */\nfunction _procInput(\n proc: PregelNode,\n channels: StrRecord<string, BaseChannel>,\n forExecution: boolean\n) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let val: any;\n\n if (typeof proc.channels === \"object\" && !Array.isArray(proc.channels)) {\n val = {};\n for (const [k, chan] of Object.entries(proc.channels)) {\n if (proc.triggers.includes(chan)) {\n try {\n val[k] = readChannel(channels, chan, false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.name === EmptyChannelError.unminifiable_name) {\n return undefined;\n } else {\n throw e;\n }\n }\n } else if (chan in channels) {\n try {\n val[k] = readChannel(channels, chan, false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.name === EmptyChannelError.unminifiable_name) {\n continue;\n } else {\n throw e;\n }\n }\n }\n }\n } else if (Array.isArray(proc.channels)) {\n let successfulRead = false;\n for (const chan of proc.channels) {\n try {\n val = readChannel(channels, chan, false);\n successfulRead = true;\n break;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.name === EmptyChannelError.unminifiable_name) {\n continue;\n } else {\n throw e;\n }\n }\n }\n if (!successfulRead) {\n return undefined;\n }\n } else {\n throw new Error(\n `Invalid channels type, expected list or dict, got ${proc.channels}`\n );\n }\n\n // If the process has a mapper, apply it to the value\n if (forExecution && proc.mapper !== undefined) {\n val = proc.mapper(val);\n }\n\n return val;\n}\n\n/**\n * Remove any values belonging to UntrackedValue channels from a Send packet\n * before checkpointing.\n *\n * Send is often called with state to be passed to the destination node,\n * which may contain UntrackedValues at the top level.\n *\n * @internal\n */\nexport function sanitizeUntrackedValuesInSend(\n packet: Send,\n channels: StrRecord<string, BaseChannel>\n): Send {\n if (typeof packet.args !== \"object\" || packet.args === null) {\n // Not a dict-like arg\n return packet;\n }\n\n // Top-level keys should be channel names\n const sanitizedArg: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(packet.args)) {\n const channel = channels[key];\n // Check if channel is an UntrackedValue by its lc_graph_name\n if (!channel || channel.lc_graph_name !== \"UntrackedValue\") {\n sanitizedArg[key] = value;\n }\n }\n\n return new Send(packet.node, sanitizedArg);\n}\n\nfunction _scratchpad({\n pendingWrites,\n taskId,\n currentTaskInput,\n resumeMap,\n namespaceHash,\n}: {\n pendingWrites: CheckpointPendingWrite[];\n taskId: string;\n currentTaskInput: unknown;\n resumeMap: Record<string, unknown> | undefined;\n namespaceHash: string;\n}): PregelScratchpad {\n const nullResume = pendingWrites.find(\n ([writeTaskId, chan]) => writeTaskId === NULL_TASK_ID && chan === RESUME\n )?.[2];\n\n const resume = (() => {\n const result = pendingWrites\n .filter(\n ([writeTaskId, chan]) => writeTaskId === taskId && chan === RESUME\n )\n .flatMap(([_writeTaskId, _chan, resume]) => resume);\n\n if (resumeMap != null && namespaceHash in resumeMap) {\n const mappedResume = resumeMap[namespaceHash];\n result.push(mappedResume);\n }\n\n return result;\n })();\n\n const scratchpad = {\n callCounter: 0,\n interruptCounter: -1,\n resume,\n nullResume,\n subgraphCounter: 0,\n currentTaskInput,\n consumeNullResume: () => {\n if (scratchpad.nullResume) {\n delete scratchpad.nullResume;\n pendingWrites.splice(\n pendingWrites.findIndex(\n ([writeTaskId, chan]) =>\n writeTaskId === NULL_TASK_ID && chan === RESUME\n ),\n 1\n );\n return nullResume;\n }\n\n return undefined;\n },\n };\n return scratchpad;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"algo.js","names":[],"sources":["../../src/pregel/algo.ts"],"sourcesContent":["/* eslint-disable no-param-reassign */\nimport {\n mergeConfigs,\n patchConfig,\n RunnableConfig,\n} from \"@langchain/core/runnables\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport {\n All,\n BaseCheckpointSaver,\n Checkpoint,\n ReadonlyCheckpoint,\n copyCheckpoint,\n type PendingWrite,\n type PendingWriteValue,\n uuid5,\n maxChannelVersion,\n BaseStore,\n CheckpointPendingWrite,\n SendProtocol,\n} from \"@langchain/langgraph-checkpoint\";\nimport {\n BaseChannel,\n createCheckpoint,\n emptyChannels,\n getOnlyChannels,\n} from \"../channels/base.js\";\nimport { PregelNode } from \"./read.js\";\nimport { readChannel, readChannels } from \"./io.js\";\nimport {\n _isSend,\n _isSendInterface,\n CONFIG_KEY_CHECKPOINT_MAP,\n CHECKPOINT_NAMESPACE_SEPARATOR,\n CONFIG_KEY_CHECKPOINTER,\n CONFIG_KEY_READ,\n CONFIG_KEY_TASK_ID,\n CONFIG_KEY_SEND,\n INTERRUPT,\n RESERVED,\n Send,\n TAG_HIDDEN,\n TASKS,\n CHECKPOINT_NAMESPACE_END,\n PUSH,\n PULL,\n RESUME,\n NULL_TASK_ID,\n CONFIG_KEY_SCRATCHPAD,\n RETURN,\n ERROR,\n NO_WRITES,\n CONFIG_KEY_PREVIOUS_STATE,\n PREVIOUS,\n CACHE_NS_WRITES,\n CONFIG_KEY_RESUME_MAP,\n START,\n} from \"../constants.js\";\nimport {\n Call,\n isCall,\n PregelExecutableTask,\n PregelScratchpad,\n PregelTaskDescription,\n SimpleTaskPath,\n TaskPath,\n VariadicTaskPath,\n} from \"./types.js\";\nimport { EmptyChannelError, InvalidUpdateError } from \"../errors.js\";\nimport { getNullChannelVersion } from \"./utils/index.js\";\nimport { ExecutionInfo, LangGraphRunnableConfig } from \"./runnable_types.js\";\nimport { getRunnableForFunc } from \"./call.js\";\nimport { IterableReadableWritableStream } from \"./stream.js\";\nimport { XXH3 } from \"../hash.js\";\nimport { Topic } from \"../channels/topic.js\";\n\n/**\n * Construct a type with a set of properties K of type T\n */\nexport type StrRecord<K extends string, T> = {\n [P in K]: T;\n};\n\nexport type WritesProtocol<C = string> = {\n name: string;\n writes: PendingWrite<C>[];\n triggers: string[];\n path?: TaskPath;\n};\n\nexport const increment = (current?: number) => {\n return current !== undefined ? current + 1 : 1;\n};\n\nfunction triggersNextStep(\n updatedChannels: Set<string>,\n triggerToNodes: Record<string, string[]> | undefined\n) {\n if (triggerToNodes == null) return false;\n\n for (const chan of updatedChannels) {\n if (triggerToNodes[chan]) return true;\n }\n\n return false;\n}\n\n// Avoids unnecessary double iteration\nfunction maxChannelMapVersion(\n channelVersions: Record<string, number | string>\n): number | string | undefined {\n let maxVersion: number | string | undefined;\n for (const chan in channelVersions) {\n if (!Object.prototype.hasOwnProperty.call(channelVersions, chan)) continue;\n if (maxVersion == null) {\n maxVersion = channelVersions[chan];\n } else {\n maxVersion = maxChannelVersion(maxVersion, channelVersions[chan]);\n }\n }\n return maxVersion;\n}\n\nexport function shouldInterrupt<N extends PropertyKey, C extends PropertyKey>(\n checkpoint: Checkpoint,\n interruptNodes: All | N[],\n tasks: PregelExecutableTask<N, C>[]\n): boolean {\n const nullVersion = getNullChannelVersion(checkpoint.channel_versions);\n const seen = checkpoint.versions_seen[INTERRUPT] ?? {};\n\n let anyChannelUpdated = false;\n\n if (\n (checkpoint.channel_versions[START] ?? nullVersion) >\n (seen[START] ?? nullVersion)\n ) {\n anyChannelUpdated = true;\n } else {\n for (const chan in checkpoint.channel_versions) {\n if (\n !Object.prototype.hasOwnProperty.call(checkpoint.channel_versions, chan)\n )\n continue;\n\n if (checkpoint.channel_versions[chan] > (seen[chan] ?? nullVersion)) {\n anyChannelUpdated = true;\n break;\n }\n }\n }\n\n const anyTriggeredNodeInInterruptNodes = tasks.some((task) =>\n interruptNodes === \"*\"\n ? !task.config?.tags?.includes(TAG_HIDDEN)\n : interruptNodes.includes(task.name)\n );\n\n return anyChannelUpdated && anyTriggeredNodeInInterruptNodes;\n}\n\nexport function _localRead<Cc extends Record<string, BaseChannel>>(\n checkpoint: ReadonlyCheckpoint,\n channels: Cc,\n task: WritesProtocol<keyof Cc>,\n select: Array<keyof Cc> | keyof Cc,\n fresh: boolean = false\n): Record<string, unknown> | unknown {\n let updated = new Set<keyof Cc>();\n\n if (!Array.isArray(select)) {\n for (const [c] of task.writes) {\n if (c === select) {\n updated = new Set([c]);\n break;\n }\n }\n updated = updated || new Set();\n } else {\n updated = new Set(\n select.filter((c) => task.writes.some(([key, _]) => key === c))\n );\n }\n\n let values: Record<string, unknown>;\n\n if (fresh && updated.size > 0) {\n const localChannels = Object.fromEntries(\n Object.entries(channels).filter(([k, _]) => updated.has(k as keyof Cc))\n ) as Partial<Cc>;\n\n const newCheckpoint = createCheckpoint(checkpoint, localChannels as Cc, -1);\n const newChannels = emptyChannels(localChannels as Cc, newCheckpoint);\n\n _applyWrites(\n copyCheckpoint(newCheckpoint),\n newChannels,\n [task],\n undefined,\n undefined\n );\n values = readChannels({ ...channels, ...newChannels }, select);\n } else {\n values = readChannels(channels, select);\n }\n\n return values;\n}\n\nexport function _localWrite(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n commit: (writes: [string, any][]) => any,\n processes: Record<string, PregelNode>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n writes: [string, any][]\n) {\n for (const [chan, value] of writes) {\n if ([PUSH, TASKS].includes(chan) && value != null) {\n if (!_isSend(value)) {\n throw new InvalidUpdateError(\n `Invalid packet type, expected SendProtocol, got ${JSON.stringify(\n value\n )}`\n );\n }\n if (!(value.node in processes)) {\n throw new InvalidUpdateError(\n `Invalid node name \"${value.node}\" in Send packet`\n );\n }\n }\n }\n commit(writes);\n}\n\nconst IGNORE = new Set<string | number | symbol>([\n NO_WRITES,\n PUSH,\n RESUME,\n INTERRUPT,\n RETURN,\n ERROR,\n]);\n\nexport function _applyWrites<Cc extends Record<string, BaseChannel>>(\n checkpoint: Checkpoint,\n channels: Cc,\n tasks: WritesProtocol<keyof Cc>[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getNextVersion: ((version: any) => any) | undefined,\n triggerToNodes: Record<string, string[]> | undefined\n): Set<string> {\n // Sort tasks by first 3 path elements for deterministic order\n // Later path parts (like task IDs) are ignored for sorting\n tasks.sort((a, b) => {\n const aPath = a.path?.slice(0, 3) || [];\n const bPath = b.path?.slice(0, 3) || [];\n\n // Compare each path element\n for (let i = 0; i < Math.min(aPath.length, bPath.length); i += 1) {\n if (aPath[i] < bPath[i]) return -1;\n if (aPath[i] > bPath[i]) return 1;\n }\n\n // If one path is shorter, it comes first\n return aPath.length - bPath.length;\n });\n\n // if no task has triggers this is applying writes from the null task only\n // so we don't do anything other than update the channels written to\n const bumpStep = tasks.some((task) => task.triggers.length > 0);\n\n // Filter out non instances of BaseChannel\n const onlyChannels = getOnlyChannels(channels);\n\n // Update seen versions\n for (const task of tasks) {\n checkpoint.versions_seen[task.name] ??= {};\n for (const chan of task.triggers) {\n if (chan in checkpoint.channel_versions) {\n checkpoint.versions_seen[task.name][chan] =\n checkpoint.channel_versions[chan];\n }\n }\n }\n\n // Find the highest version of all channels\n let maxVersion = maxChannelMapVersion(checkpoint.channel_versions);\n\n // Consume all channels that were read\n const channelsToConsume = new Set(\n tasks\n .flatMap((task) => task.triggers)\n .filter((chan) => !RESERVED.includes(chan))\n );\n\n let usedNewVersion = false;\n for (const chan of channelsToConsume) {\n if (chan in onlyChannels && onlyChannels[chan].consume()) {\n if (getNextVersion !== undefined) {\n checkpoint.channel_versions[chan] = getNextVersion(maxVersion);\n usedNewVersion = true;\n }\n }\n }\n\n // Group writes by channel\n const pendingWritesByChannel = {} as Record<keyof Cc, PendingWriteValue[]>;\n for (const task of tasks) {\n for (const [chan, val] of task.writes) {\n if (IGNORE.has(chan)) {\n // do nothing\n } else if (chan in onlyChannels) {\n pendingWritesByChannel[chan] ??= [];\n pendingWritesByChannel[chan].push(val);\n }\n }\n }\n\n // Find the highest version of all channels\n if (maxVersion != null && getNextVersion != null) {\n maxVersion = usedNewVersion ? getNextVersion(maxVersion) : maxVersion;\n }\n\n const updatedChannels: Set<string> = new Set();\n // Apply writes to channels\n for (const [chan, vals] of Object.entries(pendingWritesByChannel)) {\n if (chan in onlyChannels) {\n const channel = onlyChannels[chan];\n let updated;\n try {\n updated = channel.update(vals);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.name === InvalidUpdateError.unminifiable_name) {\n const wrappedError = new InvalidUpdateError(\n `Invalid update for channel \"${chan}\" with values ${JSON.stringify(\n vals\n )}: ${e.message}`\n );\n wrappedError.lc_error_code = e.lc_error_code;\n throw wrappedError;\n } else {\n throw e;\n }\n }\n if (updated && getNextVersion !== undefined) {\n checkpoint.channel_versions[chan] = getNextVersion(maxVersion);\n\n // unavailable channels can't trigger tasks, so don't add them\n if (channel.isAvailable()) updatedChannels.add(chan);\n }\n }\n }\n\n // Channels that weren't updated in this step are notified of a new step\n if (bumpStep) {\n for (const chan in onlyChannels) {\n if (!Object.prototype.hasOwnProperty.call(onlyChannels, chan)) continue;\n\n const channel = onlyChannels[chan];\n if (channel.isAvailable() && !updatedChannels.has(chan)) {\n const updated = channel.update([]);\n\n if (updated && getNextVersion !== undefined) {\n checkpoint.channel_versions[chan] = getNextVersion(maxVersion);\n\n // unavailable channels can't trigger tasks, so don't add them\n if (channel.isAvailable()) updatedChannels.add(chan);\n }\n }\n }\n }\n\n // If this is (tentatively) the last superstep, notify all channels of finish\n if (bumpStep && !triggersNextStep(updatedChannels, triggerToNodes)) {\n for (const chan in onlyChannels) {\n if (!Object.prototype.hasOwnProperty.call(onlyChannels, chan)) continue;\n\n const channel = onlyChannels[chan];\n if (channel.finish() && getNextVersion !== undefined) {\n checkpoint.channel_versions[chan] = getNextVersion(maxVersion);\n\n // unavailable channels can't trigger tasks, so don't add them\n if (channel.isAvailable()) updatedChannels.add(chan);\n }\n }\n }\n\n return updatedChannels;\n}\n\nfunction* candidateNodes(\n checkpoint: ReadonlyCheckpoint,\n processes: StrRecord<string, PregelNode>,\n extra: NextTaskExtraFields\n) {\n // This section is an optimization that allows which\n // nodes will be active during the next step.\n // When there's information about:\n // 1. Which channels were updated in the previous step\n // 2. Which nodes are triggered by which channels\n // Then we can determine which nodes should be triggered\n // in the next step without having to cycle through all nodes.\n if (extra.updatedChannels != null && extra.triggerToNodes != null) {\n const triggeredNodes = new Set<string>();\n\n // Get all nodes that have triggers associated with an updated channel\n for (const channel of extra.updatedChannels) {\n const nodeIds = extra.triggerToNodes[channel];\n for (const id of nodeIds ?? []) triggeredNodes.add(id);\n }\n\n // Sort the nodes to ensure deterministic order\n yield* [...triggeredNodes].sort();\n return;\n }\n\n // If there are no values in checkpoint, no need to run\n // through all the PULL candidates\n const isEmptyChannelVersions = (() => {\n for (const chan in checkpoint.channel_versions) {\n if (checkpoint.channel_versions[chan] !== null) return false;\n }\n return true;\n })();\n\n if (isEmptyChannelVersions) return;\n for (const name in processes) {\n if (!Object.prototype.hasOwnProperty.call(processes, name)) continue;\n yield name;\n }\n}\n\nexport type NextTaskExtraFields = {\n step: number;\n isResuming?: boolean;\n checkpointer?: BaseCheckpointSaver;\n manager?: CallbackManagerForChainRun;\n store?: BaseStore;\n stream?: IterableReadableWritableStream;\n triggerToNodes?: Record<string, string[]>;\n updatedChannels?: Set<string>;\n};\n\nexport type NextTaskExtraFieldsWithStore = NextTaskExtraFields & {\n store?: BaseStore;\n};\n\nexport type NextTaskExtraFieldsWithoutStore = NextTaskExtraFields & {\n store?: never;\n};\n\nexport function _prepareNextTasks<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: [string, string, unknown][] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: false,\n extra: NextTaskExtraFieldsWithoutStore\n): Record<string, PregelTaskDescription>;\n\nexport function _prepareNextTasks<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: [string, string, unknown][] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: true,\n extra: NextTaskExtraFieldsWithStore\n): Record<string, PregelExecutableTask<keyof Nn, keyof Cc>>;\n\n/**\n * Prepare the set of tasks that will make up the next Pregel step.\n * This is the union of all PUSH tasks (Sends) and PULL tasks (nodes triggered\n * by edges).\n */\nexport function _prepareNextTasks<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: [string, string, unknown][] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: boolean,\n extra: NextTaskExtraFieldsWithStore | NextTaskExtraFieldsWithoutStore\n):\n | Record<string, PregelTaskDescription>\n | Record<string, PregelExecutableTask<keyof Nn, keyof Cc>> {\n const tasks:\n | Record<string, PregelExecutableTask<keyof Nn, keyof Cc>>\n | Record<string, PregelTaskDescription> = {};\n\n // Consume pending tasks\n const tasksChannel = channels[TASKS] as Topic<SendProtocol> | undefined;\n\n if (tasksChannel?.isAvailable()) {\n const len = tasksChannel.get().length;\n for (let i = 0; i < len; i += 1) {\n const task = _prepareSingleTask(\n [PUSH, i],\n checkpoint,\n pendingWrites,\n processes,\n channels,\n config,\n forExecution,\n extra\n );\n if (task !== undefined) {\n tasks[task.id] = task;\n }\n }\n }\n\n // Check if any processes should be run in next step\n // If so, prepare the values to be passed to them\n for (const name of candidateNodes(checkpoint, processes, extra)) {\n const task = _prepareSingleTask(\n [PULL, name],\n checkpoint,\n pendingWrites,\n processes,\n channels,\n config,\n forExecution,\n extra\n );\n if (task !== undefined) {\n tasks[task.id] = task;\n }\n }\n return tasks;\n}\n\nexport function _prepareSingleTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n taskPath: SimpleTaskPath,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: false,\n extra: NextTaskExtraFields\n): PregelTaskDescription | undefined;\n\nexport function _prepareSingleTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n taskPath: TaskPath,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: true,\n extra: NextTaskExtraFields\n): PregelExecutableTask<keyof Nn, keyof Cc> | undefined;\n\nexport function _prepareSingleTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n taskPath: TaskPath,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: RunnableConfig,\n forExecution: boolean,\n extra: NextTaskExtraFieldsWithStore\n): PregelTaskDescription | PregelExecutableTask<keyof Nn, keyof Cc> | undefined;\n\n/**\n * Prepares a single task for the next Pregel step, given a task path, which\n * uniquely identifies a PUSH or PULL task within the graph.\n */\nexport function _prepareSingleTask<\n Nn extends StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel>,\n>(\n taskPath: TaskPath,\n checkpoint: ReadonlyCheckpoint,\n pendingWrites: CheckpointPendingWrite[] | undefined,\n processes: Nn,\n channels: Cc,\n config: LangGraphRunnableConfig,\n forExecution: boolean,\n extra: NextTaskExtraFields\n):\n | PregelTaskDescription\n | PregelExecutableTask<keyof Nn, keyof Cc>\n | undefined {\n const { step, checkpointer, manager } = extra;\n const configurable = config.configurable ?? {};\n const parentNamespace = configurable.checkpoint_ns ?? \"\";\n\n if (taskPath[0] === PUSH && isCall(taskPath[taskPath.length - 1])) {\n const call = taskPath[taskPath.length - 1] as Call;\n const proc = getRunnableForFunc(call.name, call.func);\n const triggers = [PUSH];\n const checkpointNamespace =\n parentNamespace === \"\"\n ? call.name\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${call.name}`;\n const id = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n call.name,\n PUSH,\n taskPath[1],\n taskPath[2],\n ]),\n checkpoint.id\n );\n const taskCheckpointNamespace = `${checkpointNamespace}${CHECKPOINT_NAMESPACE_END}${id}`;\n\n // we append `true` to the task path to indicate that a call is being made\n // so we should not return interrupts from this task (responsibility lies with the parent)\n const outputTaskPath = [...taskPath.slice(0, 3), true] as VariadicTaskPath;\n const metadata = {\n langgraph_step: step,\n langgraph_node: call.name,\n langgraph_triggers: triggers,\n langgraph_path: outputTaskPath,\n langgraph_checkpoint_ns: taskCheckpointNamespace,\n checkpoint_ns: taskCheckpointNamespace,\n };\n if (forExecution) {\n const writes: [keyof Cc, unknown][] = [];\n const executionInfo: ExecutionInfo = {\n checkpointId: checkpoint.id,\n checkpointNs: taskCheckpointNamespace,\n taskId: id,\n threadId: configurable.thread_id as string | undefined,\n runId: config.runId != null ? String(config.runId) : undefined,\n nodeAttempt: 1,\n };\n const task = {\n name: call.name,\n input: call.input,\n proc,\n writes,\n config: {\n ...patchConfig(\n mergeConfigs(config, {\n metadata,\n store: extra.store ?? config.store,\n }),\n {\n runName: call.name,\n callbacks: manager?.getChild(`graph:step:${step}`),\n configurable: {\n [CONFIG_KEY_TASK_ID]: id,\n [CONFIG_KEY_SEND]: (writes_: PendingWrite[]) =>\n _localWrite(\n (items: PendingWrite<keyof Cc>[]) => writes.push(...items),\n processes,\n writes_\n ),\n [CONFIG_KEY_READ]: (\n select_: Array<keyof Cc> | keyof Cc,\n fresh_: boolean = false\n ) =>\n _localRead(\n checkpoint,\n channels,\n {\n name: call.name,\n writes: writes as PendingWrite[],\n triggers,\n path: outputTaskPath,\n },\n select_,\n fresh_\n ),\n [CONFIG_KEY_CHECKPOINTER]:\n checkpointer ?? configurable[CONFIG_KEY_CHECKPOINTER],\n [CONFIG_KEY_CHECKPOINT_MAP]: {\n ...configurable[CONFIG_KEY_CHECKPOINT_MAP],\n [parentNamespace]: checkpoint.id,\n },\n [CONFIG_KEY_SCRATCHPAD]: _scratchpad({\n pendingWrites: pendingWrites ?? [],\n taskId: id,\n currentTaskInput: call.input,\n resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],\n namespaceHash: XXH3(taskCheckpointNamespace),\n }),\n [CONFIG_KEY_PREVIOUS_STATE]:\n checkpoint.channel_values[PREVIOUS],\n checkpoint_id: undefined,\n checkpoint_ns: taskCheckpointNamespace,\n },\n }\n ),\n executionInfo,\n },\n triggers,\n retry_policy: call.retry,\n cache_key: call.cache\n ? {\n key: XXH3((call.cache.keyFunc ?? JSON.stringify)([call.input])),\n ns: [CACHE_NS_WRITES, call.name ?? \"__dynamic__\"],\n ttl: call.cache.ttl,\n }\n : undefined,\n id,\n path: outputTaskPath,\n writers: [],\n } satisfies PregelExecutableTask<keyof Nn, keyof Cc>;\n return task;\n } else {\n return {\n id,\n name: call.name,\n interrupts: [],\n path: outputTaskPath,\n };\n }\n } else if (taskPath[0] === PUSH) {\n const index =\n typeof taskPath[1] === \"number\"\n ? taskPath[1]\n : parseInt(taskPath[1] as string, 10);\n\n if (!channels[TASKS]?.isAvailable()) {\n return undefined;\n }\n\n const sends = channels[TASKS].get() as SendProtocol[];\n if (index < 0 || index >= sends.length) {\n return undefined;\n }\n\n const packet =\n _isSendInterface(sends[index]) && !_isSend(sends[index])\n ? new Send(sends[index].node, sends[index].args)\n : sends[index];\n\n if (!_isSendInterface(packet)) {\n console.warn(\n `Ignoring invalid packet ${JSON.stringify(packet)} in pending sends.`\n );\n return undefined;\n }\n if (!(packet.node in processes)) {\n console.warn(\n `Ignoring unknown node name ${packet.node} in pending sends.`\n );\n return undefined;\n }\n const triggers = [PUSH];\n const checkpointNamespace =\n parentNamespace === \"\"\n ? packet.node\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${packet.node}`;\n const taskId = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n packet.node,\n PUSH,\n index.toString(),\n ]),\n checkpoint.id\n );\n const taskCheckpointNamespace = `${checkpointNamespace}${CHECKPOINT_NAMESPACE_END}${taskId}`;\n let metadata = {\n langgraph_step: step,\n langgraph_node: packet.node,\n langgraph_triggers: triggers,\n langgraph_path: taskPath.slice(0, 3),\n langgraph_checkpoint_ns: taskCheckpointNamespace,\n checkpoint_ns: taskCheckpointNamespace,\n };\n if (forExecution) {\n const proc = processes[packet.node];\n const node = proc.getNode();\n if (node !== undefined) {\n if (proc.metadata !== undefined) {\n metadata = { ...metadata, ...proc.metadata };\n }\n const writes: [keyof Cc, unknown][] = [];\n const executionInfo: ExecutionInfo = {\n checkpointId: checkpoint.id,\n checkpointNs: taskCheckpointNamespace,\n taskId,\n threadId: configurable.thread_id as string | undefined,\n runId: config.runId != null ? String(config.runId) : undefined,\n nodeAttempt: 1,\n };\n return {\n name: packet.node,\n input: packet.args,\n proc: node,\n subgraphs: proc.subgraphs,\n writes,\n config: {\n ...patchConfig(\n mergeConfigs(config, {\n metadata,\n tags: proc.tags,\n store: extra.store ?? config.store,\n }),\n {\n runName: packet.node,\n callbacks: manager?.getChild(`graph:step:${step}`),\n configurable: {\n [CONFIG_KEY_TASK_ID]: taskId,\n [CONFIG_KEY_SEND]: (writes_: PendingWrite[]) =>\n _localWrite(\n (items: PendingWrite<keyof Cc>[]) =>\n writes.push(...items),\n processes,\n writes_\n ),\n [CONFIG_KEY_READ]: (\n select_: Array<keyof Cc> | keyof Cc,\n fresh_: boolean = false\n ) =>\n _localRead(\n checkpoint,\n channels,\n {\n name: packet.node,\n writes: writes as PendingWrite[],\n triggers,\n path: taskPath,\n },\n select_,\n fresh_\n ),\n [CONFIG_KEY_CHECKPOINTER]:\n checkpointer ?? configurable[CONFIG_KEY_CHECKPOINTER],\n [CONFIG_KEY_CHECKPOINT_MAP]: {\n ...configurable[CONFIG_KEY_CHECKPOINT_MAP],\n [parentNamespace]: checkpoint.id,\n },\n [CONFIG_KEY_SCRATCHPAD]: _scratchpad({\n pendingWrites: pendingWrites ?? [],\n taskId,\n currentTaskInput: packet.args,\n resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],\n namespaceHash: XXH3(taskCheckpointNamespace),\n }),\n [CONFIG_KEY_PREVIOUS_STATE]:\n checkpoint.channel_values[PREVIOUS],\n checkpoint_id: undefined,\n checkpoint_ns: taskCheckpointNamespace,\n },\n }\n ),\n executionInfo,\n },\n triggers,\n retry_policy: proc.retryPolicy,\n cache_key: proc.cachePolicy\n ? {\n key: XXH3(\n (proc.cachePolicy.keyFunc ?? JSON.stringify)([packet.args])\n ),\n ns: [CACHE_NS_WRITES, proc.name ?? \"__dynamic__\", packet.node],\n ttl: proc.cachePolicy.ttl,\n }\n : undefined,\n id: taskId,\n path: taskPath,\n writers: proc.getWriters(),\n } satisfies PregelExecutableTask<keyof Nn, keyof Cc>;\n }\n } else {\n return {\n id: taskId,\n name: packet.node,\n interrupts: [],\n path: taskPath,\n } satisfies PregelTaskDescription;\n }\n } else if (taskPath[0] === PULL) {\n const name = taskPath[1].toString();\n const proc = processes[name];\n if (proc === undefined) {\n return undefined;\n }\n\n // Check if this task already has successful writes in the pending writes\n if (pendingWrites?.length) {\n // Find the task ID for this node/path\n const checkpointNamespace =\n parentNamespace === \"\"\n ? name\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${name}`;\n\n const taskId = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n name,\n PULL,\n name,\n ]),\n checkpoint.id\n );\n\n // Check if there are successful writes (not ERROR) for this task ID\n const hasSuccessfulWrites = pendingWrites.some(\n (w) => w[0] === taskId && w[1] !== ERROR\n );\n\n // If task completed successfully, don't include it in next tasks\n if (hasSuccessfulWrites) {\n return undefined;\n }\n }\n\n const nullVersion = getNullChannelVersion(checkpoint.channel_versions);\n if (nullVersion === undefined) {\n return undefined;\n }\n const seen = checkpoint.versions_seen[name] ?? {};\n\n // Find the first trigger that is available and has a new version\n const trigger = proc.triggers.find((chan) => {\n if (!channels[chan].isAvailable()) return false;\n\n return (\n (checkpoint.channel_versions[chan] ?? nullVersion) >\n (seen[chan] ?? nullVersion)\n );\n });\n\n // If any of the channels read by this process were updated\n if (trigger !== undefined) {\n const val = _procInput(proc, channels, forExecution);\n if (val === undefined) {\n return undefined;\n }\n const checkpointNamespace =\n parentNamespace === \"\"\n ? name\n : `${parentNamespace}${CHECKPOINT_NAMESPACE_SEPARATOR}${name}`;\n const taskId = uuid5(\n JSON.stringify([\n checkpointNamespace,\n step.toString(),\n name,\n PULL,\n [trigger],\n ]),\n checkpoint.id\n );\n const taskCheckpointNamespace = `${checkpointNamespace}${CHECKPOINT_NAMESPACE_END}${taskId}`;\n let metadata = {\n langgraph_step: step,\n langgraph_node: name,\n langgraph_triggers: [trigger],\n langgraph_path: taskPath,\n langgraph_checkpoint_ns: taskCheckpointNamespace,\n checkpoint_ns: taskCheckpointNamespace,\n };\n if (forExecution) {\n const node = proc.getNode();\n if (node !== undefined) {\n if (proc.metadata !== undefined) {\n metadata = { ...metadata, ...proc.metadata };\n }\n const writes: [keyof Cc, unknown][] = [];\n const executionInfo: ExecutionInfo = {\n checkpointId: checkpoint.id,\n checkpointNs: taskCheckpointNamespace,\n taskId,\n threadId: configurable.thread_id as string | undefined,\n runId: config.runId != null ? String(config.runId) : undefined,\n nodeAttempt: 1,\n };\n return {\n name,\n input: val,\n proc: node,\n subgraphs: proc.subgraphs,\n writes,\n config: {\n ...patchConfig(\n mergeConfigs(config, {\n metadata,\n tags: proc.tags,\n store: extra.store ?? config.store,\n }),\n {\n runName: name,\n callbacks: manager?.getChild(`graph:step:${step}`),\n configurable: {\n [CONFIG_KEY_TASK_ID]: taskId,\n [CONFIG_KEY_SEND]: (writes_: PendingWrite[]) =>\n _localWrite(\n (items: PendingWrite<keyof Cc>[]) => {\n writes.push(...items);\n },\n processes,\n writes_\n ),\n [CONFIG_KEY_READ]: (\n select_: Array<keyof Cc> | keyof Cc,\n fresh_: boolean = false\n ) =>\n _localRead(\n checkpoint,\n channels,\n {\n name,\n writes: writes as PendingWrite[],\n triggers: [trigger],\n path: taskPath,\n },\n select_,\n fresh_\n ),\n [CONFIG_KEY_CHECKPOINTER]:\n checkpointer ?? configurable[CONFIG_KEY_CHECKPOINTER],\n [CONFIG_KEY_CHECKPOINT_MAP]: {\n ...configurable[CONFIG_KEY_CHECKPOINT_MAP],\n [parentNamespace]: checkpoint.id,\n },\n [CONFIG_KEY_SCRATCHPAD]: _scratchpad({\n pendingWrites: pendingWrites ?? [],\n taskId,\n currentTaskInput: val,\n resumeMap: config.configurable?.[CONFIG_KEY_RESUME_MAP],\n namespaceHash: XXH3(taskCheckpointNamespace),\n }),\n [CONFIG_KEY_PREVIOUS_STATE]:\n checkpoint.channel_values[PREVIOUS],\n checkpoint_id: undefined,\n checkpoint_ns: taskCheckpointNamespace,\n },\n }\n ),\n executionInfo,\n },\n triggers: [trigger],\n retry_policy: proc.retryPolicy,\n cache_key: proc.cachePolicy\n ? {\n key: XXH3(\n (proc.cachePolicy.keyFunc ?? JSON.stringify)([val])\n ),\n ns: [CACHE_NS_WRITES, proc.name ?? \"__dynamic__\", name],\n ttl: proc.cachePolicy.ttl,\n }\n : undefined,\n id: taskId,\n path: taskPath,\n writers: proc.getWriters(),\n } satisfies PregelExecutableTask<keyof Nn, keyof Cc>;\n }\n } else {\n return {\n id: taskId,\n name,\n interrupts: [],\n path: taskPath,\n } satisfies PregelTaskDescription;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Function injected under CONFIG_KEY_READ in task config, to read current state.\n * Used by conditional edges to read a copy of the state with reflecting the writes\n * from that node only.\n *\n * @internal\n */\nfunction _procInput(\n proc: PregelNode,\n channels: StrRecord<string, BaseChannel>,\n forExecution: boolean\n) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let val: any;\n\n if (typeof proc.channels === \"object\" && !Array.isArray(proc.channels)) {\n val = {};\n for (const [k, chan] of Object.entries(proc.channels)) {\n if (proc.triggers.includes(chan)) {\n try {\n val[k] = readChannel(channels, chan, false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.name === EmptyChannelError.unminifiable_name) {\n return undefined;\n } else {\n throw e;\n }\n }\n } else if (chan in channels) {\n try {\n val[k] = readChannel(channels, chan, false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.name === EmptyChannelError.unminifiable_name) {\n continue;\n } else {\n throw e;\n }\n }\n }\n }\n } else if (Array.isArray(proc.channels)) {\n let successfulRead = false;\n for (const chan of proc.channels) {\n try {\n val = readChannel(channels, chan, false);\n successfulRead = true;\n break;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.name === EmptyChannelError.unminifiable_name) {\n continue;\n } else {\n throw e;\n }\n }\n }\n if (!successfulRead) {\n return undefined;\n }\n } else {\n throw new Error(\n `Invalid channels type, expected list or dict, got ${proc.channels}`\n );\n }\n\n // If the process has a mapper, apply it to the value\n if (forExecution && proc.mapper !== undefined) {\n val = proc.mapper(val);\n }\n\n return val;\n}\n\n/**\n * Remove any values belonging to UntrackedValue channels from a Send packet\n * before checkpointing.\n *\n * Send is often called with state to be passed to the destination node,\n * which may contain UntrackedValues at the top level.\n *\n * @internal\n */\nexport function sanitizeUntrackedValuesInSend(\n packet: Send,\n channels: StrRecord<string, BaseChannel>\n): Send {\n if (typeof packet.args !== \"object\" || packet.args === null) {\n // Not a dict-like arg\n return packet;\n }\n\n // Top-level keys should be channel names\n const sanitizedArg: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(packet.args)) {\n const channel = channels[key];\n // Check if channel is an UntrackedValue by its lc_graph_name\n if (!channel || channel.lc_graph_name !== \"UntrackedValue\") {\n sanitizedArg[key] = value;\n }\n }\n\n return new Send(packet.node, sanitizedArg);\n}\n\nfunction _scratchpad({\n pendingWrites,\n taskId,\n currentTaskInput,\n resumeMap,\n namespaceHash,\n}: {\n pendingWrites: CheckpointPendingWrite[];\n taskId: string;\n currentTaskInput: unknown;\n resumeMap: Record<string, unknown> | undefined;\n namespaceHash: string;\n}): PregelScratchpad {\n const nullResume = pendingWrites.find(\n ([writeTaskId, chan]) => writeTaskId === NULL_TASK_ID && chan === RESUME\n )?.[2];\n\n const resume = (() => {\n const result = pendingWrites\n .filter(\n ([writeTaskId, chan]) => writeTaskId === taskId && chan === RESUME\n )\n .flatMap(([_writeTaskId, _chan, resume]) => resume);\n\n if (resumeMap != null && namespaceHash in resumeMap) {\n const mappedResume = resumeMap[namespaceHash];\n result.push(mappedResume);\n }\n\n return result;\n })();\n\n const scratchpad = {\n callCounter: 0,\n interruptCounter: -1,\n resume,\n nullResume,\n subgraphCounter: 0,\n currentTaskInput,\n consumeNullResume: () => {\n if (scratchpad.nullResume) {\n delete scratchpad.nullResume;\n pendingWrites.splice(\n pendingWrites.findIndex(\n ([writeTaskId, chan]) =>\n writeTaskId === NULL_TASK_ID && chan === RESUME\n ),\n 1\n );\n return nullResume;\n }\n\n return undefined;\n },\n };\n return scratchpad;\n}\n"],"mappings":"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"}
|
package/dist/pregel/index.cjs
CHANGED
|
@@ -14,13 +14,34 @@ const require_debug = require("./debug.cjs");
|
|
|
14
14
|
const require_stream = require("./stream.cjs");
|
|
15
15
|
const require_loop = require("./loop.cjs");
|
|
16
16
|
const require_messages = require("./messages.cjs");
|
|
17
|
+
const require_messages_v2 = require("./messages-v2.cjs");
|
|
17
18
|
const require_runner = require("./runner.cjs");
|
|
19
|
+
const require_convert = require("../stream/convert.cjs");
|
|
20
|
+
const require_run_stream = require("../stream/run-stream.cjs");
|
|
21
|
+
require("../stream/index.cjs");
|
|
18
22
|
const require_validate = require("./validate.cjs");
|
|
19
23
|
const require_topic = require("../channels/topic.cjs");
|
|
20
24
|
const require_interrupt = require("../interrupt.cjs");
|
|
21
25
|
let _langchain_langgraph_checkpoint = require("@langchain/langgraph-checkpoint");
|
|
22
26
|
let _langchain_core_runnables = require("@langchain/core/runnables");
|
|
27
|
+
let _langchain_core_callbacks_manager = require("@langchain/core/callbacks/manager");
|
|
23
28
|
//#region src/pregel/index.ts
|
|
29
|
+
function protocolEventsToEventStream(run) {
|
|
30
|
+
const encoder = new TextEncoder();
|
|
31
|
+
return new ReadableStream({ async start(controller) {
|
|
32
|
+
try {
|
|
33
|
+
for await (const event of run) {
|
|
34
|
+
const namespace = event.params.namespace;
|
|
35
|
+
const eventName = namespace.length ? `${event.method}|${namespace.join("|")}` : event.method;
|
|
36
|
+
controller.enqueue(encoder.encode(`event: ${eventName}\ndata: ${JSON.stringify(event.params.data ?? {})}\n\n`));
|
|
37
|
+
}
|
|
38
|
+
} catch (error) {
|
|
39
|
+
controller.enqueue(encoder.encode(`event: error\ndata: ${JSON.stringify({ message: String(error) })}\n\n`));
|
|
40
|
+
} finally {
|
|
41
|
+
controller.close();
|
|
42
|
+
}
|
|
43
|
+
} });
|
|
44
|
+
}
|
|
24
45
|
/**
|
|
25
46
|
* Utility class for working with channels in the Pregel system.
|
|
26
47
|
* Provides static methods for subscribing to channels and writing to them.
|
|
@@ -245,6 +266,12 @@ var Pregel = class extends PartialRunnable {
|
|
|
245
266
|
*/
|
|
246
267
|
userInterrupt;
|
|
247
268
|
/**
|
|
269
|
+
* Stream reducer factories registered at compile time. These run
|
|
270
|
+
* automatically for every `streamEvents(..., { version: "v3" })` call,
|
|
271
|
+
* before any call-site transformers.
|
|
272
|
+
*/
|
|
273
|
+
streamTransformers;
|
|
274
|
+
/**
|
|
248
275
|
* The trigger to node mapping for the graph run.
|
|
249
276
|
* @internal
|
|
250
277
|
*/
|
|
@@ -279,32 +306,17 @@ var Pregel = class extends PartialRunnable {
|
|
|
279
306
|
this.name = fields.name;
|
|
280
307
|
this.triggerToNodes = fields.triggerToNodes ?? this.triggerToNodes;
|
|
281
308
|
this.userInterrupt = fields.userInterrupt;
|
|
309
|
+
this.streamTransformers = fields.streamTransformers ?? [];
|
|
282
310
|
if (this.autoValidate) this.validate();
|
|
283
311
|
}
|
|
284
|
-
/**
|
|
285
|
-
* Creates a new instance of the Pregel graph with updated configuration.
|
|
286
|
-
* This method follows the immutable pattern - instead of modifying the current instance,
|
|
287
|
-
* it returns a new instance with the merged configuration.
|
|
288
|
-
*
|
|
289
|
-
* @example
|
|
290
|
-
* ```typescript
|
|
291
|
-
* // Create a new instance with debug enabled
|
|
292
|
-
* const debugGraph = graph.withConfig({ debug: true });
|
|
293
|
-
*
|
|
294
|
-
* // Create a new instance with a specific thread ID
|
|
295
|
-
* const threadGraph = graph.withConfig({
|
|
296
|
-
* configurable: { thread_id: "123" }
|
|
297
|
-
* });
|
|
298
|
-
* ```
|
|
299
|
-
*
|
|
300
|
-
* @param config - The configuration to merge with the current configuration
|
|
301
|
-
* @returns A new Pregel instance with the merged configuration
|
|
302
|
-
*/
|
|
303
312
|
withConfig(config) {
|
|
304
|
-
const
|
|
313
|
+
const { streamTransformers, ...restConfig } = config;
|
|
314
|
+
const mergedConfig = (0, _langchain_core_runnables.mergeConfigs)(this.config, restConfig);
|
|
315
|
+
const mergedStreamTransformers = [...this.streamTransformers, ...streamTransformers ?? []];
|
|
305
316
|
return new this.constructor({
|
|
306
317
|
...this,
|
|
307
|
-
config: mergedConfig
|
|
318
|
+
config: mergedConfig,
|
|
319
|
+
streamTransformers: mergedStreamTransformers
|
|
308
320
|
});
|
|
309
321
|
}
|
|
310
322
|
/**
|
|
@@ -913,7 +925,34 @@ var Pregel = class extends PartialRunnable {
|
|
|
913
925
|
const stream = await super.stream(input, config);
|
|
914
926
|
return new require_stream.IterableReadableStreamWithAbortSignal(options?.encoding === "text/event-stream" ? require_stream.toEventStream(stream) : stream, abortController);
|
|
915
927
|
}
|
|
928
|
+
async #streamEventsV3(input, options) {
|
|
929
|
+
const { version, encoding, transformers: userTransformers, ...restOptions } = options;
|
|
930
|
+
const streamOptions = {
|
|
931
|
+
recursionLimit: this.config?.recursionLimit,
|
|
932
|
+
...restOptions,
|
|
933
|
+
configurable: {
|
|
934
|
+
...this.config?.configurable,
|
|
935
|
+
...restOptions?.configurable
|
|
936
|
+
},
|
|
937
|
+
version,
|
|
938
|
+
streamMode: require_convert.STREAM_EVENTS_V3_MODES,
|
|
939
|
+
subgraphs: true,
|
|
940
|
+
encoding: void 0
|
|
941
|
+
};
|
|
942
|
+
const sourcePromise = this.stream(input, streamOptions);
|
|
943
|
+
const graphRun = require_run_stream.createGraphRunStream({ [Symbol.asyncIterator]: async function* () {
|
|
944
|
+
const src = await sourcePromise;
|
|
945
|
+
for await (const chunk of src) yield chunk;
|
|
946
|
+
} }, [...this.streamTransformers ?? [], ...userTransformers ?? []]);
|
|
947
|
+
if (encoding === "text/event-stream") {
|
|
948
|
+
const abortController = new AbortController();
|
|
949
|
+
abortController.signal.addEventListener("abort", () => graphRun.abort(abortController.signal.reason), { once: true });
|
|
950
|
+
return new require_stream.IterableReadableStreamWithAbortSignal(protocolEventsToEventStream(graphRun), abortController);
|
|
951
|
+
}
|
|
952
|
+
return graphRun;
|
|
953
|
+
}
|
|
916
954
|
streamEvents(input, options, streamOptions) {
|
|
955
|
+
if (options.version === "v3") return this.#streamEventsV3(input, options);
|
|
917
956
|
const abortController = new AbortController();
|
|
918
957
|
const config = {
|
|
919
958
|
recursionLimit: this.config?.recursionLimit,
|
|
@@ -972,7 +1011,7 @@ var Pregel = class extends PartialRunnable {
|
|
|
972
1011
|
config.configurable[require_constants.CONFIG_KEY_CHECKPOINT_NS] = ns.split("|").map((part) => part.split(":")[0]).join("|");
|
|
973
1012
|
}
|
|
974
1013
|
if (streamMode.includes("messages")) {
|
|
975
|
-
const messageStreamer = new require_messages.StreamMessagesHandler((chunk) => stream.push(chunk));
|
|
1014
|
+
const messageStreamer = options?.version === "v3" ? new require_messages_v2.StreamProtocolMessagesHandler((chunk) => stream.push(chunk)) : new require_messages.StreamMessagesHandler((chunk) => stream.push(chunk));
|
|
976
1015
|
const { callbacks } = config;
|
|
977
1016
|
if (callbacks === void 0) config.callbacks = [messageStreamer];
|
|
978
1017
|
else if (Array.isArray(callbacks)) config.callbacks = callbacks.concat(messageStreamer);
|
|
@@ -1004,7 +1043,8 @@ var Pregel = class extends PartialRunnable {
|
|
|
1004
1043
|
};
|
|
1005
1044
|
config.interrupt ??= this.userInterrupt ?? require_interrupt.interrupt;
|
|
1006
1045
|
if (config.serverInfo == null) config.serverInfo = _buildServerInfo(config);
|
|
1007
|
-
const
|
|
1046
|
+
const callbackManagerOptions = { tracerInheritableMetadata: _getTracingMetadataDefaults(config) };
|
|
1047
|
+
const runManager = await (await _langchain_core_callbacks_manager.CallbackManager._configureSync(config?.callbacks, void 0, config?.tags, void 0, config?.metadata, void 0, callbackManagerOptions))?.handleChainStart(this.toJSON(), require_index._coerceToDict(input, "input"), runId, void 0, void 0, void 0, config?.runName ?? this.getName());
|
|
1008
1048
|
const channelSpecs = require_base.getOnlyChannels(this.channels);
|
|
1009
1049
|
let loop;
|
|
1010
1050
|
let loopError;
|
|
@@ -1071,7 +1111,7 @@ var Pregel = class extends PartialRunnable {
|
|
|
1071
1111
|
try {
|
|
1072
1112
|
for await (const chunk of stream) {
|
|
1073
1113
|
if (chunk === void 0) throw new Error("Data structure error.");
|
|
1074
|
-
const [namespace, mode, payload] = chunk;
|
|
1114
|
+
const [namespace, mode, payload, meta] = chunk;
|
|
1075
1115
|
if (streamMode.includes(mode)) {
|
|
1076
1116
|
if (streamEncoding === "text/event-stream") {
|
|
1077
1117
|
if (streamSubgraphs) yield [
|
|
@@ -1086,7 +1126,12 @@ var Pregel = class extends PartialRunnable {
|
|
|
1086
1126
|
];
|
|
1087
1127
|
continue;
|
|
1088
1128
|
}
|
|
1089
|
-
if (streamSubgraphs && !streamModeSingle) yield [
|
|
1129
|
+
if (streamSubgraphs && !streamModeSingle) yield meta !== void 0 ? [
|
|
1130
|
+
namespace,
|
|
1131
|
+
mode,
|
|
1132
|
+
payload,
|
|
1133
|
+
meta
|
|
1134
|
+
] : [
|
|
1090
1135
|
namespace,
|
|
1091
1136
|
mode,
|
|
1092
1137
|
payload
|
|
@@ -1185,6 +1230,32 @@ function _buildServerInfo(config) {
|
|
|
1185
1230
|
user
|
|
1186
1231
|
};
|
|
1187
1232
|
}
|
|
1233
|
+
const OMITTED_KEYS = new Set([
|
|
1234
|
+
"key",
|
|
1235
|
+
"token",
|
|
1236
|
+
"secret",
|
|
1237
|
+
"password",
|
|
1238
|
+
"auth"
|
|
1239
|
+
]);
|
|
1240
|
+
function _excludeAsMetadata(key, value) {
|
|
1241
|
+
const keyLower = key.toLowerCase();
|
|
1242
|
+
let hasOmittedSubstring = false;
|
|
1243
|
+
for (const substr of OMITTED_KEYS) if (keyLower.includes(substr)) {
|
|
1244
|
+
hasOmittedSubstring = true;
|
|
1245
|
+
break;
|
|
1246
|
+
}
|
|
1247
|
+
return key.startsWith("__") || !(typeof value === "string" || typeof value === "number" || typeof value === "boolean") || hasOmittedSubstring;
|
|
1248
|
+
}
|
|
1249
|
+
function _getTracingMetadataDefaults(config) {
|
|
1250
|
+
const configurable = config.configurable;
|
|
1251
|
+
if (!configurable) return;
|
|
1252
|
+
const metadata = {};
|
|
1253
|
+
for (const [key, value] of Object.entries(configurable)) {
|
|
1254
|
+
if (_excludeAsMetadata(key, value)) continue;
|
|
1255
|
+
metadata[key] = value;
|
|
1256
|
+
}
|
|
1257
|
+
return Object.keys(metadata).length > 0 ? metadata : void 0;
|
|
1258
|
+
}
|
|
1188
1259
|
//#endregion
|
|
1189
1260
|
exports.Channel = Channel;
|
|
1190
1261
|
exports.Pregel = Pregel;
|