@librechat/agents 3.2.21 → 3.2.31

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 (398) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +3 -2
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/events.cjs.map +1 -1
  4. package/dist/cjs/graphs/Graph.cjs +200 -54
  5. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  6. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  7. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +13 -7
  8. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs.map +1 -1
  9. package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
  10. package/dist/cjs/hooks/types.cjs.map +1 -1
  11. package/dist/cjs/instrumentation.cjs +2 -2
  12. package/dist/cjs/instrumentation.cjs.map +1 -1
  13. package/dist/cjs/langfuse.cjs +17 -1
  14. package/dist/cjs/langfuse.cjs.map +1 -1
  15. package/dist/cjs/langfuseToolOutputTracing.cjs +2 -2
  16. package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
  17. package/dist/cjs/llm/anthropic/index.cjs +1 -1
  18. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  19. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  20. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +1 -1
  21. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
  22. package/dist/cjs/llm/bedrock/index.cjs +2 -2
  23. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  24. package/dist/cjs/llm/bedrock/toolCache.cjs +8 -5
  25. package/dist/cjs/llm/bedrock/toolCache.cjs.map +1 -1
  26. package/dist/cjs/llm/fake.cjs +16 -14
  27. package/dist/cjs/llm/fake.cjs.map +1 -1
  28. package/dist/cjs/llm/google/index.cjs +22 -0
  29. package/dist/cjs/llm/google/index.cjs.map +1 -1
  30. package/dist/cjs/llm/google/utils/common.cjs +88 -27
  31. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  32. package/dist/cjs/llm/init.cjs +2 -2
  33. package/dist/cjs/llm/invoke.cjs +108 -11
  34. package/dist/cjs/llm/invoke.cjs.map +1 -1
  35. package/dist/cjs/llm/openai/index.cjs +1 -1
  36. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  37. package/dist/cjs/llm/openai/utils/index.cjs +1 -1
  38. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  39. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  40. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  41. package/dist/cjs/main.cjs +1 -0
  42. package/dist/cjs/main.cjs.map +1 -1
  43. package/dist/cjs/messages/cache.cjs +8 -7
  44. package/dist/cjs/messages/cache.cjs.map +1 -1
  45. package/dist/cjs/messages/content.cjs.map +1 -1
  46. package/dist/cjs/messages/contextPruning.cjs.map +1 -1
  47. package/dist/cjs/messages/format.cjs +124 -17
  48. package/dist/cjs/messages/format.cjs.map +1 -1
  49. package/dist/cjs/messages/prune.cjs.map +1 -1
  50. package/dist/cjs/messages/reducer.cjs +1 -1
  51. package/dist/cjs/messages/reducer.cjs.map +1 -1
  52. package/dist/cjs/messages/tools.cjs +1 -1
  53. package/dist/cjs/messages/tools.cjs.map +1 -1
  54. package/dist/cjs/openai/index.cjs.map +1 -1
  55. package/dist/cjs/responses/index.cjs.map +1 -1
  56. package/dist/cjs/run.cjs +41 -20
  57. package/dist/cjs/run.cjs.map +1 -1
  58. package/dist/cjs/session/AgentSession.cjs +4 -4
  59. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  60. package/dist/cjs/session/JsonlSessionStore.cjs +2 -2
  61. package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
  62. package/dist/cjs/session/handlers.cjs +2 -2
  63. package/dist/cjs/session/handlers.cjs.map +1 -1
  64. package/dist/cjs/stream.cjs +248 -25
  65. package/dist/cjs/stream.cjs.map +1 -1
  66. package/dist/cjs/summarization/node.cjs.map +1 -1
  67. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +1 -1
  68. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
  69. package/dist/cjs/tools/Calculator.cjs +1 -1
  70. package/dist/cjs/tools/Calculator.cjs.map +1 -1
  71. package/dist/cjs/tools/CodeExecutor.cjs +1 -1
  72. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  73. package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
  74. package/dist/cjs/tools/ToolNode.cjs +37 -18
  75. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  76. package/dist/cjs/tools/ToolSearch.cjs +1 -1
  77. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  78. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +7 -4
  79. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -1
  80. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +4 -4
  81. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -1
  82. package/dist/cjs/tools/handlers.cjs +2 -1
  83. package/dist/cjs/tools/handlers.cjs.map +1 -1
  84. package/dist/cjs/tools/local/CompileCheckTool.cjs.map +1 -1
  85. package/dist/cjs/tools/local/FileCheckpointer.cjs +2 -1
  86. package/dist/cjs/tools/local/FileCheckpointer.cjs.map +1 -1
  87. package/dist/cjs/tools/local/LocalCodingTools.cjs +45 -19
  88. package/dist/cjs/tools/local/LocalCodingTools.cjs.map +1 -1
  89. package/dist/cjs/tools/local/LocalExecutionEngine.cjs +3 -3
  90. package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
  91. package/dist/cjs/tools/local/LocalExecutionTools.cjs +2 -2
  92. package/dist/cjs/tools/local/LocalExecutionTools.cjs.map +1 -1
  93. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +4 -3
  94. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs.map +1 -1
  95. package/dist/cjs/tools/local/attachments.cjs +0 -5
  96. package/dist/cjs/tools/local/attachments.cjs.map +1 -1
  97. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +4 -4
  98. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
  99. package/dist/cjs/tools/search/firecrawl.cjs +1 -1
  100. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  101. package/dist/cjs/tools/search/rerankers.cjs +7 -3
  102. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  103. package/dist/cjs/tools/search/tavily-search.cjs +1 -1
  104. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
  105. package/dist/cjs/tools/search/utils.cjs +76 -8
  106. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  107. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +1 -1
  108. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  109. package/dist/cjs/utils/handlers.cjs +1 -1
  110. package/dist/cjs/utils/handlers.cjs.map +1 -1
  111. package/dist/cjs/utils/run.cjs +1 -1
  112. package/dist/cjs/utils/run.cjs.map +1 -1
  113. package/dist/esm/agents/AgentContext.mjs +3 -2
  114. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  115. package/dist/esm/events.mjs.map +1 -1
  116. package/dist/esm/graphs/Graph.mjs +200 -54
  117. package/dist/esm/graphs/Graph.mjs.map +1 -1
  118. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  119. package/dist/esm/hooks/createWorkspacePolicyHook.mjs +13 -7
  120. package/dist/esm/hooks/createWorkspacePolicyHook.mjs.map +1 -1
  121. package/dist/esm/hooks/executeHooks.mjs.map +1 -1
  122. package/dist/esm/hooks/types.mjs.map +1 -1
  123. package/dist/esm/instrumentation.mjs +2 -2
  124. package/dist/esm/instrumentation.mjs.map +1 -1
  125. package/dist/esm/langfuse.mjs +17 -2
  126. package/dist/esm/langfuse.mjs.map +1 -1
  127. package/dist/esm/langfuseToolOutputTracing.mjs +2 -2
  128. package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
  129. package/dist/esm/llm/anthropic/index.mjs +1 -1
  130. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  131. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  132. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +1 -1
  133. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
  134. package/dist/esm/llm/bedrock/index.mjs +2 -2
  135. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  136. package/dist/esm/llm/bedrock/toolCache.mjs +8 -5
  137. package/dist/esm/llm/bedrock/toolCache.mjs.map +1 -1
  138. package/dist/esm/llm/fake.mjs +16 -14
  139. package/dist/esm/llm/fake.mjs.map +1 -1
  140. package/dist/esm/llm/google/index.mjs +23 -1
  141. package/dist/esm/llm/google/index.mjs.map +1 -1
  142. package/dist/esm/llm/google/utils/common.mjs +88 -27
  143. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  144. package/dist/esm/llm/init.mjs +2 -2
  145. package/dist/esm/llm/invoke.mjs +104 -7
  146. package/dist/esm/llm/invoke.mjs.map +1 -1
  147. package/dist/esm/llm/openai/index.mjs +1 -1
  148. package/dist/esm/llm/openai/index.mjs.map +1 -1
  149. package/dist/esm/llm/openai/utils/index.mjs +1 -1
  150. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  151. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  152. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  153. package/dist/esm/main.mjs +1 -1
  154. package/dist/esm/messages/cache.mjs +8 -7
  155. package/dist/esm/messages/cache.mjs.map +1 -1
  156. package/dist/esm/messages/content.mjs.map +1 -1
  157. package/dist/esm/messages/contextPruning.mjs.map +1 -1
  158. package/dist/esm/messages/format.mjs +124 -18
  159. package/dist/esm/messages/format.mjs.map +1 -1
  160. package/dist/esm/messages/prune.mjs.map +1 -1
  161. package/dist/esm/messages/reducer.mjs +1 -1
  162. package/dist/esm/messages/reducer.mjs.map +1 -1
  163. package/dist/esm/messages/tools.mjs +1 -1
  164. package/dist/esm/messages/tools.mjs.map +1 -1
  165. package/dist/esm/openai/index.mjs.map +1 -1
  166. package/dist/esm/responses/index.mjs.map +1 -1
  167. package/dist/esm/run.mjs +41 -20
  168. package/dist/esm/run.mjs.map +1 -1
  169. package/dist/esm/session/AgentSession.mjs +4 -4
  170. package/dist/esm/session/AgentSession.mjs.map +1 -1
  171. package/dist/esm/session/JsonlSessionStore.mjs +2 -2
  172. package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
  173. package/dist/esm/session/handlers.mjs +2 -2
  174. package/dist/esm/session/handlers.mjs.map +1 -1
  175. package/dist/esm/stream.mjs +248 -25
  176. package/dist/esm/stream.mjs.map +1 -1
  177. package/dist/esm/summarization/node.mjs.map +1 -1
  178. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +1 -1
  179. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
  180. package/dist/esm/tools/Calculator.mjs +1 -1
  181. package/dist/esm/tools/Calculator.mjs.map +1 -1
  182. package/dist/esm/tools/CodeExecutor.mjs +1 -1
  183. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  184. package/dist/esm/tools/SubagentTool.mjs.map +1 -1
  185. package/dist/esm/tools/ToolNode.mjs +37 -18
  186. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  187. package/dist/esm/tools/ToolSearch.mjs +1 -1
  188. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  189. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +7 -4
  190. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -1
  191. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +4 -4
  192. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -1
  193. package/dist/esm/tools/handlers.mjs +2 -1
  194. package/dist/esm/tools/handlers.mjs.map +1 -1
  195. package/dist/esm/tools/local/CompileCheckTool.mjs.map +1 -1
  196. package/dist/esm/tools/local/FileCheckpointer.mjs +2 -1
  197. package/dist/esm/tools/local/FileCheckpointer.mjs.map +1 -1
  198. package/dist/esm/tools/local/LocalCodingTools.mjs +45 -19
  199. package/dist/esm/tools/local/LocalCodingTools.mjs.map +1 -1
  200. package/dist/esm/tools/local/LocalExecutionEngine.mjs +3 -3
  201. package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
  202. package/dist/esm/tools/local/LocalExecutionTools.mjs +2 -2
  203. package/dist/esm/tools/local/LocalExecutionTools.mjs.map +1 -1
  204. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +4 -3
  205. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs.map +1 -1
  206. package/dist/esm/tools/local/attachments.mjs +0 -5
  207. package/dist/esm/tools/local/attachments.mjs.map +1 -1
  208. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +4 -4
  209. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
  210. package/dist/esm/tools/search/firecrawl.mjs +1 -1
  211. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  212. package/dist/esm/tools/search/rerankers.mjs +8 -4
  213. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  214. package/dist/esm/tools/search/tavily-search.mjs +1 -1
  215. package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
  216. package/dist/esm/tools/search/utils.mjs +76 -9
  217. package/dist/esm/tools/search/utils.mjs.map +1 -1
  218. package/dist/esm/tools/subagent/SubagentExecutor.mjs +1 -1
  219. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  220. package/dist/esm/utils/handlers.mjs +1 -1
  221. package/dist/esm/utils/handlers.mjs.map +1 -1
  222. package/dist/esm/utils/run.mjs +1 -1
  223. package/dist/esm/utils/run.mjs.map +1 -1
  224. package/dist/types/agents/__tests__/promptCacheLiveHelpers.d.ts +1 -1
  225. package/dist/types/events.d.ts +1 -1
  226. package/dist/types/graphs/Graph.d.ts +7 -1
  227. package/dist/types/hooks/executeHooks.d.ts +1 -1
  228. package/dist/types/hooks/types.d.ts +5 -0
  229. package/dist/types/langfuse.d.ts +4 -0
  230. package/dist/types/llm/anthropic/utils/message_inputs.d.ts +1 -1
  231. package/dist/types/llm/anthropic/utils/message_outputs.d.ts +1 -1
  232. package/dist/types/llm/anthropic/utils/output_parsers.d.ts +2 -2
  233. package/dist/types/llm/bedrock/index.d.ts +2 -2
  234. package/dist/types/llm/fake.d.ts +3 -3
  235. package/dist/types/llm/google/index.d.ts +1 -0
  236. package/dist/types/llm/google/types.d.ts +1 -1
  237. package/dist/types/llm/google/utils/common.d.ts +2 -2
  238. package/dist/types/llm/google/utils/tools.d.ts +1 -1
  239. package/dist/types/llm/google/utils/zod_to_genai_parameters.d.ts +1 -1
  240. package/dist/types/llm/openai/index.d.ts +2 -2
  241. package/dist/types/llm/openai/utils/index.d.ts +1 -1
  242. package/dist/types/llm/openrouter/index.d.ts +4 -4
  243. package/dist/types/messages/contextPruning.d.ts +1 -1
  244. package/dist/types/messages/format.d.ts +9 -4
  245. package/dist/types/messages/prune.d.ts +1 -1
  246. package/dist/types/session/JsonlSessionStore.d.ts +1 -1
  247. package/dist/types/session/handlers.d.ts +1 -1
  248. package/dist/types/session/types.d.ts +1 -1
  249. package/dist/types/summarization/node.d.ts +1 -1
  250. package/dist/types/tools/SubagentTool.d.ts +2 -2
  251. package/dist/types/tools/ToolNode.d.ts +9 -2
  252. package/dist/types/tools/cloudflare/CloudflareSandboxExecutionEngine.d.ts +1 -1
  253. package/dist/types/tools/search/types.d.ts +1 -1
  254. package/dist/types/tools/search/utils.d.ts +11 -0
  255. package/dist/types/types/graph.d.ts +4 -4
  256. package/dist/types/types/llm.d.ts +4 -3
  257. package/dist/types/types/messages.d.ts +1 -1
  258. package/dist/types/types/run.d.ts +6 -6
  259. package/dist/types/types/stream.d.ts +2 -2
  260. package/dist/types/types/tools.d.ts +5 -1
  261. package/dist/types/utils/handlers.d.ts +2 -2
  262. package/dist/types/utils/run.d.ts +1 -1
  263. package/package.json +6 -3
  264. package/src/__tests__/stream.eagerEventExecution.test.ts +543 -6
  265. package/src/agents/AgentContext.ts +2 -2
  266. package/src/agents/__tests__/AgentContext.test.ts +3 -3
  267. package/src/agents/__tests__/promptCacheLiveHelpers.ts +1 -1
  268. package/src/events.ts +1 -1
  269. package/src/graphs/Graph.ts +329 -72
  270. package/src/graphs/MultiAgentGraph.ts +1 -1
  271. package/src/graphs/__tests__/Graph.reasoning.test.ts +919 -6
  272. package/src/graphs/__tests__/MultiAgentGraph.test.ts +1 -1
  273. package/src/graphs/__tests__/composition.smoke.test.ts +1 -1
  274. package/src/hooks/__tests__/HookRegistry.test.ts +1 -1
  275. package/src/hooks/__tests__/compactHooks.test.ts +8 -8
  276. package/src/hooks/__tests__/createWorkspacePolicyHook.test.ts +34 -22
  277. package/src/hooks/__tests__/executeHooks.test.ts +3 -3
  278. package/src/hooks/__tests__/integration.test.ts +3 -3
  279. package/src/hooks/__tests__/toolHooks.test.ts +10 -10
  280. package/src/hooks/createWorkspacePolicyHook.ts +17 -14
  281. package/src/hooks/executeHooks.ts +1 -1
  282. package/src/hooks/types.ts +5 -0
  283. package/src/instrumentation.ts +11 -11
  284. package/src/langfuse.ts +35 -1
  285. package/src/langfuseToolOutputTracing.ts +2 -2
  286. package/src/llm/anthropic/index.ts +1 -1
  287. package/src/llm/anthropic/utils/message_inputs.ts +1 -1
  288. package/src/llm/anthropic/utils/message_outputs.ts +3 -5
  289. package/src/llm/anthropic/utils/output_parsers.ts +5 -5
  290. package/src/llm/bedrock/index.ts +4 -4
  291. package/src/llm/bedrock/toolCache.test.ts +48 -9
  292. package/src/llm/bedrock/toolCache.ts +11 -6
  293. package/src/llm/fake.ts +30 -25
  294. package/src/llm/google/index.ts +43 -1
  295. package/src/llm/google/llm.spec.ts +173 -1
  296. package/src/llm/google/types.ts +1 -1
  297. package/src/llm/google/utils/common.ts +154 -45
  298. package/src/llm/google/utils/tools.ts +8 -8
  299. package/src/llm/google/utils/zod_to_genai_parameters.ts +4 -4
  300. package/src/llm/invoke.test.ts +3 -3
  301. package/src/llm/invoke.ts +170 -10
  302. package/src/llm/openai/index.ts +4 -4
  303. package/src/llm/openai/utils/index.ts +14 -14
  304. package/src/llm/openrouter/index.ts +4 -4
  305. package/src/llm/openrouter/reasoning.test.ts +2 -2
  306. package/src/llm/vertexai/fixThoughtSignatures.test.ts +1 -1
  307. package/src/llm/vertexai/index.ts +1 -1
  308. package/src/messages/cache.test.ts +22 -0
  309. package/src/messages/cache.ts +25 -12
  310. package/src/messages/content.ts +1 -1
  311. package/src/messages/contextPruning.ts +1 -1
  312. package/src/messages/format.ts +227 -43
  313. package/src/messages/formatAgentMessages.skills.test.ts +105 -26
  314. package/src/messages/formatAgentMessages.test.ts +841 -10
  315. package/src/messages/labelContentByAgent.test.ts +2 -2
  316. package/src/messages/prune.ts +1 -1
  317. package/src/messages/reducer.ts +1 -1
  318. package/src/messages/tools.ts +1 -1
  319. package/src/openai/__tests__/openai.test.ts +2 -2
  320. package/src/openai/index.ts +1 -1
  321. package/src/responses/__tests__/responses.test.ts +2 -2
  322. package/src/responses/index.ts +1 -1
  323. package/src/run.ts +68 -41
  324. package/src/session/AgentSession.ts +6 -6
  325. package/src/session/JsonlSessionStore.ts +3 -3
  326. package/src/session/__tests__/JsonlSessionStore.test.ts +5 -5
  327. package/src/session/__tests__/handlers.test.ts +2 -2
  328. package/src/session/handlers.ts +5 -5
  329. package/src/session/types.ts +1 -1
  330. package/src/specs/agent-handoffs.test.ts +1 -1
  331. package/src/specs/langfuse-callbacks.test.ts +2 -2
  332. package/src/specs/langfuse-metadata.test.ts +39 -0
  333. package/src/specs/langfuse-tool-output-tracing.test.ts +1 -1
  334. package/src/specs/multi-agent-summarization.test.ts +4 -4
  335. package/src/specs/subagent.test.ts +3 -3
  336. package/src/specs/summarization-unit.test.ts +1 -1
  337. package/src/specs/thinking-handoff.test.ts +1 -1
  338. package/src/splitStream.test.ts +48 -0
  339. package/src/stream.test.ts +53 -3
  340. package/src/stream.ts +450 -39
  341. package/src/summarization/__tests__/aggregator.test.ts +2 -2
  342. package/src/summarization/__tests__/node.test.ts +2 -2
  343. package/src/summarization/node.ts +1 -1
  344. package/src/tools/BashProgrammaticToolCalling.ts +5 -5
  345. package/src/tools/Calculator.ts +1 -1
  346. package/src/tools/CodeExecutor.ts +2 -4
  347. package/src/tools/SubagentTool.ts +2 -2
  348. package/src/tools/ToolNode.ts +37 -16
  349. package/src/tools/ToolSearch.ts +1 -1
  350. package/src/tools/__tests__/CloudflareSandboxExecution.test.ts +4 -4
  351. package/src/tools/__tests__/CodeApiAuthHeaders.test.ts +12 -12
  352. package/src/tools/__tests__/LocalExecutionTools.test.ts +125 -93
  353. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +29 -5
  354. package/src/tools/__tests__/ReadFile.test.ts +1 -1
  355. package/src/tools/__tests__/SkillTool.test.ts +4 -4
  356. package/src/tools/__tests__/SubagentExecutor.test.ts +17 -13
  357. package/src/tools/__tests__/SubagentTool.test.ts +2 -2
  358. package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +1 -1
  359. package/src/tools/__tests__/ToolNode.outputReferences.test.ts +2 -5
  360. package/src/tools/__tests__/ToolNode.session.test.ts +1 -1
  361. package/src/tools/__tests__/ToolSearch.test.ts +1 -1
  362. package/src/tools/__tests__/annotateMessagesForLLM.test.ts +1 -1
  363. package/src/tools/__tests__/directToolHITLResumeScope.test.ts +35 -32
  364. package/src/tools/__tests__/directToolHooks.test.ts +41 -0
  365. package/src/tools/__tests__/handlers.test.ts +2 -2
  366. package/src/tools/__tests__/hitl.test.ts +11 -11
  367. package/src/tools/__tests__/localToolNames.test.ts +8 -6
  368. package/src/tools/__tests__/skillCatalog.test.ts +1 -1
  369. package/src/tools/__tests__/subagentHooks.test.ts +20 -10
  370. package/src/tools/__tests__/workspaceSeam.test.ts +20 -7
  371. package/src/tools/cloudflare/CloudflareSandboxExecutionEngine.ts +9 -6
  372. package/src/tools/cloudflare/CloudflareSandboxTools.ts +19 -19
  373. package/src/tools/handlers.ts +5 -5
  374. package/src/tools/local/CompileCheckTool.ts +4 -7
  375. package/src/tools/local/FileCheckpointer.ts +6 -5
  376. package/src/tools/local/LocalCodingTools.ts +100 -45
  377. package/src/tools/local/LocalExecutionEngine.ts +5 -5
  378. package/src/tools/local/LocalExecutionTools.ts +9 -9
  379. package/src/tools/local/LocalProgrammaticToolCalling.ts +5 -4
  380. package/src/tools/local/attachments.ts +0 -6
  381. package/src/tools/local/resolveLocalExecutionTools.ts +15 -15
  382. package/src/tools/search/firecrawl.ts +1 -1
  383. package/src/tools/search/jina-reranker.test.ts +148 -37
  384. package/src/tools/search/rerankers.ts +14 -4
  385. package/src/tools/search/tavily-search.ts +2 -2
  386. package/src/tools/search/types.ts +1 -1
  387. package/src/tools/search/utils.ts +99 -9
  388. package/src/tools/subagent/SubagentExecutor.ts +12 -6
  389. package/src/types/graph.ts +12 -12
  390. package/src/types/llm.ts +7 -6
  391. package/src/types/messages.ts +1 -1
  392. package/src/types/run.ts +7 -7
  393. package/src/types/stream.ts +2 -2
  394. package/src/types/tools.ts +5 -1
  395. package/src/utils/handlers.ts +2 -2
  396. package/src/utils/llmConfig.ts +1 -1
  397. package/src/utils/logging.ts +20 -10
  398. package/src/utils/run.ts +2 -2
