@illuma-ai/agents 1.0.90 → 1.0.94

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 (839) 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 +60 -5
  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 +60 -5
  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 +28 -4
  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 +82 -5
  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__/CodeExecutor.test.ts +76 -0
  718. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js +276 -0
  719. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js.map +1 -0
  720. package/src/tools/__tests__/ProgrammaticToolCalling.test.js +807 -0
  721. package/src/tools/__tests__/ProgrammaticToolCalling.test.js.map +1 -0
  722. package/src/tools/__tests__/StreamingToolCallBuffer.test.js +175 -0
  723. package/src/tools/__tests__/StreamingToolCallBuffer.test.js.map +1 -0
  724. package/src/tools/__tests__/StreamingToolCallBuffer.test.ts +263 -0
  725. package/src/tools/__tests__/ToolApproval.test.js +675 -0
  726. package/src/tools/__tests__/ToolApproval.test.js.map +1 -0
  727. package/src/tools/__tests__/ToolApproval.test.ts +194 -20
  728. package/src/tools/__tests__/ToolNode.hitl.test.ts +267 -0
  729. package/src/tools/__tests__/ToolNode.recovery.test.js +200 -0
  730. package/src/tools/__tests__/ToolNode.recovery.test.js.map +1 -0
  731. package/src/tools/__tests__/ToolNode.recovery.test.ts +276 -0
  732. package/src/tools/__tests__/ToolNode.session.test.js +319 -0
  733. package/src/tools/__tests__/ToolNode.session.test.js.map +1 -0
  734. package/src/tools/__tests__/ToolNode.session.test.ts +465 -0
  735. package/src/tools/__tests__/ToolSearch.integration.test.js +125 -0
  736. package/src/tools/__tests__/ToolSearch.integration.test.js.map +1 -0
  737. package/src/tools/__tests__/ToolSearch.test.js +812 -0
  738. package/src/tools/__tests__/ToolSearch.test.js.map +1 -0
  739. package/src/tools/__tests__/ToolSearch.test.ts +78 -5
  740. package/src/tools/__tests__/handlers.test.js +799 -0
  741. package/src/tools/__tests__/handlers.test.js.map +1 -0
  742. package/src/tools/__tests__/handlers.test.ts +1100 -0
  743. package/src/tools/__tests__/truncation-recovery.integration.test.js +362 -0
  744. package/src/tools/__tests__/truncation-recovery.integration.test.js.map +1 -0
  745. package/src/tools/__tests__/truncation-recovery.integration.test.ts +560 -0
  746. package/src/tools/handlers.js +306 -0
  747. package/src/tools/handlers.js.map +1 -0
  748. package/src/tools/handlers.ts +119 -16
  749. package/src/tools/schema.js +25 -0
  750. package/src/tools/schema.js.map +1 -0
  751. package/src/tools/search/anthropic.js +34 -0
  752. package/src/tools/search/anthropic.js.map +1 -0
  753. package/src/tools/search/content.js +116 -0
  754. package/src/tools/search/content.js.map +1 -0
  755. package/src/tools/search/content.test.js +133 -0
  756. package/src/tools/search/content.test.js.map +1 -0
  757. package/src/tools/search/firecrawl.js +173 -0
  758. package/src/tools/search/firecrawl.js.map +1 -0
  759. package/src/tools/search/format.js +198 -0
  760. package/src/tools/search/format.js.map +1 -0
  761. package/src/tools/search/highlights.js +241 -0
  762. package/src/tools/search/highlights.js.map +1 -0
  763. package/src/tools/search/index.js +3 -0
  764. package/src/tools/search/index.js.map +1 -0
  765. package/src/tools/search/jina-reranker.test.js +106 -0
  766. package/src/tools/search/jina-reranker.test.js.map +1 -0
  767. package/src/tools/search/rerankers.js +165 -0
  768. package/src/tools/search/rerankers.js.map +1 -0
  769. package/src/tools/search/schema.js +102 -0
  770. package/src/tools/search/schema.js.map +1 -0
  771. package/src/tools/search/search.js +561 -0
  772. package/src/tools/search/search.js.map +1 -0
  773. package/src/tools/search/serper-scraper.js +126 -0
  774. package/src/tools/search/serper-scraper.js.map +1 -0
  775. package/src/tools/search/test.js +129 -0
  776. package/src/tools/search/test.js.map +1 -0
  777. package/src/tools/search/tool.js +453 -0
  778. package/src/tools/search/tool.js.map +1 -0
  779. package/src/tools/search/types.js +2 -0
  780. package/src/tools/search/types.js.map +1 -0
  781. package/src/tools/search/utils.js +59 -0
  782. package/src/tools/search/utils.js.map +1 -0
  783. package/src/types/graph.js +24 -0
  784. package/src/types/graph.js.map +1 -0
  785. package/src/types/graph.test.js +192 -0
  786. package/src/types/graph.test.js.map +1 -0
  787. package/src/types/graph.ts +26 -6
  788. package/src/types/index.js +7 -0
  789. package/src/types/index.js.map +1 -0
  790. package/src/types/llm.js +2 -0
  791. package/src/types/llm.js.map +1 -0
  792. package/src/types/llm.ts +8 -3
  793. package/src/types/messages.js +2 -0
  794. package/src/types/messages.js.map +1 -0
  795. package/src/types/run.js +2 -0
  796. package/src/types/run.js.map +1 -0
  797. package/src/types/run.ts +2 -0
  798. package/src/types/stream.js +2 -0
  799. package/src/types/stream.js.map +1 -0
  800. package/src/types/tools.js +2 -0
  801. package/src/types/tools.js.map +1 -0
  802. package/src/types/tools.ts +21 -2
  803. package/src/utils/contextAnalytics.js +79 -0
  804. package/src/utils/contextAnalytics.js.map +1 -0
  805. package/src/utils/contextAnalytics.test.js +166 -0
  806. package/src/utils/contextAnalytics.test.js.map +1 -0
  807. package/src/utils/contextAnalytics.test.ts +222 -0
  808. package/src/utils/contextAnalytics.ts +27 -9
  809. package/src/utils/events.js +26 -0
  810. package/src/utils/events.js.map +1 -0
  811. package/src/utils/graph.js +11 -0
  812. package/src/utils/graph.js.map +1 -0
  813. package/src/utils/handlers.js +65 -0
  814. package/src/utils/handlers.js.map +1 -0
  815. package/src/utils/index.js +10 -0
  816. package/src/utils/index.js.map +1 -0
  817. package/src/utils/index.ts +1 -0
  818. package/src/utils/llm.js +21 -0
  819. package/src/utils/llm.js.map +1 -0
  820. package/src/utils/llmConfig.js +205 -0
  821. package/src/utils/llmConfig.js.map +1 -0
  822. package/src/utils/llmConfig.ts +5 -5
  823. package/src/utils/logging.js +37 -0
  824. package/src/utils/logging.js.map +1 -0
  825. package/src/utils/misc.js +51 -0
  826. package/src/utils/misc.js.map +1 -0
  827. package/src/utils/run.js +69 -0
  828. package/src/utils/run.js.map +1 -0
  829. package/src/utils/run.ts +108 -106
  830. package/src/utils/schema.js +21 -0
  831. package/src/utils/schema.js.map +1 -0
  832. package/src/utils/title.js +119 -0
  833. package/src/utils/title.js.map +1 -0
  834. package/src/utils/tokens.js +92 -0
  835. package/src/utils/tokens.js.map +1 -0
  836. package/src/utils/tokens.ts +118 -142
  837. package/src/utils/toolCallContinuation.ts +55 -0
  838. package/src/utils/toonFormat.js +379 -0
  839. package/src/utils/toonFormat.js.map +1 -0
