@illuma-ai/agents 1.0.89 → 1.0.93

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (838) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +98 -49
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/common/constants.cjs +25 -0
  4. package/dist/cjs/common/constants.cjs.map +1 -0
  5. package/dist/cjs/common/enum.cjs +30 -0
  6. package/dist/cjs/common/enum.cjs.map +1 -1
  7. package/dist/cjs/events.cjs +9 -4
  8. package/dist/cjs/events.cjs.map +1 -1
  9. package/dist/cjs/graphs/Graph.cjs +397 -92
  10. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  11. package/dist/cjs/graphs/MultiAgentGraph.cjs +223 -92
  12. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  13. package/dist/cjs/instrumentation.cjs +30 -14
  14. package/dist/cjs/instrumentation.cjs.map +1 -1
  15. package/dist/cjs/llm/anthropic/index.cjs +43 -11
  16. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  17. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  18. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +10 -7
  19. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  20. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +32 -0
  21. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
  22. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
  23. package/dist/cjs/llm/bedrock/index.cjs +129 -101
  24. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  25. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +489 -0
  26. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -0
  27. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +176 -0
  28. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -0
  29. package/dist/cjs/llm/fake.cjs.map +1 -1
  30. package/dist/cjs/llm/google/index.cjs.map +1 -1
  31. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  32. package/dist/cjs/llm/openai/index.cjs +1 -1
  33. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  34. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  35. package/dist/cjs/llm/openrouter/index.cjs +59 -5
  36. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  37. package/dist/cjs/llm/providers.cjs.map +1 -1
  38. package/dist/cjs/llm/text.cjs.map +1 -1
  39. package/dist/cjs/llm/vertexai/index.cjs +80 -2
  40. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  41. package/dist/cjs/main.cjs +60 -27
  42. package/dist/cjs/main.cjs.map +1 -1
  43. package/dist/cjs/messages/cache.cjs +131 -108
  44. package/dist/cjs/messages/cache.cjs.map +1 -1
  45. package/dist/cjs/messages/content.cjs.map +1 -1
  46. package/dist/cjs/messages/core.cjs +3 -0
  47. package/dist/cjs/messages/core.cjs.map +1 -1
  48. package/dist/cjs/messages/format.cjs +265 -47
  49. package/dist/cjs/messages/format.cjs.map +1 -1
  50. package/dist/cjs/messages/ids.cjs.map +1 -1
  51. package/dist/cjs/messages/prune.cjs +55 -2
  52. package/dist/cjs/messages/prune.cjs.map +1 -1
  53. package/dist/cjs/messages/summarize.cjs +170 -0
  54. package/dist/cjs/messages/summarize.cjs.map +1 -0
  55. package/dist/cjs/messages/tools.cjs.map +1 -1
  56. package/dist/cjs/run.cjs +87 -30
  57. package/dist/cjs/run.cjs.map +1 -1
  58. package/dist/cjs/schemas/validate.cjs.map +1 -1
  59. package/dist/cjs/splitStream.cjs.map +1 -1
  60. package/dist/cjs/stream.cjs +59 -25
  61. package/dist/cjs/stream.cjs.map +1 -1
  62. package/dist/cjs/tools/AskUser.cjs +131 -0
  63. package/dist/cjs/tools/AskUser.cjs.map +1 -0
  64. package/dist/cjs/tools/BrowserTools.cjs +11 -7
  65. package/dist/cjs/tools/BrowserTools.cjs.map +1 -1
  66. package/dist/cjs/tools/Calculator.cjs.map +1 -1
  67. package/dist/cjs/tools/CodeExecutor.cjs +46 -4
  68. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  69. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +36 -53
  70. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  71. package/dist/cjs/tools/StreamingToolCallBuffer.cjs +208 -0
  72. package/dist/cjs/tools/StreamingToolCallBuffer.cjs.map +1 -0
  73. package/dist/cjs/tools/ToolNode.cjs +333 -30
  74. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  75. package/dist/cjs/tools/ToolSearch.cjs +66 -30
  76. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  77. package/dist/cjs/tools/handlers.cjs +94 -8
  78. package/dist/cjs/tools/handlers.cjs.map +1 -1
  79. package/dist/cjs/tools/schema.cjs.map +1 -1
  80. package/dist/cjs/tools/search/content.cjs.map +1 -1
  81. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  82. package/dist/cjs/tools/search/format.cjs.map +1 -1
  83. package/dist/cjs/tools/search/highlights.cjs.map +1 -1
  84. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  85. package/dist/cjs/tools/search/schema.cjs.map +1 -1
  86. package/dist/cjs/tools/search/search.cjs +1 -0
  87. package/dist/cjs/tools/search/search.cjs.map +1 -1
  88. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
  89. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  90. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  91. package/dist/cjs/types/graph.cjs +1 -1
  92. package/dist/cjs/types/graph.cjs.map +1 -1
  93. package/dist/cjs/utils/contextAnalytics.cjs +23 -6
  94. package/dist/cjs/utils/contextAnalytics.cjs.map +1 -1
  95. package/dist/cjs/utils/events.cjs.map +1 -1
  96. package/dist/cjs/utils/graph.cjs.map +1 -1
  97. package/dist/cjs/utils/handlers.cjs.map +1 -1
  98. package/dist/cjs/utils/llm.cjs.map +1 -1
  99. package/dist/cjs/utils/misc.cjs.map +1 -1
  100. package/dist/cjs/utils/run.cjs +3 -1
  101. package/dist/cjs/utils/run.cjs.map +1 -1
  102. package/dist/cjs/utils/schema.cjs.map +1 -1
  103. package/dist/cjs/utils/title.cjs.map +1 -1
  104. package/dist/cjs/utils/tokens.cjs +33 -58
  105. package/dist/cjs/utils/tokens.cjs.map +1 -1
  106. package/dist/cjs/utils/toolCallContinuation.cjs +55 -0
  107. package/dist/cjs/utils/toolCallContinuation.cjs.map +1 -0
  108. package/dist/cjs/utils/toonFormat.cjs.map +1 -1
  109. package/dist/esm/agents/AgentContext.mjs +98 -49
  110. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  111. package/dist/esm/common/constants.mjs +22 -0
  112. package/dist/esm/common/constants.mjs.map +1 -0
  113. package/dist/esm/common/enum.mjs +31 -1
  114. package/dist/esm/common/enum.mjs.map +1 -1
  115. package/dist/esm/events.mjs +9 -4
  116. package/dist/esm/events.mjs.map +1 -1
  117. package/dist/esm/graphs/Graph.mjs +393 -88
  118. package/dist/esm/graphs/Graph.mjs.map +1 -1
  119. package/dist/esm/graphs/MultiAgentGraph.mjs +224 -93
  120. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  121. package/dist/esm/instrumentation.mjs +30 -14
  122. package/dist/esm/instrumentation.mjs.map +1 -1
  123. package/dist/esm/llm/anthropic/index.mjs +43 -11
  124. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  125. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  126. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +10 -7
  127. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  128. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +32 -0
  129. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
  130. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
  131. package/dist/esm/llm/bedrock/index.mjs +128 -101
  132. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  133. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +484 -0
  134. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -0
  135. package/dist/esm/llm/bedrock/utils/message_outputs.mjs +171 -0
  136. package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -0
  137. package/dist/esm/llm/fake.mjs.map +1 -1
  138. package/dist/esm/llm/google/index.mjs.map +1 -1
  139. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  140. package/dist/esm/llm/openai/index.mjs +1 -1
  141. package/dist/esm/llm/openai/index.mjs.map +1 -1
  142. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  143. package/dist/esm/llm/openrouter/index.mjs +59 -5
  144. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  145. package/dist/esm/llm/providers.mjs.map +1 -1
  146. package/dist/esm/llm/text.mjs.map +1 -1
  147. package/dist/esm/llm/vertexai/index.mjs +80 -2
  148. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  149. package/dist/esm/main.mjs +8 -3
  150. package/dist/esm/main.mjs.map +1 -1
  151. package/dist/esm/messages/cache.mjs +131 -108
  152. package/dist/esm/messages/cache.mjs.map +1 -1
  153. package/dist/esm/messages/content.mjs.map +1 -1
  154. package/dist/esm/messages/core.mjs +4 -1
  155. package/dist/esm/messages/core.mjs.map +1 -1
  156. package/dist/esm/messages/format.mjs +267 -49
  157. package/dist/esm/messages/format.mjs.map +1 -1
  158. package/dist/esm/messages/ids.mjs.map +1 -1
  159. package/dist/esm/messages/prune.mjs +56 -4
  160. package/dist/esm/messages/prune.mjs.map +1 -1
  161. package/dist/esm/messages/summarize.mjs +161 -0
  162. package/dist/esm/messages/summarize.mjs.map +1 -0
  163. package/dist/esm/messages/tools.mjs.map +1 -1
  164. package/dist/esm/run.mjs +88 -31
  165. package/dist/esm/run.mjs.map +1 -1
  166. package/dist/esm/schemas/validate.mjs.map +1 -1
  167. package/dist/esm/splitStream.mjs.map +1 -1
  168. package/dist/esm/stream.mjs +60 -26
  169. package/dist/esm/stream.mjs.map +1 -1
  170. package/dist/esm/tools/AskUser.mjs +125 -0
  171. package/dist/esm/tools/AskUser.mjs.map +1 -0
  172. package/dist/esm/tools/BrowserTools.mjs +11 -7
  173. package/dist/esm/tools/BrowserTools.mjs.map +1 -1
  174. package/dist/esm/tools/Calculator.mjs.map +1 -1
  175. package/dist/esm/tools/CodeExecutor.mjs +46 -4
  176. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  177. package/dist/esm/tools/ProgrammaticToolCalling.mjs +37 -54
  178. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  179. package/dist/esm/tools/StreamingToolCallBuffer.mjs +206 -0
  180. package/dist/esm/tools/StreamingToolCallBuffer.mjs.map +1 -0
  181. package/dist/esm/tools/ToolNode.mjs +333 -30
  182. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  183. package/dist/esm/tools/ToolSearch.mjs +66 -30
  184. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  185. package/dist/esm/tools/handlers.mjs +95 -9
  186. package/dist/esm/tools/handlers.mjs.map +1 -1
  187. package/dist/esm/tools/schema.mjs.map +1 -1
  188. package/dist/esm/tools/search/content.mjs.map +1 -1
  189. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  190. package/dist/esm/tools/search/format.mjs.map +1 -1
  191. package/dist/esm/tools/search/highlights.mjs.map +1 -1
  192. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  193. package/dist/esm/tools/search/schema.mjs.map +1 -1
  194. package/dist/esm/tools/search/search.mjs +1 -0
  195. package/dist/esm/tools/search/search.mjs.map +1 -1
  196. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
  197. package/dist/esm/tools/search/tool.mjs.map +1 -1
  198. package/dist/esm/tools/search/utils.mjs.map +1 -1
  199. package/dist/esm/types/graph.mjs +1 -1
  200. package/dist/esm/types/graph.mjs.map +1 -1
  201. package/dist/esm/utils/contextAnalytics.mjs +23 -6
  202. package/dist/esm/utils/contextAnalytics.mjs.map +1 -1
  203. package/dist/esm/utils/events.mjs.map +1 -1
  204. package/dist/esm/utils/graph.mjs.map +1 -1
  205. package/dist/esm/utils/handlers.mjs.map +1 -1
  206. package/dist/esm/utils/llm.mjs.map +1 -1
  207. package/dist/esm/utils/misc.mjs.map +1 -1
  208. package/dist/esm/utils/run.mjs +3 -1
  209. package/dist/esm/utils/run.mjs.map +1 -1
  210. package/dist/esm/utils/schema.mjs.map +1 -1
  211. package/dist/esm/utils/title.mjs.map +1 -1
  212. package/dist/esm/utils/tokens.mjs +33 -59
  213. package/dist/esm/utils/tokens.mjs.map +1 -1
  214. package/dist/esm/utils/toolCallContinuation.mjs +52 -0
  215. package/dist/esm/utils/toolCallContinuation.mjs.map +1 -0
  216. package/dist/esm/utils/toonFormat.mjs.map +1 -1
  217. package/dist/types/agents/AgentContext.d.ts +14 -7
  218. package/dist/types/common/constants.d.ts +18 -0
  219. package/dist/types/common/enum.d.ts +28 -0
  220. package/dist/types/common/index.d.ts +1 -0
  221. package/dist/types/events.d.ts +10 -3
  222. package/dist/types/graphs/Graph.d.ts +37 -0
  223. package/dist/types/index.d.ts +4 -0
  224. package/dist/types/llm/anthropic/index.d.ts +7 -1
  225. package/dist/types/llm/anthropic/types.d.ts +5 -2
  226. package/dist/types/llm/anthropic/utils/message_outputs.d.ts +1 -1
  227. package/dist/types/llm/bedrock/index.d.ts +40 -33
  228. package/dist/types/llm/bedrock/utils/message_outputs.d.ts +1 -1
  229. package/dist/types/llm/google/index.d.ts +2 -3
  230. package/dist/types/llm/openrouter/index.d.ts +21 -1
  231. package/dist/types/llm/vertexai/index.d.ts +3 -2
  232. package/dist/types/messages/cache.d.ts +1 -1
  233. package/dist/types/messages/index.d.ts +1 -0
  234. package/dist/types/messages/prune.d.ts +2 -7
  235. package/dist/types/messages/summarize.d.ts +33 -0
  236. package/dist/types/run.d.ts +6 -0
  237. package/dist/types/tools/AskUser.d.ts +408 -0
  238. package/dist/types/tools/BrowserTools.d.ts +2 -2
  239. package/dist/types/tools/CodeExecutor.d.ts +2 -2
  240. package/dist/types/tools/StreamingToolCallBuffer.d.ts +106 -0
  241. package/dist/types/tools/ToolNode.d.ts +55 -3
  242. package/dist/types/tools/ToolSearch.d.ts +9 -5
  243. package/dist/types/tools/handlers.d.ts +2 -2
  244. package/dist/types/types/graph.d.ts +9 -2
  245. package/dist/types/types/llm.d.ts +8 -3
  246. package/dist/types/types/run.d.ts +2 -0
  247. package/dist/types/types/tools.d.ts +20 -2
  248. package/dist/types/utils/contextAnalytics.d.ts +5 -4
  249. package/dist/types/utils/index.d.ts +1 -0
  250. package/dist/types/utils/tokens.d.ts +6 -19
  251. package/dist/types/utils/toolCallContinuation.d.ts +30 -0
  252. package/package.json +15 -8
  253. package/src/agents/AgentContext.js +782 -0
  254. package/src/agents/AgentContext.js.map +1 -0
  255. package/src/agents/AgentContext.test.js +421 -0
  256. package/src/agents/AgentContext.test.js.map +1 -0
  257. package/src/agents/AgentContext.ts +132 -64
  258. package/src/agents/__tests__/AgentContext.test.js +678 -0
  259. package/src/agents/__tests__/AgentContext.test.js.map +1 -0
  260. package/src/agents/__tests__/AgentContext.test.ts +25 -4
  261. package/src/agents/__tests__/resolveStructuredOutputMode.test.js +117 -0
  262. package/src/agents/__tests__/resolveStructuredOutputMode.test.js.map +1 -0
  263. package/src/common/__tests__/enum.test.ts +135 -0
  264. package/src/common/constants.ts +21 -0
  265. package/src/common/enum.js +192 -0
  266. package/src/common/enum.js.map +1 -0
  267. package/src/common/enum.ts +30 -0
  268. package/src/common/index.js +3 -0
  269. package/src/common/index.js.map +1 -0
  270. package/src/common/index.ts +2 -1
  271. package/src/events.js +166 -0
  272. package/src/events.js.map +1 -0
  273. package/src/events.ts +11 -14
  274. package/src/graphs/Graph.js +1857 -0
  275. package/src/graphs/Graph.js.map +1 -0
  276. package/src/graphs/Graph.ts +580 -162
  277. package/src/graphs/MultiAgentGraph.js +1092 -0
  278. package/src/graphs/MultiAgentGraph.js.map +1 -0
  279. package/src/graphs/MultiAgentGraph.ts +331 -112
  280. package/src/graphs/__tests__/adaptive-thinking.test.ts +369 -0
  281. package/src/graphs/__tests__/graph-direct-tool-names.test.ts +210 -0
  282. package/src/graphs/__tests__/multi-agent-edges.test.ts +237 -0
  283. package/src/graphs/__tests__/structured-output.integration.test.js +624 -0
  284. package/src/graphs/__tests__/structured-output.integration.test.js.map +1 -0
  285. package/src/graphs/__tests__/structured-output.test.js +144 -0
  286. package/src/graphs/__tests__/structured-output.test.js.map +1 -0
  287. package/src/graphs/contextManagement.e2e.test.js +718 -0
  288. package/src/graphs/contextManagement.e2e.test.js.map +1 -0
  289. package/src/graphs/contextManagement.e2e.test.ts +990 -0
  290. package/src/graphs/contextManagement.test.js +485 -0
  291. package/src/graphs/contextManagement.test.js.map +1 -0
  292. package/src/graphs/contextManagement.test.ts +625 -0
  293. package/src/graphs/handoffValidation.test.js +276 -0
  294. package/src/graphs/handoffValidation.test.js.map +1 -0
  295. package/src/graphs/handoffValidation.test.ts +353 -0
  296. package/src/graphs/index.js +3 -0
  297. package/src/graphs/index.js.map +1 -0
  298. package/src/index.js +28 -0
  299. package/src/index.js.map +1 -0
  300. package/src/index.ts +13 -0
  301. package/src/instrumentation.js +21 -0
  302. package/src/instrumentation.js.map +1 -0
  303. package/src/instrumentation.ts +38 -17
  304. package/src/llm/anthropic/index.js +319 -0
  305. package/src/llm/anthropic/index.js.map +1 -0
  306. package/src/llm/anthropic/index.ts +68 -15
  307. package/src/llm/anthropic/llm.spec.ts +402 -0
  308. package/src/llm/anthropic/types.js +46 -0
  309. package/src/llm/anthropic/types.js.map +1 -0
  310. package/src/llm/anthropic/types.ts +8 -2
  311. package/src/llm/anthropic/utils/message_inputs.js +627 -0
  312. package/src/llm/anthropic/utils/message_inputs.js.map +1 -0
  313. package/src/llm/anthropic/utils/message_inputs.ts +16 -33
  314. package/src/llm/anthropic/utils/message_outputs.js +290 -0
  315. package/src/llm/anthropic/utils/message_outputs.js.map +1 -0
  316. package/src/llm/anthropic/utils/message_outputs.ts +40 -1
  317. package/src/llm/anthropic/utils/output_parsers.js +89 -0
  318. package/src/llm/anthropic/utils/output_parsers.js.map +1 -0
  319. package/src/llm/anthropic/utils/tools.js +25 -0
  320. package/src/llm/anthropic/utils/tools.js.map +1 -0
  321. package/src/llm/bedrock/__tests__/bedrock-caching.test.js +392 -0
  322. package/src/llm/bedrock/__tests__/bedrock-caching.test.js.map +1 -0
  323. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +24 -40
  324. package/src/llm/bedrock/index.js +303 -0
  325. package/src/llm/bedrock/index.js.map +1 -0
  326. package/src/llm/bedrock/index.ts +171 -134
  327. package/src/llm/bedrock/llm.spec.ts +395 -52
  328. package/src/llm/bedrock/types.js +2 -0
  329. package/src/llm/bedrock/types.js.map +1 -0
  330. package/src/llm/bedrock/utils/index.js +6 -0
  331. package/src/llm/bedrock/utils/index.js.map +1 -0
  332. package/src/llm/bedrock/utils/message_inputs.js +463 -0
  333. package/src/llm/bedrock/utils/message_inputs.js.map +1 -0
  334. package/src/llm/bedrock/utils/message_inputs.ts +30 -5
  335. package/src/llm/bedrock/utils/message_outputs.js +269 -0
  336. package/src/llm/bedrock/utils/message_outputs.js.map +1 -0
  337. package/src/llm/bedrock/utils/message_outputs.ts +70 -22
  338. package/src/llm/fake.js +92 -0
  339. package/src/llm/fake.js.map +1 -0
  340. package/src/llm/google/index.js +215 -0
  341. package/src/llm/google/index.js.map +1 -0
  342. package/src/llm/google/index.ts +2 -3
  343. package/src/llm/google/types.js +12 -0
  344. package/src/llm/google/types.js.map +1 -0
  345. package/src/llm/google/utils/common.js +670 -0
  346. package/src/llm/google/utils/common.js.map +1 -0
  347. package/src/llm/google/utils/tools.js +111 -0
  348. package/src/llm/google/utils/tools.js.map +1 -0
  349. package/src/llm/google/utils/zod_to_genai_parameters.js +47 -0
  350. package/src/llm/google/utils/zod_to_genai_parameters.js.map +1 -0
  351. package/src/llm/openai/index.js +1033 -0
  352. package/src/llm/openai/index.js.map +1 -0
  353. package/src/llm/openai/types.js +2 -0
  354. package/src/llm/openai/types.js.map +1 -0
  355. package/src/llm/openai/utils/index.js +756 -0
  356. package/src/llm/openai/utils/index.js.map +1 -0
  357. package/src/llm/openai/utils/isReasoningModel.test.js +79 -0
  358. package/src/llm/openai/utils/isReasoningModel.test.js.map +1 -0
  359. package/src/llm/openrouter/index.js +261 -0
  360. package/src/llm/openrouter/index.js.map +1 -0
  361. package/src/llm/openrouter/index.ts +117 -6
  362. package/src/llm/openrouter/reasoning.test.js +181 -0
  363. package/src/llm/openrouter/reasoning.test.js.map +1 -0
  364. package/src/llm/openrouter/reasoning.test.ts +207 -0
  365. package/src/llm/providers.js +36 -0
  366. package/src/llm/providers.js.map +1 -0
  367. package/src/llm/text.js +65 -0
  368. package/src/llm/text.js.map +1 -0
  369. package/src/llm/vertexai/index.js +402 -0
  370. package/src/llm/vertexai/index.js.map +1 -0
  371. package/src/llm/vertexai/index.ts +115 -5
  372. package/src/llm/vertexai/llm.spec.ts +114 -0
  373. package/src/messages/__tests__/tools.test.js +392 -0
  374. package/src/messages/__tests__/tools.test.js.map +1 -0
  375. package/src/messages/cache.js +404 -0
  376. package/src/messages/cache.js.map +1 -0
  377. package/src/messages/cache.test.js +1167 -0
  378. package/src/messages/cache.test.js.map +1 -0
  379. package/src/messages/cache.test.ts +178 -16
  380. package/src/messages/cache.ts +152 -147
  381. package/src/messages/content.js +48 -0
  382. package/src/messages/content.js.map +1 -0
  383. package/src/messages/content.test.js +314 -0
  384. package/src/messages/content.test.js.map +1 -0
  385. package/src/messages/core.js +359 -0
  386. package/src/messages/core.js.map +1 -0
  387. package/src/messages/core.ts +5 -0
  388. package/src/messages/ensureThinkingBlock.test.js +997 -0
  389. package/src/messages/ensureThinkingBlock.test.js.map +1 -0
  390. package/src/messages/ensureThinkingBlock.test.ts +751 -10
  391. package/src/messages/format.js +973 -0
  392. package/src/messages/format.js.map +1 -0
  393. package/src/messages/format.ts +334 -57
  394. package/src/messages/formatAgentMessages.test.js +2278 -0
  395. package/src/messages/formatAgentMessages.test.js.map +1 -0
  396. package/src/messages/formatAgentMessages.test.ts +1175 -1
  397. package/src/messages/formatAgentMessages.tools.test.js +362 -0
  398. package/src/messages/formatAgentMessages.tools.test.js.map +1 -0
  399. package/src/messages/formatMessage.test.js +608 -0
  400. package/src/messages/formatMessage.test.js.map +1 -0
  401. package/src/messages/ids.js +18 -0
  402. package/src/messages/ids.js.map +1 -0
  403. package/src/messages/index.js +9 -0
  404. package/src/messages/index.js.map +1 -0
  405. package/src/messages/index.ts +1 -0
  406. package/src/messages/labelContentByAgent.test.js +725 -0
  407. package/src/messages/labelContentByAgent.test.js.map +1 -0
  408. package/src/messages/prune.js +438 -0
  409. package/src/messages/prune.js.map +1 -0
  410. package/src/messages/prune.ts +87 -25
  411. package/src/messages/reducer.js +60 -0
  412. package/src/messages/reducer.js.map +1 -0
  413. package/src/messages/shiftIndexTokenCountMap.test.js +63 -0
  414. package/src/messages/shiftIndexTokenCountMap.test.js.map +1 -0
  415. package/src/messages/summarize.js +146 -0
  416. package/src/messages/summarize.js.map +1 -0
  417. package/src/messages/summarize.test.js +332 -0
  418. package/src/messages/summarize.test.js.map +1 -0
  419. package/src/messages/summarize.test.ts +466 -0
  420. package/src/messages/summarize.ts +222 -0
  421. package/src/messages/tools.js +90 -0
  422. package/src/messages/tools.js.map +1 -0
  423. package/src/mockStream.js +81 -0
  424. package/src/mockStream.js.map +1 -0
  425. package/src/prompts/collab.js +7 -0
  426. package/src/prompts/collab.js.map +1 -0
  427. package/src/prompts/index.js +3 -0
  428. package/src/prompts/index.js.map +1 -0
  429. package/src/prompts/taskmanager.js +58 -0
  430. package/src/prompts/taskmanager.js.map +1 -0
  431. package/src/run.js +427 -0
  432. package/src/run.js.map +1 -0
  433. package/src/run.ts +101 -33
  434. package/src/schemas/index.js +3 -0
  435. package/src/schemas/index.js.map +1 -0
  436. package/src/schemas/schema-preparation.test.js +370 -0
  437. package/src/schemas/schema-preparation.test.js.map +1 -0
  438. package/src/schemas/validate.js +314 -0
  439. package/src/schemas/validate.js.map +1 -0
  440. package/src/schemas/validate.test.js +264 -0
  441. package/src/schemas/validate.test.js.map +1 -0
  442. package/src/scripts/abort.js +127 -0
  443. package/src/scripts/abort.js.map +1 -0
  444. package/src/scripts/ant_web_search.js +130 -0
  445. package/src/scripts/ant_web_search.js.map +1 -0
  446. package/src/scripts/ant_web_search.ts +1 -0
  447. package/src/scripts/ant_web_search_edge_case.js +133 -0
  448. package/src/scripts/ant_web_search_edge_case.js.map +1 -0
  449. package/src/scripts/ant_web_search_edge_case.ts +1 -0
  450. package/src/scripts/ant_web_search_error_edge_case.js +119 -0
  451. package/src/scripts/ant_web_search_error_edge_case.js.map +1 -0
  452. package/src/scripts/ant_web_search_error_edge_case.ts +1 -0
  453. package/src/scripts/args.js +41 -0
  454. package/src/scripts/args.js.map +1 -0
  455. package/src/scripts/bedrock-cache-debug.js +186 -0
  456. package/src/scripts/bedrock-cache-debug.js.map +1 -0
  457. package/src/scripts/bedrock-cache-debug.ts +250 -0
  458. package/src/scripts/bedrock-content-aggregation-test.js +195 -0
  459. package/src/scripts/bedrock-content-aggregation-test.js.map +1 -0
  460. package/src/scripts/bedrock-content-aggregation-test.ts +266 -0
  461. package/src/scripts/bedrock-merge-test.js +80 -0
  462. package/src/scripts/bedrock-merge-test.js.map +1 -0
  463. package/src/scripts/bedrock-merge-test.ts +107 -0
  464. package/src/scripts/bedrock-parallel-tools-test.js +150 -0
  465. package/src/scripts/bedrock-parallel-tools-test.js.map +1 -0
  466. package/src/scripts/bedrock-parallel-tools-test.ts +204 -0
  467. package/src/scripts/caching.js +106 -0
  468. package/src/scripts/caching.js.map +1 -0
  469. package/src/scripts/caching.ts +1 -0
  470. package/src/scripts/cli.js +152 -0
  471. package/src/scripts/cli.js.map +1 -0
  472. package/src/scripts/cli2.js +119 -0
  473. package/src/scripts/cli2.js.map +1 -0
  474. package/src/scripts/cli3.js +163 -0
  475. package/src/scripts/cli3.js.map +1 -0
  476. package/src/scripts/cli4.js +165 -0
  477. package/src/scripts/cli4.js.map +1 -0
  478. package/src/scripts/cli5.js +165 -0
  479. package/src/scripts/cli5.js.map +1 -0
  480. package/src/scripts/code_exec.js +171 -0
  481. package/src/scripts/code_exec.js.map +1 -0
  482. package/src/scripts/code_exec.ts +1 -0
  483. package/src/scripts/code_exec_files.js +180 -0
  484. package/src/scripts/code_exec_files.js.map +1 -0
  485. package/src/scripts/code_exec_files.ts +1 -0
  486. package/src/scripts/code_exec_multi_session.js +185 -0
  487. package/src/scripts/code_exec_multi_session.js.map +1 -0
  488. package/src/scripts/code_exec_multi_session.ts +9 -13
  489. package/src/scripts/code_exec_ptc.js +265 -0
  490. package/src/scripts/code_exec_ptc.js.map +1 -0
  491. package/src/scripts/code_exec_ptc.ts +1 -0
  492. package/src/scripts/code_exec_session.js +217 -0
  493. package/src/scripts/code_exec_session.js.map +1 -0
  494. package/src/scripts/code_exec_session.ts +1 -0
  495. package/src/scripts/code_exec_simple.js +120 -0
  496. package/src/scripts/code_exec_simple.js.map +1 -0
  497. package/src/scripts/code_exec_simple.ts +1 -0
  498. package/src/scripts/content.js +111 -0
  499. package/src/scripts/content.js.map +1 -0
  500. package/src/scripts/content.ts +1 -0
  501. package/src/scripts/empty_input.js +125 -0
  502. package/src/scripts/empty_input.js.map +1 -0
  503. package/src/scripts/handoff-test.js +96 -0
  504. package/src/scripts/handoff-test.js.map +1 -0
  505. package/src/scripts/image.js +138 -0
  506. package/src/scripts/image.js.map +1 -0
  507. package/src/scripts/image.ts +3 -1
  508. package/src/scripts/memory.js +83 -0
  509. package/src/scripts/memory.js.map +1 -0
  510. package/src/scripts/memory.ts +16 -6
  511. package/src/scripts/multi-agent-chain.js +271 -0
  512. package/src/scripts/multi-agent-chain.js.map +1 -0
  513. package/src/scripts/multi-agent-chain.ts +1 -0
  514. package/src/scripts/multi-agent-conditional.js +185 -0
  515. package/src/scripts/multi-agent-conditional.js.map +1 -0
  516. package/src/scripts/multi-agent-conditional.ts +1 -0
  517. package/src/scripts/multi-agent-document-review-chain.js +171 -0
  518. package/src/scripts/multi-agent-document-review-chain.js.map +1 -0
  519. package/src/scripts/multi-agent-document-review-chain.ts +1 -0
  520. package/src/scripts/multi-agent-hybrid-flow.js +264 -0
  521. package/src/scripts/multi-agent-hybrid-flow.js.map +1 -0
  522. package/src/scripts/multi-agent-hybrid-flow.ts +1 -0
  523. package/src/scripts/multi-agent-parallel-start.js +214 -0
  524. package/src/scripts/multi-agent-parallel-start.js.map +1 -0
  525. package/src/scripts/multi-agent-parallel-start.ts +4 -4
  526. package/src/scripts/multi-agent-parallel.js +346 -0
  527. package/src/scripts/multi-agent-parallel.js.map +1 -0
  528. package/src/scripts/multi-agent-parallel.ts +1 -0
  529. package/src/scripts/multi-agent-sequence.js +184 -0
  530. package/src/scripts/multi-agent-sequence.js.map +1 -0
  531. package/src/scripts/multi-agent-sequence.ts +4 -4
  532. package/src/scripts/multi-agent-supervisor.js +324 -0
  533. package/src/scripts/multi-agent-supervisor.js.map +1 -0
  534. package/src/scripts/multi-agent-supervisor.ts +1 -0
  535. package/src/scripts/multi-agent-test.js +147 -0
  536. package/src/scripts/multi-agent-test.js.map +1 -0
  537. package/src/scripts/multi-agent-test.ts +1 -0
  538. package/src/scripts/parallel-asymmetric-tools-test.js +202 -0
  539. package/src/scripts/parallel-asymmetric-tools-test.js.map +1 -0
  540. package/src/scripts/parallel-asymmetric-tools-test.ts +1 -0
  541. package/src/scripts/parallel-full-metadata-test.js +176 -0
  542. package/src/scripts/parallel-full-metadata-test.js.map +1 -0
  543. package/src/scripts/parallel-full-metadata-test.ts +1 -0
  544. package/src/scripts/parallel-tools-test.js +256 -0
  545. package/src/scripts/parallel-tools-test.js.map +1 -0
  546. package/src/scripts/parallel-tools-test.ts +1 -0
  547. package/src/scripts/poc-multi-agent-comprehensive.ts +1222 -0
  548. package/src/scripts/programmatic_exec.js +277 -0
  549. package/src/scripts/programmatic_exec.js.map +1 -0
  550. package/src/scripts/programmatic_exec_agent.js +168 -0
  551. package/src/scripts/programmatic_exec_agent.js.map +1 -0
  552. package/src/scripts/programmatic_exec_agent.ts +1 -0
  553. package/src/scripts/search.js +118 -0
  554. package/src/scripts/search.js.map +1 -0
  555. package/src/scripts/search.ts +1 -0
  556. package/src/scripts/sequential-full-metadata-test.js +143 -0
  557. package/src/scripts/sequential-full-metadata-test.js.map +1 -0
  558. package/src/scripts/sequential-full-metadata-test.ts +1 -0
  559. package/src/scripts/simple.js +174 -0
  560. package/src/scripts/simple.js.map +1 -0
  561. package/src/scripts/simple.ts +2 -1
  562. package/src/scripts/single-agent-metadata-test.js +152 -0
  563. package/src/scripts/single-agent-metadata-test.js.map +1 -0
  564. package/src/scripts/single-agent-metadata-test.ts +4 -6
  565. package/src/scripts/stream.js +113 -0
  566. package/src/scripts/stream.js.map +1 -0
  567. package/src/scripts/stream.ts +1 -0
  568. package/src/scripts/test-custom-prompt-key.js +132 -0
  569. package/src/scripts/test-custom-prompt-key.js.map +1 -0
  570. package/src/scripts/test-handoff-input.js +143 -0
  571. package/src/scripts/test-handoff-input.js.map +1 -0
  572. package/src/scripts/test-handoff-preamble.js +227 -0
  573. package/src/scripts/test-handoff-preamble.js.map +1 -0
  574. package/src/scripts/test-handoff-preamble.ts +1 -0
  575. package/src/scripts/test-handoff-steering.js +353 -0
  576. package/src/scripts/test-handoff-steering.js.map +1 -0
  577. package/src/scripts/test-handoff-steering.ts +430 -0
  578. package/src/scripts/test-multi-agent-list-handoff.js +318 -0
  579. package/src/scripts/test-multi-agent-list-handoff.js.map +1 -0
  580. package/src/scripts/test-multi-agent-list-handoff.ts +1 -0
  581. package/src/scripts/test-parallel-agent-labeling.js +253 -0
  582. package/src/scripts/test-parallel-agent-labeling.js.map +1 -0
  583. package/src/scripts/test-parallel-agent-labeling.ts +2 -0
  584. package/src/scripts/test-parallel-handoffs.js +229 -0
  585. package/src/scripts/test-parallel-handoffs.js.map +1 -0
  586. package/src/scripts/test-parallel-handoffs.ts +1 -0
  587. package/src/scripts/test-thinking-handoff-bedrock.js +132 -0
  588. package/src/scripts/test-thinking-handoff-bedrock.js.map +1 -0
  589. package/src/scripts/test-thinking-handoff-bedrock.ts +1 -0
  590. package/src/scripts/test-thinking-handoff.js +132 -0
  591. package/src/scripts/test-thinking-handoff.js.map +1 -0
  592. package/src/scripts/test-thinking-handoff.ts +1 -0
  593. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js +140 -0
  594. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js.map +1 -0
  595. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +166 -0
  596. package/src/scripts/test-tool-before-handoff-role-order.js +223 -0
  597. package/src/scripts/test-tool-before-handoff-role-order.js.map +1 -0
  598. package/src/scripts/test-tool-before-handoff-role-order.ts +276 -0
  599. package/src/scripts/test-tools-before-handoff.js +187 -0
  600. package/src/scripts/test-tools-before-handoff.js.map +1 -0
  601. package/src/scripts/test-tools-before-handoff.ts +4 -8
  602. package/src/scripts/test_code_api.js +263 -0
  603. package/src/scripts/test_code_api.js.map +1 -0
  604. package/src/scripts/thinking-bedrock.js +128 -0
  605. package/src/scripts/thinking-bedrock.js.map +1 -0
  606. package/src/scripts/thinking-bedrock.ts +1 -0
  607. package/src/scripts/thinking-vertexai.js +130 -0
  608. package/src/scripts/thinking-vertexai.js.map +1 -0
  609. package/src/scripts/thinking-vertexai.ts +168 -0
  610. package/src/scripts/thinking.js +134 -0
  611. package/src/scripts/thinking.js.map +1 -0
  612. package/src/scripts/thinking.ts +1 -0
  613. package/src/scripts/tool_search.js +114 -0
  614. package/src/scripts/tool_search.js.map +1 -0
  615. package/src/scripts/tools.js +125 -0
  616. package/src/scripts/tools.js.map +1 -0
  617. package/src/scripts/tools.ts +5 -19
  618. package/src/specs/agent-handoffs-bedrock.integration.test.js +280 -0
  619. package/src/specs/agent-handoffs-bedrock.integration.test.js.map +1 -0
  620. package/src/specs/agent-handoffs-bedrock.integration.test.ts +412 -375
  621. package/src/specs/agent-handoffs.test.js +924 -0
  622. package/src/specs/agent-handoffs.test.js.map +1 -0
  623. package/src/specs/agent-handoffs.test.ts +152 -39
  624. package/src/specs/anthropic.simple.test.js +287 -0
  625. package/src/specs/anthropic.simple.test.js.map +1 -0
  626. package/src/specs/anthropic.simple.test.ts +7 -4
  627. package/src/specs/azure.simple.test.js +381 -0
  628. package/src/specs/azure.simple.test.js.map +1 -0
  629. package/src/specs/azure.simple.test.ts +143 -5
  630. package/src/specs/cache.simple.test.js +282 -0
  631. package/src/specs/cache.simple.test.js.map +1 -0
  632. package/src/specs/cache.simple.test.ts +9 -2
  633. package/src/specs/custom-event-await.test.js +148 -0
  634. package/src/specs/custom-event-await.test.js.map +1 -0
  635. package/src/specs/custom-event-await.test.ts +215 -0
  636. package/src/specs/deepseek.simple.test.js +189 -0
  637. package/src/specs/deepseek.simple.test.js.map +1 -0
  638. package/src/specs/deepseek.simple.test.ts +4 -2
  639. package/src/specs/emergency-prune.test.js +308 -0
  640. package/src/specs/emergency-prune.test.js.map +1 -0
  641. package/src/specs/moonshot.simple.test.js +237 -0
  642. package/src/specs/moonshot.simple.test.js.map +1 -0
  643. package/src/specs/moonshot.simple.test.ts +6 -2
  644. package/src/specs/observability.integration.test.js +1337 -0
  645. package/src/specs/observability.integration.test.js.map +1 -0
  646. package/src/specs/observability.integration.test.ts +2223 -0
  647. package/src/specs/openai.simple.test.js +233 -0
  648. package/src/specs/openai.simple.test.js.map +1 -0
  649. package/src/specs/openai.simple.test.ts +4 -2
  650. package/src/specs/openrouter.simple.test.js +202 -0
  651. package/src/specs/openrouter.simple.test.js.map +1 -0
  652. package/src/specs/openrouter.simple.test.ts +165 -4
  653. package/src/specs/prune.test.js +733 -0
  654. package/src/specs/prune.test.js.map +1 -0
  655. package/src/specs/prune.test.ts +1 -0
  656. package/src/specs/reasoning.test.js +144 -0
  657. package/src/specs/reasoning.test.js.map +1 -0
  658. package/src/specs/reasoning.test.ts +2 -2
  659. package/src/specs/spec.utils.js +4 -0
  660. package/src/specs/spec.utils.js.map +1 -0
  661. package/src/specs/thinking-handoff.test.js +486 -0
  662. package/src/specs/thinking-handoff.test.js.map +1 -0
  663. package/src/specs/thinking-handoff.test.ts +3 -2
  664. package/src/specs/thinking-prune.test.js +600 -0
  665. package/src/specs/thinking-prune.test.js.map +1 -0
  666. package/src/specs/token-distribution-edge-case.test.js +246 -0
  667. package/src/specs/token-distribution-edge-case.test.js.map +1 -0
  668. package/src/specs/token-memoization.test.js +32 -0
  669. package/src/specs/token-memoization.test.js.map +1 -0
  670. package/src/specs/token-memoization.test.ts +14 -5
  671. package/src/specs/tokens.test.js +49 -0
  672. package/src/specs/tokens.test.js.map +1 -0
  673. package/src/specs/tokens.test.ts +64 -0
  674. package/src/specs/tool-error.test.js +139 -0
  675. package/src/specs/tool-error.test.js.map +1 -0
  676. package/src/specs/tool-error.test.ts +2 -2
  677. package/src/splitStream.js +204 -0
  678. package/src/splitStream.js.map +1 -0
  679. package/src/splitStream.test.js +504 -0
  680. package/src/splitStream.test.js.map +1 -0
  681. package/src/stream.js +650 -0
  682. package/src/stream.js.map +1 -0
  683. package/src/stream.test.js +225 -0
  684. package/src/stream.test.js.map +1 -0
  685. package/src/stream.test.ts +25 -15
  686. package/src/stream.ts +82 -32
  687. package/src/test/mockTools.js +340 -0
  688. package/src/test/mockTools.js.map +1 -0
  689. package/src/tools/AskUser.ts +159 -0
  690. package/src/tools/BrowserTools.js +245 -0
  691. package/src/tools/BrowserTools.js.map +1 -0
  692. package/src/tools/BrowserTools.ts +12 -8
  693. package/src/tools/Calculator.js +38 -0
  694. package/src/tools/Calculator.js.map +1 -0
  695. package/src/tools/Calculator.test.js +225 -0
  696. package/src/tools/Calculator.test.js.map +1 -0
  697. package/src/tools/CodeExecutor.js +233 -0
  698. package/src/tools/CodeExecutor.js.map +1 -0
  699. package/src/tools/CodeExecutor.selfhealing.test.ts +435 -0
  700. package/src/tools/CodeExecutor.ts +62 -4
  701. package/src/tools/ProgrammaticToolCalling.js +602 -0
  702. package/src/tools/ProgrammaticToolCalling.js.map +1 -0
  703. package/src/tools/ProgrammaticToolCalling.ts +40 -52
  704. package/src/tools/StreamingToolCallBuffer.js +179 -0
  705. package/src/tools/StreamingToolCallBuffer.js.map +1 -0
  706. package/src/tools/StreamingToolCallBuffer.ts +218 -0
  707. package/src/tools/ToolNode.js +930 -0
  708. package/src/tools/ToolNode.js.map +1 -0
  709. package/src/tools/ToolNode.ts +454 -41
  710. package/src/tools/ToolSearch.js +904 -0
  711. package/src/tools/ToolSearch.js.map +1 -0
  712. package/src/tools/ToolSearch.ts +84 -33
  713. package/src/tools/__tests__/AskUser.test.ts +537 -0
  714. package/src/tools/__tests__/BrowserTools.test.js +306 -0
  715. package/src/tools/__tests__/BrowserTools.test.js.map +1 -0
  716. package/src/tools/__tests__/BrowserTools.test.ts +131 -6
  717. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js +276 -0
  718. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js.map +1 -0
  719. package/src/tools/__tests__/ProgrammaticToolCalling.test.js +807 -0
  720. package/src/tools/__tests__/ProgrammaticToolCalling.test.js.map +1 -0
  721. package/src/tools/__tests__/StreamingToolCallBuffer.test.js +175 -0
  722. package/src/tools/__tests__/StreamingToolCallBuffer.test.js.map +1 -0
  723. package/src/tools/__tests__/StreamingToolCallBuffer.test.ts +263 -0
  724. package/src/tools/__tests__/ToolApproval.test.js +675 -0
  725. package/src/tools/__tests__/ToolApproval.test.js.map +1 -0
  726. package/src/tools/__tests__/ToolApproval.test.ts +194 -20
  727. package/src/tools/__tests__/ToolNode.hitl.test.ts +267 -0
  728. package/src/tools/__tests__/ToolNode.recovery.test.js +200 -0
  729. package/src/tools/__tests__/ToolNode.recovery.test.js.map +1 -0
  730. package/src/tools/__tests__/ToolNode.recovery.test.ts +276 -0
  731. package/src/tools/__tests__/ToolNode.session.test.js +319 -0
  732. package/src/tools/__tests__/ToolNode.session.test.js.map +1 -0
  733. package/src/tools/__tests__/ToolNode.session.test.ts +465 -0
  734. package/src/tools/__tests__/ToolSearch.integration.test.js +125 -0
  735. package/src/tools/__tests__/ToolSearch.integration.test.js.map +1 -0
  736. package/src/tools/__tests__/ToolSearch.test.js +812 -0
  737. package/src/tools/__tests__/ToolSearch.test.js.map +1 -0
  738. package/src/tools/__tests__/ToolSearch.test.ts +78 -5
  739. package/src/tools/__tests__/handlers.test.js +799 -0
  740. package/src/tools/__tests__/handlers.test.js.map +1 -0
  741. package/src/tools/__tests__/handlers.test.ts +1100 -0
  742. package/src/tools/__tests__/truncation-recovery.integration.test.js +362 -0
  743. package/src/tools/__tests__/truncation-recovery.integration.test.js.map +1 -0
  744. package/src/tools/__tests__/truncation-recovery.integration.test.ts +560 -0
  745. package/src/tools/handlers.js +306 -0
  746. package/src/tools/handlers.js.map +1 -0
  747. package/src/tools/handlers.ts +119 -16
  748. package/src/tools/schema.js +25 -0
  749. package/src/tools/schema.js.map +1 -0
  750. package/src/tools/search/anthropic.js +34 -0
  751. package/src/tools/search/anthropic.js.map +1 -0
  752. package/src/tools/search/content.js +116 -0
  753. package/src/tools/search/content.js.map +1 -0
  754. package/src/tools/search/content.test.js +133 -0
  755. package/src/tools/search/content.test.js.map +1 -0
  756. package/src/tools/search/firecrawl.js +173 -0
  757. package/src/tools/search/firecrawl.js.map +1 -0
  758. package/src/tools/search/format.js +198 -0
  759. package/src/tools/search/format.js.map +1 -0
  760. package/src/tools/search/highlights.js +241 -0
  761. package/src/tools/search/highlights.js.map +1 -0
  762. package/src/tools/search/index.js +3 -0
  763. package/src/tools/search/index.js.map +1 -0
  764. package/src/tools/search/jina-reranker.test.js +106 -0
  765. package/src/tools/search/jina-reranker.test.js.map +1 -0
  766. package/src/tools/search/rerankers.js +165 -0
  767. package/src/tools/search/rerankers.js.map +1 -0
  768. package/src/tools/search/schema.js +102 -0
  769. package/src/tools/search/schema.js.map +1 -0
  770. package/src/tools/search/search.js +561 -0
  771. package/src/tools/search/search.js.map +1 -0
  772. package/src/tools/search/serper-scraper.js +126 -0
  773. package/src/tools/search/serper-scraper.js.map +1 -0
  774. package/src/tools/search/test.js +129 -0
  775. package/src/tools/search/test.js.map +1 -0
  776. package/src/tools/search/tool.js +453 -0
  777. package/src/tools/search/tool.js.map +1 -0
  778. package/src/tools/search/types.js +2 -0
  779. package/src/tools/search/types.js.map +1 -0
  780. package/src/tools/search/utils.js +59 -0
  781. package/src/tools/search/utils.js.map +1 -0
  782. package/src/types/graph.js +24 -0
  783. package/src/types/graph.js.map +1 -0
  784. package/src/types/graph.test.js +192 -0
  785. package/src/types/graph.test.js.map +1 -0
  786. package/src/types/graph.ts +26 -6
  787. package/src/types/index.js +7 -0
  788. package/src/types/index.js.map +1 -0
  789. package/src/types/llm.js +2 -0
  790. package/src/types/llm.js.map +1 -0
  791. package/src/types/llm.ts +8 -3
  792. package/src/types/messages.js +2 -0
  793. package/src/types/messages.js.map +1 -0
  794. package/src/types/run.js +2 -0
  795. package/src/types/run.js.map +1 -0
  796. package/src/types/run.ts +2 -0
  797. package/src/types/stream.js +2 -0
  798. package/src/types/stream.js.map +1 -0
  799. package/src/types/tools.js +2 -0
  800. package/src/types/tools.js.map +1 -0
  801. package/src/types/tools.ts +21 -2
  802. package/src/utils/contextAnalytics.js +79 -0
  803. package/src/utils/contextAnalytics.js.map +1 -0
  804. package/src/utils/contextAnalytics.test.js +166 -0
  805. package/src/utils/contextAnalytics.test.js.map +1 -0
  806. package/src/utils/contextAnalytics.test.ts +222 -0
  807. package/src/utils/contextAnalytics.ts +27 -9
  808. package/src/utils/events.js +26 -0
  809. package/src/utils/events.js.map +1 -0
  810. package/src/utils/graph.js +11 -0
  811. package/src/utils/graph.js.map +1 -0
  812. package/src/utils/handlers.js +65 -0
  813. package/src/utils/handlers.js.map +1 -0
  814. package/src/utils/index.js +10 -0
  815. package/src/utils/index.js.map +1 -0
  816. package/src/utils/index.ts +1 -0
  817. package/src/utils/llm.js +21 -0
  818. package/src/utils/llm.js.map +1 -0
  819. package/src/utils/llmConfig.js +205 -0
  820. package/src/utils/llmConfig.js.map +1 -0
  821. package/src/utils/llmConfig.ts +5 -5
  822. package/src/utils/logging.js +37 -0
  823. package/src/utils/logging.js.map +1 -0
  824. package/src/utils/misc.js +51 -0
  825. package/src/utils/misc.js.map +1 -0
  826. package/src/utils/run.js +69 -0
  827. package/src/utils/run.js.map +1 -0
  828. package/src/utils/run.ts +108 -106
  829. package/src/utils/schema.js +21 -0
  830. package/src/utils/schema.js.map +1 -0
  831. package/src/utils/title.js +119 -0
  832. package/src/utils/title.js.map +1 -0
  833. package/src/utils/tokens.js +92 -0
  834. package/src/utils/tokens.js.map +1 -0
  835. package/src/utils/tokens.ts +118 -142
  836. package/src/utils/toolCallContinuation.ts +55 -0
  837. package/src/utils/toonFormat.js +379 -0
  838. package/src/utils/toonFormat.js.map +1 -0