@@ -13,51 +13,50 @@ var anthropicToolCache = require('../messages/anthropicToolCache.cjs');
13
13
  var content = require('../messages/content.cjs');
14
14
  var tools = require('../messages/tools.cjs');
15
15
  var reducer = require('../messages/reducer.cjs');
16
- var _enum = require('../common/enum.cjs');
16
+ var langfuseToolOutputTracing = require('../langfuseToolOutputTracing.cjs');
17
+ var langfuse = require('../langfuse.cjs');
17
18
  var graph = require('../utils/graph.cjs');
18
19
  var llm = require('../utils/llm.cjs');
19
20
  require('../stream.cjs');
21
+ var _enum = require('../common/enum.cjs');
20
22
  var run = require('../utils/run.cjs');
21
23
  require('ai-tokenizer');
22
24
  require('zod-to-json-schema');
23
- var SubagentExecutor = require('../tools/subagent/SubagentExecutor.cjs');
24
- var SubagentTool = require('../tools/SubagentTool.cjs');
25
+ var callbacks = require('../utils/callbacks.cjs');
26
+ var toolCache = require('../llm/openrouter/toolCache.cjs');
25
27
  var ToolNode = require('../tools/ToolNode.cjs');
28
+ var LocalCodingTools = require('../tools/local/LocalCodingTools.cjs');
29
+ var SubagentExecutor = require('../tools/subagent/SubagentExecutor.cjs');
26
30
  var toolOutputReferences = require('../tools/toolOutputReferences.cjs');
