@illuma-ai/agents 1.0.90 → 1.0.93

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (838) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +98 -49
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/common/constants.cjs +25 -0
  4. package/dist/cjs/common/constants.cjs.map +1 -0
  5. package/dist/cjs/common/enum.cjs +30 -0
  6. package/dist/cjs/common/enum.cjs.map +1 -1
  7. package/dist/cjs/events.cjs +9 -4
  8. package/dist/cjs/events.cjs.map +1 -1
  9. package/dist/cjs/graphs/Graph.cjs +397 -92
  10. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  11. package/dist/cjs/graphs/MultiAgentGraph.cjs +223 -92
  12. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  13. package/dist/cjs/instrumentation.cjs +30 -14
  14. package/dist/cjs/instrumentation.cjs.map +1 -1
  15. package/dist/cjs/llm/anthropic/index.cjs +43 -11
  16. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  17. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  18. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +10 -7
  19. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  20. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +32 -0
  21. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
  22. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
  23. package/dist/cjs/llm/bedrock/index.cjs +129 -101
  24. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  25. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +489 -0
  26. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -0
  27. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +176 -0
  28. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -0
  29. package/dist/cjs/llm/fake.cjs.map +1 -1
  30. package/dist/cjs/llm/google/index.cjs.map +1 -1
  31. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  32. package/dist/cjs/llm/openai/index.cjs +1 -1
  33. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  34. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  35. package/dist/cjs/llm/openrouter/index.cjs +59 -5
  36. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  37. package/dist/cjs/llm/providers.cjs.map +1 -1
  38. package/dist/cjs/llm/text.cjs.map +1 -1
  39. package/dist/cjs/llm/vertexai/index.cjs +80 -2
  40. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  41. package/dist/cjs/main.cjs +60 -27
  42. package/dist/cjs/main.cjs.map +1 -1
  43. package/dist/cjs/messages/cache.cjs +131 -108
  44. package/dist/cjs/messages/cache.cjs.map +1 -1
  45. package/dist/cjs/messages/content.cjs.map +1 -1
  46. package/dist/cjs/messages/core.cjs +3 -0
  47. package/dist/cjs/messages/core.cjs.map +1 -1
  48. package/dist/cjs/messages/format.cjs +265 -47
  49. package/dist/cjs/messages/format.cjs.map +1 -1
  50. package/dist/cjs/messages/ids.cjs.map +1 -1
  51. package/dist/cjs/messages/prune.cjs +55 -2
  52. package/dist/cjs/messages/prune.cjs.map +1 -1
  53. package/dist/cjs/messages/summarize.cjs +170 -0
  54. package/dist/cjs/messages/summarize.cjs.map +1 -0
  55. package/dist/cjs/messages/tools.cjs.map +1 -1
  56. package/dist/cjs/run.cjs +87 -30
  57. package/dist/cjs/run.cjs.map +1 -1
  58. package/dist/cjs/schemas/validate.cjs.map +1 -1
  59. package/dist/cjs/splitStream.cjs.map +1 -1
  60. package/dist/cjs/stream.cjs +59 -25
  61. package/dist/cjs/stream.cjs.map +1 -1
  62. package/dist/cjs/tools/AskUser.cjs +131 -0
  63. package/dist/cjs/tools/AskUser.cjs.map +1 -0
  64. package/dist/cjs/tools/BrowserTools.cjs +11 -7
  65. package/dist/cjs/tools/BrowserTools.cjs.map +1 -1
  66. package/dist/cjs/tools/Calculator.cjs.map +1 -1
  67. package/dist/cjs/tools/CodeExecutor.cjs +46 -4
  68. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  69. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +36 -53
  70. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  71. package/dist/cjs/tools/StreamingToolCallBuffer.cjs +208 -0
  72. package/dist/cjs/tools/StreamingToolCallBuffer.cjs.map +1 -0
  73. package/dist/cjs/tools/ToolNode.cjs +333 -30
  74. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  75. package/dist/cjs/tools/ToolSearch.cjs +66 -30
  76. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  77. package/dist/cjs/tools/handlers.cjs +94 -8
  78. package/dist/cjs/tools/handlers.cjs.map +1 -1
  79. package/dist/cjs/tools/schema.cjs.map +1 -1
  80. package/dist/cjs/tools/search/content.cjs.map +1 -1
  81. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  82. package/dist/cjs/tools/search/format.cjs.map +1 -1
  83. package/dist/cjs/tools/search/highlights.cjs.map +1 -1
  84. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  85. package/dist/cjs/tools/search/schema.cjs.map +1 -1
  86. package/dist/cjs/tools/search/search.cjs +1 -0
  87. package/dist/cjs/tools/search/search.cjs.map +1 -1
  88. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
  89. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  90. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  91. package/dist/cjs/types/graph.cjs +1 -1
  92. package/dist/cjs/types/graph.cjs.map +1 -1
  93. package/dist/cjs/utils/contextAnalytics.cjs +23 -6
  94. package/dist/cjs/utils/contextAnalytics.cjs.map +1 -1
  95. package/dist/cjs/utils/events.cjs.map +1 -1
  96. package/dist/cjs/utils/graph.cjs.map +1 -1
  97. package/dist/cjs/utils/handlers.cjs.map +1 -1
  98. package/dist/cjs/utils/llm.cjs.map +1 -1
  99. package/dist/cjs/utils/misc.cjs.map +1 -1
  100. package/dist/cjs/utils/run.cjs +3 -1
  101. package/dist/cjs/utils/run.cjs.map +1 -1
  102. package/dist/cjs/utils/schema.cjs.map +1 -1
  103. package/dist/cjs/utils/title.cjs.map +1 -1
  104. package/dist/cjs/utils/tokens.cjs +33 -58
  105. package/dist/cjs/utils/tokens.cjs.map +1 -1
  106. package/dist/cjs/utils/toolCallContinuation.cjs +55 -0
  107. package/dist/cjs/utils/toolCallContinuation.cjs.map +1 -0
  108. package/dist/cjs/utils/toonFormat.cjs.map +1 -1
  109. package/dist/esm/agents/AgentContext.mjs +98 -49
  110. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  111. package/dist/esm/common/constants.mjs +22 -0
  112. package/dist/esm/common/constants.mjs.map +1 -0
  113. package/dist/esm/common/enum.mjs +31 -1
  114. package/dist/esm/common/enum.mjs.map +1 -1
  115. package/dist/esm/events.mjs +9 -4
  116. package/dist/esm/events.mjs.map +1 -1
  117. package/dist/esm/graphs/Graph.mjs +393 -88
  118. package/dist/esm/graphs/Graph.mjs.map +1 -1
  119. package/dist/esm/graphs/MultiAgentGraph.mjs +224 -93
  120. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  121. package/dist/esm/instrumentation.mjs +30 -14
  122. package/dist/esm/instrumentation.mjs.map +1 -1
  123. package/dist/esm/llm/anthropic/index.mjs +43 -11
  124. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  125. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  126. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +10 -7
  127. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  128. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +32 -0
  129. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
  130. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
  131. package/dist/esm/llm/bedrock/index.mjs +128 -101
  132. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  133. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +484 -0
  134. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -0
  135. package/dist/esm/llm/bedrock/utils/message_outputs.mjs +171 -0
  136. package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -0
  137. package/dist/esm/llm/fake.mjs.map +1 -1
  138. package/dist/esm/llm/google/index.mjs.map +1 -1
  139. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  140. package/dist/esm/llm/openai/index.mjs +1 -1
  141. package/dist/esm/llm/openai/index.mjs.map +1 -1
  142. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  143. package/dist/esm/llm/openrouter/index.mjs +59 -5
  144. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  145. package/dist/esm/llm/providers.mjs.map +1 -1
  146. package/dist/esm/llm/text.mjs.map +1 -1
  147. package/dist/esm/llm/vertexai/index.mjs +80 -2
  148. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  149. package/dist/esm/main.mjs +8 -3
  150. package/dist/esm/main.mjs.map +1 -1
  151. package/dist/esm/messages/cache.mjs +131 -108
  152. package/dist/esm/messages/cache.mjs.map +1 -1
  153. package/dist/esm/messages/content.mjs.map +1 -1
  154. package/dist/esm/messages/core.mjs +4 -1
  155. package/dist/esm/messages/core.mjs.map +1 -1
  156. package/dist/esm/messages/format.mjs +267 -49
  157. package/dist/esm/messages/format.mjs.map +1 -1
  158. package/dist/esm/messages/ids.mjs.map +1 -1
  159. package/dist/esm/messages/prune.mjs +56 -4
  160. package/dist/esm/messages/prune.mjs.map +1 -1
  161. package/dist/esm/messages/summarize.mjs +161 -0
  162. package/dist/esm/messages/summarize.mjs.map +1 -0
  163. package/dist/esm/messages/tools.mjs.map +1 -1
  164. package/dist/esm/run.mjs +88 -31
  165. package/dist/esm/run.mjs.map +1 -1
  166. package/dist/esm/schemas/validate.mjs.map +1 -1
  167. package/dist/esm/splitStream.mjs.map +1 -1
  168. package/dist/esm/stream.mjs +60 -26
  169. package/dist/esm/stream.mjs.map +1 -1
  170. package/dist/esm/tools/AskUser.mjs +125 -0
  171. package/dist/esm/tools/AskUser.mjs.map +1 -0
  172. package/dist/esm/tools/BrowserTools.mjs +11 -7
  173. package/dist/esm/tools/BrowserTools.mjs.map +1 -1
  174. package/dist/esm/tools/Calculator.mjs.map +1 -1
  175. package/dist/esm/tools/CodeExecutor.mjs +46 -4
  176. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  177. package/dist/esm/tools/ProgrammaticToolCalling.mjs +37 -54
  178. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  179. package/dist/esm/tools/StreamingToolCallBuffer.mjs +206 -0
  180. package/dist/esm/tools/StreamingToolCallBuffer.mjs.map +1 -0
  181. package/dist/esm/tools/ToolNode.mjs +333 -30
  182. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  183. package/dist/esm/tools/ToolSearch.mjs +66 -30
  184. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  185. package/dist/esm/tools/handlers.mjs +95 -9
  186. package/dist/esm/tools/handlers.mjs.map +1 -1
  187. package/dist/esm/tools/schema.mjs.map +1 -1
  188. package/dist/esm/tools/search/content.mjs.map +1 -1
  189. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  190. package/dist/esm/tools/search/format.mjs.map +1 -1
  191. package/dist/esm/tools/search/highlights.mjs.map +1 -1
  192. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  193. package/dist/esm/tools/search/schema.mjs.map +1 -1
  194. package/dist/esm/tools/search/search.mjs +1 -0
  195. package/dist/esm/tools/search/search.mjs.map +1 -1
  196. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
  197. package/dist/esm/tools/search/tool.mjs.map +1 -1
  198. package/dist/esm/tools/search/utils.mjs.map +1 -1
  199. package/dist/esm/types/graph.mjs +1 -1
  200. package/dist/esm/types/graph.mjs.map +1 -1
  201. package/dist/esm/utils/contextAnalytics.mjs +23 -6
  202. package/dist/esm/utils/contextAnalytics.mjs.map +1 -1
  203. package/dist/esm/utils/events.mjs.map +1 -1
  204. package/dist/esm/utils/graph.mjs.map +1 -1
  205. package/dist/esm/utils/handlers.mjs.map +1 -1
  206. package/dist/esm/utils/llm.mjs.map +1 -1
  207. package/dist/esm/utils/misc.mjs.map +1 -1
  208. package/dist/esm/utils/run.mjs +3 -1
  209. package/dist/esm/utils/run.mjs.map +1 -1
  210. package/dist/esm/utils/schema.mjs.map +1 -1
  211. package/dist/esm/utils/title.mjs.map +1 -1
  212. package/dist/esm/utils/tokens.mjs +33 -59
  213. package/dist/esm/utils/tokens.mjs.map +1 -1
  214. package/dist/esm/utils/toolCallContinuation.mjs +52 -0
  215. package/dist/esm/utils/toolCallContinuation.mjs.map +1 -0
  216. package/dist/esm/utils/toonFormat.mjs.map +1 -1
  217. package/dist/types/agents/AgentContext.d.ts +14 -7
  218. package/dist/types/common/constants.d.ts +18 -0
  219. package/dist/types/common/enum.d.ts +28 -0
  220. package/dist/types/common/index.d.ts +1 -0
  221. package/dist/types/events.d.ts +10 -3
  222. package/dist/types/graphs/Graph.d.ts +37 -0
  223. package/dist/types/index.d.ts +4 -0
  224. package/dist/types/llm/anthropic/index.d.ts +7 -1
  225. package/dist/types/llm/anthropic/types.d.ts +5 -2
  226. package/dist/types/llm/anthropic/utils/message_outputs.d.ts +1 -1
  227. package/dist/types/llm/bedrock/index.d.ts +40 -33
  228. package/dist/types/llm/bedrock/utils/message_outputs.d.ts +1 -1
  229. package/dist/types/llm/google/index.d.ts +2 -3
  230. package/dist/types/llm/openrouter/index.d.ts +21 -1
  231. package/dist/types/llm/vertexai/index.d.ts +3 -2
  232. package/dist/types/messages/cache.d.ts +1 -1
  233. package/dist/types/messages/index.d.ts +1 -0
  234. package/dist/types/messages/prune.d.ts +2 -7
  235. package/dist/types/messages/summarize.d.ts +33 -0
  236. package/dist/types/run.d.ts +6 -0
  237. package/dist/types/tools/AskUser.d.ts +408 -0
  238. package/dist/types/tools/BrowserTools.d.ts +2 -2
  239. package/dist/types/tools/CodeExecutor.d.ts +2 -2
  240. package/dist/types/tools/StreamingToolCallBuffer.d.ts +106 -0
  241. package/dist/types/tools/ToolNode.d.ts +55 -3
  242. package/dist/types/tools/ToolSearch.d.ts +9 -5
  243. package/dist/types/tools/handlers.d.ts +2 -2
  244. package/dist/types/types/graph.d.ts +9 -2
  245. package/dist/types/types/llm.d.ts +8 -3
  246. package/dist/types/types/run.d.ts +2 -0
  247. package/dist/types/types/tools.d.ts +20 -2
  248. package/dist/types/utils/contextAnalytics.d.ts +5 -4
  249. package/dist/types/utils/index.d.ts +1 -0
  250. package/dist/types/utils/tokens.d.ts +6 -19
  251. package/dist/types/utils/toolCallContinuation.d.ts +30 -0
  252. package/package.json +15 -8
  253. package/src/agents/AgentContext.js +782 -0
  254. package/src/agents/AgentContext.js.map +1 -0
  255. package/src/agents/AgentContext.test.js +421 -0
  256. package/src/agents/AgentContext.test.js.map +1 -0
  257. package/src/agents/AgentContext.ts +132 -64
  258. package/src/agents/__tests__/AgentContext.test.js +678 -0
  259. package/src/agents/__tests__/AgentContext.test.js.map +1 -0
  260. package/src/agents/__tests__/AgentContext.test.ts +25 -4
  261. package/src/agents/__tests__/resolveStructuredOutputMode.test.js +117 -0
  262. package/src/agents/__tests__/resolveStructuredOutputMode.test.js.map +1 -0
  263. package/src/common/__tests__/enum.test.ts +135 -0
  264. package/src/common/constants.ts +21 -0
  265. package/src/common/enum.js +192 -0
  266. package/src/common/enum.js.map +1 -0
  267. package/src/common/enum.ts +30 -0
  268. package/src/common/index.js +3 -0
  269. package/src/common/index.js.map +1 -0
  270. package/src/common/index.ts +2 -1
  271. package/src/events.js +166 -0
  272. package/src/events.js.map +1 -0
  273. package/src/events.ts +11 -14
  274. package/src/graphs/Graph.js +1857 -0
  275. package/src/graphs/Graph.js.map +1 -0
  276. package/src/graphs/Graph.ts +580 -162
  277. package/src/graphs/MultiAgentGraph.js +1092 -0
  278. package/src/graphs/MultiAgentGraph.js.map +1 -0
  279. package/src/graphs/MultiAgentGraph.ts +331 -112
  280. package/src/graphs/__tests__/adaptive-thinking.test.ts +369 -0
  281. package/src/graphs/__tests__/graph-direct-tool-names.test.ts +210 -0
  282. package/src/graphs/__tests__/multi-agent-edges.test.ts +237 -0
  283. package/src/graphs/__tests__/structured-output.integration.test.js +624 -0
  284. package/src/graphs/__tests__/structured-output.integration.test.js.map +1 -0
  285. package/src/graphs/__tests__/structured-output.test.js +144 -0
  286. package/src/graphs/__tests__/structured-output.test.js.map +1 -0
  287. package/src/graphs/contextManagement.e2e.test.js +718 -0
  288. package/src/graphs/contextManagement.e2e.test.js.map +1 -0
  289. package/src/graphs/contextManagement.e2e.test.ts +990 -0
  290. package/src/graphs/contextManagement.test.js +485 -0
  291. package/src/graphs/contextManagement.test.js.map +1 -0
  292. package/src/graphs/contextManagement.test.ts +625 -0
  293. package/src/graphs/handoffValidation.test.js +276 -0
  294. package/src/graphs/handoffValidation.test.js.map +1 -0
  295. package/src/graphs/handoffValidation.test.ts +353 -0
  296. package/src/graphs/index.js +3 -0
  297. package/src/graphs/index.js.map +1 -0
  298. package/src/index.js +28 -0
  299. package/src/index.js.map +1 -0
  300. package/src/index.ts +13 -0
  301. package/src/instrumentation.js +21 -0
  302. package/src/instrumentation.js.map +1 -0
  303. package/src/instrumentation.ts +38 -17
  304. package/src/llm/anthropic/index.js +319 -0
  305. package/src/llm/anthropic/index.js.map +1 -0
  306. package/src/llm/anthropic/index.ts +68 -15
  307. package/src/llm/anthropic/llm.spec.ts +402 -0
  308. package/src/llm/anthropic/types.js +46 -0
  309. package/src/llm/anthropic/types.js.map +1 -0
  310. package/src/llm/anthropic/types.ts +8 -2
  311. package/src/llm/anthropic/utils/message_inputs.js +627 -0
  312. package/src/llm/anthropic/utils/message_inputs.js.map +1 -0
  313. package/src/llm/anthropic/utils/message_inputs.ts +16 -33
  314. package/src/llm/anthropic/utils/message_outputs.js +290 -0
  315. package/src/llm/anthropic/utils/message_outputs.js.map +1 -0
  316. package/src/llm/anthropic/utils/message_outputs.ts +40 -1
  317. package/src/llm/anthropic/utils/output_parsers.js +89 -0
  318. package/src/llm/anthropic/utils/output_parsers.js.map +1 -0
  319. package/src/llm/anthropic/utils/tools.js +25 -0
  320. package/src/llm/anthropic/utils/tools.js.map +1 -0
  321. package/src/llm/bedrock/__tests__/bedrock-caching.test.js +392 -0
  322. package/src/llm/bedrock/__tests__/bedrock-caching.test.js.map +1 -0
  323. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +24 -40
  324. package/src/llm/bedrock/index.js +303 -0
  325. package/src/llm/bedrock/index.js.map +1 -0
  326. package/src/llm/bedrock/index.ts +171 -134
  327. package/src/llm/bedrock/llm.spec.ts +395 -52
  328. package/src/llm/bedrock/types.js +2 -0
  329. package/src/llm/bedrock/types.js.map +1 -0
  330. package/src/llm/bedrock/utils/index.js +6 -0
  331. package/src/llm/bedrock/utils/index.js.map +1 -0
  332. package/src/llm/bedrock/utils/message_inputs.js +463 -0
  333. package/src/llm/bedrock/utils/message_inputs.js.map +1 -0
  334. package/src/llm/bedrock/utils/message_inputs.ts +30 -5
  335. package/src/llm/bedrock/utils/message_outputs.js +269 -0
  336. package/src/llm/bedrock/utils/message_outputs.js.map +1 -0
  337. package/src/llm/bedrock/utils/message_outputs.ts +70 -22
  338. package/src/llm/fake.js +92 -0
  339. package/src/llm/fake.js.map +1 -0
  340. package/src/llm/google/index.js +215 -0
  341. package/src/llm/google/index.js.map +1 -0
  342. package/src/llm/google/index.ts +2 -3
  343. package/src/llm/google/types.js +12 -0
  344. package/src/llm/google/types.js.map +1 -0
  345. package/src/llm/google/utils/common.js +670 -0
  346. package/src/llm/google/utils/common.js.map +1 -0
  347. package/src/llm/google/utils/tools.js +111 -0
  348. package/src/llm/google/utils/tools.js.map +1 -0
  349. package/src/llm/google/utils/zod_to_genai_parameters.js +47 -0
  350. package/src/llm/google/utils/zod_to_genai_parameters.js.map +1 -0
  351. package/src/llm/openai/index.js +1033 -0
  352. package/src/llm/openai/index.js.map +1 -0
  353. package/src/llm/openai/types.js +2 -0
  354. package/src/llm/openai/types.js.map +1 -0
  355. package/src/llm/openai/utils/index.js +756 -0
  356. package/src/llm/openai/utils/index.js.map +1 -0
  357. package/src/llm/openai/utils/isReasoningModel.test.js +79 -0
  358. package/src/llm/openai/utils/isReasoningModel.test.js.map +1 -0
  359. package/src/llm/openrouter/index.js +261 -0
  360. package/src/llm/openrouter/index.js.map +1 -0
  361. package/src/llm/openrouter/index.ts +117 -6
  362. package/src/llm/openrouter/reasoning.test.js +181 -0
  363. package/src/llm/openrouter/reasoning.test.js.map +1 -0
  364. package/src/llm/openrouter/reasoning.test.ts +207 -0
  365. package/src/llm/providers.js +36 -0
  366. package/src/llm/providers.js.map +1 -0
  367. package/src/llm/text.js +65 -0
  368. package/src/llm/text.js.map +1 -0
  369. package/src/llm/vertexai/index.js +402 -0
  370. package/src/llm/vertexai/index.js.map +1 -0
  371. package/src/llm/vertexai/index.ts +115 -5
  372. package/src/llm/vertexai/llm.spec.ts +114 -0
  373. package/src/messages/__tests__/tools.test.js +392 -0
  374. package/src/messages/__tests__/tools.test.js.map +1 -0
  375. package/src/messages/cache.js +404 -0
  376. package/src/messages/cache.js.map +1 -0
  377. package/src/messages/cache.test.js +1167 -0
  378. package/src/messages/cache.test.js.map +1 -0
  379. package/src/messages/cache.test.ts +178 -16
  380. package/src/messages/cache.ts +152 -147
  381. package/src/messages/content.js +48 -0
  382. package/src/messages/content.js.map +1 -0
  383. package/src/messages/content.test.js +314 -0
  384. package/src/messages/content.test.js.map +1 -0
  385. package/src/messages/core.js +359 -0
  386. package/src/messages/core.js.map +1 -0
  387. package/src/messages/core.ts +5 -0
  388. package/src/messages/ensureThinkingBlock.test.js +997 -0
  389. package/src/messages/ensureThinkingBlock.test.js.map +1 -0
  390. package/src/messages/ensureThinkingBlock.test.ts +751 -10
  391. package/src/messages/format.js +973 -0
  392. package/src/messages/format.js.map +1 -0
  393. package/src/messages/format.ts +334 -57
  394. package/src/messages/formatAgentMessages.test.js +2278 -0
  395. package/src/messages/formatAgentMessages.test.js.map +1 -0
  396. package/src/messages/formatAgentMessages.test.ts +1175 -1
  397. package/src/messages/formatAgentMessages.tools.test.js +362 -0
  398. package/src/messages/formatAgentMessages.tools.test.js.map +1 -0
  399. package/src/messages/formatMessage.test.js +608 -0
  400. package/src/messages/formatMessage.test.js.map +1 -0
  401. package/src/messages/ids.js +18 -0
  402. package/src/messages/ids.js.map +1 -0
  403. package/src/messages/index.js +9 -0
  404. package/src/messages/index.js.map +1 -0
  405. package/src/messages/index.ts +1 -0
  406. package/src/messages/labelContentByAgent.test.js +725 -0
  407. package/src/messages/labelContentByAgent.test.js.map +1 -0
  408. package/src/messages/prune.js +438 -0
  409. package/src/messages/prune.js.map +1 -0
  410. package/src/messages/prune.ts +87 -25
  411. package/src/messages/reducer.js +60 -0
  412. package/src/messages/reducer.js.map +1 -0
  413. package/src/messages/shiftIndexTokenCountMap.test.js +63 -0
  414. package/src/messages/shiftIndexTokenCountMap.test.js.map +1 -0
  415. package/src/messages/summarize.js +146 -0
  416. package/src/messages/summarize.js.map +1 -0
  417. package/src/messages/summarize.test.js +332 -0
  418. package/src/messages/summarize.test.js.map +1 -0
  419. package/src/messages/summarize.test.ts +466 -0
  420. package/src/messages/summarize.ts +222 -0
  421. package/src/messages/tools.js +90 -0
  422. package/src/messages/tools.js.map +1 -0
  423. package/src/mockStream.js +81 -0
  424. package/src/mockStream.js.map +1 -0
  425. package/src/prompts/collab.js +7 -0
  426. package/src/prompts/collab.js.map +1 -0
  427. package/src/prompts/index.js +3 -0
  428. package/src/prompts/index.js.map +1 -0
  429. package/src/prompts/taskmanager.js +58 -0
  430. package/src/prompts/taskmanager.js.map +1 -0
  431. package/src/run.js +427 -0
  432. package/src/run.js.map +1 -0
  433. package/src/run.ts +101 -33
  434. package/src/schemas/index.js +3 -0
  435. package/src/schemas/index.js.map +1 -0
  436. package/src/schemas/schema-preparation.test.js +370 -0
  437. package/src/schemas/schema-preparation.test.js.map +1 -0
  438. package/src/schemas/validate.js +314 -0
  439. package/src/schemas/validate.js.map +1 -0
  440. package/src/schemas/validate.test.js +264 -0
  441. package/src/schemas/validate.test.js.map +1 -0
  442. package/src/scripts/abort.js +127 -0
  443. package/src/scripts/abort.js.map +1 -0
  444. package/src/scripts/ant_web_search.js +130 -0
  445. package/src/scripts/ant_web_search.js.map +1 -0
  446. package/src/scripts/ant_web_search.ts +1 -0
  447. package/src/scripts/ant_web_search_edge_case.js +133 -0
  448. package/src/scripts/ant_web_search_edge_case.js.map +1 -0
  449. package/src/scripts/ant_web_search_edge_case.ts +1 -0
  450. package/src/scripts/ant_web_search_error_edge_case.js +119 -0
  451. package/src/scripts/ant_web_search_error_edge_case.js.map +1 -0
  452. package/src/scripts/ant_web_search_error_edge_case.ts +1 -0
  453. package/src/scripts/args.js +41 -0
  454. package/src/scripts/args.js.map +1 -0
  455. package/src/scripts/bedrock-cache-debug.js +186 -0
  456. package/src/scripts/bedrock-cache-debug.js.map +1 -0
  457. package/src/scripts/bedrock-cache-debug.ts +250 -0
  458. package/src/scripts/bedrock-content-aggregation-test.js +195 -0
  459. package/src/scripts/bedrock-content-aggregation-test.js.map +1 -0
  460. package/src/scripts/bedrock-content-aggregation-test.ts +266 -0
  461. package/src/scripts/bedrock-merge-test.js +80 -0
  462. package/src/scripts/bedrock-merge-test.js.map +1 -0
  463. package/src/scripts/bedrock-merge-test.ts +107 -0
  464. package/src/scripts/bedrock-parallel-tools-test.js +150 -0
  465. package/src/scripts/bedrock-parallel-tools-test.js.map +1 -0
  466. package/src/scripts/bedrock-parallel-tools-test.ts +204 -0
  467. package/src/scripts/caching.js +106 -0
  468. package/src/scripts/caching.js.map +1 -0
  469. package/src/scripts/caching.ts +1 -0
  470. package/src/scripts/cli.js +152 -0
  471. package/src/scripts/cli.js.map +1 -0
  472. package/src/scripts/cli2.js +119 -0
  473. package/src/scripts/cli2.js.map +1 -0
  474. package/src/scripts/cli3.js +163 -0
  475. package/src/scripts/cli3.js.map +1 -0
  476. package/src/scripts/cli4.js +165 -0
  477. package/src/scripts/cli4.js.map +1 -0
  478. package/src/scripts/cli5.js +165 -0
  479. package/src/scripts/cli5.js.map +1 -0
  480. package/src/scripts/code_exec.js +171 -0
  481. package/src/scripts/code_exec.js.map +1 -0
  482. package/src/scripts/code_exec.ts +1 -0
  483. package/src/scripts/code_exec_files.js +180 -0
  484. package/src/scripts/code_exec_files.js.map +1 -0
  485. package/src/scripts/code_exec_files.ts +1 -0
  486. package/src/scripts/code_exec_multi_session.js +185 -0
  487. package/src/scripts/code_exec_multi_session.js.map +1 -0
  488. package/src/scripts/code_exec_multi_session.ts +9 -13
  489. package/src/scripts/code_exec_ptc.js +265 -0
  490. package/src/scripts/code_exec_ptc.js.map +1 -0
  491. package/src/scripts/code_exec_ptc.ts +1 -0
  492. package/src/scripts/code_exec_session.js +217 -0
  493. package/src/scripts/code_exec_session.js.map +1 -0
  494. package/src/scripts/code_exec_session.ts +1 -0
  495. package/src/scripts/code_exec_simple.js +120 -0
  496. package/src/scripts/code_exec_simple.js.map +1 -0
  497. package/src/scripts/code_exec_simple.ts +1 -0
  498. package/src/scripts/content.js +111 -0
  499. package/src/scripts/content.js.map +1 -0
  500. package/src/scripts/content.ts +1 -0
  501. package/src/scripts/empty_input.js +125 -0
  502. package/src/scripts/empty_input.js.map +1 -0
  503. package/src/scripts/handoff-test.js +96 -0
  504. package/src/scripts/handoff-test.js.map +1 -0
  505. package/src/scripts/image.js +138 -0
  506. package/src/scripts/image.js.map +1 -0
  507. package/src/scripts/image.ts +3 -1
  508. package/src/scripts/memory.js +83 -0
  509. package/src/scripts/memory.js.map +1 -0
  510. package/src/scripts/memory.ts +16 -6
  511. package/src/scripts/multi-agent-chain.js +271 -0
  512. package/src/scripts/multi-agent-chain.js.map +1 -0
  513. package/src/scripts/multi-agent-chain.ts +1 -0
  514. package/src/scripts/multi-agent-conditional.js +185 -0
  515. package/src/scripts/multi-agent-conditional.js.map +1 -0
  516. package/src/scripts/multi-agent-conditional.ts +1 -0
  517. package/src/scripts/multi-agent-document-review-chain.js +171 -0
  518. package/src/scripts/multi-agent-document-review-chain.js.map +1 -0
  519. package/src/scripts/multi-agent-document-review-chain.ts +1 -0
  520. package/src/scripts/multi-agent-hybrid-flow.js +264 -0
  521. package/src/scripts/multi-agent-hybrid-flow.js.map +1 -0
  522. package/src/scripts/multi-agent-hybrid-flow.ts +1 -0
  523. package/src/scripts/multi-agent-parallel-start.js +214 -0
  524. package/src/scripts/multi-agent-parallel-start.js.map +1 -0
  525. package/src/scripts/multi-agent-parallel-start.ts +4 -4
  526. package/src/scripts/multi-agent-parallel.js +346 -0
  527. package/src/scripts/multi-agent-parallel.js.map +1 -0
  528. package/src/scripts/multi-agent-parallel.ts +1 -0
  529. package/src/scripts/multi-agent-sequence.js +184 -0
  530. package/src/scripts/multi-agent-sequence.js.map +1 -0
  531. package/src/scripts/multi-agent-sequence.ts +4 -4
  532. package/src/scripts/multi-agent-supervisor.js +324 -0
  533. package/src/scripts/multi-agent-supervisor.js.map +1 -0
  534. package/src/scripts/multi-agent-supervisor.ts +1 -0
  535. package/src/scripts/multi-agent-test.js +147 -0
  536. package/src/scripts/multi-agent-test.js.map +1 -0
  537. package/src/scripts/multi-agent-test.ts +1 -0
  538. package/src/scripts/parallel-asymmetric-tools-test.js +202 -0
  539. package/src/scripts/parallel-asymmetric-tools-test.js.map +1 -0
  540. package/src/scripts/parallel-asymmetric-tools-test.ts +1 -0
  541. package/src/scripts/parallel-full-metadata-test.js +176 -0
  542. package/src/scripts/parallel-full-metadata-test.js.map +1 -0
  543. package/src/scripts/parallel-full-metadata-test.ts +1 -0
  544. package/src/scripts/parallel-tools-test.js +256 -0
  545. package/src/scripts/parallel-tools-test.js.map +1 -0
  546. package/src/scripts/parallel-tools-test.ts +1 -0
  547. package/src/scripts/poc-multi-agent-comprehensive.ts +1222 -0
  548. package/src/scripts/programmatic_exec.js +277 -0
  549. package/src/scripts/programmatic_exec.js.map +1 -0
  550. package/src/scripts/programmatic_exec_agent.js +168 -0
  551. package/src/scripts/programmatic_exec_agent.js.map +1 -0
  552. package/src/scripts/programmatic_exec_agent.ts +1 -0
  553. package/src/scripts/search.js +118 -0
  554. package/src/scripts/search.js.map +1 -0
  555. package/src/scripts/search.ts +1 -0
  556. package/src/scripts/sequential-full-metadata-test.js +143 -0
  557. package/src/scripts/sequential-full-metadata-test.js.map +1 -0
  558. package/src/scripts/sequential-full-metadata-test.ts +1 -0
  559. package/src/scripts/simple.js +174 -0
  560. package/src/scripts/simple.js.map +1 -0
  561. package/src/scripts/simple.ts +2 -1
  562. package/src/scripts/single-agent-metadata-test.js +152 -0
  563. package/src/scripts/single-agent-metadata-test.js.map +1 -0
  564. package/src/scripts/single-agent-metadata-test.ts +4 -6
  565. package/src/scripts/stream.js +113 -0
  566. package/src/scripts/stream.js.map +1 -0
  567. package/src/scripts/stream.ts +1 -0
  568. package/src/scripts/test-custom-prompt-key.js +132 -0
  569. package/src/scripts/test-custom-prompt-key.js.map +1 -0
  570. package/src/scripts/test-handoff-input.js +143 -0
  571. package/src/scripts/test-handoff-input.js.map +1 -0
  572. package/src/scripts/test-handoff-preamble.js +227 -0
  573. package/src/scripts/test-handoff-preamble.js.map +1 -0
  574. package/src/scripts/test-handoff-preamble.ts +1 -0
  575. package/src/scripts/test-handoff-steering.js +353 -0
  576. package/src/scripts/test-handoff-steering.js.map +1 -0
  577. package/src/scripts/test-handoff-steering.ts +430 -0
  578. package/src/scripts/test-multi-agent-list-handoff.js +318 -0
  579. package/src/scripts/test-multi-agent-list-handoff.js.map +1 -0
  580. package/src/scripts/test-multi-agent-list-handoff.ts +1 -0
  581. package/src/scripts/test-parallel-agent-labeling.js +253 -0
  582. package/src/scripts/test-parallel-agent-labeling.js.map +1 -0
  583. package/src/scripts/test-parallel-agent-labeling.ts +2 -0
  584. package/src/scripts/test-parallel-handoffs.js +229 -0
  585. package/src/scripts/test-parallel-handoffs.js.map +1 -0
  586. package/src/scripts/test-parallel-handoffs.ts +1 -0
  587. package/src/scripts/test-thinking-handoff-bedrock.js +132 -0
  588. package/src/scripts/test-thinking-handoff-bedrock.js.map +1 -0
  589. package/src/scripts/test-thinking-handoff-bedrock.ts +1 -0
  590. package/src/scripts/test-thinking-handoff.js +132 -0
  591. package/src/scripts/test-thinking-handoff.js.map +1 -0
  592. package/src/scripts/test-thinking-handoff.ts +1 -0
  593. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js +140 -0
  594. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js.map +1 -0
  595. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +166 -0
  596. package/src/scripts/test-tool-before-handoff-role-order.js +223 -0
  597. package/src/scripts/test-tool-before-handoff-role-order.js.map +1 -0
  598. package/src/scripts/test-tool-before-handoff-role-order.ts +276 -0
  599. package/src/scripts/test-tools-before-handoff.js +187 -0
  600. package/src/scripts/test-tools-before-handoff.js.map +1 -0
  601. package/src/scripts/test-tools-before-handoff.ts +4 -8
  602. package/src/scripts/test_code_api.js +263 -0
  603. package/src/scripts/test_code_api.js.map +1 -0
  604. package/src/scripts/thinking-bedrock.js +128 -0
  605. package/src/scripts/thinking-bedrock.js.map +1 -0
  606. package/src/scripts/thinking-bedrock.ts +1 -0
  607. package/src/scripts/thinking-vertexai.js +130 -0
  608. package/src/scripts/thinking-vertexai.js.map +1 -0
  609. package/src/scripts/thinking-vertexai.ts +168 -0
  610. package/src/scripts/thinking.js +134 -0
  611. package/src/scripts/thinking.js.map +1 -0
  612. package/src/scripts/thinking.ts +1 -0
  613. package/src/scripts/tool_search.js +114 -0
  614. package/src/scripts/tool_search.js.map +1 -0
  615. package/src/scripts/tools.js +125 -0
  616. package/src/scripts/tools.js.map +1 -0
  617. package/src/scripts/tools.ts +5 -19
  618. package/src/specs/agent-handoffs-bedrock.integration.test.js +280 -0
  619. package/src/specs/agent-handoffs-bedrock.integration.test.js.map +1 -0
  620. package/src/specs/agent-handoffs-bedrock.integration.test.ts +412 -375
  621. package/src/specs/agent-handoffs.test.js +924 -0
  622. package/src/specs/agent-handoffs.test.js.map +1 -0
  623. package/src/specs/agent-handoffs.test.ts +152 -39
  624. package/src/specs/anthropic.simple.test.js +287 -0
  625. package/src/specs/anthropic.simple.test.js.map +1 -0
  626. package/src/specs/anthropic.simple.test.ts +7 -4
  627. package/src/specs/azure.simple.test.js +381 -0
  628. package/src/specs/azure.simple.test.js.map +1 -0
  629. package/src/specs/azure.simple.test.ts +143 -5
  630. package/src/specs/cache.simple.test.js +282 -0
  631. package/src/specs/cache.simple.test.js.map +1 -0
  632. package/src/specs/cache.simple.test.ts +9 -2
  633. package/src/specs/custom-event-await.test.js +148 -0
  634. package/src/specs/custom-event-await.test.js.map +1 -0
  635. package/src/specs/custom-event-await.test.ts +215 -0
  636. package/src/specs/deepseek.simple.test.js +189 -0
  637. package/src/specs/deepseek.simple.test.js.map +1 -0
  638. package/src/specs/deepseek.simple.test.ts +4 -2
  639. package/src/specs/emergency-prune.test.js +308 -0
  640. package/src/specs/emergency-prune.test.js.map +1 -0
  641. package/src/specs/moonshot.simple.test.js +237 -0
  642. package/src/specs/moonshot.simple.test.js.map +1 -0
  643. package/src/specs/moonshot.simple.test.ts +6 -2
  644. package/src/specs/observability.integration.test.js +1337 -0
  645. package/src/specs/observability.integration.test.js.map +1 -0
  646. package/src/specs/observability.integration.test.ts +2223 -0
  647. package/src/specs/openai.simple.test.js +233 -0
  648. package/src/specs/openai.simple.test.js.map +1 -0
  649. package/src/specs/openai.simple.test.ts +4 -2
  650. package/src/specs/openrouter.simple.test.js +202 -0
  651. package/src/specs/openrouter.simple.test.js.map +1 -0
  652. package/src/specs/openrouter.simple.test.ts +165 -4
  653. package/src/specs/prune.test.js +733 -0
  654. package/src/specs/prune.test.js.map +1 -0
  655. package/src/specs/prune.test.ts +1 -0
  656. package/src/specs/reasoning.test.js +144 -0
  657. package/src/specs/reasoning.test.js.map +1 -0
  658. package/src/specs/reasoning.test.ts +2 -2
  659. package/src/specs/spec.utils.js +4 -0
  660. package/src/specs/spec.utils.js.map +1 -0
  661. package/src/specs/thinking-handoff.test.js +486 -0
  662. package/src/specs/thinking-handoff.test.js.map +1 -0
  663. package/src/specs/thinking-handoff.test.ts +3 -2
  664. package/src/specs/thinking-prune.test.js +600 -0
  665. package/src/specs/thinking-prune.test.js.map +1 -0
  666. package/src/specs/token-distribution-edge-case.test.js +246 -0
  667. package/src/specs/token-distribution-edge-case.test.js.map +1 -0
  668. package/src/specs/token-memoization.test.js +32 -0
  669. package/src/specs/token-memoization.test.js.map +1 -0
  670. package/src/specs/token-memoization.test.ts +14 -5
  671. package/src/specs/tokens.test.js +49 -0
  672. package/src/specs/tokens.test.js.map +1 -0
  673. package/src/specs/tokens.test.ts +64 -0
  674. package/src/specs/tool-error.test.js +139 -0
  675. package/src/specs/tool-error.test.js.map +1 -0
  676. package/src/specs/tool-error.test.ts +2 -2
  677. package/src/splitStream.js +204 -0
  678. package/src/splitStream.js.map +1 -0
  679. package/src/splitStream.test.js +504 -0
  680. package/src/splitStream.test.js.map +1 -0
  681. package/src/stream.js +650 -0
  682. package/src/stream.js.map +1 -0
  683. package/src/stream.test.js +225 -0
  684. package/src/stream.test.js.map +1 -0
  685. package/src/stream.test.ts +25 -15
  686. package/src/stream.ts +82 -32
  687. package/src/test/mockTools.js +340 -0
  688. package/src/test/mockTools.js.map +1 -0
  689. package/src/tools/AskUser.ts +159 -0
  690. package/src/tools/BrowserTools.js +245 -0
  691. package/src/tools/BrowserTools.js.map +1 -0
  692. package/src/tools/BrowserTools.ts +12 -8
  693. package/src/tools/Calculator.js +38 -0
  694. package/src/tools/Calculator.js.map +1 -0
  695. package/src/tools/Calculator.test.js +225 -0
  696. package/src/tools/Calculator.test.js.map +1 -0
  697. package/src/tools/CodeExecutor.js +233 -0
  698. package/src/tools/CodeExecutor.js.map +1 -0
  699. package/src/tools/CodeExecutor.selfhealing.test.ts +435 -0
  700. package/src/tools/CodeExecutor.ts +62 -4
  701. package/src/tools/ProgrammaticToolCalling.js +602 -0
  702. package/src/tools/ProgrammaticToolCalling.js.map +1 -0
  703. package/src/tools/ProgrammaticToolCalling.ts +40 -52
  704. package/src/tools/StreamingToolCallBuffer.js +179 -0
  705. package/src/tools/StreamingToolCallBuffer.js.map +1 -0
  706. package/src/tools/StreamingToolCallBuffer.ts +218 -0
  707. package/src/tools/ToolNode.js +930 -0
  708. package/src/tools/ToolNode.js.map +1 -0
  709. package/src/tools/ToolNode.ts +454 -41
  710. package/src/tools/ToolSearch.js +904 -0
  711. package/src/tools/ToolSearch.js.map +1 -0
  712. package/src/tools/ToolSearch.ts +84 -33
  713. package/src/tools/__tests__/AskUser.test.ts +537 -0
  714. package/src/tools/__tests__/BrowserTools.test.js +306 -0
  715. package/src/tools/__tests__/BrowserTools.test.js.map +1 -0
  716. package/src/tools/__tests__/BrowserTools.test.ts +131 -6
  717. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js +276 -0
  718. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js.map +1 -0
  719. package/src/tools/__tests__/ProgrammaticToolCalling.test.js +807 -0
  720. package/src/tools/__tests__/ProgrammaticToolCalling.test.js.map +1 -0
  721. package/src/tools/__tests__/StreamingToolCallBuffer.test.js +175 -0
  722. package/src/tools/__tests__/StreamingToolCallBuffer.test.js.map +1 -0
  723. package/src/tools/__tests__/StreamingToolCallBuffer.test.ts +263 -0
  724. package/src/tools/__tests__/ToolApproval.test.js +675 -0
  725. package/src/tools/__tests__/ToolApproval.test.js.map +1 -0
  726. package/src/tools/__tests__/ToolApproval.test.ts +194 -20
  727. package/src/tools/__tests__/ToolNode.hitl.test.ts +267 -0
  728. package/src/tools/__tests__/ToolNode.recovery.test.js +200 -0
  729. package/src/tools/__tests__/ToolNode.recovery.test.js.map +1 -0
  730. package/src/tools/__tests__/ToolNode.recovery.test.ts +276 -0
  731. package/src/tools/__tests__/ToolNode.session.test.js +319 -0
  732. package/src/tools/__tests__/ToolNode.session.test.js.map +1 -0
  733. package/src/tools/__tests__/ToolNode.session.test.ts +465 -0
  734. package/src/tools/__tests__/ToolSearch.integration.test.js +125 -0
  735. package/src/tools/__tests__/ToolSearch.integration.test.js.map +1 -0
  736. package/src/tools/__tests__/ToolSearch.test.js +812 -0
  737. package/src/tools/__tests__/ToolSearch.test.js.map +1 -0
  738. package/src/tools/__tests__/ToolSearch.test.ts +78 -5
  739. package/src/tools/__tests__/handlers.test.js +799 -0
  740. package/src/tools/__tests__/handlers.test.js.map +1 -0
  741. package/src/tools/__tests__/handlers.test.ts +1100 -0
  742. package/src/tools/__tests__/truncation-recovery.integration.test.js +362 -0
  743. package/src/tools/__tests__/truncation-recovery.integration.test.js.map +1 -0
  744. package/src/tools/__tests__/truncation-recovery.integration.test.ts +560 -0
  745. package/src/tools/handlers.js +306 -0
  746. package/src/tools/handlers.js.map +1 -0
  747. package/src/tools/handlers.ts +119 -16
  748. package/src/tools/schema.js +25 -0
  749. package/src/tools/schema.js.map +1 -0
  750. package/src/tools/search/anthropic.js +34 -0
  751. package/src/tools/search/anthropic.js.map +1 -0
  752. package/src/tools/search/content.js +116 -0
  753. package/src/tools/search/content.js.map +1 -0
  754. package/src/tools/search/content.test.js +133 -0
  755. package/src/tools/search/content.test.js.map +1 -0
  756. package/src/tools/search/firecrawl.js +173 -0
  757. package/src/tools/search/firecrawl.js.map +1 -0
  758. package/src/tools/search/format.js +198 -0
  759. package/src/tools/search/format.js.map +1 -0
  760. package/src/tools/search/highlights.js +241 -0
  761. package/src/tools/search/highlights.js.map +1 -0
  762. package/src/tools/search/index.js +3 -0
  763. package/src/tools/search/index.js.map +1 -0
  764. package/src/tools/search/jina-reranker.test.js +106 -0
  765. package/src/tools/search/jina-reranker.test.js.map +1 -0
  766. package/src/tools/search/rerankers.js +165 -0
  767. package/src/tools/search/rerankers.js.map +1 -0
  768. package/src/tools/search/schema.js +102 -0
  769. package/src/tools/search/schema.js.map +1 -0
  770. package/src/tools/search/search.js +561 -0
  771. package/src/tools/search/search.js.map +1 -0
  772. package/src/tools/search/serper-scraper.js +126 -0
  773. package/src/tools/search/serper-scraper.js.map +1 -0
  774. package/src/tools/search/test.js +129 -0
  775. package/src/tools/search/test.js.map +1 -0
  776. package/src/tools/search/tool.js +453 -0
  777. package/src/tools/search/tool.js.map +1 -0
  778. package/src/tools/search/types.js +2 -0
  779. package/src/tools/search/types.js.map +1 -0
  780. package/src/tools/search/utils.js +59 -0
  781. package/src/tools/search/utils.js.map +1 -0
  782. package/src/types/graph.js +24 -0
  783. package/src/types/graph.js.map +1 -0
  784. package/src/types/graph.test.js +192 -0
  785. package/src/types/graph.test.js.map +1 -0
  786. package/src/types/graph.ts +26 -6
  787. package/src/types/index.js +7 -0
  788. package/src/types/index.js.map +1 -0
  789. package/src/types/llm.js +2 -0
  790. package/src/types/llm.js.map +1 -0
  791. package/src/types/llm.ts +8 -3
  792. package/src/types/messages.js +2 -0
  793. package/src/types/messages.js.map +1 -0
  794. package/src/types/run.js +2 -0
  795. package/src/types/run.js.map +1 -0
  796. package/src/types/run.ts +2 -0
  797. package/src/types/stream.js +2 -0
  798. package/src/types/stream.js.map +1 -0
  799. package/src/types/tools.js +2 -0
  800. package/src/types/tools.js.map +1 -0
  801. package/src/types/tools.ts +21 -2
  802. package/src/utils/contextAnalytics.js +79 -0
  803. package/src/utils/contextAnalytics.js.map +1 -0
  804. package/src/utils/contextAnalytics.test.js +166 -0
  805. package/src/utils/contextAnalytics.test.js.map +1 -0
  806. package/src/utils/contextAnalytics.test.ts +222 -0
  807. package/src/utils/contextAnalytics.ts +27 -9
  808. package/src/utils/events.js +26 -0
  809. package/src/utils/events.js.map +1 -0
  810. package/src/utils/graph.js +11 -0
  811. package/src/utils/graph.js.map +1 -0
  812. package/src/utils/handlers.js +65 -0
  813. package/src/utils/handlers.js.map +1 -0
  814. package/src/utils/index.js +10 -0
  815. package/src/utils/index.js.map +1 -0
  816. package/src/utils/index.ts +1 -0
  817. package/src/utils/llm.js +21 -0
  818. package/src/utils/llm.js.map +1 -0
  819. package/src/utils/llmConfig.js +205 -0
  820. package/src/utils/llmConfig.js.map +1 -0
  821. package/src/utils/llmConfig.ts +5 -5
  822. package/src/utils/logging.js +37 -0
  823. package/src/utils/logging.js.map +1 -0
  824. package/src/utils/misc.js +51 -0
  825. package/src/utils/misc.js.map +1 -0
  826. package/src/utils/run.js +69 -0
  827. package/src/utils/run.js.map +1 -0
  828. package/src/utils/run.ts +108 -106
  829. package/src/utils/schema.js +21 -0
  830. package/src/utils/schema.js.map +1 -0
  831. package/src/utils/title.js +119 -0
  832. package/src/utils/title.js.map +1 -0
  833. package/src/utils/tokens.js +92 -0
  834. package/src/utils/tokens.js.map +1 -0
  835. package/src/utils/tokens.ts +118 -142
  836. package/src/utils/toolCallContinuation.ts +55 -0
  837. package/src/utils/toonFormat.js +379 -0
  838. package/src/utils/toonFormat.js.map +1 -0