@@ -1,22 +1,26 @@
1
1
  'use strict';
2
2
 
3
3
  var nanoid = require('nanoid');
4
- var stream = require('@langchain/core/utils/stream');
4
+ var stream$1 = require('@langchain/core/utils/stream');
5
5
  var googleVertexai = require('@langchain/google-vertexai');
6
6
  var langgraph = require('@langchain/langgraph');
7
7
  var runnables = require('@langchain/core/runnables');
8
8
  var messages = require('@langchain/core/messages');
9
- var _enum = require('../common/enum.cjs');
10
9
  var core = require('../messages/core.cjs');
10
+ var ids = require('../messages/ids.cjs');
11
11
  var prune = require('../messages/prune.cjs');
12
12
  var format = require('../messages/format.cjs');
13
13
  var cache = require('../messages/cache.cjs');
14
14
  var content = require('../messages/content.cjs');
15
15
  var tools = require('../messages/tools.cjs');
16
+ var _enum = require('../common/enum.cjs');
17
+ var constants = require('../common/constants.cjs');
16
18
  var graph = require('../utils/graph.cjs');
17
19
  var llm = require('../utils/llm.cjs');
20
+ var stream = require('../stream.cjs');
21
+ var handlers = require('../tools/handlers.cjs');
18
22
  var run = require('../utils/run.cjs');
