@illuma-ai/agents 1.0.81

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 (558) hide show
  1. package/README.md +485 -0
  2. package/dist/cjs/agents/AgentContext.cjs +734 -0
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -0
  4. package/dist/cjs/common/enum.cjs +190 -0
  5. package/dist/cjs/common/enum.cjs.map +1 -0
  6. package/dist/cjs/events.cjs +172 -0
  7. package/dist/cjs/events.cjs.map +1 -0
  8. package/dist/cjs/graphs/Graph.cjs +1615 -0
  9. package/dist/cjs/graphs/Graph.cjs.map +1 -0
  10. package/dist/cjs/graphs/MultiAgentGraph.cjs +890 -0
  11. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -0
  12. package/dist/cjs/instrumentation.cjs +21 -0
  13. package/dist/cjs/instrumentation.cjs.map +1 -0
  14. package/dist/cjs/llm/anthropic/index.cjs +292 -0
  15. package/dist/cjs/llm/anthropic/index.cjs.map +1 -0
  16. package/dist/cjs/llm/anthropic/types.cjs +50 -0
  17. package/dist/cjs/llm/anthropic/types.cjs.map +1 -0
  18. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +630 -0
  19. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -0
  20. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +218 -0
  21. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -0
  22. package/dist/cjs/llm/anthropic/utils/tools.cjs +29 -0
  23. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -0
  24. package/dist/cjs/llm/bedrock/index.cjs +282 -0
  25. package/dist/cjs/llm/bedrock/index.cjs.map +1 -0
  26. package/dist/cjs/llm/fake.cjs +97 -0
  27. package/dist/cjs/llm/fake.cjs.map +1 -0
  28. package/dist/cjs/llm/google/index.cjs +216 -0
  29. package/dist/cjs/llm/google/index.cjs.map +1 -0
  30. package/dist/cjs/llm/google/utils/common.cjs +647 -0
  31. package/dist/cjs/llm/google/utils/common.cjs.map +1 -0
  32. package/dist/cjs/llm/openai/index.cjs +1028 -0
  33. package/dist/cjs/llm/openai/index.cjs.map +1 -0
  34. package/dist/cjs/llm/openai/utils/index.cjs +765 -0
  35. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -0
  36. package/dist/cjs/llm/openrouter/index.cjs +212 -0
  37. package/dist/cjs/llm/openrouter/index.cjs.map +1 -0
  38. package/dist/cjs/llm/providers.cjs +43 -0
  39. package/dist/cjs/llm/providers.cjs.map +1 -0
  40. package/dist/cjs/llm/text.cjs +69 -0
  41. package/dist/cjs/llm/text.cjs.map +1 -0
  42. package/dist/cjs/llm/vertexai/index.cjs +329 -0
  43. package/dist/cjs/llm/vertexai/index.cjs.map +1 -0
  44. package/dist/cjs/main.cjs +240 -0
  45. package/dist/cjs/main.cjs.map +1 -0
  46. package/dist/cjs/messages/cache.cjs +387 -0
  47. package/dist/cjs/messages/cache.cjs.map +1 -0
  48. package/dist/cjs/messages/content.cjs +53 -0
  49. package/dist/cjs/messages/content.cjs.map +1 -0
  50. package/dist/cjs/messages/core.cjs +367 -0
  51. package/dist/cjs/messages/core.cjs.map +1 -0
  52. package/dist/cjs/messages/format.cjs +761 -0
  53. package/dist/cjs/messages/format.cjs.map +1 -0
  54. package/dist/cjs/messages/ids.cjs +23 -0
  55. package/dist/cjs/messages/ids.cjs.map +1 -0
  56. package/dist/cjs/messages/prune.cjs +398 -0
  57. package/dist/cjs/messages/prune.cjs.map +1 -0
  58. package/dist/cjs/messages/tools.cjs +96 -0
  59. package/dist/cjs/messages/tools.cjs.map +1 -0
  60. package/dist/cjs/run.cjs +328 -0
  61. package/dist/cjs/run.cjs.map +1 -0
  62. package/dist/cjs/schemas/validate.cjs +324 -0
  63. package/dist/cjs/schemas/validate.cjs.map +1 -0
  64. package/dist/cjs/splitStream.cjs +210 -0
  65. package/dist/cjs/splitStream.cjs.map +1 -0
  66. package/dist/cjs/stream.cjs +620 -0
  67. package/dist/cjs/stream.cjs.map +1 -0
  68. package/dist/cjs/tools/BrowserTools.cjs +248 -0
  69. package/dist/cjs/tools/BrowserTools.cjs.map +1 -0
  70. package/dist/cjs/tools/Calculator.cjs +66 -0
  71. package/dist/cjs/tools/Calculator.cjs.map +1 -0
  72. package/dist/cjs/tools/CodeExecutor.cjs +234 -0
  73. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -0
  74. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +636 -0
  75. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -0
  76. package/dist/cjs/tools/ToolNode.cjs +548 -0
  77. package/dist/cjs/tools/ToolNode.cjs.map +1 -0
  78. package/dist/cjs/tools/ToolSearch.cjs +909 -0
  79. package/dist/cjs/tools/ToolSearch.cjs.map +1 -0
  80. package/dist/cjs/tools/handlers.cjs +255 -0
  81. package/dist/cjs/tools/handlers.cjs.map +1 -0
  82. package/dist/cjs/tools/schema.cjs +31 -0
  83. package/dist/cjs/tools/schema.cjs.map +1 -0
  84. package/dist/cjs/tools/search/anthropic.cjs +40 -0
  85. package/dist/cjs/tools/search/anthropic.cjs.map +1 -0
  86. package/dist/cjs/tools/search/content.cjs +140 -0
  87. package/dist/cjs/tools/search/content.cjs.map +1 -0
  88. package/dist/cjs/tools/search/firecrawl.cjs +179 -0
  89. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -0
  90. package/dist/cjs/tools/search/format.cjs +203 -0
  91. package/dist/cjs/tools/search/format.cjs.map +1 -0
  92. package/dist/cjs/tools/search/highlights.cjs +245 -0
  93. package/dist/cjs/tools/search/highlights.cjs.map +1 -0
  94. package/dist/cjs/tools/search/rerankers.cjs +174 -0
  95. package/dist/cjs/tools/search/rerankers.cjs.map +1 -0
  96. package/dist/cjs/tools/search/schema.cjs +117 -0
  97. package/dist/cjs/tools/search/schema.cjs.map +1 -0
  98. package/dist/cjs/tools/search/search.cjs +566 -0
  99. package/dist/cjs/tools/search/search.cjs.map +1 -0
  100. package/dist/cjs/tools/search/serper-scraper.cjs +132 -0
  101. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -0
  102. package/dist/cjs/tools/search/tool.cjs +456 -0
  103. package/dist/cjs/tools/search/tool.cjs.map +1 -0
  104. package/dist/cjs/tools/search/utils.cjs +66 -0
  105. package/dist/cjs/tools/search/utils.cjs.map +1 -0
  106. package/dist/cjs/types/graph.cjs +29 -0
  107. package/dist/cjs/types/graph.cjs.map +1 -0
  108. package/dist/cjs/utils/contextAnalytics.cjs +66 -0
  109. package/dist/cjs/utils/contextAnalytics.cjs.map +1 -0
  110. package/dist/cjs/utils/events.cjs +31 -0
  111. package/dist/cjs/utils/events.cjs.map +1 -0
  112. package/dist/cjs/utils/graph.cjs +16 -0
  113. package/dist/cjs/utils/graph.cjs.map +1 -0
  114. package/dist/cjs/utils/handlers.cjs +70 -0
  115. package/dist/cjs/utils/handlers.cjs.map +1 -0
  116. package/dist/cjs/utils/llm.cjs +27 -0
  117. package/dist/cjs/utils/llm.cjs.map +1 -0
  118. package/dist/cjs/utils/misc.cjs +56 -0
  119. package/dist/cjs/utils/misc.cjs.map +1 -0
  120. package/dist/cjs/utils/run.cjs +73 -0
  121. package/dist/cjs/utils/run.cjs.map +1 -0
  122. package/dist/cjs/utils/schema.cjs +27 -0
  123. package/dist/cjs/utils/schema.cjs.map +1 -0
  124. package/dist/cjs/utils/title.cjs +125 -0
  125. package/dist/cjs/utils/title.cjs.map +1 -0
  126. package/dist/cjs/utils/tokens.cjs +125 -0
  127. package/dist/cjs/utils/tokens.cjs.map +1 -0
  128. package/dist/cjs/utils/toonFormat.cjs +388 -0
  129. package/dist/cjs/utils/toonFormat.cjs.map +1 -0
  130. package/dist/esm/agents/AgentContext.mjs +732 -0
  131. package/dist/esm/agents/AgentContext.mjs.map +1 -0
  132. package/dist/esm/common/enum.mjs +190 -0
  133. package/dist/esm/common/enum.mjs.map +1 -0
  134. package/dist/esm/events.mjs +164 -0
  135. package/dist/esm/events.mjs.map +1 -0
  136. package/dist/esm/graphs/Graph.mjs +1612 -0
  137. package/dist/esm/graphs/Graph.mjs.map +1 -0
  138. package/dist/esm/graphs/MultiAgentGraph.mjs +888 -0
  139. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -0
  140. package/dist/esm/instrumentation.mjs +19 -0
  141. package/dist/esm/instrumentation.mjs.map +1 -0
  142. package/dist/esm/llm/anthropic/index.mjs +290 -0
  143. package/dist/esm/llm/anthropic/index.mjs.map +1 -0
  144. package/dist/esm/llm/anthropic/types.mjs +48 -0
  145. package/dist/esm/llm/anthropic/types.mjs.map +1 -0
  146. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +627 -0
  147. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -0
  148. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +216 -0
  149. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -0
  150. package/dist/esm/llm/anthropic/utils/tools.mjs +27 -0
  151. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -0
  152. package/dist/esm/llm/bedrock/index.mjs +280 -0
  153. package/dist/esm/llm/bedrock/index.mjs.map +1 -0
  154. package/dist/esm/llm/fake.mjs +94 -0
  155. package/dist/esm/llm/fake.mjs.map +1 -0
  156. package/dist/esm/llm/google/index.mjs +214 -0
  157. package/dist/esm/llm/google/index.mjs.map +1 -0
  158. package/dist/esm/llm/google/utils/common.mjs +638 -0
  159. package/dist/esm/llm/google/utils/common.mjs.map +1 -0
  160. package/dist/esm/llm/openai/index.mjs +1018 -0
  161. package/dist/esm/llm/openai/index.mjs.map +1 -0
  162. package/dist/esm/llm/openai/utils/index.mjs +759 -0
  163. package/dist/esm/llm/openai/utils/index.mjs.map +1 -0
  164. package/dist/esm/llm/openrouter/index.mjs +210 -0
  165. package/dist/esm/llm/openrouter/index.mjs.map +1 -0
  166. package/dist/esm/llm/providers.mjs +39 -0
  167. package/dist/esm/llm/providers.mjs.map +1 -0
  168. package/dist/esm/llm/text.mjs +67 -0
  169. package/dist/esm/llm/text.mjs.map +1 -0
  170. package/dist/esm/llm/vertexai/index.mjs +327 -0
  171. package/dist/esm/llm/vertexai/index.mjs.map +1 -0
  172. package/dist/esm/main.mjs +37 -0
  173. package/dist/esm/main.mjs.map +1 -0
  174. package/dist/esm/messages/cache.mjs +382 -0
  175. package/dist/esm/messages/cache.mjs.map +1 -0
  176. package/dist/esm/messages/content.mjs +51 -0
  177. package/dist/esm/messages/content.mjs.map +1 -0
  178. package/dist/esm/messages/core.mjs +359 -0
  179. package/dist/esm/messages/core.mjs.map +1 -0
  180. package/dist/esm/messages/format.mjs +752 -0
  181. package/dist/esm/messages/format.mjs.map +1 -0
  182. package/dist/esm/messages/ids.mjs +21 -0
  183. package/dist/esm/messages/ids.mjs.map +1 -0
  184. package/dist/esm/messages/prune.mjs +393 -0
  185. package/dist/esm/messages/prune.mjs.map +1 -0
  186. package/dist/esm/messages/tools.mjs +93 -0
  187. package/dist/esm/messages/tools.mjs.map +1 -0
  188. package/dist/esm/run.mjs +325 -0
  189. package/dist/esm/run.mjs.map +1 -0
  190. package/dist/esm/schemas/validate.mjs +317 -0
  191. package/dist/esm/schemas/validate.mjs.map +1 -0
  192. package/dist/esm/splitStream.mjs +207 -0
  193. package/dist/esm/splitStream.mjs.map +1 -0
  194. package/dist/esm/stream.mjs +616 -0
  195. package/dist/esm/stream.mjs.map +1 -0
  196. package/dist/esm/tools/BrowserTools.mjs +244 -0
  197. package/dist/esm/tools/BrowserTools.mjs.map +1 -0
  198. package/dist/esm/tools/Calculator.mjs +41 -0
  199. package/dist/esm/tools/Calculator.mjs.map +1 -0
  200. package/dist/esm/tools/CodeExecutor.mjs +226 -0
  201. package/dist/esm/tools/CodeExecutor.mjs.map +1 -0
  202. package/dist/esm/tools/ProgrammaticToolCalling.mjs +622 -0
  203. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -0
  204. package/dist/esm/tools/ToolNode.mjs +545 -0
  205. package/dist/esm/tools/ToolNode.mjs.map +1 -0
  206. package/dist/esm/tools/ToolSearch.mjs +870 -0
  207. package/dist/esm/tools/ToolSearch.mjs.map +1 -0
  208. package/dist/esm/tools/handlers.mjs +250 -0
  209. package/dist/esm/tools/handlers.mjs.map +1 -0
  210. package/dist/esm/tools/schema.mjs +28 -0
  211. package/dist/esm/tools/schema.mjs.map +1 -0
  212. package/dist/esm/tools/search/anthropic.mjs +37 -0
  213. package/dist/esm/tools/search/anthropic.mjs.map +1 -0
  214. package/dist/esm/tools/search/content.mjs +119 -0
  215. package/dist/esm/tools/search/content.mjs.map +1 -0
  216. package/dist/esm/tools/search/firecrawl.mjs +176 -0
  217. package/dist/esm/tools/search/firecrawl.mjs.map +1 -0
  218. package/dist/esm/tools/search/format.mjs +201 -0
  219. package/dist/esm/tools/search/format.mjs.map +1 -0
  220. package/dist/esm/tools/search/highlights.mjs +243 -0
  221. package/dist/esm/tools/search/highlights.mjs.map +1 -0
  222. package/dist/esm/tools/search/rerankers.mjs +168 -0
  223. package/dist/esm/tools/search/rerankers.mjs.map +1 -0
  224. package/dist/esm/tools/search/schema.mjs +104 -0
  225. package/dist/esm/tools/search/schema.mjs.map +1 -0
  226. package/dist/esm/tools/search/search.mjs +563 -0
  227. package/dist/esm/tools/search/search.mjs.map +1 -0
  228. package/dist/esm/tools/search/serper-scraper.mjs +129 -0
  229. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -0
  230. package/dist/esm/tools/search/tool.mjs +454 -0
  231. package/dist/esm/tools/search/tool.mjs.map +1 -0
  232. package/dist/esm/tools/search/utils.mjs +61 -0
  233. package/dist/esm/tools/search/utils.mjs.map +1 -0
  234. package/dist/esm/types/graph.mjs +26 -0
  235. package/dist/esm/types/graph.mjs.map +1 -0
  236. package/dist/esm/utils/contextAnalytics.mjs +64 -0
  237. package/dist/esm/utils/contextAnalytics.mjs.map +1 -0
  238. package/dist/esm/utils/events.mjs +29 -0
  239. package/dist/esm/utils/events.mjs.map +1 -0
  240. package/dist/esm/utils/graph.mjs +13 -0
  241. package/dist/esm/utils/graph.mjs.map +1 -0
  242. package/dist/esm/utils/handlers.mjs +68 -0
  243. package/dist/esm/utils/handlers.mjs.map +1 -0
  244. package/dist/esm/utils/llm.mjs +24 -0
  245. package/dist/esm/utils/llm.mjs.map +1 -0
  246. package/dist/esm/utils/misc.mjs +53 -0
  247. package/dist/esm/utils/misc.mjs.map +1 -0
  248. package/dist/esm/utils/run.mjs +70 -0
  249. package/dist/esm/utils/run.mjs.map +1 -0
  250. package/dist/esm/utils/schema.mjs +24 -0
  251. package/dist/esm/utils/schema.mjs.map +1 -0
  252. package/dist/esm/utils/title.mjs +122 -0
  253. package/dist/esm/utils/title.mjs.map +1 -0
  254. package/dist/esm/utils/tokens.mjs +121 -0
  255. package/dist/esm/utils/tokens.mjs.map +1 -0
  256. package/dist/esm/utils/toonFormat.mjs +381 -0
  257. package/dist/esm/utils/toonFormat.mjs.map +1 -0
  258. package/dist/types/agents/AgentContext.d.ts +293 -0
  259. package/dist/types/common/enum.d.ts +155 -0
  260. package/dist/types/common/index.d.ts +1 -0
  261. package/dist/types/events.d.ts +31 -0
  262. package/dist/types/graphs/Graph.d.ts +216 -0
  263. package/dist/types/graphs/MultiAgentGraph.d.ts +104 -0
  264. package/dist/types/graphs/index.d.ts +2 -0
  265. package/dist/types/index.d.ts +21 -0
  266. package/dist/types/instrumentation.d.ts +1 -0
  267. package/dist/types/llm/anthropic/index.d.ts +39 -0
  268. package/dist/types/llm/anthropic/types.d.ts +37 -0
  269. package/dist/types/llm/anthropic/utils/message_inputs.d.ts +14 -0
  270. package/dist/types/llm/anthropic/utils/message_outputs.d.ts +14 -0
  271. package/dist/types/llm/anthropic/utils/output_parsers.d.ts +22 -0
  272. package/dist/types/llm/anthropic/utils/tools.d.ts +3 -0
  273. package/dist/types/llm/bedrock/index.d.ts +141 -0
  274. package/dist/types/llm/bedrock/types.d.ts +27 -0
  275. package/dist/types/llm/bedrock/utils/index.d.ts +5 -0
  276. package/dist/types/llm/bedrock/utils/message_inputs.d.ts +31 -0
  277. package/dist/types/llm/bedrock/utils/message_outputs.d.ts +33 -0
  278. package/dist/types/llm/fake.d.ts +31 -0
  279. package/dist/types/llm/google/index.d.ts +24 -0
  280. package/dist/types/llm/google/types.d.ts +42 -0
  281. package/dist/types/llm/google/utils/common.d.ts +34 -0
  282. package/dist/types/llm/google/utils/tools.d.ts +10 -0
  283. package/dist/types/llm/google/utils/zod_to_genai_parameters.d.ts +14 -0
  284. package/dist/types/llm/openai/index.d.ts +127 -0
  285. package/dist/types/llm/openai/types.d.ts +10 -0
  286. package/dist/types/llm/openai/utils/index.d.ts +29 -0
  287. package/dist/types/llm/openrouter/index.d.ts +15 -0
  288. package/dist/types/llm/providers.d.ts +5 -0
  289. package/dist/types/llm/text.d.ts +21 -0
  290. package/dist/types/llm/vertexai/index.d.ts +293 -0
  291. package/dist/types/messages/cache.d.ts +54 -0
  292. package/dist/types/messages/content.d.ts +7 -0
  293. package/dist/types/messages/core.d.ts +14 -0
  294. package/dist/types/messages/format.d.ts +137 -0
  295. package/dist/types/messages/ids.d.ts +3 -0
  296. package/dist/types/messages/index.d.ts +7 -0
  297. package/dist/types/messages/prune.d.ts +52 -0
  298. package/dist/types/messages/reducer.d.ts +9 -0
  299. package/dist/types/messages/tools.d.ts +17 -0
  300. package/dist/types/mockStream.d.ts +32 -0
  301. package/dist/types/prompts/collab.d.ts +1 -0
  302. package/dist/types/prompts/index.d.ts +2 -0
  303. package/dist/types/prompts/taskmanager.d.ts +41 -0
  304. package/dist/types/run.d.ts +41 -0
  305. package/dist/types/schemas/index.d.ts +1 -0
  306. package/dist/types/schemas/validate.d.ts +59 -0
  307. package/dist/types/splitStream.d.ts +37 -0
  308. package/dist/types/stream.d.ts +15 -0
  309. package/dist/types/test/mockTools.d.ts +28 -0
  310. package/dist/types/tools/BrowserTools.d.ts +87 -0
  311. package/dist/types/tools/Calculator.d.ts +34 -0
  312. package/dist/types/tools/CodeExecutor.d.ts +57 -0
  313. package/dist/types/tools/ProgrammaticToolCalling.d.ts +138 -0
  314. package/dist/types/tools/ToolNode.d.ts +51 -0
  315. package/dist/types/tools/ToolSearch.d.ts +219 -0
  316. package/dist/types/tools/handlers.d.ts +22 -0
  317. package/dist/types/tools/schema.d.ts +12 -0
  318. package/dist/types/tools/search/anthropic.d.ts +16 -0
  319. package/dist/types/tools/search/content.d.ts +4 -0
  320. package/dist/types/tools/search/firecrawl.d.ts +54 -0
  321. package/dist/types/tools/search/format.d.ts +5 -0
  322. package/dist/types/tools/search/highlights.d.ts +13 -0
  323. package/dist/types/tools/search/index.d.ts +3 -0
  324. package/dist/types/tools/search/rerankers.d.ts +38 -0
  325. package/dist/types/tools/search/schema.d.ts +103 -0
  326. package/dist/types/tools/search/search.d.ts +8 -0
  327. package/dist/types/tools/search/serper-scraper.d.ts +59 -0
  328. package/dist/types/tools/search/test.d.ts +1 -0
  329. package/dist/types/tools/search/tool.d.ts +3 -0
  330. package/dist/types/tools/search/types.d.ts +575 -0
  331. package/dist/types/tools/search/utils.d.ts +10 -0
  332. package/dist/types/types/graph.d.ts +399 -0
  333. package/dist/types/types/index.d.ts +5 -0
  334. package/dist/types/types/llm.d.ts +105 -0
  335. package/dist/types/types/messages.d.ts +4 -0
  336. package/dist/types/types/run.d.ts +112 -0
  337. package/dist/types/types/stream.d.ts +308 -0
  338. package/dist/types/types/tools.d.ts +296 -0
  339. package/dist/types/utils/contextAnalytics.d.ts +37 -0
  340. package/dist/types/utils/events.d.ts +6 -0
  341. package/dist/types/utils/graph.d.ts +2 -0
  342. package/dist/types/utils/handlers.d.ts +34 -0
  343. package/dist/types/utils/index.d.ts +9 -0
  344. package/dist/types/utils/llm.d.ts +3 -0
  345. package/dist/types/utils/llmConfig.d.ts +3 -0
  346. package/dist/types/utils/logging.d.ts +1 -0
  347. package/dist/types/utils/misc.d.ts +7 -0
  348. package/dist/types/utils/run.d.ts +27 -0
  349. package/dist/types/utils/schema.d.ts +8 -0
  350. package/dist/types/utils/title.d.ts +4 -0
  351. package/dist/types/utils/tokens.d.ts +28 -0
  352. package/dist/types/utils/toonFormat.d.ts +111 -0
  353. package/package.json +190 -0
  354. package/src/agents/AgentContext.test.ts +458 -0
  355. package/src/agents/AgentContext.ts +972 -0
  356. package/src/agents/__tests__/AgentContext.test.ts +805 -0
  357. package/src/agents/__tests__/resolveStructuredOutputMode.test.ts +137 -0
  358. package/src/common/enum.ts +203 -0
  359. package/src/common/index.ts +2 -0
  360. package/src/events.ts +223 -0
  361. package/src/graphs/Graph.ts +2228 -0
  362. package/src/graphs/MultiAgentGraph.ts +1063 -0
  363. package/src/graphs/__tests__/structured-output.integration.test.ts +809 -0
  364. package/src/graphs/__tests__/structured-output.test.ts +183 -0
  365. package/src/graphs/index.ts +2 -0
  366. package/src/index.ts +34 -0
  367. package/src/instrumentation.ts +22 -0
  368. package/src/llm/anthropic/Jacob_Lee_Resume_2023.pdf +0 -0
  369. package/src/llm/anthropic/index.ts +413 -0
  370. package/src/llm/anthropic/llm.spec.ts +1442 -0
  371. package/src/llm/anthropic/types.ts +140 -0
  372. package/src/llm/anthropic/utils/message_inputs.ts +757 -0
  373. package/src/llm/anthropic/utils/message_outputs.ts +289 -0
  374. package/src/llm/anthropic/utils/output_parsers.ts +133 -0
  375. package/src/llm/anthropic/utils/tools.ts +29 -0
  376. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +495 -0
  377. package/src/llm/bedrock/index.ts +411 -0
  378. package/src/llm/bedrock/llm.spec.ts +616 -0
  379. package/src/llm/bedrock/types.ts +51 -0
  380. package/src/llm/bedrock/utils/index.ts +18 -0
  381. package/src/llm/bedrock/utils/message_inputs.ts +563 -0
  382. package/src/llm/bedrock/utils/message_outputs.ts +310 -0
  383. package/src/llm/fake.ts +133 -0
  384. package/src/llm/google/data/gettysburg10.wav +0 -0
  385. package/src/llm/google/data/hotdog.jpg +0 -0
  386. package/src/llm/google/index.ts +337 -0
  387. package/src/llm/google/llm.spec.ts +934 -0
  388. package/src/llm/google/types.ts +56 -0
  389. package/src/llm/google/utils/common.ts +873 -0
  390. package/src/llm/google/utils/tools.ts +160 -0
  391. package/src/llm/google/utils/zod_to_genai_parameters.ts +86 -0
  392. package/src/llm/openai/index.ts +1366 -0
  393. package/src/llm/openai/types.ts +24 -0
  394. package/src/llm/openai/utils/index.ts +1035 -0
  395. package/src/llm/openai/utils/isReasoningModel.test.ts +90 -0
  396. package/src/llm/openrouter/index.ts +291 -0
  397. package/src/llm/providers.ts +52 -0
  398. package/src/llm/text.ts +94 -0
  399. package/src/llm/vertexai/index.ts +359 -0
  400. package/src/messages/__tests__/tools.test.ts +473 -0
  401. package/src/messages/cache.test.ts +1261 -0
  402. package/src/messages/cache.ts +518 -0
  403. package/src/messages/content.test.ts +362 -0
  404. package/src/messages/content.ts +63 -0
  405. package/src/messages/core.ts +473 -0
  406. package/src/messages/ensureThinkingBlock.test.ts +468 -0
  407. package/src/messages/format.ts +1029 -0
  408. package/src/messages/formatAgentMessages.test.ts +1513 -0
  409. package/src/messages/formatAgentMessages.tools.test.ts +419 -0
  410. package/src/messages/formatMessage.test.ts +693 -0
  411. package/src/messages/ids.ts +26 -0
  412. package/src/messages/index.ts +7 -0
  413. package/src/messages/labelContentByAgent.test.ts +887 -0
  414. package/src/messages/prune.ts +568 -0
  415. package/src/messages/reducer.ts +80 -0
  416. package/src/messages/shiftIndexTokenCountMap.test.ts +81 -0
  417. package/src/messages/tools.ts +108 -0
  418. package/src/mockStream.ts +99 -0
  419. package/src/prompts/collab.ts +6 -0
  420. package/src/prompts/index.ts +2 -0
  421. package/src/prompts/taskmanager.ts +61 -0
  422. package/src/run.ts +467 -0
  423. package/src/schemas/index.ts +2 -0
  424. package/src/schemas/schema-preparation.test.ts +500 -0
  425. package/src/schemas/validate.test.ts +358 -0
  426. package/src/schemas/validate.ts +454 -0
  427. package/src/scripts/abort.ts +157 -0
  428. package/src/scripts/ant_web_search.ts +158 -0
  429. package/src/scripts/ant_web_search_edge_case.ts +162 -0
  430. package/src/scripts/ant_web_search_error_edge_case.ts +148 -0
  431. package/src/scripts/args.ts +48 -0
  432. package/src/scripts/caching.ts +132 -0
  433. package/src/scripts/cli.ts +172 -0
  434. package/src/scripts/cli2.ts +133 -0
  435. package/src/scripts/cli3.ts +184 -0
  436. package/src/scripts/cli4.ts +191 -0
  437. package/src/scripts/cli5.ts +191 -0
  438. package/src/scripts/code_exec.ts +213 -0
  439. package/src/scripts/code_exec_files.ts +236 -0
  440. package/src/scripts/code_exec_multi_session.ts +241 -0
  441. package/src/scripts/code_exec_ptc.ts +334 -0
  442. package/src/scripts/code_exec_session.ts +282 -0
  443. package/src/scripts/code_exec_simple.ts +147 -0
  444. package/src/scripts/content.ts +138 -0
  445. package/src/scripts/empty_input.ts +137 -0
  446. package/src/scripts/handoff-test.ts +135 -0
  447. package/src/scripts/image.ts +178 -0
  448. package/src/scripts/memory.ts +97 -0
  449. package/src/scripts/multi-agent-chain.ts +331 -0
  450. package/src/scripts/multi-agent-conditional.ts +221 -0
  451. package/src/scripts/multi-agent-document-review-chain.ts +197 -0
  452. package/src/scripts/multi-agent-hybrid-flow.ts +310 -0
  453. package/src/scripts/multi-agent-parallel-start.ts +265 -0
  454. package/src/scripts/multi-agent-parallel.ts +394 -0
  455. package/src/scripts/multi-agent-sequence.ts +217 -0
  456. package/src/scripts/multi-agent-supervisor.ts +365 -0
  457. package/src/scripts/multi-agent-test.ts +186 -0
  458. package/src/scripts/parallel-asymmetric-tools-test.ts +274 -0
  459. package/src/scripts/parallel-full-metadata-test.ts +240 -0
  460. package/src/scripts/parallel-tools-test.ts +340 -0
  461. package/src/scripts/programmatic_exec.ts +396 -0
  462. package/src/scripts/programmatic_exec_agent.ts +231 -0
  463. package/src/scripts/search.ts +146 -0
  464. package/src/scripts/sequential-full-metadata-test.ts +197 -0
  465. package/src/scripts/simple.ts +225 -0
  466. package/src/scripts/single-agent-metadata-test.ts +198 -0
  467. package/src/scripts/stream.ts +140 -0
  468. package/src/scripts/test-custom-prompt-key.ts +145 -0
  469. package/src/scripts/test-handoff-input.ts +170 -0
  470. package/src/scripts/test-handoff-preamble.ts +277 -0
  471. package/src/scripts/test-multi-agent-list-handoff.ts +417 -0
  472. package/src/scripts/test-parallel-agent-labeling.ts +325 -0
  473. package/src/scripts/test-parallel-handoffs.ts +291 -0
  474. package/src/scripts/test-thinking-handoff-bedrock.ts +153 -0
  475. package/src/scripts/test-thinking-handoff.ts +155 -0
  476. package/src/scripts/test-tools-before-handoff.ts +226 -0
  477. package/src/scripts/test_code_api.ts +361 -0
  478. package/src/scripts/thinking-bedrock.ts +159 -0
  479. package/src/scripts/thinking.ts +171 -0
  480. package/src/scripts/tool_search.ts +162 -0
  481. package/src/scripts/tools.ts +177 -0
  482. package/src/specs/agent-handoffs.test.ts +888 -0
  483. package/src/specs/anthropic.simple.test.ts +387 -0
  484. package/src/specs/azure.simple.test.ts +364 -0
  485. package/src/specs/cache.simple.test.ts +396 -0
  486. package/src/specs/deepseek.simple.test.ts +283 -0
  487. package/src/specs/emergency-prune.test.ts +407 -0
  488. package/src/specs/moonshot.simple.test.ts +358 -0
  489. package/src/specs/openai.simple.test.ts +311 -0
  490. package/src/specs/openrouter.simple.test.ts +107 -0
  491. package/src/specs/prune.test.ts +901 -0
  492. package/src/specs/reasoning.test.ts +201 -0
  493. package/src/specs/spec.utils.ts +3 -0
  494. package/src/specs/thinking-handoff.test.ts +620 -0
  495. package/src/specs/thinking-prune.test.ts +703 -0
  496. package/src/specs/token-distribution-edge-case.test.ts +316 -0
  497. package/src/specs/token-memoization.test.ts +32 -0
  498. package/src/specs/tool-error.test.ts +198 -0
  499. package/src/splitStream.test.ts +691 -0
  500. package/src/splitStream.ts +234 -0
  501. package/src/stream.test.ts +94 -0
  502. package/src/stream.ts +801 -0
  503. package/src/test/mockTools.ts +386 -0
  504. package/src/tools/BrowserTools.ts +393 -0
  505. package/src/tools/Calculator.test.ts +278 -0
  506. package/src/tools/Calculator.ts +46 -0
  507. package/src/tools/CodeExecutor.ts +270 -0
  508. package/src/tools/ProgrammaticToolCalling.ts +785 -0
  509. package/src/tools/ToolNode.ts +674 -0
  510. package/src/tools/ToolSearch.ts +1095 -0
  511. package/src/tools/__tests__/BrowserTools.test.ts +265 -0
  512. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.ts +319 -0
  513. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +1006 -0
  514. package/src/tools/__tests__/ToolSearch.integration.test.ts +162 -0
  515. package/src/tools/__tests__/ToolSearch.test.ts +1003 -0
  516. package/src/tools/handlers.ts +363 -0
  517. package/src/tools/schema.ts +37 -0
  518. package/src/tools/search/anthropic.ts +51 -0
  519. package/src/tools/search/content.test.ts +173 -0
  520. package/src/tools/search/content.ts +147 -0
  521. package/src/tools/search/firecrawl.ts +210 -0
  522. package/src/tools/search/format.ts +250 -0
  523. package/src/tools/search/highlights.ts +320 -0
  524. package/src/tools/search/index.ts +3 -0
  525. package/src/tools/search/jina-reranker.test.ts +130 -0
  526. package/src/tools/search/output.md +2775 -0
  527. package/src/tools/search/rerankers.ts +242 -0
  528. package/src/tools/search/schema.ts +113 -0
  529. package/src/tools/search/search.ts +768 -0
  530. package/src/tools/search/serper-scraper.ts +155 -0
  531. package/src/tools/search/test.html +884 -0
  532. package/src/tools/search/test.md +643 -0
  533. package/src/tools/search/test.ts +159 -0
  534. package/src/tools/search/tool.ts +657 -0
  535. package/src/tools/search/types.ts +665 -0
  536. package/src/tools/search/utils.ts +79 -0
  537. package/src/types/graph.test.ts +218 -0
  538. package/src/types/graph.ts +533 -0
  539. package/src/types/index.ts +6 -0
  540. package/src/types/llm.ts +140 -0
  541. package/src/types/messages.ts +4 -0
  542. package/src/types/run.ts +128 -0
  543. package/src/types/stream.ts +417 -0
  544. package/src/types/tools.ts +355 -0
  545. package/src/utils/contextAnalytics.ts +103 -0
  546. package/src/utils/events.ts +32 -0
  547. package/src/utils/graph.ts +11 -0
  548. package/src/utils/handlers.ts +107 -0
  549. package/src/utils/index.ts +9 -0
  550. package/src/utils/llm.ts +26 -0
  551. package/src/utils/llmConfig.ts +208 -0
  552. package/src/utils/logging.ts +48 -0
  553. package/src/utils/misc.ts +57 -0
  554. package/src/utils/run.ts +106 -0
  555. package/src/utils/schema.ts +35 -0
  556. package/src/utils/title.ts +177 -0
  557. package/src/utils/tokens.ts +142 -0
  558. package/src/utils/toonFormat.ts +475 -0
