@langchain/langgraph 1.0.7 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/dist/channels/any_value.cjs.map +1 -1
  2. package/dist/channels/any_value.d.cts +0 -1
  3. package/dist/channels/any_value.d.cts.map +1 -1
  4. package/dist/channels/any_value.d.ts +0 -1
  5. package/dist/channels/any_value.d.ts.map +1 -1
  6. package/dist/channels/any_value.js.map +1 -1
  7. package/dist/channels/base.cjs +2 -3
  8. package/dist/channels/base.cjs.map +1 -1
  9. package/dist/channels/base.d.cts.map +1 -1
  10. package/dist/channels/base.d.ts.map +1 -1
  11. package/dist/channels/base.js.map +1 -1
  12. package/dist/channels/binop.cjs.map +1 -1
  13. package/dist/channels/binop.d.cts.map +1 -1
  14. package/dist/channels/binop.d.ts.map +1 -1
  15. package/dist/channels/binop.js.map +1 -1
  16. package/dist/channels/dynamic_barrier_value.cjs +0 -1
  17. package/dist/channels/dynamic_barrier_value.cjs.map +1 -1
  18. package/dist/channels/dynamic_barrier_value.d.cts +1 -3
  19. package/dist/channels/dynamic_barrier_value.d.cts.map +1 -1
  20. package/dist/channels/dynamic_barrier_value.d.ts +1 -3
  21. package/dist/channels/dynamic_barrier_value.d.ts.map +1 -1
  22. package/dist/channels/dynamic_barrier_value.js +0 -1
  23. package/dist/channels/dynamic_barrier_value.js.map +1 -1
  24. package/dist/channels/ephemeral_value.cjs.map +1 -1
  25. package/dist/channels/ephemeral_value.d.cts +0 -1
  26. package/dist/channels/ephemeral_value.d.cts.map +1 -1
  27. package/dist/channels/ephemeral_value.d.ts +0 -1
  28. package/dist/channels/ephemeral_value.d.ts.map +1 -1
  29. package/dist/channels/ephemeral_value.js.map +1 -1
  30. package/dist/channels/last_value.cjs.map +1 -1
  31. package/dist/channels/last_value.d.cts +0 -2
  32. package/dist/channels/last_value.d.cts.map +1 -1
  33. package/dist/channels/last_value.d.ts +0 -2
  34. package/dist/channels/last_value.d.ts.map +1 -1
  35. package/dist/channels/last_value.js.map +1 -1
  36. package/dist/channels/named_barrier_value.cjs +0 -2
  37. package/dist/channels/named_barrier_value.cjs.map +1 -1
  38. package/dist/channels/named_barrier_value.d.cts +2 -4
  39. package/dist/channels/named_barrier_value.d.cts.map +1 -1
  40. package/dist/channels/named_barrier_value.d.ts +2 -4
  41. package/dist/channels/named_barrier_value.d.ts.map +1 -1
  42. package/dist/channels/named_barrier_value.js +0 -2
  43. package/dist/channels/named_barrier_value.js.map +1 -1
  44. package/dist/channels/topic.cjs.map +1 -1
  45. package/dist/channels/topic.d.cts.map +1 -1
  46. package/dist/channels/topic.d.ts.map +1 -1
  47. package/dist/channels/topic.js.map +1 -1
  48. package/dist/constants.cjs.map +1 -1
  49. package/dist/constants.d.cts +2 -6
  50. package/dist/constants.d.cts.map +1 -1
  51. package/dist/constants.d.ts +2 -6
  52. package/dist/constants.d.ts.map +1 -1
  53. package/dist/constants.js.map +1 -1
  54. package/dist/errors.cjs.map +1 -1
  55. package/dist/errors.d.cts +0 -4
  56. package/dist/errors.d.cts.map +1 -1
  57. package/dist/errors.d.ts +0 -4
  58. package/dist/errors.d.ts.map +1 -1
  59. package/dist/errors.js.map +1 -1
  60. package/dist/func/index.cjs +2 -4
  61. package/dist/func/index.cjs.map +1 -1
  62. package/dist/func/index.d.cts +1 -6
  63. package/dist/func/index.d.cts.map +1 -1
  64. package/dist/func/index.d.ts +1 -6
  65. package/dist/func/index.d.ts.map +1 -1
  66. package/dist/func/index.js +1 -2
  67. package/dist/func/index.js.map +1 -1
  68. package/dist/func/types.d.cts +2 -4
  69. package/dist/func/types.d.cts.map +1 -1
  70. package/dist/func/types.d.ts +2 -4
  71. package/dist/func/types.d.ts.map +1 -1
  72. package/dist/graph/annotation.cjs.map +1 -1
  73. package/dist/graph/annotation.d.cts.map +1 -1
  74. package/dist/graph/annotation.d.ts.map +1 -1
  75. package/dist/graph/annotation.js.map +1 -1
  76. package/dist/graph/graph.cjs +15 -18
  77. package/dist/graph/graph.cjs.map +1 -1
  78. package/dist/graph/graph.d.cts +4 -28
  79. package/dist/graph/graph.d.cts.map +1 -1
  80. package/dist/graph/graph.d.ts +4 -28
  81. package/dist/graph/graph.d.ts.map +1 -1
  82. package/dist/graph/graph.js +4 -6
  83. package/dist/graph/graph.js.map +1 -1
  84. package/dist/graph/message.cjs +8 -10
  85. package/dist/graph/message.cjs.map +1 -1
  86. package/dist/graph/message.d.cts +2 -2
  87. package/dist/graph/message.d.cts.map +1 -1
  88. package/dist/graph/message.d.ts +2 -2
  89. package/dist/graph/message.d.ts.map +1 -1
  90. package/dist/graph/message.js +3 -4
  91. package/dist/graph/message.js.map +1 -1
  92. package/dist/graph/messages_annotation.cjs +1 -2
  93. package/dist/graph/messages_annotation.cjs.map +1 -1
  94. package/dist/graph/messages_annotation.d.cts +5 -5
  95. package/dist/graph/messages_annotation.d.cts.map +1 -1
  96. package/dist/graph/messages_annotation.d.ts +5 -5
  97. package/dist/graph/messages_annotation.d.ts.map +1 -1
  98. package/dist/graph/messages_annotation.js.map +1 -1
  99. package/dist/graph/state.cjs +23 -30
  100. package/dist/graph/state.cjs.map +1 -1
  101. package/dist/graph/state.d.cts +2 -9
  102. package/dist/graph/state.d.cts.map +1 -1
  103. package/dist/graph/state.d.ts +2 -9
  104. package/dist/graph/state.d.ts.map +1 -1
  105. package/dist/graph/state.js +6 -12
  106. package/dist/graph/state.js.map +1 -1
  107. package/dist/graph/zod/meta.cjs +8 -9
  108. package/dist/graph/zod/meta.cjs.map +1 -1
  109. package/dist/graph/zod/meta.d.cts +0 -1
  110. package/dist/graph/zod/meta.d.cts.map +1 -1
  111. package/dist/graph/zod/meta.d.ts +0 -1
  112. package/dist/graph/zod/meta.d.ts.map +1 -1
  113. package/dist/graph/zod/meta.js.map +1 -1
  114. package/dist/graph/zod/plugin.cjs +4 -6
  115. package/dist/graph/zod/plugin.cjs.map +1 -1
  116. package/dist/graph/zod/plugin.js +1 -2
  117. package/dist/graph/zod/plugin.js.map +1 -1
  118. package/dist/graph/zod/schema.cjs +2 -3
  119. package/dist/graph/zod/schema.cjs.map +1 -1
  120. package/dist/graph/zod/schema.d.cts.map +1 -1
  121. package/dist/graph/zod/schema.d.ts.map +1 -1
  122. package/dist/graph/zod/schema.js.map +1 -1
  123. package/dist/graph/zod/zod-registry.cjs +3 -4
  124. package/dist/graph/zod/zod-registry.cjs.map +1 -1
  125. package/dist/graph/zod/zod-registry.d.cts +0 -2
  126. package/dist/graph/zod/zod-registry.d.cts.map +1 -1
  127. package/dist/graph/zod/zod-registry.d.ts +0 -2
  128. package/dist/graph/zod/zod-registry.d.ts.map +1 -1
  129. package/dist/graph/zod/zod-registry.js.map +1 -1
  130. package/dist/hash.cjs +4 -10
  131. package/dist/hash.cjs.map +1 -1
  132. package/dist/hash.js +4 -10
  133. package/dist/hash.js.map +1 -1
  134. package/dist/index.cjs +8 -9
  135. package/dist/index.cjs.map +1 -1
  136. package/dist/index.js.map +1 -1
  137. package/dist/interrupt.cjs +4 -7
  138. package/dist/interrupt.cjs.map +1 -1
  139. package/dist/interrupt.d.cts +1 -4
  140. package/dist/interrupt.d.cts.map +1 -1
  141. package/dist/interrupt.d.ts +1 -4
  142. package/dist/interrupt.d.ts.map +1 -1
  143. package/dist/interrupt.js +2 -4
  144. package/dist/interrupt.js.map +1 -1
  145. package/dist/prebuilt/agentName.cjs +14 -19
  146. package/dist/prebuilt/agentName.cjs.map +1 -1
  147. package/dist/prebuilt/agentName.js +6 -10
  148. package/dist/prebuilt/agentName.js.map +1 -1
  149. package/dist/prebuilt/agent_executor.cjs +4 -7
  150. package/dist/prebuilt/agent_executor.cjs.map +1 -1
  151. package/dist/prebuilt/agent_executor.d.cts +5 -5
  152. package/dist/prebuilt/agent_executor.d.cts.map +1 -1
  153. package/dist/prebuilt/agent_executor.d.ts +5 -5
  154. package/dist/prebuilt/agent_executor.d.ts.map +1 -1
  155. package/dist/prebuilt/agent_executor.js +4 -7
  156. package/dist/prebuilt/agent_executor.js.map +1 -1
  157. package/dist/prebuilt/chat_agent_executor.cjs +11 -17
  158. package/dist/prebuilt/chat_agent_executor.cjs.map +1 -1
  159. package/dist/prebuilt/chat_agent_executor.d.cts.map +1 -1
  160. package/dist/prebuilt/chat_agent_executor.d.ts.map +1 -1
  161. package/dist/prebuilt/chat_agent_executor.js +7 -12
  162. package/dist/prebuilt/chat_agent_executor.js.map +1 -1
  163. package/dist/prebuilt/interrupt.d.cts +0 -1
  164. package/dist/prebuilt/interrupt.d.cts.map +1 -1
  165. package/dist/prebuilt/interrupt.d.ts +0 -1
  166. package/dist/prebuilt/interrupt.d.ts.map +1 -1
  167. package/dist/prebuilt/react_agent_executor.cjs +35 -40
  168. package/dist/prebuilt/react_agent_executor.cjs.map +1 -1
  169. package/dist/prebuilt/react_agent_executor.d.cts +8 -27
  170. package/dist/prebuilt/react_agent_executor.d.cts.map +1 -1
  171. package/dist/prebuilt/react_agent_executor.d.ts +8 -27
  172. package/dist/prebuilt/react_agent_executor.d.ts.map +1 -1
  173. package/dist/prebuilt/react_agent_executor.js +8 -12
  174. package/dist/prebuilt/react_agent_executor.js.map +1 -1
  175. package/dist/prebuilt/tool_executor.cjs +4 -9
  176. package/dist/prebuilt/tool_executor.cjs.map +1 -1
  177. package/dist/prebuilt/tool_executor.d.cts +0 -2
  178. package/dist/prebuilt/tool_executor.d.cts.map +1 -1
  179. package/dist/prebuilt/tool_executor.d.ts +0 -2
  180. package/dist/prebuilt/tool_executor.d.ts.map +1 -1
  181. package/dist/prebuilt/tool_executor.js +1 -5
  182. package/dist/prebuilt/tool_executor.js.map +1 -1
  183. package/dist/prebuilt/tool_node.cjs +7 -8
  184. package/dist/prebuilt/tool_node.cjs.map +1 -1
  185. package/dist/prebuilt/tool_node.d.cts +0 -2
  186. package/dist/prebuilt/tool_node.d.cts.map +1 -1
  187. package/dist/prebuilt/tool_node.d.ts +0 -2
  188. package/dist/prebuilt/tool_node.d.ts.map +1 -1
  189. package/dist/prebuilt/tool_node.js.map +1 -1
  190. package/dist/pregel/algo.cjs +33 -41
  191. package/dist/pregel/algo.cjs.map +1 -1
  192. package/dist/pregel/algo.d.cts.map +1 -1
  193. package/dist/pregel/algo.d.ts.map +1 -1
  194. package/dist/pregel/algo.js +22 -29
  195. package/dist/pregel/algo.js.map +1 -1
  196. package/dist/pregel/call.cjs +11 -14
  197. package/dist/pregel/call.cjs.map +1 -1
  198. package/dist/pregel/call.js +7 -9
  199. package/dist/pregel/call.js.map +1 -1
  200. package/dist/pregel/debug.cjs +6 -9
  201. package/dist/pregel/debug.cjs.map +1 -1
  202. package/dist/pregel/debug.js +6 -9
  203. package/dist/pregel/debug.js.map +1 -1
  204. package/dist/pregel/index.cjs +28 -35
  205. package/dist/pregel/index.cjs.map +1 -1
  206. package/dist/pregel/index.d.cts +6 -54
  207. package/dist/pregel/index.d.cts.map +1 -1
  208. package/dist/pregel/index.d.ts +6 -54
  209. package/dist/pregel/index.d.ts.map +1 -1
  210. package/dist/pregel/index.js +10 -16
  211. package/dist/pregel/index.js.map +1 -1
  212. package/dist/pregel/io.cjs.map +1 -1
  213. package/dist/pregel/io.js.map +1 -1
  214. package/dist/pregel/loop.cjs +9 -12
  215. package/dist/pregel/loop.cjs.map +1 -1
  216. package/dist/pregel/loop.js +2 -4
  217. package/dist/pregel/loop.js.map +1 -1
  218. package/dist/pregel/messages.cjs +13 -14
  219. package/dist/pregel/messages.cjs.map +1 -1
  220. package/dist/pregel/messages.js.map +1 -1
  221. package/dist/pregel/read.cjs +7 -8
  222. package/dist/pregel/read.cjs.map +1 -1
  223. package/dist/pregel/read.d.cts +0 -6
  224. package/dist/pregel/read.d.cts.map +1 -1
  225. package/dist/pregel/read.d.ts +0 -6
  226. package/dist/pregel/read.d.ts.map +1 -1
  227. package/dist/pregel/read.js +1 -1
  228. package/dist/pregel/read.js.map +1 -1
  229. package/dist/pregel/remote.cjs +24 -32
  230. package/dist/pregel/remote.cjs.map +1 -1
  231. package/dist/pregel/remote.d.cts +1 -6
  232. package/dist/pregel/remote.d.cts.map +1 -1
  233. package/dist/pregel/remote.d.ts +1 -6
  234. package/dist/pregel/remote.d.ts.map +1 -1
  235. package/dist/pregel/remote.js +12 -19
  236. package/dist/pregel/remote.js.map +1 -1
  237. package/dist/pregel/retry.cjs +1 -2
  238. package/dist/pregel/retry.cjs.map +1 -1
  239. package/dist/pregel/retry.js +1 -2
  240. package/dist/pregel/retry.js.map +1 -1
  241. package/dist/pregel/runnable_types.d.cts +2 -8
  242. package/dist/pregel/runnable_types.d.cts.map +1 -1
  243. package/dist/pregel/runnable_types.d.ts +2 -8
  244. package/dist/pregel/runnable_types.d.ts.map +1 -1
  245. package/dist/pregel/runner.cjs +1 -1
  246. package/dist/pregel/runner.cjs.map +1 -1
  247. package/dist/pregel/runner.js +1 -1
  248. package/dist/pregel/runner.js.map +1 -1
  249. package/dist/pregel/stream.cjs +4 -6
  250. package/dist/pregel/stream.cjs.map +1 -1
  251. package/dist/pregel/stream.js +1 -2
  252. package/dist/pregel/stream.js.map +1 -1
  253. package/dist/pregel/types.d.cts +5 -18
  254. package/dist/pregel/types.d.cts.map +1 -1
  255. package/dist/pregel/types.d.ts +5 -18
  256. package/dist/pregel/types.d.ts.map +1 -1
  257. package/dist/pregel/utils/config.cjs +6 -7
  258. package/dist/pregel/utils/config.cjs.map +1 -1
  259. package/dist/pregel/utils/config.d.cts.map +1 -1
  260. package/dist/pregel/utils/config.d.ts.map +1 -1
  261. package/dist/pregel/utils/config.js.map +1 -1
  262. package/dist/pregel/utils/index.cjs +1 -2
  263. package/dist/pregel/utils/index.cjs.map +1 -1
  264. package/dist/pregel/utils/index.d.cts +1 -1
  265. package/dist/pregel/utils/index.d.cts.map +1 -1
  266. package/dist/pregel/utils/index.d.ts +1 -1
  267. package/dist/pregel/utils/index.d.ts.map +1 -1
  268. package/dist/pregel/utils/index.js +1 -2
  269. package/dist/pregel/utils/index.js.map +1 -1
  270. package/dist/pregel/utils/subgraph.cjs +0 -1
  271. package/dist/pregel/utils/subgraph.cjs.map +1 -1
  272. package/dist/pregel/utils/subgraph.js +0 -1
  273. package/dist/pregel/utils/subgraph.js.map +1 -1
  274. package/dist/pregel/validate.cjs.map +1 -1
  275. package/dist/pregel/validate.js.map +1 -1
  276. package/dist/pregel/write.cjs +2 -3
  277. package/dist/pregel/write.cjs.map +1 -1
  278. package/dist/pregel/write.d.cts +1 -5
  279. package/dist/pregel/write.d.cts.map +1 -1
  280. package/dist/pregel/write.d.ts +1 -5
  281. package/dist/pregel/write.d.ts.map +1 -1
  282. package/dist/pregel/write.js.map +1 -1
  283. package/dist/setup/async_local_storage.cjs +3 -4
  284. package/dist/setup/async_local_storage.cjs.map +1 -1
  285. package/dist/setup/async_local_storage.js.map +1 -1
  286. package/dist/utils.cjs +9 -11
  287. package/dist/utils.cjs.map +1 -1
  288. package/dist/utils.d.cts +1 -8
  289. package/dist/utils.d.cts.map +1 -1
  290. package/dist/utils.d.ts +1 -8
  291. package/dist/utils.d.ts.map +1 -1
  292. package/dist/utils.js +1 -2
  293. package/dist/utils.js.map +1 -1
  294. package/dist/web.cjs +8 -9
  295. package/dist/writer.cjs +2 -3
  296. package/dist/writer.cjs.map +1 -1
  297. package/dist/writer.d.cts +1 -2
  298. package/dist/writer.d.cts.map +1 -1
  299. package/dist/writer.d.ts +1 -2
  300. package/dist/writer.d.ts.map +1 -1
  301. package/dist/writer.js.map +1 -1
  302. package/package.json +7 -7
  303. package/CHANGELOG.md +0 -286
  304. package/dist/_virtual/rolldown_runtime.cjs +0 -25