19
- require('js-tiktoken');
23
+ require('ai-tokenizer');
20
24
  require('../utils/toonFormat.cjs');
21
25
  var contextAnalytics = require('../utils/contextAnalytics.cjs');
22
26
  require('zod-to-json-schema');
@@ -29,6 +33,7 @@ var validate = require('../schemas/validate.cjs');
29
33
  var AgentContext = require('../agents/AgentContext.cjs');
30
34
  var graph$1 = require('../types/graph.cjs');
31
35
  var fake = require('../llm/fake.cjs');
36
+ var StreamingToolCallBuffer = require('../tools/StreamingToolCallBuffer.cjs');
32
37
 
33
38
  /* eslint-disable no-console */
34
39
  // src/graphs/Graph.ts
@@ -52,6 +57,32 @@ class Graph {
52
57
  * Currently supports code execution session tracking (session_id, files).
53
58
  */
54
59
  sessions = new Map();
60
+ /**
61
+ * Streaming tool call buffer — accumulates raw arg strings during streaming
62
+ * so that truncated tool call content can be recovered by the ToolNode.
63
+ * Fed by handleToolCallChunks, consumed by ToolNode.run when args are incomplete.
64
+ */
65
+ streamingToolCallBuffer = new StreamingToolCallBuffer.StreamingToolCallBuffer();
66
+ /**
67
+ * Clears heavy references to allow GC to reclaim memory held by
68
+ * LangGraph's internal config / AsyncLocalStorage RunTree chain.
69
+ * Call after a run completes and content has been extracted.
70
+ */
71
+ clearHeavyState() {
72
+ this.config = undefined;
73
+ this.signal = undefined;
74
+ this.contentData = [];
75
+ this.contentIndexMap = new Map();
76
+ this.stepKeyIds = new Map();
77
+ this.toolCallStepIds.clear();
78
+ this.messageIdsByStepKey = new Map();
79
+ this.messageStepHasToolCalls = new Map();
80
+ this.prelimMessageIdsByStepKey = new Map();
81
+ this.invokedToolIds = undefined;
82
+ this.handlerRegistry = undefined;
83
+ this.sessions.clear();
84
+ this.streamingToolCallBuffer.clearAll();
85
+ }
55
86
  }
