@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":"debug.cjs","names":["COLORS_MAP: ConsoleColorMap","TAG_HIDDEN","INTERRUPT","result: Record<string, unknown>","pyConfig: Partial<\n Record<CamelToSnake<keyof RunnableConfig>, unknown>\n >","config","taskStates: Record<string, RunnableConfig | StateSnapshot>","findSubgraphPregel","readChannels","ERROR","RETURN","byChannel: Record<string, any[]>"],"sources":["../../src/pregel/debug.ts"],"sourcesContent":["import { RunnableConfig } from \"@langchain/core/runnables\";\nimport {\n CheckpointMetadata,\n CheckpointPendingWrite,\n PendingWrite,\n} from \"@langchain/langgraph-checkpoint\";\nimport { BaseChannel } from \"../channels/base.js\";\nimport {\n ERROR,\n Interrupt,\n INTERRUPT,\n RETURN,\n TAG_HIDDEN,\n} from \"../constants.js\";\nimport { EmptyChannelError } from \"../errors.js\";\nimport {\n PregelExecutableTask,\n PregelTaskDescription,\n StateSnapshot,\n} from \"./types.js\";\nimport { readChannels } from \"./io.js\";\nimport { findSubgraphPregel } from \"./utils/subgraph.js\";\n\ntype ConsoleColors = {\n start: string;\n end: string;\n};\n\ntype ConsoleColorMap = {\n [key: string]: ConsoleColors;\n};\n\nconst COLORS_MAP: ConsoleColorMap = {\n blue: {\n start: \"\\x1b[34m\",\n end: \"\\x1b[0m\",\n },\n green: {\n start: \"\\x1b[32m\",\n end: \"\\x1b[0m\",\n },\n yellow: {\n start: \"\\x1b[33;1m\",\n end: \"\\x1b[0m\",\n },\n};\n\n/**\n * Wrap some text in a color for printing to the console.\n */\nexport const wrap = (color: ConsoleColors, text: string): string =>\n `${color.start}${text}${color.end}`;\n\nexport function printCheckpoint<Value>(\n step: number,\n channels: Record<string, BaseChannel<Value>>\n) {\n console.log(\n [\n `${wrap(COLORS_MAP.blue, \"[langgraph/checkpoint]\")}`,\n `Finishing step ${step}. Channel values:\\n`,\n `\\n${JSON.stringify(\n Object.fromEntries(_readChannels<Value>(channels)),\n null,\n 2\n )}`,\n ].join(\"\")\n );\n}\n\nexport function* _readChannels<Value>(\n channels: Record<string, BaseChannel<Value>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): IterableIterator<[string, any]> {\n for (const [name, channel] of Object.entries(channels)) {\n try {\n yield [name, channel.get()];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (error.name === EmptyChannelError.unminifiable_name) {\n // Skip the channel if it's empty\n continue;\n } else {\n throw error; // Re-throw the error if it's not an EmptyChannelError\n }\n }\n }\n}\n\nexport function* mapDebugTasks<N extends PropertyKey, C extends PropertyKey>(\n tasks: readonly PregelExecutableTask<N, C>[]\n) {\n for (const { id, name, input, config, triggers, writes } of tasks) {\n if (config?.tags?.includes(TAG_HIDDEN)) continue;\n\n const interrupts = writes\n .filter(([writeId, n]) => {\n return writeId === id && n === INTERRUPT;\n })\n .map(([, v]) => {\n return v;\n });\n yield { id, name, input, triggers, interrupts };\n }\n}\n\nfunction isMultipleChannelWrite(\n value: unknown\n): value is { $writes: unknown[] } {\n if (typeof value !== \"object\" || value === null) return false;\n return \"$writes\" in value && Array.isArray(value.$writes);\n}\n\nfunction mapTaskResultWrites(writes: PendingWrite<unknown>[]) {\n const result: Record<string, unknown> = {};\n\n for (const [channel, value] of writes) {\n const strChannel = String(channel);\n\n if (strChannel in result) {\n const channelWrites = isMultipleChannelWrite(result[strChannel])\n ? result[strChannel].$writes\n : [result[strChannel]];\n\n channelWrites.push(value);\n result[strChannel] = { $writes: channelWrites };\n } else {\n result[strChannel] = value;\n }\n }\n return result;\n}\n\nexport function* mapDebugTaskResults<\n N extends PropertyKey,\n C extends PropertyKey\n>(\n tasks: readonly [PregelExecutableTask<N, C>, PendingWrite<C>[]][],\n streamChannels: PropertyKey | Array<PropertyKey>\n) {\n for (const [{ id, name, config }, writes] of tasks) {\n if (config?.tags?.includes(TAG_HIDDEN)) continue;\n yield {\n id,\n name,\n result: mapTaskResultWrites(\n writes.filter(([channel]) => {\n return Array.isArray(streamChannels)\n ? streamChannels.includes(channel)\n : channel === streamChannels;\n })\n ),\n interrupts: writes.filter((w) => w[0] === INTERRUPT).map((w) => w[1]),\n };\n }\n}\n\ntype ChannelKey = string | number | symbol;\n\nexport function* mapDebugCheckpoint<\n N extends PropertyKey,\n C extends PropertyKey\n>(\n config: RunnableConfig,\n channels: Record<string, BaseChannel>,\n streamChannels: string | string[],\n metadata: CheckpointMetadata,\n tasks: readonly PregelExecutableTask<N, C>[],\n pendingWrites: CheckpointPendingWrite[],\n parentConfig: RunnableConfig | undefined,\n outputKeys: ChannelKey | ChannelKey[]\n) {\n function formatConfig(config: RunnableConfig) {\n // https://stackoverflow.com/a/78298178\n type CamelToSnake<\n T extends string,\n A extends string = \"\"\n > = T extends `${infer F}${infer R}`\n ? CamelToSnake<\n R,\n `${A}${F extends Lowercase<F> ? F : `_${Lowercase<F>}`}`\n >\n : A;\n\n // make sure the config is consistent with Python\n const pyConfig: Partial<\n Record<CamelToSnake<keyof RunnableConfig>, unknown>\n > = {};\n\n if (config.callbacks != null) pyConfig.callbacks = config.callbacks;\n if (config.configurable != null)\n pyConfig.configurable = config.configurable;\n if (config.maxConcurrency != null)\n pyConfig.max_concurrency = config.maxConcurrency;\n\n if (config.metadata != null) pyConfig.metadata = config.metadata;\n if (config.recursionLimit != null)\n pyConfig.recursion_limit = config.recursionLimit;\n if (config.runId != null) pyConfig.run_id = config.runId;\n if (config.runName != null) pyConfig.run_name = config.runName;\n if (config.tags != null) pyConfig.tags = config.tags;\n\n return pyConfig;\n }\n\n const parentNs = config.configurable?.checkpoint_ns;\n const taskStates: Record<string, RunnableConfig | StateSnapshot> = {};\n\n for (const task of tasks) {\n const candidates = task.subgraphs?.length ? task.subgraphs : [task.proc];\n if (!candidates.find(findSubgraphPregel)) continue;\n\n let taskNs = `${task.name as string}:${task.id}`;\n if (parentNs) taskNs = `${parentNs}|${taskNs}`;\n\n taskStates[task.id] = {\n configurable: {\n thread_id: config.configurable?.thread_id,\n checkpoint_ns: taskNs,\n },\n };\n }\n\n yield {\n config: formatConfig(config),\n values: readChannels(channels, streamChannels),\n metadata,\n next: tasks.map((task) => task.name),\n tasks: tasksWithWrites(tasks, pendingWrites, taskStates, outputKeys),\n parentConfig: parentConfig ? formatConfig(parentConfig) : undefined,\n };\n}\n\nexport function tasksWithWrites<N extends PropertyKey, C extends PropertyKey>(\n tasks: PregelTaskDescription[] | readonly PregelExecutableTask<N, C>[],\n pendingWrites: CheckpointPendingWrite[],\n states: Record<string, RunnableConfig | StateSnapshot> | undefined,\n outputKeys: ChannelKey[] | ChannelKey\n): PregelTaskDescription[] {\n return tasks.map((task): PregelTaskDescription => {\n const error = pendingWrites.find(\n ([id, n]) => id === task.id && n === ERROR\n )?.[2];\n\n const interrupts = pendingWrites\n .filter(([id, n]) => id === task.id && n === INTERRUPT)\n .map(([, , v]) => v) as Interrupt[];\n\n const result = (() => {\n if (error || interrupts.length || !pendingWrites.length) return undefined;\n\n const idx = pendingWrites.findIndex(\n ([tid, n]) => tid === task.id && n === RETURN\n );\n\n if (idx >= 0) return pendingWrites[idx][2];\n\n if (typeof outputKeys === \"string\") {\n return pendingWrites.find(\n ([tid, n]) => tid === task.id && n === outputKeys\n )?.[2];\n }\n\n if (Array.isArray(outputKeys)) {\n const results = pendingWrites\n .filter(([tid, n]) => tid === task.id && outputKeys.includes(n))\n .map(([, n, v]) => [n, v] as PendingWrite<C>);\n\n if (!results.length) return undefined;\n return mapTaskResultWrites(results);\n }\n\n return undefined;\n })();\n\n if (error) {\n return {\n id: task.id,\n name: task.name as string,\n path: task.path,\n error,\n interrupts,\n result,\n };\n }\n\n const taskState = states?.[task.id];\n return {\n id: task.id,\n name: task.name as string,\n path: task.path,\n interrupts,\n ...(taskState !== undefined ? { state: taskState } : {}),\n result,\n };\n });\n}\n\nexport function printStepCheckpoint(\n step: number,\n channels: Record<string, BaseChannel<unknown>>,\n whitelist: string[]\n): void {\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:checkpoint]`)}`,\n `\\x1b[1m State at the end of step ${step}:\\x1b[0m\\n`,\n JSON.stringify(readChannels(channels, whitelist), null, 2),\n ].join(\"\")\n );\n}\n\nexport function printStepTasks<N extends PropertyKey, C extends PropertyKey>(\n step: number,\n nextTasks: readonly PregelExecutableTask<N, C>[]\n): void {\n const nTasks = nextTasks.length;\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:tasks]`)}`,\n `\\x1b[1m Starting step ${step} with ${nTasks} task${\n nTasks === 1 ? \"\" : \"s\"\n }:\\x1b[0m\\n`,\n nextTasks\n .map(\n (task) =>\n `- ${wrap(COLORS_MAP.green, String(task.name))} -> ${JSON.stringify(\n task.input,\n null,\n 2\n )}`\n )\n .join(\"\\n\"),\n ].join(\"\")\n );\n}\n\nexport function printStepWrites(\n step: number,\n writes: PendingWrite[],\n whitelist: string[]\n): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const byChannel: Record<string, any[]> = {};\n\n for (const [channel, value] of writes) {\n if (whitelist.includes(channel)) {\n if (!byChannel[channel]) {\n byChannel[channel] = [];\n }\n byChannel[channel].push(value);\n }\n }\n\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:writes]`)}`,\n `\\x1b[1m Finished step ${step} with writes to ${\n Object.keys(byChannel).length\n } channel${Object.keys(byChannel).length !== 1 ? \"s\" : \"\"}:\\x1b[0m\\n`,\n Object.entries(byChannel)\n .map(\n ([name, vals]) =>\n `- ${wrap(COLORS_MAP.yellow, name)} -> ${vals\n .map((v) => JSON.stringify(v))\n .join(\", \")}`\n )\n .join(\"\\n\"),\n ].join(\"\")\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"debug.cjs","names":["TAG_HIDDEN","INTERRUPT","config","findSubgraphPregel","readChannels","ERROR","RETURN"],"sources":["../../src/pregel/debug.ts"],"sourcesContent":["import { RunnableConfig } from \"@langchain/core/runnables\";\nimport {\n CheckpointMetadata,\n CheckpointPendingWrite,\n PendingWrite,\n} from \"@langchain/langgraph-checkpoint\";\nimport { BaseChannel } from \"../channels/base.js\";\nimport {\n ERROR,\n Interrupt,\n INTERRUPT,\n RETURN,\n TAG_HIDDEN,\n} from \"../constants.js\";\nimport { EmptyChannelError } from \"../errors.js\";\nimport {\n PregelExecutableTask,\n PregelTaskDescription,\n StateSnapshot,\n} from \"./types.js\";\nimport { readChannels } from \"./io.js\";\nimport { findSubgraphPregel } from \"./utils/subgraph.js\";\n\ntype ConsoleColors = {\n start: string;\n end: string;\n};\n\ntype ConsoleColorMap = {\n [key: string]: ConsoleColors;\n};\n\nconst COLORS_MAP: ConsoleColorMap = {\n blue: {\n start: \"\\x1b[34m\",\n end: \"\\x1b[0m\",\n },\n green: {\n start: \"\\x1b[32m\",\n end: \"\\x1b[0m\",\n },\n yellow: {\n start: \"\\x1b[33;1m\",\n end: \"\\x1b[0m\",\n },\n};\n\n/**\n * Wrap some text in a color for printing to the console.\n */\nexport const wrap = (color: ConsoleColors, text: string): string =>\n `${color.start}${text}${color.end}`;\n\nexport function printCheckpoint<Value>(\n step: number,\n channels: Record<string, BaseChannel<Value>>\n) {\n console.log(\n [\n `${wrap(COLORS_MAP.blue, \"[langgraph/checkpoint]\")}`,\n `Finishing step ${step}. Channel values:\\n`,\n `\\n${JSON.stringify(\n Object.fromEntries(_readChannels<Value>(channels)),\n null,\n 2\n )}`,\n ].join(\"\")\n );\n}\n\nexport function* _readChannels<Value>(\n channels: Record<string, BaseChannel<Value>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): IterableIterator<[string, any]> {\n for (const [name, channel] of Object.entries(channels)) {\n try {\n yield [name, channel.get()];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (error.name === EmptyChannelError.unminifiable_name) {\n // Skip the channel if it's empty\n continue;\n } else {\n throw error; // Re-throw the error if it's not an EmptyChannelError\n }\n }\n }\n}\n\nexport function* mapDebugTasks<N extends PropertyKey, C extends PropertyKey>(\n tasks: readonly PregelExecutableTask<N, C>[]\n) {\n for (const { id, name, input, config, triggers, writes } of tasks) {\n if (config?.tags?.includes(TAG_HIDDEN)) continue;\n\n const interrupts = writes\n .filter(([writeId, n]) => {\n return writeId === id && n === INTERRUPT;\n })\n .map(([, v]) => {\n return v;\n });\n yield { id, name, input, triggers, interrupts };\n }\n}\n\nfunction isMultipleChannelWrite(\n value: unknown\n): value is { $writes: unknown[] } {\n if (typeof value !== \"object\" || value === null) return false;\n return \"$writes\" in value && Array.isArray(value.$writes);\n}\n\nfunction mapTaskResultWrites(writes: PendingWrite<unknown>[]) {\n const result: Record<string, unknown> = {};\n\n for (const [channel, value] of writes) {\n const strChannel = String(channel);\n\n if (strChannel in result) {\n const channelWrites = isMultipleChannelWrite(result[strChannel])\n ? result[strChannel].$writes\n : [result[strChannel]];\n\n channelWrites.push(value);\n result[strChannel] = { $writes: channelWrites };\n } else {\n result[strChannel] = value;\n }\n }\n return result;\n}\n\nexport function* mapDebugTaskResults<\n N extends PropertyKey,\n C extends PropertyKey\n>(\n tasks: readonly [PregelExecutableTask<N, C>, PendingWrite<C>[]][],\n streamChannels: PropertyKey | Array<PropertyKey>\n) {\n for (const [{ id, name, config }, writes] of tasks) {\n if (config?.tags?.includes(TAG_HIDDEN)) continue;\n yield {\n id,\n name,\n result: mapTaskResultWrites(\n writes.filter(([channel]) => {\n return Array.isArray(streamChannels)\n ? streamChannels.includes(channel)\n : channel === streamChannels;\n })\n ),\n interrupts: writes.filter((w) => w[0] === INTERRUPT).map((w) => w[1]),\n };\n }\n}\n\ntype ChannelKey = string | number | symbol;\n\nexport function* mapDebugCheckpoint<\n N extends PropertyKey,\n C extends PropertyKey\n>(\n config: RunnableConfig,\n channels: Record<string, BaseChannel>,\n streamChannels: string | string[],\n metadata: CheckpointMetadata,\n tasks: readonly PregelExecutableTask<N, C>[],\n pendingWrites: CheckpointPendingWrite[],\n parentConfig: RunnableConfig | undefined,\n outputKeys: ChannelKey | ChannelKey[]\n) {\n function formatConfig(config: RunnableConfig) {\n // https://stackoverflow.com/a/78298178\n type CamelToSnake<\n T extends string,\n A extends string = \"\"\n > = T extends `${infer F}${infer R}`\n ? CamelToSnake<\n R,\n `${A}${F extends Lowercase<F> ? F : `_${Lowercase<F>}`}`\n >\n : A;\n\n // make sure the config is consistent with Python\n const pyConfig: Partial<\n Record<CamelToSnake<keyof RunnableConfig>, unknown>\n > = {};\n\n if (config.callbacks != null) pyConfig.callbacks = config.callbacks;\n if (config.configurable != null)\n pyConfig.configurable = config.configurable;\n if (config.maxConcurrency != null)\n pyConfig.max_concurrency = config.maxConcurrency;\n\n if (config.metadata != null) pyConfig.metadata = config.metadata;\n if (config.recursionLimit != null)\n pyConfig.recursion_limit = config.recursionLimit;\n if (config.runId != null) pyConfig.run_id = config.runId;\n if (config.runName != null) pyConfig.run_name = config.runName;\n if (config.tags != null) pyConfig.tags = config.tags;\n\n return pyConfig;\n }\n\n const parentNs = config.configurable?.checkpoint_ns;\n const taskStates: Record<string, RunnableConfig | StateSnapshot> = {};\n\n for (const task of tasks) {\n const candidates = task.subgraphs?.length ? task.subgraphs : [task.proc];\n if (!candidates.find(findSubgraphPregel)) continue;\n\n let taskNs = `${task.name as string}:${task.id}`;\n if (parentNs) taskNs = `${parentNs}|${taskNs}`;\n\n taskStates[task.id] = {\n configurable: {\n thread_id: config.configurable?.thread_id,\n checkpoint_ns: taskNs,\n },\n };\n }\n\n yield {\n config: formatConfig(config),\n values: readChannels(channels, streamChannels),\n metadata,\n next: tasks.map((task) => task.name),\n tasks: tasksWithWrites(tasks, pendingWrites, taskStates, outputKeys),\n parentConfig: parentConfig ? formatConfig(parentConfig) : undefined,\n };\n}\n\nexport function tasksWithWrites<N extends PropertyKey, C extends PropertyKey>(\n tasks: PregelTaskDescription[] | readonly PregelExecutableTask<N, C>[],\n pendingWrites: CheckpointPendingWrite[],\n states: Record<string, RunnableConfig | StateSnapshot> | undefined,\n outputKeys: ChannelKey[] | ChannelKey\n): PregelTaskDescription[] {\n return tasks.map((task): PregelTaskDescription => {\n const error = pendingWrites.find(\n ([id, n]) => id === task.id && n === ERROR\n )?.[2];\n\n const interrupts = pendingWrites\n .filter(([id, n]) => id === task.id && n === INTERRUPT)\n .map(([, , v]) => v) as Interrupt[];\n\n const result = (() => {\n if (error || interrupts.length || !pendingWrites.length) return undefined;\n\n const idx = pendingWrites.findIndex(\n ([tid, n]) => tid === task.id && n === RETURN\n );\n\n if (idx >= 0) return pendingWrites[idx][2];\n\n if (typeof outputKeys === \"string\") {\n return pendingWrites.find(\n ([tid, n]) => tid === task.id && n === outputKeys\n )?.[2];\n }\n\n if (Array.isArray(outputKeys)) {\n const results = pendingWrites\n .filter(([tid, n]) => tid === task.id && outputKeys.includes(n))\n .map(([, n, v]) => [n, v] as PendingWrite<C>);\n\n if (!results.length) return undefined;\n return mapTaskResultWrites(results);\n }\n\n return undefined;\n })();\n\n if (error) {\n return {\n id: task.id,\n name: task.name as string,\n path: task.path,\n error,\n interrupts,\n result,\n };\n }\n\n const taskState = states?.[task.id];\n return {\n id: task.id,\n name: task.name as string,\n path: task.path,\n interrupts,\n ...(taskState !== undefined ? { state: taskState } : {}),\n result,\n };\n });\n}\n\nexport function printStepCheckpoint(\n step: number,\n channels: Record<string, BaseChannel<unknown>>,\n whitelist: string[]\n): void {\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:checkpoint]`)}`,\n `\\x1b[1m State at the end of step ${step}:\\x1b[0m\\n`,\n JSON.stringify(readChannels(channels, whitelist), null, 2),\n ].join(\"\")\n );\n}\n\nexport function printStepTasks<N extends PropertyKey, C extends PropertyKey>(\n step: number,\n nextTasks: readonly PregelExecutableTask<N, C>[]\n): void {\n const nTasks = nextTasks.length;\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:tasks]`)}`,\n `\\x1b[1m Starting step ${step} with ${nTasks} task${\n nTasks === 1 ? \"\" : \"s\"\n }:\\x1b[0m\\n`,\n nextTasks\n .map(\n (task) =>\n `- ${wrap(COLORS_MAP.green, String(task.name))} -> ${JSON.stringify(\n task.input,\n null,\n 2\n )}`\n )\n .join(\"\\n\"),\n ].join(\"\")\n );\n}\n\nexport function printStepWrites(\n step: number,\n writes: PendingWrite[],\n whitelist: string[]\n): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const byChannel: Record<string, any[]> = {};\n\n for (const [channel, value] of writes) {\n if (whitelist.includes(channel)) {\n if (!byChannel[channel]) {\n byChannel[channel] = [];\n }\n byChannel[channel].push(value);\n }\n }\n\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:writes]`)}`,\n `\\x1b[1m Finished step ${step} with writes to ${\n Object.keys(byChannel).length\n } channel${Object.keys(byChannel).length !== 1 ? \"s\" : \"\"}:\\x1b[0m\\n`,\n Object.entries(byChannel)\n .map(\n ([name, vals]) =>\n `- ${wrap(COLORS_MAP.yellow, name)} -> ${vals\n .map((v) => JSON.stringify(v))\n .join(\", \")}`\n )\n .join(\"\\n\"),\n ].join(\"\")\n );\n}\n"],"mappings":"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"}
@@ -24,17 +24,16 @@ const wrap = (color, text) => `${color.start}${text}${color.end}`;
24
24
  function* mapDebugTasks(tasks) {
25
25
  for (const { id, name, input, config, triggers, writes } of tasks) {
26
26
  if (config?.tags?.includes(TAG_HIDDEN)) continue;
27
- const interrupts = writes.filter(([writeId, n]) => {
28
- return writeId === id && n === INTERRUPT;
29
- }).map(([, v]) => {
30
- return v;
31
- });
32
27
  yield {
33
28
  id,
34
29
  name,
35
30
  input,
36
31
  triggers,
37
- interrupts
32
+ interrupts: writes.filter(([writeId, n]) => {
33
+ return writeId === id && n === INTERRUPT;
34
+ }).map(([, v]) => {
35
+ return v;
36
+ })
38
37
  };
39
38
  }
40
39
  }
