@illuma-ai/agents 1.0.81

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (558) hide show
  1. package/README.md +485 -0
  2. package/dist/cjs/agents/AgentContext.cjs +734 -0
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -0
  4. package/dist/cjs/common/enum.cjs +190 -0
  5. package/dist/cjs/common/enum.cjs.map +1 -0
  6. package/dist/cjs/events.cjs +172 -0
  7. package/dist/cjs/events.cjs.map +1 -0
  8. package/dist/cjs/graphs/Graph.cjs +1615 -0
  9. package/dist/cjs/graphs/Graph.cjs.map +1 -0
  10. package/dist/cjs/graphs/MultiAgentGraph.cjs +890 -0
  11. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -0
  12. package/dist/cjs/instrumentation.cjs +21 -0
  13. package/dist/cjs/instrumentation.cjs.map +1 -0
  14. package/dist/cjs/llm/anthropic/index.cjs +292 -0
  15. package/dist/cjs/llm/anthropic/index.cjs.map +1 -0
  16. package/dist/cjs/llm/anthropic/types.cjs +50 -0
  17. package/dist/cjs/llm/anthropic/types.cjs.map +1 -0
  18. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +630 -0
  19. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -0
  20. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +218 -0
  21. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -0
  22. package/dist/cjs/llm/anthropic/utils/tools.cjs +29 -0
  23. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -0
  24. package/dist/cjs/llm/bedrock/index.cjs +282 -0
  25. package/dist/cjs/llm/bedrock/index.cjs.map +1 -0
  26. package/dist/cjs/llm/fake.cjs +97 -0
  27. package/dist/cjs/llm/fake.cjs.map +1 -0
  28. package/dist/cjs/llm/google/index.cjs +216 -0
  29. package/dist/cjs/llm/google/index.cjs.map +1 -0
  30. package/dist/cjs/llm/google/utils/common.cjs +647 -0
  31. package/dist/cjs/llm/google/utils/common.cjs.map +1 -0
  32. package/dist/cjs/llm/openai/index.cjs +1028 -0
  33. package/dist/cjs/llm/openai/index.cjs.map +1 -0
  34. package/dist/cjs/llm/openai/utils/index.cjs +765 -0
  35. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -0
  36. package/dist/cjs/llm/openrouter/index.cjs +212 -0
  37. package/dist/cjs/llm/openrouter/index.cjs.map +1 -0
  38. package/dist/cjs/llm/providers.cjs +43 -0
  39. package/dist/cjs/llm/providers.cjs.map +1 -0
  40. package/dist/cjs/llm/text.cjs +69 -0
  41. package/dist/cjs/llm/text.cjs.map +1 -0
  42. package/dist/cjs/llm/vertexai/index.cjs +329 -0
  43. package/dist/cjs/llm/vertexai/index.cjs.map +1 -0
  44. package/dist/cjs/main.cjs +240 -0
  45. package/dist/cjs/main.cjs.map +1 -0
  46. package/dist/cjs/messages/cache.cjs +387 -0
  47. package/dist/cjs/messages/cache.cjs.map +1 -0
  48. package/dist/cjs/messages/content.cjs +53 -0
  49. package/dist/cjs/messages/content.cjs.map +1 -0
  50. package/dist/cjs/messages/core.cjs +367 -0
  51. package/dist/cjs/messages/core.cjs.map +1 -0
  52. package/dist/cjs/messages/format.cjs +761 -0
  53. package/dist/cjs/messages/format.cjs.map +1 -0
  54. package/dist/cjs/messages/ids.cjs +23 -0
  55. package/dist/cjs/messages/ids.cjs.map +1 -0
  56. package/dist/cjs/messages/prune.cjs +398 -0
  57. package/dist/cjs/messages/prune.cjs.map +1 -0
  58. package/dist/cjs/messages/tools.cjs +96 -0
  59. package/dist/cjs/messages/tools.cjs.map +1 -0
  60. package/dist/cjs/run.cjs +328 -0
  61. package/dist/cjs/run.cjs.map +1 -0
  62. package/dist/cjs/schemas/validate.cjs +324 -0
  63. package/dist/cjs/schemas/validate.cjs.map +1 -0
  64. package/dist/cjs/splitStream.cjs +210 -0
  65. package/dist/cjs/splitStream.cjs.map +1 -0
  66. package/dist/cjs/stream.cjs +620 -0
  67. package/dist/cjs/stream.cjs.map +1 -0
  68. package/dist/cjs/tools/BrowserTools.cjs +248 -0
  69. package/dist/cjs/tools/BrowserTools.cjs.map +1 -0
  70. package/dist/cjs/tools/Calculator.cjs +66 -0
  71. package/dist/cjs/tools/Calculator.cjs.map +1 -0
  72. package/dist/cjs/tools/CodeExecutor.cjs +234 -0
  73. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -0
  74. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +636 -0
  75. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -0
  76. package/dist/cjs/tools/ToolNode.cjs +548 -0
  77. package/dist/cjs/tools/ToolNode.cjs.map +1 -0
  78. package/dist/cjs/tools/ToolSearch.cjs +909 -0
  79. package/dist/cjs/tools/ToolSearch.cjs.map +1 -0
  80. package/dist/cjs/tools/handlers.cjs +255 -0
  81. package/dist/cjs/tools/handlers.cjs.map +1 -0
  82. package/dist/cjs/tools/schema.cjs +31 -0
  83. package/dist/cjs/tools/schema.cjs.map +1 -0
  84. package/dist/cjs/tools/search/anthropic.cjs +40 -0
  85. package/dist/cjs/tools/search/anthropic.cjs.map +1 -0
  86. package/dist/cjs/tools/search/content.cjs +140 -0
  87. package/dist/cjs/tools/search/content.cjs.map +1 -0
  88. package/dist/cjs/tools/search/firecrawl.cjs +179 -0
  89. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -0
  90. package/dist/cjs/tools/search/format.cjs +203 -0
  91. package/dist/cjs/tools/search/format.cjs.map +1 -0
  92. package/dist/cjs/tools/search/highlights.cjs +245 -0
  93. package/dist/cjs/tools/search/highlights.cjs.map +1 -0
  94. package/dist/cjs/tools/search/rerankers.cjs +174 -0
  95. package/dist/cjs/tools/search/rerankers.cjs.map +1 -0
  96. package/dist/cjs/tools/search/schema.cjs +117 -0
  97. package/dist/cjs/tools/search/schema.cjs.map +1 -0
  98. package/dist/cjs/tools/search/search.cjs +566 -0
  99. package/dist/cjs/tools/search/search.cjs.map +1 -0
  100. package/dist/cjs/tools/search/serper-scraper.cjs +132 -0
  101. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -0
  102. package/dist/cjs/tools/search/tool.cjs +456 -0
  103. package/dist/cjs/tools/search/tool.cjs.map +1 -0
  104. package/dist/cjs/tools/search/utils.cjs +66 -0
  105. package/dist/cjs/tools/search/utils.cjs.map +1 -0
  106. package/dist/cjs/types/graph.cjs +29 -0
  107. package/dist/cjs/types/graph.cjs.map +1 -0
  108. package/dist/cjs/utils/contextAnalytics.cjs +66 -0
  109. package/dist/cjs/utils/contextAnalytics.cjs.map +1 -0
  110. package/dist/cjs/utils/events.cjs +31 -0
  111. package/dist/cjs/utils/events.cjs.map +1 -0
  112. package/dist/cjs/utils/graph.cjs +16 -0
  113. package/dist/cjs/utils/graph.cjs.map +1 -0
  114. package/dist/cjs/utils/handlers.cjs +70 -0
  115. package/dist/cjs/utils/handlers.cjs.map +1 -0
  116. package/dist/cjs/utils/llm.cjs +27 -0
  117. package/dist/cjs/utils/llm.cjs.map +1 -0
  118. package/dist/cjs/utils/misc.cjs +56 -0
  119. package/dist/cjs/utils/misc.cjs.map +1 -0
  120. package/dist/cjs/utils/run.cjs +73 -0
  121. package/dist/cjs/utils/run.cjs.map +1 -0
  122. package/dist/cjs/utils/schema.cjs +27 -0
  123. package/dist/cjs/utils/schema.cjs.map +1 -0
  124. package/dist/cjs/utils/title.cjs +125 -0
  125. package/dist/cjs/utils/title.cjs.map +1 -0
  126. package/dist/cjs/utils/tokens.cjs +125 -0
  127. package/dist/cjs/utils/tokens.cjs.map +1 -0
  128. package/dist/cjs/utils/toonFormat.cjs +388 -0
  129. package/dist/cjs/utils/toonFormat.cjs.map +1 -0
  130. package/dist/esm/agents/AgentContext.mjs +732 -0
  131. package/dist/esm/agents/AgentContext.mjs.map +1 -0
  132. package/dist/esm/common/enum.mjs +190 -0
  133. package/dist/esm/common/enum.mjs.map +1 -0
  134. package/dist/esm/events.mjs +164 -0
  135. package/dist/esm/events.mjs.map +1 -0
  136. package/dist/esm/graphs/Graph.mjs +1612 -0
  137. package/dist/esm/graphs/Graph.mjs.map +1 -0
  138. package/dist/esm/graphs/MultiAgentGraph.mjs +888 -0
  139. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -0
  140. package/dist/esm/instrumentation.mjs +19 -0
  141. package/dist/esm/instrumentation.mjs.map +1 -0
  142. package/dist/esm/llm/anthropic/index.mjs +290 -0
  143. package/dist/esm/llm/anthropic/index.mjs.map +1 -0
  144. package/dist/esm/llm/anthropic/types.mjs +48 -0
  145. package/dist/esm/llm/anthropic/types.mjs.map +1 -0
  146. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +627 -0
  147. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -0
  148. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +216 -0
  149. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -0
  150. package/dist/esm/llm/anthropic/utils/tools.mjs +27 -0
  151. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -0
  152. package/dist/esm/llm/bedrock/index.mjs +280 -0
  153. package/dist/esm/llm/bedrock/index.mjs.map +1 -0
  154. package/dist/esm/llm/fake.mjs +94 -0
  155. package/dist/esm/llm/fake.mjs.map +1 -0
  156. package/dist/esm/llm/google/index.mjs +214 -0
  157. package/dist/esm/llm/google/index.mjs.map +1 -0
  158. package/dist/esm/llm/google/utils/common.mjs +638 -0
  159. package/dist/esm/llm/google/utils/common.mjs.map +1 -0
  160. package/dist/esm/llm/openai/index.mjs +1018 -0
  161. package/dist/esm/llm/openai/index.mjs.map +1 -0
  162. package/dist/esm/llm/openai/utils/index.mjs +759 -0
  163. package/dist/esm/llm/openai/utils/index.mjs.map +1 -0
  164. package/dist/esm/llm/openrouter/index.mjs +210 -0
  165. package/dist/esm/llm/openrouter/index.mjs.map +1 -0
  166. package/dist/esm/llm/providers.mjs +39 -0
  167. package/dist/esm/llm/providers.mjs.map +1 -0
  168. package/dist/esm/llm/text.mjs +67 -0
  169. package/dist/esm/llm/text.mjs.map +1 -0
  170. package/dist/esm/llm/vertexai/index.mjs +327 -0
  171. package/dist/esm/llm/vertexai/index.mjs.map +1 -0
  172. package/dist/esm/main.mjs +37 -0
  173. package/dist/esm/main.mjs.map +1 -0
  174. package/dist/esm/messages/cache.mjs +382 -0
  175. package/dist/esm/messages/cache.mjs.map +1 -0
  176. package/dist/esm/messages/content.mjs +51 -0
  177. package/dist/esm/messages/content.mjs.map +1 -0
  178. package/dist/esm/messages/core.mjs +359 -0
  179. package/dist/esm/messages/core.mjs.map +1 -0
  180. package/dist/esm/messages/format.mjs +752 -0
  181. package/dist/esm/messages/format.mjs.map +1 -0
  182. package/dist/esm/messages/ids.mjs +21 -0
  183. package/dist/esm/messages/ids.mjs.map +1 -0
  184. package/dist/esm/messages/prune.mjs +393 -0
  185. package/dist/esm/messages/prune.mjs.map +1 -0
  186. package/dist/esm/messages/tools.mjs +93 -0
  187. package/dist/esm/messages/tools.mjs.map +1 -0
  188. package/dist/esm/run.mjs +325 -0
  189. package/dist/esm/run.mjs.map +1 -0
  190. package/dist/esm/schemas/validate.mjs +317 -0
  191. package/dist/esm/schemas/validate.mjs.map +1 -0
  192. package/dist/esm/splitStream.mjs +207 -0
  193. package/dist/esm/splitStream.mjs.map +1 -0
  194. package/dist/esm/stream.mjs +616 -0
  195. package/dist/esm/stream.mjs.map +1 -0
  196. package/dist/esm/tools/BrowserTools.mjs +244 -0
  197. package/dist/esm/tools/BrowserTools.mjs.map +1 -0
  198. package/dist/esm/tools/Calculator.mjs +41 -0
  199. package/dist/esm/tools/Calculator.mjs.map +1 -0
  200. package/dist/esm/tools/CodeExecutor.mjs +226 -0
  201. package/dist/esm/tools/CodeExecutor.mjs.map +1 -0
  202. package/dist/esm/tools/ProgrammaticToolCalling.mjs +622 -0
  203. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -0
  204. package/dist/esm/tools/ToolNode.mjs +545 -0
  205. package/dist/esm/tools/ToolNode.mjs.map +1 -0
  206. package/dist/esm/tools/ToolSearch.mjs +870 -0
  207. package/dist/esm/tools/ToolSearch.mjs.map +1 -0
  208. package/dist/esm/tools/handlers.mjs +250 -0
  209. package/dist/esm/tools/handlers.mjs.map +1 -0
  210. package/dist/esm/tools/schema.mjs +28 -0
  211. package/dist/esm/tools/schema.mjs.map +1 -0
  212. package/dist/esm/tools/search/anthropic.mjs +37 -0
  213. package/dist/esm/tools/search/anthropic.mjs.map +1 -0
  214. package/dist/esm/tools/search/content.mjs +119 -0
  215. package/dist/esm/tools/search/content.mjs.map +1 -0
  216. package/dist/esm/tools/search/firecrawl.mjs +176 -0
  217. package/dist/esm/tools/search/firecrawl.mjs.map +1 -0
  218. package/dist/esm/tools/search/format.mjs +201 -0
  219. package/dist/esm/tools/search/format.mjs.map +1 -0
  220. package/dist/esm/tools/search/highlights.mjs +243 -0
  221. package/dist/esm/tools/search/highlights.mjs.map +1 -0
  222. package/dist/esm/tools/search/rerankers.mjs +168 -0
  223. package/dist/esm/tools/search/rerankers.mjs.map +1 -0
  224. package/dist/esm/tools/search/schema.mjs +104 -0
  225. package/dist/esm/tools/search/schema.mjs.map +1 -0
  226. package/dist/esm/tools/search/search.mjs +563 -0
  227. package/dist/esm/tools/search/search.mjs.map +1 -0
  228. package/dist/esm/tools/search/serper-scraper.mjs +129 -0
  229. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -0
  230. package/dist/esm/tools/search/tool.mjs +454 -0
  231. package/dist/esm/tools/search/tool.mjs.map +1 -0
  232. package/dist/esm/tools/search/utils.mjs +61 -0
  233. package/dist/esm/tools/search/utils.mjs.map +1 -0
  234. package/dist/esm/types/graph.mjs +26 -0
  235. package/dist/esm/types/graph.mjs.map +1 -0
  236. package/dist/esm/utils/contextAnalytics.mjs +64 -0
  237. package/dist/esm/utils/contextAnalytics.mjs.map +1 -0
  238. package/dist/esm/utils/events.mjs +29 -0
  239. package/dist/esm/utils/events.mjs.map +1 -0
  240. package/dist/esm/utils/graph.mjs +13 -0
  241. package/dist/esm/utils/graph.mjs.map +1 -0
  242. package/dist/esm/utils/handlers.mjs +68 -0
  243. package/dist/esm/utils/handlers.mjs.map +1 -0
  244. package/dist/esm/utils/llm.mjs +24 -0
  245. package/dist/esm/utils/llm.mjs.map +1 -0
  246. package/dist/esm/utils/misc.mjs +53 -0
  247. package/dist/esm/utils/misc.mjs.map +1 -0
  248. package/dist/esm/utils/run.mjs +70 -0
  249. package/dist/esm/utils/run.mjs.map +1 -0
  250. package/dist/esm/utils/schema.mjs +24 -0
  251. package/dist/esm/utils/schema.mjs.map +1 -0
  252. package/dist/esm/utils/title.mjs +122 -0
  253. package/dist/esm/utils/title.mjs.map +1 -0
  254. package/dist/esm/utils/tokens.mjs +121 -0
  255. package/dist/esm/utils/tokens.mjs.map +1 -0
  256. package/dist/esm/utils/toonFormat.mjs +381 -0
  257. package/dist/esm/utils/toonFormat.mjs.map +1 -0
  258. package/dist/types/agents/AgentContext.d.ts +293 -0
  259. package/dist/types/common/enum.d.ts +155 -0
  260. package/dist/types/common/index.d.ts +1 -0
  261. package/dist/types/events.d.ts +31 -0
  262. package/dist/types/graphs/Graph.d.ts +216 -0
  263. package/dist/types/graphs/MultiAgentGraph.d.ts +104 -0
  264. package/dist/types/graphs/index.d.ts +2 -0
  265. package/dist/types/index.d.ts +21 -0
  266. package/dist/types/instrumentation.d.ts +1 -0
  267. package/dist/types/llm/anthropic/index.d.ts +39 -0
  268. package/dist/types/llm/anthropic/types.d.ts +37 -0
  269. package/dist/types/llm/anthropic/utils/message_inputs.d.ts +14 -0
  270. package/dist/types/llm/anthropic/utils/message_outputs.d.ts +14 -0
  271. package/dist/types/llm/anthropic/utils/output_parsers.d.ts +22 -0
  272. package/dist/types/llm/anthropic/utils/tools.d.ts +3 -0
  273. package/dist/types/llm/bedrock/index.d.ts +141 -0
  274. package/dist/types/llm/bedrock/types.d.ts +27 -0
  275. package/dist/types/llm/bedrock/utils/index.d.ts +5 -0
  276. package/dist/types/llm/bedrock/utils/message_inputs.d.ts +31 -0
  277. package/dist/types/llm/bedrock/utils/message_outputs.d.ts +33 -0
  278. package/dist/types/llm/fake.d.ts +31 -0
  279. package/dist/types/llm/google/index.d.ts +24 -0
  280. package/dist/types/llm/google/types.d.ts +42 -0
  281. package/dist/types/llm/google/utils/common.d.ts +34 -0
  282. package/dist/types/llm/google/utils/tools.d.ts +10 -0
  283. package/dist/types/llm/google/utils/zod_to_genai_parameters.d.ts +14 -0
  284. package/dist/types/llm/openai/index.d.ts +127 -0
  285. package/dist/types/llm/openai/types.d.ts +10 -0
  286. package/dist/types/llm/openai/utils/index.d.ts +29 -0
  287. package/dist/types/llm/openrouter/index.d.ts +15 -0
  288. package/dist/types/llm/providers.d.ts +5 -0
  289. package/dist/types/llm/text.d.ts +21 -0
  290. package/dist/types/llm/vertexai/index.d.ts +293 -0
  291. package/dist/types/messages/cache.d.ts +54 -0
  292. package/dist/types/messages/content.d.ts +7 -0
  293. package/dist/types/messages/core.d.ts +14 -0
  294. package/dist/types/messages/format.d.ts +137 -0
  295. package/dist/types/messages/ids.d.ts +3 -0
  296. package/dist/types/messages/index.d.ts +7 -0
  297. package/dist/types/messages/prune.d.ts +52 -0
  298. package/dist/types/messages/reducer.d.ts +9 -0
  299. package/dist/types/messages/tools.d.ts +17 -0
  300. package/dist/types/mockStream.d.ts +32 -0
  301. package/dist/types/prompts/collab.d.ts +1 -0
  302. package/dist/types/prompts/index.d.ts +2 -0
  303. package/dist/types/prompts/taskmanager.d.ts +41 -0
  304. package/dist/types/run.d.ts +41 -0
  305. package/dist/types/schemas/index.d.ts +1 -0
  306. package/dist/types/schemas/validate.d.ts +59 -0
  307. package/dist/types/splitStream.d.ts +37 -0
  308. package/dist/types/stream.d.ts +15 -0
  309. package/dist/types/test/mockTools.d.ts +28 -0
  310. package/dist/types/tools/BrowserTools.d.ts +87 -0
  311. package/dist/types/tools/Calculator.d.ts +34 -0
  312. package/dist/types/tools/CodeExecutor.d.ts +57 -0
  313. package/dist/types/tools/ProgrammaticToolCalling.d.ts +138 -0
  314. package/dist/types/tools/ToolNode.d.ts +51 -0
  315. package/dist/types/tools/ToolSearch.d.ts +219 -0
  316. package/dist/types/tools/handlers.d.ts +22 -0
  317. package/dist/types/tools/schema.d.ts +12 -0
  318. package/dist/types/tools/search/anthropic.d.ts +16 -0
  319. package/dist/types/tools/search/content.d.ts +4 -0
  320. package/dist/types/tools/search/firecrawl.d.ts +54 -0
  321. package/dist/types/tools/search/format.d.ts +5 -0
  322. package/dist/types/tools/search/highlights.d.ts +13 -0
  323. package/dist/types/tools/search/index.d.ts +3 -0
  324. package/dist/types/tools/search/rerankers.d.ts +38 -0
  325. package/dist/types/tools/search/schema.d.ts +103 -0
  326. package/dist/types/tools/search/search.d.ts +8 -0
  327. package/dist/types/tools/search/serper-scraper.d.ts +59 -0
  328. package/dist/types/tools/search/test.d.ts +1 -0
  329. package/dist/types/tools/search/tool.d.ts +3 -0
  330. package/dist/types/tools/search/types.d.ts +575 -0
  331. package/dist/types/tools/search/utils.d.ts +10 -0
  332. package/dist/types/types/graph.d.ts +399 -0
  333. package/dist/types/types/index.d.ts +5 -0
  334. package/dist/types/types/llm.d.ts +105 -0
  335. package/dist/types/types/messages.d.ts +4 -0
  336. package/dist/types/types/run.d.ts +112 -0
  337. package/dist/types/types/stream.d.ts +308 -0
  338. package/dist/types/types/tools.d.ts +296 -0
  339. package/dist/types/utils/contextAnalytics.d.ts +37 -0
  340. package/dist/types/utils/events.d.ts +6 -0
  341. package/dist/types/utils/graph.d.ts +2 -0
  342. package/dist/types/utils/handlers.d.ts +34 -0
  343. package/dist/types/utils/index.d.ts +9 -0
  344. package/dist/types/utils/llm.d.ts +3 -0
  345. package/dist/types/utils/llmConfig.d.ts +3 -0
  346. package/dist/types/utils/logging.d.ts +1 -0
  347. package/dist/types/utils/misc.d.ts +7 -0
  348. package/dist/types/utils/run.d.ts +27 -0
  349. package/dist/types/utils/schema.d.ts +8 -0
  350. package/dist/types/utils/title.d.ts +4 -0
  351. package/dist/types/utils/tokens.d.ts +28 -0
  352. package/dist/types/utils/toonFormat.d.ts +111 -0
  353. package/package.json +190 -0
  354. package/src/agents/AgentContext.test.ts +458 -0
  355. package/src/agents/AgentContext.ts +972 -0
  356. package/src/agents/__tests__/AgentContext.test.ts +805 -0
  357. package/src/agents/__tests__/resolveStructuredOutputMode.test.ts +137 -0
  358. package/src/common/enum.ts +203 -0
  359. package/src/common/index.ts +2 -0
  360. package/src/events.ts +223 -0
  361. package/src/graphs/Graph.ts +2228 -0
  362. package/src/graphs/MultiAgentGraph.ts +1063 -0
  363. package/src/graphs/__tests__/structured-output.integration.test.ts +809 -0
  364. package/src/graphs/__tests__/structured-output.test.ts +183 -0
  365. package/src/graphs/index.ts +2 -0
  366. package/src/index.ts +34 -0
  367. package/src/instrumentation.ts +22 -0
  368. package/src/llm/anthropic/Jacob_Lee_Resume_2023.pdf +0 -0
  369. package/src/llm/anthropic/index.ts +413 -0
  370. package/src/llm/anthropic/llm.spec.ts +1442 -0
  371. package/src/llm/anthropic/types.ts +140 -0
  372. package/src/llm/anthropic/utils/message_inputs.ts +757 -0
  373. package/src/llm/anthropic/utils/message_outputs.ts +289 -0
  374. package/src/llm/anthropic/utils/output_parsers.ts +133 -0
  375. package/src/llm/anthropic/utils/tools.ts +29 -0
  376. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +495 -0
  377. package/src/llm/bedrock/index.ts +411 -0
  378. package/src/llm/bedrock/llm.spec.ts +616 -0
  379. package/src/llm/bedrock/types.ts +51 -0
  380. package/src/llm/bedrock/utils/index.ts +18 -0
  381. package/src/llm/bedrock/utils/message_inputs.ts +563 -0
  382. package/src/llm/bedrock/utils/message_outputs.ts +310 -0
  383. package/src/llm/fake.ts +133 -0
  384. package/src/llm/google/data/gettysburg10.wav +0 -0
  385. package/src/llm/google/data/hotdog.jpg +0 -0
  386. package/src/llm/google/index.ts +337 -0
  387. package/src/llm/google/llm.spec.ts +934 -0
  388. package/src/llm/google/types.ts +56 -0
  389. package/src/llm/google/utils/common.ts +873 -0
  390. package/src/llm/google/utils/tools.ts +160 -0
  391. package/src/llm/google/utils/zod_to_genai_parameters.ts +86 -0
  392. package/src/llm/openai/index.ts +1366 -0
  393. package/src/llm/openai/types.ts +24 -0
  394. package/src/llm/openai/utils/index.ts +1035 -0
  395. package/src/llm/openai/utils/isReasoningModel.test.ts +90 -0
  396. package/src/llm/openrouter/index.ts +291 -0
  397. package/src/llm/providers.ts +52 -0
  398. package/src/llm/text.ts +94 -0
  399. package/src/llm/vertexai/index.ts +359 -0
  400. package/src/messages/__tests__/tools.test.ts +473 -0
  401. package/src/messages/cache.test.ts +1261 -0
  402. package/src/messages/cache.ts +518 -0
  403. package/src/messages/content.test.ts +362 -0
  404. package/src/messages/content.ts +63 -0
  405. package/src/messages/core.ts +473 -0
  406. package/src/messages/ensureThinkingBlock.test.ts +468 -0
  407. package/src/messages/format.ts +1029 -0
  408. package/src/messages/formatAgentMessages.test.ts +1513 -0
  409. package/src/messages/formatAgentMessages.tools.test.ts +419 -0
  410. package/src/messages/formatMessage.test.ts +693 -0
  411. package/src/messages/ids.ts +26 -0
  412. package/src/messages/index.ts +7 -0
  413. package/src/messages/labelContentByAgent.test.ts +887 -0
  414. package/src/messages/prune.ts +568 -0
  415. package/src/messages/reducer.ts +80 -0
  416. package/src/messages/shiftIndexTokenCountMap.test.ts +81 -0
  417. package/src/messages/tools.ts +108 -0
  418. package/src/mockStream.ts +99 -0
  419. package/src/prompts/collab.ts +6 -0
  420. package/src/prompts/index.ts +2 -0
  421. package/src/prompts/taskmanager.ts +61 -0
  422. package/src/run.ts +467 -0
  423. package/src/schemas/index.ts +2 -0
  424. package/src/schemas/schema-preparation.test.ts +500 -0
  425. package/src/schemas/validate.test.ts +358 -0
  426. package/src/schemas/validate.ts +454 -0
  427. package/src/scripts/abort.ts +157 -0
  428. package/src/scripts/ant_web_search.ts +158 -0
  429. package/src/scripts/ant_web_search_edge_case.ts +162 -0
  430. package/src/scripts/ant_web_search_error_edge_case.ts +148 -0
  431. package/src/scripts/args.ts +48 -0
  432. package/src/scripts/caching.ts +132 -0
  433. package/src/scripts/cli.ts +172 -0
  434. package/src/scripts/cli2.ts +133 -0
  435. package/src/scripts/cli3.ts +184 -0
  436. package/src/scripts/cli4.ts +191 -0
  437. package/src/scripts/cli5.ts +191 -0
  438. package/src/scripts/code_exec.ts +213 -0
  439. package/src/scripts/code_exec_files.ts +236 -0
  440. package/src/scripts/code_exec_multi_session.ts +241 -0
  441. package/src/scripts/code_exec_ptc.ts +334 -0
  442. package/src/scripts/code_exec_session.ts +282 -0
  443. package/src/scripts/code_exec_simple.ts +147 -0
  444. package/src/scripts/content.ts +138 -0
  445. package/src/scripts/empty_input.ts +137 -0
  446. package/src/scripts/handoff-test.ts +135 -0
  447. package/src/scripts/image.ts +178 -0
  448. package/src/scripts/memory.ts +97 -0
  449. package/src/scripts/multi-agent-chain.ts +331 -0
  450. package/src/scripts/multi-agent-conditional.ts +221 -0
  451. package/src/scripts/multi-agent-document-review-chain.ts +197 -0
  452. package/src/scripts/multi-agent-hybrid-flow.ts +310 -0
  453. package/src/scripts/multi-agent-parallel-start.ts +265 -0
  454. package/src/scripts/multi-agent-parallel.ts +394 -0
  455. package/src/scripts/multi-agent-sequence.ts +217 -0
  456. package/src/scripts/multi-agent-supervisor.ts +365 -0
  457. package/src/scripts/multi-agent-test.ts +186 -0
  458. package/src/scripts/parallel-asymmetric-tools-test.ts +274 -0
  459. package/src/scripts/parallel-full-metadata-test.ts +240 -0
  460. package/src/scripts/parallel-tools-test.ts +340 -0
  461. package/src/scripts/programmatic_exec.ts +396 -0
  462. package/src/scripts/programmatic_exec_agent.ts +231 -0
  463. package/src/scripts/search.ts +146 -0
  464. package/src/scripts/sequential-full-metadata-test.ts +197 -0
  465. package/src/scripts/simple.ts +225 -0
  466. package/src/scripts/single-agent-metadata-test.ts +198 -0
  467. package/src/scripts/stream.ts +140 -0
  468. package/src/scripts/test-custom-prompt-key.ts +145 -0
  469. package/src/scripts/test-handoff-input.ts +170 -0
  470. package/src/scripts/test-handoff-preamble.ts +277 -0
  471. package/src/scripts/test-multi-agent-list-handoff.ts +417 -0
  472. package/src/scripts/test-parallel-agent-labeling.ts +325 -0
  473. package/src/scripts/test-parallel-handoffs.ts +291 -0
  474. package/src/scripts/test-thinking-handoff-bedrock.ts +153 -0
  475. package/src/scripts/test-thinking-handoff.ts +155 -0
  476. package/src/scripts/test-tools-before-handoff.ts +226 -0
  477. package/src/scripts/test_code_api.ts +361 -0
  478. package/src/scripts/thinking-bedrock.ts +159 -0
  479. package/src/scripts/thinking.ts +171 -0
  480. package/src/scripts/tool_search.ts +162 -0
  481. package/src/scripts/tools.ts +177 -0
  482. package/src/specs/agent-handoffs.test.ts +888 -0
  483. package/src/specs/anthropic.simple.test.ts +387 -0
  484. package/src/specs/azure.simple.test.ts +364 -0
  485. package/src/specs/cache.simple.test.ts +396 -0
  486. package/src/specs/deepseek.simple.test.ts +283 -0
  487. package/src/specs/emergency-prune.test.ts +407 -0
  488. package/src/specs/moonshot.simple.test.ts +358 -0
  489. package/src/specs/openai.simple.test.ts +311 -0
  490. package/src/specs/openrouter.simple.test.ts +107 -0
  491. package/src/specs/prune.test.ts +901 -0
  492. package/src/specs/reasoning.test.ts +201 -0
  493. package/src/specs/spec.utils.ts +3 -0
  494. package/src/specs/thinking-handoff.test.ts +620 -0
  495. package/src/specs/thinking-prune.test.ts +703 -0
  496. package/src/specs/token-distribution-edge-case.test.ts +316 -0
  497. package/src/specs/token-memoization.test.ts +32 -0
  498. package/src/specs/tool-error.test.ts +198 -0
  499. package/src/splitStream.test.ts +691 -0
  500. package/src/splitStream.ts +234 -0
  501. package/src/stream.test.ts +94 -0
  502. package/src/stream.ts +801 -0
  503. package/src/test/mockTools.ts +386 -0
  504. package/src/tools/BrowserTools.ts +393 -0
  505. package/src/tools/Calculator.test.ts +278 -0
  506. package/src/tools/Calculator.ts +46 -0
  507. package/src/tools/CodeExecutor.ts +270 -0
  508. package/src/tools/ProgrammaticToolCalling.ts +785 -0
  509. package/src/tools/ToolNode.ts +674 -0
  510. package/src/tools/ToolSearch.ts +1095 -0
  511. package/src/tools/__tests__/BrowserTools.test.ts +265 -0
  512. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.ts +319 -0
  513. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +1006 -0
  514. package/src/tools/__tests__/ToolSearch.integration.test.ts +162 -0
  515. package/src/tools/__tests__/ToolSearch.test.ts +1003 -0
  516. package/src/tools/handlers.ts +363 -0
  517. package/src/tools/schema.ts +37 -0
  518. package/src/tools/search/anthropic.ts +51 -0
  519. package/src/tools/search/content.test.ts +173 -0
  520. package/src/tools/search/content.ts +147 -0
  521. package/src/tools/search/firecrawl.ts +210 -0
  522. package/src/tools/search/format.ts +250 -0
  523. package/src/tools/search/highlights.ts +320 -0
  524. package/src/tools/search/index.ts +3 -0
  525. package/src/tools/search/jina-reranker.test.ts +130 -0
  526. package/src/tools/search/output.md +2775 -0
  527. package/src/tools/search/rerankers.ts +242 -0
  528. package/src/tools/search/schema.ts +113 -0
  529. package/src/tools/search/search.ts +768 -0
  530. package/src/tools/search/serper-scraper.ts +155 -0
  531. package/src/tools/search/test.html +884 -0
  532. package/src/tools/search/test.md +643 -0
  533. package/src/tools/search/test.ts +159 -0
  534. package/src/tools/search/tool.ts +657 -0
  535. package/src/tools/search/types.ts +665 -0
  536. package/src/tools/search/utils.ts +79 -0
  537. package/src/types/graph.test.ts +218 -0
  538. package/src/types/graph.ts +533 -0
  539. package/src/types/index.ts +6 -0
  540. package/src/types/llm.ts +140 -0
  541. package/src/types/messages.ts +4 -0
  542. package/src/types/run.ts +128 -0
  543. package/src/types/stream.ts +417 -0
  544. package/src/types/tools.ts +355 -0
  545. package/src/utils/contextAnalytics.ts +103 -0
  546. package/src/utils/events.ts +32 -0
  547. package/src/utils/graph.ts +11 -0
  548. package/src/utils/handlers.ts +107 -0
  549. package/src/utils/index.ts +9 -0
  550. package/src/utils/llm.ts +26 -0
  551. package/src/utils/llmConfig.ts +208 -0
  552. package/src/utils/logging.ts +48 -0
  553. package/src/utils/misc.ts +57 -0
  554. package/src/utils/run.ts +106 -0
  555. package/src/utils/schema.ts +35 -0
  556. package/src/utils/title.ts +177 -0
  557. package/src/utils/tokens.ts +142 -0
  558. package/src/utils/toonFormat.ts +475 -0