56
87
  class StandardGraph extends Graph {
57
88
  overrideModel;
@@ -92,7 +123,13 @@ class StandardGraph extends Graph {
92
123
  this.contentIndexMap = graph.resetIfNotEmpty(this.contentIndexMap, new Map());
93
124
  }
94
125
  this.stepKeyIds = graph.resetIfNotEmpty(this.stepKeyIds, new Map());
95
- this.toolCallStepIds = graph.resetIfNotEmpty(this.toolCallStepIds, new Map());
126
+ /**
127
+ * Clear in-place instead of replacing with a new Map to preserve the
128
+ * shared reference held by ToolNode (passed at construction time).
129
+ * Using resetIfNotEmpty would create a new Map, leaving ToolNode with
130
+ * a stale reference on 2nd+ processStream calls.
131
+ */
132
+ this.toolCallStepIds.clear();
96
133
  this.messageIdsByStepKey = graph.resetIfNotEmpty(this.messageIdsByStepKey, new Map());
97
134
  this.messageStepHasToolCalls = graph.resetIfNotEmpty(this.messageStepHasToolCalls, new Map());
98
135
  this.prelimMessageIdsByStepKey = graph.resetIfNotEmpty(this.prelimMessageIdsByStepKey, new Map());
@@ -101,6 +138,90 @@ class StandardGraph extends Graph {
101
138
  context.reset();
102
139
  }
103
140
  }