@@ -83,8 +82,7 @@ function* mapDebugCheckpoint(config, channels, streamChannels, metadata, tasks,
83
82
  const parentNs = config.configurable?.checkpoint_ns;
84
83
  const taskStates = {};
85
84
  for (const task of tasks) {
86
- const candidates = task.subgraphs?.length ? task.subgraphs : [task.proc];
87
- if (!candidates.find(findSubgraphPregel)) continue;
85
+ if (!(task.subgraphs?.length ? task.subgraphs : [task.proc]).find(findSubgraphPregel)) continue;
88
86
  let taskNs = `${task.name}:${task.id}`;
89
87
  if (parentNs) taskNs = `${parentNs}|${taskNs}`;
90
88
  taskStates[task.id] = { configurable: {
@@ -115,7 +113,6 @@ function tasksWithWrites(tasks, pendingWrites, states, outputKeys) {
115
113
  if (!results.length) return void 0;
116
114
  return mapTaskResultWrites(results);
117
115
  }
118
- return void 0;
119
116
  })();
120
117
  if (error) return {
121
118
  id: task.id,
@@ -1 +1 @@
1
- {"version":3,"file":"debug.js","names":["COLORS_MAP: ConsoleColorMap","result: Record<string, unknown>","pyConfig: Partial<\n Record<CamelToSnake<keyof RunnableConfig>, unknown>\n >","config","taskStates: Record<string, RunnableConfig | StateSnapshot>","byChannel: Record<string, any[]>"],"sources":["../../src/pregel/debug.ts"],"sourcesContent":["import { RunnableConfig } from \"@langchain/core/runnables\";\nimport {\n CheckpointMetadata,\n CheckpointPendingWrite,\n PendingWrite,\n} from \"@langchain/langgraph-checkpoint\";\nimport { BaseChannel } from \"../channels/base.js\";\nimport {\n ERROR,\n Interrupt,\n INTERRUPT,\n RETURN,\n TAG_HIDDEN,\n} from \"../constants.js\";\nimport { EmptyChannelError } from \"../errors.js\";\nimport {\n PregelExecutableTask,\n PregelTaskDescription,\n StateSnapshot,\n} from \"./types.js\";\nimport { readChannels } from \"./io.js\";\nimport { findSubgraphPregel } from \"./utils/subgraph.js\";\n\ntype ConsoleColors = {\n start: string;\n end: string;\n};\n\ntype ConsoleColorMap = {\n [key: string]: ConsoleColors;\n};\n\nconst COLORS_MAP: ConsoleColorMap = {\n blue: {\n start: \"\\x1b[34m\",\n end: \"\\x1b[0m\",\n },\n green: {\n start: \"\\x1b[32m\",\n end: \"\\x1b[0m\",\n },\n yellow: {\n start: \"\\x1b[33;1m\",\n end: \"\\x1b[0m\",\n },\n};\n\n/**\n * Wrap some text in a color for printing to the console.\n */\nexport const wrap = (color: ConsoleColors, text: string): string =>\n `${color.start}${text}${color.end}`;\n\nexport function printCheckpoint<Value>(\n step: number,\n channels: Record<string, BaseChannel<Value>>\n) {\n console.log(\n [\n `${wrap(COLORS_MAP.blue, \"[langgraph/checkpoint]\")}`,\n `Finishing step ${step}. Channel values:\\n`,\n `\\n${JSON.stringify(\n Object.fromEntries(_readChannels<Value>(channels)),\n null,\n 2\n )}`,\n ].join(\"\")\n );\n}\n\nexport function* _readChannels<Value>(\n channels: Record<string, BaseChannel<Value>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): IterableIterator<[string, any]> {\n for (const [name, channel] of Object.entries(channels)) {\n try {\n yield [name, channel.get()];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (error.name === EmptyChannelError.unminifiable_name) {\n // Skip the channel if it's empty\n continue;\n } else {\n throw error; // Re-throw the error if it's not an EmptyChannelError\n }\n }\n }\n}\n\nexport function* mapDebugTasks<N extends PropertyKey, C extends PropertyKey>(\n tasks: readonly PregelExecutableTask<N, C>[]\n) {\n for (const { id, name, input, config, triggers, writes } of tasks) {\n if (config?.tags?.includes(TAG_HIDDEN)) continue;\n\n const interrupts = writes\n .filter(([writeId, n]) => {\n return writeId === id && n === INTERRUPT;\n })\n .map(([, v]) => {\n return v;\n });\n yield { id, name, input, triggers, interrupts };\n }\n}\n\nfunction isMultipleChannelWrite(\n value: unknown\n): value is { $writes: unknown[] } {\n if (typeof value !== \"object\" || value === null) return false;\n return \"$writes\" in value && Array.isArray(value.$writes);\n}\n\nfunction mapTaskResultWrites(writes: PendingWrite<unknown>[]) {\n const result: Record<string, unknown> = {};\n\n for (const [channel, value] of writes) {\n const strChannel = String(channel);\n\n if (strChannel in result) {\n const channelWrites = isMultipleChannelWrite(result[strChannel])\n ? result[strChannel].$writes\n : [result[strChannel]];\n\n channelWrites.push(value);\n result[strChannel] = { $writes: channelWrites };\n } else {\n result[strChannel] = value;\n }\n }\n return result;\n}\n\nexport function* mapDebugTaskResults<\n N extends PropertyKey,\n C extends PropertyKey\n>(\n tasks: readonly [PregelExecutableTask<N, C>, PendingWrite<C>[]][],\n streamChannels: PropertyKey | Array<PropertyKey>\n) {\n for (const [{ id, name, config }, writes] of tasks) {\n if (config?.tags?.includes(TAG_HIDDEN)) continue;\n yield {\n id,\n name,\n result: mapTaskResultWrites(\n writes.filter(([channel]) => {\n return Array.isArray(streamChannels)\n ? streamChannels.includes(channel)\n : channel === streamChannels;\n })\n ),\n interrupts: writes.filter((w) => w[0] === INTERRUPT).map((w) => w[1]),\n };\n }\n}\n\ntype ChannelKey = string | number | symbol;\n\nexport function* mapDebugCheckpoint<\n N extends PropertyKey,\n C extends PropertyKey\n>(\n config: RunnableConfig,\n channels: Record<string, BaseChannel>,\n streamChannels: string | string[],\n metadata: CheckpointMetadata,\n tasks: readonly PregelExecutableTask<N, C>[],\n pendingWrites: CheckpointPendingWrite[],\n parentConfig: RunnableConfig | undefined,\n outputKeys: ChannelKey | ChannelKey[]\n) {\n function formatConfig(config: RunnableConfig) {\n // https://stackoverflow.com/a/78298178\n type CamelToSnake<\n T extends string,\n A extends string = \"\"\n > = T extends `${infer F}${infer R}`\n ? CamelToSnake<\n R,\n `${A}${F extends Lowercase<F> ? F : `_${Lowercase<F>}`}`\n >\n : A;\n\n // make sure the config is consistent with Python\n const pyConfig: Partial<\n Record<CamelToSnake<keyof RunnableConfig>, unknown>\n > = {};\n\n if (config.callbacks != null) pyConfig.callbacks = config.callbacks;\n if (config.configurable != null)\n pyConfig.configurable = config.configurable;\n if (config.maxConcurrency != null)\n pyConfig.max_concurrency = config.maxConcurrency;\n\n if (config.metadata != null) pyConfig.metadata = config.metadata;\n if (config.recursionLimit != null)\n pyConfig.recursion_limit = config.recursionLimit;\n if (config.runId != null) pyConfig.run_id = config.runId;\n if (config.runName != null) pyConfig.run_name = config.runName;\n if (config.tags != null) pyConfig.tags = config.tags;\n\n return pyConfig;\n }\n\n const parentNs = config.configurable?.checkpoint_ns;\n const taskStates: Record<string, RunnableConfig | StateSnapshot> = {};\n\n for (const task of tasks) {\n const candidates = task.subgraphs?.length ? task.subgraphs : [task.proc];\n if (!candidates.find(findSubgraphPregel)) continue;\n\n let taskNs = `${task.name as string}:${task.id}`;\n if (parentNs) taskNs = `${parentNs}|${taskNs}`;\n\n taskStates[task.id] = {\n configurable: {\n thread_id: config.configurable?.thread_id,\n checkpoint_ns: taskNs,\n },\n };\n }\n\n yield {\n config: formatConfig(config),\n values: readChannels(channels, streamChannels),\n metadata,\n next: tasks.map((task) => task.name),\n tasks: tasksWithWrites(tasks, pendingWrites, taskStates, outputKeys),\n parentConfig: parentConfig ? formatConfig(parentConfig) : undefined,\n };\n}\n\nexport function tasksWithWrites<N extends PropertyKey, C extends PropertyKey>(\n tasks: PregelTaskDescription[] | readonly PregelExecutableTask<N, C>[],\n pendingWrites: CheckpointPendingWrite[],\n states: Record<string, RunnableConfig | StateSnapshot> | undefined,\n outputKeys: ChannelKey[] | ChannelKey\n): PregelTaskDescription[] {\n return tasks.map((task): PregelTaskDescription => {\n const error = pendingWrites.find(\n ([id, n]) => id === task.id && n === ERROR\n )?.[2];\n\n const interrupts = pendingWrites\n .filter(([id, n]) => id === task.id && n === INTERRUPT)\n .map(([, , v]) => v) as Interrupt[];\n\n const result = (() => {\n if (error || interrupts.length || !pendingWrites.length) return undefined;\n\n const idx = pendingWrites.findIndex(\n ([tid, n]) => tid === task.id && n === RETURN\n );\n\n if (idx >= 0) return pendingWrites[idx][2];\n\n if (typeof outputKeys === \"string\") {\n return pendingWrites.find(\n ([tid, n]) => tid === task.id && n === outputKeys\n )?.[2];\n }\n\n if (Array.isArray(outputKeys)) {\n const results = pendingWrites\n .filter(([tid, n]) => tid === task.id && outputKeys.includes(n))\n .map(([, n, v]) => [n, v] as PendingWrite<C>);\n\n if (!results.length) return undefined;\n return mapTaskResultWrites(results);\n }\n\n return undefined;\n })();\n\n if (error) {\n return {\n id: task.id,\n name: task.name as string,\n path: task.path,\n error,\n interrupts,\n result,\n };\n }\n\n const taskState = states?.[task.id];\n return {\n id: task.id,\n name: task.name as string,\n path: task.path,\n interrupts,\n ...(taskState !== undefined ? { state: taskState } : {}),\n result,\n };\n });\n}\n\nexport function printStepCheckpoint(\n step: number,\n channels: Record<string, BaseChannel<unknown>>,\n whitelist: string[]\n): void {\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:checkpoint]`)}`,\n `\\x1b[1m State at the end of step ${step}:\\x1b[0m\\n`,\n JSON.stringify(readChannels(channels, whitelist), null, 2),\n ].join(\"\")\n );\n}\n\nexport function printStepTasks<N extends PropertyKey, C extends PropertyKey>(\n step: number,\n nextTasks: readonly PregelExecutableTask<N, C>[]\n): void {\n const nTasks = nextTasks.length;\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:tasks]`)}`,\n `\\x1b[1m Starting step ${step} with ${nTasks} task${\n nTasks === 1 ? \"\" : \"s\"\n }:\\x1b[0m\\n`,\n nextTasks\n .map(\n (task) =>\n `- ${wrap(COLORS_MAP.green, String(task.name))} -> ${JSON.stringify(\n task.input,\n null,\n 2\n )}`\n )\n .join(\"\\n\"),\n ].join(\"\")\n );\n}\n\nexport function printStepWrites(\n step: number,\n writes: PendingWrite[],\n whitelist: string[]\n): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const byChannel: Record<string, any[]> = {};\n\n for (const [channel, value] of writes) {\n if (whitelist.includes(channel)) {\n if (!byChannel[channel]) {\n byChannel[channel] = [];\n }\n byChannel[channel].push(value);\n }\n }\n\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:writes]`)}`,\n `\\x1b[1m Finished step ${step} with writes to ${\n Object.keys(byChannel).length\n } channel${Object.keys(byChannel).length !== 1 ? \"s\" : \"\"}:\\x1b[0m\\n`,\n Object.entries(byChannel)\n .map(\n ([name, vals]) =>\n `- ${wrap(COLORS_MAP.yellow, name)} -> ${vals\n .map((v) => JSON.stringify(v))\n .join(\", \")}`\n )\n .join(\"\\n\"),\n ].join(\"\")\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"debug.js","names":["config"],"sources":["../../src/pregel/debug.ts"],"sourcesContent":["import { RunnableConfig } from \"@langchain/core/runnables\";\nimport {\n CheckpointMetadata,\n CheckpointPendingWrite,\n PendingWrite,\n} from \"@langchain/langgraph-checkpoint\";\nimport { BaseChannel } from \"../channels/base.js\";\nimport {\n ERROR,\n Interrupt,\n INTERRUPT,\n RETURN,\n TAG_HIDDEN,\n} from \"../constants.js\";\nimport { EmptyChannelError } from \"../errors.js\";\nimport {\n PregelExecutableTask,\n PregelTaskDescription,\n StateSnapshot,\n} from \"./types.js\";\nimport { readChannels } from \"./io.js\";\nimport { findSubgraphPregel } from \"./utils/subgraph.js\";\n\ntype ConsoleColors = {\n start: string;\n end: string;\n};\n\ntype ConsoleColorMap = {\n [key: string]: ConsoleColors;\n};\n\nconst COLORS_MAP: ConsoleColorMap = {\n blue: {\n start: \"\\x1b[34m\",\n end: \"\\x1b[0m\",\n },\n green: {\n start: \"\\x1b[32m\",\n end: \"\\x1b[0m\",\n },\n yellow: {\n start: \"\\x1b[33;1m\",\n end: \"\\x1b[0m\",\n },\n};\n\n/**\n * Wrap some text in a color for printing to the console.\n */\nexport const wrap = (color: ConsoleColors, text: string): string =>\n `${color.start}${text}${color.end}`;\n\nexport function printCheckpoint<Value>(\n step: number,\n channels: Record<string, BaseChannel<Value>>\n) {\n console.log(\n [\n `${wrap(COLORS_MAP.blue, \"[langgraph/checkpoint]\")}`,\n `Finishing step ${step}. Channel values:\\n`,\n `\\n${JSON.stringify(\n Object.fromEntries(_readChannels<Value>(channels)),\n null,\n 2\n )}`,\n ].join(\"\")\n );\n}\n\nexport function* _readChannels<Value>(\n channels: Record<string, BaseChannel<Value>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): IterableIterator<[string, any]> {\n for (const [name, channel] of Object.entries(channels)) {\n try {\n yield [name, channel.get()];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (error.name === EmptyChannelError.unminifiable_name) {\n // Skip the channel if it's empty\n continue;\n } else {\n throw error; // Re-throw the error if it's not an EmptyChannelError\n }\n }\n }\n}\n\nexport function* mapDebugTasks<N extends PropertyKey, C extends PropertyKey>(\n tasks: readonly PregelExecutableTask<N, C>[]\n) {\n for (const { id, name, input, config, triggers, writes } of tasks) {\n if (config?.tags?.includes(TAG_HIDDEN)) continue;\n\n const interrupts = writes\n .filter(([writeId, n]) => {\n return writeId === id && n === INTERRUPT;\n })\n .map(([, v]) => {\n return v;\n });\n yield { id, name, input, triggers, interrupts };\n }\n}\n\nfunction isMultipleChannelWrite(\n value: unknown\n): value is { $writes: unknown[] } {\n if (typeof value !== \"object\" || value === null) return false;\n return \"$writes\" in value && Array.isArray(value.$writes);\n}\n\nfunction mapTaskResultWrites(writes: PendingWrite<unknown>[]) {\n const result: Record<string, unknown> = {};\n\n for (const [channel, value] of writes) {\n const strChannel = String(channel);\n\n if (strChannel in result) {\n const channelWrites = isMultipleChannelWrite(result[strChannel])\n ? result[strChannel].$writes\n : [result[strChannel]];\n\n channelWrites.push(value);\n result[strChannel] = { $writes: channelWrites };\n } else {\n result[strChannel] = value;\n }\n }\n return result;\n}\n\nexport function* mapDebugTaskResults<\n N extends PropertyKey,\n C extends PropertyKey\n>(\n tasks: readonly [PregelExecutableTask<N, C>, PendingWrite<C>[]][],\n streamChannels: PropertyKey | Array<PropertyKey>\n) {\n for (const [{ id, name, config }, writes] of tasks) {\n if (config?.tags?.includes(TAG_HIDDEN)) continue;\n yield {\n id,\n name,\n result: mapTaskResultWrites(\n writes.filter(([channel]) => {\n return Array.isArray(streamChannels)\n ? streamChannels.includes(channel)\n : channel === streamChannels;\n })\n ),\n interrupts: writes.filter((w) => w[0] === INTERRUPT).map((w) => w[1]),\n };\n }\n}\n\ntype ChannelKey = string | number | symbol;\n\nexport function* mapDebugCheckpoint<\n N extends PropertyKey,\n C extends PropertyKey\n>(\n config: RunnableConfig,\n channels: Record<string, BaseChannel>,\n streamChannels: string | string[],\n metadata: CheckpointMetadata,\n tasks: readonly PregelExecutableTask<N, C>[],\n pendingWrites: CheckpointPendingWrite[],\n parentConfig: RunnableConfig | undefined,\n outputKeys: ChannelKey | ChannelKey[]\n) {\n function formatConfig(config: RunnableConfig) {\n // https://stackoverflow.com/a/78298178\n type CamelToSnake<\n T extends string,\n A extends string = \"\"\n > = T extends `${infer F}${infer R}`\n ? CamelToSnake<\n R,\n `${A}${F extends Lowercase<F> ? F : `_${Lowercase<F>}`}`\n >\n : A;\n\n // make sure the config is consistent with Python\n const pyConfig: Partial<\n Record<CamelToSnake<keyof RunnableConfig>, unknown>\n > = {};\n\n if (config.callbacks != null) pyConfig.callbacks = config.callbacks;\n if (config.configurable != null)\n pyConfig.configurable = config.configurable;\n if (config.maxConcurrency != null)\n pyConfig.max_concurrency = config.maxConcurrency;\n\n if (config.metadata != null) pyConfig.metadata = config.metadata;\n if (config.recursionLimit != null)\n pyConfig.recursion_limit = config.recursionLimit;\n if (config.runId != null) pyConfig.run_id = config.runId;\n if (config.runName != null) pyConfig.run_name = config.runName;\n if (config.tags != null) pyConfig.tags = config.tags;\n\n return pyConfig;\n }\n\n const parentNs = config.configurable?.checkpoint_ns;\n const taskStates: Record<string, RunnableConfig | StateSnapshot> = {};\n\n for (const task of tasks) {\n const candidates = task.subgraphs?.length ? task.subgraphs : [task.proc];\n if (!candidates.find(findSubgraphPregel)) continue;\n\n let taskNs = `${task.name as string}:${task.id}`;\n if (parentNs) taskNs = `${parentNs}|${taskNs}`;\n\n taskStates[task.id] = {\n configurable: {\n thread_id: config.configurable?.thread_id,\n checkpoint_ns: taskNs,\n },\n };\n }\n\n yield {\n config: formatConfig(config),\n values: readChannels(channels, streamChannels),\n metadata,\n next: tasks.map((task) => task.name),\n tasks: tasksWithWrites(tasks, pendingWrites, taskStates, outputKeys),\n parentConfig: parentConfig ? formatConfig(parentConfig) : undefined,\n };\n}\n\nexport function tasksWithWrites<N extends PropertyKey, C extends PropertyKey>(\n tasks: PregelTaskDescription[] | readonly PregelExecutableTask<N, C>[],\n pendingWrites: CheckpointPendingWrite[],\n states: Record<string, RunnableConfig | StateSnapshot> | undefined,\n outputKeys: ChannelKey[] | ChannelKey\n): PregelTaskDescription[] {\n return tasks.map((task): PregelTaskDescription => {\n const error = pendingWrites.find(\n ([id, n]) => id === task.id && n === ERROR\n )?.[2];\n\n const interrupts = pendingWrites\n .filter(([id, n]) => id === task.id && n === INTERRUPT)\n .map(([, , v]) => v) as Interrupt[];\n\n const result = (() => {\n if (error || interrupts.length || !pendingWrites.length) return undefined;\n\n const idx = pendingWrites.findIndex(\n ([tid, n]) => tid === task.id && n === RETURN\n );\n\n if (idx >= 0) return pendingWrites[idx][2];\n\n if (typeof outputKeys === \"string\") {\n return pendingWrites.find(\n ([tid, n]) => tid === task.id && n === outputKeys\n )?.[2];\n }\n\n if (Array.isArray(outputKeys)) {\n const results = pendingWrites\n .filter(([tid, n]) => tid === task.id && outputKeys.includes(n))\n .map(([, n, v]) => [n, v] as PendingWrite<C>);\n\n if (!results.length) return undefined;\n return mapTaskResultWrites(results);\n }\n\n return undefined;\n })();\n\n if (error) {\n return {\n id: task.id,\n name: task.name as string,\n path: task.path,\n error,\n interrupts,\n result,\n };\n }\n\n const taskState = states?.[task.id];\n return {\n id: task.id,\n name: task.name as string,\n path: task.path,\n interrupts,\n ...(taskState !== undefined ? { state: taskState } : {}),\n result,\n };\n });\n}\n\nexport function printStepCheckpoint(\n step: number,\n channels: Record<string, BaseChannel<unknown>>,\n whitelist: string[]\n): void {\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:checkpoint]`)}`,\n `\\x1b[1m State at the end of step ${step}:\\x1b[0m\\n`,\n JSON.stringify(readChannels(channels, whitelist), null, 2),\n ].join(\"\")\n );\n}\n\nexport function printStepTasks<N extends PropertyKey, C extends PropertyKey>(\n step: number,\n nextTasks: readonly PregelExecutableTask<N, C>[]\n): void {\n const nTasks = nextTasks.length;\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:tasks]`)}`,\n `\\x1b[1m Starting step ${step} with ${nTasks} task${\n nTasks === 1 ? \"\" : \"s\"\n }:\\x1b[0m\\n`,\n nextTasks\n .map(\n (task) =>\n `- ${wrap(COLORS_MAP.green, String(task.name))} -> ${JSON.stringify(\n task.input,\n null,\n 2\n )}`\n )\n .join(\"\\n\"),\n ].join(\"\")\n );\n}\n\nexport function printStepWrites(\n step: number,\n writes: PendingWrite[],\n whitelist: string[]\n): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const byChannel: Record<string, any[]> = {};\n\n for (const [channel, value] of writes) {\n if (whitelist.includes(channel)) {\n if (!byChannel[channel]) {\n byChannel[channel] = [];\n }\n byChannel[channel].push(value);\n }\n }\n\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:writes]`)}`,\n `\\x1b[1m Finished step ${step} with writes to ${\n Object.keys(byChannel).length\n } channel${Object.keys(byChannel).length !== 1 ? \"s\" : \"\"}:\\x1b[0m\\n`,\n Object.entries(byChannel)\n .map(\n ([name, vals]) =>\n `- ${wrap(COLORS_MAP.yellow, name)} -> ${vals\n .map((v) => JSON.stringify(v))\n .join(\", \")}`\n )\n .join(\"\\n\"),\n ].join(\"\")\n );\n}\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
1
  const require_errors = require('../errors.cjs');
3
2
  const require_base = require('../channels/base.cjs');
4
3
  const require_constants = require('../constants.cjs');
@@ -18,8 +17,8 @@ const require_runner = require('./runner.cjs');
18
17
  const require_validate = require('./validate.cjs');
19
18
  const require_topic = require('../channels/topic.cjs');
20
19
  const require_interrupt = require('../interrupt.cjs');
21
- const __langchain_langgraph_checkpoint = require_rolldown_runtime.__toESM(require("@langchain/langgraph-checkpoint"));
22
- const __langchain_core_runnables = require_rolldown_runtime.__toESM(require("@langchain/core/runnables"));
20
+ let _langchain_langgraph_checkpoint = require("@langchain/langgraph-checkpoint");
21
+ let _langchain_core_runnables = require("@langchain/core/runnables");
23
22
 
24
23
  //#region src/pregel/index.ts
25
24
  /**
@@ -41,10 +40,9 @@ var Channel = class {
41
40
  if (typeof channels === "string") if (key) channelMappingOrArray = { [key]: channels };
42
41
  else channelMappingOrArray = [channels];
43
42
  else channelMappingOrArray = Object.fromEntries(channels.map((chan) => [chan, chan]));
44
- const triggers = Array.isArray(channels) ? channels : [channels];
45
43
  return new require_read.PregelNode({
46
44
  channels: channelMappingOrArray,
47
- triggers,
45
+ triggers: Array.isArray(channels) ? channels : [channels],
48
46
  tags
49
47
  });
50
48
  }
@@ -80,11 +78,11 @@ var Channel = class {
80
78
  value: require_write.PASSTHROUGH,
81
79
  skipNone: false
82
80
  });
83
- for (const [key, value] of Object.entries(writes ?? {})) if (__langchain_core_runnables.Runnable.isRunnable(value) || typeof value === "function") channelWriteEntries.push({
81
+ for (const [key, value] of Object.entries(writes ?? {})) if (_langchain_core_runnables.Runnable.isRunnable(value) || typeof value === "function") channelWriteEntries.push({
84
82
  channel: key,
85
83
  value: require_write.PASSTHROUGH,
86
84
  skipNone: true,
87
- mapper: (0, __langchain_core_runnables._coerceToRunnable)(value)
85
+ mapper: (0, _langchain_core_runnables._coerceToRunnable)(value)
88
86
  });
89
87
  else channelWriteEntries.push({
90
88
  channel: key,
@@ -94,7 +92,7 @@ var Channel = class {
94
92
  return new require_write.ChannelWrite(channelWriteEntries);
95
93
  }
96
94
  };
97
- var PartialRunnable = class extends __langchain_core_runnables.Runnable {
95
+ var PartialRunnable = class extends _langchain_core_runnables.Runnable {
98
96
  lc_namespace = ["langgraph", "pregel"];
99
97
  invoke(_input, _options) {
100
98
  throw new Error("Not implemented");
@@ -302,7 +300,7 @@ var Pregel = class extends PartialRunnable {
302
300
  * @returns A new Pregel instance with the merged configuration
303
301
  */
304
302
  withConfig(config) {
305
- const mergedConfig = (0, __langchain_core_runnables.mergeConfigs)(this.config, config);
303
+ const mergedConfig = (0, _langchain_core_runnables.mergeConfigs)(this.config, config);
306
304
  return new this.constructor({
307
305
  ...this,
308
306
  config: mergedConfig
@@ -471,7 +469,7 @@ var Pregel = class extends PartialRunnable {
471
469
  if ([
472
470
  require_constants.ERROR,
473
471
  require_constants.INTERRUPT,
474
- __langchain_langgraph_checkpoint.SCHEDULED
472
+ _langchain_langgraph_checkpoint.SCHEDULED
475
473
  ].includes(channel)) continue;
476
474
  if (!(taskId in nextTaskById)) continue;
477
475
  nextTaskById[taskId].writes.push([String(channel), value]);
@@ -513,15 +511,14 @@ var Pregel = class extends PartialRunnable {
513
511
  for await (const [name, subgraph] of this.getSubgraphsAsync(recastNamespace, true)) if (name === recastNamespace) return await subgraph.getState(require_utils.patchConfigurable(config, { [require_constants.CONFIG_KEY_CHECKPOINTER]: checkpointer }), { subgraphs: options?.subgraphs });
514
512
  throw new Error(`Subgraph with namespace "${recastNamespace}" not found.`);
515
513
  }
516
- const mergedConfig = (0, __langchain_core_runnables.mergeConfigs)(this.config, config);
514
+ const mergedConfig = (0, _langchain_core_runnables.mergeConfigs)(this.config, config);
517
515
  const saved = await checkpointer.getTuple(config);
518
- const snapshot = await this._prepareStateSnapshot({
516
+ return await this._prepareStateSnapshot({
519
517
  config: mergedConfig,
520
518
  saved,
521
519
  subgraphCheckpointer: options?.subgraphs ? checkpointer : void 0,
522
520
  applyPendingWrites: !config.configurable?.checkpoint_id
523
521
  });
524
- return snapshot;
525
522
  }
526
523
  /**
527
524
  * Gets the history of graph states.
@@ -548,7 +545,7 @@ var Pregel = class extends PartialRunnable {
548
545
  }
549
546
  throw new Error(`Subgraph with namespace "${recastNamespace}" not found.`);
550
547
  }
551
- const mergedConfig = (0, __langchain_core_runnables.mergeConfigs)(this.config, config, { configurable: { checkpoint_ns: checkpointNamespace } });
548
+ const mergedConfig = (0, _langchain_core_runnables.mergeConfigs)(this.config, config, { configurable: { checkpoint_ns: checkpointNamespace } });
552
549
  for await (const checkpointTuple of checkpointer.list(mergedConfig, options)) yield this._prepareStateSnapshot({
553
550
  config: checkpointTuple.config,
554
551
  saved: checkpointTuple
@@ -582,9 +579,9 @@ var Pregel = class extends PartialRunnable {
582
579
  throw new Error(`Subgraph "${recastNamespace}" not found`);
583
580
  }
584
581
  const updateSuperStep = async (inputConfig, updates) => {
585
- const config = this.config ? (0, __langchain_core_runnables.mergeConfigs)(this.config, inputConfig) : inputConfig;
582
+ const config = this.config ? (0, _langchain_core_runnables.mergeConfigs)(this.config, inputConfig) : inputConfig;
586
583
  const saved = await checkpointer.getTuple(config);
587
- const checkpoint = saved !== void 0 ? (0, __langchain_langgraph_checkpoint.copyCheckpoint)(saved.checkpoint) : (0, __langchain_langgraph_checkpoint.emptyCheckpoint)();
584
+ const checkpoint = saved !== void 0 ? (0, _langchain_langgraph_checkpoint.copyCheckpoint)(saved.checkpoint) : (0, _langchain_langgraph_checkpoint.emptyCheckpoint)();
588
585
  const checkpointPreviousVersions = { ...saved?.checkpoint.channel_versions };
589
586
  const step = saved?.metadata?.step ?? -1;
590
587
  let checkpointConfig = require_utils.patchConfigurable(config, { checkpoint_ns: config.configurable?.checkpoint_ns ?? "" });
@@ -599,12 +596,11 @@ var Pregel = class extends PartialRunnable {
599
596
  const { values, asNode } = updates[0];
600
597
  if (values == null && asNode === void 0) {
601
598
  if (updates.length > 1) throw new require_errors.InvalidUpdateError(`Cannot create empty checkpoint with multiple updates`);
602
- const nextConfig$1 = await checkpointer.put(checkpointConfig, require_base.createCheckpoint(checkpoint, void 0, step), {
599
+ return require_index.patchCheckpointMap(await checkpointer.put(checkpointConfig, require_base.createCheckpoint(checkpoint, void 0, step), {
603
600
  source: "update",
604
601
  step: step + 1,
605
602
  parents: saved?.metadata?.parents ?? {}
606
- }, {});
607
- return require_index.patchCheckpointMap(nextConfig$1, saved ? saved.metadata : void 0);
603
+ }, {}), saved ? saved.metadata : void 0);
608
604
  }
609
605
  const channels = require_base.emptyChannels(this.channels, checkpoint);
610
606
  if (values === null && asNode === require_constants.END) {
@@ -625,20 +621,19 @@ var Pregel = class extends PartialRunnable {
625
621
  if ([
626
622
  require_constants.ERROR,
627
623
  require_constants.INTERRUPT,
628
- __langchain_langgraph_checkpoint.SCHEDULED
624
+ _langchain_langgraph_checkpoint.SCHEDULED
629
625
  ].includes(k)) continue;
630
626
  if (!(taskId in nextTasks)) continue;
631
627
  nextTasks[taskId].writes.push([k, v]);
632
628
  }
633
629
  require_algo._applyWrites(checkpoint, channels, Object.values(nextTasks), checkpointer.getNextVersion.bind(checkpointer), this.triggerToNodes);
634
630
  }
635
- const nextConfig$1 = await checkpointer.put(checkpointConfig, require_base.createCheckpoint(checkpoint, channels, step), {
631
+ return require_index.patchCheckpointMap(await checkpointer.put(checkpointConfig, require_base.createCheckpoint(checkpoint, channels, step), {
636
632
  ...checkpointMetadata,
637
633
  source: "update",
638
634
  step: step + 1,
639
635
  parents: saved?.metadata?.parents ?? {}
640
- }, require_index.getNewChannelVersions(checkpointPreviousVersions, checkpoint.channel_versions));
641
- return require_index.patchCheckpointMap(nextConfig$1, saved ? saved.metadata : void 0);
636
+ }, require_index.getNewChannelVersions(checkpointPreviousVersions, checkpoint.channel_versions)), saved ? saved.metadata : void 0);
642
637
  }
643
638
  if (asNode === require_constants.COPY) {
644
639
  if (updates.length > 1) throw new require_errors.InvalidUpdateError(`Cannot copy checkpoint with multiple updates`);
@@ -692,7 +687,7 @@ var Pregel = class extends PartialRunnable {
692
687
  step: nextStep,
693
688
  parents: saved?.metadata?.parents ?? {}
694
689
  }, require_index.getNewChannelVersions(checkpointPreviousVersions, checkpoint.channel_versions));
695
- await checkpointer.putWrites(nextConfig$1, inputWrites, (0, __langchain_langgraph_checkpoint.uuid5)(require_constants.INPUT, checkpoint.id));
690
+ await checkpointer.putWrites(nextConfig$1, inputWrites, (0, _langchain_langgraph_checkpoint.uuid5)(require_constants.INPUT, checkpoint.id));
696
691
  return require_index.patchCheckpointMap(nextConfig$1, saved ? saved.metadata : void 0);
697
692
  }
698
693
  if (config.configurable?.checkpoint_id === void 0 && saved?.pendingWrites !== void 0 && saved.pendingWrites.length > 0) {
@@ -711,7 +706,7 @@ var Pregel = class extends PartialRunnable {
711
706
  if ([
712
707
  require_constants.ERROR,
713
708
  require_constants.INTERRUPT,
714
- __langchain_langgraph_checkpoint.SCHEDULED
709
+ _langchain_langgraph_checkpoint.SCHEDULED
715
710
  ].includes(k) || nextTasks[tid] === void 0) continue;
716
711
  nextTasks[tid].writes.push([k, v]);
717
712
  }
@@ -734,7 +729,7 @@ var Pregel = class extends PartialRunnable {
734
729
  return Object.values(seen).map((v) => {
735
730
  return [v, n];
736
731
  });
737
- }).flat().filter(([_, v]) => v !== require_constants.INTERRUPT).sort(([aNumber], [bNumber]) => (0, __langchain_langgraph_checkpoint.compareChannelVersions)(aNumber, bNumber));
732
+ }).flat().filter(([_, v]) => v !== require_constants.INTERRUPT).sort(([aNumber], [bNumber]) => (0, _langchain_langgraph_checkpoint.compareChannelVersions)(aNumber, bNumber));
738
733
  if (lastSeenByNode) {
739
734
  if (lastSeenByNode.length === 1) asNode$1 = lastSeenByNode[0][1];
740
735
  else if (lastSeenByNode[lastSeenByNode.length - 1][0] !== lastSeenByNode[lastSeenByNode.length - 2][0]) asNode$1 = lastSeenByNode[lastSeenByNode.length - 1][1];
@@ -762,14 +757,14 @@ var Pregel = class extends PartialRunnable {
762
757
  tasks.push({
763
758
  name: asNode$1,
764
759
  input: values$1,
765
- proc: writers.length > 1 ? __langchain_core_runnables.RunnableSequence.from(writers, { omitSequenceTags: true }) : writers[0],
760
+ proc: writers.length > 1 ? _langchain_core_runnables.RunnableSequence.from(writers, { omitSequenceTags: true }) : writers[0],
766
761
  writes: [],
767
762
  triggers: [require_constants.INTERRUPT],
768
- id: taskId ?? (0, __langchain_langgraph_checkpoint.uuid5)(require_constants.INTERRUPT, checkpoint.id),
763
+ id: taskId ?? (0, _langchain_langgraph_checkpoint.uuid5)(require_constants.INTERRUPT, checkpoint.id),
769
764
  writers: []
770
765
  });
771
766
  }
772
- for (const task of tasks) await task.proc.invoke(task.input, (0, __langchain_core_runnables.patchConfig)({
767
+ for (const task of tasks) await task.proc.invoke(task.input, (0, _langchain_core_runnables.patchConfig)({
773
768
  ...config,
774
769
  store: config?.store ?? this.store
775
770
  }, {
@@ -843,7 +838,7 @@ var Pregel = class extends PartialRunnable {
843
838
  * @internal
844
839
  */
845
840
  _defaults(config) {
846
- const { debug, streamMode, inputKeys, outputKeys, interruptAfter, interruptBefore,...rest } = config;
841
+ const { debug, streamMode, inputKeys, outputKeys, interruptAfter, interruptBefore, ...rest } = config;
847
842
  let streamModeSingle = true;
848
843
  const defaultDebug = debug !== void 0 ? debug : this.debug;
849
844
  let defaultOutputKeys = outputKeys;
@@ -963,7 +958,7 @@ var Pregel = class extends PartialRunnable {
963
958
  if (inputConfig.recursionLimit === void 0 || inputConfig.recursionLimit < 1) throw new Error(`Passed "recursionLimit" must be at least 1.`);
964
959
  if (this.checkpointer !== void 0 && this.checkpointer !== false && inputConfig.configurable === void 0) throw new Error(`Checkpointer requires one or more of the following "configurable" keys: "thread_id", "checkpoint_ns", "checkpoint_id"`);
965
960
  const validInput = await this._validateInput(input);
966
- const { runId,...restConfig } = inputConfig;
961
+ const { runId, ...restConfig } = inputConfig;
967
962
  const [debug, streamMode, , outputKeys, config, interruptBefore, interruptAfter, checkpointer, store, streamModeSingle, cache, durability] = this._defaults(restConfig);
968
963
  if (typeof config.context !== "undefined") config.context = await this._validateContext(config.context);
969
964
  else config.configurable = await this._validateContext(config.configurable);
@@ -994,8 +989,7 @@ var Pregel = class extends PartialRunnable {
994
989
  ]);
995
990
  };
996
991
  config.interrupt ??= this.userInterrupt ?? require_interrupt.interrupt;
997
- const callbackManager = await (0, __langchain_core_runnables.getCallbackManagerForConfig)(config);
998
- const runManager = await callbackManager?.handleChainStart(this.toJSON(), require_index._coerceToDict(input, "input"), runId, void 0, void 0, void 0, config?.runName ?? this.getName());
992
+ const runManager = await (await (0, _langchain_core_runnables.getCallbackManagerForConfig)(config))?.handleChainStart(this.toJSON(), require_index._coerceToDict(input, "input"), runId, void 0, void 0, void 0, config?.runName ?? this.getName());
999
993
  const channelSpecs = require_base.getOnlyChannels(this.channels);
1000
994
  let loop;
1001
995
  let loopError;
@@ -1153,8 +1147,7 @@ var Pregel = class extends PartialRunnable {
1153
1147
  ].join(" "), { lc_error_code: "GRAPH_RECURSION_LIMIT" });
1154
1148
  } catch (e) {
1155
1149
  tickError = e;
1156
- const suppress = await loop.finishAndHandleError(tickError);
1157
- if (!suppress) throw e;
1150
+ if (!await loop.finishAndHandleError(tickError)) throw e;
1158
1151
  } finally {
1159
1152
  if (tickError === void 0) await loop.finishAndHandleError();
1160
1153
  }