@illuma-ai/agents 1.0.90 → 1.0.93

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 (838) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +98 -49
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/common/constants.cjs +25 -0
  4. package/dist/cjs/common/constants.cjs.map +1 -0
  5. package/dist/cjs/common/enum.cjs +30 -0
  6. package/dist/cjs/common/enum.cjs.map +1 -1
  7. package/dist/cjs/events.cjs +9 -4
  8. package/dist/cjs/events.cjs.map +1 -1
  9. package/dist/cjs/graphs/Graph.cjs +397 -92
  10. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  11. package/dist/cjs/graphs/MultiAgentGraph.cjs +223 -92
  12. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  13. package/dist/cjs/instrumentation.cjs +30 -14
  14. package/dist/cjs/instrumentation.cjs.map +1 -1
  15. package/dist/cjs/llm/anthropic/index.cjs +43 -11
  16. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  17. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  18. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +10 -7
  19. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  20. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +32 -0
  21. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
  22. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
  23. package/dist/cjs/llm/bedrock/index.cjs +129 -101
  24. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  25. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +489 -0
  26. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -0
  27. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +176 -0
  28. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -0
  29. package/dist/cjs/llm/fake.cjs.map +1 -1
  30. package/dist/cjs/llm/google/index.cjs.map +1 -1
  31. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  32. package/dist/cjs/llm/openai/index.cjs +1 -1
  33. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  34. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  35. package/dist/cjs/llm/openrouter/index.cjs +59 -5
  36. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  37. package/dist/cjs/llm/providers.cjs.map +1 -1
  38. package/dist/cjs/llm/text.cjs.map +1 -1
  39. package/dist/cjs/llm/vertexai/index.cjs +80 -2
  40. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  41. package/dist/cjs/main.cjs +60 -27
  42. package/dist/cjs/main.cjs.map +1 -1
  43. package/dist/cjs/messages/cache.cjs +131 -108
  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/core.cjs +3 -0
  47. package/dist/cjs/messages/core.cjs.map +1 -1
  48. package/dist/cjs/messages/format.cjs +265 -47
  49. package/dist/cjs/messages/format.cjs.map +1 -1
  50. package/dist/cjs/messages/ids.cjs.map +1 -1
  51. package/dist/cjs/messages/prune.cjs +55 -2
  52. package/dist/cjs/messages/prune.cjs.map +1 -1
  53. package/dist/cjs/messages/summarize.cjs +170 -0
  54. package/dist/cjs/messages/summarize.cjs.map +1 -0
  55. package/dist/cjs/messages/tools.cjs.map +1 -1
  56. package/dist/cjs/run.cjs +87 -30
  57. package/dist/cjs/run.cjs.map +1 -1
  58. package/dist/cjs/schemas/validate.cjs.map +1 -1
  59. package/dist/cjs/splitStream.cjs.map +1 -1
  60. package/dist/cjs/stream.cjs +59 -25
  61. package/dist/cjs/stream.cjs.map +1 -1
  62. package/dist/cjs/tools/AskUser.cjs +131 -0
  63. package/dist/cjs/tools/AskUser.cjs.map +1 -0
  64. package/dist/cjs/tools/BrowserTools.cjs +11 -7
  65. package/dist/cjs/tools/BrowserTools.cjs.map +1 -1
  66. package/dist/cjs/tools/Calculator.cjs.map +1 -1
  67. package/dist/cjs/tools/CodeExecutor.cjs +46 -4
  68. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  69. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +36 -53
  70. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  71. package/dist/cjs/tools/StreamingToolCallBuffer.cjs +208 -0
  72. package/dist/cjs/tools/StreamingToolCallBuffer.cjs.map +1 -0
  73. package/dist/cjs/tools/ToolNode.cjs +333 -30
  74. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  75. package/dist/cjs/tools/ToolSearch.cjs +66 -30
  76. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  77. package/dist/cjs/tools/handlers.cjs +94 -8
  78. package/dist/cjs/tools/handlers.cjs.map +1 -1
  79. package/dist/cjs/tools/schema.cjs.map +1 -1
  80. package/dist/cjs/tools/search/content.cjs.map +1 -1
  81. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  82. package/dist/cjs/tools/search/format.cjs.map +1 -1
  83. package/dist/cjs/tools/search/highlights.cjs.map +1 -1
  84. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  85. package/dist/cjs/tools/search/schema.cjs.map +1 -1
  86. package/dist/cjs/tools/search/search.cjs +1 -0
  87. package/dist/cjs/tools/search/search.cjs.map +1 -1
  88. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
  89. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  90. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  91. package/dist/cjs/types/graph.cjs +1 -1
  92. package/dist/cjs/types/graph.cjs.map +1 -1
  93. package/dist/cjs/utils/contextAnalytics.cjs +23 -6
  94. package/dist/cjs/utils/contextAnalytics.cjs.map +1 -1
  95. package/dist/cjs/utils/events.cjs.map +1 -1
  96. package/dist/cjs/utils/graph.cjs.map +1 -1
  97. package/dist/cjs/utils/handlers.cjs.map +1 -1
  98. package/dist/cjs/utils/llm.cjs.map +1 -1
  99. package/dist/cjs/utils/misc.cjs.map +1 -1
  100. package/dist/cjs/utils/run.cjs +3 -1
  101. package/dist/cjs/utils/run.cjs.map +1 -1
  102. package/dist/cjs/utils/schema.cjs.map +1 -1
  103. package/dist/cjs/utils/title.cjs.map +1 -1
  104. package/dist/cjs/utils/tokens.cjs +33 -58
  105. package/dist/cjs/utils/tokens.cjs.map +1 -1
  106. package/dist/cjs/utils/toolCallContinuation.cjs +55 -0
  107. package/dist/cjs/utils/toolCallContinuation.cjs.map +1 -0
  108. package/dist/cjs/utils/toonFormat.cjs.map +1 -1
  109. package/dist/esm/agents/AgentContext.mjs +98 -49
  110. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  111. package/dist/esm/common/constants.mjs +22 -0
  112. package/dist/esm/common/constants.mjs.map +1 -0
  113. package/dist/esm/common/enum.mjs +31 -1
  114. package/dist/esm/common/enum.mjs.map +1 -1
  115. package/dist/esm/events.mjs +9 -4
  116. package/dist/esm/events.mjs.map +1 -1
  117. package/dist/esm/graphs/Graph.mjs +393 -88
  118. package/dist/esm/graphs/Graph.mjs.map +1 -1
  119. package/dist/esm/graphs/MultiAgentGraph.mjs +224 -93
  120. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  121. package/dist/esm/instrumentation.mjs +30 -14
  122. package/dist/esm/instrumentation.mjs.map +1 -1
  123. package/dist/esm/llm/anthropic/index.mjs +43 -11
  124. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  125. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  126. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +10 -7
  127. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  128. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +32 -0
  129. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
  130. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
  131. package/dist/esm/llm/bedrock/index.mjs +128 -101
  132. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  133. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +484 -0
  134. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -0
  135. package/dist/esm/llm/bedrock/utils/message_outputs.mjs +171 -0
  136. package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -0
  137. package/dist/esm/llm/fake.mjs.map +1 -1
  138. package/dist/esm/llm/google/index.mjs.map +1 -1
  139. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  140. package/dist/esm/llm/openai/index.mjs +1 -1
  141. package/dist/esm/llm/openai/index.mjs.map +1 -1
  142. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  143. package/dist/esm/llm/openrouter/index.mjs +59 -5
  144. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  145. package/dist/esm/llm/providers.mjs.map +1 -1
  146. package/dist/esm/llm/text.mjs.map +1 -1
  147. package/dist/esm/llm/vertexai/index.mjs +80 -2
  148. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  149. package/dist/esm/main.mjs +8 -3
  150. package/dist/esm/main.mjs.map +1 -1
  151. package/dist/esm/messages/cache.mjs +131 -108
  152. package/dist/esm/messages/cache.mjs.map +1 -1
  153. package/dist/esm/messages/content.mjs.map +1 -1
  154. package/dist/esm/messages/core.mjs +4 -1
  155. package/dist/esm/messages/core.mjs.map +1 -1
  156. package/dist/esm/messages/format.mjs +267 -49
  157. package/dist/esm/messages/format.mjs.map +1 -1
  158. package/dist/esm/messages/ids.mjs.map +1 -1
  159. package/dist/esm/messages/prune.mjs +56 -4
  160. package/dist/esm/messages/prune.mjs.map +1 -1
  161. package/dist/esm/messages/summarize.mjs +161 -0
  162. package/dist/esm/messages/summarize.mjs.map +1 -0
  163. package/dist/esm/messages/tools.mjs.map +1 -1
  164. package/dist/esm/run.mjs +88 -31
  165. package/dist/esm/run.mjs.map +1 -1
  166. package/dist/esm/schemas/validate.mjs.map +1 -1
  167. package/dist/esm/splitStream.mjs.map +1 -1
  168. package/dist/esm/stream.mjs +60 -26
  169. package/dist/esm/stream.mjs.map +1 -1
  170. package/dist/esm/tools/AskUser.mjs +125 -0
  171. package/dist/esm/tools/AskUser.mjs.map +1 -0
  172. package/dist/esm/tools/BrowserTools.mjs +11 -7
  173. package/dist/esm/tools/BrowserTools.mjs.map +1 -1
  174. package/dist/esm/tools/Calculator.mjs.map +1 -1
  175. package/dist/esm/tools/CodeExecutor.mjs +46 -4
  176. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  177. package/dist/esm/tools/ProgrammaticToolCalling.mjs +37 -54
  178. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  179. package/dist/esm/tools/StreamingToolCallBuffer.mjs +206 -0
  180. package/dist/esm/tools/StreamingToolCallBuffer.mjs.map +1 -0
  181. package/dist/esm/tools/ToolNode.mjs +333 -30
  182. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  183. package/dist/esm/tools/ToolSearch.mjs +66 -30
  184. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  185. package/dist/esm/tools/handlers.mjs +95 -9
  186. package/dist/esm/tools/handlers.mjs.map +1 -1
  187. package/dist/esm/tools/schema.mjs.map +1 -1
  188. package/dist/esm/tools/search/content.mjs.map +1 -1
  189. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  190. package/dist/esm/tools/search/format.mjs.map +1 -1
  191. package/dist/esm/tools/search/highlights.mjs.map +1 -1
  192. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  193. package/dist/esm/tools/search/schema.mjs.map +1 -1
  194. package/dist/esm/tools/search/search.mjs +1 -0
  195. package/dist/esm/tools/search/search.mjs.map +1 -1
  196. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
  197. package/dist/esm/tools/search/tool.mjs.map +1 -1
  198. package/dist/esm/tools/search/utils.mjs.map +1 -1
  199. package/dist/esm/types/graph.mjs +1 -1
  200. package/dist/esm/types/graph.mjs.map +1 -1
  201. package/dist/esm/utils/contextAnalytics.mjs +23 -6
  202. package/dist/esm/utils/contextAnalytics.mjs.map +1 -1
  203. package/dist/esm/utils/events.mjs.map +1 -1
  204. package/dist/esm/utils/graph.mjs.map +1 -1
  205. package/dist/esm/utils/handlers.mjs.map +1 -1
  206. package/dist/esm/utils/llm.mjs.map +1 -1
  207. package/dist/esm/utils/misc.mjs.map +1 -1
  208. package/dist/esm/utils/run.mjs +3 -1
  209. package/dist/esm/utils/run.mjs.map +1 -1
  210. package/dist/esm/utils/schema.mjs.map +1 -1
  211. package/dist/esm/utils/title.mjs.map +1 -1
  212. package/dist/esm/utils/tokens.mjs +33 -59
  213. package/dist/esm/utils/tokens.mjs.map +1 -1
  214. package/dist/esm/utils/toolCallContinuation.mjs +52 -0
  215. package/dist/esm/utils/toolCallContinuation.mjs.map +1 -0
  216. package/dist/esm/utils/toonFormat.mjs.map +1 -1
  217. package/dist/types/agents/AgentContext.d.ts +14 -7
  218. package/dist/types/common/constants.d.ts +18 -0
  219. package/dist/types/common/enum.d.ts +28 -0
  220. package/dist/types/common/index.d.ts +1 -0
  221. package/dist/types/events.d.ts +10 -3
  222. package/dist/types/graphs/Graph.d.ts +37 -0
  223. package/dist/types/index.d.ts +4 -0
  224. package/dist/types/llm/anthropic/index.d.ts +7 -1
  225. package/dist/types/llm/anthropic/types.d.ts +5 -2
  226. package/dist/types/llm/anthropic/utils/message_outputs.d.ts +1 -1
  227. package/dist/types/llm/bedrock/index.d.ts +40 -33
  228. package/dist/types/llm/bedrock/utils/message_outputs.d.ts +1 -1
  229. package/dist/types/llm/google/index.d.ts +2 -3
  230. package/dist/types/llm/openrouter/index.d.ts +21 -1
  231. package/dist/types/llm/vertexai/index.d.ts +3 -2
  232. package/dist/types/messages/cache.d.ts +1 -1
  233. package/dist/types/messages/index.d.ts +1 -0
  234. package/dist/types/messages/prune.d.ts +2 -7
  235. package/dist/types/messages/summarize.d.ts +33 -0
  236. package/dist/types/run.d.ts +6 -0
  237. package/dist/types/tools/AskUser.d.ts +408 -0
  238. package/dist/types/tools/BrowserTools.d.ts +2 -2
  239. package/dist/types/tools/CodeExecutor.d.ts +2 -2
  240. package/dist/types/tools/StreamingToolCallBuffer.d.ts +106 -0
  241. package/dist/types/tools/ToolNode.d.ts +55 -3
  242. package/dist/types/tools/ToolSearch.d.ts +9 -5
  243. package/dist/types/tools/handlers.d.ts +2 -2
  244. package/dist/types/types/graph.d.ts +9 -2
  245. package/dist/types/types/llm.d.ts +8 -3
  246. package/dist/types/types/run.d.ts +2 -0
  247. package/dist/types/types/tools.d.ts +20 -2
  248. package/dist/types/utils/contextAnalytics.d.ts +5 -4
  249. package/dist/types/utils/index.d.ts +1 -0
  250. package/dist/types/utils/tokens.d.ts +6 -19
  251. package/dist/types/utils/toolCallContinuation.d.ts +30 -0
  252. package/package.json +15 -8
  253. package/src/agents/AgentContext.js +782 -0
  254. package/src/agents/AgentContext.js.map +1 -0
  255. package/src/agents/AgentContext.test.js +421 -0
  256. package/src/agents/AgentContext.test.js.map +1 -0
  257. package/src/agents/AgentContext.ts +132 -64
  258. package/src/agents/__tests__/AgentContext.test.js +678 -0
  259. package/src/agents/__tests__/AgentContext.test.js.map +1 -0
  260. package/src/agents/__tests__/AgentContext.test.ts +25 -4
  261. package/src/agents/__tests__/resolveStructuredOutputMode.test.js +117 -0
  262. package/src/agents/__tests__/resolveStructuredOutputMode.test.js.map +1 -0
  263. package/src/common/__tests__/enum.test.ts +135 -0
  264. package/src/common/constants.ts +21 -0
  265. package/src/common/enum.js +192 -0
  266. package/src/common/enum.js.map +1 -0
  267. package/src/common/enum.ts +30 -0
  268. package/src/common/index.js +3 -0
  269. package/src/common/index.js.map +1 -0
  270. package/src/common/index.ts +2 -1
  271. package/src/events.js +166 -0
  272. package/src/events.js.map +1 -0
  273. package/src/events.ts +11 -14
  274. package/src/graphs/Graph.js +1857 -0
  275. package/src/graphs/Graph.js.map +1 -0
  276. package/src/graphs/Graph.ts +580 -162
  277. package/src/graphs/MultiAgentGraph.js +1092 -0
  278. package/src/graphs/MultiAgentGraph.js.map +1 -0
  279. package/src/graphs/MultiAgentGraph.ts +331 -112
  280. package/src/graphs/__tests__/adaptive-thinking.test.ts +369 -0
  281. package/src/graphs/__tests__/graph-direct-tool-names.test.ts +210 -0
  282. package/src/graphs/__tests__/multi-agent-edges.test.ts +237 -0
  283. package/src/graphs/__tests__/structured-output.integration.test.js +624 -0
  284. package/src/graphs/__tests__/structured-output.integration.test.js.map +1 -0
  285. package/src/graphs/__tests__/structured-output.test.js +144 -0
  286. package/src/graphs/__tests__/structured-output.test.js.map +1 -0
  287. package/src/graphs/contextManagement.e2e.test.js +718 -0
  288. package/src/graphs/contextManagement.e2e.test.js.map +1 -0
  289. package/src/graphs/contextManagement.e2e.test.ts +990 -0
  290. package/src/graphs/contextManagement.test.js +485 -0
  291. package/src/graphs/contextManagement.test.js.map +1 -0
  292. package/src/graphs/contextManagement.test.ts +625 -0
  293. package/src/graphs/handoffValidation.test.js +276 -0
  294. package/src/graphs/handoffValidation.test.js.map +1 -0
  295. package/src/graphs/handoffValidation.test.ts +353 -0
  296. package/src/graphs/index.js +3 -0
  297. package/src/graphs/index.js.map +1 -0
  298. package/src/index.js +28 -0
  299. package/src/index.js.map +1 -0
  300. package/src/index.ts +13 -0
  301. package/src/instrumentation.js +21 -0
  302. package/src/instrumentation.js.map +1 -0
  303. package/src/instrumentation.ts +38 -17
  304. package/src/llm/anthropic/index.js +319 -0
  305. package/src/llm/anthropic/index.js.map +1 -0
  306. package/src/llm/anthropic/index.ts +68 -15
  307. package/src/llm/anthropic/llm.spec.ts +402 -0
  308. package/src/llm/anthropic/types.js +46 -0
  309. package/src/llm/anthropic/types.js.map +1 -0
  310. package/src/llm/anthropic/types.ts +8 -2
  311. package/src/llm/anthropic/utils/message_inputs.js +627 -0
  312. package/src/llm/anthropic/utils/message_inputs.js.map +1 -0
  313. package/src/llm/anthropic/utils/message_inputs.ts +16 -33
  314. package/src/llm/anthropic/utils/message_outputs.js +290 -0
  315. package/src/llm/anthropic/utils/message_outputs.js.map +1 -0
  316. package/src/llm/anthropic/utils/message_outputs.ts +40 -1
  317. package/src/llm/anthropic/utils/output_parsers.js +89 -0
  318. package/src/llm/anthropic/utils/output_parsers.js.map +1 -0
  319. package/src/llm/anthropic/utils/tools.js +25 -0
  320. package/src/llm/anthropic/utils/tools.js.map +1 -0
  321. package/src/llm/bedrock/__tests__/bedrock-caching.test.js +392 -0
  322. package/src/llm/bedrock/__tests__/bedrock-caching.test.js.map +1 -0
  323. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +24 -40
  324. package/src/llm/bedrock/index.js +303 -0
  325. package/src/llm/bedrock/index.js.map +1 -0
  326. package/src/llm/bedrock/index.ts +171 -134
  327. package/src/llm/bedrock/llm.spec.ts +395 -52
  328. package/src/llm/bedrock/types.js +2 -0
  329. package/src/llm/bedrock/types.js.map +1 -0
  330. package/src/llm/bedrock/utils/index.js +6 -0
  331. package/src/llm/bedrock/utils/index.js.map +1 -0
  332. package/src/llm/bedrock/utils/message_inputs.js +463 -0
  333. package/src/llm/bedrock/utils/message_inputs.js.map +1 -0
  334. package/src/llm/bedrock/utils/message_inputs.ts +30 -5
  335. package/src/llm/bedrock/utils/message_outputs.js +269 -0
  336. package/src/llm/bedrock/utils/message_outputs.js.map +1 -0
  337. package/src/llm/bedrock/utils/message_outputs.ts +70 -22
  338. package/src/llm/fake.js +92 -0
  339. package/src/llm/fake.js.map +1 -0
  340. package/src/llm/google/index.js +215 -0
  341. package/src/llm/google/index.js.map +1 -0
  342. package/src/llm/google/index.ts +2 -3
  343. package/src/llm/google/types.js +12 -0
  344. package/src/llm/google/types.js.map +1 -0
  345. package/src/llm/google/utils/common.js +670 -0
  346. package/src/llm/google/utils/common.js.map +1 -0
  347. package/src/llm/google/utils/tools.js +111 -0
  348. package/src/llm/google/utils/tools.js.map +1 -0
  349. package/src/llm/google/utils/zod_to_genai_parameters.js +47 -0
  350. package/src/llm/google/utils/zod_to_genai_parameters.js.map +1 -0
  351. package/src/llm/openai/index.js +1033 -0
  352. package/src/llm/openai/index.js.map +1 -0
  353. package/src/llm/openai/types.js +2 -0
  354. package/src/llm/openai/types.js.map +1 -0
  355. package/src/llm/openai/utils/index.js +756 -0
  356. package/src/llm/openai/utils/index.js.map +1 -0
  357. package/src/llm/openai/utils/isReasoningModel.test.js +79 -0
  358. package/src/llm/openai/utils/isReasoningModel.test.js.map +1 -0
  359. package/src/llm/openrouter/index.js +261 -0
  360. package/src/llm/openrouter/index.js.map +1 -0
  361. package/src/llm/openrouter/index.ts +117 -6
  362. package/src/llm/openrouter/reasoning.test.js +181 -0
  363. package/src/llm/openrouter/reasoning.test.js.map +1 -0
  364. package/src/llm/openrouter/reasoning.test.ts +207 -0
  365. package/src/llm/providers.js +36 -0
  366. package/src/llm/providers.js.map +1 -0
  367. package/src/llm/text.js +65 -0
  368. package/src/llm/text.js.map +1 -0
  369. package/src/llm/vertexai/index.js +402 -0
  370. package/src/llm/vertexai/index.js.map +1 -0
  371. package/src/llm/vertexai/index.ts +115 -5
  372. package/src/llm/vertexai/llm.spec.ts +114 -0
  373. package/src/messages/__tests__/tools.test.js +392 -0
  374. package/src/messages/__tests__/tools.test.js.map +1 -0
  375. package/src/messages/cache.js +404 -0
  376. package/src/messages/cache.js.map +1 -0
  377. package/src/messages/cache.test.js +1167 -0
  378. package/src/messages/cache.test.js.map +1 -0
  379. package/src/messages/cache.test.ts +178 -16
  380. package/src/messages/cache.ts +152 -147
  381. package/src/messages/content.js +48 -0
  382. package/src/messages/content.js.map +1 -0
  383. package/src/messages/content.test.js +314 -0
  384. package/src/messages/content.test.js.map +1 -0
  385. package/src/messages/core.js +359 -0
  386. package/src/messages/core.js.map +1 -0
  387. package/src/messages/core.ts +5 -0
  388. package/src/messages/ensureThinkingBlock.test.js +997 -0
  389. package/src/messages/ensureThinkingBlock.test.js.map +1 -0
  390. package/src/messages/ensureThinkingBlock.test.ts +751 -10
  391. package/src/messages/format.js +973 -0
  392. package/src/messages/format.js.map +1 -0
  393. package/src/messages/format.ts +334 -57
  394. package/src/messages/formatAgentMessages.test.js +2278 -0
  395. package/src/messages/formatAgentMessages.test.js.map +1 -0
  396. package/src/messages/formatAgentMessages.test.ts +1175 -1
  397. package/src/messages/formatAgentMessages.tools.test.js +362 -0
  398. package/src/messages/formatAgentMessages.tools.test.js.map +1 -0
  399. package/src/messages/formatMessage.test.js +608 -0
  400. package/src/messages/formatMessage.test.js.map +1 -0
  401. package/src/messages/ids.js +18 -0
  402. package/src/messages/ids.js.map +1 -0
  403. package/src/messages/index.js +9 -0
  404. package/src/messages/index.js.map +1 -0
  405. package/src/messages/index.ts +1 -0
  406. package/src/messages/labelContentByAgent.test.js +725 -0
  407. package/src/messages/labelContentByAgent.test.js.map +1 -0
  408. package/src/messages/prune.js +438 -0
  409. package/src/messages/prune.js.map +1 -0
  410. package/src/messages/prune.ts +87 -25
  411. package/src/messages/reducer.js +60 -0
  412. package/src/messages/reducer.js.map +1 -0
  413. package/src/messages/shiftIndexTokenCountMap.test.js +63 -0
  414. package/src/messages/shiftIndexTokenCountMap.test.js.map +1 -0
  415. package/src/messages/summarize.js +146 -0
  416. package/src/messages/summarize.js.map +1 -0
  417. package/src/messages/summarize.test.js +332 -0
  418. package/src/messages/summarize.test.js.map +1 -0
  419. package/src/messages/summarize.test.ts +466 -0
  420. package/src/messages/summarize.ts +222 -0
  421. package/src/messages/tools.js +90 -0
  422. package/src/messages/tools.js.map +1 -0
  423. package/src/mockStream.js +81 -0
  424. package/src/mockStream.js.map +1 -0
  425. package/src/prompts/collab.js +7 -0
  426. package/src/prompts/collab.js.map +1 -0
  427. package/src/prompts/index.js +3 -0
  428. package/src/prompts/index.js.map +1 -0
  429. package/src/prompts/taskmanager.js +58 -0
  430. package/src/prompts/taskmanager.js.map +1 -0
  431. package/src/run.js +427 -0
  432. package/src/run.js.map +1 -0
  433. package/src/run.ts +101 -33
  434. package/src/schemas/index.js +3 -0
  435. package/src/schemas/index.js.map +1 -0
  436. package/src/schemas/schema-preparation.test.js +370 -0
  437. package/src/schemas/schema-preparation.test.js.map +1 -0
  438. package/src/schemas/validate.js +314 -0
  439. package/src/schemas/validate.js.map +1 -0
  440. package/src/schemas/validate.test.js +264 -0
  441. package/src/schemas/validate.test.js.map +1 -0
  442. package/src/scripts/abort.js +127 -0
  443. package/src/scripts/abort.js.map +1 -0
  444. package/src/scripts/ant_web_search.js +130 -0
  445. package/src/scripts/ant_web_search.js.map +1 -0
  446. package/src/scripts/ant_web_search.ts +1 -0
  447. package/src/scripts/ant_web_search_edge_case.js +133 -0
  448. package/src/scripts/ant_web_search_edge_case.js.map +1 -0
  449. package/src/scripts/ant_web_search_edge_case.ts +1 -0
  450. package/src/scripts/ant_web_search_error_edge_case.js +119 -0
  451. package/src/scripts/ant_web_search_error_edge_case.js.map +1 -0
  452. package/src/scripts/ant_web_search_error_edge_case.ts +1 -0
  453. package/src/scripts/args.js +41 -0
  454. package/src/scripts/args.js.map +1 -0
  455. package/src/scripts/bedrock-cache-debug.js +186 -0
  456. package/src/scripts/bedrock-cache-debug.js.map +1 -0
  457. package/src/scripts/bedrock-cache-debug.ts +250 -0
  458. package/src/scripts/bedrock-content-aggregation-test.js +195 -0
  459. package/src/scripts/bedrock-content-aggregation-test.js.map +1 -0
  460. package/src/scripts/bedrock-content-aggregation-test.ts +266 -0
  461. package/src/scripts/bedrock-merge-test.js +80 -0
  462. package/src/scripts/bedrock-merge-test.js.map +1 -0
  463. package/src/scripts/bedrock-merge-test.ts +107 -0
  464. package/src/scripts/bedrock-parallel-tools-test.js +150 -0
  465. package/src/scripts/bedrock-parallel-tools-test.js.map +1 -0
  466. package/src/scripts/bedrock-parallel-tools-test.ts +204 -0
  467. package/src/scripts/caching.js +106 -0
  468. package/src/scripts/caching.js.map +1 -0
  469. package/src/scripts/caching.ts +1 -0
  470. package/src/scripts/cli.js +152 -0
  471. package/src/scripts/cli.js.map +1 -0
  472. package/src/scripts/cli2.js +119 -0
  473. package/src/scripts/cli2.js.map +1 -0
  474. package/src/scripts/cli3.js +163 -0
  475. package/src/scripts/cli3.js.map +1 -0
  476. package/src/scripts/cli4.js +165 -0
  477. package/src/scripts/cli4.js.map +1 -0
  478. package/src/scripts/cli5.js +165 -0
  479. package/src/scripts/cli5.js.map +1 -0
  480. package/src/scripts/code_exec.js +171 -0
  481. package/src/scripts/code_exec.js.map +1 -0
  482. package/src/scripts/code_exec.ts +1 -0
  483. package/src/scripts/code_exec_files.js +180 -0
  484. package/src/scripts/code_exec_files.js.map +1 -0
  485. package/src/scripts/code_exec_files.ts +1 -0
  486. package/src/scripts/code_exec_multi_session.js +185 -0
  487. package/src/scripts/code_exec_multi_session.js.map +1 -0
  488. package/src/scripts/code_exec_multi_session.ts +9 -13
  489. package/src/scripts/code_exec_ptc.js +265 -0
  490. package/src/scripts/code_exec_ptc.js.map +1 -0
  491. package/src/scripts/code_exec_ptc.ts +1 -0
  492. package/src/scripts/code_exec_session.js +217 -0
  493. package/src/scripts/code_exec_session.js.map +1 -0
  494. package/src/scripts/code_exec_session.ts +1 -0
  495. package/src/scripts/code_exec_simple.js +120 -0
  496. package/src/scripts/code_exec_simple.js.map +1 -0
  497. package/src/scripts/code_exec_simple.ts +1 -0
  498. package/src/scripts/content.js +111 -0
  499. package/src/scripts/content.js.map +1 -0
  500. package/src/scripts/content.ts +1 -0
  501. package/src/scripts/empty_input.js +125 -0
  502. package/src/scripts/empty_input.js.map +1 -0
  503. package/src/scripts/handoff-test.js +96 -0
  504. package/src/scripts/handoff-test.js.map +1 -0
  505. package/src/scripts/image.js +138 -0
  506. package/src/scripts/image.js.map +1 -0
  507. package/src/scripts/image.ts +3 -1
  508. package/src/scripts/memory.js +83 -0
  509. package/src/scripts/memory.js.map +1 -0
  510. package/src/scripts/memory.ts +16 -6
  511. package/src/scripts/multi-agent-chain.js +271 -0
  512. package/src/scripts/multi-agent-chain.js.map +1 -0
  513. package/src/scripts/multi-agent-chain.ts +1 -0
  514. package/src/scripts/multi-agent-conditional.js +185 -0
  515. package/src/scripts/multi-agent-conditional.js.map +1 -0
  516. package/src/scripts/multi-agent-conditional.ts +1 -0
  517. package/src/scripts/multi-agent-document-review-chain.js +171 -0
  518. package/src/scripts/multi-agent-document-review-chain.js.map +1 -0
  519. package/src/scripts/multi-agent-document-review-chain.ts +1 -0
  520. package/src/scripts/multi-agent-hybrid-flow.js +264 -0
  521. package/src/scripts/multi-agent-hybrid-flow.js.map +1 -0
  522. package/src/scripts/multi-agent-hybrid-flow.ts +1 -0
  523. package/src/scripts/multi-agent-parallel-start.js +214 -0
  524. package/src/scripts/multi-agent-parallel-start.js.map +1 -0
  525. package/src/scripts/multi-agent-parallel-start.ts +4 -4
  526. package/src/scripts/multi-agent-parallel.js +346 -0
  527. package/src/scripts/multi-agent-parallel.js.map +1 -0
  528. package/src/scripts/multi-agent-parallel.ts +1 -0
  529. package/src/scripts/multi-agent-sequence.js +184 -0
  530. package/src/scripts/multi-agent-sequence.js.map +1 -0
  531. package/src/scripts/multi-agent-sequence.ts +4 -4
  532. package/src/scripts/multi-agent-supervisor.js +324 -0
  533. package/src/scripts/multi-agent-supervisor.js.map +1 -0
  534. package/src/scripts/multi-agent-supervisor.ts +1 -0
  535. package/src/scripts/multi-agent-test.js +147 -0
  536. package/src/scripts/multi-agent-test.js.map +1 -0
  537. package/src/scripts/multi-agent-test.ts +1 -0
  538. package/src/scripts/parallel-asymmetric-tools-test.js +202 -0
  539. package/src/scripts/parallel-asymmetric-tools-test.js.map +1 -0
  540. package/src/scripts/parallel-asymmetric-tools-test.ts +1 -0
  541. package/src/scripts/parallel-full-metadata-test.js +176 -0
  542. package/src/scripts/parallel-full-metadata-test.js.map +1 -0
  543. package/src/scripts/parallel-full-metadata-test.ts +1 -0
  544. package/src/scripts/parallel-tools-test.js +256 -0
  545. package/src/scripts/parallel-tools-test.js.map +1 -0
  546. package/src/scripts/parallel-tools-test.ts +1 -0
  547. package/src/scripts/poc-multi-agent-comprehensive.ts +1222 -0
  548. package/src/scripts/programmatic_exec.js +277 -0
  549. package/src/scripts/programmatic_exec.js.map +1 -0
  550. package/src/scripts/programmatic_exec_agent.js +168 -0
  551. package/src/scripts/programmatic_exec_agent.js.map +1 -0
  552. package/src/scripts/programmatic_exec_agent.ts +1 -0
  553. package/src/scripts/search.js +118 -0
  554. package/src/scripts/search.js.map +1 -0
  555. package/src/scripts/search.ts +1 -0
  556. package/src/scripts/sequential-full-metadata-test.js +143 -0
  557. package/src/scripts/sequential-full-metadata-test.js.map +1 -0
  558. package/src/scripts/sequential-full-metadata-test.ts +1 -0
  559. package/src/scripts/simple.js +174 -0
  560. package/src/scripts/simple.js.map +1 -0
  561. package/src/scripts/simple.ts +2 -1
  562. package/src/scripts/single-agent-metadata-test.js +152 -0
  563. package/src/scripts/single-agent-metadata-test.js.map +1 -0
  564. package/src/scripts/single-agent-metadata-test.ts +4 -6
  565. package/src/scripts/stream.js +113 -0
  566. package/src/scripts/stream.js.map +1 -0
  567. package/src/scripts/stream.ts +1 -0
  568. package/src/scripts/test-custom-prompt-key.js +132 -0
  569. package/src/scripts/test-custom-prompt-key.js.map +1 -0
  570. package/src/scripts/test-handoff-input.js +143 -0
  571. package/src/scripts/test-handoff-input.js.map +1 -0
  572. package/src/scripts/test-handoff-preamble.js +227 -0
  573. package/src/scripts/test-handoff-preamble.js.map +1 -0
  574. package/src/scripts/test-handoff-preamble.ts +1 -0
  575. package/src/scripts/test-handoff-steering.js +353 -0
  576. package/src/scripts/test-handoff-steering.js.map +1 -0
  577. package/src/scripts/test-handoff-steering.ts +430 -0
  578. package/src/scripts/test-multi-agent-list-handoff.js +318 -0
  579. package/src/scripts/test-multi-agent-list-handoff.js.map +1 -0
  580. package/src/scripts/test-multi-agent-list-handoff.ts +1 -0
  581. package/src/scripts/test-parallel-agent-labeling.js +253 -0
  582. package/src/scripts/test-parallel-agent-labeling.js.map +1 -0
  583. package/src/scripts/test-parallel-agent-labeling.ts +2 -0
  584. package/src/scripts/test-parallel-handoffs.js +229 -0
  585. package/src/scripts/test-parallel-handoffs.js.map +1 -0
  586. package/src/scripts/test-parallel-handoffs.ts +1 -0
  587. package/src/scripts/test-thinking-handoff-bedrock.js +132 -0
  588. package/src/scripts/test-thinking-handoff-bedrock.js.map +1 -0
  589. package/src/scripts/test-thinking-handoff-bedrock.ts +1 -0
  590. package/src/scripts/test-thinking-handoff.js +132 -0
  591. package/src/scripts/test-thinking-handoff.js.map +1 -0
  592. package/src/scripts/test-thinking-handoff.ts +1 -0
  593. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js +140 -0
  594. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js.map +1 -0
  595. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +166 -0
  596. package/src/scripts/test-tool-before-handoff-role-order.js +223 -0
  597. package/src/scripts/test-tool-before-handoff-role-order.js.map +1 -0
  598. package/src/scripts/test-tool-before-handoff-role-order.ts +276 -0
  599. package/src/scripts/test-tools-before-handoff.js +187 -0
  600. package/src/scripts/test-tools-before-handoff.js.map +1 -0
  601. package/src/scripts/test-tools-before-handoff.ts +4 -8
  602. package/src/scripts/test_code_api.js +263 -0
  603. package/src/scripts/test_code_api.js.map +1 -0
  604. package/src/scripts/thinking-bedrock.js +128 -0
  605. package/src/scripts/thinking-bedrock.js.map +1 -0
  606. package/src/scripts/thinking-bedrock.ts +1 -0
  607. package/src/scripts/thinking-vertexai.js +130 -0
  608. package/src/scripts/thinking-vertexai.js.map +1 -0
  609. package/src/scripts/thinking-vertexai.ts +168 -0
  610. package/src/scripts/thinking.js +134 -0
  611. package/src/scripts/thinking.js.map +1 -0
  612. package/src/scripts/thinking.ts +1 -0
  613. package/src/scripts/tool_search.js +114 -0
  614. package/src/scripts/tool_search.js.map +1 -0
  615. package/src/scripts/tools.js +125 -0
  616. package/src/scripts/tools.js.map +1 -0
  617. package/src/scripts/tools.ts +5 -19
  618. package/src/specs/agent-handoffs-bedrock.integration.test.js +280 -0
  619. package/src/specs/agent-handoffs-bedrock.integration.test.js.map +1 -0
  620. package/src/specs/agent-handoffs-bedrock.integration.test.ts +412 -375
  621. package/src/specs/agent-handoffs.test.js +924 -0
  622. package/src/specs/agent-handoffs.test.js.map +1 -0
  623. package/src/specs/agent-handoffs.test.ts +152 -39
  624. package/src/specs/anthropic.simple.test.js +287 -0
  625. package/src/specs/anthropic.simple.test.js.map +1 -0
  626. package/src/specs/anthropic.simple.test.ts +7 -4
  627. package/src/specs/azure.simple.test.js +381 -0
  628. package/src/specs/azure.simple.test.js.map +1 -0
  629. package/src/specs/azure.simple.test.ts +143 -5
  630. package/src/specs/cache.simple.test.js +282 -0
  631. package/src/specs/cache.simple.test.js.map +1 -0
  632. package/src/specs/cache.simple.test.ts +9 -2
  633. package/src/specs/custom-event-await.test.js +148 -0
  634. package/src/specs/custom-event-await.test.js.map +1 -0
  635. package/src/specs/custom-event-await.test.ts +215 -0
  636. package/src/specs/deepseek.simple.test.js +189 -0
  637. package/src/specs/deepseek.simple.test.js.map +1 -0
  638. package/src/specs/deepseek.simple.test.ts +4 -2
  639. package/src/specs/emergency-prune.test.js +308 -0
  640. package/src/specs/emergency-prune.test.js.map +1 -0
  641. package/src/specs/moonshot.simple.test.js +237 -0
  642. package/src/specs/moonshot.simple.test.js.map +1 -0
  643. package/src/specs/moonshot.simple.test.ts +6 -2
  644. package/src/specs/observability.integration.test.js +1337 -0
  645. package/src/specs/observability.integration.test.js.map +1 -0
  646. package/src/specs/observability.integration.test.ts +2223 -0
  647. package/src/specs/openai.simple.test.js +233 -0
  648. package/src/specs/openai.simple.test.js.map +1 -0
  649. package/src/specs/openai.simple.test.ts +4 -2
  650. package/src/specs/openrouter.simple.test.js +202 -0
  651. package/src/specs/openrouter.simple.test.js.map +1 -0
  652. package/src/specs/openrouter.simple.test.ts +165 -4
  653. package/src/specs/prune.test.js +733 -0
  654. package/src/specs/prune.test.js.map +1 -0
  655. package/src/specs/prune.test.ts +1 -0
  656. package/src/specs/reasoning.test.js +144 -0
  657. package/src/specs/reasoning.test.js.map +1 -0
  658. package/src/specs/reasoning.test.ts +2 -2
  659. package/src/specs/spec.utils.js +4 -0
  660. package/src/specs/spec.utils.js.map +1 -0
  661. package/src/specs/thinking-handoff.test.js +486 -0
  662. package/src/specs/thinking-handoff.test.js.map +1 -0
  663. package/src/specs/thinking-handoff.test.ts +3 -2
  664. package/src/specs/thinking-prune.test.js +600 -0
  665. package/src/specs/thinking-prune.test.js.map +1 -0
  666. package/src/specs/token-distribution-edge-case.test.js +246 -0
  667. package/src/specs/token-distribution-edge-case.test.js.map +1 -0
  668. package/src/specs/token-memoization.test.js +32 -0
  669. package/src/specs/token-memoization.test.js.map +1 -0
  670. package/src/specs/token-memoization.test.ts +14 -5
  671. package/src/specs/tokens.test.js +49 -0
  672. package/src/specs/tokens.test.js.map +1 -0
  673. package/src/specs/tokens.test.ts +64 -0
  674. package/src/specs/tool-error.test.js +139 -0
  675. package/src/specs/tool-error.test.js.map +1 -0
  676. package/src/specs/tool-error.test.ts +2 -2
  677. package/src/splitStream.js +204 -0
  678. package/src/splitStream.js.map +1 -0
  679. package/src/splitStream.test.js +504 -0
  680. package/src/splitStream.test.js.map +1 -0
  681. package/src/stream.js +650 -0
  682. package/src/stream.js.map +1 -0
  683. package/src/stream.test.js +225 -0
  684. package/src/stream.test.js.map +1 -0
  685. package/src/stream.test.ts +25 -15
  686. package/src/stream.ts +82 -32
  687. package/src/test/mockTools.js +340 -0
  688. package/src/test/mockTools.js.map +1 -0
  689. package/src/tools/AskUser.ts +159 -0
  690. package/src/tools/BrowserTools.js +245 -0
  691. package/src/tools/BrowserTools.js.map +1 -0
  692. package/src/tools/BrowserTools.ts +12 -8
  693. package/src/tools/Calculator.js +38 -0
  694. package/src/tools/Calculator.js.map +1 -0
  695. package/src/tools/Calculator.test.js +225 -0
  696. package/src/tools/Calculator.test.js.map +1 -0
  697. package/src/tools/CodeExecutor.js +233 -0
  698. package/src/tools/CodeExecutor.js.map +1 -0
  699. package/src/tools/CodeExecutor.selfhealing.test.ts +435 -0
  700. package/src/tools/CodeExecutor.ts +62 -4
  701. package/src/tools/ProgrammaticToolCalling.js +602 -0
  702. package/src/tools/ProgrammaticToolCalling.js.map +1 -0
  703. package/src/tools/ProgrammaticToolCalling.ts +40 -52
  704. package/src/tools/StreamingToolCallBuffer.js +179 -0
  705. package/src/tools/StreamingToolCallBuffer.js.map +1 -0
  706. package/src/tools/StreamingToolCallBuffer.ts +218 -0
  707. package/src/tools/ToolNode.js +930 -0
  708. package/src/tools/ToolNode.js.map +1 -0
  709. package/src/tools/ToolNode.ts +454 -41
  710. package/src/tools/ToolSearch.js +904 -0
  711. package/src/tools/ToolSearch.js.map +1 -0
  712. package/src/tools/ToolSearch.ts +84 -33
  713. package/src/tools/__tests__/AskUser.test.ts +537 -0
  714. package/src/tools/__tests__/BrowserTools.test.js +306 -0
  715. package/src/tools/__tests__/BrowserTools.test.js.map +1 -0
  716. package/src/tools/__tests__/BrowserTools.test.ts +131 -6
  717. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js +276 -0
  718. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js.map +1 -0
  719. package/src/tools/__tests__/ProgrammaticToolCalling.test.js +807 -0
  720. package/src/tools/__tests__/ProgrammaticToolCalling.test.js.map +1 -0
  721. package/src/tools/__tests__/StreamingToolCallBuffer.test.js +175 -0
  722. package/src/tools/__tests__/StreamingToolCallBuffer.test.js.map +1 -0
  723. package/src/tools/__tests__/StreamingToolCallBuffer.test.ts +263 -0
  724. package/src/tools/__tests__/ToolApproval.test.js +675 -0
  725. package/src/tools/__tests__/ToolApproval.test.js.map +1 -0
  726. package/src/tools/__tests__/ToolApproval.test.ts +194 -20
  727. package/src/tools/__tests__/ToolNode.hitl.test.ts +267 -0
  728. package/src/tools/__tests__/ToolNode.recovery.test.js +200 -0
  729. package/src/tools/__tests__/ToolNode.recovery.test.js.map +1 -0
  730. package/src/tools/__tests__/ToolNode.recovery.test.ts +276 -0
  731. package/src/tools/__tests__/ToolNode.session.test.js +319 -0
  732. package/src/tools/__tests__/ToolNode.session.test.js.map +1 -0
  733. package/src/tools/__tests__/ToolNode.session.test.ts +465 -0
  734. package/src/tools/__tests__/ToolSearch.integration.test.js +125 -0
  735. package/src/tools/__tests__/ToolSearch.integration.test.js.map +1 -0
  736. package/src/tools/__tests__/ToolSearch.test.js +812 -0
  737. package/src/tools/__tests__/ToolSearch.test.js.map +1 -0
  738. package/src/tools/__tests__/ToolSearch.test.ts +78 -5
  739. package/src/tools/__tests__/handlers.test.js +799 -0
  740. package/src/tools/__tests__/handlers.test.js.map +1 -0
  741. package/src/tools/__tests__/handlers.test.ts +1100 -0
  742. package/src/tools/__tests__/truncation-recovery.integration.test.js +362 -0
  743. package/src/tools/__tests__/truncation-recovery.integration.test.js.map +1 -0
  744. package/src/tools/__tests__/truncation-recovery.integration.test.ts +560 -0
  745. package/src/tools/handlers.js +306 -0
  746. package/src/tools/handlers.js.map +1 -0
  747. package/src/tools/handlers.ts +119 -16
  748. package/src/tools/schema.js +25 -0
  749. package/src/tools/schema.js.map +1 -0
  750. package/src/tools/search/anthropic.js +34 -0
  751. package/src/tools/search/anthropic.js.map +1 -0
  752. package/src/tools/search/content.js +116 -0
  753. package/src/tools/search/content.js.map +1 -0
  754. package/src/tools/search/content.test.js +133 -0
  755. package/src/tools/search/content.test.js.map +1 -0
  756. package/src/tools/search/firecrawl.js +173 -0
  757. package/src/tools/search/firecrawl.js.map +1 -0
  758. package/src/tools/search/format.js +198 -0
  759. package/src/tools/search/format.js.map +1 -0
  760. package/src/tools/search/highlights.js +241 -0
  761. package/src/tools/search/highlights.js.map +1 -0
  762. package/src/tools/search/index.js +3 -0
  763. package/src/tools/search/index.js.map +1 -0
  764. package/src/tools/search/jina-reranker.test.js +106 -0
  765. package/src/tools/search/jina-reranker.test.js.map +1 -0
  766. package/src/tools/search/rerankers.js +165 -0
  767. package/src/tools/search/rerankers.js.map +1 -0
  768. package/src/tools/search/schema.js +102 -0
  769. package/src/tools/search/schema.js.map +1 -0
  770. package/src/tools/search/search.js +561 -0
  771. package/src/tools/search/search.js.map +1 -0
  772. package/src/tools/search/serper-scraper.js +126 -0
  773. package/src/tools/search/serper-scraper.js.map +1 -0
  774. package/src/tools/search/test.js +129 -0
  775. package/src/tools/search/test.js.map +1 -0
  776. package/src/tools/search/tool.js +453 -0
  777. package/src/tools/search/tool.js.map +1 -0
  778. package/src/tools/search/types.js +2 -0
  779. package/src/tools/search/types.js.map +1 -0
  780. package/src/tools/search/utils.js +59 -0
  781. package/src/tools/search/utils.js.map +1 -0
  782. package/src/types/graph.js +24 -0
  783. package/src/types/graph.js.map +1 -0
  784. package/src/types/graph.test.js +192 -0
  785. package/src/types/graph.test.js.map +1 -0
  786. package/src/types/graph.ts +26 -6
  787. package/src/types/index.js +7 -0
  788. package/src/types/index.js.map +1 -0
  789. package/src/types/llm.js +2 -0
  790. package/src/types/llm.js.map +1 -0
  791. package/src/types/llm.ts +8 -3
  792. package/src/types/messages.js +2 -0
  793. package/src/types/messages.js.map +1 -0
  794. package/src/types/run.js +2 -0
  795. package/src/types/run.js.map +1 -0
  796. package/src/types/run.ts +2 -0
  797. package/src/types/stream.js +2 -0
  798. package/src/types/stream.js.map +1 -0
  799. package/src/types/tools.js +2 -0
  800. package/src/types/tools.js.map +1 -0
  801. package/src/types/tools.ts +21 -2
  802. package/src/utils/contextAnalytics.js +79 -0
  803. package/src/utils/contextAnalytics.js.map +1 -0
  804. package/src/utils/contextAnalytics.test.js +166 -0
  805. package/src/utils/contextAnalytics.test.js.map +1 -0
  806. package/src/utils/contextAnalytics.test.ts +222 -0
  807. package/src/utils/contextAnalytics.ts +27 -9
  808. package/src/utils/events.js +26 -0
  809. package/src/utils/events.js.map +1 -0
  810. package/src/utils/graph.js +11 -0
  811. package/src/utils/graph.js.map +1 -0
  812. package/src/utils/handlers.js +65 -0
  813. package/src/utils/handlers.js.map +1 -0
  814. package/src/utils/index.js +10 -0
  815. package/src/utils/index.js.map +1 -0
  816. package/src/utils/index.ts +1 -0
  817. package/src/utils/llm.js +21 -0
  818. package/src/utils/llm.js.map +1 -0
  819. package/src/utils/llmConfig.js +205 -0
  820. package/src/utils/llmConfig.js.map +1 -0
  821. package/src/utils/llmConfig.ts +5 -5
  822. package/src/utils/logging.js +37 -0
  823. package/src/utils/logging.js.map +1 -0
  824. package/src/utils/misc.js +51 -0
  825. package/src/utils/misc.js.map +1 -0
  826. package/src/utils/run.js +69 -0
  827. package/src/utils/run.js.map +1 -0
  828. package/src/utils/run.ts +108 -106
  829. package/src/utils/schema.js +21 -0
  830. package/src/utils/schema.js.map +1 -0
  831. package/src/utils/title.js +119 -0
  832. package/src/utils/title.js.map +1 -0
  833. package/src/utils/tokens.js +92 -0
  834. package/src/utils/tokens.js.map +1 -0
  835. package/src/utils/tokens.ts +118 -142
  836. package/src/utils/toolCallContinuation.ts +55 -0
  837. package/src/utils/toonFormat.js +379 -0
  838. package/src/utils/toonFormat.js.map +1 -0