141
+ clearHeavyState() {
142
+ super.clearHeavyState();
143
+ this.messages = [];
144
+ this.overrideModel = undefined;
145
+ for (const context of this.agentContexts.values()) {
146
+ context.reset();
147
+ }
148
+ }
149
+ /**
150
+ * Returns clientOptions with a reduced thinking budget for subsequent
151
+ * ReAct loop iterations (tool-result turns).
152
+ *
153
+ * **Rationale:** The first LLM call in a conversation processes the user's
154
+ * original query and may benefit from deep extended thinking. Subsequent
155
+ * iterations — where the model receives tool results and decides whether
156
+ * to call another tool or produce a final response — require minimal
157
+ * reasoning. Reducing the thinking budget from the user's configured
158
+ * value to TOOL_TURN_THINKING_BUDGET (1024 tokens) cuts wall-clock
159
+ * latency by ~15-20s per iteration, compounding across multi-tool flows.
160
+ *
161
+ * Provider handling:
162
+ * - **Anthropic (direct):** Reduces `thinking.budget_tokens` if > threshold
163
+ * - **Bedrock (Anthropic models):** Reduces `additionalModelRequestFields.thinking.budget_tokens`
164
+ * - **VertexAI / Google:** Reduces `thinkingConfig.thinkingBudget` if > threshold
165
+ * - **All others:** Returns clientOptions unchanged (no-op)
166
+ *
167
+ * @param clientOptions - The original client options from AgentContext
168
+ * @param provider - The LLM provider enum value
169
+ * @returns Shallow-cloned clientOptions with reduced thinking budget, or the original if no reduction needed
170
+ */
171
+ getAdaptiveClientOptions(clientOptions, provider) {
172
+ if (provider === _enum.Providers.ANTHROPIC) {
173
+ const anthropicOpts = clientOptions;
174
+ if (anthropicOpts.thinking != null &&
175
+ typeof anthropicOpts.thinking === 'object' &&
176
+ 'type' in anthropicOpts.thinking &&
177
+ (anthropicOpts.thinking.type === 'enabled' ||
178
+ anthropicOpts.thinking.type === 'adaptive') &&
179
+ 'budget_tokens' in anthropicOpts.thinking &&
180
+ anthropicOpts.thinking.budget_tokens >
181
+ constants.TOOL_TURN_THINKING_BUDGET) {
182
+ return {
183
+ ...anthropicOpts,
184
+ thinking: {
185
+ ...anthropicOpts.thinking,
186
+ budget_tokens: constants.TOOL_TURN_THINKING_BUDGET,
187
+ },
188
+ };
189
+ }
190
+ }
191
+ if (provider === _enum.Providers.BEDROCK) {
192
+ const bedrockOpts = clientOptions;
193
+ const thinkingField = bedrockOpts.additionalModelRequestFields?.thinking;
194
+ if (thinkingField != null &&
195
+ typeof thinkingField === 'object' &&
196
+ 'budget_tokens' in thinkingField &&
197
+ thinkingField.budget_tokens > constants.TOOL_TURN_THINKING_BUDGET) {
198
+ return {
199
+ ...bedrockOpts,
200
+ additionalModelRequestFields: {
201
+ ...(bedrockOpts.additionalModelRequestFields ?? {}),
202
+ thinking: {
203
+ ...thinkingField,
204
+ budget_tokens: constants.TOOL_TURN_THINKING_BUDGET,
205
+ },
206
+ },
207
+ };
208
+ }
209
+ }
210
+ if (provider === _enum.Providers.VERTEXAI || provider === _enum.Providers.GOOGLE) {
211
+ const googleOpts = clientOptions;
212
+ if (googleOpts.thinkingConfig?.thinkingBudget != null &&
213
+ googleOpts.thinkingConfig.thinkingBudget > constants.TOOL_TURN_THINKING_BUDGET) {
214
+ return {
215
+ ...googleOpts,
216
+ thinkingConfig: {
217
+ ...googleOpts.thinkingConfig,
218
+ thinkingBudget: constants.TOOL_TURN_THINKING_BUDGET,
219
+ },
220
+ };
221
+ }
222
+ }
223
+ return clientOptions;
224
+ }
104
225
  /**
105
226
  * Returns the normalized finish/stop reason from the last LLM invocation.
106
227
  * Used by callers to detect when the response was truncated due to max_tokens.
@@ -137,7 +258,7 @@ class StandardGraph extends Graph {
137
258
  return 'the past few hours';
138
259
  }
139
260
  else if (messageCount <= 300) {
140
- return 'roughly a day\'s worth';
261
+ return "roughly a day's worth";
141
262
  }
142
263
  else if (messageCount <= 700) {
143
264
  return 'the past few days';
@@ -226,7 +347,7 @@ class StandardGraph extends Graph {
226
347
  keyList.push('reasoning');
227
348
  }
228
349
  else if (agentContext.tokenTypeSwitch === 'content') {
229
- keyList.push('post-reasoning');
350
+ keyList.push(`post-reasoning-${agentContext.reasoningTransitionCount}`);
230
351
  }
231
352
  if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {
232
353
  keyList.push(this.invokedToolIds.size + '');
@@ -238,7 +359,9 @@ class StandardGraph extends Graph {
238
359
  }
239
360
  /* Misc.*/