@@ -0,0 +1,674 @@
1
+ import { ToolCall } from '@langchain/core/messages/tool';
2
+ import {
3
+ ToolMessage,
4
+ isAIMessage,
5
+ isBaseMessage,
6
+ } from '@langchain/core/messages';
7
+ import {
8
+ END,
9
+ Send,
10
+ Command,
11
+ isCommand,
12
+ isGraphInterrupt,
13
+ MessagesAnnotation,
14
+ } from '@langchain/langgraph';
15
+ import type {
16
+ RunnableConfig,
17
+ RunnableToolLike,
18
+ } from '@langchain/core/runnables';
19
+ import type { BaseMessage, AIMessage } from '@langchain/core/messages';
20
+ import type { StructuredToolInterface } from '@langchain/core/tools';
21
+ import type * as t from '@/types';
22
+ import { RunnableCallable } from '@/utils';
23
+ import { processToolOutput } from '@/utils/toonFormat';
24
+ import { safeDispatchCustomEvent } from '@/utils/events';
25
+ import { Constants, GraphEvents } from '@/common';
26
+
27
+ /**
28
+ * Helper to check if a value is a Send object
29
+ */
30
+ function isSend(value: unknown): value is Send {
31
+ return value instanceof Send;
32
+ }
33
+
34
+ /**
35
+ * Extract text content from a ToolMessage content field.
36
+ * Handles both string and MessageContentComplex[] formats.
37
+ * For array content (e.g., from content_and_artifact tools), extracts text from text blocks.
38
+ */
39
+ function extractStringContent(content: unknown): string {
40
+ // Already a string - return as is
41
+ if (typeof content === 'string') {
42
+ return content;
43
+ }
44
+
45
+ // Array of content blocks - extract text from each
46
+ if (Array.isArray(content)) {
47
+ const textParts: string[] = [];
48
+ for (const block of content) {
49
+ if (typeof block === 'string') {
50
+ textParts.push(block);
51
+ } else if (block && typeof block === 'object') {
52
+ // Handle {type: 'text', text: '...'} format
53
+ const obj = block as Record<string, unknown>;
54
+ if (obj.type === 'text' && typeof obj.text === 'string') {
55
+ textParts.push(obj.text);
56
+ } else if (typeof obj.text === 'string') {
57
+ // Just has 'text' property
58
+ textParts.push(obj.text);
59
+ }
60
+ }
61
+ }
62
+ if (textParts.length > 0) {
63
+ return textParts.join('\n');
64
+ }
65
+ }
66
+
67
+ // Fallback: stringify whatever it is
68
+ return JSON.stringify(content);
69
+ }
70
+
71
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
72
+ export class ToolNode<T = any> extends RunnableCallable<T, T> {
73
+ private toolMap: Map<string, StructuredToolInterface | RunnableToolLike>;
74
+ private loadRuntimeTools?: t.ToolRefGenerator;
75
+ handleToolErrors = true;
76
+ trace = false;
77
+ toolCallStepIds?: Map<string, string>;
78
+ errorHandler?: t.ToolNodeConstructorParams['errorHandler'];
79
+ private toolUsageCount: Map<string, number>;
80
+ /** Tool registry for filtering (lazy computation of programmatic maps) */
81
+ private toolRegistry?: t.LCToolRegistry;
82
+ /** Cached programmatic tools (computed once on first PTC call) */
83
+ private programmaticCache?: t.ProgrammaticCache;
84
+ /** Reference to Graph's sessions map for automatic session injection */
85
+ private sessions?: t.ToolSessionMap;
86
+ /** When true, dispatches ON_TOOL_EXECUTE events instead of invoking tools directly */
87
+ private eventDrivenMode: boolean = false;
88
+ /** Tool definitions for event-driven mode */
89
+ private toolDefinitions?: Map<string, t.LCTool>;
90
+ /** Agent ID for event-driven mode */
91
+ private agentId?: string;
92
+
93
+ constructor({
94
+ tools,
95
+ toolMap,
96
+ name,
97
+ tags,
98
+ errorHandler,
99
+ toolCallStepIds,
100
+ handleToolErrors,
101
+ loadRuntimeTools,
102
+ toolRegistry,
103
+ sessions,
104
+ eventDrivenMode,
105
+ toolDefinitions,
106
+ agentId,
107
+ }: t.ToolNodeConstructorParams) {
108
+ super({ name, tags, func: (input, config) => this.run(input, config) });
109
+ this.toolMap = toolMap ?? new Map(tools.map((tool) => [tool.name, tool]));
110
+ this.toolCallStepIds = toolCallStepIds;
111
+ this.handleToolErrors = handleToolErrors ?? this.handleToolErrors;
112
+ this.loadRuntimeTools = loadRuntimeTools;
113
+ this.errorHandler = errorHandler;
114
+ this.toolUsageCount = new Map<string, number>();
115
+ this.toolRegistry = toolRegistry;
116
+ this.sessions = sessions;
117
+ this.eventDrivenMode = eventDrivenMode ?? false;
118
+ this.toolDefinitions = toolDefinitions;
119
+ this.agentId = agentId;
120
+ }
121
+
122
+ /**
123
+ * Returns cached programmatic tools, computing once on first access.
124
+ * Single iteration builds both toolMap and toolDefs simultaneously.
125
+ */
126
+ private getProgrammaticTools(): { toolMap: t.ToolMap; toolDefs: t.LCTool[] } {
127
+ if (this.programmaticCache) return this.programmaticCache;
128
+
129
+ const toolMap: t.ToolMap = new Map();
130
+ const toolDefs: t.LCTool[] = [];
131
+
132
+ if (this.toolRegistry) {
133
+ for (const [name, toolDef] of this.toolRegistry) {
134
+ if (
135
+ (toolDef.allowed_callers ?? ['direct']).includes('code_execution')
136
+ ) {
137
+ toolDefs.push(toolDef);
138
+ const tool = this.toolMap.get(name);
139
+ if (tool) toolMap.set(name, tool);
140
+ }
141
+ }
142
+ }
143
+
144
+ this.programmaticCache = { toolMap, toolDefs };
145
+ return this.programmaticCache;
146
+ }
147
+
148
+ /**
149
+ * Returns a snapshot of the current tool usage counts.
150
+ * @returns A ReadonlyMap where keys are tool names and values are their usage counts.
151
+ */
152
+ public getToolUsageCounts(): ReadonlyMap<string, number> {
153
+ return new Map(this.toolUsageCount); // Return a copy
154
+ }
155
+
156
+ /**
157
+ * Runs a single tool call with error handling
158
+ */
159
+ protected async runTool(
160
+ call: ToolCall,
161
+ config: RunnableConfig
162
+ ): Promise<BaseMessage | Command> {
163
+ const tool = this.toolMap.get(call.name);
164
+ try {
165
+ if (tool === undefined) {
166
+ throw new Error(`Tool "${call.name}" not found.`);
167
+ }
168
+ const turn = this.toolUsageCount.get(call.name) ?? 0;
169
+ this.toolUsageCount.set(call.name, turn + 1);
170
+ const args = call.args;
171
+ const stepId = this.toolCallStepIds?.get(call.id!);
172
+
173
+ // Build invoke params - LangChain extracts non-schema fields to config.toolCall
174
+ let invokeParams: Record<string, unknown> = {
175
+ ...call,
176
+ args,
177
+ type: 'tool_call',
178
+ stepId,
179
+ turn,
180
+ };
181
+
182
+ // Inject runtime data for special tools (becomes available at config.toolCall)
183
+ if (call.name === Constants.PROGRAMMATIC_TOOL_CALLING) {
184
+ const { toolMap, toolDefs } = this.getProgrammaticTools();
185
+ invokeParams = {
186
+ ...invokeParams,
187
+ toolMap,
188
+ toolDefs,
189
+ };
190
+ } else if (call.name === Constants.TOOL_SEARCH) {
191
+ invokeParams = {
192
+ ...invokeParams,
193
+ toolRegistry: this.toolRegistry,
194
+ };
195
+ }
196
+
197
+ /**
198
+ * Inject session context for code execution tools when available.
199
+ * Each file uses its own session_id (supporting multi-session file tracking).
200
+ * Both session_id and _injected_files are injected directly to invokeParams
201
+ * (not inside args) so they bypass Zod schema validation and reach config.toolCall.
202
+ */
203
+ if (
204
+ call.name === Constants.EXECUTE_CODE ||
205
+ call.name === Constants.PROGRAMMATIC_TOOL_CALLING
206
+ ) {
207
+ const codeSession = this.sessions?.get(Constants.EXECUTE_CODE) as
208
+ | t.CodeSessionContext
209
+ | undefined;
210
+ if (codeSession?.files != null && codeSession.files.length > 0) {
211
+ /**
212
+ * Convert tracked files to CodeEnvFile format for the API.
213
+ * Each file uses its own session_id (set when file was created).
214
+ * This supports files from multiple parallel/sequential executions.
215
+ */
216
+ const fileRefs: t.CodeEnvFile[] = codeSession.files.map((file) => ({
217
+ session_id: file.session_id ?? codeSession.session_id,
218
+ id: file.id,
219
+ name: file.name,
220
+ }));
221
+ /** Inject latest session_id and files - bypasses Zod, reaches config.toolCall */
222
+ invokeParams = {
223
+ ...invokeParams,
224
+ session_id: codeSession.session_id,
225
+ _injected_files: fileRefs,
226
+ };
227
+ }
228
+ }
229
+
230
+ const output = await tool.invoke(invokeParams, config);
231
+
232
+ // Handle Command outputs directly
233
+ if (isCommand(output)) {
234
+ return output;
235
+ }
236
+
237
+ // ========================================================================
238
+ // TOOL OUTPUT PROCESSING - Single point for all tools (MCP and non-MCP)
239
+ // 1. Extract string content from any output format
240
+ // 2. Apply TOON conversion if content contains JSON
241
+ // 3. Apply truncation if still too large
242
+ // 4. Return ToolMessage with processed string content
243
+ // ========================================================================
244
+
245
+ // Step 1: Extract string content from the output
246
+ let rawContent: string;
247
+ if (isBaseMessage(output) && output._getType() === 'tool') {
248
+ const toolMsg = output as ToolMessage;
249
+ rawContent = extractStringContent(toolMsg.content);
250
+ } else {
251
+ rawContent = extractStringContent(output);
252
+ }
253
+
254
+ // Step 2 & 3: Apply TOON conversion and truncation
255
+ const processed = processToolOutput(rawContent, {
256
+ maxLength: 100000, // 100K char limit
257
+ enableToon: true,
258
+ minSizeForToon: 1000,
259
+ minReductionPercent: 10, // Only apply TOON when clearly beneficial
260
+ });
261
+
262
+ // Step 4: Return ToolMessage with processed string content
263
+ if (isBaseMessage(output) && output._getType() === 'tool') {
264
+ const toolMsg = output as ToolMessage;
265
+ return new ToolMessage({
266
+ status: toolMsg.status,
267
+ name: toolMsg.name,
268
+ content: processed.content,
269
+ tool_call_id: toolMsg.tool_call_id,
270
+ });
271
+ } else {
272
+ return new ToolMessage({
273
+ status: 'success',
274
+ name: tool.name,
275
+ content: processed.content,
276
+ tool_call_id: call.id!,
277
+ });
278
+ }
279
+ } catch (_e: unknown) {
280
+ const e = _e as Error;
281
+ if (!this.handleToolErrors) {
282
+ throw e;
283
+ }
284
+ if (isGraphInterrupt(e)) {
285
+ throw e;
286
+ }
287
+ if (this.errorHandler) {
288
+ try {
289
+ await this.errorHandler(
290
+ {
291
+ error: e,
292
+ id: call.id!,
293
+ name: call.name,
294
+ input: call.args,
295
+ },
296
+ config.metadata
297
+ );
298
+ } catch (handlerError) {
299
+ // eslint-disable-next-line no-console
300
+ console.error('Error in errorHandler:', {
301
+ toolName: call.name,
302
+ toolCallId: call.id,
303
+ toolArgs: call.args,
304
+ stepId: this.toolCallStepIds?.get(call.id!),
305
+ turn: this.toolUsageCount.get(call.name),
306
+ originalError: {
307
+ message: e.message,
308
+ stack: e.stack ?? undefined,
309
+ },
310
+ handlerError:
311
+ handlerError instanceof Error
312
+ ? {
313
+ message: handlerError.message,
314
+ stack: handlerError.stack ?? undefined,
315
+ }
316
+ : {
317
+ message: String(handlerError),
318
+ stack: undefined,
319
+ },
320
+ });
321
+ }
322
+ }
323
+ return new ToolMessage({
324
+ status: 'error',
325
+ content: `Error: ${e.message}\n Please fix your mistakes.`,
326
+ name: call.name,
327
+ tool_call_id: call.id ?? '',
328
+ });
329
+ }
330
+ }
331
+
332
+ /**
333
+ * Execute all tool calls via ON_TOOL_EXECUTE event dispatch.
334
+ * Used in event-driven mode where the host handles actual tool execution.
335
+ */
336
+ private async executeViaEvent(
337
+ toolCalls: ToolCall[],
338
+ config: RunnableConfig,
339
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
340
+ input: any
341
+ ): Promise<T> {
342
+ const requests: t.ToolCallRequest[] = toolCalls.map((call) => {
343
+ const turn = this.toolUsageCount.get(call.name) ?? 0;
344
+ this.toolUsageCount.set(call.name, turn + 1);
345
+ return {
346
+ id: call.id!,
347
+ name: call.name,
348
+ args: call.args as Record<string, unknown>,
349
+ stepId: this.toolCallStepIds?.get(call.id!),
350
+ turn,
351
+ };
352
+ });
353
+
354
+ const results = await new Promise<t.ToolExecuteResult[]>(
355
+ (resolve, reject) => {
356
+ const request: t.ToolExecuteBatchRequest = {
357
+ toolCalls: requests,
358
+ userId: config.configurable?.user_id as string | undefined,
359
+ agentId: this.agentId,
360
+ configurable: config.configurable as
361
+ | Record<string, unknown>
362
+ | undefined,
363
+ metadata: config.metadata as Record<string, unknown> | undefined,
364
+ resolve,
365
+ reject,
366
+ };
367
+
368
+ safeDispatchCustomEvent(GraphEvents.ON_TOOL_EXECUTE, request, config);
369
+ }
370
+ );
371
+
372
+ const outputs: ToolMessage[] = results.map((result) => {
373
+ const request = requests.find((r) => r.id === result.toolCallId);
374
+ const toolName = request?.name ?? 'unknown';
375
+ const stepId = this.toolCallStepIds?.get(result.toolCallId) ?? '';
376
+
377
+ let toolMessage: ToolMessage;
378
+ let contentString: string;
379
+
380
+ if (result.status === 'error') {
381
+ contentString = `Error: ${result.errorMessage ?? 'Unknown error'}\n Please fix your mistakes.`;
382
+ toolMessage = new ToolMessage({
383
+ status: 'error',
384
+ content: contentString,
385
+ name: toolName,
386
+ tool_call_id: result.toolCallId,
387
+ });
388
+ } else {
389
+ contentString =
390
+ typeof result.content === 'string'
391
+ ? result.content
392
+ : JSON.stringify(result.content);
393
+ toolMessage = new ToolMessage({
394
+ status: 'success',
395
+ name: toolName,
396
+ content: contentString,
397
+ artifact: result.artifact,
398
+ tool_call_id: result.toolCallId,
399
+ });
400
+ }
401
+
402
+ const tool_call: t.ProcessedToolCall = {
403
+ args:
404
+ typeof request?.args === 'string'
405
+ ? request.args
406
+ : JSON.stringify(request?.args ?? {}),
407
+ name: toolName,
408
+ id: result.toolCallId,
409
+ output: contentString,
410
+ progress: 1,
411
+ };
412
+
413
+ const runStepCompletedData = {
414
+ result: {
415
+ id: stepId,
416
+ index: request?.turn ?? 0,
417
+ type: 'tool_call' as const,
418
+ tool_call,
419
+ },
420
+ };
421
+
422
+ safeDispatchCustomEvent(
423
+ GraphEvents.ON_RUN_STEP_COMPLETED,
424
+ runStepCompletedData,
425
+ config
426
+ );
427
+
428
+ return toolMessage;
429
+ });
430
+
431
+ return (Array.isArray(input) ? outputs : { messages: outputs }) as T;
432
+ }
433
+
434
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
435
+ protected async run(input: any, config: RunnableConfig): Promise<T> {
436
+ let outputs: (BaseMessage | Command)[];
437
+
438
+ if (this.isSendInput(input)) {
439
+ if (this.eventDrivenMode) {
440
+ return this.executeViaEvent([input.lg_tool_call], config, input);
441
+ }
442
+ outputs = [await this.runTool(input.lg_tool_call, config)];
443
+ } else {
444
+ let messages: BaseMessage[];
445
+ if (Array.isArray(input)) {
446
+ messages = input;
447
+ } else if (this.isMessagesState(input)) {
448
+ messages = input.messages;
449
+ } else {
450
+ throw new Error(
451
+ 'ToolNode only accepts BaseMessage[] or { messages: BaseMessage[] } as input.'
452
+ );
453
+ }
454
+
455
+ const toolMessageIds: Set<string> = new Set(
456
+ messages
457
+ .filter((msg) => msg._getType() === 'tool')
458
+ .map((msg) => (msg as ToolMessage).tool_call_id)
459
+ );
460
+
461
+ let aiMessage: AIMessage | undefined;
462
+ for (let i = messages.length - 1; i >= 0; i--) {
463
+ const message = messages[i];
464
+ if (isAIMessage(message)) {
465
+ aiMessage = message;
466
+ break;
467
+ }
468
+ }
469
+
470
+ if (aiMessage == null || !isAIMessage(aiMessage)) {
471
+ throw new Error('ToolNode only accepts AIMessages as input.');
472
+ }
473
+
474
+ if (this.loadRuntimeTools) {
475
+ const { tools, toolMap } = this.loadRuntimeTools(
476
+ aiMessage.tool_calls ?? []
477
+ );
478
+ this.toolMap =
479
+ toolMap ?? new Map(tools.map((tool) => [tool.name, tool]));
480
+ this.programmaticCache = undefined; // Invalidate cache on toolMap change
481
+ }
482
+
483
+ const filteredCalls =
484
+ aiMessage.tool_calls?.filter((call) => {
485
+ /**
486
+ * Filter out:
487
+ * 1. Already processed tool calls (present in toolMessageIds)
488
+ * 2. Server tool calls (e.g., web_search with IDs starting with 'srvtoolu_')
489
+ * which are executed by the provider's API and don't require invocation
490
+ */
491
+ return (
492
+ (call.id == null || !toolMessageIds.has(call.id)) &&
493
+ !(call.id?.startsWith('srvtoolu_') ?? false)
494
+ );
495
+ }) ?? [];
496
+
497
+ if (this.eventDrivenMode && filteredCalls.length > 0) {
498
+ return this.executeViaEvent(filteredCalls, config, input);
499
+ }
500
+
501
+ outputs = await Promise.all(
502
+ filteredCalls.map((call) => this.runTool(call, config))
503
+ );
504
+ }
505
+
506
+ if (!outputs.some(isCommand)) {
507
+ return (Array.isArray(input) ? outputs : { messages: outputs }) as T;
508
+ }
509
+
510
+ const combinedOutputs: (
511
+ | { messages: BaseMessage[] }
512
+ | BaseMessage[]
513
+ | Command
514
+ )[] = [];
515
+ let parentCommand: Command | null = null;
516
+
517
+ /**
518
+ * Collect handoff commands (Commands with string goto and Command.PARENT)
519
+ * for potential parallel handoff aggregation
520
+ */
521
+ const handoffCommands: Command[] = [];
522
+ const nonCommandOutputs: BaseMessage[] = [];
523
+
524
+ for (const output of outputs) {
525
+ if (isCommand(output)) {
526
+ if (
527
+ output.graph === Command.PARENT &&
528
+ Array.isArray(output.goto) &&
529
+ output.goto.every((send): send is Send => isSend(send))
530
+ ) {
531
+ /** Aggregate Send-based commands */
532
+ if (parentCommand) {
533
+ (parentCommand.goto as Send[]).push(...(output.goto as Send[]));
534
+ } else {
535
+ parentCommand = new Command({
536
+ graph: Command.PARENT,
537
+ goto: output.goto,
538
+ });
539
+ }
540
+ } else if (output.graph === Command.PARENT) {
541
+ /**
542
+ * Handoff Command with destination.
543
+ * Handle both string ('agent') and array (['agent']) formats.
544
+ * Collect for potential parallel aggregation.
545
+ */
546
+ const goto = output.goto;
547
+ const isSingleStringDest = typeof goto === 'string';
548
+ const isSingleArrayDest =
549
+ Array.isArray(goto) &&
550
+ goto.length === 1 &&
551
+ typeof goto[0] === 'string';
552
+
553
+ if (isSingleStringDest || isSingleArrayDest) {
554
+ handoffCommands.push(output);
555
+ } else {
556
+ /** Multi-destination or other command - pass through */
557
+ combinedOutputs.push(output);
558
+ }
559
+ } else {
560
+ /** Other commands - pass through */
561
+ combinedOutputs.push(output);
562
+ }
563
+ } else {
564
+ nonCommandOutputs.push(output);
565
+ combinedOutputs.push(
566
+ Array.isArray(input) ? [output] : { messages: [output] }
567
+ );
568
+ }
569
+ }
570
+
571
+ /**
572
+ * Handle handoff commands - convert to Send objects for parallel execution
573
+ * when multiple handoffs are requested
574
+ */
575
+ if (handoffCommands.length > 1) {
576
+ /**
577
+ * Multiple parallel handoffs - convert to Send objects.
578
+ * Each Send carries its own state with the appropriate messages.
579
+ * This enables LLM-initiated parallel execution when calling multiple
580
+ * transfer tools simultaneously.
581
+ */
582
+
583
+ /** Collect all destinations for sibling tracking */
584
+ const allDestinations = handoffCommands.map((cmd) => {
585
+ const goto = cmd.goto;
586
+ return typeof goto === 'string' ? goto : (goto as string[])[0];
587
+ });
588
+
589
+ const sends = handoffCommands.map((cmd, idx) => {
590
+ const destination = allDestinations[idx];
591
+ /** Get siblings (other destinations, not this one) */
592
+ const siblings = allDestinations.filter((d) => d !== destination);
593
+
594
+ /** Add siblings to ToolMessage additional_kwargs */
595
+ const update = cmd.update as { messages?: BaseMessage[] } | undefined;
596
+ if (update && update.messages) {
597
+ for (const msg of update.messages) {
598
+ if (msg.getType() === 'tool') {
599
+ (msg as ToolMessage).additional_kwargs.handoff_parallel_siblings =
600
+ siblings;
601
+ }
602
+ }
603
+ }
604
+
605
+ return new Send(destination, cmd.update);
606
+ });
607
+
608
+ const parallelCommand = new Command({
609
+ graph: Command.PARENT,
610
+ goto: sends,
611
+ });
612
+ combinedOutputs.push(parallelCommand);
613
+ } else if (handoffCommands.length === 1) {
614
+ /** Single handoff - pass through as-is */
615
+ combinedOutputs.push(handoffCommands[0]);
616
+ }
617
+
618
+ if (parentCommand) {
619
+ combinedOutputs.push(parentCommand);
620
+ }
621
+
622
+ return combinedOutputs as T;
623
+ }
624
+
625
+ private isSendInput(input: unknown): input is { lg_tool_call: ToolCall } {
626
+ return (
627
+ typeof input === 'object' && input != null && 'lg_tool_call' in input
628
+ );
629
+ }
630
+
631
+ private isMessagesState(
632
+ input: unknown
633
+ ): input is { messages: BaseMessage[] } {
634
+ return (
635
+ typeof input === 'object' &&
636
+ input != null &&
637
+ 'messages' in input &&
638
+ Array.isArray((input as { messages: unknown }).messages) &&
639
+ (input as { messages: unknown[] }).messages.every(isBaseMessage)
640
+ );
641
+ }
642
+ }
643
+
644
+ function areToolCallsInvoked(
645
+ message: AIMessage,
646
+ invokedToolIds?: Set<string>
647
+ ): boolean {
648
+ if (!invokedToolIds || invokedToolIds.size === 0) return false;
649
+ return (
650
+ message.tool_calls?.every(
651
+ (toolCall) => toolCall.id != null && invokedToolIds.has(toolCall.id)
652
+ ) ?? false
653
+ );
654
+ }
655
+
656
+ export function toolsCondition<T extends string>(
657
+ state: BaseMessage[] | typeof MessagesAnnotation.State,
658
+ toolNode: T,
659
+ invokedToolIds?: Set<string>
660
+ ): T | typeof END {
661
+ const message: AIMessage = Array.isArray(state)
662
+ ? state[state.length - 1]
663
+ : state.messages[state.messages.length - 1];
664
+
665
+ if (
666
+ 'tool_calls' in message &&
667
+ (message.tool_calls?.length ?? 0) > 0 &&
668
+ !areToolCallsInvoked(message, invokedToolIds)
669
+ ) {
670
+ return toolNode;
671
+ } else {
672
+ return END;
673
+ }
674
+ }