@@ -1,375 +1,412 @@
1
- /**
2
- * Integration test: Agent Handoff with Bedrock
3
- *
4
- * Verifies end-to-end that:
5
- * 1. Handoff tool descriptions are enriched with agent name + description
6
- * 2. The LLM (Bedrock Claude) can see and use these descriptions to route correctly
7
- * 3. The handoff actually transfers control to the correct agent
8
- *
9
- * Requires: BEDROCK_AWS_ACCESS_KEY_ID, BEDROCK_AWS_SECRET_ACCESS_KEY, BEDROCK_AWS_REGION
10
- */
11
- import { config } from 'dotenv';
12
- import { resolve } from 'path';
13
- // Load from local .env first, then fall back to ranger's .env for Bedrock credentials
14
- config();
15
- config({ path: resolve(process.cwd(), '..', 'ranger', '.env'), override: false });
16
-
17
- import { HumanMessage, ToolMessage } from '@langchain/core/messages';
18
- import type { RunnableConfig } from '@langchain/core/runnables';
19
- import type * as t from '@/types';
20
- import { Providers, Constants, GraphEvents } from '@/common';
21
- import { StandardGraph } from '@/graphs/Graph';
22
- import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
23
- import { ToolEndHandler, ModelEndHandler } from '@/events';
24
- import { Run } from '@/run';
25
-
26
- const bedrockRegion = process.env.BEDROCK_AWS_REGION || process.env.BEDROCK_AWS_DEFAULT_REGION;
27
- const hasBedrock =
28
- process.env.BEDROCK_AWS_ACCESS_KEY_ID &&
29
- process.env.BEDROCK_AWS_SECRET_ACCESS_KEY &&
30
- bedrockRegion;
31
-
32
- const describeIf = hasBedrock ? describe : describe.skip;
33
-
34
- /** Helper to safely get tool description from tool object */
35
- const getToolDescription = (tool: t.GraphTools[0]): string | undefined => {
36
- return (tool as { description?: string }).description;
37
- };
38
-
39
- /** Helper to safely get tool name from tool object */
40
- const getToolName = (tool: t.GraphTools[0]): string | undefined => {
41
- return (tool as { name?: string }).name;
42
- };
43
-
44
- /** Helper to find tool by name */
45
- const findToolByName = (
46
- tools: t.GraphTools | undefined,
47
- name: string,
48
- ): t.GraphTools[0] | undefined => {
49
- return tools?.find((tool) => getToolName(tool) === name);
50
- };
51
-
52
- describeIf('Agent Handoff E2E with Bedrock', () => {
53
- jest.setTimeout(120000);
54
-
55
- const bedrockOptions = {
56
- model: 'us.anthropic.claude-3-5-haiku-20241022-v1:0',
57
- region: bedrockRegion || 'us-east-1',
58
- credentials: {
59
- accessKeyId: process.env.BEDROCK_AWS_ACCESS_KEY_ID!,
60
- secretAccessKey: process.env.BEDROCK_AWS_SECRET_ACCESS_KEY!,
61
- },
62
- };
63
-
64
- const createBedrockAgent = (
65
- agentId: string,
66
- name: string,
67
- description: string,
68
- instructions: string,
69
- ): t.AgentInputs => ({
70
- agentId,
71
- name,
72
- description,
73
- provider: Providers.BEDROCK,
74
- clientOptions: bedrockOptions,
75
- instructions,
76
- maxContextTokens: 28000,
77
- });
78
-
79
- describe('Tool Description Enrichment (no edge.description)', () => {
80
- it('should generate tool descriptions from agent name + description when edge has no description', async () => {
81
- const agents: t.AgentInputs[] = [
82
- createBedrockAgent(
83
- 'supervisor_abc123',
84
- 'Supervisor',
85
- 'Routes requests to specialists',
86
- 'You are a supervisor. Route requests to the appropriate specialist.',
87
- ),
88
- createBedrockAgent(
89
- 'agent_W47hBnn2RoVZEOy5595GC',
90
- 'Sales Expert',
91
- 'Handles product pricing, quotes, and purchase orders for enterprise clients',
92
- 'You are a sales expert.',
93
- ),
94
- createBedrockAgent(
95
- 'agent_X92kLmn4TpQR8vw3221HD',
96
- 'Technical Support',
97
- 'Troubleshoots technical issues, resolves bugs, and handles escalations',
98
- 'You are a technical support agent.',
99
- ),
100
- ];
101
-
102
- // Edges WITHOUT explicit descriptions - simulates what happens in production
103
- // when users add handoffs through the UI without typing descriptions
104
- const edges: t.GraphEdge[] = [
105
- {
106
- from: 'supervisor_abc123',
107
- to: 'agent_W47hBnn2RoVZEOy5595GC',
108
- edgeType: 'handoff',
109
- // No description - should auto-generate from agent name + description
110
- },
111
- {
112
- from: 'supervisor_abc123',
113
- to: 'agent_X92kLmn4TpQR8vw3221HD',
114
- edgeType: 'handoff',
115
- // No description
116
- },
117
- ];
118
-
119
- const run = await Run.create({
120
- runId: `bedrock-handoff-desc-${Date.now()}`,
121
- graphConfig: {
122
- type: 'multi-agent',
123
- agents,
124
- edges,
125
- },
126
- returnContent: true,
127
- });
128
-
129
- const supervisorContext = (run.Graph as StandardGraph).agentContexts.get(
130
- 'supervisor_abc123',
131
- );
132
-
133
- // Verify the handoff tools have enriched descriptions
134
- const salesTool = findToolByName(
135
- supervisorContext?.tools,
136
- `${Constants.LC_TRANSFER_TO_}agent_W47hBnn2RoVZEOy5595GC`,
137
- );
138
- const supportTool = findToolByName(
139
- supervisorContext?.tools,
140
- `${Constants.LC_TRANSFER_TO_}agent_X92kLmn4TpQR8vw3221HD`,
141
- );
142
-
143
- expect(salesTool).toBeDefined();
144
- expect(supportTool).toBeDefined();
145
-
146
- const salesDesc = getToolDescription(salesTool!);
147
- const supportDesc = getToolDescription(supportTool!);
148
-
149
- // CRITICAL: Descriptions must NOT be just "Transfer control to agent 'agent_W47hBnn...'"
150
- // They must include the human-readable name and description
151
- expect(salesDesc).toContain('Sales Expert');
152
- expect(salesDesc).toContain('pricing');
153
- expect(salesDesc).not.toContain('agent_W47hBnn2RoVZEOy5595GC');
154
-
155
- expect(supportDesc).toContain('Technical Support');
156
- expect(supportDesc).toContain('Troubleshoots');
157
- expect(supportDesc).not.toContain('agent_X92kLmn4TpQR8vw3221HD');
158
-
159
- console.log('[PASS] Sales tool description:', salesDesc);
160
- console.log('[PASS] Support tool description:', supportDesc);
161
- });
162
- });
163
-
164
- describe('Live Bedrock Handoff Routing', () => {
165
- it('should route a sales question to the Sales Expert agent', async () => {
166
- const agents: t.AgentInputs[] = [
167
- createBedrockAgent(
168
- 'router',
169
- 'Router',
170
- 'Routes user requests to specialists',
171
- `You are a request router. You must analyze the user's message and transfer to the appropriate specialist.
172
-
173
- IMPORTANT: Do NOT answer the question yourself. You MUST use one of your transfer tools to hand off to a specialist.
174
- Pick the specialist whose description best matches the user's request.`,
175
- ),
176
- createBedrockAgent(
177
- 'sales_agent',
178
- 'Sales Expert',
179
- 'Handles product pricing, quotes, and purchase orders',
180
- 'You are a sales expert. Answer questions about pricing and products. Be concise.',
181
- ),
182
- createBedrockAgent(
183
- 'support_agent',
184
- 'Technical Support',
185
- 'Troubleshoots technical issues and resolves bugs',
186
- 'You are technical support. Help with technical problems. Be concise.',
187
- ),
188
- ];
189
-
190
- const edges: t.GraphEdge[] = [
191
- { from: 'router', to: 'sales_agent', edgeType: 'handoff' },
192
- { from: 'router', to: 'support_agent', edgeType: 'handoff' },
193
- ];
194
-
195
- const { contentParts, aggregateContent } = createContentAggregator();
196
- const customHandlers = {
197
- [GraphEvents.TOOL_END]: new ToolEndHandler(),
198
- [GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
199
- [GraphEvents.CHAT_MODEL_STREAM]: new ChatModelStreamHandler(),
200
- [GraphEvents.ON_RUN_STEP]: {
201
- handle: (event: string, data: t.StreamEventData): void => {
202
- aggregateContent({ event: event as GraphEvents, data: data as t.RunStep });
203
- },
204
- },
205
- [GraphEvents.ON_RUN_STEP_COMPLETED]: {
206
- handle: (event: string, data: t.StreamEventData): void => {
207
- aggregateContent({
208
- event: event as GraphEvents,
209
- data: data as unknown as { result: t.ToolEndEvent },
210
- });
211
- },
212
- },
213
- [GraphEvents.ON_MESSAGE_DELTA]: {
214
- handle: (event: string, data: t.StreamEventData): void => {
215
- aggregateContent({ event: event as GraphEvents, data: data as t.MessageDeltaEvent });
216
- },
217
- },
218
- };
219
-
220
- const run = await Run.create({
221
- runId: `bedrock-live-handoff-${Date.now()}`,
222
- graphConfig: {
223
- type: 'multi-agent',
224
- agents,
225
- edges,
226
- },
227
- customHandlers,
228
- returnContent: true,
229
- });
230
-
231
- const config: Partial<RunnableConfig> & {
232
- version: 'v1' | 'v2';
233
- streamMode: string;
234
- } = {
235
- configurable: { thread_id: 'bedrock-handoff-test' },
236
- streamMode: 'values',
237
- version: 'v2',
238
- };
239
-
240
- // Send a sales-related question
241
- const messages = [new HumanMessage('What is the pricing for your enterprise plan?')];
242
-
243
- await run.processStream({ messages }, config);
244
-
245
- const finalMessages = run.getRunMessages();
246
- expect(finalMessages).toBeDefined();
247
- expect(finalMessages!.length).toBeGreaterThan(1);
248
-
249
- // Verify the handoff happened to the sales agent (not support)
250
- const toolMessages = finalMessages!.filter(
251
- (msg) => msg.getType() === 'tool',
252
- ) as ToolMessage[];
253
-
254
- const salesHandoff = toolMessages.find(
255
- (msg) => msg.name === `${Constants.LC_TRANSFER_TO_}sales_agent`,
256
- );
257
- const supportHandoff = toolMessages.find(
258
- (msg) => msg.name === `${Constants.LC_TRANSFER_TO_}support_agent`,
259
- );
260
-
261
- expect(salesHandoff).toBeDefined();
262
- expect(supportHandoff).toBeUndefined();
263
-
264
- console.log('[PASS] Router correctly handed off to Sales Expert');
265
- console.log('[PASS] Handoff tool message:', salesHandoff?.content);
266
-
267
- // Verify the sales agent actually responded
268
- const aiMessages = finalMessages!.filter((msg) => msg.getType() === 'ai');
269
- expect(aiMessages.length).toBeGreaterThanOrEqual(2); // Router + Sales responses
270
- });
271
-
272
- it('should route a technical question to the Support agent', async () => {
273
- const agents: t.AgentInputs[] = [
274
- createBedrockAgent(
275
- 'router',
276
- 'Router',
277
- 'Routes user requests to specialists',
278
- `You are a request router. You must analyze the user's message and transfer to the appropriate specialist.
279
-
280
- IMPORTANT: Do NOT answer the question yourself. You MUST use one of your transfer tools to hand off to a specialist.
281
- Pick the specialist whose description best matches the user's request.`,
282
- ),
283
- createBedrockAgent(
284
- 'sales_agent',
285
- 'Sales Expert',
286
- 'Handles product pricing, quotes, and purchase orders',
287
- 'You are a sales expert. Answer questions about pricing. Be concise.',
288
- ),
289
- createBedrockAgent(
290
- 'support_agent',
291
- 'Technical Support',
292
- 'Troubleshoots technical issues, resolves bugs, and handles error messages',
293
- 'You are technical support. Help with technical problems. Be concise.',
294
- ),
295
- ];
296
-
297
- const edges: t.GraphEdge[] = [
298
- { from: 'router', to: 'sales_agent', edgeType: 'handoff' },
299
- { from: 'router', to: 'support_agent', edgeType: 'handoff' },
300
- ];
301
-
302
- const { contentParts, aggregateContent } = createContentAggregator();
303
- const customHandlers = {
304
- [GraphEvents.TOOL_END]: new ToolEndHandler(),
305
- [GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
306
- [GraphEvents.CHAT_MODEL_STREAM]: new ChatModelStreamHandler(),
307
- [GraphEvents.ON_RUN_STEP]: {
308
- handle: (event: string, data: t.StreamEventData): void => {
309
- aggregateContent({ event: event as GraphEvents, data: data as t.RunStep });
310
- },
311
- },
312
- [GraphEvents.ON_RUN_STEP_COMPLETED]: {
313
- handle: (event: string, data: t.StreamEventData): void => {
314
- aggregateContent({
315
- event: event as GraphEvents,
316
- data: data as unknown as { result: t.ToolEndEvent },
317
- });
318
- },
319
- },
320
- [GraphEvents.ON_MESSAGE_DELTA]: {
321
- handle: (event: string, data: t.StreamEventData): void => {
322
- aggregateContent({ event: event as GraphEvents, data: data as t.MessageDeltaEvent });
323
- },
324
- },
325
- };
326
-
327
- const run = await Run.create({
328
- runId: `bedrock-live-handoff-support-${Date.now()}`,
329
- graphConfig: {
330
- type: 'multi-agent',
331
- agents,
332
- edges,
333
- },
334
- customHandlers,
335
- returnContent: true,
336
- });
337
-
338
- const config: Partial<RunnableConfig> & {
339
- version: 'v1' | 'v2';
340
- streamMode: string;
341
- } = {
342
- configurable: { thread_id: 'bedrock-handoff-support-test' },
343
- streamMode: 'values',
344
- version: 'v2',
345
- };
346
-
347
- // Send a technical question
348
- const messages = [
349
- new HumanMessage('I am getting an error 500 when trying to login. The page crashes after entering my password.'),
350
- ];
351
-
352
- await run.processStream({ messages }, config);
353
-
354
- const finalMessages = run.getRunMessages();
355
- expect(finalMessages).toBeDefined();
356
-
357
- const toolMessages = finalMessages!.filter(
358
- (msg) => msg.getType() === 'tool',
359
- ) as ToolMessage[];
360
-
361
- const supportHandoff = toolMessages.find(
362
- (msg) => msg.name === `${Constants.LC_TRANSFER_TO_}support_agent`,
363
- );
364
- const salesHandoff = toolMessages.find(
365
- (msg) => msg.name === `${Constants.LC_TRANSFER_TO_}sales_agent`,
366
- );
367
-
368
- expect(supportHandoff).toBeDefined();
369
- expect(salesHandoff).toBeUndefined();
370
-
371
- console.log('[PASS] Router correctly handed off to Technical Support');
372
- console.log('[PASS] Handoff tool message:', supportHandoff?.content);
373
- });
374
- });
375
- });
1
+ /**
2
+ * Integration test: Agent Handoff with Bedrock
3
+ *
4
+ * Verifies end-to-end that:
5
+ * 1. Handoff tool descriptions are enriched with agent name + description
6
+ * 2. The LLM (Bedrock Claude) can see and use these descriptions to route correctly
7
+ * 3. The handoff actually transfers control to the correct agent
8
+ *
9
+ * Requires: BEDROCK_AWS_ACCESS_KEY_ID, BEDROCK_AWS_SECRET_ACCESS_KEY, BEDROCK_AWS_REGION
10
+ */
11
+ import { config } from 'dotenv';
12
+ import { resolve } from 'path';
13
+ // Load from local .env first, then fall back to ranger's .env for Bedrock credentials
14
+ config();
15
+ config({
16
+ path: resolve(process.cwd(), '..', 'ranger', '.env'),
17
+ override: false,
18
+ });
19
+
20
+ import { HumanMessage, ToolMessage } from '@langchain/core/messages';
21
+ import type { RunnableConfig } from '@langchain/core/runnables';
22
+ import type * as t from '@/types';
23
+ import { Providers, Constants, GraphEvents } from '@/common';
24
+ import { StandardGraph } from '@/graphs/Graph';
25
+ import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
26
+ import { ToolEndHandler, ModelEndHandler } from '@/events';
27
+ import { Run } from '@/run';
28
+
29
+ const bedrockRegion =
30
+ process.env.BEDROCK_AWS_REGION != null &&
31
+ process.env.BEDROCK_AWS_REGION !== ''
32
+ ? process.env.BEDROCK_AWS_REGION
33
+ : process.env.BEDROCK_AWS_DEFAULT_REGION;
34
+ const hasBedrock =
35
+ process.env.BEDROCK_AWS_ACCESS_KEY_ID != null &&
36
+ process.env.BEDROCK_AWS_ACCESS_KEY_ID !== '' &&
37
+ process.env.BEDROCK_AWS_SECRET_ACCESS_KEY != null &&
38
+ process.env.BEDROCK_AWS_SECRET_ACCESS_KEY !== '' &&
39
+ bedrockRegion != null &&
40
+ bedrockRegion !== '';
41
+
42
+ const describeIf = hasBedrock ? describe : describe.skip;
43
+
44
+ /** Helper to safely get tool description from tool object */
45
+ const getToolDescription = (tool: t.GraphTools[0]): string | undefined => {
46
+ return (tool as { description?: string }).description;
47
+ };
48
+
49
+ /** Helper to safely get tool name from tool object */
50
+ const getToolName = (tool: t.GraphTools[0]): string | undefined => {
51
+ return (tool as { name?: string }).name;
52
+ };
53
+
54
+ /** Helper to find tool by name */
55
+ const findToolByName = (
56
+ tools: t.GraphTools | undefined,
57
+ name: string
58
+ ): t.GraphTools[0] | undefined => {
59
+ return tools?.find((tool) => getToolName(tool) === name);
60
+ };
61
+
62
+ describeIf('Agent Handoff E2E with Bedrock', () => {
63
+ jest.setTimeout(120000);
64
+
65
+ const bedrockOptions = {
66
+ model: 'us.anthropic.claude-3-5-haiku-20241022-v1:0',
67
+ region:
68
+ bedrockRegion != null && bedrockRegion !== ''
69
+ ? bedrockRegion
70
+ : 'us-east-1',
71
+ credentials: {
72
+ accessKeyId: process.env.BEDROCK_AWS_ACCESS_KEY_ID!,
73
+ secretAccessKey: process.env.BEDROCK_AWS_SECRET_ACCESS_KEY!,
74
+ },
75
+ };
76
+
77
+ const createBedrockAgent = (
78
+ agentId: string,
79
+ name: string,
80
+ description: string,
81
+ instructions: string
82
+ ): t.AgentInputs => ({
83
+ agentId,
84
+ name,
85
+ description,
86
+ provider: Providers.BEDROCK,
87
+ clientOptions: bedrockOptions,
88
+ instructions,
89
+ maxContextTokens: 28000,
90
+ });
91
+
92
+ describe('Tool Description Enrichment (no edge.description)', () => {
93
+ it('should generate tool descriptions from agent name + description when edge has no description', async () => {
94
+ const agents: t.AgentInputs[] = [
95
+ createBedrockAgent(
96
+ 'supervisor_abc123',
97
+ 'Supervisor',
98
+ 'Routes requests to specialists',
99
+ 'You are a supervisor. Route requests to the appropriate specialist.'
100
+ ),
101
+ createBedrockAgent(
102
+ 'agent_W47hBnn2RoVZEOy5595GC',
103
+ 'Sales Expert',
104
+ 'Handles product pricing, quotes, and purchase orders for enterprise clients',
105
+ 'You are a sales expert.'
106
+ ),
107
+ createBedrockAgent(
108
+ 'agent_X92kLmn4TpQR8vw3221HD',
109
+ 'Technical Support',
110
+ 'Troubleshoots technical issues, resolves bugs, and handles escalations',
111
+ 'You are a technical support agent.'
112
+ ),
113
+ ];
114
+
115
+ // Edges WITHOUT explicit descriptions - simulates what happens in production
116
+ // when users add handoffs through the UI without typing descriptions
117
+ const edges: t.GraphEdge[] = [
118
+ {
119
+ from: 'supervisor_abc123',
120
+ to: 'agent_W47hBnn2RoVZEOy5595GC',
121
+ edgeType: 'handoff',
122
+ // No description - should auto-generate from agent name + description
123
+ },
124
+ {
125
+ from: 'supervisor_abc123',
126
+ to: 'agent_X92kLmn4TpQR8vw3221HD',
127
+ edgeType: 'handoff',
128
+ // No description
129
+ },
130
+ ];
131
+
132
+ const run = await Run.create({
133
+ runId: `bedrock-handoff-desc-${Date.now()}`,
134
+ graphConfig: {
135
+ type: 'multi-agent',
136
+ agents,
137
+ edges,
138
+ },
139
+ returnContent: true,
140
+ });
141
+
142
+ const supervisorContext = (run.Graph as StandardGraph).agentContexts.get(
143
+ 'supervisor_abc123'
144
+ );
145
+
146
+ // Verify the handoff tools have enriched descriptions
147
+ const salesTool = findToolByName(
148
+ supervisorContext?.tools,
149
+ `${Constants.LC_TRANSFER_TO_}agent_W47hBnn2RoVZEOy5595GC`
150
+ );
151
+ const supportTool = findToolByName(
152
+ supervisorContext?.tools,
153
+ `${Constants.LC_TRANSFER_TO_}agent_X92kLmn4TpQR8vw3221HD`
154
+ );
155
+
156
+ expect(salesTool).toBeDefined();
157
+ expect(supportTool).toBeDefined();
158
+
159
+ const salesDesc = getToolDescription(salesTool!);
160
+ const supportDesc = getToolDescription(supportTool!);
161
+
162
+ // CRITICAL: Descriptions must NOT be just "Transfer control to agent 'agent_W47hBnn...'"
163
+ // They must include the human-readable name and description
164
+ expect(salesDesc).toContain('Sales Expert');
165
+ expect(salesDesc).toContain('pricing');
166
+ expect(salesDesc).not.toContain('agent_W47hBnn2RoVZEOy5595GC');
167
+
168
+ expect(supportDesc).toContain('Technical Support');
169
+ expect(supportDesc).toContain('Troubleshoots');
170
+ expect(supportDesc).not.toContain('agent_X92kLmn4TpQR8vw3221HD');
171
+
172
+ /* eslint-disable no-console */
173
+ console.log('[PASS] Sales tool description:', salesDesc);
174
+ console.log('[PASS] Support tool description:', supportDesc);
175
+ /* eslint-enable no-console */
176
+ });
177
+ });
178
+
179
+ describe('Live Bedrock Handoff Routing', () => {
180
+ it('should route a sales question to the Sales Expert agent', async () => {
181
+ const agents: t.AgentInputs[] = [
182
+ createBedrockAgent(
183
+ 'router',
184
+ 'Router',
185
+ 'Routes user requests to specialists',
186
+ `You are a request router. You must analyze the user's message and transfer to the appropriate specialist.
187
+
188
+ IMPORTANT: Do NOT answer the question yourself. You MUST use one of your transfer tools to hand off to a specialist.
189
+ Pick the specialist whose description best matches the user's request.`
190
+ ),
191
+ createBedrockAgent(
192
+ 'sales_agent',
193
+ 'Sales Expert',
194
+ 'Handles product pricing, quotes, and purchase orders',
195
+ 'You are a sales expert. Answer questions about pricing and products. Be concise.'
196
+ ),
197
+ createBedrockAgent(
198
+ 'support_agent',
199
+ 'Technical Support',
200
+ 'Troubleshoots technical issues and resolves bugs',
201
+ 'You are technical support. Help with technical problems. Be concise.'
202
+ ),
203
+ ];
204
+
205
+ const edges: t.GraphEdge[] = [
206
+ { from: 'router', to: 'sales_agent', edgeType: 'handoff' },
207
+ { from: 'router', to: 'support_agent', edgeType: 'handoff' },
208
+ ];
209
+
210
+ const { contentParts: _contentParts, aggregateContent } =
211
+ createContentAggregator();
212
+ const customHandlers = {
213
+ [GraphEvents.TOOL_END]: new ToolEndHandler(),
214
+ [GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
215
+ [GraphEvents.CHAT_MODEL_STREAM]: new ChatModelStreamHandler(),
216
+ [GraphEvents.ON_RUN_STEP]: {
217
+ handle: (event: string, data: t.StreamEventData): void => {
218
+ aggregateContent({
219
+ event: event as GraphEvents,
220
+ data: data as t.RunStep,
221
+ });
222
+ },
223
+ },
224
+ [GraphEvents.ON_RUN_STEP_COMPLETED]: {
225
+ handle: (event: string, data: t.StreamEventData): void => {
226
+ aggregateContent({
227
+ event: event as GraphEvents,
228
+ data: data as unknown as { result: t.ToolEndEvent },
229
+ });
230
+ },
231
+ },
232
+ [GraphEvents.ON_MESSAGE_DELTA]: {
233
+ handle: (event: string, data: t.StreamEventData): void => {
234
+ aggregateContent({
235
+ event: event as GraphEvents,
236
+ data: data as t.MessageDeltaEvent,
237
+ });
238
+ },
239
+ },
240
+ };
241
+
242
+ const run = await Run.create({
243
+ runId: `bedrock-live-handoff-${Date.now()}`,
244
+ graphConfig: {
245
+ type: 'multi-agent',
246
+ agents,
247
+ edges,
248
+ },
249
+ customHandlers,
250
+ returnContent: true,
251
+ });
252
+
253
+ const config: Partial<RunnableConfig> & {
254
+ version: 'v1' | 'v2';
255
+ streamMode: string;
256
+ } = {
257
+ configurable: { thread_id: 'bedrock-handoff-test' },
258
+ streamMode: 'values',
259
+ version: 'v2',
260
+ };
261
+
262
+ // Send a sales-related question
263
+ const messages = [
264
+ new HumanMessage('What is the pricing for your enterprise plan?'),
265
+ ];
266
+
267
+ await run.processStream({ messages }, config);
268
+
269
+ const finalMessages = run.getRunMessages();
270
+ expect(finalMessages).toBeDefined();
271
+ expect(finalMessages!.length).toBeGreaterThan(1);
272
+
273
+ // Verify the handoff happened to the sales agent (not support)
274
+ const toolMessages = finalMessages!.filter(
275
+ (msg) => msg.getType() === 'tool'
276
+ ) as ToolMessage[];
277
+
278
+ const salesHandoff = toolMessages.find(
279
+ (msg) => msg.name === `${Constants.LC_TRANSFER_TO_}sales_agent`
280
+ );
281
+ const supportHandoff = toolMessages.find(
282
+ (msg) => msg.name === `${Constants.LC_TRANSFER_TO_}support_agent`
283
+ );
284
+
285
+ expect(salesHandoff).toBeDefined();
286
+ expect(supportHandoff).toBeUndefined();
287
+
288
+ /* eslint-disable no-console */
289
+ console.log('[PASS] Router correctly handed off to Sales Expert');
290
+ console.log('[PASS] Handoff tool message:', salesHandoff?.content);
291
+ /* eslint-enable no-console */
292
+
293
+ // Verify the sales agent actually responded
294
+ const aiMessages = finalMessages!.filter((msg) => msg.getType() === 'ai');
295
+ expect(aiMessages.length).toBeGreaterThanOrEqual(2); // Router + Sales responses
296
+ });
297
+
298
+ it('should route a technical question to the Support agent', async () => {
299
+ const agents: t.AgentInputs[] = [
300
+ createBedrockAgent(
301
+ 'router',
302
+ 'Router',
303
+ 'Routes user requests to specialists',
304
+ `You are a request router. You must analyze the user's message and transfer to the appropriate specialist.
305
+
306
+ IMPORTANT: Do NOT answer the question yourself. You MUST use one of your transfer tools to hand off to a specialist.
307
+ Pick the specialist whose description best matches the user's request.`
308
+ ),
309
+ createBedrockAgent(
310
+ 'sales_agent',
311
+ 'Sales Expert',
312
+ 'Handles product pricing, quotes, and purchase orders',
313
+ 'You are a sales expert. Answer questions about pricing. Be concise.'
314
+ ),
315
+ createBedrockAgent(
316
+ 'support_agent',
317
+ 'Technical Support',
318
+ 'Troubleshoots technical issues, resolves bugs, and handles error messages',
319
+ 'You are technical support. Help with technical problems. Be concise.'
320
+ ),
321
+ ];
322
+
323
+ const edges: t.GraphEdge[] = [
324
+ { from: 'router', to: 'sales_agent', edgeType: 'handoff' },
325
+ { from: 'router', to: 'support_agent', edgeType: 'handoff' },
326
+ ];
327
+
328
+ const { contentParts: _contentParts, aggregateContent } =
329
+ createContentAggregator();
330
+ const customHandlers = {
331
+ [GraphEvents.TOOL_END]: new ToolEndHandler(),
332
+ [GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
333
+ [GraphEvents.CHAT_MODEL_STREAM]: new ChatModelStreamHandler(),
334
+ [GraphEvents.ON_RUN_STEP]: {
335
+ handle: (event: string, data: t.StreamEventData): void => {
336
+ aggregateContent({
337
+ event: event as GraphEvents,
338
+ data: data as t.RunStep,
339
+ });
340
+ },
341
+ },
342
+ [GraphEvents.ON_RUN_STEP_COMPLETED]: {
343
+ handle: (event: string, data: t.StreamEventData): void => {
344
+ aggregateContent({
345
+ event: event as GraphEvents,
346
+ data: data as unknown as { result: t.ToolEndEvent },
347
+ });
348
+ },
349
+ },
350
+ [GraphEvents.ON_MESSAGE_DELTA]: {
351
+ handle: (event: string, data: t.StreamEventData): void => {
352
+ aggregateContent({
353
+ event: event as GraphEvents,
354
+ data: data as t.MessageDeltaEvent,
355
+ });
356
+ },
357
+ },
358
+ };
359
+
360
+ const run = await Run.create({
361
+ runId: `bedrock-live-handoff-support-${Date.now()}`,
362
+ graphConfig: {
363
+ type: 'multi-agent',
364
+ agents,
365
+ edges,
366
+ },
367
+ customHandlers,
368
+ returnContent: true,
369
+ });
370
+
371
+ const config: Partial<RunnableConfig> & {
372
+ version: 'v1' | 'v2';
373
+ streamMode: string;
374
+ } = {
375
+ configurable: { thread_id: 'bedrock-handoff-support-test' },
376
+ streamMode: 'values',
377
+ version: 'v2',
378
+ };
379
+
380
+ // Send a technical question
381
+ const messages = [
382
+ new HumanMessage(
383
+ 'I am getting an error 500 when trying to login. The page crashes after entering my password.'
384
+ ),
385
+ ];
386
+
387
+ await run.processStream({ messages }, config);
388
+
389
+ const finalMessages = run.getRunMessages();
390
+ expect(finalMessages).toBeDefined();
391
+
392
+ const toolMessages = finalMessages!.filter(
393
+ (msg) => msg.getType() === 'tool'
394
+ ) as ToolMessage[];
395
+
396
+ const supportHandoff = toolMessages.find(
397
+ (msg) => msg.name === `${Constants.LC_TRANSFER_TO_}support_agent`
398
+ );
399
+ const salesHandoff = toolMessages.find(
400
+ (msg) => msg.name === `${Constants.LC_TRANSFER_TO_}sales_agent`
401
+ );
402
+
403
+ expect(supportHandoff).toBeDefined();
404
+ expect(salesHandoff).toBeUndefined();
405
+
406
+ /* eslint-disable no-console */
407
+ console.log('[PASS] Router correctly handed off to Technical Support');
408
+ console.log('[PASS] Handoff tool message:', supportHandoff?.content);
409
+ /* eslint-enable no-console */
410
+ });
411
+ });
412
+ });