@@ -1 +1 @@
1
- {"version":3,"file":"loop.js","names":["saved: CheckpointTuple","matched: {\n task: PregelExecutableTask<string, string>;\n result: unknown;\n }[]","keys: CacheFullKey[]","keyMap: Record<string, PregelExecutableTask<string, string>>","task","writes: { [key: string]: PendingWrite[] }","byTask: Record<string, PendingWrite<string>[]>"],"sources":["../../src/pregel/loop.ts"],"sourcesContent":["import type { RunnableConfig } from \"@langchain/core/runnables\";\nimport type { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport {\n BaseCheckpointSaver,\n Checkpoint,\n CheckpointTuple,\n copyCheckpoint,\n emptyCheckpoint,\n PendingWrite,\n CheckpointPendingWrite,\n CheckpointMetadata,\n All,\n BaseStore,\n AsyncBatchedStore,\n WRITES_IDX_MAP,\n BaseCache,\n CacheFullKey,\n CacheNamespace,\n} from \"@langchain/langgraph-checkpoint\";\n\nimport {\n BaseChannel,\n createCheckpoint,\n emptyChannels,\n} from \"../channels/base.js\";\nimport type {\n Call,\n CallTaskPath,\n Durability,\n PregelExecutableTask,\n PregelScratchpad,\n StreamMode,\n} from \"./types.js\";\nimport {\n isCommand,\n CHECKPOINT_NAMESPACE_SEPARATOR,\n Command,\n CONFIG_KEY_CHECKPOINT_MAP,\n CONFIG_KEY_READ,\n CONFIG_KEY_RESUMING,\n CONFIG_KEY_STREAM,\n ERROR,\n INPUT,\n INTERRUPT,\n NULL_TASK_ID,\n RESUME,\n TAG_HIDDEN,\n PUSH,\n CONFIG_KEY_SCRATCHPAD,\n CONFIG_KEY_CHECKPOINT_NS,\n CHECKPOINT_NAMESPACE_END,\n CONFIG_KEY_CHECKPOINT_ID,\n CONFIG_KEY_RESUME_MAP,\n START,\n} from \"../constants.js\";\nimport {\n _applyWrites,\n _prepareNextTasks,\n _prepareSingleTask,\n increment,\n shouldInterrupt,\n WritesProtocol,\n} from \"./algo.js\";\nimport {\n gatherIterator,\n gatherIteratorSync,\n prefixGenerator,\n} from \"../utils.js\";\nimport {\n mapCommand,\n mapInput,\n mapOutputUpdates,\n mapOutputValues,\n readChannels,\n} from \"./io.js\";\nimport {\n EmptyInputError,\n GraphInterrupt,\n isGraphInterrupt,\n} from \"../errors.js\";\nimport { getNewChannelVersions, patchConfigurable } from \"./utils/index.js\";\nimport {\n mapDebugTasks,\n mapDebugCheckpoint,\n mapDebugTaskResults,\n printStepTasks,\n} from \"./debug.js\";\nimport { PregelNode } from \"./read.js\";\nimport { LangGraphRunnableConfig } from \"./runnable_types.js\";\nimport { IterableReadableWritableStream, StreamChunk } from \"./stream.js\";\nimport { isXXH3 } from \"../hash.js\";\n\nconst INPUT_DONE = Symbol.for(\"INPUT_DONE\");\nconst INPUT_RESUMING = Symbol.for(\"INPUT_RESUMING\");\nconst DEFAULT_LOOP_LIMIT = 25;\n\nexport type PregelLoopInitializeParams = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input?: any | Command;\n config: RunnableConfig;\n checkpointer?: BaseCheckpointSaver;\n outputKeys: string | string[];\n streamKeys: string | string[];\n nodes: Record<string, PregelNode>;\n channelSpecs: Record<string, BaseChannel>;\n stream: IterableReadableWritableStream;\n store?: BaseStore;\n cache?: BaseCache<PendingWrite<string>[]>;\n interruptAfter: string[] | All;\n interruptBefore: string[] | All;\n durability: Durability;\n manager?: CallbackManagerForChainRun;\n debug: boolean;\n triggerToNodes: Record<string, string[]>;\n};\n\ntype PregelLoopParams = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input?: any | Command;\n config: RunnableConfig;\n checkpointer?: BaseCheckpointSaver;\n checkpoint: Checkpoint;\n checkpointMetadata: CheckpointMetadata;\n checkpointPreviousVersions: Record<string, string | number>;\n checkpointPendingWrites: CheckpointPendingWrite[];\n checkpointConfig: RunnableConfig;\n channels: Record<string, BaseChannel>;\n step: number;\n stop: number;\n outputKeys: string | string[];\n streamKeys: string | string[];\n nodes: Record<string, PregelNode>;\n checkpointNamespace: string[];\n skipDoneTasks: boolean;\n isNested: boolean;\n manager?: CallbackManagerForChainRun;\n stream: IterableReadableWritableStream;\n store?: AsyncBatchedStore;\n cache?: BaseCache<PendingWrite<string>[]>;\n prevCheckpointConfig: RunnableConfig | undefined;\n interruptAfter: string[] | All;\n interruptBefore: string[] | All;\n durability: Durability;\n debug: boolean;\n triggerToNodes: Record<string, string[]>;\n};\n\nfunction createDuplexStream(...streams: IterableReadableWritableStream[]) {\n return new IterableReadableWritableStream({\n passthroughFn: (value: StreamChunk) => {\n for (const stream of streams) {\n if (stream.modes.has(value[1])) {\n stream.push(value);\n }\n }\n },\n modes: new Set(streams.flatMap((s) => Array.from(s.modes))),\n });\n}\n\nclass AsyncBatchedCache extends BaseCache<PendingWrite<string>[]> {\n protected cache: BaseCache<PendingWrite<string>[]>;\n\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(cache: BaseCache<unknown>) {\n super();\n this.cache = cache as BaseCache<PendingWrite<string>[]>;\n }\n\n async get(keys: CacheFullKey[]) {\n return this.enqueueOperation(\"get\", keys);\n }\n\n async set(\n pairs: {\n key: CacheFullKey;\n value: PendingWrite<string>[];\n ttl?: number;\n }[]\n ) {\n return this.enqueueOperation(\"set\", pairs);\n }\n\n async clear(namespaces: CacheNamespace[]) {\n return this.enqueueOperation(\"clear\", namespaces);\n }\n\n async stop() {\n await this.queue;\n }\n\n private enqueueOperation<Type extends \"get\" | \"set\" | \"clear\">(\n type: Type,\n ...args: Parameters<(typeof this.cache)[Type]>\n ) {\n const newPromise = this.queue.then(() => {\n // @ts-expect-error Tuple type warning\n return this.cache[type](...args) as Promise<\n ReturnType<(typeof this.cache)[Type]>\n >;\n });\n\n this.queue = newPromise.then(\n () => void 0,\n () => void 0\n );\n\n return newPromise;\n }\n}\n\nexport class PregelLoop {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected input?: any | Command;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n output: any;\n\n config: LangGraphRunnableConfig;\n\n protected checkpointer?: BaseCheckpointSaver;\n\n protected checkpointerGetNextVersion: (current: number | undefined) => number;\n\n channels: Record<string, BaseChannel>;\n\n protected checkpoint: Checkpoint;\n\n protected checkpointIdSaved: string | undefined;\n\n protected checkpointConfig: RunnableConfig;\n\n checkpointMetadata: CheckpointMetadata;\n\n protected checkpointNamespace: string[];\n\n protected checkpointPendingWrites: CheckpointPendingWrite[] = [];\n\n protected checkpointPreviousVersions: Record<string, string | number>;\n\n step: number;\n\n protected stop: number;\n\n protected durability: Durability;\n\n protected outputKeys: string | string[];\n\n protected streamKeys: string | string[];\n\n protected nodes: Record<string, PregelNode>;\n\n protected skipDoneTasks: boolean;\n\n protected prevCheckpointConfig: RunnableConfig | undefined;\n\n protected updatedChannels: Set<string> | undefined;\n\n status:\n | \"pending\"\n | \"done\"\n | \"interrupt_before\"\n | \"interrupt_after\"\n | \"out_of_steps\" = \"pending\";\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tasks: Record<string, PregelExecutableTask<any, any>> = {};\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n stream: IterableReadableWritableStream;\n\n checkpointerPromises: Promise<unknown>[] = [];\n\n isNested: boolean;\n\n protected _checkpointerChainedPromise: Promise<unknown> = Promise.resolve();\n\n store?: AsyncBatchedStore;\n\n cache?: AsyncBatchedCache;\n\n manager?: CallbackManagerForChainRun;\n\n interruptAfter: string[] | All;\n\n interruptBefore: string[] | All;\n\n toInterrupt: PregelExecutableTask<string, string>[] = [];\n\n debug: boolean = false;\n\n triggerToNodes: Record<string, string[]>;\n\n get isResuming() {\n let hasChannelVersions = false;\n if (START in this.checkpoint.channel_versions) {\n // For common channels, we can short-circuit the check\n hasChannelVersions = true;\n } else {\n for (const chan in this.checkpoint.channel_versions) {\n if (\n Object.prototype.hasOwnProperty.call(\n this.checkpoint.channel_versions,\n chan\n )\n ) {\n hasChannelVersions = true;\n break;\n }\n }\n }\n\n const configHasResumingFlag =\n this.config.configurable?.[CONFIG_KEY_RESUMING] !== undefined;\n const configIsResuming =\n configHasResumingFlag && this.config.configurable?.[CONFIG_KEY_RESUMING];\n\n const inputIsNullOrUndefined =\n this.input === null || this.input === undefined;\n const inputIsCommandResuming =\n isCommand(this.input) && this.input.resume != null;\n const inputIsResuming = this.input === INPUT_RESUMING;\n\n const runIdMatchesPrevious =\n !this.isNested &&\n this.config.metadata?.run_id !== undefined &&\n (this.checkpointMetadata as { run_id?: unknown })?.run_id !== undefined &&\n this.config.metadata.run_id ===\n (this.checkpointMetadata as { run_id?: unknown })?.run_id;\n\n return (\n hasChannelVersions &&\n (configIsResuming ||\n inputIsNullOrUndefined ||\n inputIsCommandResuming ||\n inputIsResuming ||\n runIdMatchesPrevious)\n );\n }\n\n constructor(params: PregelLoopParams) {\n this.input = params.input;\n this.checkpointer = params.checkpointer;\n // TODO: if managed values no longer needs graph we can replace with\n // managed_specs, channel_specs\n if (this.checkpointer !== undefined) {\n this.checkpointerGetNextVersion = this.checkpointer.getNextVersion.bind(\n this.checkpointer\n );\n } else {\n this.checkpointerGetNextVersion = increment;\n }\n this.checkpoint = params.checkpoint;\n this.checkpointMetadata = params.checkpointMetadata;\n this.checkpointPreviousVersions = params.checkpointPreviousVersions;\n this.channels = params.channels;\n this.checkpointPendingWrites = params.checkpointPendingWrites;\n this.step = params.step;\n this.stop = params.stop;\n this.config = params.config;\n this.checkpointConfig = params.checkpointConfig;\n this.isNested = params.isNested;\n this.manager = params.manager;\n this.outputKeys = params.outputKeys;\n this.streamKeys = params.streamKeys;\n this.nodes = params.nodes;\n this.skipDoneTasks = params.skipDoneTasks;\n this.store = params.store;\n this.cache = params.cache ? new AsyncBatchedCache(params.cache) : undefined;\n this.stream = params.stream;\n this.checkpointNamespace = params.checkpointNamespace;\n this.prevCheckpointConfig = params.prevCheckpointConfig;\n this.interruptAfter = params.interruptAfter;\n this.interruptBefore = params.interruptBefore;\n this.durability = params.durability;\n this.debug = params.debug;\n this.triggerToNodes = params.triggerToNodes;\n }\n\n static async initialize(params: PregelLoopInitializeParams) {\n let { config, stream } = params;\n if (\n stream !== undefined &&\n config.configurable?.[CONFIG_KEY_STREAM] !== undefined\n ) {\n stream = createDuplexStream(\n stream,\n config.configurable[CONFIG_KEY_STREAM]\n );\n }\n const skipDoneTasks = config.configurable\n ? !(\"checkpoint_id\" in config.configurable)\n : true;\n\n const scratchpad = config.configurable?.[CONFIG_KEY_SCRATCHPAD] as\n | PregelScratchpad\n | undefined;\n\n if (config.configurable && scratchpad) {\n if (scratchpad.subgraphCounter > 0) {\n config = patchConfigurable(config, {\n [CONFIG_KEY_CHECKPOINT_NS]: [\n config.configurable[CONFIG_KEY_CHECKPOINT_NS],\n scratchpad.subgraphCounter.toString(),\n ].join(CHECKPOINT_NAMESPACE_SEPARATOR),\n });\n }\n\n scratchpad.subgraphCounter += 1;\n }\n\n const isNested = CONFIG_KEY_READ in (config.configurable ?? {});\n if (\n !isNested &&\n config.configurable?.checkpoint_ns !== undefined &&\n config.configurable?.checkpoint_ns !== \"\"\n ) {\n config = patchConfigurable(config, {\n checkpoint_ns: \"\",\n checkpoint_id: undefined,\n });\n }\n let checkpointConfig = config;\n if (\n config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP] !== undefined &&\n config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP]?.[\n config.configurable?.checkpoint_ns\n ]\n ) {\n checkpointConfig = patchConfigurable(config, {\n checkpoint_id:\n config.configurable[CONFIG_KEY_CHECKPOINT_MAP][\n config.configurable?.checkpoint_ns\n ],\n });\n }\n const checkpointNamespace =\n config.configurable?.checkpoint_ns?.split(\n CHECKPOINT_NAMESPACE_SEPARATOR\n ) ?? [];\n\n const saved: CheckpointTuple = (await params.checkpointer?.getTuple(\n checkpointConfig\n )) ?? {\n config,\n checkpoint: emptyCheckpoint(),\n metadata: { source: \"input\", step: -2, parents: {} },\n pendingWrites: [],\n };\n checkpointConfig = {\n ...config,\n ...saved.config,\n configurable: {\n checkpoint_ns: \"\",\n ...config.configurable,\n ...saved.config.configurable,\n },\n };\n const prevCheckpointConfig = saved.parentConfig;\n const checkpoint = copyCheckpoint(saved.checkpoint);\n const checkpointMetadata = { ...saved.metadata } as CheckpointMetadata;\n const checkpointPendingWrites = saved.pendingWrites ?? [];\n\n const channels = emptyChannels(params.channelSpecs, checkpoint);\n\n const step = (checkpointMetadata.step ?? 0) + 1;\n const stop = step + (config.recursionLimit ?? DEFAULT_LOOP_LIMIT) + 1;\n const checkpointPreviousVersions = { ...checkpoint.channel_versions };\n\n const store = params.store\n ? new AsyncBatchedStore(params.store)\n : undefined;\n\n if (store) {\n // Start the store. This is a batch store, so it will run continuously\n await store.start();\n }\n return new PregelLoop({\n input: params.input,\n config,\n checkpointer: params.checkpointer,\n checkpoint,\n checkpointMetadata,\n checkpointConfig,\n prevCheckpointConfig,\n checkpointNamespace,\n channels,\n isNested,\n manager: params.manager,\n skipDoneTasks,\n step,\n stop,\n checkpointPreviousVersions,\n checkpointPendingWrites,\n outputKeys: params.outputKeys ?? [],\n streamKeys: params.streamKeys ?? [],\n nodes: params.nodes,\n stream,\n store,\n cache: params.cache,\n interruptAfter: params.interruptAfter,\n interruptBefore: params.interruptBefore,\n durability: params.durability,\n debug: params.debug,\n triggerToNodes: params.triggerToNodes,\n });\n }\n\n protected _checkpointerPutAfterPrevious(input: {\n config: RunnableConfig;\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n newVersions: Record<string, string | number>;\n }) {\n this._checkpointerChainedPromise = this._checkpointerChainedPromise.then(\n () => {\n return this.checkpointer?.put(\n input.config,\n input.checkpoint,\n input.metadata,\n input.newVersions\n );\n }\n );\n this.checkpointerPromises.push(this._checkpointerChainedPromise);\n }\n\n /**\n * Put writes for a task, to be read by the next tick.\n * @param taskId\n * @param writes\n */\n putWrites(taskId: string, writes: PendingWrite<string>[]) {\n let writesCopy = writes;\n if (writesCopy.length === 0) return;\n\n // deduplicate writes to special channels, last write wins\n if (writesCopy.every(([key]) => key in WRITES_IDX_MAP)) {\n writesCopy = Array.from(\n new Map(writesCopy.map((w) => [w[0], w])).values()\n );\n }\n\n // 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 writesCopy) {\n this.checkpointPendingWrites.push([taskId, c, v]);\n }\n\n const config = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]: this.config.configurable?.checkpoint_ns ?? \"\",\n [CONFIG_KEY_CHECKPOINT_ID]: this.checkpoint.id,\n });\n\n if (this.durability !== \"exit\" && this.checkpointer != null) {\n this.checkpointerPromises.push(\n this.checkpointer.putWrites(config, writesCopy, 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 (task.path?.[0] === PUSH && task.path?.at(-1) === true) return;\n\n const interruptWrites = writes\n .filter((w) => w[0] === INTERRUPT)\n .flatMap((w) => w[1] as string[]);\n\n this._emit([\n [\"updates\", { [INTERRUPT]: interruptWrites }],\n [\"values\", { [INTERRUPT]: interruptWrites }],\n ]);\n } else if (writes[0][0] !== ERROR) {\n this._emit(\n gatherIteratorSync(\n prefixGenerator(\n mapOutputUpdates(this.outputKeys, [[task, writes]], cached),\n \"updates\"\n )\n )\n );\n }\n }\n if (!cached) {\n this._emit(\n gatherIteratorSync(\n prefixGenerator(\n mapDebugTaskResults([[task, writes]], this.streamKeys),\n \"tasks\"\n )\n )\n );\n }\n }\n }\n\n async _matchCachedWrites() {\n if (!this.cache) return [];\n\n const matched: {\n task: PregelExecutableTask<string, string>;\n result: unknown;\n }[] = [];\n\n const serializeKey = ([ns, key]: CacheFullKey) => {\n return `ns:${ns.join(\",\")}|key:${key}`;\n };\n\n const keys: CacheFullKey[] = [];\n const keyMap: Record<string, PregelExecutableTask<string, string>> = {};\n\n for (const task of Object.values(this.tasks)) {\n if (task.cache_key != null && !task.writes.length) {\n keys.push([task.cache_key.ns, task.cache_key.key]);\n keyMap[serializeKey([task.cache_key.ns, task.cache_key.key])] = task;\n }\n }\n\n if (keys.length === 0) return [];\n const cache = await this.cache.get(keys);\n\n for (const { key, value } of cache) {\n const task = keyMap[serializeKey(key)];\n if (task != null) {\n // update the task with the cached writes\n task.writes.push(...value);\n matched.push({ task, result: value });\n }\n }\n\n return matched;\n }\n\n /**\n * Execute a single iteration of the Pregel loop.\n * Returns true if more iterations are needed.\n * @param params\n */\n async tick(params: { inputKeys?: string | string[] }): Promise<boolean> {\n if (this.store && !this.store.isRunning) {\n await this.store?.start();\n }\n const { inputKeys = [] } = params;\n if (this.status !== \"pending\") {\n throw new Error(\n `Cannot tick when status is no longer \"pending\". Current status: \"${this.status}\"`\n );\n }\n if (![INPUT_DONE, INPUT_RESUMING].includes(this.input)) {\n await this._first(inputKeys);\n } else if (this.toInterrupt.length > 0) {\n this.status = \"interrupt_before\";\n throw new GraphInterrupt();\n } else if (\n Object.values(this.tasks).every((task) => task.writes.length > 0)\n ) {\n // finish superstep\n const writes = Object.values(this.tasks).flatMap((t) => t.writes);\n // All tasks have finished\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n Object.values(this.tasks),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n // produce values output\n const valuesOutput = await gatherIterator(\n prefixGenerator(\n mapOutputValues(this.outputKeys, writes, this.channels),\n \"values\"\n )\n );\n this._emit(valuesOutput);\n // clear pending writes\n this.checkpointPendingWrites = [];\n await this._putCheckpoint({ source: \"loop\" });\n // after execution, check if we should interrupt\n if (\n shouldInterrupt(\n this.checkpoint,\n this.interruptAfter,\n Object.values(this.tasks)\n )\n ) {\n this.status = \"interrupt_after\";\n throw new GraphInterrupt();\n }\n\n // unset resuming flag\n if (this.config.configurable?.[CONFIG_KEY_RESUMING] !== undefined) {\n delete this.config.configurable?.[CONFIG_KEY_RESUMING];\n }\n } else {\n return false;\n }\n if (this.step > this.stop) {\n this.status = \"out_of_steps\";\n return false;\n }\n\n const nextTasks = _prepareNextTasks(\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n this.config,\n true,\n {\n step: this.step,\n checkpointer: this.checkpointer,\n isResuming: this.isResuming,\n manager: this.manager,\n store: this.store,\n stream: this.stream,\n triggerToNodes: this.triggerToNodes,\n updatedChannels: this.updatedChannels,\n }\n );\n this.tasks = nextTasks;\n\n // Produce debug output\n if (this.checkpointer) {\n this._emit(\n await gatherIterator(\n prefixGenerator(\n mapDebugCheckpoint(\n this.checkpointConfig,\n this.channels,\n this.streamKeys,\n this.checkpointMetadata,\n Object.values(this.tasks),\n this.checkpointPendingWrites,\n this.prevCheckpointConfig,\n this.outputKeys\n ),\n \"checkpoints\"\n )\n )\n );\n }\n\n if (Object.values(this.tasks).length === 0) {\n this.status = \"done\";\n return false;\n }\n // if there are pending writes from a previous loop, apply them\n if (this.skipDoneTasks && this.checkpointPendingWrites.length > 0) {\n for (const [tid, k, v] of this.checkpointPendingWrites) {\n if (k === ERROR || k === INTERRUPT || k === RESUME) {\n continue;\n }\n const task = Object.values(this.tasks).find((t) => t.id === tid);\n if (task) {\n task.writes.push([k, v]);\n }\n }\n for (const task of Object.values(this.tasks)) {\n if (task.writes.length > 0) {\n this._outputWrites(task.id, task.writes, true);\n }\n }\n }\n // if all tasks have finished, re-tick\n if (Object.values(this.tasks).every((task) => task.writes.length > 0)) {\n return this.tick({ inputKeys });\n }\n\n // Before execution, check if we should interrupt\n if (\n shouldInterrupt(\n this.checkpoint,\n this.interruptBefore,\n Object.values(this.tasks)\n )\n ) {\n this.status = \"interrupt_before\";\n throw new GraphInterrupt();\n }\n\n // Produce debug output\n const debugOutput = await gatherIterator(\n prefixGenerator(mapDebugTasks(Object.values(this.tasks)), \"tasks\")\n );\n this._emit(debugOutput);\n\n return true;\n }\n\n async finishAndHandleError(error?: Error) {\n // persist current checkpoint and writes\n if (\n this.durability === \"exit\" &&\n // if it's a top graph\n (!this.isNested ||\n // or a nested graph with error or interrupt\n typeof error !== \"undefined\" ||\n // or a nested graph with checkpointer: true\n this.checkpointNamespace.every(\n (part) => !part.includes(CHECKPOINT_NAMESPACE_END)\n ))\n ) {\n this._putCheckpoint(this.checkpointMetadata);\n this._flushPendingWrites();\n }\n\n const suppress = this._suppressInterrupt(error);\n if (suppress || error === undefined) {\n this.output = readChannels(this.channels, this.outputKeys);\n }\n if (suppress) {\n // emit one last \"values\" event, with pending writes applied\n if (\n this.tasks !== undefined &&\n this.checkpointPendingWrites.length > 0 &&\n Object.values(this.tasks).some((task) => task.writes.length > 0)\n ) {\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n Object.values(this.tasks),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n\n this._emit(\n gatherIteratorSync(\n prefixGenerator(\n mapOutputValues(\n this.outputKeys,\n Object.values(this.tasks).flatMap((t) => t.writes),\n this.channels\n ),\n \"values\"\n )\n )\n );\n }\n\n // Emit INTERRUPT event\n if (isGraphInterrupt(error) && !error.interrupts.length) {\n this._emit([\n [\"updates\", { [INTERRUPT]: [] }],\n [\"values\", { [INTERRUPT]: [] }],\n ]);\n }\n }\n return suppress;\n }\n\n async acceptPush(\n task: PregelExecutableTask<string, string>,\n writeIdx: number,\n call?: Call\n ): Promise<PregelExecutableTask<string, string> | void> {\n if (\n this.interruptAfter?.length > 0 &&\n shouldInterrupt(this.checkpoint, this.interruptAfter, [task])\n ) {\n this.toInterrupt.push(task);\n return;\n }\n\n const pushed = _prepareSingleTask(\n [PUSH, task.path ?? [], writeIdx, task.id, call] as CallTaskPath,\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n task.config ?? {},\n true,\n {\n step: this.step,\n checkpointer: this.checkpointer,\n manager: this.manager,\n store: this.store,\n stream: this.stream,\n }\n );\n\n if (!pushed) return;\n if (\n this.interruptBefore?.length > 0 &&\n shouldInterrupt(this.checkpoint, this.interruptBefore, [pushed])\n ) {\n this.toInterrupt.push(pushed);\n return;\n }\n\n this._emit(\n gatherIteratorSync(prefixGenerator(mapDebugTasks([pushed]), \"tasks\"))\n );\n\n if (this.debug) printStepTasks(this.step, [pushed]);\n this.tasks[pushed.id] = pushed;\n if (this.skipDoneTasks) this._matchWrites({ [pushed.id]: pushed });\n\n const tasks = await this._matchCachedWrites();\n for (const { task } of tasks) {\n this._outputWrites(task.id, task.writes, true);\n }\n\n return pushed;\n }\n\n protected _suppressInterrupt(e?: Error): boolean {\n return isGraphInterrupt(e) && !this.isNested;\n }\n\n protected async _first(inputKeys: string | string[]) {\n /*\n * Resuming from previous checkpoint requires\n * - finding a previous checkpoint\n * - receiving null input (outer graph) or RESUMING flag (subgraph)\n */\n\n const { configurable } = this.config;\n\n // take resume value from parent\n const scratchpad = configurable?.[\n CONFIG_KEY_SCRATCHPAD\n ] as PregelScratchpad;\n\n if (scratchpad && scratchpad.nullResume !== undefined) {\n this.putWrites(NULL_TASK_ID, [[RESUME, scratchpad.nullResume]]);\n }\n\n // map command to writes\n if (isCommand(this.input)) {\n const hasResume = this.input.resume != null;\n\n if (\n this.input.resume != null &&\n typeof this.input.resume === \"object\" &&\n Object.keys(this.input.resume).every(isXXH3)\n ) {\n this.config.configurable ??= {};\n this.config.configurable[CONFIG_KEY_RESUME_MAP] = this.input.resume;\n }\n\n if (hasResume && this.checkpointer == null) {\n throw new Error(\"Cannot use Command(resume=...) without checkpointer\");\n }\n\n const writes: { [key: string]: PendingWrite[] } = {};\n\n // group writes by task id\n for (const [tid, key, value] of mapCommand(\n this.input,\n this.checkpointPendingWrites\n )) {\n writes[tid] ??= [];\n writes[tid].push([key, value]);\n }\n if (Object.keys(writes).length === 0) {\n throw new EmptyInputError(\"Received empty Command input\");\n }\n\n // save writes\n for (const [tid, ws] of Object.entries(writes)) {\n this.putWrites(tid, ws);\n }\n }\n\n // apply null writes\n const nullWrites = (this.checkpointPendingWrites ?? [])\n .filter((w) => w[0] === NULL_TASK_ID)\n .map((w) => w.slice(1)) as PendingWrite<string>[];\n if (nullWrites.length > 0) {\n _applyWrites(\n this.checkpoint,\n this.channels,\n [\n {\n name: INPUT,\n writes: nullWrites,\n triggers: [],\n },\n ],\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n }\n const isCommandUpdateOrGoto =\n isCommand(this.input) && nullWrites.length > 0;\n if (this.isResuming || isCommandUpdateOrGoto) {\n for (const channelName in this.channels) {\n if (!Object.prototype.hasOwnProperty.call(this.channels, channelName))\n continue;\n if (this.checkpoint.channel_versions[channelName] !== undefined) {\n const version = this.checkpoint.channel_versions[channelName];\n this.checkpoint.versions_seen[INTERRUPT] = {\n ...this.checkpoint.versions_seen[INTERRUPT],\n [channelName]: version,\n };\n }\n }\n // produce values output\n const valuesOutput = await gatherIterator(\n prefixGenerator(\n mapOutputValues(this.outputKeys, true, this.channels),\n \"values\"\n )\n );\n this._emit(valuesOutput);\n }\n if (this.isResuming) {\n this.input = INPUT_RESUMING;\n } else if (isCommandUpdateOrGoto) {\n // we need to create a new checkpoint for Command(update=...) or Command(goto=...)\n // in case the result of Command(goto=...) is an interrupt.\n // If not done, the checkpoint containing the interrupt will be lost.\n await this._putCheckpoint({ source: \"input\" });\n this.input = INPUT_DONE;\n } else {\n // map inputs to channel updates\n const inputWrites = await gatherIterator(mapInput(inputKeys, this.input));\n if (inputWrites.length > 0) {\n const discardTasks = _prepareNextTasks(\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n this.config,\n true,\n { step: this.step }\n );\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n (Object.values(discardTasks) as WritesProtocol[]).concat([\n {\n name: INPUT,\n writes: inputWrites as PendingWrite[],\n triggers: [],\n },\n ]),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n // save input checkpoint\n await this._putCheckpoint({ source: \"input\" });\n\n this.input = INPUT_DONE;\n } else if (!(CONFIG_KEY_RESUMING in (this.config.configurable ?? {}))) {\n throw new EmptyInputError(\n `Received no input writes for ${JSON.stringify(inputKeys, null, 2)}`\n );\n } else {\n // done with input\n this.input = INPUT_DONE;\n }\n }\n if (!this.isNested) {\n this.config = patchConfigurable(this.config, {\n [CONFIG_KEY_RESUMING]: this.isResuming,\n });\n }\n }\n\n protected _emit(values: [StreamMode, unknown][]) {\n for (const [mode, payload] of values) {\n if (this.stream.modes.has(mode)) {\n this.stream.push([this.checkpointNamespace, mode, payload]);\n }\n\n // debug mode is a \"checkpoints\" or \"tasks\" wrapped in an object\n // TODO: consider deprecating this in 1.x\n if (\n (mode === \"checkpoints\" || mode === \"tasks\") &&\n this.stream.modes.has(\"debug\")\n ) {\n const step = mode === \"checkpoints\" ? this.step - 1 : this.step;\n const timestamp = new Date().toISOString();\n const type = (() => {\n if (mode === \"checkpoints\") {\n return \"checkpoint\";\n } else if (\n typeof payload === \"object\" &&\n payload != null &&\n \"result\" in payload\n ) {\n return \"task_result\";\n } else {\n return \"task\";\n }\n })();\n\n this.stream.push([\n this.checkpointNamespace,\n \"debug\",\n { step, type, timestamp, payload },\n ]);\n }\n }\n }\n\n protected _putCheckpoint(\n inputMetadata: Omit<CheckpointMetadata, \"step\" | \"parents\">\n ) {\n const exiting = this.checkpointMetadata === inputMetadata;\n\n const doCheckpoint =\n this.checkpointer != null && (this.durability !== \"exit\" || exiting);\n\n const storeCheckpoint = (checkpoint: Checkpoint) => {\n // store the previous checkpoint config for debug events\n this.prevCheckpointConfig = this.checkpointConfig?.configurable\n ?.checkpoint_id\n ? this.checkpointConfig\n : undefined;\n\n // child graphs keep at most one checkpoint per parent checkpoint\n // this is achieved by writing child checkpoints as progress is made\n // (so that error recovery / resuming from interrupt don't lose work)\n // but doing so always with an id equal to that of the parent checkpoint\n this.checkpointConfig = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]:\n this.config.configurable?.checkpoint_ns ?? \"\",\n });\n\n const channelVersions = { ...this.checkpoint.channel_versions };\n const newVersions = getNewChannelVersions(\n this.checkpointPreviousVersions,\n channelVersions\n );\n this.checkpointPreviousVersions = channelVersions;\n // save it, without blocking\n // if there's a previous checkpoint save in progress, wait for it\n // ensuring checkpointers receive checkpoints in order\n void this._checkpointerPutAfterPrevious({\n config: { ...this.checkpointConfig },\n checkpoint: copyCheckpoint(checkpoint),\n metadata: { ...this.checkpointMetadata },\n newVersions,\n });\n this.checkpointConfig = {\n ...this.checkpointConfig,\n configurable: {\n ...this.checkpointConfig.configurable,\n checkpoint_id: this.checkpoint.id,\n },\n };\n };\n\n if (!exiting) {\n this.checkpointMetadata = {\n ...inputMetadata,\n step: this.step,\n parents: this.config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP] ?? {},\n };\n }\n\n // create new checkpoint\n this.checkpoint = createCheckpoint(\n this.checkpoint,\n doCheckpoint ? this.channels : undefined,\n this.step,\n exiting ? { id: this.checkpoint.id } : undefined\n );\n\n // Bail if no checkpointer\n if (doCheckpoint) storeCheckpoint(this.checkpoint);\n\n if (!exiting) {\n // increment step\n this.step += 1;\n }\n }\n\n protected _flushPendingWrites() {\n if (this.checkpointer == null) return;\n if (this.checkpointPendingWrites.length === 0) return;\n\n // patch config\n const config = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]: this.config.configurable?.checkpoint_ns ?? \"\",\n [CONFIG_KEY_CHECKPOINT_ID]: this.checkpoint.id,\n });\n\n // group writes by task id\n const byTask: Record<string, PendingWrite<string>[]> = {};\n for (const [tid, key, value] of this.checkpointPendingWrites) {\n byTask[tid] ??= [];\n byTask[tid].push([key, value]);\n }\n\n // submit writes to checkpointer\n for (const [tid, ws] of Object.entries(byTask)) {\n this.checkpointerPromises.push(\n this.checkpointer.putWrites(config, ws, tid)\n );\n }\n }\n\n protected _matchWrites(\n tasks: Record<string, PregelExecutableTask<string, string>>\n ) {\n for (const [tid, k, v] of this.checkpointPendingWrites) {\n if (k === ERROR || k === INTERRUPT || k === RESUME) {\n continue;\n }\n const task = Object.values(tasks).find((t) => t.id === tid);\n if (task) {\n task.writes.push([k, v]);\n }\n }\n for (const task of Object.values(tasks)) {\n if (task.writes.length > 0) {\n this._outputWrites(task.id, task.writes, true);\n }\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;AA4FA,MAAM,aAAa,OAAO,IAAI;AAC9B,MAAM,iBAAiB,OAAO,IAAI;AAClC,MAAM,qBAAqB;AAqD3B,SAAS,mBAAmB,GAAG,SAA2C;AACxE,QAAO,IAAI,+BAA+B;EACxC,gBAAgB,UAAuB;AACrC,QAAK,MAAM,UAAU,QACnB,KAAI,OAAO,MAAM,IAAI,MAAM,IACzB,QAAO,KAAK;;EAIlB,OAAO,IAAI,IAAI,QAAQ,SAAS,MAAM,MAAM,KAAK,EAAE;;;AAIvD,IAAM,oBAAN,cAAgC,UAAkC;CAChE,AAAU;CAEV,AAAQ,QAA0B,QAAQ;CAE1C,YAAY,OAA2B;AACrC;AACA,OAAK,QAAQ;;CAGf,MAAM,IAAI,MAAsB;AAC9B,SAAO,KAAK,iBAAiB,OAAO;;CAGtC,MAAM,IACJ,OAKA;AACA,SAAO,KAAK,iBAAiB,OAAO;;CAGtC,MAAM,MAAM,YAA8B;AACxC,SAAO,KAAK,iBAAiB,SAAS;;CAGxC,MAAM,OAAO;AACX,QAAM,KAAK;;CAGb,AAAQ,iBACN,MACA,GAAG,MACH;EACA,MAAM,aAAa,KAAK,MAAM,WAAW;AAEvC,UAAO,KAAK,MAAM,MAAM,GAAG;;AAK7B,OAAK,QAAQ,WAAW,WAChB,KAAK,SACL,KAAK;AAGb,SAAO;;;AAIX,IAAa,aAAb,MAAa,WAAW;CAEtB,AAAU;CAGV;CAEA;CAEA,AAAU;CAEV,AAAU;CAEV;CAEA,AAAU;CAEV,AAAU;CAEV,AAAU;CAEV;CAEA,AAAU;CAEV,AAAU,0BAAoD;CAE9D,AAAU;CAEV;CAEA,AAAU;CAEV,AAAU;CAEV,AAAU;CAEV,AAAU;CAEV,AAAU;CAEV,AAAU;CAEV,AAAU;CAEV,AAAU;CAEV,SAKqB;CAGrB,QAAwD;CAGxD;CAEA,uBAA2C;CAE3C;CAEA,AAAU,8BAAgD,QAAQ;CAElE;CAEA;CAEA;CAEA;CAEA;CAEA,cAAsD;CAEtD,QAAiB;CAEjB;CAEA,IAAI,aAAa;EACf,IAAI,qBAAqB;AACzB,MAAI,SAAS,KAAK,WAAW,iBAE3B,sBAAqB;MAErB,MAAK,MAAM,QAAQ,KAAK,WAAW,iBACjC,KACE,OAAO,UAAU,eAAe,KAC9B,KAAK,WAAW,kBAChB,OAEF;AACA,wBAAqB;AACrB;;EAKN,MAAM,wBACJ,KAAK,OAAO,eAAe,yBAAyB;EACtD,MAAM,mBACJ,yBAAyB,KAAK,OAAO,eAAe;EAEtD,MAAM,yBACJ,KAAK,UAAU,QAAQ,KAAK,UAAU;EACxC,MAAM,yBACJ,UAAU,KAAK,UAAU,KAAK,MAAM,UAAU;EAChD,MAAM,kBAAkB,KAAK,UAAU;EAEvC,MAAM,uBACJ,CAAC,KAAK,YACN,KAAK,OAAO,UAAU,WAAW,UAChC,KAAK,oBAA6C,WAAW,UAC9D,KAAK,OAAO,SAAS,WAClB,KAAK,oBAA6C;AAEvD,SACE,uBACC,oBACC,0BACA,0BACA,mBACA;;CAIN,YAAY,QAA0B;AACpC,OAAK,QAAQ,OAAO;AACpB,OAAK,eAAe,OAAO;AAG3B,MAAI,KAAK,iBAAiB,OACxB,MAAK,6BAA6B,KAAK,aAAa,eAAe,KACjE,KAAK;MAGP,MAAK,6BAA6B;AAEpC,OAAK,aAAa,OAAO;AACzB,OAAK,qBAAqB,OAAO;AACjC,OAAK,6BAA6B,OAAO;AACzC,OAAK,WAAW,OAAO;AACvB,OAAK,0BAA0B,OAAO;AACtC,OAAK,OAAO,OAAO;AACnB,OAAK,OAAO,OAAO;AACnB,OAAK,SAAS,OAAO;AACrB,OAAK,mBAAmB,OAAO;AAC/B,OAAK,WAAW,OAAO;AACvB,OAAK,UAAU,OAAO;AACtB,OAAK,aAAa,OAAO;AACzB,OAAK,aAAa,OAAO;AACzB,OAAK,QAAQ,OAAO;AACpB,OAAK,gBAAgB,OAAO;AAC5B,OAAK,QAAQ,OAAO;AACpB,OAAK,QAAQ,OAAO,QAAQ,IAAI,kBAAkB,OAAO,SAAS;AAClE,OAAK,SAAS,OAAO;AACrB,OAAK,sBAAsB,OAAO;AAClC,OAAK,uBAAuB,OAAO;AACnC,OAAK,iBAAiB,OAAO;AAC7B,OAAK,kBAAkB,OAAO;AAC9B,OAAK,aAAa,OAAO;AACzB,OAAK,QAAQ,OAAO;AACpB,OAAK,iBAAiB,OAAO;;CAG/B,aAAa,WAAW,QAAoC;EAC1D,IAAI,EAAE,QAAQ,WAAW;AACzB,MACE,WAAW,UACX,OAAO,eAAe,uBAAuB,OAE7C,UAAS,mBACP,QACA,OAAO,aAAa;EAGxB,MAAM,gBAAgB,OAAO,eACzB,EAAE,mBAAmB,OAAO,gBAC5B;EAEJ,MAAM,aAAa,OAAO,eAAe;AAIzC,MAAI,OAAO,gBAAgB,YAAY;AACrC,OAAI,WAAW,kBAAkB,EAC/B,UAAS,kBAAkB,QAAQ,GAChC,2BAA2B,CAC1B,OAAO,aAAa,2BACpB,WAAW,gBAAgB,YAC3B,KAAK;AAIX,cAAW,mBAAmB;;EAGhC,MAAM,WAAW,oBAAoB,OAAO,gBAAgB;AAC5D,MACE,CAAC,YACD,OAAO,cAAc,kBAAkB,UACvC,OAAO,cAAc,kBAAkB,GAEvC,UAAS,kBAAkB,QAAQ;GACjC,eAAe;GACf,eAAe;;EAGnB,IAAI,mBAAmB;AACvB,MACE,OAAO,eAAe,+BAA+B,UACrD,OAAO,eAAe,6BACpB,OAAO,cAAc,eAGvB,oBAAmB,kBAAkB,QAAQ,EAC3C,eACE,OAAO,aAAa,2BAClB,OAAO,cAAc;EAI7B,MAAM,sBACJ,OAAO,cAAc,eAAe,MAClC,mCACG;EAEP,MAAMA,QAA0B,MAAM,OAAO,cAAc,SACzD,qBACI;GACJ;GACA,YAAY;GACZ,UAAU;IAAE,QAAQ;IAAS,MAAM;IAAI,SAAS;;GAChD,eAAe;;AAEjB,qBAAmB;GACjB,GAAG;GACH,GAAG,MAAM;GACT,cAAc;IACZ,eAAe;IACf,GAAG,OAAO;IACV,GAAG,MAAM,OAAO;;;EAGpB,MAAM,uBAAuB,MAAM;EACnC,MAAM,aAAa,eAAe,MAAM;EACxC,MAAM,qBAAqB,EAAE,GAAG,MAAM;EACtC,MAAM,0BAA0B,MAAM,iBAAiB;EAEvD,MAAM,WAAW,cAAc,OAAO,cAAc;EAEpD,MAAM,QAAQ,mBAAmB,QAAQ,KAAK;EAC9C,MAAM,OAAO,QAAQ,OAAO,kBAAkB,sBAAsB;EACpE,MAAM,6BAA6B,EAAE,GAAG,WAAW;EAEnD,MAAM,QAAQ,OAAO,QACjB,IAAI,kBAAkB,OAAO,SAC7B;AAEJ,MAAI,MAEF,OAAM,MAAM;AAEd,SAAO,IAAI,WAAW;GACpB,OAAO,OAAO;GACd;GACA,cAAc,OAAO;GACrB;GACA;GACA;GACA;GACA;GACA;GACA;GACA,SAAS,OAAO;GAChB;GACA;GACA;GACA;GACA;GACA,YAAY,OAAO,cAAc;GACjC,YAAY,OAAO,cAAc;GACjC,OAAO,OAAO;GACd;GACA;GACA,OAAO,OAAO;GACd,gBAAgB,OAAO;GACvB,iBAAiB,OAAO;GACxB,YAAY,OAAO;GACnB,OAAO,OAAO;GACd,gBAAgB,OAAO;;;CAI3B,AAAU,8BAA8B,OAKrC;AACD,OAAK,8BAA8B,KAAK,4BAA4B,WAC5D;AACJ,UAAO,KAAK,cAAc,IACxB,MAAM,QACN,MAAM,YACN,MAAM,UACN,MAAM;;AAIZ,OAAK,qBAAqB,KAAK,KAAK;;;;;;;CAQtC,UAAU,QAAgB,QAAgC;EACxD,IAAI,aAAa;AACjB,MAAI,WAAW,WAAW,EAAG;AAG7B,MAAI,WAAW,OAAO,CAAC,SAAS,OAAO,gBACrC,cAAa,MAAM,KACjB,IAAI,IAAI,WAAW,KAAK,MAAM,CAAC,EAAE,IAAI,KAAK;AAK9C,OAAK,0BAA0B,KAAK,wBAAwB,QACzD,MAAM,EAAE,OAAO;AAIlB,OAAK,MAAM,CAAC,GAAG,MAAM,WACnB,MAAK,wBAAwB,KAAK;GAAC;GAAQ;GAAG;;EAGhD,MAAM,SAAS,kBAAkB,KAAK,kBAAkB;IACrD,2BAA2B,KAAK,OAAO,cAAc,iBAAiB;IACtE,2BAA2B,KAAK,WAAW;;AAG9C,MAAI,KAAK,eAAe,UAAU,KAAK,gBAAgB,KACrD,MAAK,qBAAqB,KACxB,KAAK,aAAa,UAAU,QAAQ,YAAY;AAIpD,MAAI,KAAK,MACP,MAAK,cAAc,QAAQ;AAG7B,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,SAAS,CAAC,KAAK,MACzC;EAIF,MAAM,OAAO,KAAK,MAAM;AACxB,MAAI,QAAQ,QAAQ,KAAK,aAAa,KACpC;AAIF,MAAI,OAAO,GAAG,OAAO,SAAS,OAAO,GAAG,OAAO,UAC7C;AAGF,EAAK,KAAK,MAAM,IAAI,CAClB;GACE,KAAK,CAAC,KAAK,UAAU,IAAI,KAAK,UAAU;GACxC,OAAO,KAAK;GACZ,KAAK,KAAK,UAAU;;;CAK1B,cAAc,QAAgB,QAA6B,SAAS,OAAO;EACzE,MAAM,OAAO,KAAK,MAAM;AACxB,MAAI,SAAS,QAAW;AACtB,OACE,KAAK,WAAW,WACf,KAAK,OAAO,QAAQ,IAAI,SAAS,YAElC;AAGF,OAAI,OAAO,SAAS,GAClB;QAAI,OAAO,GAAG,OAAO,WAAW;AAI9B,SAAI,KAAK,OAAO,OAAO,QAAQ,KAAK,MAAM,GAAG,QAAQ,KAAM;KAE3D,MAAM,kBAAkB,OACrB,QAAQ,MAAM,EAAE,OAAO,WACvB,SAAS,MAAM,EAAE;AAEpB,UAAK,MAAM,CACT,CAAC,WAAW,GAAG,YAAY,oBAC3B,CAAC,UAAU,GAAG,YAAY;eAEnB,OAAO,GAAG,OAAO,MAC1B,MAAK,MACH,mBACE,gBACE,iBAAiB,KAAK,YAAY,CAAC,CAAC,MAAM,UAAU,SACpD;;AAMV,OAAI,CAAC,OACH,MAAK,MACH,mBACE,gBACE,oBAAoB,CAAC,CAAC,MAAM,UAAU,KAAK,aAC3C;;;CAQZ,MAAM,qBAAqB;AACzB,MAAI,CAAC,KAAK,MAAO,QAAO;EAExB,MAAMC,UAGA;EAEN,MAAM,gBAAgB,CAAC,IAAI,SAAuB;AAChD,UAAO,MAAM,GAAG,KAAK,KAAK,OAAO;;EAGnC,MAAMC,OAAuB;EAC7B,MAAMC,SAA+D;AAErE,OAAK,MAAM,QAAQ,OAAO,OAAO,KAAK,OACpC,KAAI,KAAK,aAAa,QAAQ,CAAC,KAAK,OAAO,QAAQ;AACjD,QAAK,KAAK,CAAC,KAAK,UAAU,IAAI,KAAK,UAAU;AAC7C,UAAO,aAAa,CAAC,KAAK,UAAU,IAAI,KAAK,UAAU,SAAS;;AAIpE,MAAI,KAAK,WAAW,EAAG,QAAO;EAC9B,MAAM,QAAQ,MAAM,KAAK,MAAM,IAAI;AAEnC,OAAK,MAAM,EAAE,KAAK,WAAW,OAAO;GAClC,MAAM,OAAO,OAAO,aAAa;AACjC,OAAI,QAAQ,MAAM;AAEhB,SAAK,OAAO,KAAK,GAAG;AACpB,YAAQ,KAAK;KAAE;KAAM,QAAQ;;;;AAIjC,SAAO;;;;;;;CAQT,MAAM,KAAK,QAA6D;AACtE,MAAI,KAAK,SAAS,CAAC,KAAK,MAAM,UAC5B,OAAM,KAAK,OAAO;EAEpB,MAAM,EAAE,YAAY,OAAO;AAC3B,MAAI,KAAK,WAAW,UAClB,OAAM,IAAI,MACR,oEAAoE,KAAK,OAAO;AAGpF,MAAI,CAAC,CAAC,YAAY,gBAAgB,SAAS,KAAK,OAC9C,OAAM,KAAK,OAAO;WACT,KAAK,YAAY,SAAS,GAAG;AACtC,QAAK,SAAS;AACd,SAAM,IAAI;aAEV,OAAO,OAAO,KAAK,OAAO,OAAO,SAAS,KAAK,OAAO,SAAS,IAC/D;GAEA,MAAM,SAAS,OAAO,OAAO,KAAK,OAAO,SAAS,MAAM,EAAE;AAE1D,QAAK,kBAAkB,aACrB,KAAK,YACL,KAAK,UACL,OAAO,OAAO,KAAK,QACnB,KAAK,4BACL,KAAK;GAGP,MAAM,eAAe,MAAM,eACzB,gBACE,gBAAgB,KAAK,YAAY,QAAQ,KAAK,WAC9C;AAGJ,QAAK,MAAM;AAEX,QAAK,0BAA0B;AAC/B,SAAM,KAAK,eAAe,EAAE,QAAQ;AAEpC,OACE,gBACE,KAAK,YACL,KAAK,gBACL,OAAO,OAAO,KAAK,SAErB;AACA,SAAK,SAAS;AACd,UAAM,IAAI;;AAIZ,OAAI,KAAK,OAAO,eAAe,yBAAyB,OACtD,QAAO,KAAK,OAAO,eAAe;QAGpC,QAAO;AAET,MAAI,KAAK,OAAO,KAAK,MAAM;AACzB,QAAK,SAAS;AACd,UAAO;;EAGT,MAAM,YAAY,kBAChB,KAAK,YACL,KAAK,yBACL,KAAK,OACL,KAAK,UACL,KAAK,QACL,MACA;GACE,MAAM,KAAK;GACX,cAAc,KAAK;GACnB,YAAY,KAAK;GACjB,SAAS,KAAK;GACd,OAAO,KAAK;GACZ,QAAQ,KAAK;GACb,gBAAgB,KAAK;GACrB,iBAAiB,KAAK;;AAG1B,OAAK,QAAQ;AAGb,MAAI,KAAK,aACP,MAAK,MACH,MAAM,eACJ,gBACE,mBACE,KAAK,kBACL,KAAK,UACL,KAAK,YACL,KAAK,oBACL,OAAO,OAAO,KAAK,QACnB,KAAK,yBACL,KAAK,sBACL,KAAK,aAEP;AAMR,MAAI,OAAO,OAAO,KAAK,OAAO,WAAW,GAAG;AAC1C,QAAK,SAAS;AACd,UAAO;;AAGT,MAAI,KAAK,iBAAiB,KAAK,wBAAwB,SAAS,GAAG;AACjE,QAAK,MAAM,CAAC,KAAK,GAAG,MAAM,KAAK,yBAAyB;AACtD,QAAI,MAAM,SAAS,MAAM,aAAa,MAAM,OAC1C;IAEF,MAAM,OAAO,OAAO,OAAO,KAAK,OAAO,MAAM,MAAM,EAAE,OAAO;AAC5D,QAAI,KACF,MAAK,OAAO,KAAK,CAAC,GAAG;;AAGzB,QAAK,MAAM,QAAQ,OAAO,OAAO,KAAK,OACpC,KAAI,KAAK,OAAO,SAAS,EACvB,MAAK,cAAc,KAAK,IAAI,KAAK,QAAQ;;AAK/C,MAAI,OAAO,OAAO,KAAK,OAAO,OAAO,SAAS,KAAK,OAAO,SAAS,GACjE,QAAO,KAAK,KAAK,EAAE;AAIrB,MACE,gBACE,KAAK,YACL,KAAK,iBACL,OAAO,OAAO,KAAK,SAErB;AACA,QAAK,SAAS;AACd,SAAM,IAAI;;EAIZ,MAAM,cAAc,MAAM,eACxB,gBAAgB,cAAc,OAAO,OAAO,KAAK,SAAS;AAE5D,OAAK,MAAM;AAEX,SAAO;;CAGT,MAAM,qBAAqB,OAAe;AAExC,MACE,KAAK,eAAe,WAEnB,CAAC,KAAK,YAEL,OAAO,UAAU,eAEjB,KAAK,oBAAoB,OACtB,SAAS,CAAC,KAAK,SAAS,6BAE7B;AACA,QAAK,eAAe,KAAK;AACzB,QAAK;;EAGP,MAAM,WAAW,KAAK,mBAAmB;AACzC,MAAI,YAAY,UAAU,OACxB,MAAK,SAAS,aAAa,KAAK,UAAU,KAAK;AAEjD,MAAI,UAAU;AAEZ,OACE,KAAK,UAAU,UACf,KAAK,wBAAwB,SAAS,KACtC,OAAO,OAAO,KAAK,OAAO,MAAM,SAAS,KAAK,OAAO,SAAS,IAC9D;AACA,SAAK,kBAAkB,aACrB,KAAK,YACL,KAAK,UACL,OAAO,OAAO,KAAK,QACnB,KAAK,4BACL,KAAK;AAGP,SAAK,MACH,mBACE,gBACE,gBACE,KAAK,YACL,OAAO,OAAO,KAAK,OAAO,SAAS,MAAM,EAAE,SAC3C,KAAK,WAEP;;AAOR,OAAI,iBAAiB,UAAU,CAAC,MAAM,WAAW,OAC/C,MAAK,MAAM,CACT,CAAC,WAAW,GAAG,YAAY,OAC3B,CAAC,UAAU,GAAG,YAAY;;AAIhC,SAAO;;CAGT,MAAM,WACJ,MACA,UACA,MACsD;AACtD,MACE,KAAK,gBAAgB,SAAS,KAC9B,gBAAgB,KAAK,YAAY,KAAK,gBAAgB,CAAC,QACvD;AACA,QAAK,YAAY,KAAK;AACtB;;EAGF,MAAM,SAAS,mBACb;GAAC;GAAM,KAAK,QAAQ;GAAI;GAAU,KAAK;GAAI;KAC3C,KAAK,YACL,KAAK,yBACL,KAAK,OACL,KAAK,UACL,KAAK,UAAU,IACf,MACA;GACE,MAAM,KAAK;GACX,cAAc,KAAK;GACnB,SAAS,KAAK;GACd,OAAO,KAAK;GACZ,QAAQ,KAAK;;AAIjB,MAAI,CAAC,OAAQ;AACb,MACE,KAAK,iBAAiB,SAAS,KAC/B,gBAAgB,KAAK,YAAY,KAAK,iBAAiB,CAAC,UACxD;AACA,QAAK,YAAY,KAAK;AACtB;;AAGF,OAAK,MACH,mBAAmB,gBAAgB,cAAc,CAAC,UAAU;AAG9D,MAAI,KAAK,MAAO,gBAAe,KAAK,MAAM,CAAC;AAC3C,OAAK,MAAM,OAAO,MAAM;AACxB,MAAI,KAAK,cAAe,MAAK,aAAa,GAAG,OAAO,KAAK;EAEzD,MAAM,QAAQ,MAAM,KAAK;AACzB,OAAK,MAAM,EAAE,kBAAU,MACrB,MAAK,cAAcC,OAAK,IAAIA,OAAK,QAAQ;AAG3C,SAAO;;CAGT,AAAU,mBAAmB,GAAoB;AAC/C,SAAO,iBAAiB,MAAM,CAAC,KAAK;;CAGtC,MAAgB,OAAO,WAA8B;EAOnD,MAAM,EAAE,iBAAiB,KAAK;EAG9B,MAAM,aAAa,eACjB;AAGF,MAAI,cAAc,WAAW,eAAe,OAC1C,MAAK,UAAU,cAAc,CAAC,CAAC,QAAQ,WAAW;AAIpD,MAAI,UAAU,KAAK,QAAQ;GACzB,MAAM,YAAY,KAAK,MAAM,UAAU;AAEvC,OACE,KAAK,MAAM,UAAU,QACrB,OAAO,KAAK,MAAM,WAAW,YAC7B,OAAO,KAAK,KAAK,MAAM,QAAQ,MAAM,SACrC;AACA,SAAK,OAAO,iBAAiB;AAC7B,SAAK,OAAO,aAAa,yBAAyB,KAAK,MAAM;;AAG/D,OAAI,aAAa,KAAK,gBAAgB,KACpC,OAAM,IAAI,MAAM;GAGlB,MAAMC,SAA4C;AAGlD,QAAK,MAAM,CAAC,KAAK,KAAK,UAAU,WAC9B,KAAK,OACL,KAAK,0BACJ;AACD,WAAO,SAAS;AAChB,WAAO,KAAK,KAAK,CAAC,KAAK;;AAEzB,OAAI,OAAO,KAAK,QAAQ,WAAW,EACjC,OAAM,IAAI,gBAAgB;AAI5B,QAAK,MAAM,CAAC,KAAK,OAAO,OAAO,QAAQ,QACrC,MAAK,UAAU,KAAK;;EAKxB,MAAM,cAAc,KAAK,2BAA2B,IACjD,QAAQ,MAAM,EAAE,OAAO,cACvB,KAAK,MAAM,EAAE,MAAM;AACtB,MAAI,WAAW,SAAS,EACtB,cACE,KAAK,YACL,KAAK,UACL,CACE;GACE,MAAM;GACN,QAAQ;GACR,UAAU;MAGd,KAAK,4BACL,KAAK;EAGT,MAAM,wBACJ,UAAU,KAAK,UAAU,WAAW,SAAS;AAC/C,MAAI,KAAK,cAAc,uBAAuB;AAC5C,QAAK,MAAM,eAAe,KAAK,UAAU;AACvC,QAAI,CAAC,OAAO,UAAU,eAAe,KAAK,KAAK,UAAU,aACvD;AACF,QAAI,KAAK,WAAW,iBAAiB,iBAAiB,QAAW;KAC/D,MAAM,UAAU,KAAK,WAAW,iBAAiB;AACjD,UAAK,WAAW,cAAc,aAAa;MACzC,GAAG,KAAK,WAAW,cAAc;OAChC,cAAc;;;;GAKrB,MAAM,eAAe,MAAM,eACzB,gBACE,gBAAgB,KAAK,YAAY,MAAM,KAAK,WAC5C;AAGJ,QAAK,MAAM;;AAEb,MAAI,KAAK,WACP,MAAK,QAAQ;WACJ,uBAAuB;AAIhC,SAAM,KAAK,eAAe,EAAE,QAAQ;AACpC,QAAK,QAAQ;SACR;GAEL,MAAM,cAAc,MAAM,eAAe,SAAS,WAAW,KAAK;AAClE,OAAI,YAAY,SAAS,GAAG;IAC1B,MAAM,eAAe,kBACnB,KAAK,YACL,KAAK,yBACL,KAAK,OACL,KAAK,UACL,KAAK,QACL,MACA,EAAE,MAAM,KAAK;AAEf,SAAK,kBAAkB,aACrB,KAAK,YACL,KAAK,UACJ,OAAO,OAAO,cAAmC,OAAO,CACvD;KACE,MAAM;KACN,QAAQ;KACR,UAAU;SAGd,KAAK,4BACL,KAAK;AAGP,UAAM,KAAK,eAAe,EAAE,QAAQ;AAEpC,SAAK,QAAQ;cACJ,EAAE,wBAAwB,KAAK,OAAO,gBAAgB,KAC/D,OAAM,IAAI,gBACR,gCAAgC,KAAK,UAAU,WAAW,MAAM;OAIlE,MAAK,QAAQ;;AAGjB,MAAI,CAAC,KAAK,SACR,MAAK,SAAS,kBAAkB,KAAK,QAAQ,GAC1C,sBAAsB,KAAK;;CAKlC,AAAU,MAAM,QAAiC;AAC/C,OAAK,MAAM,CAAC,MAAM,YAAY,QAAQ;AACpC,OAAI,KAAK,OAAO,MAAM,IAAI,MACxB,MAAK,OAAO,KAAK;IAAC,KAAK;IAAqB;IAAM;;AAKpD,QACG,SAAS,iBAAiB,SAAS,YACpC,KAAK,OAAO,MAAM,IAAI,UACtB;IACA,MAAM,OAAO,SAAS,gBAAgB,KAAK,OAAO,IAAI,KAAK;IAC3D,MAAM,6BAAY,IAAI,QAAO;IAC7B,MAAM,cAAc;AAClB,SAAI,SAAS,cACX,QAAO;cAEP,OAAO,YAAY,YACnB,WAAW,QACX,YAAY,QAEZ,QAAO;SAEP,QAAO;;AAIX,SAAK,OAAO,KAAK;KACf,KAAK;KACL;KACA;MAAE;MAAM;MAAM;MAAW;;;;;;CAMjC,AAAU,eACR,eACA;EACA,MAAM,UAAU,KAAK,uBAAuB;EAE5C,MAAM,eACJ,KAAK,gBAAgB,SAAS,KAAK,eAAe,UAAU;EAE9D,MAAM,mBAAmB,eAA2B;AAElD,QAAK,uBAAuB,KAAK,kBAAkB,cAC/C,gBACA,KAAK,mBACL;AAMJ,QAAK,mBAAmB,kBAAkB,KAAK,kBAAkB,GAC9D,2BACC,KAAK,OAAO,cAAc,iBAAiB;GAG/C,MAAM,kBAAkB,EAAE,GAAG,KAAK,WAAW;GAC7C,MAAM,cAAc,sBAClB,KAAK,4BACL;AAEF,QAAK,6BAA6B;AAIlC,GAAK,KAAK,8BAA8B;IACtC,QAAQ,EAAE,GAAG,KAAK;IAClB,YAAY,eAAe;IAC3B,UAAU,EAAE,GAAG,KAAK;IACpB;;AAEF,QAAK,mBAAmB;IACtB,GAAG,KAAK;IACR,cAAc;KACZ,GAAG,KAAK,iBAAiB;KACzB,eAAe,KAAK,WAAW;;;;AAKrC,MAAI,CAAC,QACH,MAAK,qBAAqB;GACxB,GAAG;GACH,MAAM,KAAK;GACX,SAAS,KAAK,OAAO,eAAe,8BAA8B;;AAKtE,OAAK,aAAa,iBAChB,KAAK,YACL,eAAe,KAAK,WAAW,QAC/B,KAAK,MACL,UAAU,EAAE,IAAI,KAAK,WAAW,OAAO;AAIzC,MAAI,aAAc,iBAAgB,KAAK;AAEvC,MAAI,CAAC,QAEH,MAAK,QAAQ;;CAIjB,AAAU,sBAAsB;AAC9B,MAAI,KAAK,gBAAgB,KAAM;AAC/B,MAAI,KAAK,wBAAwB,WAAW,EAAG;EAG/C,MAAM,SAAS,kBAAkB,KAAK,kBAAkB;IACrD,2BAA2B,KAAK,OAAO,cAAc,iBAAiB;IACtE,2BAA2B,KAAK,WAAW;;EAI9C,MAAMC,SAAiD;AACvD,OAAK,MAAM,CAAC,KAAK,KAAK,UAAU,KAAK,yBAAyB;AAC5D,UAAO,SAAS;AAChB,UAAO,KAAK,KAAK,CAAC,KAAK;;AAIzB,OAAK,MAAM,CAAC,KAAK,OAAO,OAAO,QAAQ,QACrC,MAAK,qBAAqB,KACxB,KAAK,aAAa,UAAU,QAAQ,IAAI;;CAK9C,AAAU,aACR,OACA;AACA,OAAK,MAAM,CAAC,KAAK,GAAG,MAAM,KAAK,yBAAyB;AACtD,OAAI,MAAM,SAAS,MAAM,aAAa,MAAM,OAC1C;GAEF,MAAM,OAAO,OAAO,OAAO,OAAO,MAAM,MAAM,EAAE,OAAO;AACvD,OAAI,KACF,MAAK,OAAO,KAAK,CAAC,GAAG;;AAGzB,OAAK,MAAM,QAAQ,OAAO,OAAO,OAC/B,KAAI,KAAK,OAAO,SAAS,EACvB,MAAK,cAAc,KAAK,IAAI,KAAK,QAAQ"}
1
+ {"version":3,"file":"loop.js","names":["task"],"sources":["../../src/pregel/loop.ts"],"sourcesContent":["import type { RunnableConfig } from \"@langchain/core/runnables\";\nimport type { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport {\n BaseCheckpointSaver,\n Checkpoint,\n CheckpointTuple,\n copyCheckpoint,\n emptyCheckpoint,\n PendingWrite,\n CheckpointPendingWrite,\n CheckpointMetadata,\n All,\n BaseStore,\n AsyncBatchedStore,\n WRITES_IDX_MAP,\n BaseCache,\n CacheFullKey,\n CacheNamespace,\n} from \"@langchain/langgraph-checkpoint\";\n\nimport {\n BaseChannel,\n createCheckpoint,\n emptyChannels,\n} from \"../channels/base.js\";\nimport type {\n Call,\n CallTaskPath,\n Durability,\n PregelExecutableTask,\n PregelScratchpad,\n StreamMode,\n} from \"./types.js\";\nimport {\n isCommand,\n CHECKPOINT_NAMESPACE_SEPARATOR,\n Command,\n CONFIG_KEY_CHECKPOINT_MAP,\n CONFIG_KEY_READ,\n CONFIG_KEY_RESUMING,\n CONFIG_KEY_STREAM,\n ERROR,\n INPUT,\n INTERRUPT,\n NULL_TASK_ID,\n RESUME,\n TAG_HIDDEN,\n PUSH,\n CONFIG_KEY_SCRATCHPAD,\n CONFIG_KEY_CHECKPOINT_NS,\n CHECKPOINT_NAMESPACE_END,\n CONFIG_KEY_CHECKPOINT_ID,\n CONFIG_KEY_RESUME_MAP,\n START,\n} from \"../constants.js\";\nimport {\n _applyWrites,\n _prepareNextTasks,\n _prepareSingleTask,\n increment,\n shouldInterrupt,\n WritesProtocol,\n} from \"./algo.js\";\nimport {\n gatherIterator,\n gatherIteratorSync,\n prefixGenerator,\n} from \"../utils.js\";\nimport {\n mapCommand,\n mapInput,\n mapOutputUpdates,\n mapOutputValues,\n readChannels,\n} from \"./io.js\";\nimport {\n EmptyInputError,\n GraphInterrupt,\n isGraphInterrupt,\n} from \"../errors.js\";\nimport { getNewChannelVersions, patchConfigurable } from \"./utils/index.js\";\nimport {\n mapDebugTasks,\n mapDebugCheckpoint,\n mapDebugTaskResults,\n printStepTasks,\n} from \"./debug.js\";\nimport { PregelNode } from \"./read.js\";\nimport { LangGraphRunnableConfig } from \"./runnable_types.js\";\nimport { IterableReadableWritableStream, StreamChunk } from \"./stream.js\";\nimport { isXXH3 } from \"../hash.js\";\n\nconst INPUT_DONE = Symbol.for(\"INPUT_DONE\");\nconst INPUT_RESUMING = Symbol.for(\"INPUT_RESUMING\");\nconst DEFAULT_LOOP_LIMIT = 25;\n\nexport type PregelLoopInitializeParams = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input?: any | Command;\n config: RunnableConfig;\n checkpointer?: BaseCheckpointSaver;\n outputKeys: string | string[];\n streamKeys: string | string[];\n nodes: Record<string, PregelNode>;\n channelSpecs: Record<string, BaseChannel>;\n stream: IterableReadableWritableStream;\n store?: BaseStore;\n cache?: BaseCache<PendingWrite<string>[]>;\n interruptAfter: string[] | All;\n interruptBefore: string[] | All;\n durability: Durability;\n manager?: CallbackManagerForChainRun;\n debug: boolean;\n triggerToNodes: Record<string, string[]>;\n};\n\ntype PregelLoopParams = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input?: any | Command;\n config: RunnableConfig;\n checkpointer?: BaseCheckpointSaver;\n checkpoint: Checkpoint;\n checkpointMetadata: CheckpointMetadata;\n checkpointPreviousVersions: Record<string, string | number>;\n checkpointPendingWrites: CheckpointPendingWrite[];\n checkpointConfig: RunnableConfig;\n channels: Record<string, BaseChannel>;\n step: number;\n stop: number;\n outputKeys: string | string[];\n streamKeys: string | string[];\n nodes: Record<string, PregelNode>;\n checkpointNamespace: string[];\n skipDoneTasks: boolean;\n isNested: boolean;\n manager?: CallbackManagerForChainRun;\n stream: IterableReadableWritableStream;\n store?: AsyncBatchedStore;\n cache?: BaseCache<PendingWrite<string>[]>;\n prevCheckpointConfig: RunnableConfig | undefined;\n interruptAfter: string[] | All;\n interruptBefore: string[] | All;\n durability: Durability;\n debug: boolean;\n triggerToNodes: Record<string, string[]>;\n};\n\nfunction createDuplexStream(...streams: IterableReadableWritableStream[]) {\n return new IterableReadableWritableStream({\n passthroughFn: (value: StreamChunk) => {\n for (const stream of streams) {\n if (stream.modes.has(value[1])) {\n stream.push(value);\n }\n }\n },\n modes: new Set(streams.flatMap((s) => Array.from(s.modes))),\n });\n}\n\nclass AsyncBatchedCache extends BaseCache<PendingWrite<string>[]> {\n protected cache: BaseCache<PendingWrite<string>[]>;\n\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(cache: BaseCache<unknown>) {\n super();\n this.cache = cache as BaseCache<PendingWrite<string>[]>;\n }\n\n async get(keys: CacheFullKey[]) {\n return this.enqueueOperation(\"get\", keys);\n }\n\n async set(\n pairs: {\n key: CacheFullKey;\n value: PendingWrite<string>[];\n ttl?: number;\n }[]\n ) {\n return this.enqueueOperation(\"set\", pairs);\n }\n\n async clear(namespaces: CacheNamespace[]) {\n return this.enqueueOperation(\"clear\", namespaces);\n }\n\n async stop() {\n await this.queue;\n }\n\n private enqueueOperation<Type extends \"get\" | \"set\" | \"clear\">(\n type: Type,\n ...args: Parameters<(typeof this.cache)[Type]>\n ) {\n const newPromise = this.queue.then(() => {\n // @ts-expect-error Tuple type warning\n return this.cache[type](...args) as Promise<\n ReturnType<(typeof this.cache)[Type]>\n >;\n });\n\n this.queue = newPromise.then(\n () => void 0,\n () => void 0\n );\n\n return newPromise;\n }\n}\n\nexport class PregelLoop {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected input?: any | Command;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n output: any;\n\n config: LangGraphRunnableConfig;\n\n protected checkpointer?: BaseCheckpointSaver;\n\n protected checkpointerGetNextVersion: (current: number | undefined) => number;\n\n channels: Record<string, BaseChannel>;\n\n protected checkpoint: Checkpoint;\n\n protected checkpointIdSaved: string | undefined;\n\n protected checkpointConfig: RunnableConfig;\n\n checkpointMetadata: CheckpointMetadata;\n\n protected checkpointNamespace: string[];\n\n protected checkpointPendingWrites: CheckpointPendingWrite[] = [];\n\n protected checkpointPreviousVersions: Record<string, string | number>;\n\n step: number;\n\n protected stop: number;\n\n protected durability: Durability;\n\n protected outputKeys: string | string[];\n\n protected streamKeys: string | string[];\n\n protected nodes: Record<string, PregelNode>;\n\n protected skipDoneTasks: boolean;\n\n protected prevCheckpointConfig: RunnableConfig | undefined;\n\n protected updatedChannels: Set<string> | undefined;\n\n status:\n | \"pending\"\n | \"done\"\n | \"interrupt_before\"\n | \"interrupt_after\"\n | \"out_of_steps\" = \"pending\";\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tasks: Record<string, PregelExecutableTask<any, any>> = {};\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n stream: IterableReadableWritableStream;\n\n checkpointerPromises: Promise<unknown>[] = [];\n\n isNested: boolean;\n\n protected _checkpointerChainedPromise: Promise<unknown> = Promise.resolve();\n\n store?: AsyncBatchedStore;\n\n cache?: AsyncBatchedCache;\n\n manager?: CallbackManagerForChainRun;\n\n interruptAfter: string[] | All;\n\n interruptBefore: string[] | All;\n\n toInterrupt: PregelExecutableTask<string, string>[] = [];\n\n debug: boolean = false;\n\n triggerToNodes: Record<string, string[]>;\n\n get isResuming() {\n let hasChannelVersions = false;\n if (START in this.checkpoint.channel_versions) {\n // For common channels, we can short-circuit the check\n hasChannelVersions = true;\n } else {\n for (const chan in this.checkpoint.channel_versions) {\n if (\n Object.prototype.hasOwnProperty.call(\n this.checkpoint.channel_versions,\n chan\n )\n ) {\n hasChannelVersions = true;\n break;\n }\n }\n }\n\n const configHasResumingFlag =\n this.config.configurable?.[CONFIG_KEY_RESUMING] !== undefined;\n const configIsResuming =\n configHasResumingFlag && this.config.configurable?.[CONFIG_KEY_RESUMING];\n\n const inputIsNullOrUndefined =\n this.input === null || this.input === undefined;\n const inputIsCommandResuming =\n isCommand(this.input) && this.input.resume != null;\n const inputIsResuming = this.input === INPUT_RESUMING;\n\n const runIdMatchesPrevious =\n !this.isNested &&\n this.config.metadata?.run_id !== undefined &&\n (this.checkpointMetadata as { run_id?: unknown })?.run_id !== undefined &&\n this.config.metadata.run_id ===\n (this.checkpointMetadata as { run_id?: unknown })?.run_id;\n\n return (\n hasChannelVersions &&\n (configIsResuming ||\n inputIsNullOrUndefined ||\n inputIsCommandResuming ||\n inputIsResuming ||\n runIdMatchesPrevious)\n );\n }\n\n constructor(params: PregelLoopParams) {\n this.input = params.input;\n this.checkpointer = params.checkpointer;\n // TODO: if managed values no longer needs graph we can replace with\n // managed_specs, channel_specs\n if (this.checkpointer !== undefined) {\n this.checkpointerGetNextVersion = this.checkpointer.getNextVersion.bind(\n this.checkpointer\n );\n } else {\n this.checkpointerGetNextVersion = increment;\n }\n this.checkpoint = params.checkpoint;\n this.checkpointMetadata = params.checkpointMetadata;\n this.checkpointPreviousVersions = params.checkpointPreviousVersions;\n this.channels = params.channels;\n this.checkpointPendingWrites = params.checkpointPendingWrites;\n this.step = params.step;\n this.stop = params.stop;\n this.config = params.config;\n this.checkpointConfig = params.checkpointConfig;\n this.isNested = params.isNested;\n this.manager = params.manager;\n this.outputKeys = params.outputKeys;\n this.streamKeys = params.streamKeys;\n this.nodes = params.nodes;\n this.skipDoneTasks = params.skipDoneTasks;\n this.store = params.store;\n this.cache = params.cache ? new AsyncBatchedCache(params.cache) : undefined;\n this.stream = params.stream;\n this.checkpointNamespace = params.checkpointNamespace;\n this.prevCheckpointConfig = params.prevCheckpointConfig;\n this.interruptAfter = params.interruptAfter;\n this.interruptBefore = params.interruptBefore;\n this.durability = params.durability;\n this.debug = params.debug;\n this.triggerToNodes = params.triggerToNodes;\n }\n\n static async initialize(params: PregelLoopInitializeParams) {\n let { config, stream } = params;\n if (\n stream !== undefined &&\n config.configurable?.[CONFIG_KEY_STREAM] !== undefined\n ) {\n stream = createDuplexStream(\n stream,\n config.configurable[CONFIG_KEY_STREAM]\n );\n }\n const skipDoneTasks = config.configurable\n ? !(\"checkpoint_id\" in config.configurable)\n : true;\n\n const scratchpad = config.configurable?.[CONFIG_KEY_SCRATCHPAD] as\n | PregelScratchpad\n | undefined;\n\n if (config.configurable && scratchpad) {\n if (scratchpad.subgraphCounter > 0) {\n config = patchConfigurable(config, {\n [CONFIG_KEY_CHECKPOINT_NS]: [\n config.configurable[CONFIG_KEY_CHECKPOINT_NS],\n scratchpad.subgraphCounter.toString(),\n ].join(CHECKPOINT_NAMESPACE_SEPARATOR),\n });\n }\n\n scratchpad.subgraphCounter += 1;\n }\n\n const isNested = CONFIG_KEY_READ in (config.configurable ?? {});\n if (\n !isNested &&\n config.configurable?.checkpoint_ns !== undefined &&\n config.configurable?.checkpoint_ns !== \"\"\n ) {\n config = patchConfigurable(config, {\n checkpoint_ns: \"\",\n checkpoint_id: undefined,\n });\n }\n let checkpointConfig = config;\n if (\n config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP] !== undefined &&\n config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP]?.[\n config.configurable?.checkpoint_ns\n ]\n ) {\n checkpointConfig = patchConfigurable(config, {\n checkpoint_id:\n config.configurable[CONFIG_KEY_CHECKPOINT_MAP][\n config.configurable?.checkpoint_ns\n ],\n });\n }\n const checkpointNamespace =\n config.configurable?.checkpoint_ns?.split(\n CHECKPOINT_NAMESPACE_SEPARATOR\n ) ?? [];\n\n const saved: CheckpointTuple = (await params.checkpointer?.getTuple(\n checkpointConfig\n )) ?? {\n config,\n checkpoint: emptyCheckpoint(),\n metadata: { source: \"input\", step: -2, parents: {} },\n pendingWrites: [],\n };\n checkpointConfig = {\n ...config,\n ...saved.config,\n configurable: {\n checkpoint_ns: \"\",\n ...config.configurable,\n ...saved.config.configurable,\n },\n };\n const prevCheckpointConfig = saved.parentConfig;\n const checkpoint = copyCheckpoint(saved.checkpoint);\n const checkpointMetadata = { ...saved.metadata } as CheckpointMetadata;\n const checkpointPendingWrites = saved.pendingWrites ?? [];\n\n const channels = emptyChannels(params.channelSpecs, checkpoint);\n\n const step = (checkpointMetadata.step ?? 0) + 1;\n const stop = step + (config.recursionLimit ?? DEFAULT_LOOP_LIMIT) + 1;\n const checkpointPreviousVersions = { ...checkpoint.channel_versions };\n\n const store = params.store\n ? new AsyncBatchedStore(params.store)\n : undefined;\n\n if (store) {\n // Start the store. This is a batch store, so it will run continuously\n await store.start();\n }\n return new PregelLoop({\n input: params.input,\n config,\n checkpointer: params.checkpointer,\n checkpoint,\n checkpointMetadata,\n checkpointConfig,\n prevCheckpointConfig,\n checkpointNamespace,\n channels,\n isNested,\n manager: params.manager,\n skipDoneTasks,\n step,\n stop,\n checkpointPreviousVersions,\n checkpointPendingWrites,\n outputKeys: params.outputKeys ?? [],\n streamKeys: params.streamKeys ?? [],\n nodes: params.nodes,\n stream,\n store,\n cache: params.cache,\n interruptAfter: params.interruptAfter,\n interruptBefore: params.interruptBefore,\n durability: params.durability,\n debug: params.debug,\n triggerToNodes: params.triggerToNodes,\n });\n }\n\n protected _checkpointerPutAfterPrevious(input: {\n config: RunnableConfig;\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n newVersions: Record<string, string | number>;\n }) {\n this._checkpointerChainedPromise = this._checkpointerChainedPromise.then(\n () => {\n return this.checkpointer?.put(\n input.config,\n input.checkpoint,\n input.metadata,\n input.newVersions\n );\n }\n );\n this.checkpointerPromises.push(this._checkpointerChainedPromise);\n }\n\n /**\n * Put writes for a task, to be read by the next tick.\n * @param taskId\n * @param writes\n */\n putWrites(taskId: string, writes: PendingWrite<string>[]) {\n let writesCopy = writes;\n if (writesCopy.length === 0) return;\n\n // deduplicate writes to special channels, last write wins\n if (writesCopy.every(([key]) => key in WRITES_IDX_MAP)) {\n writesCopy = Array.from(\n new Map(writesCopy.map((w) => [w[0], w])).values()\n );\n }\n\n // 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 writesCopy) {\n this.checkpointPendingWrites.push([taskId, c, v]);\n }\n\n const config = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]: this.config.configurable?.checkpoint_ns ?? \"\",\n [CONFIG_KEY_CHECKPOINT_ID]: this.checkpoint.id,\n });\n\n if (this.durability !== \"exit\" && this.checkpointer != null) {\n this.checkpointerPromises.push(\n this.checkpointer.putWrites(config, writesCopy, 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 (task.path?.[0] === PUSH && task.path?.at(-1) === true) return;\n\n const interruptWrites = writes\n .filter((w) => w[0] === INTERRUPT)\n .flatMap((w) => w[1] as string[]);\n\n this._emit([\n [\"updates\", { [INTERRUPT]: interruptWrites }],\n [\"values\", { [INTERRUPT]: interruptWrites }],\n ]);\n } else if (writes[0][0] !== ERROR) {\n this._emit(\n gatherIteratorSync(\n prefixGenerator(\n mapOutputUpdates(this.outputKeys, [[task, writes]], cached),\n \"updates\"\n )\n )\n );\n }\n }\n if (!cached) {\n this._emit(\n gatherIteratorSync(\n prefixGenerator(\n mapDebugTaskResults([[task, writes]], this.streamKeys),\n \"tasks\"\n )\n )\n );\n }\n }\n }\n\n async _matchCachedWrites() {\n if (!this.cache) return [];\n\n const matched: {\n task: PregelExecutableTask<string, string>;\n result: unknown;\n }[] = [];\n\n const serializeKey = ([ns, key]: CacheFullKey) => {\n return `ns:${ns.join(\",\")}|key:${key}`;\n };\n\n const keys: CacheFullKey[] = [];\n const keyMap: Record<string, PregelExecutableTask<string, string>> = {};\n\n for (const task of Object.values(this.tasks)) {\n if (task.cache_key != null && !task.writes.length) {\n keys.push([task.cache_key.ns, task.cache_key.key]);\n keyMap[serializeKey([task.cache_key.ns, task.cache_key.key])] = task;\n }\n }\n\n if (keys.length === 0) return [];\n const cache = await this.cache.get(keys);\n\n for (const { key, value } of cache) {\n const task = keyMap[serializeKey(key)];\n if (task != null) {\n // update the task with the cached writes\n task.writes.push(...value);\n matched.push({ task, result: value });\n }\n }\n\n return matched;\n }\n\n /**\n * Execute a single iteration of the Pregel loop.\n * Returns true if more iterations are needed.\n * @param params\n */\n async tick(params: { inputKeys?: string | string[] }): Promise<boolean> {\n if (this.store && !this.store.isRunning) {\n await this.store?.start();\n }\n const { inputKeys = [] } = params;\n if (this.status !== \"pending\") {\n throw new Error(\n `Cannot tick when status is no longer \"pending\". Current status: \"${this.status}\"`\n );\n }\n if (![INPUT_DONE, INPUT_RESUMING].includes(this.input)) {\n await this._first(inputKeys);\n } else if (this.toInterrupt.length > 0) {\n this.status = \"interrupt_before\";\n throw new GraphInterrupt();\n } else if (\n Object.values(this.tasks).every((task) => task.writes.length > 0)\n ) {\n // finish superstep\n const writes = Object.values(this.tasks).flatMap((t) => t.writes);\n // All tasks have finished\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n Object.values(this.tasks),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n // produce values output\n const valuesOutput = await gatherIterator(\n prefixGenerator(\n mapOutputValues(this.outputKeys, writes, this.channels),\n \"values\"\n )\n );\n this._emit(valuesOutput);\n // clear pending writes\n this.checkpointPendingWrites = [];\n await this._putCheckpoint({ source: \"loop\" });\n // after execution, check if we should interrupt\n if (\n shouldInterrupt(\n this.checkpoint,\n this.interruptAfter,\n Object.values(this.tasks)\n )\n ) {\n this.status = \"interrupt_after\";\n throw new GraphInterrupt();\n }\n\n // unset resuming flag\n if (this.config.configurable?.[CONFIG_KEY_RESUMING] !== undefined) {\n delete this.config.configurable?.[CONFIG_KEY_RESUMING];\n }\n } else {\n return false;\n }\n if (this.step > this.stop) {\n this.status = \"out_of_steps\";\n return false;\n }\n\n const nextTasks = _prepareNextTasks(\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n this.config,\n true,\n {\n step: this.step,\n checkpointer: this.checkpointer,\n isResuming: this.isResuming,\n manager: this.manager,\n store: this.store,\n stream: this.stream,\n triggerToNodes: this.triggerToNodes,\n updatedChannels: this.updatedChannels,\n }\n );\n this.tasks = nextTasks;\n\n // Produce debug output\n if (this.checkpointer) {\n this._emit(\n await gatherIterator(\n prefixGenerator(\n mapDebugCheckpoint(\n this.checkpointConfig,\n this.channels,\n this.streamKeys,\n this.checkpointMetadata,\n Object.values(this.tasks),\n this.checkpointPendingWrites,\n this.prevCheckpointConfig,\n this.outputKeys\n ),\n \"checkpoints\"\n )\n )\n );\n }\n\n if (Object.values(this.tasks).length === 0) {\n this.status = \"done\";\n return false;\n }\n // if there are pending writes from a previous loop, apply them\n if (this.skipDoneTasks && this.checkpointPendingWrites.length > 0) {\n for (const [tid, k, v] of this.checkpointPendingWrites) {\n if (k === ERROR || k === INTERRUPT || k === RESUME) {\n continue;\n }\n const task = Object.values(this.tasks).find((t) => t.id === tid);\n if (task) {\n task.writes.push([k, v]);\n }\n }\n for (const task of Object.values(this.tasks)) {\n if (task.writes.length > 0) {\n this._outputWrites(task.id, task.writes, true);\n }\n }\n }\n // if all tasks have finished, re-tick\n if (Object.values(this.tasks).every((task) => task.writes.length > 0)) {\n return this.tick({ inputKeys });\n }\n\n // Before execution, check if we should interrupt\n if (\n shouldInterrupt(\n this.checkpoint,\n this.interruptBefore,\n Object.values(this.tasks)\n )\n ) {\n this.status = \"interrupt_before\";\n throw new GraphInterrupt();\n }\n\n // Produce debug output\n const debugOutput = await gatherIterator(\n prefixGenerator(mapDebugTasks(Object.values(this.tasks)), \"tasks\")\n );\n this._emit(debugOutput);\n\n return true;\n }\n\n async finishAndHandleError(error?: Error) {\n // persist current checkpoint and writes\n if (\n this.durability === \"exit\" &&\n // if it's a top graph\n (!this.isNested ||\n // or a nested graph with error or interrupt\n typeof error !== \"undefined\" ||\n // or a nested graph with checkpointer: true\n this.checkpointNamespace.every(\n (part) => !part.includes(CHECKPOINT_NAMESPACE_END)\n ))\n ) {\n this._putCheckpoint(this.checkpointMetadata);\n this._flushPendingWrites();\n }\n\n const suppress = this._suppressInterrupt(error);\n if (suppress || error === undefined) {\n this.output = readChannels(this.channels, this.outputKeys);\n }\n if (suppress) {\n // emit one last \"values\" event, with pending writes applied\n if (\n this.tasks !== undefined &&\n this.checkpointPendingWrites.length > 0 &&\n Object.values(this.tasks).some((task) => task.writes.length > 0)\n ) {\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n Object.values(this.tasks),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n\n this._emit(\n gatherIteratorSync(\n prefixGenerator(\n mapOutputValues(\n this.outputKeys,\n Object.values(this.tasks).flatMap((t) => t.writes),\n this.channels\n ),\n \"values\"\n )\n )\n );\n }\n\n // Emit INTERRUPT event\n if (isGraphInterrupt(error) && !error.interrupts.length) {\n this._emit([\n [\"updates\", { [INTERRUPT]: [] }],\n [\"values\", { [INTERRUPT]: [] }],\n ]);\n }\n }\n return suppress;\n }\n\n async acceptPush(\n task: PregelExecutableTask<string, string>,\n writeIdx: number,\n call?: Call\n ): Promise<PregelExecutableTask<string, string> | void> {\n if (\n this.interruptAfter?.length > 0 &&\n shouldInterrupt(this.checkpoint, this.interruptAfter, [task])\n ) {\n this.toInterrupt.push(task);\n return;\n }\n\n const pushed = _prepareSingleTask(\n [PUSH, task.path ?? [], writeIdx, task.id, call] as CallTaskPath,\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n task.config ?? {},\n true,\n {\n step: this.step,\n checkpointer: this.checkpointer,\n manager: this.manager,\n store: this.store,\n stream: this.stream,\n }\n );\n\n if (!pushed) return;\n if (\n this.interruptBefore?.length > 0 &&\n shouldInterrupt(this.checkpoint, this.interruptBefore, [pushed])\n ) {\n this.toInterrupt.push(pushed);\n return;\n }\n\n this._emit(\n gatherIteratorSync(prefixGenerator(mapDebugTasks([pushed]), \"tasks\"))\n );\n\n if (this.debug) printStepTasks(this.step, [pushed]);\n this.tasks[pushed.id] = pushed;\n if (this.skipDoneTasks) this._matchWrites({ [pushed.id]: pushed });\n\n const tasks = await this._matchCachedWrites();\n for (const { task } of tasks) {\n this._outputWrites(task.id, task.writes, true);\n }\n\n return pushed;\n }\n\n protected _suppressInterrupt(e?: Error): boolean {\n return isGraphInterrupt(e) && !this.isNested;\n }\n\n protected async _first(inputKeys: string | string[]) {\n /*\n * Resuming from previous checkpoint requires\n * - finding a previous checkpoint\n * - receiving null input (outer graph) or RESUMING flag (subgraph)\n */\n\n const { configurable } = this.config;\n\n // take resume value from parent\n const scratchpad = configurable?.[\n CONFIG_KEY_SCRATCHPAD\n ] as PregelScratchpad;\n\n if (scratchpad && scratchpad.nullResume !== undefined) {\n this.putWrites(NULL_TASK_ID, [[RESUME, scratchpad.nullResume]]);\n }\n\n // map command to writes\n if (isCommand(this.input)) {\n const hasResume = this.input.resume != null;\n\n if (\n this.input.resume != null &&\n typeof this.input.resume === \"object\" &&\n Object.keys(this.input.resume).every(isXXH3)\n ) {\n this.config.configurable ??= {};\n this.config.configurable[CONFIG_KEY_RESUME_MAP] = this.input.resume;\n }\n\n if (hasResume && this.checkpointer == null) {\n throw new Error(\"Cannot use Command(resume=...) without checkpointer\");\n }\n\n const writes: { [key: string]: PendingWrite[] } = {};\n\n // group writes by task id\n for (const [tid, key, value] of mapCommand(\n this.input,\n this.checkpointPendingWrites\n )) {\n writes[tid] ??= [];\n writes[tid].push([key, value]);\n }\n if (Object.keys(writes).length === 0) {\n throw new EmptyInputError(\"Received empty Command input\");\n }\n\n // save writes\n for (const [tid, ws] of Object.entries(writes)) {\n this.putWrites(tid, ws);\n }\n }\n\n // apply null writes\n const nullWrites = (this.checkpointPendingWrites ?? [])\n .filter((w) => w[0] === NULL_TASK_ID)\n .map((w) => w.slice(1)) as PendingWrite<string>[];\n if (nullWrites.length > 0) {\n _applyWrites(\n this.checkpoint,\n this.channels,\n [\n {\n name: INPUT,\n writes: nullWrites,\n triggers: [],\n },\n ],\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n }\n const isCommandUpdateOrGoto =\n isCommand(this.input) && nullWrites.length > 0;\n if (this.isResuming || isCommandUpdateOrGoto) {\n for (const channelName in this.channels) {\n if (!Object.prototype.hasOwnProperty.call(this.channels, channelName))\n continue;\n if (this.checkpoint.channel_versions[channelName] !== undefined) {\n const version = this.checkpoint.channel_versions[channelName];\n this.checkpoint.versions_seen[INTERRUPT] = {\n ...this.checkpoint.versions_seen[INTERRUPT],\n [channelName]: version,\n };\n }\n }\n // produce values output\n const valuesOutput = await gatherIterator(\n prefixGenerator(\n mapOutputValues(this.outputKeys, true, this.channels),\n \"values\"\n )\n );\n this._emit(valuesOutput);\n }\n if (this.isResuming) {\n this.input = INPUT_RESUMING;\n } else if (isCommandUpdateOrGoto) {\n // we need to create a new checkpoint for Command(update=...) or Command(goto=...)\n // in case the result of Command(goto=...) is an interrupt.\n // If not done, the checkpoint containing the interrupt will be lost.\n await this._putCheckpoint({ source: \"input\" });\n this.input = INPUT_DONE;\n } else {\n // map inputs to channel updates\n const inputWrites = await gatherIterator(mapInput(inputKeys, this.input));\n if (inputWrites.length > 0) {\n const discardTasks = _prepareNextTasks(\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n this.config,\n true,\n { step: this.step }\n );\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n (Object.values(discardTasks) as WritesProtocol[]).concat([\n {\n name: INPUT,\n writes: inputWrites as PendingWrite[],\n triggers: [],\n },\n ]),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n // save input checkpoint\n await this._putCheckpoint({ source: \"input\" });\n\n this.input = INPUT_DONE;\n } else if (!(CONFIG_KEY_RESUMING in (this.config.configurable ?? {}))) {\n throw new EmptyInputError(\n `Received no input writes for ${JSON.stringify(inputKeys, null, 2)}`\n );\n } else {\n // done with input\n this.input = INPUT_DONE;\n }\n }\n if (!this.isNested) {\n this.config = patchConfigurable(this.config, {\n [CONFIG_KEY_RESUMING]: this.isResuming,\n });\n }\n }\n\n protected _emit(values: [StreamMode, unknown][]) {\n for (const [mode, payload] of values) {\n if (this.stream.modes.has(mode)) {\n this.stream.push([this.checkpointNamespace, mode, payload]);\n }\n\n // debug mode is a \"checkpoints\" or \"tasks\" wrapped in an object\n // TODO: consider deprecating this in 1.x\n if (\n (mode === \"checkpoints\" || mode === \"tasks\") &&\n this.stream.modes.has(\"debug\")\n ) {\n const step = mode === \"checkpoints\" ? this.step - 1 : this.step;\n const timestamp = new Date().toISOString();\n const type = (() => {\n if (mode === \"checkpoints\") {\n return \"checkpoint\";\n } else if (\n typeof payload === \"object\" &&\n payload != null &&\n \"result\" in payload\n ) {\n return \"task_result\";\n } else {\n return \"task\";\n }\n })();\n\n this.stream.push([\n this.checkpointNamespace,\n \"debug\",\n { step, type, timestamp, payload },\n ]);\n }\n }\n }\n\n protected _putCheckpoint(\n inputMetadata: Omit<CheckpointMetadata, \"step\" | \"parents\">\n ) {\n const exiting = this.checkpointMetadata === inputMetadata;\n\n const doCheckpoint =\n this.checkpointer != null && (this.durability !== \"exit\" || exiting);\n\n const storeCheckpoint = (checkpoint: Checkpoint) => {\n // store the previous checkpoint config for debug events\n this.prevCheckpointConfig = this.checkpointConfig?.configurable\n ?.checkpoint_id\n ? this.checkpointConfig\n : undefined;\n\n // child graphs keep at most one checkpoint per parent checkpoint\n // this is achieved by writing child checkpoints as progress is made\n // (so that error recovery / resuming from interrupt don't lose work)\n // but doing so always with an id equal to that of the parent checkpoint\n this.checkpointConfig = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]:\n this.config.configurable?.checkpoint_ns ?? \"\",\n });\n\n const channelVersions = { ...this.checkpoint.channel_versions };\n const newVersions = getNewChannelVersions(\n this.checkpointPreviousVersions,\n channelVersions\n );\n this.checkpointPreviousVersions = channelVersions;\n // save it, without blocking\n // if there's a previous checkpoint save in progress, wait for it\n // ensuring checkpointers receive checkpoints in order\n void this._checkpointerPutAfterPrevious({\n config: { ...this.checkpointConfig },\n checkpoint: copyCheckpoint(checkpoint),\n metadata: { ...this.checkpointMetadata },\n newVersions,\n });\n this.checkpointConfig = {\n ...this.checkpointConfig,\n configurable: {\n ...this.checkpointConfig.configurable,\n checkpoint_id: this.checkpoint.id,\n },\n };\n };\n\n if (!exiting) {\n this.checkpointMetadata = {\n ...inputMetadata,\n step: this.step,\n parents: this.config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP] ?? {},\n };\n }\n\n // create new checkpoint\n this.checkpoint = createCheckpoint(\n this.checkpoint,\n doCheckpoint ? this.channels : undefined,\n this.step,\n exiting ? { id: this.checkpoint.id } : undefined\n );\n\n // Bail if no checkpointer\n if (doCheckpoint) storeCheckpoint(this.checkpoint);\n\n if (!exiting) {\n // increment step\n this.step += 1;\n }\n }\n\n protected _flushPendingWrites() {\n if (this.checkpointer == null) return;\n if (this.checkpointPendingWrites.length === 0) return;\n\n // patch config\n const config = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]: this.config.configurable?.checkpoint_ns ?? \"\",\n [CONFIG_KEY_CHECKPOINT_ID]: this.checkpoint.id,\n });\n\n // group writes by task id\n const byTask: Record<string, PendingWrite<string>[]> = {};\n for (const [tid, key, value] of this.checkpointPendingWrites) {\n byTask[tid] ??= [];\n byTask[tid].push([key, value]);\n }\n\n // submit writes to checkpointer\n for (const [tid, ws] of Object.entries(byTask)) {\n this.checkpointerPromises.push(\n this.checkpointer.putWrites(config, ws, tid)\n );\n }\n }\n\n protected _matchWrites(\n tasks: Record<string, PregelExecutableTask<string, string>>\n ) {\n for (const [tid, k, v] of this.checkpointPendingWrites) {\n if (k === ERROR || k === INTERRUPT || k === RESUME) {\n continue;\n }\n const task = Object.values(tasks).find((t) => t.id === tid);\n if (task) {\n task.writes.push([k, v]);\n }\n }\n for (const task of Object.values(tasks)) {\n if (task.writes.length > 0) {\n this._outputWrites(task.id, task.writes, true);\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -1,17 +1,16 @@
1
- const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
1
  const require_constants = require('../constants.cjs');
3
- const __langchain_core_callbacks_base = require_rolldown_runtime.__toESM(require("@langchain/core/callbacks/base"));
4
- const __langchain_core_messages = require_rolldown_runtime.__toESM(require("@langchain/core/messages"));
2
+ let _langchain_core_callbacks_base = require("@langchain/core/callbacks/base");
3
+ let _langchain_core_messages = require("@langchain/core/messages");
5
4
 
6
5
  //#region src/pregel/messages.ts
7
6
  function isChatGenerationChunk(x) {
8
- return (0, __langchain_core_messages.isBaseMessage)(x?.message);
7
+ return (0, _langchain_core_messages.isBaseMessage)(x?.message);
9
8
  }
10
9
  /**
11
10
  * A callback handler that implements stream_mode=messages.
12
11
  * Collects messages from (1) chat model stream events and (2) node outputs.
13
12
  */
14
- var StreamMessagesHandler = class extends __langchain_core_callbacks_base.BaseCallbackHandler {
13
+ var StreamMessagesHandler = class extends _langchain_core_callbacks_base.BaseCallbackHandler {
15
14
  name = "StreamMessagesHandler";
16
15
  streamFn;
17
16
  metadatas = {};
@@ -26,7 +25,7 @@ var StreamMessagesHandler = class extends __langchain_core_callbacks_base.BaseCa
26
25
  _emit(meta, message, runId, dedupe = false) {
27
26
  if (dedupe && message.id !== void 0 && this.seen[message.id] !== void 0) return;
28
27
  let messageId = message.id;
29
- if (runId != null) if ((0, __langchain_core_messages.isToolMessage)(message)) messageId ??= `run-${runId}-tool-${message.tool_call_id}`;
28
+ if (runId != null) if ((0, _langchain_core_messages.isToolMessage)(message)) messageId ??= `run-${runId}-tool-${message.tool_call_id}`;
30
29
  else {
31
30
  if (messageId == null || messageId === `run-${runId}`) messageId = this.stableMessageIdMap[runId] ?? messageId ?? `run-${runId}`;
32
31
  this.stableMessageIdMap[runId] ??= messageId;
@@ -53,13 +52,13 @@ var StreamMessagesHandler = class extends __langchain_core_callbacks_base.BaseCa
53
52
  const chunk = fields?.chunk;
54
53
  this.emittedChatModelRunIds[runId] = true;
55
54
  if (this.metadatas[runId] !== void 0) if (isChatGenerationChunk(chunk)) this._emit(this.metadatas[runId], chunk.message, runId);
56
- else this._emit(this.metadatas[runId], new __langchain_core_messages.AIMessageChunk({ content: token }), runId);
55
+ else this._emit(this.metadatas[runId], new _langchain_core_messages.AIMessageChunk({ content: token }), runId);
57
56
  }
58
57
  handleLLMEnd(output, runId) {
59
58
  if (this.metadatas[runId] === void 0) return;
60
59
  if (!this.emittedChatModelRunIds[runId]) {
61
60
  const chatGeneration = output.generations?.[0]?.[0];
62
- if ((0, __langchain_core_messages.isBaseMessage)(chatGeneration?.message)) this._emit(this.metadatas[runId], chatGeneration?.message, runId, true);
61
+ if ((0, _langchain_core_messages.isBaseMessage)(chatGeneration?.message)) this._emit(this.metadatas[runId], chatGeneration?.message, runId, true);
63
62
  delete this.emittedChatModelRunIds[runId];
64
63
  }
65
64
  delete this.metadatas[runId];
@@ -76,9 +75,9 @@ var StreamMessagesHandler = class extends __langchain_core_callbacks_base.BaseCa
76
75
  ...metadata
77
76
  }];
78
77
  if (typeof inputs === "object") {
79
- for (const value of Object.values(inputs)) if (((0, __langchain_core_messages.isBaseMessage)(value) || (0, __langchain_core_messages.isBaseMessageChunk)(value)) && value.id !== void 0) this.seen[value.id] = value;
78
+ for (const value of Object.values(inputs)) if (((0, _langchain_core_messages.isBaseMessage)(value) || (0, _langchain_core_messages.isBaseMessageChunk)(value)) && value.id !== void 0) this.seen[value.id] = value;
80
79
  else if (Array.isArray(value)) {
81
- for (const item of value) if (((0, __langchain_core_messages.isBaseMessage)(item) || (0, __langchain_core_messages.isBaseMessageChunk)(item)) && item.id !== void 0) this.seen[item.id] = item;
80
+ for (const item of value) if (((0, _langchain_core_messages.isBaseMessage)(item) || (0, _langchain_core_messages.isBaseMessageChunk)(item)) && item.id !== void 0) this.seen[item.id] = item;
82
81
  }
83
82
  }
84
83
  }
@@ -87,13 +86,13 @@ var StreamMessagesHandler = class extends __langchain_core_callbacks_base.BaseCa
87
86
  const metadata = this.metadatas[runId];
88
87
  delete this.metadatas[runId];
89
88
  if (metadata !== void 0) {
90
- if ((0, __langchain_core_messages.isBaseMessage)(outputs)) this._emit(metadata, outputs, runId, true);
89
+ if ((0, _langchain_core_messages.isBaseMessage)(outputs)) this._emit(metadata, outputs, runId, true);
91
90
  else if (Array.isArray(outputs)) {
92
- for (const value of outputs) if ((0, __langchain_core_messages.isBaseMessage)(value)) this._emit(metadata, value, runId, true);
91
+ for (const value of outputs) if ((0, _langchain_core_messages.isBaseMessage)(value)) this._emit(metadata, value, runId, true);
93
92
  } else if (outputs != null && typeof outputs === "object") {
94
- for (const value of Object.values(outputs)) if ((0, __langchain_core_messages.isBaseMessage)(value)) this._emit(metadata, value, runId, true);
93
+ for (const value of Object.values(outputs)) if ((0, _langchain_core_messages.isBaseMessage)(value)) this._emit(metadata, value, runId, true);
95
94
  else if (Array.isArray(value)) {
96
- for (const item of value) if ((0, __langchain_core_messages.isBaseMessage)(item)) this._emit(metadata, item, runId, true);
95
+ for (const item of value) if ((0, _langchain_core_messages.isBaseMessage)(item)) this._emit(metadata, item, runId, true);
97
96
  }
98
97
  }
99
98
  }
@@ -1 +1 @@
1
- {"version":3,"file":"messages.cjs","names":["BaseCallbackHandler","TAG_NOSTREAM","AIMessageChunk","TAG_HIDDEN"],"sources":["../../src/pregel/messages.ts"],"sourcesContent":["import {\n BaseCallbackHandler,\n HandleLLMNewTokenCallbackFields,\n NewTokenIndices,\n} from \"@langchain/core/callbacks/base\";\nimport {\n AIMessageChunk,\n BaseMessage,\n isBaseMessage,\n isBaseMessageChunk,\n isToolMessage,\n} from \"@langchain/core/messages\";\nimport { Serialized } from \"@langchain/core/load/serializable\";\nimport {\n ChatGeneration,\n ChatGenerationChunk,\n LLMResult,\n} from \"@langchain/core/outputs\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\n\nimport { TAG_HIDDEN, TAG_NOSTREAM } from \"../constants.js\";\nimport { StreamChunk } from \"./stream.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Meta = [string[], Record<string, any>];\n\nfunction isChatGenerationChunk(x: unknown): x is ChatGenerationChunk {\n return isBaseMessage((x as ChatGenerationChunk)?.message);\n}\n\n/**\n * A callback handler that implements stream_mode=messages.\n * Collects messages from (1) chat model stream events and (2) node outputs.\n */\n// TODO: Make this import and explicitly implement the\n// CallbackHandlerPrefersStreaming interface once we drop support for core 0.2\nexport class StreamMessagesHandler extends BaseCallbackHandler {\n name = \"StreamMessagesHandler\";\n\n streamFn: (streamChunk: StreamChunk) => void;\n\n metadatas: Record<string, Meta | undefined> = {};\n\n seen: Record<string, BaseMessage> = {};\n\n emittedChatModelRunIds: Record<string, boolean> = {};\n\n stableMessageIdMap: Record<string, string> = {};\n\n lc_prefer_streaming = true;\n\n constructor(streamFn: (streamChunk: StreamChunk) => void) {\n super();\n this.streamFn = streamFn;\n }\n\n _emit(\n meta: Meta,\n message: BaseMessage,\n runId: string | undefined,\n dedupe = false\n ) {\n if (\n dedupe &&\n message.id !== undefined &&\n this.seen[message.id] !== undefined\n ) {\n return;\n }\n\n let messageId = message.id;\n\n if (runId != null) {\n if (isToolMessage(message)) {\n // Distinguish tool messages by tool call ID.\n messageId ??= `run-${runId}-tool-${message.tool_call_id}`;\n } else {\n // For instance in ChatAnthropic, the first chunk has an message ID\n // but the subsequent chunks do not. To avoid clients seeing two messages\n // we rename the message ID if it's being auto-set to `run-${runId}`\n // (see https://github.com/langchain-ai/langchainjs/pull/6646).\n if (messageId == null || messageId === `run-${runId}`) {\n messageId =\n this.stableMessageIdMap[runId] ?? messageId ?? `run-${runId}`;\n }\n\n this.stableMessageIdMap[runId] ??= messageId;\n }\n }\n\n if (messageId !== message.id) {\n // eslint-disable-next-line no-param-reassign\n message.id = messageId;\n\n // eslint-disable-next-line no-param-reassign\n message.lc_kwargs.id = messageId;\n }\n\n if (message.id != null) this.seen[message.id] = message;\n this.streamFn([meta[0], \"messages\", [message, meta[1]]]);\n }\n\n handleChatModelStart(\n _llm: Serialized,\n _messages: BaseMessage[][],\n runId: string,\n _parentRunId?: string,\n _extraParams?: Record<string, unknown>,\n tags?: string[],\n metadata?: Record<string, unknown>,\n name?: string\n ) {\n if (\n metadata &&\n // Include legacy LangGraph SDK tag\n (!tags || (!tags.includes(TAG_NOSTREAM) && !tags.includes(\"nostream\")))\n ) {\n this.metadatas[runId] = [\n (metadata.langgraph_checkpoint_ns as string).split(\"|\"),\n { tags, name, ...metadata },\n ];\n }\n }\n\n handleLLMNewToken(\n token: string,\n _idx: NewTokenIndices,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n fields?: HandleLLMNewTokenCallbackFields\n ) {\n const chunk = fields?.chunk;\n this.emittedChatModelRunIds[runId] = true;\n if (this.metadatas[runId] !== undefined) {\n if (isChatGenerationChunk(chunk)) {\n this._emit(this.metadatas[runId], chunk.message, runId);\n } else {\n this._emit(\n this.metadatas[runId],\n new AIMessageChunk({ content: token }),\n runId\n );\n }\n }\n }\n\n handleLLMEnd(output: LLMResult, runId: string) {\n // Filter out runs that we do not have metadata for\n if (this.metadatas[runId] === undefined) return;\n\n // In JS, non-streaming runs do not call handleLLMNewToken at the model level\n if (!this.emittedChatModelRunIds[runId]) {\n const chatGeneration = output.generations?.[0]?.[0] as ChatGeneration;\n if (isBaseMessage(chatGeneration?.message)) {\n this._emit(this.metadatas[runId], chatGeneration?.message, runId, true);\n }\n delete this.emittedChatModelRunIds[runId];\n }\n delete this.metadatas[runId];\n delete this.stableMessageIdMap[runId];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleLLMError(_err: any, runId: string) {\n delete this.metadatas[runId];\n }\n\n handleChainStart(\n _chain: Serialized,\n inputs: ChainValues,\n runId: string,\n _parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n _runType?: string,\n name?: string\n ) {\n if (\n metadata !== undefined &&\n name === metadata.langgraph_node &&\n (tags === undefined || !tags.includes(TAG_HIDDEN))\n ) {\n this.metadatas[runId] = [\n (metadata.langgraph_checkpoint_ns as string).split(\"|\"),\n { tags, name, ...metadata },\n ];\n\n if (typeof inputs === \"object\") {\n for (const value of Object.values(inputs)) {\n if (\n (isBaseMessage(value) || isBaseMessageChunk(value)) &&\n value.id !== undefined\n ) {\n this.seen[value.id] = value;\n } else if (Array.isArray(value)) {\n for (const item of value) {\n if (\n (isBaseMessage(item) || isBaseMessageChunk(item)) &&\n item.id !== undefined\n ) {\n this.seen[item.id] = item;\n }\n }\n }\n }\n }\n }\n }\n\n handleChainEnd(outputs: ChainValues, runId: string) {\n const metadata = this.metadatas[runId];\n delete this.metadatas[runId];\n if (metadata !== undefined) {\n if (isBaseMessage(outputs)) {\n this._emit(metadata, outputs, runId, true);\n } else if (Array.isArray(outputs)) {\n for (const value of outputs) {\n if (isBaseMessage(value)) {\n this._emit(metadata, value, runId, true);\n }\n }\n } else if (outputs != null && typeof outputs === \"object\") {\n for (const value of Object.values(outputs)) {\n if (isBaseMessage(value)) {\n this._emit(metadata, value, runId, true);\n } else if (Array.isArray(value)) {\n for (const item of value) {\n if (isBaseMessage(item)) {\n this._emit(metadata, item, runId, true);\n }\n }\n }\n }\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleChainError(_err: any, runId: string) {\n delete this.metadatas[runId];\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"messages.cjs","names":["BaseCallbackHandler","TAG_NOSTREAM","AIMessageChunk","TAG_HIDDEN"],"sources":["../../src/pregel/messages.ts"],"sourcesContent":["import {\n BaseCallbackHandler,\n HandleLLMNewTokenCallbackFields,\n NewTokenIndices,\n} from \"@langchain/core/callbacks/base\";\nimport {\n AIMessageChunk,\n BaseMessage,\n isBaseMessage,\n isBaseMessageChunk,\n isToolMessage,\n} from \"@langchain/core/messages\";\nimport { Serialized } from \"@langchain/core/load/serializable\";\nimport {\n ChatGeneration,\n ChatGenerationChunk,\n LLMResult,\n} from \"@langchain/core/outputs\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\n\nimport { TAG_HIDDEN, TAG_NOSTREAM } from \"../constants.js\";\nimport { StreamChunk } from \"./stream.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Meta = [string[], Record<string, any>];\n\nfunction isChatGenerationChunk(x: unknown): x is ChatGenerationChunk {\n return isBaseMessage((x as ChatGenerationChunk)?.message);\n}\n\n/**\n * A callback handler that implements stream_mode=messages.\n * Collects messages from (1) chat model stream events and (2) node outputs.\n */\n// TODO: Make this import and explicitly implement the\n// CallbackHandlerPrefersStreaming interface once we drop support for core 0.2\nexport class StreamMessagesHandler extends BaseCallbackHandler {\n name = \"StreamMessagesHandler\";\n\n streamFn: (streamChunk: StreamChunk) => void;\n\n metadatas: Record<string, Meta | undefined> = {};\n\n seen: Record<string, BaseMessage> = {};\n\n emittedChatModelRunIds: Record<string, boolean> = {};\n\n stableMessageIdMap: Record<string, string> = {};\n\n lc_prefer_streaming = true;\n\n constructor(streamFn: (streamChunk: StreamChunk) => void) {\n super();\n this.streamFn = streamFn;\n }\n\n _emit(\n meta: Meta,\n message: BaseMessage,\n runId: string | undefined,\n dedupe = false\n ) {\n if (\n dedupe &&\n message.id !== undefined &&\n this.seen[message.id] !== undefined\n ) {\n return;\n }\n\n let messageId = message.id;\n\n if (runId != null) {\n if (isToolMessage(message)) {\n // Distinguish tool messages by tool call ID.\n messageId ??= `run-${runId}-tool-${message.tool_call_id}`;\n } else {\n // For instance in ChatAnthropic, the first chunk has an message ID\n // but the subsequent chunks do not. To avoid clients seeing two messages\n // we rename the message ID if it's being auto-set to `run-${runId}`\n // (see https://github.com/langchain-ai/langchainjs/pull/6646).\n if (messageId == null || messageId === `run-${runId}`) {\n messageId =\n this.stableMessageIdMap[runId] ?? messageId ?? `run-${runId}`;\n }\n\n this.stableMessageIdMap[runId] ??= messageId;\n }\n }\n\n if (messageId !== message.id) {\n // eslint-disable-next-line no-param-reassign\n message.id = messageId;\n\n // eslint-disable-next-line no-param-reassign\n message.lc_kwargs.id = messageId;\n }\n\n if (message.id != null) this.seen[message.id] = message;\n this.streamFn([meta[0], \"messages\", [message, meta[1]]]);\n }\n\n handleChatModelStart(\n _llm: Serialized,\n _messages: BaseMessage[][],\n runId: string,\n _parentRunId?: string,\n _extraParams?: Record<string, unknown>,\n tags?: string[],\n metadata?: Record<string, unknown>,\n name?: string\n ) {\n if (\n metadata &&\n // Include legacy LangGraph SDK tag\n (!tags || (!tags.includes(TAG_NOSTREAM) && !tags.includes(\"nostream\")))\n ) {\n this.metadatas[runId] = [\n (metadata.langgraph_checkpoint_ns as string).split(\"|\"),\n { tags, name, ...metadata },\n ];\n }\n }\n\n handleLLMNewToken(\n token: string,\n _idx: NewTokenIndices,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n fields?: HandleLLMNewTokenCallbackFields\n ) {\n const chunk = fields?.chunk;\n this.emittedChatModelRunIds[runId] = true;\n if (this.metadatas[runId] !== undefined) {\n if (isChatGenerationChunk(chunk)) {\n this._emit(this.metadatas[runId], chunk.message, runId);\n } else {\n this._emit(\n this.metadatas[runId],\n new AIMessageChunk({ content: token }),\n runId\n );\n }\n }\n }\n\n handleLLMEnd(output: LLMResult, runId: string) {\n // Filter out runs that we do not have metadata for\n if (this.metadatas[runId] === undefined) return;\n\n // In JS, non-streaming runs do not call handleLLMNewToken at the model level\n if (!this.emittedChatModelRunIds[runId]) {\n const chatGeneration = output.generations?.[0]?.[0] as ChatGeneration;\n if (isBaseMessage(chatGeneration?.message)) {\n this._emit(this.metadatas[runId], chatGeneration?.message, runId, true);\n }\n delete this.emittedChatModelRunIds[runId];\n }\n delete this.metadatas[runId];\n delete this.stableMessageIdMap[runId];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleLLMError(_err: any, runId: string) {\n delete this.metadatas[runId];\n }\n\n handleChainStart(\n _chain: Serialized,\n inputs: ChainValues,\n runId: string,\n _parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n _runType?: string,\n name?: string\n ) {\n if (\n metadata !== undefined &&\n name === metadata.langgraph_node &&\n (tags === undefined || !tags.includes(TAG_HIDDEN))\n ) {\n this.metadatas[runId] = [\n (metadata.langgraph_checkpoint_ns as string).split(\"|\"),\n { tags, name, ...metadata },\n ];\n\n if (typeof inputs === \"object\") {\n for (const value of Object.values(inputs)) {\n if (\n (isBaseMessage(value) || isBaseMessageChunk(value)) &&\n value.id !== undefined\n ) {\n this.seen[value.id] = value;\n } else if (Array.isArray(value)) {\n for (const item of value) {\n if (\n (isBaseMessage(item) || isBaseMessageChunk(item)) &&\n item.id !== undefined\n ) {\n this.seen[item.id] = item;\n }\n }\n }\n }\n }\n }\n }\n\n handleChainEnd(outputs: ChainValues, runId: string) {\n const metadata = this.metadatas[runId];\n delete this.metadatas[runId];\n if (metadata !== undefined) {\n if (isBaseMessage(outputs)) {\n this._emit(metadata, outputs, runId, true);\n } else if (Array.isArray(outputs)) {\n for (const value of outputs) {\n if (isBaseMessage(value)) {\n this._emit(metadata, value, runId, true);\n }\n }\n } else if (outputs != null && typeof outputs === \"object\") {\n for (const value of Object.values(outputs)) {\n if (isBaseMessage(value)) {\n this._emit(metadata, value, runId, true);\n } else if (Array.isArray(value)) {\n for (const item of value) {\n if (isBaseMessage(item)) {\n this._emit(metadata, item, runId, true);\n }\n }\n }\n }\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleChainError(_err: any, runId: string) {\n delete this.metadatas[runId];\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","names":[],"sources":["../../src/pregel/messages.ts"],"sourcesContent":["import {\n BaseCallbackHandler,\n HandleLLMNewTokenCallbackFields,\n NewTokenIndices,\n} from \"@langchain/core/callbacks/base\";\nimport {\n AIMessageChunk,\n BaseMessage,\n isBaseMessage,\n isBaseMessageChunk,\n isToolMessage,\n} from \"@langchain/core/messages\";\nimport { Serialized } from \"@langchain/core/load/serializable\";\nimport {\n ChatGeneration,\n ChatGenerationChunk,\n LLMResult,\n} from \"@langchain/core/outputs\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\n\nimport { TAG_HIDDEN, TAG_NOSTREAM } from \"../constants.js\";\nimport { StreamChunk } from \"./stream.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Meta = [string[], Record<string, any>];\n\nfunction isChatGenerationChunk(x: unknown): x is ChatGenerationChunk {\n return isBaseMessage((x as ChatGenerationChunk)?.message);\n}\n\n/**\n * A callback handler that implements stream_mode=messages.\n * Collects messages from (1) chat model stream events and (2) node outputs.\n */\n// TODO: Make this import and explicitly implement the\n// CallbackHandlerPrefersStreaming interface once we drop support for core 0.2\nexport class StreamMessagesHandler extends BaseCallbackHandler {\n name = \"StreamMessagesHandler\";\n\n streamFn: (streamChunk: StreamChunk) => void;\n\n metadatas: Record<string, Meta | undefined> = {};\n\n seen: Record<string, BaseMessage> = {};\n\n emittedChatModelRunIds: Record<string, boolean> = {};\n\n stableMessageIdMap: Record<string, string> = {};\n\n lc_prefer_streaming = true;\n\n constructor(streamFn: (streamChunk: StreamChunk) => void) {\n super();\n this.streamFn = streamFn;\n }\n\n _emit(\n meta: Meta,\n message: BaseMessage,\n runId: string | undefined,\n dedupe = false\n ) {\n if (\n dedupe &&\n message.id !== undefined &&\n this.seen[message.id] !== undefined\n ) {\n return;\n }\n\n let messageId = message.id;\n\n if (runId != null) {\n if (isToolMessage(message)) {\n // Distinguish tool messages by tool call ID.\n messageId ??= `run-${runId}-tool-${message.tool_call_id}`;\n } else {\n // For instance in ChatAnthropic, the first chunk has an message ID\n // but the subsequent chunks do not. To avoid clients seeing two messages\n // we rename the message ID if it's being auto-set to `run-${runId}`\n // (see https://github.com/langchain-ai/langchainjs/pull/6646).\n if (messageId == null || messageId === `run-${runId}`) {\n messageId =\n this.stableMessageIdMap[runId] ?? messageId ?? `run-${runId}`;\n }\n\n this.stableMessageIdMap[runId] ??= messageId;\n }\n }\n\n if (messageId !== message.id) {\n // eslint-disable-next-line no-param-reassign\n message.id = messageId;\n\n // eslint-disable-next-line no-param-reassign\n message.lc_kwargs.id = messageId;\n }\n\n if (message.id != null) this.seen[message.id] = message;\n this.streamFn([meta[0], \"messages\", [message, meta[1]]]);\n }\n\n handleChatModelStart(\n _llm: Serialized,\n _messages: BaseMessage[][],\n runId: string,\n _parentRunId?: string,\n _extraParams?: Record<string, unknown>,\n tags?: string[],\n metadata?: Record<string, unknown>,\n name?: string\n ) {\n if (\n metadata &&\n // Include legacy LangGraph SDK tag\n (!tags || (!tags.includes(TAG_NOSTREAM) && !tags.includes(\"nostream\")))\n ) {\n this.metadatas[runId] = [\n (metadata.langgraph_checkpoint_ns as string).split(\"|\"),\n { tags, name, ...metadata },\n ];\n }\n }\n\n handleLLMNewToken(\n token: string,\n _idx: NewTokenIndices,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n fields?: HandleLLMNewTokenCallbackFields\n ) {\n const chunk = fields?.chunk;\n this.emittedChatModelRunIds[runId] = true;\n if (this.metadatas[runId] !== undefined) {\n if (isChatGenerationChunk(chunk)) {\n this._emit(this.metadatas[runId], chunk.message, runId);\n } else {\n this._emit(\n this.metadatas[runId],\n new AIMessageChunk({ content: token }),\n runId\n );\n }\n }\n }\n\n handleLLMEnd(output: LLMResult, runId: string) {\n // Filter out runs that we do not have metadata for\n if (this.metadatas[runId] === undefined) return;\n\n // In JS, non-streaming runs do not call handleLLMNewToken at the model level\n if (!this.emittedChatModelRunIds[runId]) {\n const chatGeneration = output.generations?.[0]?.[0] as ChatGeneration;\n if (isBaseMessage(chatGeneration?.message)) {\n this._emit(this.metadatas[runId], chatGeneration?.message, runId, true);\n }\n delete this.emittedChatModelRunIds[runId];\n }\n delete this.metadatas[runId];\n delete this.stableMessageIdMap[runId];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleLLMError(_err: any, runId: string) {\n delete this.metadatas[runId];\n }\n\n handleChainStart(\n _chain: Serialized,\n inputs: ChainValues,\n runId: string,\n _parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n _runType?: string,\n name?: string\n ) {\n if (\n metadata !== undefined &&\n name === metadata.langgraph_node &&\n (tags === undefined || !tags.includes(TAG_HIDDEN))\n ) {\n this.metadatas[runId] = [\n (metadata.langgraph_checkpoint_ns as string).split(\"|\"),\n { tags, name, ...metadata },\n ];\n\n if (typeof inputs === \"object\") {\n for (const value of Object.values(inputs)) {\n if (\n (isBaseMessage(value) || isBaseMessageChunk(value)) &&\n value.id !== undefined\n ) {\n this.seen[value.id] = value;\n } else if (Array.isArray(value)) {\n for (const item of value) {\n if (\n (isBaseMessage(item) || isBaseMessageChunk(item)) &&\n item.id !== undefined\n ) {\n this.seen[item.id] = item;\n }\n }\n }\n }\n }\n }\n }\n\n handleChainEnd(outputs: ChainValues, runId: string) {\n const metadata = this.metadatas[runId];\n delete this.metadatas[runId];\n if (metadata !== undefined) {\n if (isBaseMessage(outputs)) {\n this._emit(metadata, outputs, runId, true);\n } else if (Array.isArray(outputs)) {\n for (const value of outputs) {\n if (isBaseMessage(value)) {\n this._emit(metadata, value, runId, true);\n }\n }\n } else if (outputs != null && typeof outputs === \"object\") {\n for (const value of Object.values(outputs)) {\n if (isBaseMessage(value)) {\n this._emit(metadata, value, runId, true);\n } else if (Array.isArray(value)) {\n for (const item of value) {\n if (isBaseMessage(item)) {\n this._emit(metadata, item, runId, true);\n }\n }\n }\n }\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleChainError(_err: any, runId: string) {\n delete this.metadatas[runId];\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"messages.js","names":[],"sources":["../../src/pregel/messages.ts"],"sourcesContent":["import {\n BaseCallbackHandler,\n HandleLLMNewTokenCallbackFields,\n NewTokenIndices,\n} from \"@langchain/core/callbacks/base\";\nimport {\n AIMessageChunk,\n BaseMessage,\n isBaseMessage,\n isBaseMessageChunk,\n isToolMessage,\n} from \"@langchain/core/messages\";\nimport { Serialized } from \"@langchain/core/load/serializable\";\nimport {\n ChatGeneration,\n ChatGenerationChunk,\n LLMResult,\n} from \"@langchain/core/outputs\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\n\nimport { TAG_HIDDEN, TAG_NOSTREAM } from \"../constants.js\";\nimport { StreamChunk } from \"./stream.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Meta = [string[], Record<string, any>];\n\nfunction isChatGenerationChunk(x: unknown): x is ChatGenerationChunk {\n return isBaseMessage((x as ChatGenerationChunk)?.message);\n}\n\n/**\n * A callback handler that implements stream_mode=messages.\n * Collects messages from (1) chat model stream events and (2) node outputs.\n */\n// TODO: Make this import and explicitly implement the\n// CallbackHandlerPrefersStreaming interface once we drop support for core 0.2\nexport class StreamMessagesHandler extends BaseCallbackHandler {\n name = \"StreamMessagesHandler\";\n\n streamFn: (streamChunk: StreamChunk) => void;\n\n metadatas: Record<string, Meta | undefined> = {};\n\n seen: Record<string, BaseMessage> = {};\n\n emittedChatModelRunIds: Record<string, boolean> = {};\n\n stableMessageIdMap: Record<string, string> = {};\n\n lc_prefer_streaming = true;\n\n constructor(streamFn: (streamChunk: StreamChunk) => void) {\n super();\n this.streamFn = streamFn;\n }\n\n _emit(\n meta: Meta,\n message: BaseMessage,\n runId: string | undefined,\n dedupe = false\n ) {\n if (\n dedupe &&\n message.id !== undefined &&\n this.seen[message.id] !== undefined\n ) {\n return;\n }\n\n let messageId = message.id;\n\n if (runId != null) {\n if (isToolMessage(message)) {\n // Distinguish tool messages by tool call ID.\n messageId ??= `run-${runId}-tool-${message.tool_call_id}`;\n } else {\n // For instance in ChatAnthropic, the first chunk has an message ID\n // but the subsequent chunks do not. To avoid clients seeing two messages\n // we rename the message ID if it's being auto-set to `run-${runId}`\n // (see https://github.com/langchain-ai/langchainjs/pull/6646).\n if (messageId == null || messageId === `run-${runId}`) {\n messageId =\n this.stableMessageIdMap[runId] ?? messageId ?? `run-${runId}`;\n }\n\n this.stableMessageIdMap[runId] ??= messageId;\n }\n }\n\n if (messageId !== message.id) {\n // eslint-disable-next-line no-param-reassign\n message.id = messageId;\n\n // eslint-disable-next-line no-param-reassign\n message.lc_kwargs.id = messageId;\n }\n\n if (message.id != null) this.seen[message.id] = message;\n this.streamFn([meta[0], \"messages\", [message, meta[1]]]);\n }\n\n handleChatModelStart(\n _llm: Serialized,\n _messages: BaseMessage[][],\n runId: string,\n _parentRunId?: string,\n _extraParams?: Record<string, unknown>,\n tags?: string[],\n metadata?: Record<string, unknown>,\n name?: string\n ) {\n if (\n metadata &&\n // Include legacy LangGraph SDK tag\n (!tags || (!tags.includes(TAG_NOSTREAM) && !tags.includes(\"nostream\")))\n ) {\n this.metadatas[runId] = [\n (metadata.langgraph_checkpoint_ns as string).split(\"|\"),\n { tags, name, ...metadata },\n ];\n }\n }\n\n handleLLMNewToken(\n token: string,\n _idx: NewTokenIndices,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n fields?: HandleLLMNewTokenCallbackFields\n ) {\n const chunk = fields?.chunk;\n this.emittedChatModelRunIds[runId] = true;\n if (this.metadatas[runId] !== undefined) {\n if (isChatGenerationChunk(chunk)) {\n this._emit(this.metadatas[runId], chunk.message, runId);\n } else {\n this._emit(\n this.metadatas[runId],\n new AIMessageChunk({ content: token }),\n runId\n );\n }\n }\n }\n\n handleLLMEnd(output: LLMResult, runId: string) {\n // Filter out runs that we do not have metadata for\n if (this.metadatas[runId] === undefined) return;\n\n // In JS, non-streaming runs do not call handleLLMNewToken at the model level\n if (!this.emittedChatModelRunIds[runId]) {\n const chatGeneration = output.generations?.[0]?.[0] as ChatGeneration;\n if (isBaseMessage(chatGeneration?.message)) {\n this._emit(this.metadatas[runId], chatGeneration?.message, runId, true);\n }\n delete this.emittedChatModelRunIds[runId];\n }\n delete this.metadatas[runId];\n delete this.stableMessageIdMap[runId];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleLLMError(_err: any, runId: string) {\n delete this.metadatas[runId];\n }\n\n handleChainStart(\n _chain: Serialized,\n inputs: ChainValues,\n runId: string,\n _parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n _runType?: string,\n name?: string\n ) {\n if (\n metadata !== undefined &&\n name === metadata.langgraph_node &&\n (tags === undefined || !tags.includes(TAG_HIDDEN))\n ) {\n this.metadatas[runId] = [\n (metadata.langgraph_checkpoint_ns as string).split(\"|\"),\n { tags, name, ...metadata },\n ];\n\n if (typeof inputs === \"object\") {\n for (const value of Object.values(inputs)) {\n if (\n (isBaseMessage(value) || isBaseMessageChunk(value)) &&\n value.id !== undefined\n ) {\n this.seen[value.id] = value;\n } else if (Array.isArray(value)) {\n for (const item of value) {\n if (\n (isBaseMessage(item) || isBaseMessageChunk(item)) &&\n item.id !== undefined\n ) {\n this.seen[item.id] = item;\n }\n }\n }\n }\n }\n }\n }\n\n handleChainEnd(outputs: ChainValues, runId: string) {\n const metadata = this.metadatas[runId];\n delete this.metadatas[runId];\n if (metadata !== undefined) {\n if (isBaseMessage(outputs)) {\n this._emit(metadata, outputs, runId, true);\n } else if (Array.isArray(outputs)) {\n for (const value of outputs) {\n if (isBaseMessage(value)) {\n this._emit(metadata, value, runId, true);\n }\n }\n } else if (outputs != null && typeof outputs === \"object\") {\n for (const value of Object.values(outputs)) {\n if (isBaseMessage(value)) {\n this._emit(metadata, value, runId, true);\n } else if (Array.isArray(value)) {\n for (const item of value) {\n if (isBaseMessage(item)) {\n this._emit(metadata, item, runId, true);\n }\n }\n }\n }\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleChainError(_err: any, runId: string) {\n delete this.metadatas[runId];\n }\n}\n"],"mappings":"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"}
@@ -1,8 +1,7 @@
1
- const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
1
  const require_constants = require('../constants.cjs');
3
2
  const require_utils = require('../utils.cjs');
4
3
  const require_write = require('./write.cjs');
5
- const __langchain_core_runnables = require_rolldown_runtime.__toESM(require("@langchain/core/runnables"));
4
+ let _langchain_core_runnables = require("@langchain/core/runnables");
6
5
 
7
6
  //#region src/pregel/read.ts
8
7
  var ChannelRead = class ChannelRead extends require_utils.RunnableCallable {
@@ -24,8 +23,8 @@ var ChannelRead = class ChannelRead extends require_utils.RunnableCallable {
24
23
  else return read(channel, fresh);
25
24
  }
26
25
  };
27
- const defaultRunnableBound = /* @__PURE__ */ new __langchain_core_runnables.RunnablePassthrough();
28
- var PregelNode = class PregelNode extends __langchain_core_runnables.RunnableBinding {
26
+ const defaultRunnableBound = /* @__PURE__ */ new _langchain_core_runnables.RunnablePassthrough();
27
+ var PregelNode = class PregelNode extends _langchain_core_runnables.RunnableBinding {
29
28
  lc_graph_name = "PregelNode";
30
29
  channels;
31
30
  triggers = [];
@@ -75,15 +74,15 @@ var PregelNode = class PregelNode extends __langchain_core_runnables.RunnableBin
75
74
  }
76
75
  getNode() {
77
76
  const writers = this.getWriters();
78
- if (this.bound === defaultRunnableBound && writers.length === 0) return void 0;
77
+ if (this.bound === defaultRunnableBound && writers.length === 0) return;
79
78
  else if (this.bound === defaultRunnableBound && writers.length === 1) return writers[0];
80
- else if (this.bound === defaultRunnableBound) return new __langchain_core_runnables.RunnableSequence({
79
+ else if (this.bound === defaultRunnableBound) return new _langchain_core_runnables.RunnableSequence({
81
80
  first: writers[0],
82
81
  middle: writers.slice(1, writers.length - 1),
83
82
  last: writers[writers.length - 1],
84
83
  omitSequenceTags: true
85
84
  });
86
- else if (writers.length > 0) return new __langchain_core_runnables.RunnableSequence({
85
+ else if (writers.length > 0) return new _langchain_core_runnables.RunnableSequence({
87
86
  first: this.bound,
88
87
  middle: writers.slice(0, writers.length - 1),
89
88
  last: writers[writers.length - 1],
@@ -126,7 +125,7 @@ var PregelNode = class PregelNode extends __langchain_core_runnables.RunnableBin
126
125
  triggers: this.triggers,
127
126
  mapper: this.mapper,
128
127
  writers: this.writers,
129
- bound: (0, __langchain_core_runnables._coerceToRunnable)(coerceable),
128
+ bound: (0, _langchain_core_runnables._coerceToRunnable)(coerceable),
130
129
  config: this.config,
131
130
  kwargs: this.kwargs,
132
131
  retryPolicy: this.retryPolicy,
@@ -1 +1 @@
1
- {"version":3,"file":"read.cjs","names":["RunnableCallable","read: (arg: string | string[], fresh: boolean) => unknown","CONFIG_KEY_READ","RunnablePassthrough","RunnableBinding","ChannelWrite","RunnableSequence"],"sources":["../../src/pregel/read.ts"],"sourcesContent":["import {\n Runnable,\n RunnableBinding,\n RunnableBindingArgs,\n RunnableConfig,\n RunnablePassthrough,\n RunnableSequence,\n _coerceToRunnable,\n type RunnableLike,\n} from \"@langchain/core/runnables\";\nimport { CONFIG_KEY_READ } from \"../constants.js\";\nimport { ChannelWrite } from \"./write.js\";\nimport { RunnableCallable } from \"../utils.js\";\nimport type { CachePolicy, RetryPolicy } from \"./utils/index.js\";\n\nexport class ChannelRead<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput = any\n> extends RunnableCallable {\n lc_graph_name = \"ChannelRead\";\n\n channel: string | Array<string>;\n\n fresh: boolean = false;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(\n channel: string | Array<string>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any,\n fresh: boolean = false\n ) {\n super({\n func: (_: RunInput, config: RunnableConfig) =>\n ChannelRead.doRead(config, this.channel, this.fresh, this.mapper),\n });\n this.fresh = fresh;\n this.mapper = mapper;\n this.channel = channel;\n this.name = Array.isArray(channel)\n ? `ChannelRead<${channel.join(\",\")}>`\n : `ChannelRead<${channel}>`;\n }\n\n static doRead<T = unknown>(\n config: RunnableConfig,\n channel: string | Array<string>,\n fresh: boolean,\n mapper?: (args: unknown) => unknown\n ): T {\n const read: (arg: string | string[], fresh: boolean) => unknown =\n config.configurable?.[CONFIG_KEY_READ];\n if (!read) {\n throw new Error(\n \"Runnable is not configured with a read function. Make sure to call in the context of a Pregel process\"\n );\n }\n if (mapper) {\n return mapper(read(channel, fresh)) as T;\n } else {\n return read(channel, fresh) as T;\n }\n }\n}\n\nconst defaultRunnableBound =\n /* #__PURE__ */ new RunnablePassthrough<PregelNodeInputType>();\n\ninterface PregelNodeArgs<RunInput, RunOutput>\n extends Partial<RunnableBindingArgs<RunInput, RunOutput>> {\n channels: Record<string, string> | string[];\n triggers: Array<string>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n writers?: Runnable<RunOutput, unknown>[];\n tags?: string[];\n bound?: Runnable<RunInput, RunOutput>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n kwargs?: Record<string, any>;\n config?: RunnableConfig;\n metadata?: Record<string, unknown>;\n retryPolicy?: RetryPolicy;\n cachePolicy?: CachePolicy;\n subgraphs?: Runnable[];\n ends?: string[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PregelNodeInputType = any;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PregelNodeOutputType = any;\n\nexport class PregelNode<\n RunInput = PregelNodeInputType,\n RunOutput = PregelNodeOutputType\n> extends RunnableBinding<RunInput, RunOutput, RunnableConfig> {\n lc_graph_name = \"PregelNode\";\n\n channels: Record<string, string> | string[];\n\n triggers: string[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n\n writers: Runnable[] = [];\n\n bound: Runnable<RunInput, RunOutput> = defaultRunnableBound;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n kwargs: Record<string, any> = {};\n\n metadata: Record<string, unknown> = {};\n\n tags: string[] = [];\n\n retryPolicy?: RetryPolicy;\n\n cachePolicy?: CachePolicy;\n\n subgraphs?: Runnable[];\n\n ends?: string[];\n\n constructor(fields: PregelNodeArgs<RunInput, RunOutput>) {\n const {\n channels,\n triggers,\n mapper,\n writers,\n bound,\n kwargs,\n metadata,\n retryPolicy,\n cachePolicy,\n tags,\n subgraphs,\n ends,\n } = fields;\n const mergedTags = [\n ...(fields.config?.tags ? fields.config.tags : []),\n ...(tags ?? []),\n ];\n\n super({\n ...fields,\n bound:\n fields.bound ??\n (defaultRunnableBound as unknown as Runnable<RunInput, RunOutput>),\n config: {\n ...(fields.config ? fields.config : {}),\n tags: mergedTags,\n },\n });\n\n this.channels = channels;\n this.triggers = triggers;\n this.mapper = mapper;\n this.writers = writers ?? this.writers;\n this.bound = bound ?? this.bound;\n this.kwargs = kwargs ?? this.kwargs;\n this.metadata = metadata ?? this.metadata;\n this.tags = mergedTags;\n this.retryPolicy = retryPolicy;\n this.cachePolicy = cachePolicy;\n this.subgraphs = subgraphs;\n this.ends = ends;\n }\n\n getWriters(): Array<Runnable> {\n const newWriters = [...this.writers];\n while (\n newWriters.length > 1 &&\n // eslint-disable-next-line no-instanceof/no-instanceof\n newWriters[newWriters.length - 1] instanceof ChannelWrite &&\n // eslint-disable-next-line no-instanceof/no-instanceof\n newWriters[newWriters.length - 2] instanceof ChannelWrite\n ) {\n // we can combine writes if they are consecutive\n // careful to not modify the original writers list or ChannelWrite\n const endWriters = newWriters.slice(-2) as ChannelWrite[];\n const combinedWrites = endWriters[0].writes.concat(endWriters[1].writes);\n newWriters[newWriters.length - 2] = new ChannelWrite(\n combinedWrites,\n endWriters[0].config?.tags\n );\n newWriters.pop();\n }\n return newWriters;\n }\n\n getNode(): Runnable<RunInput, RunOutput> | undefined {\n const writers = this.getWriters();\n if (this.bound === defaultRunnableBound && writers.length === 0) {\n return undefined;\n } else if (this.bound === defaultRunnableBound && writers.length === 1) {\n return writers[0];\n } else if (this.bound === defaultRunnableBound) {\n return new RunnableSequence({\n first: writers[0],\n middle: writers.slice(1, writers.length - 1),\n last: writers[writers.length - 1],\n omitSequenceTags: true,\n });\n } else if (writers.length > 0) {\n return new RunnableSequence({\n first: this.bound,\n middle: writers.slice(0, writers.length - 1),\n last: writers[writers.length - 1],\n omitSequenceTags: true,\n });\n } else {\n return this.bound;\n }\n }\n\n join(channels: Array<string>): PregelNode<RunInput, RunOutput> {\n if (!Array.isArray(channels)) {\n throw new Error(\"channels must be a list\");\n }\n if (typeof this.channels !== \"object\") {\n throw new Error(\"all channels must be named when using .join()\");\n }\n\n return new PregelNode<RunInput, RunOutput>({\n channels: {\n ...this.channels,\n ...Object.fromEntries(channels.map((chan) => [chan, chan])),\n },\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: this.bound,\n kwargs: this.kwargs,\n config: this.config,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n }\n\n pipe<NewRunOutput>(\n coerceable: RunnableLike\n ): PregelNode<RunInput, Exclude<NewRunOutput, Error>> {\n if (ChannelWrite.isWriter(coerceable)) {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: [...this.writers, coerceable],\n bound: this.bound as unknown as PregelNode<\n RunInput,\n Exclude<NewRunOutput, Error>\n >,\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n } else if (this.bound === defaultRunnableBound) {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: _coerceToRunnable<RunInput, NewRunOutput>(coerceable),\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n } else {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: this.bound.pipe(coerceable),\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"read.cjs","names":["RunnableCallable","CONFIG_KEY_READ","RunnablePassthrough","RunnableBinding","ChannelWrite","RunnableSequence"],"sources":["../../src/pregel/read.ts"],"sourcesContent":["import {\n Runnable,\n RunnableBinding,\n RunnableBindingArgs,\n RunnableConfig,\n RunnablePassthrough,\n RunnableSequence,\n _coerceToRunnable,\n type RunnableLike,\n} from \"@langchain/core/runnables\";\nimport { CONFIG_KEY_READ } from \"../constants.js\";\nimport { ChannelWrite } from \"./write.js\";\nimport { RunnableCallable } from \"../utils.js\";\nimport type { CachePolicy, RetryPolicy } from \"./utils/index.js\";\n\nexport class ChannelRead<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput = any\n> extends RunnableCallable {\n lc_graph_name = \"ChannelRead\";\n\n channel: string | Array<string>;\n\n fresh: boolean = false;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(\n channel: string | Array<string>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any,\n fresh: boolean = false\n ) {\n super({\n func: (_: RunInput, config: RunnableConfig) =>\n ChannelRead.doRead(config, this.channel, this.fresh, this.mapper),\n });\n this.fresh = fresh;\n this.mapper = mapper;\n this.channel = channel;\n this.name = Array.isArray(channel)\n ? `ChannelRead<${channel.join(\",\")}>`\n : `ChannelRead<${channel}>`;\n }\n\n static doRead<T = unknown>(\n config: RunnableConfig,\n channel: string | Array<string>,\n fresh: boolean,\n mapper?: (args: unknown) => unknown\n ): T {\n const read: (arg: string | string[], fresh: boolean) => unknown =\n config.configurable?.[CONFIG_KEY_READ];\n if (!read) {\n throw new Error(\n \"Runnable is not configured with a read function. Make sure to call in the context of a Pregel process\"\n );\n }\n if (mapper) {\n return mapper(read(channel, fresh)) as T;\n } else {\n return read(channel, fresh) as T;\n }\n }\n}\n\nconst defaultRunnableBound =\n /* #__PURE__ */ new RunnablePassthrough<PregelNodeInputType>();\n\ninterface PregelNodeArgs<RunInput, RunOutput>\n extends Partial<RunnableBindingArgs<RunInput, RunOutput>> {\n channels: Record<string, string> | string[];\n triggers: Array<string>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n writers?: Runnable<RunOutput, unknown>[];\n tags?: string[];\n bound?: Runnable<RunInput, RunOutput>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n kwargs?: Record<string, any>;\n config?: RunnableConfig;\n metadata?: Record<string, unknown>;\n retryPolicy?: RetryPolicy;\n cachePolicy?: CachePolicy;\n subgraphs?: Runnable[];\n ends?: string[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PregelNodeInputType = any;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PregelNodeOutputType = any;\n\nexport class PregelNode<\n RunInput = PregelNodeInputType,\n RunOutput = PregelNodeOutputType\n> extends RunnableBinding<RunInput, RunOutput, RunnableConfig> {\n lc_graph_name = \"PregelNode\";\n\n channels: Record<string, string> | string[];\n\n triggers: string[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n\n writers: Runnable[] = [];\n\n bound: Runnable<RunInput, RunOutput> = defaultRunnableBound;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n kwargs: Record<string, any> = {};\n\n metadata: Record<string, unknown> = {};\n\n tags: string[] = [];\n\n retryPolicy?: RetryPolicy;\n\n cachePolicy?: CachePolicy;\n\n subgraphs?: Runnable[];\n\n ends?: string[];\n\n constructor(fields: PregelNodeArgs<RunInput, RunOutput>) {\n const {\n channels,\n triggers,\n mapper,\n writers,\n bound,\n kwargs,\n metadata,\n retryPolicy,\n cachePolicy,\n tags,\n subgraphs,\n ends,\n } = fields;\n const mergedTags = [\n ...(fields.config?.tags ? fields.config.tags : []),\n ...(tags ?? []),\n ];\n\n super({\n ...fields,\n bound:\n fields.bound ??\n (defaultRunnableBound as unknown as Runnable<RunInput, RunOutput>),\n config: {\n ...(fields.config ? fields.config : {}),\n tags: mergedTags,\n },\n });\n\n this.channels = channels;\n this.triggers = triggers;\n this.mapper = mapper;\n this.writers = writers ?? this.writers;\n this.bound = bound ?? this.bound;\n this.kwargs = kwargs ?? this.kwargs;\n this.metadata = metadata ?? this.metadata;\n this.tags = mergedTags;\n this.retryPolicy = retryPolicy;\n this.cachePolicy = cachePolicy;\n this.subgraphs = subgraphs;\n this.ends = ends;\n }\n\n getWriters(): Array<Runnable> {\n const newWriters = [...this.writers];\n while (\n newWriters.length > 1 &&\n // eslint-disable-next-line no-instanceof/no-instanceof\n newWriters[newWriters.length - 1] instanceof ChannelWrite &&\n // eslint-disable-next-line no-instanceof/no-instanceof\n newWriters[newWriters.length - 2] instanceof ChannelWrite\n ) {\n // we can combine writes if they are consecutive\n // careful to not modify the original writers list or ChannelWrite\n const endWriters = newWriters.slice(-2) as ChannelWrite[];\n const combinedWrites = endWriters[0].writes.concat(endWriters[1].writes);\n newWriters[newWriters.length - 2] = new ChannelWrite(\n combinedWrites,\n endWriters[0].config?.tags\n );\n newWriters.pop();\n }\n return newWriters;\n }\n\n getNode(): Runnable<RunInput, RunOutput> | undefined {\n const writers = this.getWriters();\n if (this.bound === defaultRunnableBound && writers.length === 0) {\n return undefined;\n } else if (this.bound === defaultRunnableBound && writers.length === 1) {\n return writers[0];\n } else if (this.bound === defaultRunnableBound) {\n return new RunnableSequence({\n first: writers[0],\n middle: writers.slice(1, writers.length - 1),\n last: writers[writers.length - 1],\n omitSequenceTags: true,\n });\n } else if (writers.length > 0) {\n return new RunnableSequence({\n first: this.bound,\n middle: writers.slice(0, writers.length - 1),\n last: writers[writers.length - 1],\n omitSequenceTags: true,\n });\n } else {\n return this.bound;\n }\n }\n\n join(channels: Array<string>): PregelNode<RunInput, RunOutput> {\n if (!Array.isArray(channels)) {\n throw new Error(\"channels must be a list\");\n }\n if (typeof this.channels !== \"object\") {\n throw new Error(\"all channels must be named when using .join()\");\n }\n\n return new PregelNode<RunInput, RunOutput>({\n channels: {\n ...this.channels,\n ...Object.fromEntries(channels.map((chan) => [chan, chan])),\n },\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: this.bound,\n kwargs: this.kwargs,\n config: this.config,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n }\n\n pipe<NewRunOutput>(\n coerceable: RunnableLike\n ): PregelNode<RunInput, Exclude<NewRunOutput, Error>> {\n if (ChannelWrite.isWriter(coerceable)) {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: [...this.writers, coerceable],\n bound: this.bound as unknown as PregelNode<\n RunInput,\n Exclude<NewRunOutput, Error>\n >,\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n } else if (this.bound === defaultRunnableBound) {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: _coerceToRunnable<RunInput, NewRunOutput>(coerceable),\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n } else {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: this.bound.pipe(coerceable),\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n }\n }\n}\n"],"mappings":"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"}
@@ -6,12 +6,10 @@ import { Runnable, RunnableBinding, RunnableBindingArgs, RunnableConfig, Runnabl
6
6
  interface PregelNodeArgs<RunInput, RunOutput> extends Partial<RunnableBindingArgs<RunInput, RunOutput>> {
7
7
  channels: Record<string, string> | string[];
8
8
  triggers: Array<string>;
9
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
9
  mapper?: (args: any) => any;
11
10
  writers?: Runnable<RunOutput, unknown>[];
12
11
  tags?: string[];
13
12
  bound?: Runnable<RunInput, RunOutput>;
14
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
13
  kwargs?: Record<string, any>;
16
14
  config?: RunnableConfig;
17
15
  metadata?: Record<string, unknown>;
@@ -20,19 +18,15 @@ interface PregelNodeArgs<RunInput, RunOutput> extends Partial<RunnableBindingArg
20
18
  subgraphs?: Runnable[];
21
19
  ends?: string[];
22
20
  }
23
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
21
  type PregelNodeInputType = any;
25
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
22
  type PregelNodeOutputType = any;
27
23
  declare class PregelNode<RunInput = PregelNodeInputType, RunOutput = PregelNodeOutputType> extends RunnableBinding<RunInput, RunOutput, RunnableConfig> {
28
24
  lc_graph_name: string;
29
25
  channels: Record<string, string> | string[];
30
26
  triggers: string[];
31
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
27
  mapper?: (args: any) => any;
33
28
  writers: Runnable[];
34
29
  bound: Runnable<RunInput, RunOutput>;
35
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
36
30
  kwargs: Record<string, any>;
37
31
  metadata: Record<string, unknown>;
38
32
  tags: string[];