31
+ var toolCache$1 = require('../llm/bedrock/toolCache.cjs');
27
32
  var events = require('../utils/events.cjs');
33
+ require('path');
34
+ require('../tools/cloudflare/CloudflareProgrammaticToolCalling.cjs');
35
+ require('stream');
36
+ require('events');
37
+ require('../tools/local/LocalExecutionEngine.cjs');
38
+ var CloudflareSandboxTools = require('../tools/cloudflare/CloudflareSandboxTools.cjs');
28
39
  var invoke = require('../llm/invoke.cjs');
40
+ var SubagentTool = require('../tools/SubagentTool.cjs');
41
+ var instrumentation = require('../instrumentation.cjs');
29
42
  var index = require('../summarization/index.cjs');
30
- var node = require('../summarization/node.cjs');
31
- var callbacks = require('../utils/callbacks.cjs');
32
- var schema = require('../tools/schema.cjs');
33
- var AgentContext = require('../agents/AgentContext.cjs');
34
- var fake = require('../llm/fake.cjs');
35
- var handlers = require('../tools/handlers.cjs');
36
43
  require('../tools/local/CompileCheckTool.cjs');
37
- require('path');
38
44
  require('fs/promises');
39
- var LocalCodingTools = require('../tools/local/LocalCodingTools.cjs');
40
- require('../tools/local/LocalExecutionEngine.cjs');
41
- require('../tools/CodeExecutor.cjs');
42
45
  require('../tools/BashExecutor.cjs');