@@ -767,7 +767,7 @@ describe('formatAgentMessages', () => {
767
767
  expect(result.messages[1].content).toHaveLength(2);
768
768
  });
769
769
 
770
- it('should skip THINK type content parts', () => {
770
+ it('should strip THINK content and join TEXT parts as string', () => {
771
771
  const payload = [
772
772
  {
773
773
  role: 'assistant',
@@ -829,6 +829,190 @@ describe('formatAgentMessages', () => {
829
829
  );
830
830
  });
831
831
 
832
+ it('should strip reasoning_content blocks and join TEXT parts as string', () => {
833
+ const payload = [
834
+ {
835
+ role: 'assistant',
836
+ content: [
837
+ { type: ContentTypes.TEXT, [ContentTypes.TEXT]: '\n\n' },
838
+ {
839
+ type: ContentTypes.REASONING_CONTENT,
840
+ reasoningText: { text: 'Thinking deeply...', signature: 'sig123' },
841
+ index: 0,
842
+ },
843
+ { type: ContentTypes.TEXT, [ContentTypes.TEXT]: 'The answer is 42.' },
844
+ ],
845
+ },
846
+ ];
847
+
848
+ const result = formatAgentMessages(payload);
849
+
850
+ expect(result.messages).toHaveLength(1);
851
+ expect(result.messages[0]).toBeInstanceOf(AIMessage);
852
+ expect(result.messages[0].content).toBe('The answer is 42.');
853
+ expect(JSON.stringify(result.messages[0].content)).not.toContain(
854
+ 'reasoning_content'
855
+ );
856
+ });
857
+
858
+ it('should strip thinking blocks and join TEXT parts as string', () => {
859
+ const payload = [
860
+ {
861
+ role: 'assistant',
862
+ content: [
863
+ {
864
+ type: ContentTypes.THINKING,
865
+ thinking: 'Internal reasoning...',
866
+ signature: 'sig456',
867
+ },
868
+ {
869
+ type: ContentTypes.TEXT,
870
+ [ContentTypes.TEXT]: 'Here is my answer.',
871
+ },
872
+ ],
873
+ },
874
+ ];
875
+
876
+ const result = formatAgentMessages(payload);
877
+
878
+ expect(result.messages).toHaveLength(1);
879
+ expect(result.messages[0]).toBeInstanceOf(AIMessage);
880
+ expect(result.messages[0].content).toBe('Here is my answer.');
881
+ expect(JSON.stringify(result.messages[0].content)).not.toContain(
882
+ 'thinking'
883
+ );
884
+ });
885
+
886
+ it('should strip redacted_thinking blocks and join TEXT parts as string', () => {
887
+ const payload = [
888
+ {
889
+ role: 'assistant',
890
+ content: [
891
+ { type: 'redacted_thinking', data: 'REDACTED_SIGNATURE' },
892
+ {
893
+ type: ContentTypes.TEXT,
894
+ [ContentTypes.TEXT]: 'Here is my answer.',
895
+ },
896
+ ],
897
+ },
898
+ ];
899
+
900
+ const result = formatAgentMessages(payload);
901
+
902
+ expect(result.messages).toHaveLength(1);
903
+ expect(result.messages[0]).toBeInstanceOf(AIMessage);
904
+ expect(result.messages[0].content).toBe('Here is my answer.');
905
+ expect(JSON.stringify(result.messages[0].content)).not.toContain(
906
+ 'redacted_thinking'
907
+ );
908
+ });
909
+
910
+ it('should produce no AIMessage when only reasoning_content and whitespace text are present', () => {
911
+ const payload = [
912
+ {
913
+ role: 'assistant',
914
+ content: [
915
+ { type: ContentTypes.TEXT, [ContentTypes.TEXT]: '\n\n' },
916
+ {
917
+ type: ContentTypes.REASONING_CONTENT,
918
+ reasoningText: { text: 'Silent reasoning', signature: 'sig' },
919
+ },
920
+ ],
921
+ },
922
+ ];
923
+
924
+ const result = formatAgentMessages(payload);
925
+
926
+ expect(result.messages).toHaveLength(0);
927
+ });
928
+
929
+ it('should drop whitespace-only text parts from non-reasoning messages', () => {
930
+ const payload = [
931
+ {
932
+ role: 'assistant',
933
+ content: [
934
+ { type: ContentTypes.TEXT, [ContentTypes.TEXT]: '\n\n' },
935
+ {
936
+ type: ContentTypes.TEXT,
937
+ [ContentTypes.TEXT]: 'Actual content here.',
938
+ },
939
+ { type: ContentTypes.TEXT, [ContentTypes.TEXT]: ' ' },
940
+ ],
941
+ },
942
+ ];
943
+
944
+ const result = formatAgentMessages(payload);
945
+
946
+ expect(result.messages).toHaveLength(1);
947
+ expect(result.messages[0]).toBeInstanceOf(AIMessage);
948
+ const content = result.messages[0].content;
949
+ expect(Array.isArray(content)).toBe(true);
950
+ expect(
951
+ (content as { type: string; text?: string }[]).every(
952
+ (p) => (p.text ?? '').trim() !== ''
953
+ )
954
+ ).toBe(true);
955
+ });
956
+
957
+ it('should preserve whitespace-only text that has tool_call_ids (common Bedrock pattern)', () => {
958
+ const payload = [
959
+ {
960
+ role: 'assistant',
961
+ content: [
962
+ {
963
+ type: ContentTypes.TEXT,
964
+ [ContentTypes.TEXT]: '\n\n',
965
+ tool_call_ids: ['tc-1'],
966
+ },
967
+ {
968
+ type: ContentTypes.TOOL_CALL,
969
+ tool_call: {
970
+ id: 'tc-1',
971
+ name: 'search',
972
+ args: '{"query":"test"}',
973
+ output: 'Results here',
974
+ },
975
+ },
976
+ ],
977
+ },
978
+ ];
979
+
980
+ const result = formatAgentMessages(payload);
981
+
982
+ expect(result.messages).toHaveLength(2);
983
+ expect(result.messages[0]).toBeInstanceOf(AIMessage);
984
+ expect(result.messages[1]).toBeInstanceOf(ToolMessage);
985
+ expect((result.messages[0] as AIMessage).tool_calls).toHaveLength(1);
986
+ expect((result.messages[1] as ToolMessage).tool_call_id).toBe('tc-1');
987
+ });
988
+
989
+ it('should handle whitespace-only text without tool_call_ids before a tool call', () => {
990
+ const payload = [
991
+ {
992
+ role: 'assistant',
993
+ content: [
994
+ { type: ContentTypes.TEXT, [ContentTypes.TEXT]: '\n\n' },
995
+ {
996
+ type: ContentTypes.TOOL_CALL,
997
+ tool_call: {
998
+ id: 'tc-2',
999
+ name: 'search',
1000
+ args: '{"query":"test"}',
1001
+ output: 'Results here',
1002
+ },
1003
+ },
1004
+ ],
1005
+ },
1006
+ ];
1007
+
1008
+ const result = formatAgentMessages(payload);
1009
+
1010
+ expect(result.messages).toHaveLength(2);
1011
+ expect(result.messages[0]).toBeInstanceOf(AIMessage);
1012
+ expect(result.messages[1]).toBeInstanceOf(ToolMessage);
1013
+ expect((result.messages[0] as AIMessage).tool_calls).toHaveLength(1);
1014
+ });
1015
+
832
1016
  it('should exclude ERROR type content parts', () => {
833
1017
  const payload = [
834
1018
  {
@@ -1510,4 +1694,994 @@ describe('formatAgentMessages', () => {
1510
1694
  expect(result.messages[1].name).toBe('search');
1511
1695
  expect(result.messages[1].content).toBe('');
1512
1696
  });
1697
+
1698
+ describe('proportional token distribution', () => {
1699
+ it('should distribute tokens proportionally based on content length', () => {
1700
+ const payload = [
1701
+ {
1702
+ role: 'assistant',
1703
+ content: [
1704
+ {
1705
+ type: ContentTypes.TEXT,
1706
+ [ContentTypes.TEXT]: 'Short text',
1707
+ tool_call_ids: ['tool_1'],
1708
+ },
1709
+ {
1710
+ type: ContentTypes.TOOL_CALL,
1711
+ tool_call: {
1712
+ id: 'tool_1',
1713
+ name: 'search',
1714
+ args: '{"query":"test"}',
1715
+ output:
1716
+ 'A much longer tool result that contains significantly more content than the original message text',
1717
+ },
1718
+ },
1719
+ ],
1720
+ },
1721
+ ];
1722
+
1723
+ const indexTokenCountMap = { 0: 100 };
1724
+ const result = formatAgentMessages(payload, indexTokenCountMap);
1725
+
1726
+ expect(result.messages).toHaveLength(2);
1727
+ const aiTokens = result.indexTokenCountMap?.[0] ?? 0;
1728
+ const toolTokens = result.indexTokenCountMap?.[1] ?? 0;
1729
+ expect(aiTokens + toolTokens).toBe(100);
1730
+ expect(toolTokens).toBeGreaterThan(aiTokens);
1731
+ });
1732
+
1733
+ it('should give the vast majority of tokens to a large tool result vs tiny AI message', () => {
1734
+ const bigOutput = 'x'.repeat(10000);
1735
+ const payload = [
1736
+ {
1737
+ role: 'assistant',
1738
+ content: [
1739
+ {
1740
+ type: ContentTypes.TEXT,
1741
+ [ContentTypes.TEXT]: 'ok',
1742
+ tool_call_ids: ['tool_1'],
1743
+ },
1744
+ {
1745
+ type: ContentTypes.TOOL_CALL,
1746
+ tool_call: {
1747
+ id: 'tool_1',
1748
+ name: 'snapshot',
1749
+ args: '{}',
1750
+ output: bigOutput,
1751
+ },
1752
+ },
1753
+ ],
1754
+ },
1755
+ ];
1756
+
1757
+ const indexTokenCountMap = { 0: 5000 };
1758
+ const result = formatAgentMessages(payload, indexTokenCountMap);
1759
+
1760
+ expect(result.messages).toHaveLength(2);
1761
+ const aiTokens = result.indexTokenCountMap?.[0] ?? 0;
1762
+ const toolTokens = result.indexTokenCountMap?.[1] ?? 0;
1763
+ expect(aiTokens + toolTokens).toBe(5000);
1764
+ expect(toolTokens).toBeGreaterThan(4900);
1765
+ expect(aiTokens).toBeLessThan(100);
1766
+ });
1767
+
1768
+ it('should fall back to even distribution when all content lengths are zero', () => {
1769
+ const payload = [
1770
+ {
1771
+ role: 'assistant',
1772
+ content: [
1773
+ {
1774
+ type: ContentTypes.TEXT,
1775
+ [ContentTypes.TEXT]: '',
1776
+ tool_call_ids: ['tool_1'],
1777
+ },
1778
+ {
1779
+ type: ContentTypes.TOOL_CALL,
1780
+ tool_call: {
1781
+ id: 'tool_1',
1782
+ name: 'noop',
1783
+ args: '{}',
1784
+ output: '',
1785
+ },
1786
+ },
1787
+ ],
1788
+ },
1789
+ ];
1790
+
1791
+ const indexTokenCountMap = { 0: 20 };
1792
+ const result = formatAgentMessages(payload, indexTokenCountMap);
1793
+
1794
+ expect(result.messages).toHaveLength(2);
1795
+ const aiTokens = result.indexTokenCountMap?.[0] ?? 0;
1796
+ const toolTokens = result.indexTokenCountMap?.[1] ?? 0;
1797
+ expect(aiTokens + toolTokens).toBe(20);
1798
+ expect(aiTokens).toBeGreaterThanOrEqual(0);
1799
+ expect(toolTokens).toBeGreaterThanOrEqual(0);
1800
+ });
1801
+
1802
+ it('should handle odd token counts without losing remainder', () => {
1803
+ const payload = [
1804
+ {
1805
+ role: 'assistant',
1806
+ content: [
1807
+ {
1808
+ type: ContentTypes.TEXT,
1809
+ [ContentTypes.TEXT]: 'abc',
1810
+ tool_call_ids: ['tool_1', 'tool_2', 'tool_3'],
1811
+ },
1812
+ {
1813
+ type: ContentTypes.TOOL_CALL,
1814
+ tool_call: {
1815
+ id: 'tool_1',
1816
+ name: 'a',
1817
+ args: '{}',
1818
+ output: 'abc',
1819
+ },
1820
+ },
1821
+ {
1822
+ type: ContentTypes.TOOL_CALL,
1823
+ tool_call: {
1824
+ id: 'tool_2',
1825
+ name: 'b',
1826
+ args: '{}',
1827
+ output: 'abc',
1828
+ },
1829
+ },
1830
+ {
1831
+ type: ContentTypes.TOOL_CALL,
1832
+ tool_call: {
1833
+ id: 'tool_3',
1834
+ name: 'c',
1835
+ args: '{}',
1836
+ output: 'abc',
1837
+ },
1838
+ },
1839
+ ],
1840
+ },
1841
+ ];
1842
+
1843
+ const indexTokenCountMap = { 0: 7 };
1844
+ const result = formatAgentMessages(payload, indexTokenCountMap);
1845
+
1846
+ expect(result.messages).toHaveLength(4);
1847
+ const total = Object.values(result.indexTokenCountMap || {}).reduce(
1848
+ (sum, v) => sum + v,
1849
+ 0
1850
+ );
1851
+ expect(total).toBe(7);
1852
+ for (let i = 0; i < result.messages.length; i++) {
1853
+ expect(result.indexTokenCountMap?.[i]).toBeGreaterThanOrEqual(0);
1854
+ }
1855
+ });
1856
+
1857
+ it('should never produce negative token counts', () => {
1858
+ const payload = [
1859
+ {
1860
+ role: 'assistant',
1861
+ content: [
1862
+ {
1863
+ type: ContentTypes.TEXT,
1864
+ [ContentTypes.TEXT]: 'a',
1865
+ tool_call_ids: ['t1', 't2', 't3', 't4', 't5'],
1866
+ },
1867
+ {
1868
+ type: ContentTypes.TOOL_CALL,
1869
+ tool_call: { id: 't1', name: 'x', args: '{}', output: 'b' },
1870
+ },
1871
+ {
1872
+ type: ContentTypes.TOOL_CALL,
1873
+ tool_call: { id: 't2', name: 'x', args: '{}', output: 'c' },
1874
+ },
1875
+ {
1876
+ type: ContentTypes.TOOL_CALL,
1877
+ tool_call: { id: 't3', name: 'x', args: '{}', output: 'd' },
1878
+ },
1879
+ {
1880
+ type: ContentTypes.TOOL_CALL,
1881
+ tool_call: { id: 't4', name: 'x', args: '{}', output: 'e' },
1882
+ },
1883
+ {
1884
+ type: ContentTypes.TOOL_CALL,
1885
+ tool_call: { id: 't5', name: 'x', args: '{}', output: 'f' },
1886
+ },
1887
+ ],
1888
+ },
1889
+ ];
1890
+
1891
+ const indexTokenCountMap = { 0: 3 };
1892
+ const result = formatAgentMessages(payload, indexTokenCountMap);
1893
+
1894
+ const total = Object.values(result.indexTokenCountMap || {}).reduce(
1895
+ (sum, v) => sum + v,
1896
+ 0
1897
+ );
1898
+ expect(total).toBe(3);
1899
+ for (const val of Object.values(result.indexTokenCountMap || {})) {
1900
+ expect(val).toBeGreaterThanOrEqual(0);
1901
+ }
1902
+ });
1903
+
1904
+ it('should handle single token budget distributed across many messages', () => {
1905
+ const payload = [
1906
+ {
1907
+ role: 'assistant',
1908
+ content: [
1909
+ {
1910
+ type: ContentTypes.TEXT,
1911
+ [ContentTypes.TEXT]: 'hello',
1912
+ tool_call_ids: ['t1', 't2'],
1913
+ },
1914
+ {
1915
+ type: ContentTypes.TOOL_CALL,
1916
+ tool_call: {
1917
+ id: 't1',
1918
+ name: 'a',
1919
+ args: '{}',
1920
+ output: 'result one',
1921
+ },
1922
+ },
1923
+ {
1924
+ type: ContentTypes.TOOL_CALL,
1925
+ tool_call: {
1926
+ id: 't2',
1927
+ name: 'b',
1928
+ args: '{}',
1929
+ output: 'result two',
1930
+ },
1931
+ },
1932
+ ],
1933
+ },
1934
+ ];
1935
+
1936
+ const indexTokenCountMap = { 0: 1 };
1937
+ const result = formatAgentMessages(payload, indexTokenCountMap);
1938
+
1939
+ const total = Object.values(result.indexTokenCountMap || {}).reduce(
1940
+ (sum, v) => sum + v,
1941
+ 0
1942
+ );
1943
+ expect(total).toBe(1);
1944
+ for (const val of Object.values(result.indexTokenCountMap || {})) {
1945
+ expect(val).toBeGreaterThanOrEqual(0);
1946
+ }
1947
+ });
1948
+
1949
+ it('should handle zero token budget', () => {
1950
+ const payload = [
1951
+ {
1952
+ role: 'assistant',
1953
+ content: [
1954
+ {
1955
+ type: ContentTypes.TEXT,
1956
+ [ContentTypes.TEXT]: 'hello',
1957
+ tool_call_ids: ['t1'],
1958
+ },
1959
+ {
1960
+ type: ContentTypes.TOOL_CALL,
1961
+ tool_call: { id: 't1', name: 'a', args: '{}', output: 'world' },
1962
+ },
1963
+ ],
1964
+ },
1965
+ ];
1966
+
1967
+ const indexTokenCountMap = { 0: 0 };
1968
+ const result = formatAgentMessages(payload, indexTokenCountMap);
1969
+
1970
+ const total = Object.values(result.indexTokenCountMap || {}).reduce(
1971
+ (sum, v) => sum + v,
1972
+ 0
1973
+ );
1974
+ expect(total).toBe(0);
1975
+ });
1976
+
1977
+ it('should distribute tokens proportionally with 5 tool calls of varying sizes', () => {
1978
+ const payload = [
1979
+ {
1980
+ role: 'assistant',
1981
+ content: [
1982
+ {
1983
+ type: ContentTypes.TEXT,
1984
+ [ContentTypes.TEXT]: 'I will perform multiple operations.',
1985
+ tool_call_ids: ['t1', 't2', 't3', 't4', 't5'],
1986
+ },
1987
+ {
1988
+ type: ContentTypes.TOOL_CALL,
1989
+ tool_call: {
1990
+ id: 't1',
1991
+ name: 'navigate',
1992
+ args: '{"url":"https://example.com"}',
1993
+ output: 'Navigated successfully.',
1994
+ },
1995
+ },
1996
+ {
1997
+ type: ContentTypes.TOOL_CALL,
1998
+ tool_call: {
1999
+ id: 't2',
2000
+ name: 'snapshot',
2001
+ args: '{}',
2002
+ output: 'x'.repeat(5000),
2003
+ },
2004
+ },
2005
+ {
2006
+ type: ContentTypes.TOOL_CALL,
2007
+ tool_call: {
2008
+ id: 't3',
2009
+ name: 'click',
2010
+ args: '{"selector":"#btn"}',
2011
+ output: 'Clicked.',
2012
+ },
2013
+ },
2014
+ {
2015
+ type: ContentTypes.TOOL_CALL,
2016
+ tool_call: {
2017
+ id: 't4',
2018
+ name: 'snapshot',
2019
+ args: '{}',
2020
+ output: 'y'.repeat(8000),
2021
+ },
2022
+ },
2023
+ {
2024
+ type: ContentTypes.TOOL_CALL,
2025
+ tool_call: {
2026
+ id: 't5',
2027
+ name: 'extract',
2028
+ args: '{"selector":"h1"}',
2029
+ output: 'Page Title',
2030
+ },
2031
+ },
2032
+ ],
2033
+ },
2034
+ ];
2035
+
2036
+ const indexTokenCountMap = { 0: 3000 };
2037
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2038
+
2039
+ expect(result.messages).toHaveLength(6);
2040
+
2041
+ const total = Object.values(result.indexTokenCountMap || {}).reduce(
2042
+ (sum, v) => sum + v,
2043
+ 0
2044
+ );
2045
+ expect(total).toBe(3000);
2046
+
2047
+ const snapshotIdx1 = 2;
2048
+ const snapshotIdx2 = 4;
2049
+ const bigSnapshotTokens =
2050
+ (result.indexTokenCountMap?.[snapshotIdx1] ?? 0) +
2051
+ (result.indexTokenCountMap?.[snapshotIdx2] ?? 0);
2052
+ expect(bigSnapshotTokens).toBeGreaterThan(2500);
2053
+
2054
+ for (const val of Object.values(result.indexTokenCountMap || {})) {
2055
+ expect(val).toBeGreaterThanOrEqual(0);
2056
+ }
2057
+ });
2058
+
2059
+ it('should handle HN-like payload: AI with 18 tool calls and large snapshot results', () => {
2060
+ const smallOutput = 'Successfully navigated to page.';
2061
+ const hugeSnapshot = 'uid=8_0 RootWebArea ' + 'x'.repeat(20000);
2062
+
2063
+ const toolCalls: Array<{
2064
+ type: string;
2065
+ tool_call: { id: string; name: string; args: string; output: string };
2066
+ }> = [];
2067
+ const toolCallIds: string[] = [];
2068
+
2069
+ for (let i = 0; i < 18; i++) {
2070
+ const id = `tool_${i}`;
2071
+ toolCallIds.push(id);
2072
+ const isSnapshot = i % 3 === 1;
2073
+ toolCalls.push({
2074
+ type: ContentTypes.TOOL_CALL,
2075
+ tool_call: {
2076
+ id,
2077
+ name: isSnapshot ? 'take_snapshot' : 'navigate_page',
2078
+ args: isSnapshot ? '{}' : `{"url":"https://example.com/${i}"}`,
2079
+ output: isSnapshot ? hugeSnapshot : smallOutput,
2080
+ },
2081
+ });
2082
+ }
2083
+
2084
+ const payload = [
2085
+ {
2086
+ role: 'user',
2087
+ content: 'Look up top 5 posts on HN',
2088
+ },
2089
+ {
2090
+ role: 'assistant',
2091
+ content: [
2092
+ {
2093
+ type: ContentTypes.TEXT,
2094
+ [ContentTypes.TEXT]: '',
2095
+ tool_call_ids: toolCallIds,
2096
+ },
2097
+ ...toolCalls,
2098
+ ],
2099
+ },
2100
+ ];
2101
+
2102
+ const indexTokenCountMap = { 0: 20, 1: 10000 };
2103
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2104
+
2105
+ expect(result.messages.length).toBeGreaterThan(2);
2106
+
2107
+ const total = Object.values(result.indexTokenCountMap || {}).reduce(
2108
+ (sum, v) => sum + v,
2109
+ 0
2110
+ );
2111
+ expect(total).toBe(10020);
2112
+
2113
+ expect(result.indexTokenCountMap?.[0]).toBe(20);
2114
+
2115
+ let snapshotTokenTotal = 0;
2116
+ let navTokenTotal = 0;
2117
+ for (let i = 1; i < result.messages.length; i++) {
2118
+ const tokens = result.indexTokenCountMap?.[i] ?? 0;
2119
+ expect(tokens).toBeGreaterThanOrEqual(0);
2120
+
2121
+ if (result.messages[i] instanceof ToolMessage) {
2122
+ const content = result.messages[i].content;
2123
+ if (typeof content === 'string' && content.length > 1000) {
2124
+ snapshotTokenTotal += tokens;
2125
+ } else {
2126
+ navTokenTotal += tokens;
2127
+ }
2128
+ }
2129
+ }
2130
+
2131
+ expect(snapshotTokenTotal).toBeGreaterThan(navTokenTotal);
2132
+ });
2133
+
2134
+ it('should complete proportional distribution within reasonable time for large payloads', () => {
2135
+ const toolCalls: Array<{
2136
+ type: string;
2137
+ tool_call: { id: string; name: string; args: string; output: string };
2138
+ }> = [];
2139
+ const toolCallIds: string[] = [];
2140
+
2141
+ for (let i = 0; i < 50; i++) {
2142
+ const id = `tool_${i}`;
2143
+ toolCallIds.push(id);
2144
+ toolCalls.push({
2145
+ type: ContentTypes.TOOL_CALL,
2146
+ tool_call: {
2147
+ id,
2148
+ name: `tool_${i}`,
2149
+ args: JSON.stringify({ data: 'x'.repeat(100) }),
2150
+ output: 'y'.repeat(Math.floor(Math.random() * 10000)),
2151
+ },
2152
+ });
2153
+ }
2154
+
2155
+ const payload = [
2156
+ {
2157
+ role: 'assistant',
2158
+ content: [
2159
+ {
2160
+ type: ContentTypes.TEXT,
2161
+ [ContentTypes.TEXT]: 'Processing...',
2162
+ tool_call_ids: toolCallIds,
2163
+ },
2164
+ ...toolCalls,
2165
+ ],
2166
+ },
2167
+ ];
2168
+
2169
+ const indexTokenCountMap = { 0: 50000 };
2170
+
2171
+ const start = performance.now();
2172
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2173
+ const elapsed = performance.now() - start;
2174
+
2175
+ // PERF: Allow headroom for TOON compression applied to 50 tool outputs
2176
+ expect(elapsed).toBeLessThan(2000);
2177
+
2178
+ const total = Object.values(result.indexTokenCountMap || {}).reduce(
2179
+ (sum, v) => sum + v,
2180
+ 0
2181
+ );
2182
+ expect(total).toBe(50000);
2183
+ });
2184
+
2185
+ it('should always preserve total token count across multiple original messages', () => {
2186
+ const payload = [
2187
+ { role: 'user', content: 'Hello' },
2188
+ {
2189
+ role: 'assistant',
2190
+ content: [
2191
+ {
2192
+ type: ContentTypes.TEXT,
2193
+ [ContentTypes.TEXT]: 'Let me search.',
2194
+ tool_call_ids: ['t1'],
2195
+ },
2196
+ {
2197
+ type: ContentTypes.TOOL_CALL,
2198
+ tool_call: {
2199
+ id: 't1',
2200
+ name: 'search',
2201
+ args: '{"q":"test"}',
2202
+ output:
2203
+ 'Found 10 results with detailed descriptions: ' +
2204
+ 'z'.repeat(500),
2205
+ },
2206
+ },
2207
+ ],
2208
+ },
2209
+ { role: 'user', content: 'Thanks' },
2210
+ { role: 'assistant', content: 'You are welcome!' },
2211
+ ];
2212
+
2213
+ const indexTokenCountMap = { 0: 5, 1: 200, 2: 3, 3: 8 };
2214
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2215
+
2216
+ const total = Object.values(result.indexTokenCountMap || {}).reduce(
2217
+ (sum, v) => sum + v,
2218
+ 0
2219
+ );
2220
+ expect(total).toBe(216);
2221
+
2222
+ for (const val of Object.values(result.indexTokenCountMap || {})) {
2223
+ expect(val).toBeGreaterThanOrEqual(0);
2224
+ expect(Number.isInteger(val)).toBe(true);
2225
+ }
2226
+ });
2227
+
2228
+ it('should produce integer token counts (no floating point)', () => {
2229
+ const payload = [
2230
+ {
2231
+ role: 'assistant',
2232
+ content: [
2233
+ {
2234
+ type: ContentTypes.TEXT,
2235
+ [ContentTypes.TEXT]: 'abc',
2236
+ tool_call_ids: ['t1', 't2', 't3'],
2237
+ },
2238
+ {
2239
+ type: ContentTypes.TOOL_CALL,
2240
+ tool_call: { id: 't1', name: 'a', args: '{}', output: 'defgh' },
2241
+ },
2242
+ {
2243
+ type: ContentTypes.TOOL_CALL,
2244
+ tool_call: { id: 't2', name: 'b', args: '{}', output: 'ij' },
2245
+ },
2246
+ {
2247
+ type: ContentTypes.TOOL_CALL,
2248
+ tool_call: {
2249
+ id: 't3',
2250
+ name: 'c',
2251
+ args: '{}',
2252
+ output: 'klmnopqrst',
2253
+ },
2254
+ },
2255
+ ],
2256
+ },
2257
+ ];
2258
+
2259
+ const indexTokenCountMap = { 0: 97 };
2260
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2261
+
2262
+ for (const val of Object.values(result.indexTokenCountMap || {})) {
2263
+ expect(Number.isInteger(val)).toBe(true);
2264
+ }
2265
+
2266
+ const total = Object.values(result.indexTokenCountMap || {}).reduce(
2267
+ (sum, v) => sum + v,
2268
+ 0
2269
+ );
2270
+ expect(total).toBe(97);
2271
+ });
2272
+
2273
+ it('should account for tool call args in content length calculation', () => {
2274
+ const payload = [
2275
+ {
2276
+ role: 'assistant',
2277
+ content: [
2278
+ {
2279
+ type: ContentTypes.TEXT,
2280
+ [ContentTypes.TEXT]: 'x',
2281
+ tool_call_ids: ['t1', 't2'],
2282
+ },
2283
+ {
2284
+ type: ContentTypes.TOOL_CALL,
2285
+ tool_call: {
2286
+ id: 't1',
2287
+ name: 'tiny_tool',
2288
+ args: '{}',
2289
+ output: 'small',
2290
+ },
2291
+ },
2292
+ {
2293
+ type: ContentTypes.TOOL_CALL,
2294
+ tool_call: {
2295
+ id: 't2',
2296
+ name: 'big_args_tool',
2297
+ args: JSON.stringify({ data: 'a'.repeat(5000) }),
2298
+ output: 'small',
2299
+ },
2300
+ },
2301
+ ],
2302
+ },
2303
+ ];
2304
+
2305
+ const indexTokenCountMap = { 0: 1000 };
2306
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2307
+
2308
+ expect(result.messages).toHaveLength(3);
2309
+
2310
+ const total = Object.values(result.indexTokenCountMap || {}).reduce(
2311
+ (sum, v) => sum + v,
2312
+ 0
2313
+ );
2314
+ expect(total).toBe(1000);
2315
+
2316
+ for (const val of Object.values(result.indexTokenCountMap || {})) {
2317
+ expect(val).toBeGreaterThanOrEqual(0);
2318
+ }
2319
+ });
2320
+
2321
+ it('should not throw when indexTokenCountMap has undefined values for some indices', () => {
2322
+ const payload = [
2323
+ { role: 'user', content: 'Hello' },
2324
+ {
2325
+ role: 'assistant',
2326
+ content: [
2327
+ {
2328
+ type: ContentTypes.TEXT,
2329
+ [ContentTypes.TEXT]: 'response',
2330
+ tool_call_ids: ['t1'],
2331
+ },
2332
+ {
2333
+ type: ContentTypes.TOOL_CALL,
2334
+ tool_call: {
2335
+ id: 't1',
2336
+ name: 'search',
2337
+ args: '{}',
2338
+ output: 'result',
2339
+ },
2340
+ },
2341
+ ],
2342
+ },
2343
+ ];
2344
+
2345
+ const indexTokenCountMap: Record<number, number | undefined> = {
2346
+ 0: undefined,
2347
+ 1: 50,
2348
+ };
2349
+
2350
+ expect(() => {
2351
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2352
+ expect(result.indexTokenCountMap).toBeDefined();
2353
+ const total = Object.values(result.indexTokenCountMap || {}).reduce(
2354
+ (sum, v) => sum + v,
2355
+ 0
2356
+ );
2357
+ expect(total).toBe(50);
2358
+ }).not.toThrow();
2359
+ });
2360
+
2361
+ it('should not throw when indexTokenCountMap is sparse (missing indices)', () => {
2362
+ const payload = [
2363
+ { role: 'user', content: 'Hello' },
2364
+ { role: 'assistant', content: 'World' },
2365
+ { role: 'user', content: 'Bye' },
2366
+ ];
2367
+
2368
+ const indexTokenCountMap = { 0: 5, 2: 3 };
2369
+
2370
+ expect(() => {
2371
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2372
+ expect(result.indexTokenCountMap).toBeDefined();
2373
+ expect(result.indexTokenCountMap?.[0]).toBe(5);
2374
+ expect(result.indexTokenCountMap?.[2]).toBe(3);
2375
+ }).not.toThrow();
2376
+ });
2377
+
2378
+ it('should not throw when indexTokenCountMap has extra indices beyond payload', () => {
2379
+ const payload = [{ role: 'user', content: 'Hello' }];
2380
+
2381
+ const indexTokenCountMap = { 0: 5, 1: 10, 2: 15, 99: 999 };
2382
+
2383
+ expect(() => {
2384
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2385
+ expect(result.indexTokenCountMap?.[0]).toBe(5);
2386
+ }).not.toThrow();
2387
+ });
2388
+
2389
+ it('should not throw with empty payload and non-empty indexTokenCountMap', () => {
2390
+ const payload: Array<{ role: string; content: string }> = [];
2391
+ const indexTokenCountMap = { 0: 100 };
2392
+
2393
+ expect(() => {
2394
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2395
+ expect(result.messages).toHaveLength(0);
2396
+ }).not.toThrow();
2397
+ });
2398
+
2399
+ it('should not throw when assistant message content is empty array', () => {
2400
+ const payload = [
2401
+ {
2402
+ role: 'assistant',
2403
+ content: [] as Array<{ type: string; text?: string }>,
2404
+ },
2405
+ ];
2406
+
2407
+ const indexTokenCountMap = { 0: 50 };
2408
+
2409
+ expect(() => {
2410
+ formatAgentMessages(payload, indexTokenCountMap);
2411
+ }).not.toThrow();
2412
+ });
2413
+
2414
+ it('should not throw when tool call output is null or undefined', () => {
2415
+ const payload = [
2416
+ {
2417
+ role: 'assistant',
2418
+ content: [
2419
+ {
2420
+ type: ContentTypes.TEXT,
2421
+ [ContentTypes.TEXT]: 'calling tools',
2422
+ tool_call_ids: ['t1', 't2'],
2423
+ },
2424
+ {
2425
+ type: ContentTypes.TOOL_CALL,
2426
+ tool_call: {
2427
+ id: 't1',
2428
+ name: 'search',
2429
+ args: '{}',
2430
+ output: null as unknown as string,
2431
+ },
2432
+ },
2433
+ {
2434
+ type: ContentTypes.TOOL_CALL,
2435
+ tool_call: {
2436
+ id: 't2',
2437
+ name: 'fetch',
2438
+ args: '{}',
2439
+ output: undefined as unknown as string,
2440
+ },
2441
+ },
2442
+ ],
2443
+ },
2444
+ ];
2445
+
2446
+ const indexTokenCountMap = { 0: 30 };
2447
+
2448
+ expect(() => {
2449
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2450
+ const total = Object.values(result.indexTokenCountMap || {}).reduce(
2451
+ (sum, v) => sum + v,
2452
+ 0
2453
+ );
2454
+ expect(total).toBe(30);
2455
+ }).not.toThrow();
2456
+ });
2457
+
2458
+ it('should not throw when tool call args are deeply nested objects', () => {
2459
+ const deepArgs = { a: { b: { c: { d: { e: { f: 'deep' } } } } } };
2460
+ const payload = [
2461
+ {
2462
+ role: 'assistant',
2463
+ content: [
2464
+ {
2465
+ type: ContentTypes.TEXT,
2466
+ [ContentTypes.TEXT]: 'deep call',
2467
+ tool_call_ids: ['t1'],
2468
+ },
2469
+ {
2470
+ type: ContentTypes.TOOL_CALL,
2471
+ tool_call: {
2472
+ id: 't1',
2473
+ name: 'deep_tool',
2474
+ args: JSON.stringify(deepArgs),
2475
+ output: 'done',
2476
+ },
2477
+ },
2478
+ ],
2479
+ },
2480
+ ];
2481
+
2482
+ const indexTokenCountMap = { 0: 100 };
2483
+
2484
+ expect(() => {
2485
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2486
+ const total = Object.values(result.indexTokenCountMap || {}).reduce(
2487
+ (sum, v) => sum + v,
2488
+ 0
2489
+ );
2490
+ expect(total).toBe(100);
2491
+ }).not.toThrow();
2492
+ });
2493
+
2494
+ it('should not throw when tool call args are not valid JSON strings', () => {
2495
+ const payload = [
2496
+ {
2497
+ role: 'assistant',
2498
+ content: [
2499
+ {
2500
+ type: ContentTypes.TEXT,
2501
+ [ContentTypes.TEXT]: 'bad args',
2502
+ tool_call_ids: ['t1'],
2503
+ },
2504
+ {
2505
+ type: ContentTypes.TOOL_CALL,
2506
+ tool_call: {
2507
+ id: 't1',
2508
+ name: 'tool',
2509
+ args: '{not valid json!!!',
2510
+ output: 'output',
2511
+ },
2512
+ },
2513
+ ],
2514
+ },
2515
+ ];
2516
+
2517
+ const indexTokenCountMap = { 0: 40 };
2518
+
2519
+ expect(() => {
2520
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2521
+ const total = Object.values(result.indexTokenCountMap || {}).reduce(
2522
+ (sum, v) => sum + v,
2523
+ 0
2524
+ );
2525
+ expect(total).toBe(40);
2526
+ }).not.toThrow();
2527
+ });
2528
+
2529
+ it('should not throw when content array has mixed types including unexpected values', () => {
2530
+ const payload = [
2531
+ {
2532
+ role: 'assistant',
2533
+ content: [
2534
+ { type: ContentTypes.TEXT, [ContentTypes.TEXT]: 'hello' },
2535
+ null as unknown as { type: string },
2536
+ undefined as unknown as { type: string },
2537
+ { type: 'unknown_type', something: 'weird' },
2538
+ ],
2539
+ },
2540
+ ];
2541
+
2542
+ const indexTokenCountMap = { 0: 25 };
2543
+
2544
+ expect(() => {
2545
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2546
+ expect(result.indexTokenCountMap?.[0]).toBe(25);
2547
+ }).not.toThrow();
2548
+ });
2549
+
2550
+ it('should not throw when tool call has empty name and empty args', () => {
2551
+ const payload = [
2552
+ {
2553
+ role: 'assistant',
2554
+ content: [
2555
+ {
2556
+ type: ContentTypes.TEXT,
2557
+ [ContentTypes.TEXT]: 'test',
2558
+ tool_call_ids: ['t1'],
2559
+ },
2560
+ {
2561
+ type: ContentTypes.TOOL_CALL,
2562
+ tool_call: {
2563
+ id: 't1',
2564
+ name: '',
2565
+ args: '',
2566
+ output: 'some output',
2567
+ },
2568
+ },
2569
+ ],
2570
+ },
2571
+ ];
2572
+
2573
+ const indexTokenCountMap = { 0: 50 };
2574
+
2575
+ expect(() => {
2576
+ formatAgentMessages(payload, indexTokenCountMap);
2577
+ }).not.toThrow();
2578
+ });
2579
+
2580
+ it('should not throw when all content parts are filtered out (THINK + ERROR only)', () => {
2581
+ const payload = [
2582
+ {
2583
+ role: 'assistant',
2584
+ content: [
2585
+ { type: ContentTypes.THINK, [ContentTypes.THINK]: 'thinking...' },
2586
+ { type: ContentTypes.ERROR, [ContentTypes.ERROR]: 'error...' },
2587
+ ],
2588
+ },
2589
+ ];
2590
+
2591
+ const indexTokenCountMap = { 0: 100 };
2592
+
2593
+ expect(() => {
2594
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2595
+ expect(Object.keys(result.indexTokenCountMap || {}).length).toBe(0);
2596
+ }).not.toThrow();
2597
+ });
2598
+
2599
+ it('should not throw with very large token count values', () => {
2600
+ const payload = [
2601
+ {
2602
+ role: 'assistant',
2603
+ content: [
2604
+ {
2605
+ type: ContentTypes.TEXT,
2606
+ [ContentTypes.TEXT]: 'big tokens',
2607
+ tool_call_ids: ['t1'],
2608
+ },
2609
+ {
2610
+ type: ContentTypes.TOOL_CALL,
2611
+ tool_call: { id: 't1', name: 'a', args: '{}', output: 'b' },
2612
+ },
2613
+ ],
2614
+ },
2615
+ ];
2616
+
2617
+ const indexTokenCountMap = { 0: Number.MAX_SAFE_INTEGER };
2618
+
2619
+ expect(() => {
2620
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2621
+ const total = Object.values(result.indexTokenCountMap || {}).reduce(
2622
+ (sum, v) => sum + v,
2623
+ 0
2624
+ );
2625
+ expect(total).toBe(Number.MAX_SAFE_INTEGER);
2626
+ }).not.toThrow();
2627
+ });
2628
+
2629
+ it('should not throw when multiple payload messages expand and some have undefined token counts', () => {
2630
+ const payload = [
2631
+ { role: 'user', content: 'msg1' },
2632
+ {
2633
+ role: 'assistant',
2634
+ content: [
2635
+ {
2636
+ type: ContentTypes.TEXT,
2637
+ [ContentTypes.TEXT]: 'response with tool',
2638
+ tool_call_ids: ['t1'],
2639
+ },
2640
+ {
2641
+ type: ContentTypes.TOOL_CALL,
2642
+ tool_call: {
2643
+ id: 't1',
2644
+ name: 'search',
2645
+ args: '{}',
2646
+ output: 'found',
2647
+ },
2648
+ },
2649
+ ],
2650
+ },
2651
+ { role: 'user', content: 'msg2' },
2652
+ {
2653
+ role: 'assistant',
2654
+ content: [
2655
+ {
2656
+ type: ContentTypes.TEXT,
2657
+ [ContentTypes.TEXT]: 'another response',
2658
+ tool_call_ids: ['t2'],
2659
+ },
2660
+ {
2661
+ type: ContentTypes.TOOL_CALL,
2662
+ tool_call: {
2663
+ id: 't2',
2664
+ name: 'fetch',
2665
+ args: '{}',
2666
+ output: 'data',
2667
+ },
2668
+ },
2669
+ ],
2670
+ },
2671
+ ];
2672
+
2673
+ const indexTokenCountMap: Record<number, number | undefined> = {
2674
+ 0: 5,
2675
+ 1: undefined,
2676
+ 2: 3,
2677
+ 3: 80,
2678
+ };
2679
+
2680
+ expect(() => {
2681
+ const result = formatAgentMessages(payload, indexTokenCountMap);
2682
+ expect(result.indexTokenCountMap).toBeDefined();
2683
+ expect(result.indexTokenCountMap?.[0]).toBe(5);
2684
+ }).not.toThrow();
2685
+ });
2686
+ });
1513
2687
  });