@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
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.mjs","sources":["../../../src/session/handlers.ts"],"sourcesContent":["import type { UsageMetadata } from '@langchain/core/messages';\nimport { GraphEvents } from '@/common';\nimport { ModelEndHandler, ToolEndHandler } from '@/events';\nimport { createContentAggregator } from '@/stream';\nimport type * as t from '@/types';\nimport type {\n AgentSessionHandlersResult,\n AgentSessionStreamEvent,\n AgentSessionUsage,\n} from './types';\nimport { createTimestamp } from './ids';\nimport { toJsonValue } from './messageSerialization';\n\ntype CompletedRunStepResult =\n | t.ToolEndEvent\n | (t.SummaryCompleted & { id: string; index: number });\n\nfunction isToolCompletion(\n result: CompletedRunStepResult\n): result is t.ToolEndEvent {\n return 'tool_call' in result;\n}\n\nfunction createEventFactory(params: {\n runId: string;\n threadId: string;\n}): (\n type: AgentSessionStreamEvent['type'],\n data?: unknown\n) => AgentSessionStreamEvent {\n let sequence = 0;\n return (type, data) => ({\n type,\n sequence: sequence++,\n runId: params.runId,\n threadId: params.threadId,\n timestamp: createTimestamp(),\n ...(typeof data !== 'undefined' ? { data: toJsonValue(data) } : {}),\n });\n}\n\nfunction getTokenCount(value: number | null | undefined): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction updateUsage(usage: AgentSessionUsage, data: t.ModelEndData): void {\n const metadata = data?.output?.usage_metadata as\n | Partial<UsageMetadata>\n | undefined;\n if (!metadata) {\n return;\n }\n const inputTokens = getTokenCount(metadata.input_tokens);\n const outputTokens = getTokenCount(metadata.output_tokens);\n const totalTokens =\n metadata.total_tokens == null\n ? inputTokens + outputTokens\n : getTokenCount(metadata.total_tokens);\n usage.inputTokens += inputTokens;\n usage.outputTokens += outputTokens;\n usage.totalTokens += totalTokens;\n}\n\nasync function callUserHandler(params: {\n userHandlers?: Record<string, t.EventHandler>;\n event: string;\n data: Parameters<t.EventHandler['handle']>[1];\n metadata?: Record<string, unknown>;\n graph?: Parameters<t.EventHandler['handle']>[3];\n}): Promise<void> {\n const handler = params.userHandlers?.[params.event];\n if (!handler) {\n return;\n }\n await handler.handle(\n params.event,\n params.data,\n params.metadata,\n params.graph\n );\n}\n\nexport function createRunHandlers(params: {\n runId: string;\n threadId: string;\n userHandlers?: Record<string, t.EventHandler>;\n onEvent?: (event: AgentSessionStreamEvent) => void;\n}): AgentSessionHandlersResult {\n const { contentParts, aggregateContent } = createContentAggregator();\n const steps: t.RunStep[] = [];\n const usage: AgentSessionUsage = {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n };\n const events: AgentSessionStreamEvent[] = [];\n const createEvent = createEventFactory({\n runId: params.runId,\n threadId: params.threadId,\n });\n const emitEvent = (event: AgentSessionStreamEvent): void => {\n events.push(event);\n params.onEvent?.(event);\n };\n const toolEndHandler = new ToolEndHandler();\n const modelEndHandler = new ModelEndHandler();\n\n emitEvent(createEvent('run.started'));\n\n const handlers: Record<string, t.EventHandler> = {\n [GraphEvents.CHAT_MODEL_STREAM]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.CHAT_MODEL_END]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await modelEndHandler.handle(\n event,\n data as t.ModelEndData,\n metadata,\n graph\n );\n updateUsage(usage, data as t.ModelEndData);\n emitEvent(createEvent('usage.updated', usage));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.TOOL_END]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await toolEndHandler.handle(\n event,\n data as t.StreamEventData,\n metadata,\n graph\n );\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const runStep = data as t.RunStep;\n steps.push(runStep);\n aggregateContent({ event: GraphEvents.ON_RUN_STEP, data: runStep });\n if (runStep.stepDetails.type === 'tool_calls') {\n emitEvent(createEvent('tool.started', runStep));\n }\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.RunStepDeltaEvent;\n aggregateContent({ event: GraphEvents.ON_RUN_STEP_DELTA, data: delta });\n emitEvent(createEvent('tool.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP_COMPLETED]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const completed = data as unknown as { result: CompletedRunStepResult };\n aggregateContent({\n event: GraphEvents.ON_RUN_STEP_COMPLETED,\n data: completed as { result: t.ToolEndEvent },\n });\n if (isToolCompletion(completed.result)) {\n emitEvent(createEvent('tool.completed', completed));\n }\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_MESSAGE_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.MessageDeltaEvent;\n aggregateContent({ event: GraphEvents.ON_MESSAGE_DELTA, data: delta });\n emitEvent(createEvent('message.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_REASONING_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.ReasoningDeltaEvent;\n aggregateContent({\n event: GraphEvents.ON_REASONING_DELTA,\n data: delta,\n });\n emitEvent(createEvent('reasoning.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_SUMMARIZE_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n aggregateContent({\n event: GraphEvents.ON_SUMMARIZE_DELTA,\n data: data as t.SummarizeDeltaData,\n });\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_SUMMARIZE_COMPLETE]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n aggregateContent({\n event: GraphEvents.ON_SUMMARIZE_COMPLETE,\n data: data as t.SummarizeCompleteEvent,\n });\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n };\n\n return { contentParts, steps, usage, events, handlers };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handlers.mjs","sources":["../../../src/session/handlers.ts"],"sourcesContent":["import type { UsageMetadata } from '@langchain/core/messages';\nimport type {\n AgentSessionHandlersResult,\n AgentSessionStreamEvent,\n AgentSessionUsage,\n} from './types';\nimport type * as t from '@/types';\nimport { ModelEndHandler, ToolEndHandler } from '@/events';\nimport { toJsonValue } from './messageSerialization';\nimport { createContentAggregator } from '@/stream';\nimport { createTimestamp } from './ids';\nimport { GraphEvents } from '@/common';\n\ntype CompletedRunStepResult =\n | t.ToolEndEvent\n | (t.SummaryCompleted & { id: string; index: number });\n\nfunction isToolCompletion(\n result: CompletedRunStepResult\n): result is t.ToolEndEvent {\n return 'tool_call' in result;\n}\n\nfunction createEventFactory(params: {\n runId: string;\n threadId: string;\n}): (\n type: AgentSessionStreamEvent['type'],\n data?: unknown\n) => AgentSessionStreamEvent {\n let sequence = 0;\n return (type, data) => ({\n type,\n sequence: sequence++,\n runId: params.runId,\n threadId: params.threadId,\n timestamp: createTimestamp(),\n ...(typeof data !== 'undefined' ? { data: toJsonValue(data) } : {}),\n });\n}\n\nfunction getTokenCount(value: number | null | undefined): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction updateUsage(usage: AgentSessionUsage, data: t.ModelEndData): void {\n const metadata = data?.output?.usage_metadata as\n | Partial<UsageMetadata>\n | undefined;\n if (!metadata) {\n return;\n }\n const inputTokens = getTokenCount(metadata.input_tokens);\n const outputTokens = getTokenCount(metadata.output_tokens);\n const totalTokens =\n metadata.total_tokens == null\n ? inputTokens + outputTokens\n : getTokenCount(metadata.total_tokens);\n usage.inputTokens += inputTokens;\n usage.outputTokens += outputTokens;\n usage.totalTokens += totalTokens;\n}\n\nasync function callUserHandler(params: {\n userHandlers?: Record<string, t.EventHandler>;\n event: string;\n data: Parameters<t.EventHandler['handle']>[1];\n metadata?: Record<string, unknown>;\n graph?: Parameters<t.EventHandler['handle']>[3];\n}): Promise<void> {\n const handler = params.userHandlers?.[params.event];\n if (!handler) {\n return;\n }\n await handler.handle(\n params.event,\n params.data,\n params.metadata,\n params.graph\n );\n}\n\nexport function createRunHandlers(params: {\n runId: string;\n threadId: string;\n userHandlers?: Record<string, t.EventHandler>;\n onEvent?: (event: AgentSessionStreamEvent) => void;\n}): AgentSessionHandlersResult {\n const { contentParts, aggregateContent } = createContentAggregator();\n const steps: t.RunStep[] = [];\n const usage: AgentSessionUsage = {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n };\n const events: AgentSessionStreamEvent[] = [];\n const createEvent = createEventFactory({\n runId: params.runId,\n threadId: params.threadId,\n });\n const emitEvent = (event: AgentSessionStreamEvent): void => {\n events.push(event);\n params.onEvent?.(event);\n };\n const toolEndHandler = new ToolEndHandler();\n const modelEndHandler = new ModelEndHandler();\n\n emitEvent(createEvent('run.started'));\n\n const handlers: Record<string, t.EventHandler> = {\n [GraphEvents.CHAT_MODEL_STREAM]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.CHAT_MODEL_END]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await modelEndHandler.handle(\n event,\n data as t.ModelEndData,\n metadata,\n graph\n );\n updateUsage(usage, data as t.ModelEndData);\n emitEvent(createEvent('usage.updated', usage));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.TOOL_END]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await toolEndHandler.handle(\n event,\n data as t.StreamEventData,\n metadata,\n graph\n );\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const runStep = data as t.RunStep;\n steps.push(runStep);\n aggregateContent({ event: GraphEvents.ON_RUN_STEP, data: runStep });\n if (runStep.stepDetails.type === 'tool_calls') {\n emitEvent(createEvent('tool.started', runStep));\n }\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.RunStepDeltaEvent;\n aggregateContent({ event: GraphEvents.ON_RUN_STEP_DELTA, data: delta });\n emitEvent(createEvent('tool.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP_COMPLETED]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const completed = data as unknown as { result: CompletedRunStepResult };\n aggregateContent({\n event: GraphEvents.ON_RUN_STEP_COMPLETED,\n data: completed as { result: t.ToolEndEvent },\n });\n if (isToolCompletion(completed.result)) {\n emitEvent(createEvent('tool.completed', completed));\n }\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_MESSAGE_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.MessageDeltaEvent;\n aggregateContent({ event: GraphEvents.ON_MESSAGE_DELTA, data: delta });\n emitEvent(createEvent('message.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_REASONING_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.ReasoningDeltaEvent;\n aggregateContent({\n event: GraphEvents.ON_REASONING_DELTA,\n data: delta,\n });\n emitEvent(createEvent('reasoning.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_SUMMARIZE_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n aggregateContent({\n event: GraphEvents.ON_SUMMARIZE_DELTA,\n data: data as t.SummarizeDeltaData,\n });\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_SUMMARIZE_COMPLETE]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n aggregateContent({\n event: GraphEvents.ON_SUMMARIZE_COMPLETE,\n data: data as t.SummarizeCompleteEvent,\n });\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n };\n\n return { contentParts, steps, usage, events, handlers };\n}\n"],"names":[],"mappings":"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"}
@@ -1,14 +1,16 @@
1
1
  import { LOCAL_CODING_BUNDLE_NAMES, StepTypes, ContentTypes, Providers, GraphEvents, Constants, ToolCallTypes, CODE_EXECUTION_TOOLS } from './common/enum.mjs';
2
+ import { getStreamedToolCallSeal, getStreamedToolCallAdapter } from './tools/streamedToolCallSeals.mjs';
3
+ import { normalizeError, buildToolExecutionRequestPlan, coerceRecordArgs } from './tools/eagerEventExecution.mjs';
2
4
  import { handleServerToolResult, handleToolCalls, handleToolCallChunks } from './tools/handlers.mjs';
5
+ import { calculateMaxToolResultChars, truncateToolResultContent } from './utils/truncation.mjs';
6
+ import { TOOL_OUTPUT_REF_PATTERN } from './tools/toolOutputReferences.mjs';
7
+ import { safeDispatchCustomEvent } from './utils/events.mjs';
8
+ import { isGoogleLike } from './utils/llm.mjs';
3
9
  import './messages/core.mjs';
4
10
  import { getMessageId } from './messages/ids.mjs';
5
11
  import '@langchain/core/messages';
6
- import { calculateMaxToolResultChars, truncateToolResultContent } from './utils/truncation.mjs';
7
- import { safeDispatchCustomEvent } from './utils/events.mjs';
12
+ import 'node:crypto';
8
13
  import 'uuid';
9
- import { normalizeError, buildToolExecutionRequestPlan, coerceRecordArgs } from './tools/eagerEventExecution.mjs';
10
- import { getStreamedToolCallSeal, getStreamedToolCallAdapter } from './tools/streamedToolCallSeals.mjs';
11
- import { TOOL_OUTPUT_REF_PATTERN } from './tools/toolOutputReferences.mjs';
12
14
 
13
15
  const LOCAL_CODING_BUNDLE_NAME_SET = new Set(LOCAL_CODING_BUNDLE_NAMES);
14
16
  /**
@@ -204,6 +206,120 @@ function hasDirectToolCallChunkStateInStep(args) {
204
206
  }
205
207
  return false;
206
208
  }
209
+ function isGoogleServerSideToolContentPart(contentPart) {
210
+ return contentPart.type === 'toolCall' || contentPart.type === 'toolResponse';
211
+ }
212
+ function isTextContentPart(contentPart) {
213
+ return contentPart.type?.startsWith(ContentTypes.TEXT) ?? false;
214
+ }
215
+ function isReasoningContentPart(contentPart) {
216
+ return ((contentPart.type?.startsWith(ContentTypes.THINKING) ?? false) ||
217
+ (contentPart.type?.startsWith(ContentTypes.REASONING) ?? false) ||
218
+ (contentPart.type?.startsWith(ContentTypes.REASONING_CONTENT) ?? false) ||
219
+ contentPart.type === 'redacted_thinking');
220
+ }
221
+ function getReasoningTextFromContentPart(contentPart) {
222
+ return (contentPart.thinking ??
223
+ contentPart.reasoning ??
224
+ contentPart.reasoningText
225
+ ?.text ??
226
+ '');
227
+ }
228
+ function getReasoningTextFromChunk(chunk, agentContext) {
229
+ const reasoning = chunk.additional_kwargs?.[agentContext.reasoningKey];
230
+ if (typeof reasoning === 'string') {
231
+ return reasoning;
232
+ }
233
+ return reasoning?.summary?.[0]?.text ?? '';
234
+ }
235
+ const googleServerSideToolStepIdsByGraph = new WeakMap();
236
+ function markGoogleServerSideToolMessageStep(graph, stepId) {
237
+ const stepIds = googleServerSideToolStepIdsByGraph.get(graph) ?? new Set();
238
+ stepIds.add(stepId);
239
+ googleServerSideToolStepIdsByGraph.set(graph, stepIds);
240
+ }
241
+ function isGoogleServerSideToolMessageStep(graph, stepId) {
242
+ return googleServerSideToolStepIdsByGraph.get(graph)?.has(stepId) === true;
243
+ }
244
+ function shouldStartFreshMessageStepAfterGoogleServerSideTool({ graph, stepId, runStep, content, }) {
245
+ if (runStep?.type !== StepTypes.MESSAGE_CREATION ||
246
+ !isGoogleServerSideToolMessageStep(graph, stepId)) {
247
+ return false;
248
+ }
249
+ if (typeof content === 'string') {
250
+ return true;
251
+ }
252
+ return (content.every((c) => isTextContentPart(c)) ||
253
+ content.every((c) => isReasoningContentPart(c)));
254
+ }
255
+ async function dispatchMessageCreationStep({ graph, stepKey, metadata, }) {
256
+ const messageId = getMessageId(stepKey, graph, true) ?? '';
257
+ return graph.dispatchRunStep(stepKey, {
258
+ type: StepTypes.MESSAGE_CREATION,
259
+ message_creation: {
260
+ message_id: messageId,
261
+ },
262
+ }, metadata);
263
+ }
264
+ async function dispatchMessageContentParts({ graph, stepKey, content, metadata, }) {
265
+ for (const contentPart of content) {
266
+ const currentStepId = await dispatchMessageCreationStep({
267
+ graph,
268
+ stepKey,
269
+ metadata,
270
+ });
271
+ if (isGoogleServerSideToolContentPart(contentPart)) {
272
+ markGoogleServerSideToolMessageStep(graph, currentStepId);
273
+ }
274
+ await graph.dispatchMessageDelta(currentStepId, {
275
+ content: [contentPart],
276
+ }, metadata);
277
+ }
278
+ }
279
+ async function dispatchReasoningContentParts({ graph, stepKey, content, metadata, }) {
280
+ if (content.length === 0) {
281
+ return;
282
+ }
283
+ const currentStepId = await dispatchMessageCreationStep({
284
+ graph,
285
+ stepKey,
286
+ metadata,
287
+ });
288
+ await graph.dispatchReasoningDelta(currentStepId, {
289
+ content,
290
+ }, metadata);
291
+ }
292
+ async function dispatchGoogleServerSideToolStreamContent({ graph, stepKey, chunk, agentContext, content, metadata, }) {
293
+ const reasoningContent = [];
294
+ const reasoningText = getReasoningTextFromChunk(chunk, agentContext);
295
+ if (reasoningText !== '') {
296
+ reasoningContent.push({
297
+ type: ContentTypes.THINK,
298
+ think: reasoningText,
299
+ });
300
+ }
301
+ reasoningContent.push(...content
302
+ .filter((contentPart) => isReasoningContentPart(contentPart))
303
+ .map((contentPart) => ({
304
+ type: ContentTypes.THINK,
305
+ think: getReasoningTextFromContentPart(contentPart),
306
+ }))
307
+ .filter((contentPart) => contentPart.think !== ''));
308
+ await dispatchReasoningContentParts({
309
+ graph,
310
+ stepKey,
311
+ content: reasoningContent,
312
+ metadata,
313
+ });
314
+ const messageContent = content.filter((contentPart) => isTextContentPart(contentPart) ||
315
+ isGoogleServerSideToolContentPart(contentPart));
316
+ await dispatchMessageContentParts({
317
+ graph,
318
+ stepKey,
319
+ content: messageContent,
320
+ metadata,
321
+ });
322
+ }
207
323
  function createEagerToolExecutionPlan(args) {
208
324
  const { graph, metadata, agentContext, toolCalls, skipExisting = false, } = args;
209
325
  if (!isEagerToolExecutionEnabledForBatch({
@@ -593,21 +709,16 @@ function startReadyStreamedEagerToolExecutions(args) {
593
709
  });
594
710
  }
595
711
  function getChunkContent({ chunk, provider, reasoningKey, }) {
712
+ if (isGoogleLike(provider) &&
713
+ Array.isArray(chunk?.content) &&
714
+ chunk.content.some((c) => isGoogleServerSideToolContentPart(c))) {
715
+ return chunk.content;
716
+ }
596
717
  if ((provider === Providers.OPENAI || provider === Providers.AZURE) &&
597
718
  chunk?.additional_kwargs?.reasoning?.summary?.[0]?.text != null &&
598
719
  (chunk?.additional_kwargs?.reasoning?.summary?.[0]?.text?.length ?? 0) > 0) {
599
720
  return chunk?.additional_kwargs?.reasoning?.summary?.[0]?.text;
600
721
  }
601
- /**
602
- * For OpenRouter, reasoning is stored in additional_kwargs.reasoning (not reasoning_content).
603
- * NOTE: We intentionally do NOT extract text from reasoning_details here.
604
- * The reasoning_details array contains the FULL accumulated reasoning text (set only on final chunk),
605
- * but individual reasoning tokens are already streamed via additional_kwargs.reasoning.
606
- * Extracting from reasoning_details would cause duplication.
607
- * The reasoning_details is only used for:
608
- * 1. Detecting reasoning mode in handleReasoning()
609
- * 2. Final message storage (for thought signatures)
610
- */
611
722
  if (provider === Providers.OPENROUTER) {
612
723
  // Content presence signals end of reasoning phase - prefer content over reasoning
613
724
  // This handles transitional chunks that may have both reasoning and content
@@ -618,10 +729,84 @@ function getChunkContent({ chunk, provider, reasoningKey, }) {
618
729
  if (reasoning != null && reasoning !== '') {
619
730
  return reasoning;
620
731
  }
732
+ const reasoningContent = chunk?.additional_kwargs?.reasoning_content;
733
+ if (reasoningContent != null && reasoningContent !== '') {
734
+ return reasoningContent;
735
+ }
621
736
  return chunk?.content;
622
737
  }
623
- return ((chunk?.additional_kwargs?.[reasoningKey] ?? '') ||
624
- chunk?.content);
738
+ const keyedReasoning = chunk?.additional_kwargs?.[reasoningKey];
739
+ if (typeof chunk?.content === 'string' &&
740
+ chunk.content !== '' &&
741
+ keyedReasoning != null &&
742
+ keyedReasoning !== '') {
743
+ return chunk.content;
744
+ }
745
+ return (keyedReasoning ?? '') || chunk?.content;
746
+ }
747
+ function isDisableStreamingEnabled(clientOptions) {
748
+ return (clientOptions != null &&
749
+ 'disableStreaming' in clientOptions &&
750
+ clientOptions.disableStreaming === true);
751
+ }
752
+ function hasReasoningContent(value) {
753
+ if (typeof value === 'string') {
754
+ return value !== '';
755
+ }
756
+ if (Array.isArray(value)) {
757
+ return value.length > 0;
758
+ }
759
+ if (value == null) {
760
+ return false;
761
+ }
762
+ return (value.summary?.some((summary) => summary.text != null && summary.text.length > 0) === true);
763
+ }
764
+ function shouldDeferMixedFinalReasoningChunk({ chunk, agentContext, }) {
765
+ if ((chunk.tool_calls?.length ?? 0) > 0 ||
766
+ (chunk.tool_call_chunks?.length ?? 0) > 0 ||
767
+ typeof chunk.content !== 'string' ||
768
+ chunk.content === '') {
769
+ return false;
770
+ }
771
+ const additionalKwargs = chunk.additional_kwargs;
772
+ if (agentContext.provider === Providers.OPENROUTER &&
773
+ hasReasoningContent(additionalKwargs?.reasoning_details)) {
774
+ return true;
775
+ }
776
+ if (!isDisableStreamingEnabled(agentContext.clientOptions)) {
777
+ return false;
778
+ }
779
+ return (hasReasoningContent(additionalKwargs?.[agentContext.reasoningKey]) ||
780
+ hasReasoningContent(additionalKwargs?.reasoning_content) ||
781
+ hasReasoningContent(additionalKwargs?.reasoning) ||
782
+ hasReasoningContent(additionalKwargs?.reasoning_details));
783
+ }
784
+ function hasCurrentTextDeltaStep({ graph, metadata, }) {
785
+ if (metadata == null) {
786
+ return false;
787
+ }
788
+ const baseStepKey = graph.getStepBaseKey(metadata);
789
+ for (const [stepKey, stepIds] of graph.stepKeyIds) {
790
+ if (stepKey !== baseStepKey && !stepKey.startsWith(`${baseStepKey}_`)) {
791
+ continue;
792
+ }
793
+ if (stepIds.some((stepId) => graph.messageStepHasTextDeltas.has(stepId))) {
794
+ return true;
795
+ }
796
+ }
797
+ return false;
798
+ }
799
+ function shouldSkipLateOpenRouterReasoningChunk({ chunk, agentContext, graph, metadata, }) {
800
+ if (agentContext.provider !== Providers.OPENROUTER ||
801
+ (chunk.tool_calls?.length ?? 0) > 0 ||
802
+ (chunk.tool_call_chunks?.length ?? 0) > 0 ||
803
+ (chunk.content != null && chunk.content !== '')) {
804
+ return false;
805
+ }
806
+ return ((hasReasoningContent(chunk.additional_kwargs?.reasoning) ||
807
+ hasReasoningContent(chunk.additional_kwargs?.reasoning_content) ||
808
+ hasReasoningContent(chunk.additional_kwargs?.reasoning_details)) &&
809
+ hasCurrentTextDeltaStep({ graph, metadata }));
625
810
  }
626
811
  class ChatModelStreamHandler {
627
812
  async handle(event, data, metadata, graph) {
@@ -651,10 +836,34 @@ class ChatModelStreamHandler {
651
836
  if (skipHandling) {
652
837
  return;
653
838
  }
839
+ if (shouldDeferMixedFinalReasoningChunk({ chunk, agentContext })) {
840
+ return;
841
+ }
842
+ if (shouldSkipLateOpenRouterReasoningChunk({
843
+ chunk,
844
+ agentContext,
845
+ graph,
846
+ metadata,
847
+ })) {
848
+ return;
849
+ }
654
850
  this.handleReasoning(chunk, agentContext);
655
851
  const stepKey = graph.getStepKey(metadata);
656
852
  let hasToolCalls = false;
657
853
  const hasToolCallChunks = (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) ?? false;
854
+ const hasGoogleServerSideToolContent = isGoogleLike(agentContext.provider) &&
855
+ Array.isArray(content) &&
856
+ content.some((c) => isGoogleServerSideToolContentPart(c));
857
+ if (hasGoogleServerSideToolContent && Array.isArray(content)) {
858
+ await dispatchGoogleServerSideToolStreamContent({
859
+ graph,
860
+ stepKey,
861
+ chunk,
862
+ agentContext,
863
+ content,
864
+ metadata,
865
+ });
866
+ }
658
867
  if (chunk.tool_calls &&
659
868
  chunk.tool_calls.length > 0 &&
660
869
  chunk.tool_calls.every((tc) => tc.id != null &&
@@ -727,6 +936,9 @@ class ChatModelStreamHandler {
727
936
  if (isEmptyContent) {
728
937
  return;
729
938
  }
939
+ if (hasGoogleServerSideToolContent) {
940
+ return;
941
+ }
730
942
  const message_id = getMessageId(stepKey, graph) ?? '';
731
943
  if (message_id) {
732
944
  await graph.dispatchRunStep(stepKey, {
@@ -736,8 +948,17 @@ class ChatModelStreamHandler {
736
948
  },
737
949
  }, metadata);
738
950
  }
739
- const stepId = graph.getStepIdByKey(stepKey);
740
- const runStep = graph.getRunStep(stepId);
951
+ let stepId = graph.getStepIdByKey(stepKey);
952
+ let runStep = graph.getRunStep(stepId);
953
+ if (shouldStartFreshMessageStepAfterGoogleServerSideTool({
954
+ graph,
955
+ stepId,
956
+ runStep,
957
+ content,
958
+ })) {
959
+ stepId = await dispatchMessageCreationStep({ graph, stepKey, metadata });
960
+ runStep = graph.getRunStep(stepId);
961
+ }
741
962
  if (!runStep) {
742
963
  console.warn(`\n
743
964
  ==============================================================
@@ -820,15 +1041,12 @@ hasToolCallChunks: ${hasToolCallChunks}
820
1041
  }, metadata);
821
1042
  }
822
1043
  }
823
- else if (content.every((c) => c.type?.startsWith(ContentTypes.TEXT) ?? false)) {
1044
+ else if (content.every((c) => isTextContentPart(c))) {
824
1045
  await graph.dispatchMessageDelta(stepId, {
825
1046
  content,
826
1047
  }, metadata);
827
1048
  }
828
- else if (content.every((c) => (c.type?.startsWith(ContentTypes.THINKING) ?? false) ||
829
- (c.type?.startsWith(ContentTypes.REASONING) ?? false) ||
830
- (c.type?.startsWith(ContentTypes.REASONING_CONTENT) ?? false) ||
831
- c.type === 'redacted_thinking')) {
1049
+ else if (content.every((c) => isReasoningContentPart(c))) {
832
1050
  await graph.dispatchReasoningDelta(stepId, {
833
1051
  content: content.map((c) => ({
834
1052
  type: ContentTypes.THINK,
@@ -866,7 +1084,9 @@ hasToolCallChunks: ${hasToolCallChunks}
866
1084
  Array.isArray(chunk.additional_kwargs.reasoning_details) &&
867
1085
  chunk.additional_kwargs.reasoning_details.length > 0) ||
868
1086
  (typeof chunk.additional_kwargs?.reasoning === 'string' &&
869
- chunk.additional_kwargs.reasoning !== ''))) {
1087
+ chunk.additional_kwargs.reasoning !== '') ||
1088
+ (typeof chunk.additional_kwargs?.reasoning_content === 'string' &&
1089
+ chunk.additional_kwargs.reasoning_content !== ''))) {
870
1090
  reasoning_content = 'valid';
871
1091
  }
872
1092
  if (reasoning_content != null &&
@@ -973,6 +1193,9 @@ function createContentAggregator() {
973
1193
  };
974
1194
  contentParts[index] = update;
975
1195
  }
1196
+ else if (partType === 'toolCall' || partType === 'toolResponse') {
1197
+ contentParts[index] = contentPart;
1198
+ }
976
1199
  else if (partType === ContentTypes.SUMMARY) {
977
1200
  const currentSummary = contentParts[index];
978
1201
  const incoming = contentPart;