240
361
  getRunMessages() {
241
- return this.messages.slice(this.startIndex);
362
+ const result = this.messages.slice(this.startIndex);
363
+ console.debug(`[Graph] getRunMessages() | totalMessages=${this.messages.length} | startIndex=${this.startIndex} | runMessages=${result.length}`);
364
+ return result;
242
365
  }
243
366
  getContentParts() {
244
367
  return core.convertMessagesToContent(this.messages.slice(this.startIndex));
@@ -351,26 +474,77 @@ class StandardGraph extends Graph {
351
474
  if (eventDrivenMode) {
352
475
  const schemaTools = schema.createSchemaOnlyTools(toolDefinitions);
353
476
  const toolDefMap = new Map(toolDefinitions.map((def) => [def.name, def]));
477
+ const graphTools = agentContext?.graphTools;
478
+ const directToolNames = new Set();
479
+ const allTools = [...schemaTools];
480
+ const allToolMap = new Map(schemaTools.map((tool) => [tool.name, tool]));
481
+ if (graphTools && graphTools.length > 0) {
482
+ for (const tool of graphTools) {
483
+ if ('name' in tool) {
484
+ allTools.push(tool);
485
+ allToolMap.set(tool.name, tool);
486
+ directToolNames.add(tool.name);
487
+ }
488
+ }
489
+ }
354
490
  return new ToolNode.ToolNode({
355
- tools: schemaTools,
356
- toolMap: new Map(schemaTools.map((tool) => [tool.name, tool])),
357
- toolCallStepIds: this.toolCallStepIds,
358
- errorHandler: (data, metadata) => StandardGraph.handleToolCallErrorStatic(this, data, metadata),
359
- toolRegistry: agentContext?.toolRegistry,
360
- sessions: this.sessions,
491
+ tools: allTools,
492
+ toolMap: allToolMap,
361
493
  eventDrivenMode: true,
494
+ sessions: this.sessions,
362
495
  toolDefinitions: toolDefMap,
363
496
  agentId: agentContext?.agentId,
497
+ toolCallStepIds: this.toolCallStepIds,
498
+ toolRegistry: agentContext?.toolRegistry,
499
+ directToolNames: directToolNames.size > 0 ? directToolNames : undefined,
500
+ streamingToolCallBuffer: this.streamingToolCallBuffer,
501
+ errorHandler: (data, metadata) => StandardGraph.handleToolCallErrorStatic(this, data, metadata),
364
502
  toolApprovalConfig,
365
503
  });
366
504
  }
505
+ const graphTools = agentContext?.graphTools;
506
+ const baseTools = currentTools ?? [];
507
+ const allTraditionalTools = graphTools && graphTools.length > 0
508
+ ? [...baseTools, ...graphTools]
509
+ : baseTools;
510
+ /**
511
+ * Build tool map from all sources: agent's toolMap, agent's tools array, and graph tools.
512
+ * Previously, baseTools were missing from the map when no explicit toolMap was provided,
513
+ * causing ToolNode to not find agent-defined tools (e.g., custom DynamicStructuredTools).
514
+ */
515
+ const traditionalToolMap = graphTools && graphTools.length > 0
516
+ ? new Map([
517
+ ...(currentToolMap ?? new Map()),
518
+ ...baseTools
519
+ .filter((t) => 'name' in t)
520
+ .map((t) => [t.name, t]),
521
+ ...graphTools
522
+ .filter((t) => 'name' in t)
523
+ .map((t) => [t.name, t]),
524
+ ])
525
+ : currentToolMap;
526
+ /** Build directToolNames from graph-managed tools (handoff/transfer) so HITL can bypass them */
527
+ let directToolNames;
528
+ if (graphTools && graphTools.length > 0) {
529
+ directToolNames = new Set();
530
+ for (const tool of graphTools) {
531
+ if ('name' in tool) {
532
+ directToolNames.add(tool.name);
533
+ }
534
+ }
535
+ if (directToolNames.size === 0) {
536
+ directToolNames = undefined;
537
+ }
538
+ }
367
539
  return new ToolNode.ToolNode({
368
- tools: currentTools ?? [],
369
- toolMap: currentToolMap,
540
+ tools: allTraditionalTools,
541
+ toolMap: traditionalToolMap,
370
542
  toolCallStepIds: this.toolCallStepIds,
543
+ streamingToolCallBuffer: this.streamingToolCallBuffer,
371
544
  errorHandler: (data, metadata) => StandardGraph.handleToolCallErrorStatic(this, data, metadata),
372
545
  toolRegistry: agentContext?.toolRegistry,
373
546
  sessions: this.sessions,
547
+ directToolNames,
374
548
  toolApprovalConfig,
375
549
  });
376
550
  }
@@ -427,25 +601,50 @@ class StandardGraph extends Graph {
427
601
  }
428
602
  }
429
603
  /** Execute model invocation with streaming support */
