@illuma-ai/agents 1.4.0-alpha.5 → 1.5.0

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 (769) hide show
  1. package/README.md +62 -0
  2. package/dist/cjs/agents/AgentContext.cjs +274 -67
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  4. package/dist/cjs/common/enum.cjs +44 -13
  5. package/dist/cjs/common/enum.cjs.map +1 -1
  6. package/dist/cjs/graphs/Graph.cjs +182 -5
  7. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  8. package/dist/cjs/graphs/MultiAgentGraph.cjs +152 -1167
  9. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  10. package/dist/cjs/hooks/HookRegistry.cjs +162 -0
  11. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -0
  12. package/dist/cjs/hooks/executeHooks.cjs +276 -0
  13. package/dist/cjs/hooks/executeHooks.cjs.map +1 -0
  14. package/dist/cjs/hooks/matchers.cjs +256 -0
  15. package/dist/cjs/hooks/matchers.cjs.map +1 -0
  16. package/dist/cjs/hooks/types.cjs +27 -0
  17. package/dist/cjs/hooks/types.cjs.map +1 -0
  18. package/dist/cjs/langchain/google-common.cjs +3 -0
  19. package/dist/cjs/langchain/google-common.cjs.map +1 -0
  20. package/dist/cjs/langchain/index.cjs +86 -0
  21. package/dist/cjs/langchain/index.cjs.map +1 -0
  22. package/dist/cjs/langchain/language_models/chat_models.cjs +3 -0
  23. package/dist/cjs/langchain/language_models/chat_models.cjs.map +1 -0
  24. package/dist/cjs/langchain/messages/tool.cjs +3 -0
  25. package/dist/cjs/langchain/messages/tool.cjs.map +1 -0
  26. package/dist/cjs/langchain/messages.cjs +51 -0
  27. package/dist/cjs/langchain/messages.cjs.map +1 -0
  28. package/dist/cjs/langchain/openai.cjs +3 -0
  29. package/dist/cjs/langchain/openai.cjs.map +1 -0
  30. package/dist/cjs/langchain/prompts.cjs +11 -0
  31. package/dist/cjs/langchain/prompts.cjs.map +1 -0
  32. package/dist/cjs/langchain/runnables.cjs +19 -0
  33. package/dist/cjs/langchain/runnables.cjs.map +1 -0
  34. package/dist/cjs/langchain/tools.cjs +23 -0
  35. package/dist/cjs/langchain/tools.cjs.map +1 -0
  36. package/dist/cjs/langchain/utils/env.cjs +11 -0
  37. package/dist/cjs/langchain/utils/env.cjs.map +1 -0
  38. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +5 -1
  39. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  40. package/dist/cjs/llm/bedrock/cacheSupport.cjs +55 -0
  41. package/dist/cjs/llm/bedrock/cacheSupport.cjs.map +1 -0
  42. package/dist/cjs/llm/bedrock/index.cjs +61 -33
  43. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  44. package/dist/cjs/llm/openai/index.cjs +0 -3
  45. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  46. package/dist/cjs/llm/openai/utils/index.cjs +27 -10
  47. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  48. package/dist/cjs/main.cjs +178 -117
  49. package/dist/cjs/main.cjs.map +1 -1
  50. package/dist/cjs/messages/cache.cjs +89 -0
  51. package/dist/cjs/messages/cache.cjs.map +1 -1
  52. package/dist/cjs/messages/contextPruning.cjs +156 -0
  53. package/dist/cjs/messages/contextPruning.cjs.map +1 -0
  54. package/dist/cjs/messages/contextPruningSettings.cjs +53 -0
  55. package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -0
  56. package/dist/cjs/messages/format.cjs +144 -20
  57. package/dist/cjs/messages/format.cjs.map +1 -1
  58. package/dist/cjs/messages/prune.cjs +505 -4
  59. package/dist/cjs/messages/prune.cjs.map +1 -1
  60. package/dist/cjs/run.cjs +141 -1
  61. package/dist/cjs/run.cjs.map +1 -1
  62. package/dist/cjs/tools/BashExecutor.cjs +235 -0
  63. package/dist/cjs/tools/BashExecutor.cjs.map +1 -0
  64. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +297 -0
  65. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -0
  66. package/dist/cjs/tools/CodeExecutor.cjs +44 -47
  67. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  68. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +16 -11
  69. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  70. package/dist/cjs/tools/ReadFile.cjs +44 -0
  71. package/dist/cjs/tools/ReadFile.cjs.map +1 -0
  72. package/dist/cjs/tools/SkillTool.cjs +51 -0
  73. package/dist/cjs/tools/SkillTool.cjs.map +1 -0
  74. package/dist/cjs/tools/SubagentTool.cjs +93 -0
  75. package/dist/cjs/tools/SubagentTool.cjs.map +1 -0
  76. package/dist/cjs/tools/ToolNode.cjs +450 -24
  77. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  78. package/dist/cjs/tools/search/search.cjs +11 -3
  79. package/dist/cjs/tools/search/search.cjs.map +1 -1
  80. package/dist/cjs/tools/search/tavily-scraper.cjs +189 -0
  81. package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -0
  82. package/dist/cjs/tools/search/tavily-search.cjs +372 -0
  83. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -0
  84. package/dist/cjs/tools/search/tool.cjs +28 -4
  85. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  86. package/dist/cjs/tools/search/utils.cjs +10 -3
  87. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  88. package/dist/cjs/tools/skillCatalog.cjs +84 -0
  89. package/dist/cjs/tools/skillCatalog.cjs.map +1 -0
  90. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +512 -0
  91. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -0
  92. package/dist/cjs/tools/toolOutputReferences.cjs +670 -0
  93. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -0
  94. package/dist/cjs/types/agent-cache.cjs +53 -0
  95. package/dist/cjs/types/agent-cache.cjs.map +1 -0
  96. package/dist/cjs/types/graph.cjs.map +1 -1
  97. package/dist/cjs/utils/truncation.cjs +135 -0
  98. package/dist/cjs/utils/truncation.cjs.map +1 -0
  99. package/dist/esm/agents/AgentContext.mjs +274 -67
  100. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  101. package/dist/esm/common/enum.mjs +44 -12
  102. package/dist/esm/common/enum.mjs.map +1 -1
  103. package/dist/esm/graphs/Graph.mjs +182 -5
  104. package/dist/esm/graphs/Graph.mjs.map +1 -1
  105. package/dist/esm/graphs/MultiAgentGraph.mjs +155 -1170
  106. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  107. package/dist/esm/hooks/HookRegistry.mjs +160 -0
  108. package/dist/esm/hooks/HookRegistry.mjs.map +1 -0
  109. package/dist/esm/hooks/executeHooks.mjs +273 -0
  110. package/dist/esm/hooks/executeHooks.mjs.map +1 -0
  111. package/dist/esm/hooks/matchers.mjs +251 -0
  112. package/dist/esm/hooks/matchers.mjs.map +1 -0
  113. package/dist/esm/hooks/types.mjs +25 -0
  114. package/dist/esm/hooks/types.mjs.map +1 -0
  115. package/dist/esm/langchain/google-common.mjs +2 -0
  116. package/dist/esm/langchain/google-common.mjs.map +1 -0
  117. package/dist/esm/langchain/index.mjs +5 -0
  118. package/dist/esm/langchain/index.mjs.map +1 -0
  119. package/dist/esm/langchain/language_models/chat_models.mjs +2 -0
  120. package/dist/esm/langchain/language_models/chat_models.mjs.map +1 -0
  121. package/dist/esm/langchain/messages/tool.mjs +2 -0
  122. package/dist/esm/langchain/messages/tool.mjs.map +1 -0
  123. package/dist/esm/langchain/messages.mjs +2 -0
  124. package/dist/esm/langchain/messages.mjs.map +1 -0
  125. package/dist/esm/langchain/openai.mjs +2 -0
  126. package/dist/esm/langchain/openai.mjs.map +1 -0
  127. package/dist/esm/langchain/prompts.mjs +2 -0
  128. package/dist/esm/langchain/prompts.mjs.map +1 -0
  129. package/dist/esm/langchain/runnables.mjs +2 -0
  130. package/dist/esm/langchain/runnables.mjs.map +1 -0
  131. package/dist/esm/langchain/tools.mjs +2 -0
  132. package/dist/esm/langchain/tools.mjs.map +1 -0
  133. package/dist/esm/langchain/utils/env.mjs +2 -0
  134. package/dist/esm/langchain/utils/env.mjs.map +1 -0
  135. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +5 -1
  136. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  137. package/dist/esm/llm/bedrock/cacheSupport.mjs +52 -0
  138. package/dist/esm/llm/bedrock/cacheSupport.mjs.map +1 -0
  139. package/dist/esm/llm/bedrock/index.mjs +61 -34
  140. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  141. package/dist/esm/llm/openai/index.mjs +0 -3
  142. package/dist/esm/llm/openai/index.mjs.map +1 -1
  143. package/dist/esm/llm/openai/utils/index.mjs +27 -10
  144. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  145. package/dist/esm/main.mjs +21 -24
  146. package/dist/esm/main.mjs.map +1 -1
  147. package/dist/esm/messages/cache.mjs +89 -0
  148. package/dist/esm/messages/cache.mjs.map +1 -1
  149. package/dist/esm/messages/contextPruning.mjs +154 -0
  150. package/dist/esm/messages/contextPruning.mjs.map +1 -0
  151. package/dist/esm/messages/contextPruningSettings.mjs +50 -0
  152. package/dist/esm/messages/contextPruningSettings.mjs.map +1 -0
  153. package/dist/esm/messages/format.mjs +136 -12
  154. package/dist/esm/messages/format.mjs.map +1 -1
  155. package/dist/esm/messages/prune.mjs +504 -7
  156. package/dist/esm/messages/prune.mjs.map +1 -1
  157. package/dist/esm/run.mjs +141 -1
  158. package/dist/esm/run.mjs.map +1 -1
  159. package/dist/esm/tools/BashExecutor.mjs +227 -0
  160. package/dist/esm/tools/BashExecutor.mjs.map +1 -0
  161. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +288 -0
  162. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -0
  163. package/dist/esm/tools/CodeExecutor.mjs +44 -48
  164. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  165. package/dist/esm/tools/ProgrammaticToolCalling.mjs +17 -12
  166. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  167. package/dist/esm/tools/ReadFile.mjs +39 -0
  168. package/dist/esm/tools/ReadFile.mjs.map +1 -0
  169. package/dist/esm/tools/SkillTool.mjs +46 -0
  170. package/dist/esm/tools/SkillTool.mjs.map +1 -0
  171. package/dist/esm/tools/SubagentTool.mjs +86 -0
  172. package/dist/esm/tools/SubagentTool.mjs.map +1 -0
  173. package/dist/esm/tools/ToolNode.mjs +452 -26
  174. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  175. package/dist/esm/tools/search/search.mjs +11 -3
  176. package/dist/esm/tools/search/search.mjs.map +1 -1
  177. package/dist/esm/tools/search/tavily-scraper.mjs +186 -0
  178. package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -0
  179. package/dist/esm/tools/search/tavily-search.mjs +370 -0
  180. package/dist/esm/tools/search/tavily-search.mjs.map +1 -0
  181. package/dist/esm/tools/search/tool.mjs +28 -4
  182. package/dist/esm/tools/search/tool.mjs.map +1 -1
  183. package/dist/esm/tools/search/utils.mjs +10 -3
  184. package/dist/esm/tools/search/utils.mjs.map +1 -1
  185. package/dist/esm/tools/skillCatalog.mjs +82 -0
  186. package/dist/esm/tools/skillCatalog.mjs.map +1 -0
  187. package/dist/esm/tools/subagent/SubagentExecutor.mjs +506 -0
  188. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -0
  189. package/dist/esm/tools/toolOutputReferences.mjs +662 -0
  190. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -0
  191. package/dist/esm/types/agent-cache.mjs +51 -0
  192. package/dist/esm/types/agent-cache.mjs.map +1 -0
  193. package/dist/esm/types/graph.mjs.map +1 -1
  194. package/dist/esm/utils/truncation.mjs +128 -0
  195. package/dist/esm/utils/truncation.mjs.map +1 -0
  196. package/dist/types/agents/AgentContext.d.ts +101 -8
  197. package/dist/types/common/enum.d.ts +39 -12
  198. package/dist/types/common/index.d.ts +0 -1
  199. package/dist/types/graphs/Graph.d.ts +43 -0
  200. package/dist/types/graphs/MultiAgentGraph.d.ts +26 -150
  201. package/dist/types/graphs/index.d.ts +0 -1
  202. package/dist/types/hooks/HookRegistry.d.ts +56 -0
  203. package/dist/types/hooks/executeHooks.d.ts +79 -0
  204. package/dist/types/hooks/index.d.ts +6 -0
  205. package/dist/types/hooks/matchers.d.ts +95 -0
  206. package/dist/types/hooks/types.d.ts +320 -0
  207. package/dist/types/index.d.ts +9 -4
  208. package/dist/types/langchain/google-common.d.ts +1 -0
  209. package/dist/types/langchain/index.d.ts +8 -0
  210. package/dist/types/langchain/language_models/chat_models.d.ts +1 -0
  211. package/dist/types/langchain/messages/tool.d.ts +1 -0
  212. package/dist/types/langchain/messages.d.ts +2 -0
  213. package/dist/types/langchain/openai.d.ts +1 -0
  214. package/dist/types/langchain/prompts.d.ts +1 -0
  215. package/dist/types/langchain/runnables.d.ts +2 -0
  216. package/dist/types/langchain/tools.d.ts +2 -0
  217. package/dist/types/langchain/utils/env.d.ts +1 -0
  218. package/dist/types/llm/bedrock/cacheSupport.d.ts +35 -0
  219. package/dist/types/llm/bedrock/index.d.ts +54 -1
  220. package/dist/types/messages/contextPruning.d.ts +42 -0
  221. package/dist/types/messages/contextPruningSettings.d.ts +44 -0
  222. package/dist/types/messages/format.d.ts +9 -1
  223. package/dist/types/messages/index.d.ts +2 -0
  224. package/dist/types/messages/prune.d.ts +91 -1
  225. package/dist/types/run.d.ts +2 -0
  226. package/dist/types/tools/BashExecutor.d.ts +76 -0
  227. package/dist/types/tools/BashProgrammaticToolCalling.d.ts +72 -0
  228. package/dist/types/tools/CodeExecutor.d.ts +8 -26
  229. package/dist/types/tools/ReadFile.d.ts +28 -0
  230. package/dist/types/tools/SkillTool.d.ts +40 -0
  231. package/dist/types/tools/SubagentTool.d.ts +36 -0
  232. package/dist/types/tools/ToolNode.d.ts +77 -5
  233. package/dist/types/tools/search/tavily-scraper.d.ts +19 -0
  234. package/dist/types/tools/search/tavily-search.d.ts +4 -0
  235. package/dist/types/tools/search/types.d.ts +99 -5
  236. package/dist/types/tools/search/utils.d.ts +2 -2
  237. package/dist/types/tools/skillCatalog.d.ts +19 -0
  238. package/dist/types/tools/subagent/SubagentExecutor.d.ts +137 -0
  239. package/dist/types/tools/subagent/index.d.ts +2 -0
  240. package/dist/types/tools/subagent/types.d.ts +84 -0
  241. package/dist/types/tools/toolOutputReferences.d.ts +236 -0
  242. package/dist/types/types/agent-cache.d.ts +70 -0
  243. package/dist/types/types/graph.d.ts +162 -22
  244. package/dist/types/types/index.d.ts +3 -0
  245. package/dist/types/types/messages.d.ts +26 -0
  246. package/dist/types/types/run.d.ts +22 -0
  247. package/dist/types/types/skill.d.ts +9 -0
  248. package/dist/types/types/tools.d.ts +111 -0
  249. package/dist/types/utils/index.d.ts +1 -3
  250. package/dist/types/utils/truncation.d.ts +70 -0
  251. package/package.json +58 -13
  252. package/src/agents/AgentContext.js.map +1 -0
  253. package/src/agents/AgentContext.test.js.map +1 -0
  254. package/src/agents/AgentContext.ts +321 -78
  255. package/src/agents/__tests__/AgentContext.cacheTtl.live.test.ts +259 -0
  256. package/src/agents/__tests__/AgentContext.crossAgentTier1.live.test.ts +264 -0
  257. package/src/agents/__tests__/AgentContext.crossUserCache.live.test.ts +342 -0
  258. package/src/agents/__tests__/AgentContext.test.js.map +1 -0
  259. package/src/agents/__tests__/AgentContext.test.ts +632 -0
  260. package/src/agents/__tests__/resolveStructuredOutputMode.test.js.map +1 -0
  261. package/src/common/__tests__/enum.test.ts +7 -17
  262. package/src/common/enum.js.map +1 -0
  263. package/src/common/enum.ts +43 -12
  264. package/src/common/index.js.map +1 -0
  265. package/src/common/index.ts +0 -1
  266. package/src/events.js.map +1 -0
  267. package/src/graphs/Graph.js.map +1 -0
  268. package/src/graphs/Graph.ts +222 -2
  269. package/src/graphs/MultiAgentGraph.js.map +1 -0
  270. package/src/graphs/MultiAgentGraph.ts +154 -1466
  271. package/src/graphs/__tests__/MultiAgentGraph.test.ts +91 -0
  272. package/src/graphs/__tests__/structured-output.integration.test.js.map +1 -0
  273. package/src/graphs/__tests__/structured-output.test.js.map +1 -0
  274. package/src/graphs/contextManagement.e2e.test.js.map +1 -0
  275. package/src/graphs/contextManagement.test.js.map +1 -0
  276. package/src/graphs/handoffValidation.test.js.map +1 -0
  277. package/src/graphs/index.js.map +1 -0
  278. package/src/graphs/index.ts +0 -1
  279. package/src/hooks/HookRegistry.ts +208 -0
  280. package/src/hooks/__tests__/HookRegistry.test.ts +190 -0
  281. package/src/hooks/__tests__/compactHooks.test.ts +214 -0
  282. package/src/hooks/__tests__/executeHooks.test.ts +1013 -0
  283. package/src/hooks/__tests__/integration.test.ts +337 -0
  284. package/src/hooks/__tests__/matchers.test.ts +238 -0
  285. package/src/hooks/__tests__/toolHooks.test.ts +665 -0
  286. package/src/hooks/executeHooks.ts +375 -0
  287. package/src/hooks/index.ts +57 -0
  288. package/src/hooks/matchers.ts +280 -0
  289. package/src/hooks/types.ts +404 -0
  290. package/src/index.js.map +1 -0
  291. package/src/index.ts +15 -5
  292. package/src/instrumentation.js.map +1 -0
  293. package/src/langchain/google-common.ts +1 -0
  294. package/src/langchain/index.ts +8 -0
  295. package/src/langchain/language_models/chat_models.ts +1 -0
  296. package/src/langchain/messages/tool.ts +5 -0
  297. package/src/langchain/messages.ts +21 -0
  298. package/src/langchain/openai.ts +1 -0
  299. package/src/langchain/prompts.ts +1 -0
  300. package/src/langchain/runnables.ts +7 -0
  301. package/src/langchain/tools.ts +8 -0
  302. package/src/langchain/utils/env.ts +1 -0
  303. package/src/llm/anthropic/index.js.map +1 -0
  304. package/src/llm/anthropic/types.js.map +1 -0
  305. package/src/llm/anthropic/utils/message_inputs.js.map +1 -0
  306. package/src/llm/anthropic/utils/message_inputs.ts +10 -1
  307. package/src/llm/anthropic/utils/message_outputs.js.map +1 -0
  308. package/src/llm/anthropic/utils/output_parsers.js.map +1 -0
  309. package/src/llm/anthropic/utils/server-tool-inputs.test.ts +436 -0
  310. package/src/llm/anthropic/utils/tools.js.map +1 -0
  311. package/src/llm/bedrock/__tests__/bedrock-caching.test.js.map +1 -0
  312. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +166 -18
  313. package/src/llm/bedrock/cacheSupport.test.ts +99 -0
  314. package/src/llm/bedrock/cacheSupport.ts +53 -0
  315. package/src/llm/bedrock/index.js.map +1 -0
  316. package/src/llm/bedrock/index.ts +116 -41
  317. package/src/llm/bedrock/types.js.map +1 -0
  318. package/src/llm/bedrock/utils/index.js.map +1 -0
  319. package/src/llm/bedrock/utils/message_inputs.js.map +1 -0
  320. package/src/llm/bedrock/utils/message_outputs.js.map +1 -0
  321. package/src/llm/fake.js.map +1 -0
  322. package/src/llm/google/index.js.map +1 -0
  323. package/src/llm/google/types.js.map +1 -0
  324. package/src/llm/google/utils/common.js.map +1 -0
  325. package/src/llm/google/utils/tools.js.map +1 -0
  326. package/src/llm/google/utils/zod_to_genai_parameters.js.map +1 -0
  327. package/src/llm/openai/index.js.map +1 -0
  328. package/src/llm/openai/types.js.map +1 -0
  329. package/src/llm/openai/utils/index.js.map +1 -0
  330. package/src/llm/openai/utils/index.ts +31 -14
  331. package/src/llm/openai/utils/isReasoningModel.test.js.map +1 -0
  332. package/src/llm/openrouter/index.js.map +1 -0
  333. package/src/llm/openrouter/reasoning.test.js.map +1 -0
  334. package/src/llm/providers.js.map +1 -0
  335. package/src/llm/text.js.map +1 -0
  336. package/src/llm/vertexai/index.js.map +1 -0
  337. package/src/messages/__tests__/contextPruning.test.ts +228 -0
  338. package/src/messages/__tests__/tools.test.js.map +1 -0
  339. package/src/messages/cache.js.map +1 -0
  340. package/src/messages/cache.test.js.map +1 -0
  341. package/src/messages/cache.test.ts +62 -24
  342. package/src/messages/cache.ts +112 -0
  343. package/src/messages/content.js.map +1 -0
  344. package/src/messages/content.test.js.map +1 -0
  345. package/src/messages/contextPruning.ts +191 -0
  346. package/src/messages/contextPruningSettings.ts +90 -0
  347. package/src/messages/core.js.map +1 -0
  348. package/src/messages/ensureThinkingBlock.test.js.map +1 -0
  349. package/src/messages/format.js.map +1 -0
  350. package/src/messages/format.ts +164 -12
  351. package/src/messages/formatAgentMessages.skills.test.ts +413 -0
  352. package/src/messages/formatAgentMessages.test.js.map +1 -0
  353. package/src/messages/formatAgentMessages.tools.test.js.map +1 -0
  354. package/src/messages/formatMessage.test.js.map +1 -0
  355. package/src/messages/ids.js.map +1 -0
  356. package/src/messages/index.js.map +1 -0
  357. package/src/messages/index.ts +2 -0
  358. package/src/messages/labelContentByAgent.test.js.map +1 -0
  359. package/src/messages/prune.js.map +1 -0
  360. package/src/messages/prune.ts +661 -4
  361. package/src/messages/reducer.js.map +1 -0
  362. package/src/messages/shiftIndexTokenCountMap.test.js.map +1 -0
  363. package/src/messages/summarize.js.map +1 -0
  364. package/src/messages/summarize.test.js.map +1 -0
  365. package/src/messages/tools.js.map +1 -0
  366. package/src/mockStream.js.map +1 -0
  367. package/src/prompts/collab.js.map +1 -0
  368. package/src/prompts/index.js.map +1 -0
  369. package/src/prompts/taskmanager.js.map +1 -0
  370. package/src/run.js.map +1 -0
  371. package/src/run.ts +155 -1
  372. package/src/schemas/index.js.map +1 -0
  373. package/src/schemas/schema-preparation.test.js.map +1 -0
  374. package/src/schemas/validate.js.map +1 -0
  375. package/src/schemas/validate.test.js.map +1 -0
  376. package/src/scripts/abort.js.map +1 -0
  377. package/src/scripts/ant_web_search.js.map +1 -0
  378. package/src/scripts/ant_web_search_edge_case.js.map +1 -0
  379. package/src/scripts/ant_web_search_error_edge_case.js.map +1 -0
  380. package/src/scripts/args.js.map +1 -0
  381. package/src/scripts/bedrock-cache-debug.js.map +1 -0
  382. package/src/scripts/bedrock-content-aggregation-test.js.map +1 -0
  383. package/src/scripts/bedrock-merge-test.js.map +1 -0
  384. package/src/scripts/bedrock-parallel-tools-test.js.map +1 -0
  385. package/src/scripts/caching.js.map +1 -0
  386. package/src/scripts/cli.js.map +1 -0
  387. package/src/scripts/cli2.js.map +1 -0
  388. package/src/scripts/cli3.js.map +1 -0
  389. package/src/scripts/cli4.js.map +1 -0
  390. package/src/scripts/cli5.js.map +1 -0
  391. package/src/scripts/code_exec.js.map +1 -0
  392. package/src/scripts/code_exec_files.js.map +1 -0
  393. package/src/scripts/code_exec_multi_session.js.map +1 -0
  394. package/src/scripts/code_exec_ptc.js.map +1 -0
  395. package/src/scripts/code_exec_session.js.map +1 -0
  396. package/src/scripts/code_exec_simple.js.map +1 -0
  397. package/src/scripts/content.js.map +1 -0
  398. package/src/scripts/empty_input.js.map +1 -0
  399. package/src/scripts/handoff-test.js.map +1 -0
  400. package/src/scripts/image.js.map +1 -0
  401. package/src/scripts/memory.js.map +1 -0
  402. package/src/scripts/multi-agent-chain.js.map +1 -0
  403. package/src/scripts/multi-agent-chain.ts +2 -2
  404. package/src/scripts/multi-agent-conditional.js.map +1 -0
  405. package/src/scripts/multi-agent-document-review-chain.js.map +1 -0
  406. package/src/scripts/multi-agent-document-review-chain.ts +2 -2
  407. package/src/scripts/multi-agent-hybrid-flow.js.map +1 -0
  408. package/src/scripts/multi-agent-hybrid-flow.ts +4 -4
  409. package/src/scripts/multi-agent-parallel-start.js.map +1 -0
  410. package/src/scripts/multi-agent-parallel.js.map +1 -0
  411. package/src/scripts/multi-agent-parallel.ts +3 -3
  412. package/src/scripts/multi-agent-sequence.js.map +1 -0
  413. package/src/scripts/multi-agent-sequence.ts +3 -3
  414. package/src/scripts/multi-agent-subagent.ts +246 -0
  415. package/src/scripts/multi-agent-supervisor.js.map +1 -0
  416. package/src/scripts/multi-agent-supervisor.ts +5 -5
  417. package/src/scripts/multi-agent-test.js.map +1 -0
  418. package/src/scripts/parallel-asymmetric-tools-test.js.map +1 -0
  419. package/src/scripts/parallel-full-metadata-test.js.map +1 -0
  420. package/src/scripts/parallel-tools-test.js.map +1 -0
  421. package/src/scripts/poc-multi-agent-comprehensive.ts +8 -8
  422. package/src/scripts/programmatic_exec.js.map +1 -0
  423. package/src/scripts/programmatic_exec_agent.js.map +1 -0
  424. package/src/scripts/search.js.map +1 -0
  425. package/src/scripts/sequential-full-metadata-test.js.map +1 -0
  426. package/src/scripts/sequential-full-metadata-test.ts +2 -2
  427. package/src/scripts/simple.js.map +1 -0
  428. package/src/scripts/single-agent-metadata-test.js.map +1 -0
  429. package/src/scripts/stream.js.map +1 -0
  430. package/src/scripts/subagent-event-driven-debug.ts +190 -0
  431. package/src/scripts/subagent-tools-debug.ts +160 -0
  432. package/src/scripts/test-custom-prompt-key.js.map +1 -0
  433. package/src/scripts/test-custom-prompt-key.ts +3 -3
  434. package/src/scripts/test-handoff-input.js.map +1 -0
  435. package/src/scripts/test-handoff-input.ts +1 -1
  436. package/src/scripts/test-handoff-preamble.js.map +1 -0
  437. package/src/scripts/test-handoff-steering.js.map +1 -0
  438. package/src/scripts/test-handoff-steering.ts +3 -3
  439. package/src/scripts/test-multi-agent-list-handoff.js.map +1 -0
  440. package/src/scripts/test-multi-agent-list-handoff.ts +1 -1
  441. package/src/scripts/test-parallel-agent-labeling.js.map +1 -0
  442. package/src/scripts/test-parallel-agent-labeling.ts +3 -3
  443. package/src/scripts/test-parallel-handoffs.js.map +1 -0
  444. package/src/scripts/test-parallel-handoffs.ts +2 -2
  445. package/src/scripts/test-thinking-handoff-bedrock.js.map +1 -0
  446. package/src/scripts/test-thinking-handoff-bedrock.ts +1 -1
  447. package/src/scripts/test-thinking-handoff.js.map +1 -0
  448. package/src/scripts/test-thinking-handoff.ts +1 -1
  449. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js.map +1 -0
  450. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +1 -1
  451. package/src/scripts/test-tool-before-handoff-role-order.js.map +1 -0
  452. package/src/scripts/test-tool-before-handoff-role-order.ts +1 -1
  453. package/src/scripts/test-tools-before-handoff.js.map +1 -0
  454. package/src/scripts/test-tools-before-handoff.ts +1 -1
  455. package/src/scripts/test_code_api.js.map +1 -0
  456. package/src/scripts/thinking-bedrock.js.map +1 -0
  457. package/src/scripts/thinking-vertexai.js.map +1 -0
  458. package/src/scripts/thinking.js.map +1 -0
  459. package/src/scripts/tool_search.js.map +1 -0
  460. package/src/scripts/tools.js.map +1 -0
  461. package/src/specs/agent-handoffs-bedrock.integration.test.js.map +1 -0
  462. package/src/specs/agent-handoffs.test.js.map +1 -0
  463. package/src/specs/agent-handoffs.test.ts +26 -483
  464. package/src/specs/anthropic.simple.test.js.map +1 -0
  465. package/src/specs/anthropic.simple.test.ts +61 -0
  466. package/src/specs/azure.simple.test.js.map +1 -0
  467. package/src/specs/cache.simple.test.js.map +1 -0
  468. package/src/specs/custom-event-await.test.js.map +1 -0
  469. package/src/specs/deepseek.simple.test.js.map +1 -0
  470. package/src/specs/emergency-prune.test.js.map +1 -0
  471. package/src/specs/moonshot.simple.test.js.map +1 -0
  472. package/src/specs/multi-agent-summarization.test.ts +396 -0
  473. package/src/specs/observability.integration.test.js.map +1 -0
  474. package/src/specs/openai.simple.test.js.map +1 -0
  475. package/src/specs/openrouter.simple.test.js.map +1 -0
  476. package/src/specs/prune.orphans.test.ts +248 -0
  477. package/src/specs/prune.test.js.map +1 -0
  478. package/src/specs/prune.test.ts +104 -16
  479. package/src/specs/reasoning.test.js.map +1 -0
  480. package/src/specs/spec.utils.js.map +1 -0
  481. package/src/specs/thinking-handoff.test.js.map +1 -0
  482. package/src/specs/thinking-handoff.test.ts +19 -19
  483. package/src/specs/thinking-prune.test.js.map +1 -0
  484. package/src/specs/token-distribution-edge-case.test.js.map +1 -0
  485. package/src/specs/token-memoization.test.js.map +1 -0
  486. package/src/specs/tokens.test.js.map +1 -0
  487. package/src/specs/tool-error.test.js.map +1 -0
  488. package/src/splitStream.js.map +1 -0
  489. package/src/splitStream.test.js.map +1 -0
  490. package/src/stream.js.map +1 -0
  491. package/src/stream.test.js.map +1 -0
  492. package/src/test/mockTools.js.map +1 -0
  493. package/src/tools/BashExecutor.ts +281 -0
  494. package/src/tools/BashProgrammaticToolCalling.ts +397 -0
  495. package/src/tools/BrowserTools.js.map +1 -0
  496. package/src/tools/Calculator.js.map +1 -0
  497. package/src/tools/Calculator.test.js.map +1 -0
  498. package/src/tools/CodeExecutor.js.map +1 -0
  499. package/src/tools/CodeExecutor.ts +62 -54
  500. package/src/tools/ProgrammaticToolCalling.js.map +1 -0
  501. package/src/tools/ProgrammaticToolCalling.ts +29 -14
  502. package/src/tools/ReadFile.ts +39 -0
  503. package/src/tools/SkillTool.ts +46 -0
  504. package/src/tools/StreamingToolCallBuffer.js.map +1 -0
  505. package/src/tools/SubagentTool.ts +100 -0
  506. package/src/tools/ToolNode.js.map +1 -0
  507. package/src/tools/ToolNode.ts +548 -26
  508. package/src/tools/ToolSearch.js.map +1 -0
  509. package/src/tools/__tests__/BashExecutor.test.ts +49 -0
  510. package/src/tools/__tests__/BrowserTools.test.js.map +1 -0
  511. package/src/tools/__tests__/CodeExecutor.test.ts +37 -36
  512. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js.map +1 -0
  513. package/src/tools/__tests__/ProgrammaticToolCalling.test.js.map +1 -0
  514. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +60 -0
  515. package/src/tools/__tests__/ReadFile.test.ts +44 -0
  516. package/src/tools/__tests__/SkillTool.test.ts +442 -0
  517. package/src/tools/__tests__/StreamingToolCallBuffer.test.js.map +1 -0
  518. package/src/tools/__tests__/SubagentExecutor.test.ts +1148 -0
  519. package/src/tools/__tests__/SubagentTool.test.ts +149 -0
  520. package/src/tools/__tests__/ToolApproval.test.js.map +1 -0
  521. package/src/tools/__tests__/ToolNode.outputReferences.test.ts +1438 -0
  522. package/src/tools/__tests__/ToolNode.recovery.test.js.map +1 -0
  523. package/src/tools/__tests__/ToolNode.session.test.js.map +1 -0
  524. package/src/tools/__tests__/ToolSearch.integration.test.js.map +1 -0
  525. package/src/tools/__tests__/ToolSearch.test.js.map +1 -0
  526. package/src/tools/__tests__/annotateMessagesForLLM.test.ts +479 -0
  527. package/src/tools/__tests__/handlers.test.js.map +1 -0
  528. package/src/tools/__tests__/skillCatalog.test.ts +161 -0
  529. package/src/tools/__tests__/subagentHooks.test.ts +210 -0
  530. package/src/tools/__tests__/toolOutputReferences.test.ts +415 -0
  531. package/src/tools/__tests__/truncation-recovery.integration.test.js.map +1 -0
  532. package/src/tools/handlers.js.map +1 -0
  533. package/src/tools/schema.js.map +1 -0
  534. package/src/tools/search/anthropic.js.map +1 -0
  535. package/src/tools/search/content.js.map +1 -0
  536. package/src/tools/search/content.test.js.map +1 -0
  537. package/src/tools/search/firecrawl.js.map +1 -0
  538. package/src/tools/search/format.js.map +1 -0
  539. package/src/tools/search/highlights.js.map +1 -0
  540. package/src/tools/search/index.js.map +1 -0
  541. package/src/tools/search/jina-reranker.test.js.map +1 -0
  542. package/src/tools/search/rerankers.js.map +1 -0
  543. package/src/tools/search/schema.js.map +1 -0
  544. package/src/tools/search/search.js.map +1 -0
  545. package/src/tools/search/search.ts +12 -2
  546. package/src/tools/search/serper-scraper.js.map +1 -0
  547. package/src/tools/search/tavily-scraper.ts +235 -0
  548. package/src/tools/search/tavily-search.ts +424 -0
  549. package/src/tools/search/tavily.test.ts +965 -0
  550. package/src/tools/search/test.js.map +1 -0
  551. package/src/tools/search/tool.js.map +1 -0
  552. package/src/tools/search/tool.ts +36 -2
  553. package/src/tools/search/types.js.map +1 -0
  554. package/src/tools/search/types.ts +133 -8
  555. package/src/tools/search/utils.js.map +1 -0
  556. package/src/tools/search/utils.ts +13 -5
  557. package/src/tools/skillCatalog.ts +126 -0
  558. package/src/tools/subagent/SubagentExecutor.ts +676 -0
  559. package/src/tools/subagent/index.ts +13 -0
  560. package/src/tools/subagent/types.test.ts +70 -0
  561. package/src/tools/subagent/types.ts +115 -0
  562. package/src/tools/toolOutputReferences.ts +825 -0
  563. package/src/types/agent-cache.ts +73 -0
  564. package/src/types/graph.js.map +1 -0
  565. package/src/types/graph.test.js.map +1 -0
  566. package/src/types/graph.ts +171 -20
  567. package/src/types/index.js.map +1 -0
  568. package/src/types/index.ts +3 -0
  569. package/src/types/llm.js.map +1 -0
  570. package/src/types/messages.js.map +1 -0
  571. package/src/types/messages.ts +27 -0
  572. package/src/types/run.js.map +1 -0
  573. package/src/types/run.ts +22 -0
  574. package/src/types/skill.ts +11 -0
  575. package/src/types/stream.js.map +1 -0
  576. package/src/types/tools.js.map +1 -0
  577. package/src/types/tools.ts +118 -0
  578. package/src/utils/__tests__/truncation.test.ts +66 -0
  579. package/src/utils/contextAnalytics.js.map +1 -0
  580. package/src/utils/contextAnalytics.test.js.map +1 -0
  581. package/src/utils/events.js.map +1 -0
  582. package/src/utils/graph.js.map +1 -0
  583. package/src/utils/handlers.js.map +1 -0
  584. package/src/utils/index.js.map +1 -0
  585. package/src/utils/index.ts +1 -3
  586. package/src/utils/llm.js.map +1 -0
  587. package/src/utils/llmConfig.js.map +1 -0
  588. package/src/utils/logging.js.map +1 -0
  589. package/src/utils/misc.js.map +1 -0
  590. package/src/utils/run.js.map +1 -0
  591. package/src/utils/schema.js.map +1 -0
  592. package/src/utils/title.js.map +1 -0
  593. package/src/utils/tokens.js.map +1 -0
  594. package/src/utils/toonFormat.js.map +1 -0
  595. package/src/utils/truncation.ts +154 -0
  596. package/dist/cjs/common/spawnPath.cjs +0 -104
  597. package/dist/cjs/common/spawnPath.cjs.map +0 -1
  598. package/dist/cjs/graphs/HandoffRegistry.cjs +0 -143
  599. package/dist/cjs/graphs/HandoffRegistry.cjs.map +0 -1
  600. package/dist/cjs/providers/a2a/A2ACapabilityProvider.cjs +0 -288
  601. package/dist/cjs/providers/a2a/A2ACapabilityProvider.cjs.map +0 -1
  602. package/dist/cjs/providers/a2a/client.cjs +0 -92
  603. package/dist/cjs/providers/a2a/client.cjs.map +0 -1
  604. package/dist/cjs/providers/a2a/config.cjs +0 -38
  605. package/dist/cjs/providers/a2a/config.cjs.map +0 -1
  606. package/dist/cjs/providers/capabilityNaming.cjs +0 -43
  607. package/dist/cjs/providers/capabilityNaming.cjs.map +0 -1
  608. package/dist/cjs/providers/mcp/MCPCapabilityProvider.cjs +0 -244
  609. package/dist/cjs/providers/mcp/MCPCapabilityProvider.cjs.map +0 -1
  610. package/dist/cjs/providers/mcp/config.cjs +0 -42
  611. package/dist/cjs/providers/mcp/config.cjs.map +0 -1
  612. package/dist/cjs/providers/mcp/transport.cjs +0 -65
  613. package/dist/cjs/providers/mcp/transport.cjs.map +0 -1
  614. package/dist/cjs/providers/tools-server/ToolsServerCapabilityProvider.cjs +0 -128
  615. package/dist/cjs/providers/tools-server/ToolsServerCapabilityProvider.cjs.map +0 -1
  616. package/dist/cjs/providers/types.cjs +0 -51
  617. package/dist/cjs/providers/types.cjs.map +0 -1
  618. package/dist/cjs/tools/artifacts/schema.cjs +0 -86
  619. package/dist/cjs/tools/artifacts/schema.cjs.map +0 -1
  620. package/dist/cjs/tools/artifacts/tool.cjs +0 -219
  621. package/dist/cjs/tools/artifacts/tool.cjs.map +0 -1
  622. package/dist/cjs/tools/fileSearch/formatter.cjs +0 -93
  623. package/dist/cjs/tools/fileSearch/formatter.cjs.map +0 -1
  624. package/dist/cjs/tools/fileSearch/ragClient.cjs +0 -102
  625. package/dist/cjs/tools/fileSearch/ragClient.cjs.map +0 -1
  626. package/dist/cjs/tools/fileSearch/schema.cjs +0 -18
  627. package/dist/cjs/tools/fileSearch/schema.cjs.map +0 -1
  628. package/dist/cjs/tools/fileSearch/tool.cjs +0 -155
  629. package/dist/cjs/tools/fileSearch/tool.cjs.map +0 -1
  630. package/dist/cjs/tools/proxyTool.cjs +0 -102
  631. package/dist/cjs/tools/proxyTool.cjs.map +0 -1
  632. package/dist/cjs/utils/childAgentContext.cjs +0 -242
  633. package/dist/cjs/utils/childAgentContext.cjs.map +0 -1
  634. package/dist/cjs/utils/credentials.cjs +0 -142
  635. package/dist/cjs/utils/credentials.cjs.map +0 -1
  636. package/dist/cjs/utils/httpClient.cjs +0 -74
  637. package/dist/cjs/utils/httpClient.cjs.map +0 -1
  638. package/dist/cjs/utils/toolManifest.cjs +0 -100
  639. package/dist/cjs/utils/toolManifest.cjs.map +0 -1
  640. package/dist/esm/common/spawnPath.mjs +0 -95
  641. package/dist/esm/common/spawnPath.mjs.map +0 -1
  642. package/dist/esm/graphs/HandoffRegistry.mjs +0 -141
  643. package/dist/esm/graphs/HandoffRegistry.mjs.map +0 -1
  644. package/dist/esm/providers/a2a/A2ACapabilityProvider.mjs +0 -281
  645. package/dist/esm/providers/a2a/A2ACapabilityProvider.mjs.map +0 -1
  646. package/dist/esm/providers/a2a/client.mjs +0 -88
  647. package/dist/esm/providers/a2a/client.mjs.map +0 -1
  648. package/dist/esm/providers/a2a/config.mjs +0 -35
  649. package/dist/esm/providers/a2a/config.mjs.map +0 -1
  650. package/dist/esm/providers/capabilityNaming.mjs +0 -39
  651. package/dist/esm/providers/capabilityNaming.mjs.map +0 -1
  652. package/dist/esm/providers/mcp/MCPCapabilityProvider.mjs +0 -240
  653. package/dist/esm/providers/mcp/MCPCapabilityProvider.mjs.map +0 -1
  654. package/dist/esm/providers/mcp/config.mjs +0 -39
  655. package/dist/esm/providers/mcp/config.mjs.map +0 -1
  656. package/dist/esm/providers/mcp/transport.mjs +0 -63
  657. package/dist/esm/providers/mcp/transport.mjs.map +0 -1
  658. package/dist/esm/providers/tools-server/ToolsServerCapabilityProvider.mjs +0 -126
  659. package/dist/esm/providers/tools-server/ToolsServerCapabilityProvider.mjs.map +0 -1
  660. package/dist/esm/providers/types.mjs +0 -51
  661. package/dist/esm/providers/types.mjs.map +0 -1
  662. package/dist/esm/tools/artifacts/schema.mjs +0 -79
  663. package/dist/esm/tools/artifacts/schema.mjs.map +0 -1
  664. package/dist/esm/tools/artifacts/tool.mjs +0 -213
  665. package/dist/esm/tools/artifacts/tool.mjs.map +0 -1
  666. package/dist/esm/tools/fileSearch/formatter.mjs +0 -90
  667. package/dist/esm/tools/fileSearch/formatter.mjs.map +0 -1
  668. package/dist/esm/tools/fileSearch/ragClient.mjs +0 -98
  669. package/dist/esm/tools/fileSearch/ragClient.mjs.map +0 -1
  670. package/dist/esm/tools/fileSearch/schema.mjs +0 -15
  671. package/dist/esm/tools/fileSearch/schema.mjs.map +0 -1
  672. package/dist/esm/tools/fileSearch/tool.mjs +0 -152
  673. package/dist/esm/tools/fileSearch/tool.mjs.map +0 -1
  674. package/dist/esm/tools/proxyTool.mjs +0 -100
  675. package/dist/esm/tools/proxyTool.mjs.map +0 -1
  676. package/dist/esm/utils/childAgentContext.mjs +0 -237
  677. package/dist/esm/utils/childAgentContext.mjs.map +0 -1
  678. package/dist/esm/utils/credentials.mjs +0 -135
  679. package/dist/esm/utils/credentials.mjs.map +0 -1
  680. package/dist/esm/utils/httpClient.mjs +0 -70
  681. package/dist/esm/utils/httpClient.mjs.map +0 -1
  682. package/dist/esm/utils/toolManifest.mjs +0 -96
  683. package/dist/esm/utils/toolManifest.mjs.map +0 -1
  684. package/dist/types/common/spawnPath.d.ts +0 -59
  685. package/dist/types/graphs/HandoffRegistry.d.ts +0 -97
  686. package/dist/types/providers/a2a/A2ACapabilityProvider.d.ts +0 -89
  687. package/dist/types/providers/a2a/client.d.ts +0 -47
  688. package/dist/types/providers/a2a/config.d.ts +0 -18
  689. package/dist/types/providers/a2a/index.d.ts +0 -6
  690. package/dist/types/providers/a2a/types.d.ts +0 -173
  691. package/dist/types/providers/capabilityNaming.d.ts +0 -25
  692. package/dist/types/providers/index.d.ts +0 -12
  693. package/dist/types/providers/mcp/MCPCapabilityProvider.d.ts +0 -54
  694. package/dist/types/providers/mcp/config.d.ts +0 -20
  695. package/dist/types/providers/mcp/index.d.ts +0 -5
  696. package/dist/types/providers/mcp/transport.d.ts +0 -18
  697. package/dist/types/providers/mcp/types.d.ts +0 -112
  698. package/dist/types/providers/tools-server/ToolsServerCapabilityProvider.d.ts +0 -59
  699. package/dist/types/providers/tools-server/index.d.ts +0 -1
  700. package/dist/types/providers/types.d.ts +0 -184
  701. package/dist/types/tools/artifacts/index.d.ts +0 -3
  702. package/dist/types/tools/artifacts/schema.d.ts +0 -63
  703. package/dist/types/tools/artifacts/tool.d.ts +0 -16
  704. package/dist/types/tools/artifacts/types.d.ts +0 -127
  705. package/dist/types/tools/fileSearch/formatter.d.ts +0 -25
  706. package/dist/types/tools/fileSearch/index.d.ts +0 -5
  707. package/dist/types/tools/fileSearch/ragClient.d.ts +0 -32
  708. package/dist/types/tools/fileSearch/schema.d.ts +0 -13
  709. package/dist/types/tools/fileSearch/tool.d.ts +0 -18
  710. package/dist/types/tools/fileSearch/types.d.ts +0 -139
  711. package/dist/types/tools/proxyTool.d.ts +0 -62
  712. package/dist/types/utils/childAgentContext.d.ts +0 -99
  713. package/dist/types/utils/credentials.d.ts +0 -77
  714. package/dist/types/utils/httpClient.d.ts +0 -46
  715. package/dist/types/utils/toolManifest.d.ts +0 -49
  716. package/src/common/__tests__/spawnPath.test.ts +0 -110
  717. package/src/common/spawnPath.ts +0 -101
  718. package/src/graphs/HandoffRegistry.ts +0 -199
  719. package/src/graphs/__tests__/HandoffRegistry.test.ts +0 -410
  720. package/src/graphs/__tests__/multi-agent-delegate.test.ts +0 -458
  721. package/src/graphs/__tests__/multi-agent-edges.test.ts +0 -276
  722. package/src/graphs/__tests__/multi-agent-nested-subgraph.test.ts +0 -221
  723. package/src/graphs/handoffValidation.test.ts +0 -353
  724. package/src/providers/__tests__/ToolsServerCapabilityProvider.integration.spec.ts +0 -79
  725. package/src/providers/__tests__/ToolsServerCapabilityProvider.test.ts +0 -269
  726. package/src/providers/__tests__/types.test.ts +0 -64
  727. package/src/providers/a2a/A2ACapabilityProvider.ts +0 -384
  728. package/src/providers/a2a/__tests__/A2ACapabilityProvider.integration.spec.ts +0 -345
  729. package/src/providers/a2a/__tests__/A2ACapabilityProvider.test.ts +0 -460
  730. package/src/providers/a2a/client.ts +0 -115
  731. package/src/providers/a2a/config.ts +0 -40
  732. package/src/providers/a2a/index.ts +0 -29
  733. package/src/providers/a2a/types.ts +0 -191
  734. package/src/providers/capabilityNaming.ts +0 -42
  735. package/src/providers/index.ts +0 -68
  736. package/src/providers/mcp/MCPCapabilityProvider.ts +0 -345
  737. package/src/providers/mcp/__tests__/MCPCapabilityProvider.integration.spec.ts +0 -386
  738. package/src/providers/mcp/__tests__/MCPCapabilityProvider.test.ts +0 -371
  739. package/src/providers/mcp/config.ts +0 -45
  740. package/src/providers/mcp/index.ts +0 -21
  741. package/src/providers/mcp/transport.ts +0 -76
  742. package/src/providers/mcp/types.ts +0 -139
  743. package/src/providers/tools-server/ToolsServerCapabilityProvider.ts +0 -248
  744. package/src/providers/tools-server/index.ts +0 -1
  745. package/src/providers/types.ts +0 -204
  746. package/src/scripts/test-bedrock-handoff-autonomous.ts +0 -267
  747. package/src/scripts/test-handoff-preamble.ts +0 -278
  748. package/src/specs/agent-handoffs-bedrock.integration.test.ts +0 -415
  749. package/src/tools/artifacts/__tests__/tool.test.ts +0 -259
  750. package/src/tools/artifacts/index.ts +0 -33
  751. package/src/tools/artifacts/schema.ts +0 -99
  752. package/src/tools/artifacts/tool.ts +0 -289
  753. package/src/tools/artifacts/types.ts +0 -162
  754. package/src/tools/fileSearch/__tests__/tool.test.ts +0 -261
  755. package/src/tools/fileSearch/formatter.ts +0 -129
  756. package/src/tools/fileSearch/index.ts +0 -23
  757. package/src/tools/fileSearch/ragClient.ts +0 -137
  758. package/src/tools/fileSearch/schema.ts +0 -19
  759. package/src/tools/fileSearch/tool.ts +0 -207
  760. package/src/tools/fileSearch/types.ts +0 -149
  761. package/src/tools/proxyTool.ts +0 -166
  762. package/src/utils/__tests__/childAgentContext.test.ts +0 -217
  763. package/src/utils/__tests__/credentials.test.ts +0 -130
  764. package/src/utils/__tests__/httpClient.test.ts +0 -75
  765. package/src/utils/__tests__/toolManifest.test.ts +0 -116
  766. package/src/utils/childAgentContext.ts +0 -259
  767. package/src/utils/credentials.ts +0 -157
  768. package/src/utils/httpClient.ts +0 -92
  769. package/src/utils/toolManifest.ts +0 -109
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  AIMessage,
3
3
  BaseMessage,