@@ -0,0 +1,1029 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import {
3
+ AIMessage,
4
+ AIMessageChunk,
5
+ ToolMessage,
6
+ BaseMessage,
7
+ HumanMessage,
8
+ SystemMessage,
9
+ getBufferString,
10
+ } from '@langchain/core/messages';
11
+ import type { MessageContentImageUrl } from '@langchain/core/messages';
12
+ import type { ToolCall } from '@langchain/core/messages/tool';
13
+ import type {
14
+ ExtendedMessageContent,
15
+ MessageContentComplex,
16
+ ReasoningContentText,
17
+ ToolCallContent,
18
+ ToolCallPart,
19
+ TPayload,
20
+ TMessage,
21
+ } from '@/types';
22
+ import { Providers, ContentTypes, Constants, MessageTypes } from '@/common';
23
+ import { processToolOutput } from '@/utils/toonFormat';
24
+
25
+ interface MediaMessageParams {
26
+ message: {
27
+ role: string;
28
+ content: string;
29
+ name?: string;
30
+ [key: string]: any;
31
+ };
32
+ mediaParts: MessageContentComplex[];
33
+ endpoint?: Providers;
34
+ }
35
+
36
+ /**
37
+ * Formats a message with media content (images, documents, videos, audios) to API payload format.
38
+ *
39
+ * @param params - The parameters for formatting.
40
+ * @returns - The formatted message.
41
+ */
42
+ export const formatMediaMessage = ({
43
+ message,
44
+ endpoint,
45
+ mediaParts,
46
+ }: MediaMessageParams): {
47
+ role: string;
48
+ content: MessageContentComplex[];
49
+ name?: string;
50
+ [key: string]: any;
51
+ } => {
52
+ // Create a new object to avoid mutating the input
53
+ const result: {
54
+ role: string;
55
+ content: MessageContentComplex[];
56
+ name?: string;
57
+ [key: string]: any;
58
+ } = {
59
+ ...message,
60
+ content: [] as MessageContentComplex[],
61
+ };
62
+
63
+ if (endpoint === Providers.ANTHROPIC) {
64
+ result.content = [
65
+ ...mediaParts,
66
+ { type: ContentTypes.TEXT, text: message.content },
67
+ ] as MessageContentComplex[];
68
+ return result;
69
+ }
70
+
71
+ result.content = [
72
+ { type: ContentTypes.TEXT, text: message.content },
73
+ ...mediaParts,
74
+ ] as MessageContentComplex[];
75
+
76
+ return result;
77
+ };
78
+
79
+ interface MessageInput {
80
+ role?: string;
81
+ _name?: string;
82
+ sender?: string;
83
+ text?: string;
84
+ content?: string | MessageContentComplex[];
85
+ image_urls?: MessageContentImageUrl[];
86
+ documents?: MessageContentComplex[];
87
+ videos?: MessageContentComplex[];
88
+ audios?: MessageContentComplex[];
89
+ lc_id?: string[];
90
+ [key: string]: any;
91
+ }
92
+
93
+ interface FormatMessageParams {
94
+ message: MessageInput;
95
+ userName?: string;
96
+ assistantName?: string;
97
+ endpoint?: Providers;
98
+ langChain?: boolean;
99
+ }
100
+
101
+ interface FormattedMessage {
102
+ role: string;
103
+ content: string | MessageContentComplex[];
104
+ name?: string;
105
+ [key: string]: any;
106
+ }
107
+
108
+ /**
109
+ * Formats a message to OpenAI payload format based on the provided options.
110
+ *
111
+ * @param params - The parameters for formatting.
112
+ * @returns - The formatted message.
113
+ */
114
+ export const formatMessage = ({
115
+ message,
116
+ userName,
117
+ endpoint,
118
+ assistantName,
119
+ langChain = false,
120
+ }: FormatMessageParams):
121
+ | FormattedMessage
122
+ | HumanMessage
123
+ | AIMessage
124
+ | SystemMessage => {
125
+ // eslint-disable-next-line prefer-const
126
+ let { role: _role, _name, sender, text, content: _content, lc_id } = message;
127
+ if (lc_id && lc_id[2] && !langChain) {
128
+ const roleMapping: Record<string, string> = {
129
+ SystemMessage: 'system',
130
+ HumanMessage: 'user',
131
+ AIMessage: 'assistant',
132
+ };
133
+ _role = roleMapping[lc_id[2]] || _role;
134
+ }
135
+ const role =
136
+ _role ??
137
+ (sender != null && sender && sender.toLowerCase() === 'user'
138
+ ? 'user'
139
+ : 'assistant');
140
+ const content = _content ?? text ?? '';
141
+ const formattedMessage: FormattedMessage = {
142
+ role,
143
+ content,
144
+ };
145
+
146
+ // Set name fields first
147
+ if (_name != null && _name) {
148
+ formattedMessage.name = _name;
149
+ }
150
+
151
+ if (userName != null && userName && formattedMessage.role === 'user') {
152
+ formattedMessage.name = userName;
153
+ }
154
+
155
+ if (
156
+ assistantName != null &&
157
+ assistantName &&
158
+ formattedMessage.role === 'assistant'
159
+ ) {
160
+ formattedMessage.name = assistantName;
161
+ }
162
+
163
+ if (formattedMessage.name != null && formattedMessage.name) {
164
+ // Conform to API regex: ^[a-zA-Z0-9_-]{1,64}$
165
+ // https://community.openai.com/t/the-format-of-the-name-field-in-the-documentation-is-incorrect/175684/2
166
+ formattedMessage.name = formattedMessage.name.replace(
167
+ /[^a-zA-Z0-9_-]/g,
168
+ '_'
169
+ );
170
+
171
+ if (formattedMessage.name.length > 64) {
172
+ formattedMessage.name = formattedMessage.name.substring(0, 64);
173
+ }
174
+ }
175
+
176
+ const { image_urls, documents, videos, audios } = message;
177
+ const mediaParts: MessageContentComplex[] = [];
178
+
179
+ if (Array.isArray(documents) && documents.length > 0) {
180
+ mediaParts.push(...documents);
181
+ }
182
+
183
+ if (Array.isArray(videos) && videos.length > 0) {
184
+ mediaParts.push(...videos);
185
+ }
186
+
187
+ if (Array.isArray(audios) && audios.length > 0) {
188
+ mediaParts.push(...audios);
189
+ }
190
+
191
+ if (Array.isArray(image_urls) && image_urls.length > 0) {
192
+ mediaParts.push(...image_urls);
193
+ }
194
+
195
+ if (mediaParts.length > 0 && role === 'user') {
196
+ const mediaMessage = formatMediaMessage({
197
+ message: {
198
+ ...formattedMessage,
199
+ content:
200
+ typeof formattedMessage.content === 'string'
201
+ ? formattedMessage.content
202
+ : '',
203
+ },
204
+ mediaParts,
205
+ endpoint,
206
+ });
207
+
208
+ if (!langChain) {
209
+ return mediaMessage;
210
+ }
211
+
212
+ return new HumanMessage(mediaMessage);
213
+ }
214
+
215
+ if (!langChain) {
216
+ return formattedMessage;
217
+ }
218
+
219
+ if (role === 'user') {
220
+ return new HumanMessage(formattedMessage);
221
+ } else if (role === 'assistant') {
222
+ return new AIMessage(formattedMessage);
223
+ } else {
224
+ return new SystemMessage(formattedMessage);
225
+ }
226
+ };
227
+
228
+ /**
229
+ * Formats an array of messages for LangChain.
230
+ *
231
+ * @param messages - The array of messages to format.
232
+ * @param formatOptions - The options for formatting each message.
233
+ * @returns - The array of formatted LangChain messages.
234
+ */
235
+ export const formatLangChainMessages = (
236
+ messages: Array<MessageInput>,
237
+ formatOptions: Omit<FormatMessageParams, 'message' | 'langChain'>
238
+ ): Array<HumanMessage | AIMessage | SystemMessage> => {
239
+ return messages.map((msg) => {
240
+ const formatted = formatMessage({
241
+ ...formatOptions,
242
+ message: msg,
243
+ langChain: true,
244
+ });
245
+ return formatted as HumanMessage | AIMessage | SystemMessage;
246
+ });
247
+ };
248
+
249
+ interface LangChainMessage {
250
+ lc_kwargs?: {
251
+ additional_kwargs?: Record<string, any>;
252
+ [key: string]: any;
253
+ };
254
+ kwargs?: {
255
+ additional_kwargs?: Record<string, any>;
256
+ [key: string]: any;
257
+ };
258
+ [key: string]: any;
259
+ }
260
+
261
+ /**
262
+ * Formats a LangChain message object by merging properties from `lc_kwargs` or `kwargs` and `additional_kwargs`.
263
+ *
264
+ * @param message - The message object to format.
265
+ * @returns - The formatted LangChain message.
266
+ */
267
+ export const formatFromLangChain = (
268
+ message: LangChainMessage
269
+ ): Record<string, any> => {
270
+ const kwargs = message.lc_kwargs ?? message.kwargs ?? {};
271
+ const { additional_kwargs = {}, ...message_kwargs } = kwargs;
272
+ return {
273
+ ...message_kwargs,
274
+ ...additional_kwargs,
275
+ };
276
+ };
277
+
278
+ /**
279
+ * Helper function to format an assistant message
280
+ * @param message The message to format
281
+ * @returns Array of formatted messages
282
+ */
283
+ function formatAssistantMessage(
284
+ message: Partial<TMessage>
285
+ ): Array<AIMessage | ToolMessage> {
286
+ const formattedMessages: Array<AIMessage | ToolMessage> = [];
287
+ let currentContent: MessageContentComplex[] = [];
288
+ let lastAIMessage: AIMessage | null = null;
289
+ let hasReasoning = false;
290
+
291
+ if (Array.isArray(message.content)) {
292
+ for (const part of message.content) {
293
+ if (part.type === ContentTypes.TEXT && part.tool_call_ids) {
294
+ /*
295
+ If there's pending content, it needs to be aggregated as a single string to prepare for tool calls.
296
+ For Anthropic models, the "tool_calls" field on a message is only respected if content is a string.
297
+ */
298
+ if (currentContent.length > 0) {
299
+ let content = currentContent.reduce((acc, curr) => {
300
+ if (curr.type === ContentTypes.TEXT) {
301
+ return `${acc}${String(curr[ContentTypes.TEXT] ?? '')}\n`;
302
+ }
303
+ return acc;
304
+ }, '');
305
+ content =
306
+ `${content}\n${part[ContentTypes.TEXT] ?? part.text ?? ''}`.trim();
307
+ lastAIMessage = new AIMessage({ content });
308
+ formattedMessages.push(lastAIMessage);
309
+ currentContent = [];
310
+ continue;
311
+ }
312
+ // Create a new AIMessage with this text and prepare for tool calls
313
+ lastAIMessage = new AIMessage({
314
+ content: part.text != null ? part.text : '',
315
+ });
316
+ formattedMessages.push(lastAIMessage);
317
+ } else if (part.type === ContentTypes.TOOL_CALL) {
318
+ // Skip malformed tool call entries without tool_call property
319
+ if (part.tool_call == null) {
320
+ continue;
321
+ }
322
+
323
+ // Note: `tool_calls` list is defined when constructed by `AIMessage` class, and outputs should be excluded from it
324
+ const {
325
+ output,
326
+ args: _args,
327
+ ..._tool_call
328
+ } = part.tool_call as ToolCallPart;
329
+
330
+ // Skip invalid tool calls that have no name AND no output
331
+ if (
332
+ _tool_call.name == null ||
333
+ (_tool_call.name === '' && (output == null || output === ''))
334
+ ) {
335
+ continue;
336
+ }
337
+
338
+ if (!lastAIMessage) {
339
+ // "Heal" the payload by creating an AIMessage to precede the tool call
340
+ lastAIMessage = new AIMessage({ content: '' });
341
+ formattedMessages.push(lastAIMessage);
342
+ }
343
+
344
+ const tool_call: ToolCallPart = _tool_call;
345
+ // TODO: investigate; args as dictionary may need to be providers-or-tool-specific
346
+ let args: any = _args;
347
+ try {
348
+ if (typeof _args === 'string') {
349
+ args = JSON.parse(_args);
350
+ }
351
+ } catch {
352
+ if (typeof _args === 'string') {
353
+ args = { input: _args };
354
+ }
355
+ }
356
+
357
+ tool_call.args = args;
358
+ if (!lastAIMessage.tool_calls) {
359
+ lastAIMessage.tool_calls = [];
360
+ }
361
+ lastAIMessage.tool_calls.push(tool_call as ToolCall);
362
+
363
+ // Apply TOON compression to historical tool outputs for context efficiency
364
+ // processToolOutput handles: JSON→TOON conversion, already-TOON detection (skip), truncation
365
+ const processedOutput =
366
+ output != null ? processToolOutput(output).content : '';
367
+
368
+ formattedMessages.push(
369
+ new ToolMessage({
370
+ tool_call_id: tool_call.id ?? '',
371
+ name: tool_call.name,
372
+ content: processedOutput,
373
+ })
374
+ );
375
+ } else if (part.type === ContentTypes.THINK) {
376
+ hasReasoning = true;
377
+ continue;
378
+ } else if (
379
+ part.type === ContentTypes.ERROR ||
380
+ part.type === ContentTypes.AGENT_UPDATE
381
+ ) {
382
+ continue;
383
+ } else {
384
+ currentContent.push(part);
385
+ }
386
+ }
387
+ }
388
+
389
+ if (hasReasoning && currentContent.length > 0) {
390
+ const content = currentContent
391
+ .reduce((acc, curr) => {
392
+ if (curr.type === ContentTypes.TEXT) {
393
+ return `${acc}${String(curr[ContentTypes.TEXT] ?? '')}\n`;
394
+ }
395
+ return acc;
396
+ }, '')
397
+ .trim();
398
+
399
+ if (content) {
400
+ formattedMessages.push(new AIMessage({ content }));
401
+ }
402
+ } else if (currentContent.length > 0) {
403
+ formattedMessages.push(new AIMessage({ content: currentContent }));
404
+ }
405
+
406
+ return formattedMessages;
407
+ }
408
+
409
+ /**
410
+ * Labels all agent content for parallel patterns (fan-out/fan-in)
411
+ * Groups consecutive content by agent and wraps with clear labels
412
+ */
413
+ function labelAllAgentContent(
414
+ contentParts: MessageContentComplex[],
415
+ agentIdMap: Record<number, string>,
416
+ agentNames?: Record<string, string>
417
+ ): MessageContentComplex[] {
418
+ const result: MessageContentComplex[] = [];
419
+ let currentAgentId: string | undefined;
420
+ let agentContentBuffer: MessageContentComplex[] = [];
421
+
422
+ const flushAgentBuffer = (): void => {
423
+ if (agentContentBuffer.length === 0) {
424
+ return;
425
+ }
426
+
427
+ if (currentAgentId != null && currentAgentId !== '') {
428
+ const agentName = (agentNames?.[currentAgentId] ?? '') || currentAgentId;
429
+ const formattedParts: string[] = [];
430
+
431
+ formattedParts.push(`--- ${agentName} ---`);
432
+
433
+ for (const part of agentContentBuffer) {
434
+ if (part.type === ContentTypes.THINK) {
435
+ const thinkContent = (part as ReasoningContentText).think || '';
436
+ if (thinkContent) {
437
+ formattedParts.push(
438
+ `${agentName}: ${JSON.stringify({
439
+ type: 'think',
440
+ think: thinkContent,
441
+ })}`
442
+ );
443
+ }
444
+ } else if (part.type === ContentTypes.TEXT) {
445
+ const textContent: string = part.text ?? '';
446
+ if (textContent) {
447
+ formattedParts.push(`${agentName}: ${textContent}`);
448
+ }
449
+ } else if (part.type === ContentTypes.TOOL_CALL) {
450
+ formattedParts.push(
451
+ `${agentName}: ${JSON.stringify({
452
+ type: 'tool_call',
453
+ tool_call: (part as ToolCallContent).tool_call,
454
+ })}`
455
+ );
456
+ }
457
+ }
458
+
459
+ formattedParts.push(`--- End of ${agentName} ---`);
460
+
461
+ // Create a single text content part with all agent content
462
+ result.push({
463
+ type: ContentTypes.TEXT,
464
+ text: formattedParts.join('\n\n'),
465
+ } as MessageContentComplex);
466
+ } else {
467
+ // No agent ID, pass through as-is
468
+ result.push(...agentContentBuffer);
469
+ }
470
+
471
+ agentContentBuffer = [];
472
+ };
473
+
474
+ for (let i = 0; i < contentParts.length; i++) {
475
+ const part = contentParts[i];
476
+ const agentId = agentIdMap[i];
477
+
478
+ // If agent changed, flush previous buffer
479
+ if (agentId !== currentAgentId && currentAgentId !== undefined) {
480
+ flushAgentBuffer();
481
+ }
482
+
483
+ currentAgentId = agentId;
484
+ agentContentBuffer.push(part);
485
+ }
486
+
487
+ // Flush any remaining content
488
+ flushAgentBuffer();
489
+
490
+ return result;
491
+ }
492
+
493
+ /**
494
+ * Groups content parts by agent and formats them with agent labels
495
+ * This preprocesses multi-agent content to prevent identity confusion
496
+ *
497
+ * @param contentParts - The content parts from a run
498
+ * @param agentIdMap - Map of content part index to agent ID
499
+ * @param agentNames - Optional map of agent ID to display name
500
+ * @param options - Configuration options
501
+ * @param options.labelNonTransferContent - If true, labels all agent transitions (for parallel patterns)
502
+ * @returns Modified content parts with agent labels where appropriate
503
+ */
504
+ export const labelContentByAgent = (
505
+ contentParts: MessageContentComplex[],
506
+ agentIdMap?: Record<number, string>,
507
+ agentNames?: Record<string, string>,
508
+ options?: { labelNonTransferContent?: boolean }
509
+ ): MessageContentComplex[] => {
510
+ if (!agentIdMap || Object.keys(agentIdMap).length === 0) {
511
+ return contentParts;
512
+ }
513
+
514
+ // If labelNonTransferContent is true, use a different strategy for parallel patterns
515
+ if (options?.labelNonTransferContent === true) {
516
+ return labelAllAgentContent(contentParts, agentIdMap, agentNames);
517
+ }
518
+
519
+ const result: MessageContentComplex[] = [];
520
+ let currentAgentId: string | undefined;
521
+ let agentContentBuffer: MessageContentComplex[] = [];
522
+ let transferToolCallIndex: number | undefined;
523
+ let transferToolCallId: string | undefined;
524
+
525
+ const flushAgentBuffer = (): void => {
526
+ if (agentContentBuffer.length === 0) {
527
+ return;
528
+ }
529
+
530
+ // If this is content from a transferred agent, format it specially
531
+ if (
532
+ currentAgentId != null &&
533
+ currentAgentId !== '' &&
534
+ transferToolCallIndex !== undefined
535
+ ) {
536
+ const agentName = (agentNames?.[currentAgentId] ?? '') || currentAgentId;
537
+ const formattedParts: string[] = [];
538
+
539
+ formattedParts.push(`--- Transfer to ${agentName} ---`);
540
+
541
+ for (const part of agentContentBuffer) {
542
+ if (part.type === ContentTypes.THINK) {
543
+ formattedParts.push(
544
+ `${agentName}: ${JSON.stringify({
545
+ type: 'think',
546
+ think: (part as ReasoningContentText).think,
547
+ })}`
548
+ );
549
+ } else if ('text' in part && part.type === ContentTypes.TEXT) {
550
+ const textContent: string = part.text ?? '';
551
+ if (textContent) {
552
+ formattedParts.push(
553
+ `${agentName}: ${JSON.stringify({
554
+ type: 'text',
555
+ text: textContent,
556
+ })}`
557
+ );
558
+ }
559
+ } else if (part.type === ContentTypes.TOOL_CALL) {
560
+ formattedParts.push(
561
+ `${agentName}: ${JSON.stringify({
562
+ type: 'tool_call',
563
+ tool_call: (part as ToolCallContent).tool_call,
564
+ })}`
565
+ );
566
+ }
567
+ }
568
+
569
+ formattedParts.push(`--- End of ${agentName} response ---`);
570
+
571
+ // Find the tool call that triggered this transfer and update its output
572
+ if (transferToolCallIndex < result.length) {
573
+ const transferToolCall = result[transferToolCallIndex];
574
+ if (
575
+ transferToolCall.type === ContentTypes.TOOL_CALL &&
576
+ transferToolCall.tool_call?.id === transferToolCallId
577
+ ) {
578
+ transferToolCall.tool_call.output = formattedParts.join('\n\n');
579
+ }
580
+ }
581
+ } else {
582
+ // Not from a transfer, add as-is
583
+ result.push(...agentContentBuffer);
584
+ }
585
+
586
+ agentContentBuffer = [];
587
+ transferToolCallIndex = undefined;
588
+ transferToolCallId = undefined;
589
+ };
590
+
591
+ for (let i = 0; i < contentParts.length; i++) {
592
+ const part = contentParts[i];
593
+ const agentId = agentIdMap[i];
594
+
595
+ // Check if this is a transfer tool call
596
+ const isTransferTool =
597
+ (part.type === ContentTypes.TOOL_CALL &&
598
+ (part as ToolCallContent).tool_call?.name?.startsWith(
599
+ 'lc_transfer_to_'
600
+ )) ??
601
+ false;
602
+
603
+ // If agent changed, flush previous buffer
604
+ if (agentId !== currentAgentId && currentAgentId !== undefined) {
605
+ flushAgentBuffer();
606
+ }
607
+
608
+ currentAgentId = agentId;
609
+
610
+ if (isTransferTool) {
611
+ // Flush any existing buffer first
612
+ flushAgentBuffer();
613
+ // Add the transfer tool call to result
614
+ result.push(part);
615
+ // Mark that the next agent's content should be captured
616
+ transferToolCallIndex = result.length - 1;
617
+ transferToolCallId = (part as ToolCallContent).tool_call?.id;
618
+ currentAgentId = undefined; // Reset to capture the next agent
619
+ } else {
620
+ agentContentBuffer.push(part);
621
+ }
622
+ }
623
+
624
+ flushAgentBuffer();
625
+
626
+ return result;
627
+ };
628
+
629
+ /** Extracts tool names from a tool_search output JSON string. */
630
+ function extractToolNamesFromSearchOutput(output: string): string[] {
631
+ try {
632
+ const parsed: unknown = JSON.parse(output);
633
+ if (
634
+ typeof parsed === 'object' &&
635
+ parsed !== null &&
636
+ Array.isArray((parsed as Record<string, unknown>).tools)
637
+ ) {
638
+ return (
639
+ (parsed as Record<string, unknown>).tools as Array<{ name?: string }>
640
+ )
641
+ .map((t) => t.name)
642
+ .filter((name): name is string => typeof name === 'string');
643
+ }
644
+ } catch {
645
+ /** Output may have warnings prepended, try to find JSON within it */
646
+ const jsonMatch = output.match(/\{[\s\S]*\}/);
647
+ if (jsonMatch) {
648
+ try {
649
+ const parsed: unknown = JSON.parse(jsonMatch[0]);
650
+ if (
651
+ typeof parsed === 'object' &&
652
+ parsed !== null &&
653
+ Array.isArray((parsed as Record<string, unknown>).tools)
654
+ ) {
655
+ return (
656
+ (parsed as Record<string, unknown>).tools as Array<{
657
+ name?: string;
658
+ }>
659
+ )
660
+ .map((t) => t.name)
661
+ .filter((name): name is string => typeof name === 'string');
662
+ }
663
+ } catch {
664
+ /* ignore */
665
+ }
666
+ }
667
+ }
668
+ return [];
669
+ }
670
+
671
+ /**
672
+ * Formats an array of messages for LangChain, handling tool calls and creating ToolMessage instances.
673
+ *
674
+ * @param payload - The array of messages to format.
675
+ * @param indexTokenCountMap - Optional map of message indices to token counts.
676
+ * @param tools - Optional set of tool names that are allowed in the request.
677
+ * @returns - Object containing formatted messages and updated indexTokenCountMap if provided.
678
+ */
679
+ export const formatAgentMessages = (
680
+ payload: TPayload,
681
+ indexTokenCountMap?: Record<number, number | undefined>,
682
+ tools?: Set<string>
683
+ ): {
684
+ messages: Array<HumanMessage | AIMessage | SystemMessage | ToolMessage>;
685
+ indexTokenCountMap?: Record<number, number>;
686
+ } => {
687
+ const messages: Array<
688
+ HumanMessage | AIMessage | SystemMessage | ToolMessage
689
+ > = [];
690
+ // If indexTokenCountMap is provided, create a new map to track the updated indices
691
+ const updatedIndexTokenCountMap: Record<number, number> = {};
692
+ // Keep track of the mapping from original payload indices to result indices
693
+ const indexMapping: Record<number, number[] | undefined> = {};
694
+
695
+ /**
696
+ * Create a mutable copy of the tools set that can be expanded dynamically.
697
+ * When we encounter tool_search results, we add discovered tools to this set,
698
+ * making their subsequent tool calls valid.
699
+ */
700
+ const discoveredTools = tools ? new Set(tools) : undefined;
701
+
702
+ // Process messages with tool conversion if tools set is provided
703
+ for (let i = 0; i < payload.length; i++) {
704
+ const message = payload[i];
705
+ // Q: Store the current length of messages to track where this payload message starts in the result?
706
+ // const startIndex = messages.length;
707
+ if (typeof message.content === 'string') {
708
+ message.content = [
709
+ { type: ContentTypes.TEXT, [ContentTypes.TEXT]: message.content },
710
+ ];
711
+ }
712
+ if (message.role !== 'assistant') {
713
+ messages.push(
714
+ formatMessage({
715
+ message: message as MessageInput,
716
+ langChain: true,
717
+ }) as HumanMessage | AIMessage | SystemMessage
718
+ );
719
+
720
+ // Update the index mapping for this message
721
+ indexMapping[i] = [messages.length - 1];
722
+ continue;
723
+ }
724
+
725
+ // For assistant messages, track the starting index before processing
726
+ const startMessageIndex = messages.length;
727
+
728
+ /**
729
+ * If tools set is provided, process tool_calls:
730
+ * - Keep valid tool_calls (tools in the set or dynamically discovered)
731
+ * - Convert invalid tool_calls to string representation for context preservation
732
+ * - Dynamically expand the set when tool_search results are encountered
733
+ */
734
+ let processedMessage = message;
735
+ if (discoveredTools) {
736
+ const content = message.content;
737
+ if (content && Array.isArray(content)) {
738
+ const filteredContent: typeof content = [];
739
+ const invalidToolCallIds = new Set<string>();
740
+ const invalidToolStrings: string[] = [];
741
+
742
+ for (const part of content) {
743
+ if (part.type !== ContentTypes.TOOL_CALL) {
744
+ filteredContent.push(part);
745
+ continue;
746
+ }
747
+
748
+ /** Skip malformed tool_call entries */
749
+ if (
750
+ part.tool_call == null ||
751
+ part.tool_call.name == null ||
752
+ part.tool_call.name === ''
753
+ ) {
754
+ if (
755
+ typeof part.tool_call?.id === 'string' &&
756
+ part.tool_call.id !== ''
757
+ ) {
758
+ invalidToolCallIds.add(part.tool_call.id);
759
+ }
760
+ continue;
761
+ }
762
+
763
+ const toolName = part.tool_call.name;
764
+
765
+ /**
766
+ * If this is a tool_search result with output, extract discovered tool names
767
+ * and add them to the discoveredTools set for subsequent validation.
768
+ */
769
+ if (
770
+ toolName === Constants.TOOL_SEARCH &&
771
+ typeof part.tool_call.output === 'string' &&
772
+ part.tool_call.output !== ''
773
+ ) {
774
+ const extracted = extractToolNamesFromSearchOutput(
775
+ part.tool_call.output
776
+ );
777
+ for (const name of extracted) {
778
+ discoveredTools.add(name);
779
+ }
780
+ }
781
+
782
+ if (discoveredTools.has(toolName)) {
783
+ /** Valid tool - keep it */
784
+ filteredContent.push(part);
785
+ } else {
786
+ /** Invalid tool - convert to string for context preservation */
787
+ if (
788
+ typeof part.tool_call.id === 'string' &&
789
+ part.tool_call.id !== ''
790
+ ) {
791
+ invalidToolCallIds.add(part.tool_call.id);
792
+ }
793
+ const output = part.tool_call.output ?? '';
794
+ invalidToolStrings.push(`Tool: ${toolName}, ${output}`);
795
+ }
796
+ }
797
+
798
+ /** Remove tool_call_ids references to invalid tools from text parts */
799
+ if (invalidToolCallIds.size > 0) {
800
+ for (const part of filteredContent) {
801
+ if (
802
+ part.type === ContentTypes.TEXT &&
803
+ Array.isArray(part.tool_call_ids)
804
+ ) {
805
+ part.tool_call_ids = part.tool_call_ids.filter(
806
+ (id: string) => !invalidToolCallIds.has(id)
807
+ );
808
+ if (part.tool_call_ids.length === 0) {
809
+ delete part.tool_call_ids;
810
+ }
811
+ }
812
+ }
813
+ }
814
+
815
+ /** Append invalid tool strings to the content for context preservation */
816
+ if (invalidToolStrings.length > 0) {
817
+ /** Find the last text part or create one */
818
+ let lastTextPartIndex = -1;
819
+ for (let j = filteredContent.length - 1; j >= 0; j--) {
820
+ if (filteredContent[j].type === ContentTypes.TEXT) {
821
+ lastTextPartIndex = j;
822
+ break;
823
+ }
824
+ }
825
+
826
+ const invalidToolText = invalidToolStrings.join('\n');
827
+ if (lastTextPartIndex >= 0) {
828
+ const lastTextPart = filteredContent[lastTextPartIndex] as {
829
+ type: string;
830
+ [ContentTypes.TEXT]?: string;
831
+ text?: string;
832
+ };
833
+ const existingText =
834
+ lastTextPart[ContentTypes.TEXT] ?? lastTextPart.text ?? '';
835
+ filteredContent[lastTextPartIndex] = {
836
+ ...lastTextPart,
837
+ [ContentTypes.TEXT]: existingText
838
+ ? `${existingText}\n${invalidToolText}`
839
+ : invalidToolText,
840
+ };
841
+ } else {
842
+ /** No text part exists, create one */
843
+ filteredContent.push({
844
+ type: ContentTypes.TEXT,
845
+ [ContentTypes.TEXT]: invalidToolText,
846
+ });
847
+ }
848
+ }
849
+
850
+ /** Use filtered content if we made any changes */
851
+ if (
852
+ filteredContent.length !== content.length ||
853
+ invalidToolStrings.length > 0
854
+ ) {
855
+ processedMessage = { ...message, content: filteredContent };
856
+ }
857
+ }
858
+ }
859
+
860
+ // Process the assistant message using the helper function
861
+ const formattedMessages = formatAssistantMessage(processedMessage);
862
+ messages.push(...formattedMessages);
863
+
864
+ // Update the index mapping for this assistant message
865
+ // Store all indices that were created from this original message
866
+ const endMessageIndex = messages.length;
867
+ const resultIndices = [];
868
+ for (let j = startMessageIndex; j < endMessageIndex; j++) {
869
+ resultIndices.push(j);
870
+ }
871
+ indexMapping[i] = resultIndices;
872
+ }
873
+
874
+ // Update the token count map if it was provided
875
+ if (indexTokenCountMap) {
876
+ for (
877
+ let originalIndex = 0;
878
+ originalIndex < payload.length;
879
+ originalIndex++
880
+ ) {
881
+ const resultIndices = indexMapping[originalIndex] || [];
882
+ const tokenCount = indexTokenCountMap[originalIndex];
883
+
884
+ if (tokenCount !== undefined) {
885
+ if (resultIndices.length === 1) {
886
+ // Simple 1:1 mapping
887
+ updatedIndexTokenCountMap[resultIndices[0]] = tokenCount;
888
+ } else if (resultIndices.length > 1) {
889
+ // If one message was split into multiple, distribute the token count
890
+ // This is a simplification - in reality, you might want a more sophisticated distribution
891
+ const countPerMessage = Math.floor(tokenCount / resultIndices.length);
892
+ resultIndices.forEach((resultIndex, idx) => {
893
+ if (idx === resultIndices.length - 1) {
894
+ // Give any remainder to the last message
895
+ updatedIndexTokenCountMap[resultIndex] =
896
+ tokenCount - countPerMessage * (resultIndices.length - 1);
897
+ } else {
898
+ updatedIndexTokenCountMap[resultIndex] = countPerMessage;
899
+ }
900
+ });
901
+ }
902
+ }
903
+ }
904
+ }
905
+
906
+ return {
907
+ messages,
908
+ indexTokenCountMap: indexTokenCountMap
909
+ ? updatedIndexTokenCountMap
910
+ : undefined,
911
+ };
912
+ };
913
+
914
+ /**
915
+ * Adds a value at key 0 for system messages and shifts all key indices by one in an indexTokenCountMap.
916
+ * This is useful when adding a system message at the beginning of a conversation.
917
+ *
918
+ * @param indexTokenCountMap - The original map of message indices to token counts
919
+ * @param instructionsTokenCount - The token count for the system message to add at index 0
920
+ * @returns A new map with the system message at index 0 and all other indices shifted by 1
921
+ */
922
+ export function shiftIndexTokenCountMap(
923
+ indexTokenCountMap: Record<number, number>,
924
+ instructionsTokenCount: number
925
+ ): Record<number, number> {
926
+ // Create a new map to avoid modifying the original
927
+ const shiftedMap: Record<number, number> = {};
928
+ shiftedMap[0] = instructionsTokenCount;
929
+
930
+ // Shift all existing indices by 1
931
+ for (const [indexStr, tokenCount] of Object.entries(indexTokenCountMap)) {
932
+ const index = Number(indexStr);
933
+ shiftedMap[index + 1] = tokenCount;
934
+ }
935
+
936
+ return shiftedMap;
937
+ }
938
+
939
+ /**
940
+ * Ensures compatibility when switching from a non-thinking agent to a thinking-enabled agent.
941
+ * Converts AI messages with tool calls (that lack thinking/reasoning blocks) into buffer strings,
942
+ * avoiding the thinking block signature requirement.
943
+ *
944
+ * Recognizes the following as valid thinking/reasoning blocks:
945
+ * - ContentTypes.THINKING (Anthropic)
946
+ * - ContentTypes.REASONING_CONTENT (Bedrock)
947
+ * - ContentTypes.REASONING (VertexAI / Google)
948
+ * - 'redacted_thinking'
949
+ *
950
+ * @param messages - Array of messages to process
951
+ * @param provider - The provider being used (unused but kept for future compatibility)
952
+ * @returns The messages array with tool sequences converted to buffer strings if necessary
953
+ */
954
+ export function ensureThinkingBlockInMessages(
955
+ messages: BaseMessage[],
956
+ _provider: Providers
957
+ ): BaseMessage[] {
958
+ const result: BaseMessage[] = [];
959
+ let i = 0;
960
+
961
+ while (i < messages.length) {
962
+ const msg = messages[i];
963
+ const isAI = msg instanceof AIMessage || msg instanceof AIMessageChunk;
964
+
965
+ if (!isAI) {
966
+ result.push(msg);
967
+ i++;
968
+ continue;
969
+ }
970
+
971
+ const aiMsg = msg as AIMessage | AIMessageChunk;
972
+ const hasToolCalls = aiMsg.tool_calls && aiMsg.tool_calls.length > 0;
973
+ const contentIsArray = Array.isArray(aiMsg.content);
974
+
975
+ // Check if the message has tool calls or tool_use content
976
+ let hasToolUse = hasToolCalls ?? false;
977
+ let firstContentType: string | undefined;
978
+
979
+ if (contentIsArray && aiMsg.content.length > 0) {
980
+ const content = aiMsg.content as ExtendedMessageContent[];
981
+ firstContentType = content[0]?.type;
982
+ hasToolUse =
983
+ hasToolUse ||
984
+ content.some((c) => typeof c === 'object' && c.type === 'tool_use');
985
+ }
986
+
987
+ // If message has tool use but no thinking block, convert to buffer string
988
+ if (
989
+ hasToolUse &&
990
+ firstContentType !== ContentTypes.THINKING &&
991
+ firstContentType !== ContentTypes.REASONING_CONTENT &&
992
+ firstContentType !== ContentTypes.REASONING &&
993
+ firstContentType !== 'redacted_thinking'
994
+ ) {
995
+ // Collect the AI message and any following tool messages
996
+ const toolSequence: BaseMessage[] = [msg];
997
+ let j = i + 1;
998
+
999
+ // Look ahead for tool messages that belong to this AI message
1000
+ // Use getType() instead of instanceof to avoid module mismatch issues
1001
+ // where different copies of ToolMessage class might be loaded
1002
+ while (
1003
+ j < messages.length &&
1004
+ messages[j].getType() === MessageTypes.TOOL
1005
+ ) {
1006
+ toolSequence.push(messages[j]);
1007
+ j++;
1008
+ }
1009
+
1010
+ // Convert the sequence to a buffer string and wrap in a HumanMessage
1011
+ // This avoids the thinking block requirement which only applies to AI messages
1012
+ const bufferString = getBufferString(toolSequence);
1013
+ result.push(
1014
+ new HumanMessage({
1015
+ content: `[Previous agent context]\n${bufferString}`,
1016
+ })
1017
+ );
1018
+
1019
+ // Skip the messages we've processed
1020
+ i = j;
1021
+ } else {
1022
+ // Keep the message as is
1023
+ result.push(msg);
1024
+ i++;
1025
+ }
1026
+ }
1027
+
1028
+ return result;
1029
+ }