430
- async attemptInvoke({ currentModel, finalMessages, provider, tools, }, config) {
604
+ async attemptInvoke({ currentModel, finalMessages, provider, tools: _tools, }, config) {
431
605
  const model = this.overrideModel ?? currentModel;
432
606
  if (!model) {
433
607
  throw new Error('No model found');
434
608
  }
435
- if ((tools?.length ?? 0) > 0 && providers.manualToolStreamProviders.has(provider)) {
436
- if (!model.stream) {
437
- throw new Error('Model does not support stream');
438
- }
439
- const stream$1 = await model.stream(finalMessages, config);
609
+ if (model.stream) {
610
+ /**
611
+ * Process all model output through a local ChatModelStreamHandler in the
612
+ * graph execution context. Each chunk is awaited before the next one is
613
+ * consumed, so by the time the stream is exhausted every run step
614
+ * (MESSAGE_CREATION, TOOL_CALLS) has been created and toolCallStepIds is
615
+ * fully populated — the graph will not transition to ToolNode until this
616
+ * is done.
617
+ *
618
+ * This replaces the previous pattern where ChatModelStreamHandler lived
619
+ * in the for-await stream consumer (handler registry). That consumer
620
+ * runs concurrently with graph execution, so the graph could advance to
621
+ * ToolNode before the consumer had processed all events. By handling
622
+ * chunks here, inside the agent node, the race is eliminated.
623
+ *
624
+ * The for-await consumer no longer needs a ChatModelStreamHandler; its
625
+ * on_chat_model_stream events are simply ignored (no handler registered).
626
+ * The dispatched custom events (ON_RUN_STEP, ON_MESSAGE_DELTA, etc.)
627
+ * still reach the content aggregator and SSE handlers through the custom
628
+ * event callback in Run.createCustomEventCallback.
629
+ */
630
+ const metadata = config?.metadata;
631
+ const streamHandler = new stream.ChatModelStreamHandler();
632
+ const stream$2 = await model.stream(finalMessages, config);
440
633
  let finalChunk;
441
- for await (const chunk of stream$1) {
442
- await events.safeDispatchCustomEvent(_enum.GraphEvents.CHAT_MODEL_STREAM, { chunk, emitted: true }, config);
443
- finalChunk = finalChunk ? stream.concat(finalChunk, chunk) : chunk;
634
+ for await (const chunk of stream$2) {
635
+ await streamHandler.handle(_enum.GraphEvents.CHAT_MODEL_STREAM, { chunk }, metadata, this);
636
+ finalChunk = finalChunk ? stream$1.concat(finalChunk, chunk) : chunk;
637
+ }
638
+ if (providers.manualToolStreamProviders.has(provider)) {
639
+ finalChunk = core.modifyDeltaProperties(provider, finalChunk);
640
+ }
641
+ if ((finalChunk?.tool_calls?.length ?? 0) > 0) {
642
+ finalChunk.tool_calls = finalChunk.tool_calls?.filter((tool_call) => !!tool_call.name);
444
643
  }
445
- finalChunk = core.modifyDeltaProperties(provider, finalChunk);
446
644
  return { messages: [finalChunk] };
447
645
  }
448
646
  else {
647
+ /** Fallback for models without stream support. */
449
648
  const finalMessage = await model.invoke(finalMessages, config);
450
649
  if ((finalMessage.tool_calls?.length ?? 0) > 0) {
451
650
  finalMessage.tool_calls = finalMessage.tool_calls?.filter((tool_call) => !!tool_call.name);
@@ -465,15 +664,12 @@ class StandardGraph extends Graph {
465
664
  */
466
665
  async attemptStructuredInvoke({ currentModel, finalMessages, schema, structuredOutputConfig, provider, agentContext, }, config) {
467
666
  const model = this.overrideModel ?? currentModel;
468
- if (!model) {
469
- throw new Error('No model found');
470
- }
471
667
  // Check if model supports withStructuredOutput
472
668
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
473
669
  if (typeof model.withStructuredOutput !== 'function') {
474
- throw new Error(`The selected model does not support structured output. ` +
475
- `Please use a model that supports JSON schema output (e.g., OpenAI GPT-4, Anthropic Claude, Google Gemini) ` +
476
- `or disable structured output for this agent.`);
670
+ throw new Error('The selected model does not support structured output. ' +
671
+ 'Please use a model that supports JSON schema output (e.g., OpenAI GPT-4, Anthropic Claude, Google Gemini) ' +
672
+ 'or disable structured output for this agent.');
477
673
  }
478
674
  const { name = 'StructuredResponse', includeRaw: _includeRaw = false, handleErrors = true, maxRetries = 2, } = structuredOutputConfig;
479
675
  // Resolve the structured output method using AgentContext's provider-aware logic
@@ -492,7 +688,8 @@ class StandardGraph extends Graph {
492
688
  method = 'functionCalling';
493
689
  }
494
690
  else if (mode === 'provider') {
495
- method = provider === _enum.Providers.BEDROCK ? 'functionCalling' : 'jsonMode';
691
+ method =
692
+ provider === _enum.Providers.BEDROCK ? 'functionCalling' : 'jsonMode';
496
693
  }
497
694
  else {
498
695
  method = undefined;
@@ -500,11 +697,11 @@ class StandardGraph extends Graph {
500
697
  }
501
698
  // Prepare schema for provider-specific constraints when using native/jsonSchema mode
502
699
  let preparedSchema = schema;
503
- if (method === 'jsonSchema' && provider) {
700
+ if (method === 'jsonSchema' && provider != null) {
504
701
  const { schema: prepared, warnings } = validate.prepareSchemaForProvider(schema, provider, structuredOutputConfig.strict !== false);
505
702
  preparedSchema = prepared;
506
703
  if (warnings.length > 0) {
507
- console.log('[Graph] Schema preparation warnings:', warnings);
704
+ console.warn('[Graph] Schema preparation warnings:', warnings);
508
705
  }
509
706
  }
510
707
  // Use withStructuredOutput to bind the schema
@@ -516,14 +713,6 @@ class StandardGraph extends Graph {
516
713
  includeRaw: true, // Always true internally for debugging
517
714
  strict: structuredOutputConfig.strict !== false,
518
715
  });
519
- console.log('[Graph] Structured output config:', {
520
- name,
521
- method,
522
- provider,
523
- schemaKeys: Object.keys(preparedSchema),
524
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
525
- modelName: model.model || model.modelId || 'unknown',
526
- });
527
716
  let lastError;
528
717
  let attempts = 0;
529
718
  while (attempts <= maxRetries) {
@@ -531,18 +720,11 @@ class StandardGraph extends Graph {
531
720
  // Note: We pass the original config here. The stream aggregator will filter out
532
721
  // the synthetic "response" tool call events from withStructuredOutput()
533
722
  const result = await structuredModel.invoke(finalMessages, config);
534
- // Debug: log what we got back
535
- console.log('[Graph] Structured output raw result type:', typeof result);
536
723
  // Check for refusal or truncation in the raw message
537
- if (result?.raw) {
724
+ if (result?.raw != null) {
538
725
  const rawMsg = result.raw;
539
- console.log('[Graph] Raw message content type:', typeof rawMsg?.content);
540
- console.log('[Graph] Raw message tool_calls:', rawMsg?.tool_calls?.length ?? 0);
541
- if (rawMsg?.content && typeof rawMsg.content === 'string' && rawMsg.content.length > 0) {
542
- console.log('[Graph] Raw message text content (first 200):', rawMsg.content.substring(0, 200));
543
- }
544
726
  // Check stop reason for refusal or truncation
545
- const responseMetadata = rawMsg.response_metadata ?? {};
727
+ const responseMetadata = rawMsg.response_metadata;
546
728
  const stopReason = responseMetadata.stop_reason ?? // Anthropic
547
729
  responseMetadata.finish_reason ?? // OpenAI
548
730
  responseMetadata.stopReason; // Bedrock
@@ -551,13 +733,14 @@ class StandardGraph extends Graph {
551
733
  }
552
734
  // Check for Anthropic refusal (stop_reason won't be 'refusal' but content may indicate it)
553
735
  // OpenAI uses message.refusal field
554
- const refusal = rawMsg.refusal;
555
- if (refusal) {
736
+ const refusal = rawMsg
737
+ .refusal;
738
+ if (refusal != null && refusal !== '') {
556
739
  throw new graph$1.StructuredOutputRefusalError(refusal);
557
740
  }
558
741
  }
559
742
  // Handle response - we always use includeRaw internally
560
- if (result?.raw && result?.parsed !== undefined) {
743
+ if (result?.raw != null && result?.parsed !== undefined) {
561
744
  return {
562
745
  structuredResponse: result.parsed,
563
746
  rawMessage: result.raw,
@@ -630,7 +813,9 @@ class StandardGraph extends Graph {
630
813
  // Get a fresh model WITHOUT tools bound
631
814
  // bindTools() returns RunnableBinding which lacks withStructuredOutput
632
815
  // Also disable thinking mode - Anthropic/Bedrock doesn't allow tool_choice with thinking enabled
633
- const structuredClientOptions = { ...agentContext.clientOptions };
816
+ const structuredClientOptions = {
817
+ ...agentContext.clientOptions,
818
+ };
634
819
  // Determine if streaming is possible for this structured output mode
635
820
  // Native/jsonSchema modes can stream; tool/functionCalling modes cannot (synthetic tool calls break UX)
636
821
  const resolved = agentContext.resolveStructuredOutputMode();
@@ -648,12 +833,12 @@ class StandardGraph extends Graph {
648
833
  // Remove thinking configuration for Bedrock
649
834
  if (agentContext.provider === _enum.Providers.BEDROCK) {
650
835
  const bedrockOpts = structuredClientOptions;
651
- if (bedrockOpts.additionalModelRequestFields) {
652
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
836
+ if (bedrockOpts.additionalModelRequestFields != null) {
653
837
  const additionalFields = Object.assign({}, bedrockOpts.additionalModelRequestFields);
654
838
  delete additionalFields.thinking;
655
839
  delete additionalFields.budgetTokens;
656
- bedrockOpts.additionalModelRequestFields = additionalFields;
840
+ bedrockOpts.additionalModelRequestFields =
841
+ additionalFields;
657
842
  }
658
843
  }
659
844
  // Remove thinking configuration for Anthropic direct API
@@ -717,7 +902,8 @@ class StandardGraph extends Graph {
717
902
  // This keeps the system message static (cacheable) while providing dynamic context
718
903
  // (timestamps, user info, tool context) as conversation content instead.
719
904
  // Only inject on the first turn when messages don't already have the context marker.
720
- if (agentContext.dynamicContext &&
905
+ if (agentContext.dynamicContext != null &&
906
+ agentContext.dynamicContext !== '' &&
721
907
  messages$1.length > 0 &&
722
908
  !messages$1.some((m) => m instanceof messages.HumanMessage &&
723
909
  typeof m.content === 'string' &&
@@ -736,11 +922,20 @@ class StandardGraph extends Graph {
736
922
  agentContext.markToolsAsDiscovered(discoveredNames);
737
923
  }
738
924
  const toolsForBinding = agentContext.getToolsForBinding();
925
+ // PERF: Detect subsequent ReAct iterations (tool results present in messages)
926
+ // and reduce thinking budget to minimize per-iteration latency.
927
+ // First iteration gets the user's configured budget; follow-up turns
928
+ // use TOOL_TURN_THINKING_BUDGET (1024) since they only need to route
929
+ // "call next tool" or "produce final response".
930
+ const isSubsequentIteration = messages$1.some((m) => m._getType() === 'tool');
931
+ const effectiveClientOptions = isSubsequentIteration && agentContext.clientOptions
932
+ ? this.getAdaptiveClientOptions(agentContext.clientOptions, agentContext.provider)
933
+ : agentContext.clientOptions;
739
934
  let model = this.overrideModel ??
740
935
  this.initializeModel({
741
936
  tools: toolsForBinding,
742
937
  provider: agentContext.provider,
743
- clientOptions: agentContext.clientOptions,
938
+ clientOptions: effectiveClientOptions,
744
939
  });
745
940
  if (agentContext.systemRunnable) {
746
941
  model = agentContext.systemRunnable.pipe(model);
@@ -767,7 +962,7 @@ class StandardGraph extends Graph {
767
962
  : '';
768
963
  return toolName === 'task';
769
964
  });
770
- if (hasTaskToolPrePrune &&
965
+ if (hasTaskToolPrePrune === true &&
771
966
  agentContext.tokenCounter &&
772
967
  agentContext.maxContextTokens != null) {
773
968
  // Estimate total tokens in messages BEFORE pruning
@@ -776,12 +971,12 @@ class StandardGraph extends Graph {
776
971
  prePruneTokens += agentContext.tokenCounter(msg);
777
972
  }
778
973
  // Add instruction tokens (system prompt)
779
- prePruneTokens += agentContext.instructionTokens ?? 0;
974
+ prePruneTokens += agentContext.instructionTokens;
780
975
  const prePruneUtilization = (prePruneTokens / agentContext.maxContextTokens) * 100;
781
976
  if (prePruneUtilization > 70) {
782
977
  console.warn(`[Graph] PRE-PRUNE delegation check: ${prePruneUtilization.toFixed(1)}% utilization ` +
783
978
  `(${prePruneTokens}/${agentContext.maxContextTokens} tokens). ` +
784
- `Injecting delegation hint INSTEAD of pruning.`);
979
+ 'Injecting delegation hint INSTEAD of pruning.');
785
980
  delegationInjectedPrePrune = true;
786
981
  }
787
982
  }
@@ -808,6 +1003,7 @@ class StandardGraph extends Graph {
808
1003
  });
809
1004
  }
810
1005
  if (agentContext.pruneMessages && !delegationInjectedPrePrune) {
1006
+ console.info(`[Graph:ContextMgmt] Pruning messages | inputCount=${messages$1.length} | maxTokens=${agentContext.maxContextTokens}`);
811
1007
  const { context, indexTokenCountMap, messagesToRefine } = agentContext.pruneMessages({
812
1008
  messages: messages$1,
813
1009
  usageMetadata: agentContext.currentUsage,
@@ -815,11 +1011,14 @@ class StandardGraph extends Graph {
815
1011
  });
816
1012
  agentContext.indexTokenCountMap = indexTokenCountMap;
817
1013
  messagesToUse = context;
1014
+ console.info(`[Graph:ContextMgmt] Pruned | kept=${context.length} | discarded=${messagesToRefine.length} | originalCount=${messages$1.length}`);
818
1015
  // Summarize discarded messages if callback provided
819
- if (messagesToRefine && messagesToRefine.length > 0 && agentContext.summarizeCallback) {
1016
+ if (messagesToRefine.length > 0 && agentContext.summarizeCallback) {
1017
+ console.info(`[Graph:ContextMgmt] Summarizing ${messagesToRefine.length} discarded messages`);
820
1018
  try {
821
1019
  const summary = await agentContext.summarizeCallback(messagesToRefine);
822
- if (summary) {
1020
+ console.info(`[Graph:ContextMgmt] Summary received | len=${summary?.length ?? 0} | hasContent=${summary != null && summary !== ''}`);
1021
+ if (summary != null && summary !== '') {
823
1022
  const summaryMsg = new messages.SystemMessage(`[Conversation Summary]\n${summary}`);
824
1023
  // Insert after system message (if present), before conversation messages
825
1024
  const systemIdx = messagesToUse[0]?.getType() === 'system' ? 1 : 0;
@@ -828,6 +1027,7 @@ class StandardGraph extends Graph {
828
1027
  summaryMsg,
829
1028
  ...messagesToUse.slice(systemIdx),
830
1029
  ];
1030
+ console.info(`[Graph:ContextMgmt] Summary injected at index ${systemIdx} | finalMsgCount=${messagesToUse.length}`);
831
1031
  }
832
1032
  }
833
1033
  catch (err) {
@@ -926,10 +1126,10 @@ class StandardGraph extends Graph {
926
1126
  }
927
1127
  // Get model info for analytics
928
1128
  const bedrockOpts = agentContext.clientOptions;
929
- const modelId = bedrockOpts?.model ||
1129
+ const modelId = bedrockOpts?.model ??
930
1130
  agentContext.clientOptions
931
1131
  ?.modelName;
932
- const thinkingConfig = bedrockOpts?.additionalModelRequestFields?.['thinking'] ||
1132
+ const thinkingConfig = bedrockOpts?.additionalModelRequestFields?.['thinking'] ??
933
1133
  agentContext.clientOptions
934
1134
  ?.thinking;
935
1135
  // Build and emit context analytics for traces
@@ -968,7 +1168,7 @@ class StandardGraph extends Graph {
968
1168
  : '';
969
1169
  return toolName === 'task';
970
1170
  });
971
- if (hasTaskToolInContext &&
1171
+ if (hasTaskToolInContext === true &&
972
1172
  contextAnalytics$1.utilizationPercent != null &&
973
1173
  contextAnalytics$1.maxContextTokens != null) {
974
1174
  const utilization = contextAnalytics$1.utilizationPercent;
@@ -985,10 +1185,12 @@ class StandardGraph extends Graph {
985
1185
  const content = typeof msg.content === 'string'
986
1186
  ? msg.content
987
1187
  : Array.isArray(msg.content)
988
- ? msg.content.map((p) => {
1188
+ ? msg.content
1189
+ .map((p) => {
989
1190
  const part = p;
990
- return String(part.text || part.content || '');
991
- }).join(' ')
1191
+ return String(part.text ?? part.content ?? '');
1192
+ })
1193
+ .join(' ')
992
1194
  : '';
993
1195
  // Pattern 1: # "filename" headers in attached document blocks
994
1196
  const docMatches = content.match(/# "([^"]+)"/g);
@@ -1004,7 +1206,10 @@ class StandardGraph extends Graph {
1004
1206
  // Pattern 2: "The user has attached: **file1, file2**" (embedded files)
1005
1207
  const attachedMatch = content.match(/user has attached:\s*\*\*([^*]+)\*\*/i);
1006
1208
  if (attachedMatch) {
1007
- const names = attachedMatch[1].split(',').map((n) => n.trim()).filter(Boolean);
1209
+ const names = attachedMatch[1]
1210
+ .split(',')
1211
+ .map((n) => n.trim())
1212
+ .filter(Boolean);
1008
1213
  for (const name of names) {
1009
1214
  if (!documentNames.includes(name)) {
1010
1215
  documentNames.push(name);
@@ -1019,16 +1224,16 @@ class StandardGraph extends Graph {
1019
1224
  `hasTaskTool: true | messages: ${finalMessages.length} | docs: ${documentCount}`);
1020
1225
  // TRIGGER 1: Multi-document delegation (3+ documents detected)
1021
1226
  // Only inject on first iteration (no AI messages yet = agent hasn't responded)
1022
- const hasAiResponse = finalMessages.some((m) => m._getType?.() === 'ai' || m._getType?.() === 'tool');
1227
+ const hasAiResponse = finalMessages.some((m) => m._getType() === 'ai' || m._getType() === 'tool');
1023
1228
  if (documentCount >= 3 && !hasAiResponse) {
1024
1229
  const pressureMsg = new messages.HumanMessage({
1025
1230
  content: `[MULTI-DOCUMENT PROCESSING — ${documentCount} documents detected]\n` +
1026
1231
  `Documents: ${documentNames.join(', ')}\n\n` +
1027
1232
  `You have ${documentCount} documents attached. For thorough analysis, use the "task" tool ` +
1028
- `to delegate each document (or group of related documents) to a sub-agent.\n` +
1029
- `Each sub-agent has its own fresh context window and can use file_search to retrieve the full document content.\n` +
1030
- `After all sub-agents complete, synthesize their results into a comprehensive response.\n\n` +
1031
- `This approach ensures each document gets full attention without context limitations.`,
1233
+ 'to delegate each document (or group of related documents) to a sub-agent.\n' +
1234
+ 'Each sub-agent has its own fresh context window and can use file_search to retrieve the full document content.\n' +
1235
+ 'After all sub-agents complete, synthesize their results into a comprehensive response.\n\n' +
1236
+ 'This approach ensures each document gets full attention without context limitations.',
1032
1237
  });
1033
1238
  finalMessages = [...finalMessages, pressureMsg];
1034
1239
  console.info(`[Graph] Multi-document delegation hint injected for ${documentCount} documents: ` +
@@ -1036,14 +1241,15 @@ class StandardGraph extends Graph {
1036
1241
  }
1037
1242
  // TRIGGER 2: Token utilization thresholds (mid-chain safety net)
1038
1243
  // Also fires when we skipped pruning due to delegationInjectedPrePrune
1039
- if (utilization > 85 || (delegationInjectedPrePrune && utilization > 50)) {
1244
+ if (utilization > 85 ||
1245
+ (delegationInjectedPrePrune && utilization > 50)) {
1040
1246
  // CRITICAL: Context is high — MANDATE delegation
1041
1247
  const pressureMsg = new messages.HumanMessage({
1042
1248
  content: `[CONTEXT BUDGET CRITICAL — ${utilization.toFixed(0)}% used]\n` +
1043
1249
  `You have used ${totalTokens} of ${maxTokens} tokens (${remainingTokens} remaining).\n` +
1044
- `Your context is very large. You MUST use the "task" tool to delegate work to sub-agents.\n` +
1045
- `Each sub-agent runs in its own fresh context window and can use file_search to access documents.\n` +
1046
- `Do NOT attempt to process documents directly — delegate each document to a sub-agent, then synthesize results.`,
1250
+ 'Your context is very large. You MUST use the "task" tool to delegate work to sub-agents.\n' +
1251
+ 'Each sub-agent runs in its own fresh context window and can use file_search to access documents.\n' +
1252
+ 'Do NOT attempt to process documents directly — delegate each document to a sub-agent, then synthesize results.',
1047
1253
  });
1048
1254
  finalMessages = [...finalMessages, pressureMsg];
1049
1255
  console.warn(`[Graph] Context pressure CRITICAL (${utilization.toFixed(0)}%): ` +
@@ -1055,8 +1261,8 @@ class StandardGraph extends Graph {
1055
1261
  const pressureMsg = new messages.HumanMessage({
1056
1262
  content: `[CONTEXT BUDGET WARNING — ${utilization.toFixed(0)}% used]\n` +
1057
1263
  `You have used ${totalTokens} of ${maxTokens} tokens (${remainingTokens} remaining).\n` +
1058
- `Your context is filling up. Consider using the "task" tool to delegate complex operations to sub-agents.\n` +
1059
- `Sub-agents run in fresh context windows and won't consume your remaining budget.`,
1264
+ 'Your context is filling up. Consider using the "task" tool to delegate complex operations to sub-agents.\n' +
1265
+ "Sub-agents run in fresh context windows and won't consume your remaining budget.",
1060
1266
  });
1061
1267
  finalMessages = [...finalMessages, pressureMsg];
1062
1268
  console.info(`[Graph] Context pressure WARNING (${utilization.toFixed(0)}%): ` +
@@ -1095,7 +1301,7 @@ class StandardGraph extends Graph {
1095
1301
  }
1096
1302
  catch (primaryError) {
1097
1303
  // Check if this is a "input too long" error from Bedrock/Anthropic
1098
- const errorMessage = primaryError.message.toLowerCase() ?? '';
1304
+ const errorMessage = primaryError.message.toLowerCase();
1099
1305
  const isInputTooLongError = errorMessage.includes('too long') ||
1100
1306
  errorMessage.includes('input is too long') ||
1101
1307
  errorMessage.includes('context length') ||
@@ -1115,7 +1321,9 @@ class StandardGraph extends Graph {
1115
1321
  }
1116
1322
  // If input too long and we have pruning capability OR tokenCounter, retry with progressively more aggressive pruning
1117
1323
  // Note: We can create emergency pruneMessages dynamically if we have tokenCounter and maxContextTokens
1118
- const canPrune = agentContext.tokenCounter && agentContext.maxContextTokens;
1324
+ const canPrune = agentContext.tokenCounter != null &&
1325
+ agentContext.maxContextTokens != null &&
1326
+ agentContext.maxContextTokens > 0;
1119
1327
  if (isInputTooLongError && canPrune) {
1120
1328
  // Progressive reduction: 50% -> 25% -> 10% of original context
1121
1329
  const reductionLevels = [0.5, 0.25, 0.1];
@@ -1203,7 +1411,7 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
1203
1411
  console.info(`[Graph] ✅ Retry successful at ${reductionFactor * 100}% with ${reducedMessages.length} messages (reduced from ${finalMessages.length})`);
1204
1412
  }
1205
1413
  catch (retryError) {
1206
- const retryErrorMsg = retryError.message.toLowerCase() ?? '';
1414
+ const retryErrorMsg = retryError.message.toLowerCase();
1207
1415
  const stillTooLong = retryErrorMsg.includes('too long') ||
1208
1416
  retryErrorMsg.includes('context length') ||
1209
1417
  retryErrorMsg.includes('validationexception');
@@ -1252,6 +1460,101 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
1252
1460
  if (!result) {
1253
1461
  throw new Error('No result after model invocation');
1254
1462
  }
1463
+ /**
1464
+ * Fallback: populate toolCallStepIds in the graph execution context.
1465
+ *
1466
+ * When model.stream() is available (the common case), attemptInvoke
1467
+ * processes all chunks through a local ChatModelStreamHandler which
1468
+ * creates run steps and populates toolCallStepIds before returning.
1469
+ * The code below is a fallback for the rare case where model.stream
1470
+ * is unavailable and model.invoke() was used instead.
1471
+ *
1472
+ * Text content is dispatched FIRST so that MESSAGE_CREATION is the
1473
+ * current step when handleToolCalls runs. handleToolCalls then creates
1474
+ * TOOL_CALLS on top of it. The dedup in getMessageId and
1475
+ * toolCallStepIds.has makes this safe when attemptInvoke already
1476
+ * handled everything — both paths become no-ops.
1477
+ */
1478
+ const responseMessage = result.messages?.[0];
1479
+ const toolCalls = responseMessage
1480
+ ?.tool_calls;
1481
+ const hasToolCalls = Array.isArray(toolCalls) && toolCalls.length > 0;
1482
+ if (hasToolCalls) {
1483
+ const metadata = config.metadata;
1484
+ const stepKey = this.getStepKey(metadata);
1485
+ const content = responseMessage?.content;
1486
+ const hasTextContent = content != null &&
1487
+ (typeof content === 'string'
1488
+ ? content !== ''
1489
+ : Array.isArray(content) && content.length > 0);
1490
+ /**
1491
+ * Dispatch text content BEFORE creating TOOL_CALLS steps.
1492
+ * getMessageId returns a new ID only on the first call for a step key;
1493
+ * if the for-await consumer already claimed it, this is a no-op.
1494
+ */
1495
+ if (hasTextContent) {
1496
+ const messageId = ids.getMessageId(stepKey, this) ?? '';
1497
+ if (messageId) {
1498
+ await this.dispatchRunStep(stepKey, {
1499
+ type: _enum.StepTypes.MESSAGE_CREATION,
1500
+ message_creation: { message_id: messageId },
1501
+ }, metadata);
1502
+ const stepId = this.getStepIdByKey(stepKey);
1503
+ if (typeof content === 'string') {
1504
+ await this.dispatchMessageDelta(stepId, {
1505
+ content: [{ type: _enum.ContentTypes.TEXT, text: content }],
1506
+ });
1507
+ }
1508
+ else if (Array.isArray(content) &&
1509
+ content.every((c) => typeof c === 'object' &&
1510
+ 'type' in c &&
1511
+ typeof c.type === 'string' &&
1512
+ c.type.startsWith('text'))) {
1513
+ await this.dispatchMessageDelta(stepId, {
1514
+ content: content,
1515
+ });
1516
+ }
1517
+ }
1518
+ }
1519
+ await handlers.handleToolCalls(toolCalls, metadata, this);
1520
+ }
1521
+ /**
1522
+ * When streaming is disabled, on_chat_model_stream events are never
1523
+ * emitted so ChatModelStreamHandler never fires. Dispatch the text
1524
+ * content as MESSAGE_CREATION + MESSAGE_DELTA here.
1525
+ */
1526
+ const disableStreaming = agentContext.clientOptions
1527
+ ?.disableStreaming === true;
1528
+ if (disableStreaming &&
1529
+ !hasToolCalls &&
1530
+ responseMessage != null &&
1531
+ responseMessage.content != null) {
1532
+ const metadata = config.metadata;
1533
+ const stepKey = this.getStepKey(metadata);
1534
+ const messageId = ids.getMessageId(stepKey, this) ?? '';
1535
+ if (messageId) {
1536
+ await this.dispatchRunStep(stepKey, {
1537
+ type: _enum.StepTypes.MESSAGE_CREATION,
1538
+ message_creation: { message_id: messageId },
1539
+ }, metadata);
1540
+ const stepId = this.getStepIdByKey(stepKey);
1541
+ const content = responseMessage.content;
1542
+ if (typeof content === 'string') {
1543
+ await this.dispatchMessageDelta(stepId, {
1544
+ content: [{ type: _enum.ContentTypes.TEXT, text: content }],
1545
+ });
1546
+ }
1547
+ else if (Array.isArray(content) &&
1548
+ content.every((c) => typeof c === 'object' &&
1549
+ 'type' in c &&
1550
+ typeof c.type === 'string' &&
1551
+ c.type.startsWith('text'))) {
1552
+ await this.dispatchMessageDelta(stepId, {
1553
+ content: content,
1554
+ });
1555
+ }
1556
+ }
1557
+ }
1255
1558
  agentContext.currentUsage = this.getUsageMetadata(result.messages?.[0]);
1256
1559
  // Extract and normalize the LLM's finish/stop reason for auto-continuation support
1257
1560
  const finalMsg = result.messages?.[0];
@@ -1264,21 +1567,19 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
1264
1567
  meta.stop_reason ?? // Anthropic direct API
1265
1568
  meta.stopReason ?? // Bedrock invoke (non-streaming)
1266
1569
  messageStop?.stopReason ?? // Bedrock streaming
1267
- meta.finishReason ?? // VertexAI/Google
1268
- undefined;
1570
+ meta.finishReason; // VertexAI/Google
1269
1571
  }
1270
1572
  this.cleanupSignalListener();
1271
1573
  // DEFERRED STRUCTURED OUTPUT: When the agent has tools AND structured output configured,
1272
1574
  // we let the agent use tools normally via attemptInvoke(). Once the agent's response
1273
1575
  // has NO tool_calls (it's done with tools), we produce the final structured JSON response.
1274
1576
  if (agentContext.isStructuredOutputMode &&
1275
- agentContext.structuredOutput &&
1276
- result) {
1577
+ agentContext.structuredOutput != null) {
1277
1578
  const lastMessage = result.messages?.[0];
1278
- const resultHasToolCalls = lastMessage &&
1579
+ const resultHasToolCalls = lastMessage != null &&
1279
1580
  'tool_calls' in lastMessage &&
1280
1581
  (lastMessage.tool_calls?.length ?? 0) > 0;
1281
- if (!resultHasToolCalls) {
1582
+ if (resultHasToolCalls !== true) {
1282
1583
  try {
1283
1584
  // Build messages for structured output: include the full conversation
1284
1585
  // plus the agent's text response from attemptInvoke, so the structured
@@ -1360,6 +1661,10 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
1360
1661
  reducer: (a, b) => {
1361
1662
  if (!a.length) {
1362
1663
  this.startIndex = a.length + b.length;
1664
+ console.info(`[Graph:Reducer] Initial messages | startIndex=${this.startIndex} | inputMsgCount=${b.length}`);
1665
+ }
1666
+ else {
1667
+ console.debug(`[Graph:Reducer] Appending messages | existing=${a.length} | new=${b.length} | startIndex=${this.startIndex}`);
1363
1668
  }
1364
1669
  const result = langgraph.messagesStateReducer(a, b);
1365
1670
  this.messages = result;