43
- require('crypto');
46
+ require('../tools/CodeExecutor.cjs');
44
47
  require('http');
45
- require('../hooks/createWorkspacePolicyHook.cjs');
48
+ require('crypto');
46
49
  require('../tools/ProgrammaticToolCalling.cjs');
47
50
  require('../tools/BashProgrammaticToolCalling.cjs');
51
+ require('../hooks/createWorkspacePolicyHook.cjs');
48
52
  var resolveLocalExecutionTools = require('../tools/local/resolveLocalExecutionTools.cjs');
49
- require('../tools/local/attachments.cjs');
50
- require('../tools/cloudflare/CloudflareProgrammaticToolCalling.cjs');
51
- require('events');
52
- require('stream');
53
- var CloudflareSandboxTools = require('../tools/cloudflare/CloudflareSandboxTools.cjs');
53
+ var node = require('../summarization/node.cjs');
54
+ var schema = require('../tools/schema.cjs');
55
+ var AgentContext = require('../agents/AgentContext.cjs');
56
+ var fake = require('../llm/fake.cjs');
57
+ var handlers = require('../tools/handlers.cjs');
54
58
  var request = require('../llm/request.cjs');
55
59
  var init = require('../llm/init.cjs');
56
- var langfuse = require('../langfuse.cjs');
57
- var instrumentation = require('../instrumentation.cjs');
58
- var langfuseToolOutputTracing = require('../langfuseToolOutputTracing.cjs');
59
- var toolCache = require('../llm/openrouter/toolCache.cjs');
60
- var toolCache$1 = require('../llm/bedrock/toolCache.cjs');
61
60
 