@@ -48,7 +48,7 @@ function extractStringContent(content: unknown): string {
48
48
  for (const block of content) {
49
49
  if (typeof block === 'string') {
50
50
  textParts.push(block);
51
- } else if (block && typeof block === 'object') {
51
+ } else if (block != null && typeof block === 'object') {
52
52
  // Handle {type: 'text', text: '...'} format
53
53
  const obj = block as Record<string, unknown>;
54
54
  if (obj.type === 'text' && typeof obj.text === 'string') {
@@ -77,6 +77,8 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
77
77
  toolCallStepIds?: Map<string, string>;
78
78
  errorHandler?: t.ToolNodeConstructorParams['errorHandler'];
79
79
  private toolUsageCount: Map<string, number>;
80
+ /** Maps toolCallId → turn captured in runTool, used by handleRunToolCompletions */
81
+ private toolCallTurns: Map<string, number> = new Map();
80
82
  /** Tool registry for filtering (lazy computation of programmatic maps) */
81
83
  private toolRegistry?: t.LCToolRegistry;
82
84
  /** Cached programmatic tools (computed once on first PTC call) */
@@ -85,12 +87,14 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
85
87
  private sessions?: t.ToolSessionMap;
86
88
  /** When true, dispatches ON_TOOL_EXECUTE events instead of invoking tools directly */
87
89
  private eventDrivenMode: boolean = false;
88
- /** Tool definitions for event-driven mode */
89
- private toolDefinitions?: Map<string, t.LCTool>;
90
90
  /** Agent ID for event-driven mode */
91
91
  private agentId?: string;
92
+ /** Tool names that bypass event dispatch and execute directly (e.g., graph-managed handoff tools) */
93
+ private directToolNames?: Set<string>;
92
94
  /** HITL tool approval configuration */
93
95
  private toolApprovalConfig?: t.ToolApprovalConfig;
96
+ /** Buffer for recovering truncated tool call arguments from streaming data */
97
+ private streamingToolCallBuffer?: import('@/tools/StreamingToolCallBuffer').StreamingToolCallBuffer;
94
98
 
95
99
  constructor({
96
100
  tools,
@@ -104,8 +108,9 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
104
108
  toolRegistry,
105
109
  sessions,
106
110
  eventDrivenMode,
107
- toolDefinitions,
108
111
  agentId,
112
+ directToolNames,
113
+ streamingToolCallBuffer,
109
114
  toolApprovalConfig,
110
115
  }: t.ToolNodeConstructorParams) {
111
116
  super({ name, tags, func: (input, config) => this.run(input, config) });
@@ -118,8 +123,9 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
118
123
  this.toolRegistry = toolRegistry;
119
124
  this.sessions = sessions;
120
125
  this.eventDrivenMode = eventDrivenMode ?? false;
121
- this.toolDefinitions = toolDefinitions;
122
126
  this.agentId = agentId;
127
+ this.directToolNames = directToolNames;
128
+ this.streamingToolCallBuffer = streamingToolCallBuffer;
123
129
  this.toolApprovalConfig = toolApprovalConfig;
124
130
  }
125
131
 
@@ -162,15 +168,25 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
162
168
  * Returns true if approval is needed, false otherwise.
163
169
  * Does NOT perform the actual approval flow - that's handled by requestApproval().
164
170
  */
165
- private requiresApproval(toolName: string, args: Record<string, unknown>): boolean {
171
+ private requiresApproval(
172
+ toolName: string,
173
+ args: Record<string, unknown>
174
+ ): boolean {
166
175
  if (!this.toolApprovalConfig) {
167
176
  return false;
168
177
  }
169
178
 
170
- const { defaultPolicy, overrides, executionContext } = this.toolApprovalConfig;
179
+ const { defaultPolicy, overrides, executionContext } =
180
+ this.toolApprovalConfig;
171
181
 
172
- // Scheduled executions bypass all approval checks
173
- if (executionContext === 'scheduled') {
182
+ // Scheduled and browser executions bypass all approval checks
183
+ if (executionContext === 'scheduled' || executionContext === 'browser') {
184
+ return false;
185
+ }
186
+
187
+ // Graph-managed tools (handoff/transfer tools) bypass HITL approval —
188
+ // these are internal routing mechanisms, not user-facing tool executions
189
+ if (this.directToolNames?.has(toolName)) {
174
190
  return false;
175
191
  }
176
192
 
@@ -241,9 +257,21 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
241
257
  }
242
258
  const turn = this.toolUsageCount.get(call.name) ?? 0;
243
259
  this.toolUsageCount.set(call.name, turn + 1);
244
- const args = call.args;
260
+ if (call.id != null && call.id !== '') {
261
+ this.toolCallTurns.set(call.id, turn);
262
+ }
263
+ let args = call.args;
245
264
  const stepId = this.toolCallStepIds?.get(call.id!);
246
265
 
266
+ // Recover truncated tool call arguments from the streaming buffer.
267
+ // When max_tokens truncates a tool call mid-JSON, parsePartialJson may lose
268
+ // content that was already streamed to the UI. The buffer has the raw accumulated
269
+ // arg string, so we can extract field values that were dropped.
270
+ if (call.id && this.streamingToolCallBuffer?.has(call.id)) {
271
+ args = this.recoverTruncatedArgs(call.name, call.id, args);
272
+ this.streamingToolCallBuffer.clear(call.id);
273
+ }
274
+
247
275
  // Build invoke params - LangChain extracts non-schema fields to config.toolCall
248
276
  let invokeParams: Record<string, unknown> = {
249
277
  ...call,
@@ -273,6 +301,9 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
273
301
  * Each file uses its own session_id (supporting multi-session file tracking).
274
302
  * Both session_id and _injected_files are injected directly to invokeParams
275
303
  * (not inside args) so they bypass Zod schema validation and reach config.toolCall.
304
+ *
305
+ * session_id is always injected when available (even without tracked files)
306
+ * so the CodeExecutor can fall back to the /files endpoint for session continuity.
276
307
  */
277
308
  if (
278
309
  call.name === Constants.EXECUTE_CODE ||
@@ -281,7 +312,7 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
281
312
  const codeSession = this.sessions?.get(Constants.EXECUTE_CODE) as
282
313
  | t.CodeSessionContext
283
314
  | undefined;
284
- if (codeSession?.session_id) {
315
+ if (codeSession != null && codeSession.session_id !== '') {
285
316
  /**
286
317
  * Always inject session_id so retries reuse the same workspace.
287
318
  * Also inject file refs when files exist from previous executions.
@@ -315,20 +346,25 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
315
346
  // Uses event-driven pattern: dispatches ON_TOOL_APPROVAL_REQUIRED event
316
347
  // and waits for the host to resolve/reject with a ToolApprovalResponse.
317
348
  // ========================================================================
318
- if (this.requiresApproval(call.name, call.args as Record<string, unknown>)) {
349
+ if (
350
+ this.requiresApproval(call.name, call.args as Record<string, unknown>)
351
+ ) {
319
352
  const approvalResponse = await this.requestApproval(call, config);
320
353
  if (!approvalResponse.approved) {
321
354
  // Human denied the tool call - return a denial message
322
355
  return new ToolMessage({
323
356
  status: 'error',
324
- content: `Tool call "${call.name}" was denied by the user.${approvalResponse.feedback ? ` Reason: ${approvalResponse.feedback}` : ''} Please acknowledge the denial and proceed without executing this tool.`,
357
+ content: `Tool call "${call.name}" was denied by the user.${approvalResponse.feedback != null && approvalResponse.feedback !== '' ? ` Reason: ${approvalResponse.feedback}` : ''} Please acknowledge the denial and proceed without executing this tool.`,
325
358
  name: call.name,
326
359
  tool_call_id: call.id ?? '',
327
360
  });
328
361
  }
329
362
  // Human approved - optionally use modified args
330
363
  if (approvalResponse.modifiedArgs) {
331
- invokeParams = { ...invokeParams, args: approvalResponse.modifiedArgs };
364
+ invokeParams = {
365
+ ...invokeParams,
366
+ args: approvalResponse.modifiedArgs,
367
+ };
332
368
  }
333
369
  }
334
370
 
@@ -419,13 +455,13 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
419
455
  handlerError:
420
456
  handlerError instanceof Error
421
457
  ? {
422
- message: handlerError.message,
423
- stack: handlerError.stack ?? undefined,
424
- }
458
+ message: handlerError.message,
459
+ stack: handlerError.stack ?? undefined,
460
+ }
425
461
  : {
426
- message: String(handlerError),
427
- stack: undefined,
428
- },
462
+ message: String(handlerError),
463
+ stack: undefined,
464
+ },
429
465
  });
430
466
  }
431
467
  }
@@ -439,25 +475,350 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
439
475
  }
440
476
 
441
477
  /**
442
- * Execute all tool calls via ON_TOOL_EXECUTE event dispatch.
443
- * Used in event-driven mode where the host handles actual tool execution.
478
+ * Recover truncated tool call arguments using the raw streaming buffer.
479
+ *
480
+ * When parsePartialJson drops content (e.g., a large "content" field truncated
481
+ * at max_tokens), this method extracts the field value from the raw accumulated
482
+ * arg string and merges it back into the parsed args object.
483
+ *
484
+ * This is generic — it checks ALL string fields in the raw buffer, not just
485
+ * content_tool fields. Any tool with a truncated string value benefits.
444
486
  */
445
- private async executeViaEvent(
487
+ /**
488
+ * Recover truncated tool call arguments using the raw streaming buffer.
489
+ *
490
+ * Strategy:
491
+ * 1. If args are completely empty → try parsePartialJson on the raw buffer
492
+ * 2. Otherwise → field-level recovery: extract missing fields from raw buffer
493
+ *
494
+ * @param toolName - Tool name (for logging)
495
+ * @param toolCallId - The tool call ID
496
+ * @param args - The parsed args (potentially incomplete from parsePartialJson)
497
+ * @returns The args with recovered fields merged in
498
+ */
499
+
500
+ /* eslint-disable @typescript-eslint/no-explicit-any */
501
+ private recoverTruncatedArgs(
502
+ toolName: string,
503
+ toolCallId: string,
504
+ args: any
505
+ ): any {
506
+ /* eslint-enable @typescript-eslint/no-explicit-any */
507
+ if (!this.streamingToolCallBuffer) return args;
508
+
509
+ const rawArgs = this.streamingToolCallBuffer.getRawArgs(toolCallId);
510
+ if (!rawArgs) return args;
511
+
512
+ const rawLen = rawArgs.length;
513
+
514
+ // If args is completely empty (JSON parsing aborted before any key),
515
+ // attempt to parse the raw accumulated string
516
+ if (
517
+ args == null ||
518
+ (typeof args === 'object' && Object.keys(args).length === 0)
519
+ ) {
520
+ try {
521
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
522
+ const { parsePartialJson } = require('@langchain/core/utils/json');
523
+ const recovered = parsePartialJson(rawArgs);
524
+ if (
525
+ recovered != null &&
526
+ typeof recovered === 'object' &&
527
+ Object.keys(recovered).length > 0
528
+ ) {
529
+ // eslint-disable-next-line no-console
530
+ console.warn(
531
+ `[TruncationRecovery] Tool=${toolName}, callId=${toolCallId}, rawBufferLen=${rawLen}, ` +
532
+ `parsedFields=[], recoveredFields=[${Object.keys(recovered).join(',')}] (full parse)`
533
+ );
534
+ return recovered;
535
+ }
536
+ } catch {
537
+ // parsePartialJson failed — fall through to field-level extraction
538
+ }
539
+ }
540
+
541
+ // Field-level recovery: extract missing fields from the raw buffer
542
+ const parsedArgs = typeof args === 'object' ? { ...args } : {};
543
+ const recoveredFields: string[] = [];
544
+
545
+ // Extract field names from the raw JSON string
546
+ const fieldPattern = /"([^"]+)"\s*:/g;
547
+ let match;
548
+ const rawFieldNames: string[] = [];
549
+ while ((match = fieldPattern.exec(rawArgs)) !== null) {
550
+ rawFieldNames.push(match[1]);
551
+ }
552
+
553
+ for (const fieldName of rawFieldNames) {
554
+ if (
555
+ parsedArgs[fieldName] == null ||
556
+ parsedArgs[fieldName] === '' ||
557
+ parsedArgs[fieldName] === undefined
558
+ ) {
559
+ const rawValue = this.streamingToolCallBuffer.extractFieldValue(
560
+ toolCallId,
561
+ fieldName
562
+ );
563
+ if (rawValue != null && rawValue !== '') {
564
+ parsedArgs[fieldName] = rawValue;
565
+ recoveredFields.push(fieldName);
566
+ }
567
+ }
568
+ }
569
+
570
+ if (recoveredFields.length > 0) {
571
+ // eslint-disable-next-line no-console
572
+ console.warn(
573
+ `[TruncationRecovery] Tool=${toolName}, callId=${toolCallId}, rawBufferLen=${rawLen}, ` +
574
+ `parsedFields=[${Object.keys(args ?? {}).join(',')}], recoveredFields=[${recoveredFields.join(',')}]`
575
+ );
576
+ }
577
+
578
+ return parsedArgs;
579
+ }
580
+
581
+ /**
582
+ * Builds code session context for injection into event-driven tool calls.
583
+ * Mirrors the session injection logic in runTool() for direct execution.
584
+ */
585
+ private getCodeSessionContext(): t.ToolCallRequest['codeSessionContext'] {
586
+ if (!this.sessions) {
587
+ return undefined;
588
+ }
589
+
590
+ const codeSession = this.sessions.get(Constants.EXECUTE_CODE) as
591
+ | t.CodeSessionContext
592
+ | undefined;
593
+ if (!codeSession) {
594
+ return undefined;
595
+ }
596
+
597
+ const context: NonNullable<t.ToolCallRequest['codeSessionContext']> = {
598
+ session_id: codeSession.session_id,
599
+ };
600
+
601
+ if (codeSession.files && codeSession.files.length > 0) {
602
+ context.files = codeSession.files.map((file) => ({
603
+ session_id: file.session_id ?? codeSession.session_id,
604
+ id: file.id,
605
+ name: file.name,
606
+ }));
607
+ }
608
+
609
+ return context;
610
+ }
611
+
612
+ /**
613
+ * Extracts code execution session context from tool results and stores in Graph.sessions.
614
+ * Mirrors the session storage logic in handleRunToolCompletions for direct execution.
615
+ */
616
+ private storeCodeSessionFromResults(
617
+ results: t.ToolExecuteResult[],
618
+ requests: t.ToolCallRequest[]
619
+ ): void {
620
+ if (!this.sessions) {
621
+ return;
622
+ }
623
+
624
+ for (let i = 0; i < results.length; i++) {
625
+ const result = results[i];
626
+ if (result.status !== 'success' || result.artifact == null) {
627
+ continue;
628
+ }
629
+
630
+ const request = requests.find((r) => r.id === result.toolCallId);
631
+ if (
632
+ request?.name !== Constants.EXECUTE_CODE &&
633
+ request?.name !== Constants.PROGRAMMATIC_TOOL_CALLING
634
+ ) {
635
+ continue;
636
+ }
637
+
638
+ const artifact = result.artifact as t.CodeExecutionArtifact | undefined;
639
+ if (artifact?.session_id == null || artifact.session_id === '') {
640
+ continue;
641
+ }
642
+
643
+ const newFiles = artifact.files ?? [];
644
+ const existingSession = this.sessions.get(Constants.EXECUTE_CODE) as
645
+ | t.CodeSessionContext
646
+ | undefined;
647
+ const existingFiles = existingSession?.files ?? [];
648
+
649
+ if (newFiles.length > 0) {
650
+ const filesWithSession: t.FileRefs = newFiles.map((file) => ({
651
+ ...file,
652
+ session_id: artifact.session_id,
653
+ }));
654
+
655
+ const newFileNames = new Set(filesWithSession.map((f) => f.name));
656
+ const filteredExisting = existingFiles.filter(
657
+ (f) => !newFileNames.has(f.name)
658
+ );
659
+
660
+ this.sessions.set(Constants.EXECUTE_CODE, {
661
+ session_id: artifact.session_id,
662
+ files: [...filteredExisting, ...filesWithSession],
663
+ lastUpdated: Date.now(),
664
+ });
665
+ } else {
666
+ this.sessions.set(Constants.EXECUTE_CODE, {
667
+ session_id: artifact.session_id,
668
+ files: existingFiles,
669
+ lastUpdated: Date.now(),
670
+ });
671
+ }
672
+ }
673
+ }
674
+
675
+ /**
676
+ * Post-processes standard runTool outputs: dispatches ON_RUN_STEP_COMPLETED
677
+ * and stores code session context. Mirrors the completion handling in
678
+ * dispatchToolEvents for the event-driven path.
679
+ *
680
+ * By handling completions here in graph context (rather than in the
681
+ * stream consumer via ToolEndHandler), the race between the stream
682
+ * consumer and graph execution is eliminated.
683
+ */
684
+ private handleRunToolCompletions(
685
+ calls: ToolCall[],
686
+ outputs: (BaseMessage | Command)[],
687
+ config: RunnableConfig
688
+ ): void {
689
+ for (let i = 0; i < calls.length; i++) {
690
+ const call = calls[i];
691
+ const output = outputs[i];
692
+ const turn = this.toolCallTurns.get(call.id!) ?? 0;
693
+
694
+ if (isCommand(output)) {
695
+ continue;
696
+ }
697
+
698
+ const toolMessage = output as ToolMessage;
699
+ const toolCallId = call.id ?? '';
700
+
701
+ // Skip error ToolMessages when errorHandler already dispatched ON_RUN_STEP_COMPLETED
702
+ // via handleToolCallErrorStatic. Without this check, errors would be double-dispatched.
703
+ if (toolMessage.status === 'error' && this.errorHandler != null) {
704
+ continue;
705
+ }
706
+
707
+ // Store code session context from tool results
708
+ if (
709
+ this.sessions &&
710
+ (call.name === Constants.EXECUTE_CODE ||
711
+ call.name === Constants.PROGRAMMATIC_TOOL_CALLING)
712
+ ) {
713
+ const artifact = toolMessage.artifact as
714
+ | t.CodeExecutionArtifact
715
+ | undefined;
716
+ if (artifact?.session_id != null && artifact.session_id !== '') {
717
+ const newFiles = artifact.files ?? [];
718
+ const existingSession = this.sessions.get(Constants.EXECUTE_CODE) as
719
+ | t.CodeSessionContext
720
+ | undefined;
721
+ const existingFiles = existingSession?.files ?? [];
722
+
723
+ if (newFiles.length > 0) {
724
+ const filesWithSession: t.FileRefs = newFiles.map((file) => ({
725
+ ...file,
726
+ session_id: artifact.session_id,
727
+ }));
728
+ const newFileNames = new Set(filesWithSession.map((f) => f.name));
729
+ const filteredExisting = existingFiles.filter(
730
+ (f) => !newFileNames.has(f.name)
731
+ );
732
+ this.sessions.set(Constants.EXECUTE_CODE, {
733
+ session_id: artifact.session_id,
734
+ files: [...filteredExisting, ...filesWithSession],
735
+ lastUpdated: Date.now(),
736
+ });
737
+ } else {
738
+ this.sessions.set(Constants.EXECUTE_CODE, {
739
+ session_id: artifact.session_id,
740
+ files: existingFiles,
741
+ lastUpdated: Date.now(),
742
+ });
743
+ }
744
+ }
745
+ }
746
+
747
+ // Dispatch ON_RUN_STEP_COMPLETED via custom event (same path as dispatchToolEvents)
748
+ const stepId = this.toolCallStepIds?.get(toolCallId) ?? '';
749
+ if (!stepId) {
750
+ continue;
751
+ }
752
+
753
+ const contentString =
754
+ typeof toolMessage.content === 'string'
755
+ ? toolMessage.content
756
+ : JSON.stringify(toolMessage.content);
757
+
758
+ const tool_call: t.ProcessedToolCall = {
759
+ args:
760
+ typeof call.args === 'string'
761
+ ? (call.args as string)
762
+ : JSON.stringify((call.args as unknown) ?? {}),
763
+ name: call.name,
764
+ id: toolCallId,
765
+ output: contentString,
766
+ progress: 1,
767
+ };
768
+
769
+ safeDispatchCustomEvent(
770
+ GraphEvents.ON_RUN_STEP_COMPLETED,
771
+ {
772
+ result: {
773
+ id: stepId,
774
+ index: turn,
775
+ type: 'tool_call' as const,
776
+ tool_call,
777
+ },
778
+ },
779
+ config
780
+ );
781
+ }
782
+ }
783
+
784
+ /**
785
+ * Dispatches tool calls to the host via ON_TOOL_EXECUTE event and returns raw ToolMessages.
786
+ * Core logic for event-driven execution, separated from output shaping.
787
+ */
788
+ private async dispatchToolEvents(
446
789
  toolCalls: ToolCall[],
447
- config: RunnableConfig,
448
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
449
- input: any
450
- ): Promise<T> {
790
+ config: RunnableConfig
791
+ ): Promise<ToolMessage[]> {
451
792
  const requests: t.ToolCallRequest[] = toolCalls.map((call) => {
452
793
  const turn = this.toolUsageCount.get(call.name) ?? 0;
453
794
  this.toolUsageCount.set(call.name, turn + 1);
454
- return {
795
+
796
+ // Recover truncated args from streaming buffer (same as runTool path)
797
+ let args = call.args as Record<string, unknown>;
798
+ if (call.id && this.streamingToolCallBuffer?.has(call.id)) {
799
+ args = this.recoverTruncatedArgs(call.name, call.id, args) as Record<
800
+ string,
801
+ unknown
802
+ >;
803
+ this.streamingToolCallBuffer.clear(call.id);
804
+ }
805
+
806
+ const request: t.ToolCallRequest = {
455
807
  id: call.id!,
456
808
  name: call.name,
457
- args: call.args as Record<string, unknown>,
809
+ args,
458
810
  stepId: this.toolCallStepIds?.get(call.id!),
459
811
  turn,
460
812
  };
813
+
814
+ if (
815
+ call.name === Constants.EXECUTE_CODE ||
816
+ call.name === Constants.PROGRAMMATIC_TOOL_CALLING
817
+ ) {
818
+ request.codeSessionContext = this.getCodeSessionContext();
819
+ }
820
+
821
+ return request;
461
822
  });
462
823
 
463
824
  const results = await new Promise<t.ToolExecuteResult[]>(
@@ -478,10 +839,20 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
478
839
  }
479
840
  );
480
841
 
481
- const outputs: ToolMessage[] = results.map((result) => {
842
+ this.storeCodeSessionFromResults(results, requests);
843
+
844
+ return results.map((result) => {
482
845
  const request = requests.find((r) => r.id === result.toolCallId);
483
846
  const toolName = request?.name ?? 'unknown';
484
847
  const stepId = this.toolCallStepIds?.get(result.toolCallId) ?? '';
848
+ if (!stepId) {
849
+ // eslint-disable-next-line no-console
850
+ console.warn(
851
+ `[ToolNode] toolCallStepIds missing entry for toolCallId=${result.toolCallId} (tool=${toolName}). ` +
852
+ 'This indicates a race between the stream consumer and graph execution. ' +
853
+ `Map size: ${this.toolCallStepIds?.size ?? 0}`
854
+ );
855
+ }
485
856
 
486
857
  let toolMessage: ToolMessage;
487
858
  let contentString: string;
@@ -536,19 +907,34 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
536
907
 
537
908
  return toolMessage;
538
909
  });
910
+ }
539
911
 
912
+ /**
913
+ * Execute all tool calls via ON_TOOL_EXECUTE event dispatch.
914
+ * Used in event-driven mode where the host handles actual tool execution.
915
+ */
916
+ private async executeViaEvent(
917
+ toolCalls: ToolCall[],
918
+ config: RunnableConfig,
919
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
920
+ input: any
921
+ ): Promise<T> {
922
+ const outputs = await this.dispatchToolEvents(toolCalls, config);
540
923
  return (Array.isArray(input) ? outputs : { messages: outputs }) as T;
541
924
  }
542
925
 
543
926
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
544
927
  protected async run(input: any, config: RunnableConfig): Promise<T> {
928
+ this.toolCallTurns.clear();
545
929
  let outputs: (BaseMessage | Command)[];
546
930
 
547
931
  if (this.isSendInput(input)) {
548
- if (this.eventDrivenMode) {
932
+ const isDirectTool = this.directToolNames?.has(input.lg_tool_call.name);
933
+ if (this.eventDrivenMode && isDirectTool !== true) {
549
934
  return this.executeViaEvent([input.lg_tool_call], config, input);
550
935
  }
551
936
  outputs = [await this.runTool(input.lg_tool_call, config)];
937
+ this.handleRunToolCompletions([input.lg_tool_call], outputs, config);
552
938
  } else {
553
939
  let messages: BaseMessage[];
554
940
  if (Array.isArray(input)) {
@@ -604,12 +990,40 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
604
990
  }) ?? [];
605
991
 
606
992
  if (this.eventDrivenMode && filteredCalls.length > 0) {
607
- return this.executeViaEvent(filteredCalls, config, input);
608
- }
993
+ if (!this.directToolNames || this.directToolNames.size === 0) {
994
+ return this.executeViaEvent(filteredCalls, config, input);
995
+ }
609
996
 
610
- outputs = await Promise.all(
611
- filteredCalls.map((call) => this.runTool(call, config))
612
- );
997
+ const directCalls = filteredCalls.filter((c) =>
998
+ this.directToolNames!.has(c.name)
999
+ );
1000
+ const eventCalls = filteredCalls.filter(
1001
+ (c) => !this.directToolNames!.has(c.name)
1002
+ );
1003
+
1004
+ const directOutputs: (BaseMessage | Command)[] =
1005
+ directCalls.length > 0
1006
+ ? await Promise.all(
1007
+ directCalls.map((call) => this.runTool(call, config))
1008
+ )
1009
+ : [];
1010
+
1011
+ if (directCalls.length > 0 && directOutputs.length > 0) {
1012
+ this.handleRunToolCompletions(directCalls, directOutputs, config);
1013
+ }
1014
+
1015
+ const eventOutputs: ToolMessage[] =
1016
+ eventCalls.length > 0
1017
+ ? await this.dispatchToolEvents(eventCalls, config)
1018
+ : [];
1019
+
1020
+ outputs = [...directOutputs, ...eventOutputs];
1021
+ } else {
1022
+ outputs = await Promise.all(
1023
+ filteredCalls.map((call) => this.runTool(call, config))
1024
+ );
1025
+ this.handleRunToolCompletions(filteredCalls, outputs, config);
1026
+ }
613
1027
  }
614
1028
 
615
1029
  if (!outputs.some(isCommand)) {
@@ -767,17 +1181,16 @@ export function toolsCondition<T extends string>(
767
1181
  toolNode: T,
768
1182
  invokedToolIds?: Set<string>
769
1183
  ): T | typeof END {
770
- const message: AIMessage = Array.isArray(state)
771
- ? state[state.length - 1]
772
- : state.messages[state.messages.length - 1];
1184
+ const messages = Array.isArray(state) ? state : state.messages;
1185
+ const message = messages[messages.length - 1] as AIMessage | undefined;
773
1186
 
774
1187
  if (
1188
+ message &&
775
1189
  'tool_calls' in message &&
776
1190
  (message.tool_calls?.length ?? 0) > 0 &&
777
1191
  !areToolCallsInvoked(message, invokedToolIds)
778
1192
  ) {
779
1193
  return toolNode;
780
- } else {
781
- return END;
782
1194
  }
1195
+ return END;
783
1196
  }