4
+ ToolMessage,
4
5
  UsageMetadata,
5
6
  } from '@langchain/core/messages';
6
7
  import type {
@@ -9,7 +10,14 @@ import type {
9
10
  ReasoningContentText,
10
11
  } from '@/types/stream';
11
12
  import type { TokenCounter } from '@/types/run';
12
- import { ContentTypes, Providers } from '@/common';
13
+ import { ContentTypes, Constants, Providers } from '@/common';
14
+ import type { ContextPruningConfig } from '@/types/graph';
15
+ import {
16
+ calculateMaxToolResultChars,
17
+ truncateToolResultContent,
18
+ truncateToolInput,
19
+ } from '@/utils/truncation';
20
+ import { applyContextPruning } from './contextPruning';
13
21
 
14
22
  export type PruneMessagesFactoryParams = {
15
23
  provider?: Providers;
@@ -18,6 +26,15 @@ export type PruneMessagesFactoryParams = {
18
26
  tokenCounter: TokenCounter;
19
27
  indexTokenCountMap: Record<string, number | undefined>;
20
28
  thinkingEnabled?: boolean;
29
+ /**
30
+ * Optional position-based content degradation config. When `enabled: true`,
31
+ * tool result messages outside the protected zone (system + last N assistant
32
+ * turns + image content) are soft-trimmed (head + tail) once their
33
+ * position-age exceeds `softTrimRatio`, then hard-cleared with a placeholder
34
+ * once age exceeds `hardClearRatio`. Defaults disabled to preserve existing
35
+ * behavior — opt in per deployment.
36
+ */
37
+ contextPruningConfig?: ContextPruningConfig;
21
38
  };
22
39
  export type PruneMessagesParams = {
23
40
  messages: BaseMessage[];
@@ -142,6 +159,7 @@ export function getMessagesWithinTokenLimit({
142
159
  tokenCounter,
143
160
  thinkingStartIndex: _thinkingStartIndex = -1,
144
161
  reasoningType = ContentTypes.THINKING,
162
+ instructionTokens: _instructionTokens = 0,
145
163
  }: {
146
164
  messages: BaseMessage[];
147
165
  maxContextTokens: number;
@@ -151,6 +169,13 @@ export function getMessagesWithinTokenLimit({
151
169
  tokenCounter: TokenCounter;
152
170
  thinkingStartIndex?: number;
153
171
  reasoningType?: ContentTypes.THINKING | ContentTypes.REASONING_CONTENT;
172
+ /**
173
+ * Token overhead for instructions (system message + tool schemas + summary)
174
+ * that are NOT included in `messages`. When messages[0] is already a
175
+ * SystemMessage the budget is deducted from its indexTokenCountMap entry
176
+ * as before; otherwise this value is subtracted from the available budget.
177
+ */
178
+ instructionTokens?: number;
154
179
  }): PruningResult {
155
180
  // Every reply is primed with <|start|>assistant<|message|>, so we
156
181
  // start with 3 tokens for the label after all messages have been counted.
@@ -158,7 +183,7 @@ export function getMessagesWithinTokenLimit({
158
183
  const instructions =
159
184
  _messages[0]?.getType() === 'system' ? _messages[0] : undefined;
160
185
  const instructionsTokenCount =
161
- instructions != null ? (indexTokenCountMap[0] ?? 0) : 0;
186
+ instructions != null ? (indexTokenCountMap[0] ?? 0) : _instructionTokens;
162
187
  const initialContextTokens = maxContextTokens - instructionsTokenCount;
163
188
  let remainingContextTokens = initialContextTokens;
164
189
  let startType = _startType;
@@ -432,6 +457,559 @@ export function checkValidNumber(value: unknown): value is number {
432
457
  return typeof value === 'number' && !isNaN(value) && value > 0;
433
458
  }
434
459
 
460
+ /**
461
+ * Returns the set of tool_call ids referenced by an AIMessage — both via the
462
+ * canonical `tool_calls` array and via inline `tool_use` / `tool_call` content
463
+ * blocks (Anthropic-style content arrays).
464
+ */
465
+ function getToolCallIds(message: BaseMessage): Set<string> {
466
+ if (message.getType() !== 'ai') {
467
+ return new Set<string>();
468
+ }
469
+
470
+ const ids = new Set<string>();
471
+ const aiMessage = message as AIMessage;
472
+ for (const toolCall of aiMessage.tool_calls ?? []) {
473
+ if (typeof toolCall.id === 'string' && toolCall.id.length > 0) {
474
+ ids.add(toolCall.id);
475
+ }
476
+ }
477
+
478
+ if (Array.isArray(aiMessage.content)) {
479
+ for (const part of aiMessage.content) {
480
+ if (typeof part !== 'object') {
481
+ continue;
482
+ }
483
+ const record = part as { type?: unknown; id?: unknown };
484
+ if (
485
+ (record.type === 'tool_use' || record.type === 'tool_call') &&
486
+ typeof record.id === 'string' &&
487
+ record.id.length > 0
488
+ ) {
489
+ ids.add(record.id);
490
+ }
491
+ }
492
+ }
493
+
494
+ return ids;
495
+ }
496
+
497
+ function getToolResultId(message: BaseMessage): string | null {
498
+ if (message.getType() !== 'tool') {
499
+ return null;
500
+ }
501
+ const toolMessage = message as ToolMessage & {
502
+ tool_call_id?: unknown;
503
+ toolCallId?: unknown;
504
+ };
505
+ if (
506
+ typeof toolMessage.tool_call_id === 'string' &&
507
+ toolMessage.tool_call_id.length > 0
508
+ ) {
509
+ return toolMessage.tool_call_id;
510
+ }
511
+ if (
512
+ typeof toolMessage.toolCallId === 'string' &&
513
+ toolMessage.toolCallId.length > 0
514
+ ) {
515
+ return toolMessage.toolCallId;
516
+ }
517
+ return null;
518
+ }
519
+
520
+ function resolveTokenCountForMessage({
521
+ message,
522
+ messageIndexMap,
523
+ tokenCounter,
524
+ indexTokenCountMap,
525
+ }: {
526
+ message: BaseMessage;
527
+ messageIndexMap: Map<BaseMessage, number>;
528
+ tokenCounter: TokenCounter;
529
+ indexTokenCountMap: Record<string, number | undefined>;
530
+ }): number {
531
+ const originalIndex = messageIndexMap.get(message) ?? -1;
532
+ if (originalIndex > -1 && indexTokenCountMap[originalIndex] != null) {
533
+ return indexTokenCountMap[originalIndex] as number;
534
+ }
535
+ return tokenCounter(message);
536
+ }
537
+
538
+ /**
539
+ * Repairs orphan tool messages in a pruned context. Drops `ToolMessage`s whose
540
+ * matching `AIMessage` was pruned, and strips orphan `tool_use` content blocks
541
+ * (and `tool_calls` entries) from `AIMessage`s whose corresponding tool results
542
+ * are missing. Without this, Anthropic / Bedrock / OpenAI reject the request
543
+ * with a structural validation 400.
544
+ *
545
+ * Intended to run on the post-prune `context` array (not the pre-prune
546
+ * `allMessages`). The dropped messages are returned so the caller can append
547
+ * them to `messagesToRefine` for summarization fidelity.
548
+ */
549
+ export function repairOrphanedToolMessages({
550
+ context,
551
+ allMessages,
552
+ tokenCounter,
553
+ indexTokenCountMap,
554
+ }: {
555
+ context: BaseMessage[];
556
+ allMessages: BaseMessage[];
557
+ tokenCounter: TokenCounter;
558
+ indexTokenCountMap: Record<string, number | undefined>;
559
+ }): {
560
+ context: BaseMessage[];
561
+ reclaimedTokens: number;
562
+ droppedOrphanCount: number;
563
+ /** Messages removed from context during orphan repair. These should be
564
+ * appended to `messagesToRefine` so that summarization can still see them
565
+ * (e.g. a ToolMessage whose parent AI was pruned). */
566
+ droppedMessages: BaseMessage[];
567
+ } {
568
+ const messageIndexMap = new Map<BaseMessage, number>();
569
+ for (let i = 0; i < allMessages.length; i++) {
570
+ messageIndexMap.set(allMessages[i], i);
571
+ }
572
+
573
+ const validToolCallIds = new Set<string>();
574
+ const presentToolResultIds = new Set<string>();
575
+ for (const message of context) {
576
+ for (const id of getToolCallIds(message)) {
577
+ validToolCallIds.add(id);
578
+ }
579
+ const resultId = getToolResultId(message);
580
+ if (resultId != null) {
581
+ presentToolResultIds.add(resultId);
582
+ }
583
+ }
584
+
585
+ let reclaimedTokens = 0;
586
+ let droppedOrphanCount = 0;
587
+ const repairedContext: BaseMessage[] = [];
588
+ const droppedMessages: BaseMessage[] = [];
589
+
590
+ for (const message of context) {
591
+ if (message.getType() === 'tool') {
592
+ const toolResultId = getToolResultId(message);
593
+ if (toolResultId == null || !validToolCallIds.has(toolResultId)) {
594
+ droppedOrphanCount += 1;
595
+ reclaimedTokens += resolveTokenCountForMessage({
596
+ message,
597
+ tokenCounter,
598
+ messageIndexMap,
599
+ indexTokenCountMap,
600
+ });
601
+ droppedMessages.push(message);
602
+ continue;
603
+ }
604
+ repairedContext.push(message);
605
+ continue;
606
+ }
607
+
608
+ if (message.getType() === 'ai' && message instanceof AIMessage) {
609
+ const toolCallIds = getToolCallIds(message);
610
+ if (toolCallIds.size > 0) {
611
+ let hasOrphanToolCalls = false;
612
+ for (const id of toolCallIds) {
613
+ if (!presentToolResultIds.has(id)) {
614
+ hasOrphanToolCalls = true;
615
+ break;
616
+ }
617
+ }
618
+ if (hasOrphanToolCalls) {
619
+ const originalTokens = resolveTokenCountForMessage({
620
+ message,
621
+ messageIndexMap,
622
+ tokenCounter,
623
+ indexTokenCountMap,
624
+ });
625
+ const stripped = stripOrphanToolUseBlocks(
626
+ message,
627
+ presentToolResultIds
628
+ );
629
+ if (stripped != null) {
630
+ const strippedTokens = tokenCounter(stripped);
631
+ reclaimedTokens += originalTokens - strippedTokens;
632
+ repairedContext.push(stripped);
633
+ } else {
634
+ droppedOrphanCount += 1;
635
+ reclaimedTokens += originalTokens;
636
+ droppedMessages.push(message);
637
+ }
638
+ continue;
639
+ }
640
+ }
641
+ }
642
+
643
+ repairedContext.push(message);
644
+ }
645
+
646
+ return {
647
+ context: repairedContext,
648
+ reclaimedTokens,
649
+ droppedOrphanCount,
650
+ droppedMessages,
651
+ };
652
+ }
653
+
654
+ /**
655
+ * Strips tool_use content blocks and tool_calls entries from an AI message
656
+ * when their corresponding ToolMessages are not in the context.
657
+ * Returns null if the message has no content left after stripping.
658
+ */
659
+ function stripOrphanToolUseBlocks(
660
+ message: AIMessage,
661
+ presentToolResultIds: Set<string>
662
+ ): AIMessage | null {
663
+ const keptToolCalls = (message.tool_calls ?? []).filter(
664
+ (tc) => typeof tc.id === 'string' && presentToolResultIds.has(tc.id)
665
+ );
666
+
667
+ let keptContent: MessageContentComplex[] | string;
668
+ if (Array.isArray(message.content)) {
669
+ const filtered = (message.content as MessageContentComplex[]).filter(
670
+ (block) => {
671
+ if (typeof block !== 'object') {
672
+ return true;
673
+ }
674
+ const record = block as { type?: unknown; id?: unknown };
675
+ if (
676
+ (record.type === 'tool_use' || record.type === 'tool_call') &&
677
+ typeof record.id === 'string'
678
+ ) {
679
+ return presentToolResultIds.has(record.id);
680
+ }
681
+ return true;
682
+ }
683
+ );
684
+
685
+ if (filtered.length === 0) {
686
+ return null;
687
+ }
688
+ keptContent = filtered;
689
+ } else {
690
+ keptContent = message.content;
691
+ }
692
+
693
+ return new AIMessage({
694
+ ...message,
695
+ content: keptContent,
696
+ tool_calls: keptToolCalls.length > 0 ? keptToolCalls : undefined,
697
+ });
698
+ }
699
+
700
+ /**
701
+ * Lightweight structural cleanup: strips orphan tool_use blocks from AI messages
702
+ * and drops orphan ToolMessages whose AI counterpart is missing.
703
+ *
704
+ * Unlike `repairOrphanedToolMessages`, this does NOT track tokens — it is
705
+ * intended as a final safety net right before model invocation to prevent
706
+ * Anthropic / Bedrock structural validation errors.
707
+ *
708
+ * Uses duck-typing instead of `getType()` because messages at this stage
709
+ * may be plain objects (from LangGraph state serialization) rather than
710
+ * proper BaseMessage class instances.
711
+ *
712
+ * Includes a fast-path: if every tool_call has a matching tool_result and
713
+ * vice-versa, the original array is returned immediately with zero allocation.
714
+ */
715
+ export function sanitizeOrphanToolBlocks(
716
+ messages: BaseMessage[]
717
+ ): BaseMessage[] {
718
+ const allToolCallIds = new Set<string>();
719
+ const allToolResultIds = new Set<string>();
720
+
721
+ for (const msg of messages) {
722
+ const msgAny = msg as unknown as Record<string, unknown>;
723
+ const toolCalls = msgAny.tool_calls as Array<{ id?: string }> | undefined;
724
+ if (Array.isArray(toolCalls)) {
725
+ for (const tc of toolCalls) {
726
+ if (
727
+ typeof tc.id === 'string' &&
728
+ tc.id.length > 0 &&
729
+ !tc.id.startsWith(Constants.ANTHROPIC_SERVER_TOOL_PREFIX)
730
+ ) {
731
+ allToolCallIds.add(tc.id);
732
+ }
733
+ }
734
+ }
735
+ if (Array.isArray(msgAny.content)) {
736
+ for (const block of msgAny.content as Array<Record<string, unknown>>) {
737
+ if (
738
+ typeof block === 'object' &&
739
+ (block.type === 'tool_use' || block.type === 'tool_call') &&
740
+ typeof block.id === 'string' &&
741
+ !block.id.startsWith(Constants.ANTHROPIC_SERVER_TOOL_PREFIX)
742
+ ) {
743
+ allToolCallIds.add(block.id);
744
+ }
745
+ }
746
+ }
747
+ const toolCallId = msgAny.tool_call_id as string | undefined;
748
+ if (typeof toolCallId === 'string' && toolCallId.length > 0) {
749
+ allToolResultIds.add(toolCallId);
750
+ }
751
+ }
752
+
753
+ let hasOrphans = false;
754
+ for (const id of allToolCallIds) {
755
+ if (!allToolResultIds.has(id)) {
756
+ hasOrphans = true;
757
+ break;
758
+ }
759
+ }
760
+ if (!hasOrphans) {
761
+ for (const id of allToolResultIds) {
762
+ if (!allToolCallIds.has(id)) {
763
+ hasOrphans = true;
764
+ break;
765
+ }
766
+ }
767
+ }
768
+ if (!hasOrphans) {
769
+ return messages;
770
+ }
771
+
772
+ const result: BaseMessage[] = [];
773
+ const strippedAiIndices = new Set<number>();
774
+
775
+ for (const msg of messages) {
776
+ const msgAny = msg as unknown as Record<string, unknown>;
777
+ const msgType =
778
+ typeof (msg as { getType?: unknown }).getType === 'function'
779
+ ? msg.getType()
780
+ : ((msgAny.role as string | undefined) ??
781
+ (msgAny._type as string | undefined));
782
+
783
+ const toolCallId = msgAny.tool_call_id as string | undefined;
784
+ if (
785
+ (msgType === 'tool' || msg instanceof ToolMessage) &&
786
+ typeof toolCallId === 'string' &&
787
+ !allToolCallIds.has(toolCallId)
788
+ ) {
789
+ continue;
790
+ }
791
+
792
+ const toolCalls = msgAny.tool_calls as Array<{ id?: string }> | undefined;
793
+ if (
794
+ (msgType === 'ai' ||
795
+ msgType === 'assistant' ||
796
+ msg instanceof AIMessage) &&
797
+ Array.isArray(toolCalls) &&
798
+ toolCalls.length > 0
799
+ ) {
800
+ const hasOrphanCalls = toolCalls.some(
801
+ (tc) => typeof tc.id === 'string' && !allToolResultIds.has(tc.id)
802
+ );
803
+ if (hasOrphanCalls) {
804
+ if (msg instanceof AIMessage) {
805
+ const stripped = stripOrphanToolUseBlocks(msg, allToolResultIds);
806
+ if (stripped != null) {
807
+ strippedAiIndices.add(result.length);
808
+ result.push(stripped);
809
+ }
810
+ continue;
811
+ }
812
+ const keptToolCalls = toolCalls.filter(
813
+ (tc) => typeof tc.id === 'string' && allToolResultIds.has(tc.id)
814
+ );
815
+ const keptContent = Array.isArray(msgAny.content)
816
+ ? (msgAny.content as Array<Record<string, unknown>>).filter(
817
+ (block) => {
818
+ if (typeof block !== 'object') return true;
819
+ if (
820
+ (block.type === 'tool_use' || block.type === 'tool_call') &&
821
+ typeof block.id === 'string'
822
+ ) {
823
+ return allToolResultIds.has(block.id);
824
+ }
825
+ return true;
826
+ }
827
+ )
828
+ : msgAny.content;
829
+ if (
830
+ keptToolCalls.length === 0 &&
831
+ Array.isArray(keptContent) &&
832
+ keptContent.length === 0
833
+ ) {
834
+ continue;
835
+ }
836
+ strippedAiIndices.add(result.length);
837
+ const patched = Object.create(
838
+ Object.getPrototypeOf(msg),
839
+ Object.getOwnPropertyDescriptors(msg)
840
+ );
841
+ patched.tool_calls = keptToolCalls.length > 0 ? keptToolCalls : [];
842
+ patched.content = keptContent;
843
+ result.push(patched as BaseMessage);
844
+ continue;
845
+ }
846
+ }
847
+
848
+ result.push(msg);
849
+ }
850
+
851
+ // Bedrock/Anthropic require the conversation to end with a user message;
852
+ // a stripped AI message (tool_use removed) represents a dead-end exchange.
853
+ while (result.length > 0 && strippedAiIndices.has(result.length - 1)) {
854
+ result.pop();
855
+ }
856
+
857
+ return result;
858
+ }
859
+
860
+ /**
861
+ * Pre-flight truncation: truncates oversized tool result string content before
862
+ * the budget walker runs. Older results get smaller budgets (recency factor),
863
+ * with a 200-char floor so even ancient entries keep diagnostic signal. Returns
864
+ * the number of ToolMessages truncated.
865
+ */
866
+ export function preFlightTruncateToolResults(params: {
867
+ messages: BaseMessage[];
868
+ maxContextTokens: number;
869
+ indexTokenCountMap: Record<string, number | undefined>;
870
+ tokenCounter: TokenCounter;
871
+ }): number {
872
+ const { messages, maxContextTokens, indexTokenCountMap, tokenCounter } =
873
+ params;
874
+ const baseMaxChars = calculateMaxToolResultChars(maxContextTokens);
875
+ let truncatedCount = 0;
876
+
877
+ const toolIndices: number[] = [];
878
+ for (let i = 0; i < messages.length; i++) {
879
+ if (messages[i].getType() === 'tool') {
880
+ toolIndices.push(i);
881
+ }
882
+ }
883
+
884
+ for (let t = 0; t < toolIndices.length; t++) {
885
+ const i = toolIndices[t];
886
+ const message = messages[i];
887
+ const content = message.content;
888
+ if (typeof content !== 'string') {
889
+ continue;
890
+ }
891
+
892
+ const position = toolIndices.length > 1 ? t / (toolIndices.length - 1) : 1;
893
+ const recencyFactor = 0.2 + 0.8 * position;
894
+ const maxChars = Math.max(200, Math.floor(baseMaxChars * recencyFactor));
895
+
896
+ if (content.length <= maxChars) {
897
+ continue;
898
+ }
899
+
900
+ const truncated = truncateToolResultContent(content, maxChars);
901
+ const cloned = new ToolMessage({
902
+ content: truncated,
903
+ tool_call_id: (message as ToolMessage).tool_call_id,
904
+ name: message.name,
905
+ id: message.id,
906
+ additional_kwargs: message.additional_kwargs,
907
+ response_metadata: message.response_metadata,
908
+ });
909
+ messages[i] = cloned;
910
+ indexTokenCountMap[i] = tokenCounter(cloned);
911
+ truncatedCount++;
912
+ }
913
+
914
+ return truncatedCount;
915
+ }
916
+
917
+ /**
918
+ * Pre-flight truncation: truncates oversized `tool_use` input fields in AI messages.
919
+ *
920
+ * Tool call inputs (arguments) can be very large — e.g., code evaluation payloads from
921
+ * MCP tools like chrome-devtools. Since these tool calls have already been executed,
922
+ * the model only needs a summary of what was called, not the full arguments. Truncating
923
+ * them before pruning can prevent entire messages from being dropped.
924
+ *
925
+ * Uses 15% of the context window (in estimated characters, ~4 chars/token) as the
926
+ * per-input cap, capped at 200K chars.
927
+ *
928
+ * @returns The number of AI messages that had tool_use inputs truncated.
929
+ */
930
+ export function preFlightTruncateToolCallInputs(params: {
931
+ messages: BaseMessage[];
932
+ maxContextTokens: number;
933
+ indexTokenCountMap: Record<string, number | undefined>;
934
+ tokenCounter: TokenCounter;
935
+ }): number {
936
+ const { messages, maxContextTokens, indexTokenCountMap, tokenCounter } =
937
+ params;
938
+ const maxInputChars = Math.min(
939
+ Math.floor(maxContextTokens * 0.15) * 4,
940
+ 200_000
941
+ );
942
+ let truncatedCount = 0;
943
+
944
+ for (let i = 0; i < messages.length; i++) {
945
+ const message = messages[i];
946
+ if (message.getType() !== 'ai') {
947
+ continue;
948
+ }
949
+ if (!Array.isArray(message.content)) {
950
+ continue;
951
+ }
952
+
953
+ const originalContent = message.content as MessageContentComplex[];
954
+ const state = { changed: false };
955
+ const newContent = originalContent.map((block) => {
956
+ if (typeof block !== 'object') {
957
+ return block;
958
+ }
959
+ const record = block as Record<string, unknown>;
960
+ if (record.type !== 'tool_use' && record.type !== 'tool_call') {
961
+ return block;
962
+ }
963
+
964
+ const input = record.input;
965
+ if (input == null) {
966
+ return block;
967
+ }
968
+ const serialized =
969
+ typeof input === 'string' ? input : JSON.stringify(input);
970
+ if (serialized.length <= maxInputChars) {
971
+ return block;
972
+ }
973
+
974
+ state.changed = true;
975
+ // Replaces original input with { _truncated, _originalChars } —
976
+ // safe because the tool call already executed in a prior turn.
977
+ return {
978
+ ...record,
979
+ input: truncateToolInput(serialized, maxInputChars),
980
+ };
981
+ });
982
+
983
+ if (!state.changed) {
984
+ continue;
985
+ }
986
+
987
+ const aiMsg = message as AIMessage;
988
+ const newToolCalls = (aiMsg.tool_calls ?? []).map((tc) => {
989
+ const serializedArgs = JSON.stringify(tc.args);
990
+ if (serializedArgs.length <= maxInputChars) {
991
+ return tc;
992
+ }
993
+ // Replaces original args with { _truncated, _originalChars } —
994
+ // safe because the tool call already executed in a prior turn.
995
+ return {
996
+ ...tc,
997
+ args: truncateToolInput(serializedArgs, maxInputChars),
998
+ };
999
+ });
1000
+
1001
+ messages[i] = new AIMessage({
1002
+ ...aiMsg,
1003
+ content: newContent,
1004
+ tool_calls: newToolCalls.length > 0 ? newToolCalls : undefined,
1005
+ });
1006
+ indexTokenCountMap[i] = tokenCounter(messages[i]);
1007
+ truncatedCount++;
1008
+ }
1009
+
1010
+ return truncatedCount;
1011
+ }
1012
+
435
1013
  type ThinkingBlocks = {
436
1014
  thinking_blocks?: Array<{
437
1015
  type: 'thinking';
@@ -449,10 +1027,18 @@ export function createPruneMessages(factoryParams: PruneMessagesFactoryParams) {
449
1027
  0
450
1028
  ) as number;
451
1029
  let runThinkingStartIndex = -1;
1030
+ /**
1031
+ * Original (pre-truncation) tool result content keyed by message index.
1032
+ * Lets the summarizer see full tool outputs even after pre-flight truncation
1033
+ * has shortened them in the live messages array. Cleared whenever the
1034
+ * factory is recreated (e.g. after a summarization checkpoint).
1035
+ */
1036
+ const originalToolContent = new Map<number, string>();
452
1037
  return function pruneMessages(params: PruneMessagesParams): {
453
1038
  context: BaseMessage[];
454
1039
  indexTokenCountMap: Record<string, number | undefined>;
455
1040
  messagesToRefine: BaseMessage[];
1041
+ originalToolContent?: Map<number, string>;
456
1042
  } {
457
1043
  if (
458
1044
  factoryParams.provider === Providers.OPENAI &&
@@ -586,6 +1172,51 @@ export function createPruneMessages(factoryParams: PruneMessagesFactoryParams) {
586
1172
  };
587
1173
  }
588
1174
 
1175
+ /*
1176
+ * Pre-flight truncation: chop oversized tool result content and oversized
1177
+ * tool_use input args BEFORE the budget walker runs. Older results get
1178
+ * smaller per-message budgets (recencyFactor) so they degrade first while
1179
+ * recent turns stay intact. Saves the originals in `originalToolContent`
1180
+ * keyed by message index so the summarizer can later reconstruct full
1181
+ * fidelity even after the live array was shortened.
1182
+ */
1183
+ for (let i = 0; i < params.messages.length; i++) {
1184
+ const m = params.messages[i];
1185
+ if (
1186
+ m.getType() === 'tool' &&
1187
+ typeof m.content === 'string' &&
1188
+ !originalToolContent.has(i)
1189
+ ) {
1190
+ originalToolContent.set(i, m.content);
1191
+ }
1192
+ }
1193
+ preFlightTruncateToolResults({
1194
+ messages: params.messages,
1195
+ maxContextTokens: factoryParams.maxTokens,
1196
+ indexTokenCountMap,
1197
+ tokenCounter: factoryParams.tokenCounter,
1198
+ });
1199
+ preFlightTruncateToolCallInputs({
1200
+ messages: params.messages,
1201
+ maxContextTokens: factoryParams.maxTokens,
1202
+ indexTokenCountMap,
1203
+ tokenCounter: factoryParams.tokenCounter,
1204
+ });
1205
+
1206
+ /*
1207
+ * Position-based content degradation: soft-trim then hard-clear older tool
1208
+ * results before the budget walker runs. Off by default — caller opts in
1209
+ * via `contextPruningConfig.enabled`.
1210
+ */
1211
+ if (factoryParams.contextPruningConfig?.enabled) {
1212
+ applyContextPruning({
1213
+ messages: params.messages,
1214
+ indexTokenCountMap,
1215
+ tokenCounter: factoryParams.tokenCounter,
1216
+ config: factoryParams.contextPruningConfig,
1217
+ });
1218
+ }
1219
+
589
1220
  const { context, thinkingStartIndex, messagesToRefine } =
590
1221
  getMessagesWithinTokenLimit({
591
1222
  maxContextTokens: factoryParams.maxTokens,
@@ -604,14 +1235,40 @@ export function createPruneMessages(factoryParams: PruneMessagesFactoryParams) {
604
1235
  : undefined,
605
1236
  });
606
1237
  runThinkingStartIndex = thinkingStartIndex ?? -1;
1238
+
1239
+ /*
1240
+ * Orphan repair pass — drops tool messages whose AIMessage was pruned and
1241
+ * strips orphan tool_use blocks from AIMessages whose tool results are
1242
+ * missing. Without this, the budget walker can split tool_use ↔ tool_result
1243
+ * pairs and the provider rejects the request with a structural 400.
1244
+ * Dropped messages flow into messagesToRefine for summarization.
1245
+ */
1246
+ const repaired = repairOrphanedToolMessages({
1247
+ context,
1248
+ allMessages: params.messages,
1249
+ tokenCounter: factoryParams.tokenCounter,
1250
+ indexTokenCountMap,
1251
+ });
1252
+ const finalContext = repaired.context;
1253
+ const finalMessagesToRefine =
1254
+ repaired.droppedMessages.length > 0
1255
+ ? [...messagesToRefine, ...repaired.droppedMessages]
1256
+ : messagesToRefine;
1257
+
607
1258
  /** The index is the first value of `context`, index relative to `params.messages` */
608
1259
  lastCutOffIndex = Math.max(
609
1260
  params.messages.length -
610
- (context.length - (context[0]?.getType() === 'system' ? 1 : 0)),
1261
+ (finalContext.length -
1262
+ (finalContext[0]?.getType() === 'system' ? 1 : 0)),
611
1263
  0
612
1264
  );
613
1265
 
614
- return { context, indexTokenCountMap, messagesToRefine };
1266
+ return {
1267
+ context: finalContext,
1268
+ indexTokenCountMap,
1269
+ messagesToRefine: finalMessagesToRefine,
1270
+ originalToolContent,
1271
+ };
615
1272
  };
616
1273
  }
617
1274