62
61
  /* eslint-disable no-console */
63
62
  const { AGENT, TOOLS, SUMMARIZE } = _enum.GraphNodeKeys;
@@ -106,7 +105,23 @@ function getResponseReasoningContent({ responseMessage, reasoningKey, }) {
106
105
  }
107
106
  return getReasoningDetailsText(additionalKwargs.reasoning_details);
108
107
  }
109
- function getTextMessageDeltaContent(content) {
108
+ function isTextMessageContentPart(contentPart) {
109
+ return (typeof contentPart === 'object' &&
110
+ 'type' in contentPart &&
111
+ typeof contentPart.type === 'string' &&
112
+ contentPart.type.startsWith('text'));
113
+ }
114
+ function isGoogleServerSideToolMessageContentPart(contentPart) {
115
+ return (typeof contentPart === 'object' &&
116
+ 'type' in contentPart &&
117
+ (contentPart.type === 'toolCall' || contentPart.type === 'toolResponse'));
118
+ }
119
+ function hasGoogleServerSideToolDeltaContent(provider, content) {
120
+ return (llm.isGoogleLike(provider) &&
121
+ Array.isArray(content) &&
122
+ content.some((contentPart) => isGoogleServerSideToolMessageContentPart(contentPart)));
123
+ }
124
+ function getMessageDeltaContent(provider, content) {
110
125
  if (content == null) {
111
126
  return undefined;
112
127
  }
@@ -118,24 +133,91 @@ function getTextMessageDeltaContent(content) {
118
133
  if (content.length === 0) {
119
134
  return undefined;
120
135
  }
121
- if (!content.every((contentPart) => typeof contentPart === 'object' &&
122
- 'type' in contentPart &&
123
- typeof contentPart.type === 'string' &&
124
- contentPart.type.startsWith('text'))) {
136
+ const hasGoogleServerSideToolPart = llm.isGoogleLike(provider) &&
137
+ content.some((contentPart) => isGoogleServerSideToolMessageContentPart(contentPart));
138
+ if (content.every((contentPart) => isTextMessageContentPart(contentPart))) {
139
+ return content;
140
+ }
141
+ if (!hasGoogleServerSideToolPart) {
125
142
  return undefined;
126
143
  }
127
- return content;
144
+ const messageContent = content.filter((contentPart) => isTextMessageContentPart(contentPart) ||
145
+ isGoogleServerSideToolMessageContentPart(contentPart));
146
+ return messageContent.length > 0
147
+ ? messageContent
148
+ : undefined;
128
149
  }
129
- async function dispatchTextMessageContent({ graph, stepKey, content, metadata, }) {
130
- const messageId = ids.getMessageId(stepKey, graph) ?? '';
131
- if (!messageId) {
150
+ function hasTextDeltaContent(content) {
151
+ if (content == null) {
132
152
  return false;
133
153
  }
154
+ return content.some((contentPart) => {
155
+ if (contentPart.type?.startsWith(_enum.ContentTypes.TEXT) !== true) {
156
+ return false;
157
+ }
158
+ const text = contentPart.text;
159
+ return typeof text === 'string' && text !== '';
160
+ });
161
+ }
162
+ function hasReasoningDeltaContent(content) {
163
+ if (content == null) {
164
+ return false;
165
+ }
166
+ return content.some((contentPart) => contentPart.type === _enum.ContentTypes.THINK && contentPart.think !== '');
167
+ }
168
+ function getCurrentStepIds({ graph, metadata, }) {
169
+ const baseStepKey = graph.getStepBaseKey(metadata);
170
+ const currentStepIds = [];
171
+ for (const [stepKey, stepIds] of graph.stepKeyIds) {
172
+ if (stepKey !== baseStepKey && !stepKey.startsWith(`${baseStepKey}_`)) {
173
+ continue;
174
+ }
175
+ currentStepIds.push(...stepIds);
176
+ }
177
+ return currentStepIds;
178
+ }
179
+ function hasCurrentTextDeltaStep({ graph, metadata, }) {
180
+ return getCurrentStepIds({ graph, metadata }).some((stepId) => graph.messageStepHasTextDeltas.has(stepId));
181
+ }
182
+ function hasCurrentReasoningDeltaStep({ graph, metadata, }) {
183
+ return getCurrentStepIds({ graph, metadata }).some((stepId) => graph.reasoningStepHasDeltas.has(stepId));
184
+ }
185
+ function clearCurrentDeltaStepMarkers({ graph, metadata, }) {
186
+ for (const stepId of getCurrentStepIds({ graph, metadata })) {
187
+ graph.messageStepHasTextDeltas.delete(stepId);
188
+ graph.reasoningStepHasDeltas.delete(stepId);
189
+ }
190
+ }
191
+ async function dispatchMessageCreationStep({ graph, stepKey, messageId, metadata, }) {
134
192
  await graph.dispatchRunStep(stepKey, {
135
193
  type: _enum.StepTypes.MESSAGE_CREATION,
136
194
  message_creation: { message_id: messageId },
137
195
  }, metadata);
138
- const stepId = graph.getStepIdByKey(stepKey);
196
+ return graph.getStepIdByKey(stepKey);
197
+ }
198
+ async function dispatchTextMessageContent({ graph, stepKey, provider, content, metadata, }) {
199
+ const messageId = ids.getMessageId(stepKey, graph) ?? '';
200
+ if (!messageId) {
201
+ return false;
202
+ }
203
+ if (hasGoogleServerSideToolDeltaContent(provider, content)) {
204
+ for (const contentPart of content) {
205
+ const stepId = await dispatchMessageCreationStep({
206
+ graph,
207
+ stepKey,
208
+ messageId,
209
+ metadata,
210
+ });
211
+ await graph.dispatchMessageDelta(stepId, { content: [contentPart] }, metadata);
212
+ }
213
+ return true;
214
+ }
215
+ const stepId = await dispatchMessageCreationStep({
216
+ graph,
217
+ stepKey,
218
+ messageId,
219
+ metadata,
220
+ });
139
221
  await graph.dispatchMessageDelta(stepId, { content }, metadata);
140
222
  return true;
141
223
  }
@@ -172,7 +254,18 @@ function markPostReasoningContent(agentContext) {
172
254
  agentContext.tokenTypeSwitch = 'content';
173
255
  agentContext.reasoningTransitionCount++;
174
256
  }
257
+ function getDispatchableFinalReasoningContent({ agentContext, responseReasoningContent, hasStreamedTextDeltaStep, hasStreamedReasoningDeltaStep, }) {
258
+ if (responseReasoningContent == null || hasStreamedReasoningDeltaStep) {
259
+ return undefined;
260
+ }
261
+ if (agentContext.provider === _enum.Providers.OPENROUTER &&
262
+ hasStreamedTextDeltaStep) {
263
+ return undefined;
264
+ }
265
+ return responseReasoningContent;
266
+ }
175
267
  class Graph {
268
+ messageStepHasTextDeltas = new Set();
176
269
  messageStepHasToolCalls = new Map();
177
270
  messageIdsByStepKey = new Map();
178
271
  prelimMessageIdsByStepKey = new Map();
@@ -187,6 +280,7 @@ class Graph {
187
280
  * the same step are scoped to the active custom event dispatch.
188
281
  */
189
282
  handlerDispatchedStepIds = new Set();
283
+ reasoningStepHasDeltas = new Set();
190
284
  handlerDispatchedEventCounts = new Map();
191
285
  signal;
192
286
  /** Set of invoked tool call IDs from non-message run steps completed mid-run, if any */
@@ -259,6 +353,8 @@ class Graph {
259
353
  this.stepKeyIds = new Map();
260
354
  this.toolCallStepIds.clear();
261
355
  this.messageIdsByStepKey = new Map();
356
+ this.messageStepHasTextDeltas = new Set();
357
+ this.reasoningStepHasDeltas = new Set();
262
358
  this.messageStepHasToolCalls = new Map();
263
359
  this.prelimMessageIdsByStepKey = new Map();
264
360
  this.invokedToolIds = undefined;
@@ -479,6 +575,8 @@ class StandardGraph extends Graph {
479
575
  this.handlerDispatchedEventCounts = graph.resetIfNotEmpty(this.handlerDispatchedEventCounts, new Map());
480
576
  this.messageIdsByStepKey = graph.resetIfNotEmpty(this.messageIdsByStepKey, new Map());
481
577
  this.messageStepHasToolCalls = graph.resetIfNotEmpty(this.messageStepHasToolCalls, new Map());
578
+ this.messageStepHasTextDeltas = graph.resetIfNotEmpty(this.messageStepHasTextDeltas, new Set());
579
+ this.reasoningStepHasDeltas = graph.resetIfNotEmpty(this.reasoningStepHasDeltas, new Set());
482
580
  this.prelimMessageIdsByStepKey = graph.resetIfNotEmpty(this.prelimMessageIdsByStepKey, new Map());
483
581
  this.invokedToolIds = graph.resetIfNotEmpty(this.invokedToolIds, undefined);
484
582
  for (const context of this.agentContexts.values()) {
@@ -526,6 +624,15 @@ class StandardGraph extends Graph {
526
624
  }
527
625
  return agentContext;
528
626
  }
627
+ getStepBaseKey(metadata) {
628
+ if (!metadata)
629
+ return '';
630
+ const keyList = this.getInvocationKeyList(metadata);
631
+ if (this.checkKeyList(keyList)) {
632
+ throw new Error('Missing metadata');
633
+ }
634
+ return graph.joinKeys(keyList);
635
+ }
529
636
  getStepKey(metadata) {
530
637
  if (!metadata)
531
638
  return '';
@@ -564,6 +671,25 @@ class StandardGraph extends Graph {
564
671
  getKeyList(metadata) {
565
672
  if (!metadata)
566
673
  return [];
674
+ const keyList = this.getInvocationKeyList(metadata);
675
+ const agentContext = this.getAgentContext(metadata);
676
+ if (agentContext.currentTokenType === _enum.ContentTypes.THINK ||
677
+ agentContext.currentTokenType === 'think_and_text') {
678
+ keyList.push('reasoning');
679
+ }
680
+ else if (agentContext.tokenTypeSwitch === 'content') {
681
+ keyList.push(`post-reasoning-${agentContext.reasoningTransitionCount}`);
682
+ }
683
+ return keyList;
684
+ }
685
+ getInvocationKeyList(metadata) {
686
+ const keyList = this.getBaseKeyList(metadata);
687
+ if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {
688
+ keyList.push(this.invokedToolIds.size + '');
689
+ }
690
+ return keyList;
691
+ }
692
+ getBaseKeyList(metadata) {
567
693
  const configurable = this.config?.configurable;
568
694
  const runId = metadata.run_id ??
569
695
  configurable?.run_id ??
@@ -581,17 +707,6 @@ class StandardGraph extends Graph {
581
707
  metadata.langgraph_step,
582
708
  checkpointNs,
583
709
  ];
584
- const agentContext = this.getAgentContext(metadata);
585
- if (agentContext.currentTokenType === _enum.ContentTypes.THINK ||
586
- agentContext.currentTokenType === 'think_and_text') {
587
- keyList.push('reasoning');
588
- }
589
- else if (agentContext.tokenTypeSwitch === 'content') {
590
- keyList.push(`post-reasoning-${agentContext.reasoningTransitionCount}`);
591
- }
592
- if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {
593
- keyList.push(this.invokedToolIds.size + '');
594
- }
595
710
  return keyList;
596
711
  }
597
712
  checkKeyList(keyList) {
@@ -703,6 +818,7 @@ class StandardGraph extends Graph {
703
818
  sessions: this.sessions,
704
819
  toolDefinitions: toolDefMap,
705
820
  agentId: agentContext?.agentId,
821
+ executingAgentId: agentContext?.agentId,
706
822
  toolCallStepIds: this.toolCallStepIds,
707
823
  toolRegistry: agentContext?.toolRegistry,
708
824
  hookRegistry: this.hookRegistry,
@@ -740,6 +856,10 @@ class StandardGraph extends Graph {
740
856
  trace: traceToolNode,
741
857
  runLangfuse: this.langfuse,
742
858
  agentLangfuse: agentContext?.langfuse,
859
+ // `agentId` is intentionally left unset on this path (it is the
860
+ // subagent-scope marker); `executingAgentId` always identifies the owning
861
+ // agent so hooks can attribute the batch even at the top level.
862
+ executingAgentId: agentContext?.agentId,
743
863
  toolCallStepIds: this.toolCallStepIds,
744
864
  errorHandler: (data, metadata) => StandardGraph.handleToolCallErrorStatic(this, data, metadata),
745
865
  toolRegistry: agentContext?.toolRegistry,
@@ -1137,6 +1257,7 @@ class StandardGraph extends Graph {
1137
1257
  };
1138
1258
  }
1139
1259
  }
1260
+ const metadata = config.metadata;
1140
1261
  try {
1141
1262
  result = await langfuseToolOutputTracing.withLangfuseToolOutputTracingConfig(this.langfuse, () => invoke.attemptInvoke({
1142
1263
  model: (this.overrideModel ?? model),
@@ -1146,6 +1267,10 @@ class StandardGraph extends Graph {
1146
1267
  }, invokeConfig), agentContext.langfuse);
1147
1268
  }
1148
1269
  catch (primaryError) {
1270
+ clearCurrentDeltaStepMarkers({
1271
+ graph: this,
1272
+ metadata,
1273
+ });
1149
1274
  result = await langfuseToolOutputTracing.withLangfuseToolOutputTracingConfig(this.langfuse, () => invoke.tryFallbackProviders({
1150
1275
  fallbacks,
1151
1276
  tools: agentContext.tools,
@@ -1180,28 +1305,42 @@ class StandardGraph extends Graph {
1180
1305
  const toolCalls = responseMessage
1181
1306
  ?.tool_calls;
1182
1307
  const hasToolCalls = Array.isArray(toolCalls) && toolCalls.length > 0;
1183
- const metadata = config.metadata;
1184
1308
  const responseReasoningContent = getResponseReasoningContent({
1185
1309
  responseMessage: responseMessage,
1186
1310
  reasoningKey: agentContext.reasoningKey,
1187
1311
  });
1188
- const textMessageContent = getTextMessageDeltaContent(responseMessage?.content);
1312
+ const textMessageContent = getMessageDeltaContent(agentContext.provider, responseMessage?.content);
1313
+ const hasStreamedTextDeltaStep = hasCurrentTextDeltaStep({
1314
+ graph: this,
1315
+ metadata,
1316
+ });
1317
+ const hasStreamedReasoningDeltaStep = hasCurrentReasoningDeltaStep({
1318
+ graph: this,
1319
+ metadata,
1320
+ });
1321
+ const dispatchableFinalReasoningContent = getDispatchableFinalReasoningContent({
1322
+ agentContext,
1323
+ responseReasoningContent,
1324
+ hasStreamedTextDeltaStep,
1325
+ hasStreamedReasoningDeltaStep,
1326
+ });
1189
1327
  if (hasToolCalls) {
1190
- const dispatchedReasoning = responseReasoningContent != null &&
1328
+ const dispatchedReasoning = dispatchableFinalReasoningContent != null &&
1191
1329
  (await dispatchReasoningContent({
1192
1330
  graph: this,
1193
1331
  agentContext,
1194
- reasoningContent: responseReasoningContent,
1332
+ reasoningContent: dispatchableFinalReasoningContent,
1195
1333
  metadata,
1196
1334
  }));
1197
1335
  if (dispatchedReasoning) {
1198
1336
  markPostReasoningContent(agentContext);
1199
1337
  }
1200
- if (textMessageContent != null) {
1338
+ if (textMessageContent != null && !hasStreamedTextDeltaStep) {
1201
1339
  const stepKey = this.getStepKey(metadata);
1202
1340
  const dispatchedText = await dispatchTextMessageContent({
1203
1341
  graph: this,
1204
1342
  stepKey,
1343
+ provider: agentContext.provider,
1205
1344
  content: textMessageContent,
1206
1345
  metadata,
1207
1346
  });
@@ -1217,21 +1356,22 @@ class StandardGraph extends Graph {
1217
1356
  * this a no-op when the streaming path already handled the same step.
1218
1357
  */
1219
1358
  if (!hasToolCalls && responseMessage != null) {
1220
- const dispatchedReasoning = responseReasoningContent != null &&
1359
+ const dispatchedReasoning = dispatchableFinalReasoningContent != null &&
1221
1360
  (await dispatchReasoningContent({
1222
1361
  graph: this,
1223
1362
  agentContext,
1224
- reasoningContent: responseReasoningContent,
1363
+ reasoningContent: dispatchableFinalReasoningContent,
1225
1364
  metadata,
1226
1365
  }));
1227
1366
  if (dispatchedReasoning && textMessageContent != null) {
1228
1367
  markPostReasoningContent(agentContext);
1229
1368
  }
1230
- if (textMessageContent != null) {
1369
+ if (textMessageContent != null && !hasStreamedTextDeltaStep) {
1231
1370
  const stepKey = this.getStepKey(metadata);
1232
1371
  await dispatchTextMessageContent({
1233
1372
  graph: this,
1234
1373
  stepKey,
1374
+ provider: agentContext.provider,
1235
1375
  content: textMessageContent,
1236
1376
  metadata,
1237
1377
  });
@@ -1648,6 +1788,9 @@ class StandardGraph extends Graph {
1648
1788
  id,
1649
1789
  delta,
1650
1790
  };
1791
+ if (hasTextDeltaContent(delta.content)) {
1792
+ this.messageStepHasTextDeltas.add(id);
1793
+ }
1651
1794
  const handler = this.handlerRegistry?.getHandler(_enum.GraphEvents.ON_MESSAGE_DELTA);
1652
1795
  if (handler) {
1653
1796
  await handler.handle(_enum.GraphEvents.ON_MESSAGE_DELTA, messageDelta, metadata, this);
@@ -1671,6 +1814,9 @@ class StandardGraph extends Graph {
1671
1814
  id: stepId,
1672
1815
  delta,
1673
1816
  };
1817
+ if (hasReasoningDeltaContent(delta.content)) {
1818
+ this.reasoningStepHasDeltas.add(stepId);
1819
+ }
1674
1820
  const handler = this.handlerRegistry?.getHandler(_enum.GraphEvents.ON_REASONING_DELTA);
1675
1821
  if (handler) {
1676
1822
  await handler.handle(_enum.GraphEvents.ON_REASONING_DELTA, reasoningDelta, metadata, this);