@illuma-ai/agents 1.4.0-alpha.6 → 1.5.1

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 (653) 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/graphs/phases/memoryFlushPhase.cjs +1 -1
  11. package/dist/cjs/graphs/phases/memoryFlushPhase.cjs.map +1 -1
  12. package/dist/cjs/hooks/HookRegistry.cjs +162 -0
  13. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -0
  14. package/dist/cjs/hooks/executeHooks.cjs +276 -0
  15. package/dist/cjs/hooks/executeHooks.cjs.map +1 -0
  16. package/dist/cjs/hooks/matchers.cjs +256 -0
  17. package/dist/cjs/hooks/matchers.cjs.map +1 -0
  18. package/dist/cjs/hooks/types.cjs +27 -0
  19. package/dist/cjs/hooks/types.cjs.map +1 -0
  20. package/dist/cjs/langchain/google-common.cjs +3 -0
  21. package/dist/cjs/langchain/google-common.cjs.map +1 -0
  22. package/dist/cjs/langchain/index.cjs +86 -0
  23. package/dist/cjs/langchain/index.cjs.map +1 -0
  24. package/dist/cjs/langchain/language_models/chat_models.cjs +3 -0
  25. package/dist/cjs/langchain/language_models/chat_models.cjs.map +1 -0
  26. package/dist/cjs/langchain/messages/tool.cjs +3 -0
  27. package/dist/cjs/langchain/messages/tool.cjs.map +1 -0
  28. package/dist/cjs/langchain/messages.cjs +51 -0
  29. package/dist/cjs/langchain/messages.cjs.map +1 -0
  30. package/dist/cjs/langchain/openai.cjs +3 -0
  31. package/dist/cjs/langchain/openai.cjs.map +1 -0
  32. package/dist/cjs/langchain/prompts.cjs +11 -0
  33. package/dist/cjs/langchain/prompts.cjs.map +1 -0
  34. package/dist/cjs/langchain/runnables.cjs +19 -0
  35. package/dist/cjs/langchain/runnables.cjs.map +1 -0
  36. package/dist/cjs/langchain/tools.cjs +23 -0
  37. package/dist/cjs/langchain/tools.cjs.map +1 -0
  38. package/dist/cjs/langchain/utils/env.cjs +11 -0
  39. package/dist/cjs/langchain/utils/env.cjs.map +1 -0
  40. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +5 -1
  41. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  42. package/dist/cjs/llm/bedrock/cacheSupport.cjs +55 -0
  43. package/dist/cjs/llm/bedrock/cacheSupport.cjs.map +1 -0
  44. package/dist/cjs/llm/bedrock/index.cjs +61 -33
  45. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  46. package/dist/cjs/llm/openai/index.cjs +1 -4
  47. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  48. package/dist/cjs/llm/openai/utils/index.cjs +27 -10
  49. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  50. package/dist/cjs/main.cjs +178 -127
  51. package/dist/cjs/main.cjs.map +1 -1
  52. package/dist/cjs/memory/citations.cjs +4 -4
  53. package/dist/cjs/memory/citations.cjs.map +1 -1
  54. package/dist/cjs/memory/constants.cjs +17 -17
  55. package/dist/cjs/memory/constants.cjs.map +1 -1
  56. package/dist/cjs/memory/mmr.cjs +1 -1
  57. package/dist/cjs/memory/mmr.cjs.map +1 -1
  58. package/dist/cjs/memory/paths.cjs +1 -1
  59. package/dist/cjs/memory/paths.cjs.map +1 -1
  60. package/dist/cjs/memory/recallTracking.cjs +3 -3
  61. package/dist/cjs/memory/recallTracking.cjs.map +1 -1
  62. package/dist/cjs/memory/temporalDecay.cjs +2 -2
  63. package/dist/cjs/memory/temporalDecay.cjs.map +1 -1
  64. package/dist/cjs/messages/cache.cjs +89 -0
  65. package/dist/cjs/messages/cache.cjs.map +1 -1
  66. package/dist/cjs/messages/contextPruning.cjs +156 -0
  67. package/dist/cjs/messages/contextPruning.cjs.map +1 -0
  68. package/dist/cjs/messages/contextPruningSettings.cjs +53 -0
  69. package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -0
  70. package/dist/cjs/messages/format.cjs +144 -20
  71. package/dist/cjs/messages/format.cjs.map +1 -1
  72. package/dist/cjs/messages/prune.cjs +505 -4
  73. package/dist/cjs/messages/prune.cjs.map +1 -1
  74. package/dist/cjs/run.cjs +141 -1
  75. package/dist/cjs/run.cjs.map +1 -1
  76. package/dist/cjs/tools/BashExecutor.cjs +235 -0
  77. package/dist/cjs/tools/BashExecutor.cjs.map +1 -0
  78. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +297 -0
  79. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -0
  80. package/dist/cjs/tools/CodeExecutor.cjs +45 -47
  81. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  82. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +16 -11
  83. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  84. package/dist/cjs/tools/ReadFile.cjs +44 -0
  85. package/dist/cjs/tools/ReadFile.cjs.map +1 -0
  86. package/dist/cjs/tools/SkillTool.cjs +51 -0
  87. package/dist/cjs/tools/SkillTool.cjs.map +1 -0
  88. package/dist/cjs/tools/SubagentTool.cjs +93 -0
  89. package/dist/cjs/tools/SubagentTool.cjs.map +1 -0
  90. package/dist/cjs/tools/ToolNode.cjs +450 -24
  91. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  92. package/dist/cjs/tools/memory/memoryAppendTool.cjs +1 -1
  93. package/dist/cjs/tools/memory/memoryAppendTool.cjs.map +1 -1
  94. package/dist/cjs/tools/memory/memoryGetTool.cjs +2 -2
  95. package/dist/cjs/tools/memory/memoryGetTool.cjs.map +1 -1
  96. package/dist/cjs/tools/memory/memorySearchTool.cjs +3 -3
  97. package/dist/cjs/tools/memory/memorySearchTool.cjs.map +1 -1
  98. package/dist/cjs/tools/memory/shared.cjs +1 -1
  99. package/dist/cjs/tools/memory/shared.cjs.map +1 -1
  100. package/dist/cjs/tools/search/search.cjs +11 -3
  101. package/dist/cjs/tools/search/search.cjs.map +1 -1
  102. package/dist/cjs/tools/search/tavily-scraper.cjs +189 -0
  103. package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -0
  104. package/dist/cjs/tools/search/tavily-search.cjs +372 -0
  105. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -0
  106. package/dist/cjs/tools/search/tool.cjs +28 -4
  107. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  108. package/dist/cjs/tools/search/utils.cjs +10 -3
  109. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  110. package/dist/cjs/tools/skillCatalog.cjs +84 -0
  111. package/dist/cjs/tools/skillCatalog.cjs.map +1 -0
  112. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +512 -0
  113. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -0
  114. package/dist/cjs/tools/toolOutputReferences.cjs +670 -0
  115. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -0
  116. package/dist/cjs/types/agent-cache.cjs +54 -0
  117. package/dist/cjs/types/agent-cache.cjs.map +1 -0
  118. package/dist/cjs/types/graph.cjs.map +1 -1
  119. package/dist/cjs/utils/truncation.cjs +135 -0
  120. package/dist/cjs/utils/truncation.cjs.map +1 -0
  121. package/dist/esm/agents/AgentContext.mjs +274 -67
  122. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  123. package/dist/esm/common/enum.mjs +44 -12
  124. package/dist/esm/common/enum.mjs.map +1 -1
  125. package/dist/esm/graphs/Graph.mjs +182 -5
  126. package/dist/esm/graphs/Graph.mjs.map +1 -1
  127. package/dist/esm/graphs/MultiAgentGraph.mjs +155 -1170
  128. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  129. package/dist/esm/graphs/phases/memoryFlushPhase.mjs +1 -1
  130. package/dist/esm/graphs/phases/memoryFlushPhase.mjs.map +1 -1
  131. package/dist/esm/hooks/HookRegistry.mjs +160 -0
  132. package/dist/esm/hooks/HookRegistry.mjs.map +1 -0
  133. package/dist/esm/hooks/executeHooks.mjs +273 -0
  134. package/dist/esm/hooks/executeHooks.mjs.map +1 -0
  135. package/dist/esm/hooks/matchers.mjs +251 -0
  136. package/dist/esm/hooks/matchers.mjs.map +1 -0
  137. package/dist/esm/hooks/types.mjs +25 -0
  138. package/dist/esm/hooks/types.mjs.map +1 -0
  139. package/dist/esm/langchain/google-common.mjs +2 -0
  140. package/dist/esm/langchain/google-common.mjs.map +1 -0
  141. package/dist/esm/langchain/index.mjs +5 -0
  142. package/dist/esm/langchain/language_models/chat_models.mjs +2 -0
  143. package/dist/esm/langchain/language_models/chat_models.mjs.map +1 -0
  144. package/dist/esm/langchain/messages/tool.mjs +2 -0
  145. package/dist/esm/langchain/messages/tool.mjs.map +1 -0
  146. package/dist/esm/langchain/messages.mjs +2 -0
  147. package/dist/esm/langchain/messages.mjs.map +1 -0
  148. package/dist/esm/langchain/openai.mjs +2 -0
  149. package/dist/esm/langchain/openai.mjs.map +1 -0
  150. package/dist/esm/langchain/prompts.mjs +2 -0
  151. package/dist/esm/langchain/prompts.mjs.map +1 -0
  152. package/dist/esm/langchain/runnables.mjs +2 -0
  153. package/dist/esm/langchain/runnables.mjs.map +1 -0
  154. package/dist/esm/langchain/tools.mjs +2 -0
  155. package/dist/esm/langchain/tools.mjs.map +1 -0
  156. package/dist/esm/langchain/utils/env.mjs +2 -0
  157. package/dist/esm/langchain/utils/env.mjs.map +1 -0
  158. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +5 -1
  159. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  160. package/dist/esm/llm/bedrock/cacheSupport.mjs +52 -0
  161. package/dist/esm/llm/bedrock/cacheSupport.mjs.map +1 -0
  162. package/dist/esm/llm/bedrock/index.mjs +61 -34
  163. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  164. package/dist/esm/llm/openai/index.mjs +1 -4
  165. package/dist/esm/llm/openai/index.mjs.map +1 -1
  166. package/dist/esm/llm/openai/utils/index.mjs +27 -10
  167. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  168. package/dist/esm/main.mjs +21 -27
  169. package/dist/esm/main.mjs.map +1 -1
  170. package/dist/esm/memory/citations.mjs +4 -4
  171. package/dist/esm/memory/citations.mjs.map +1 -1
  172. package/dist/esm/memory/constants.mjs +17 -17
  173. package/dist/esm/memory/constants.mjs.map +1 -1
  174. package/dist/esm/memory/mmr.mjs +1 -1
  175. package/dist/esm/memory/mmr.mjs.map +1 -1
  176. package/dist/esm/memory/paths.mjs +1 -1
  177. package/dist/esm/memory/paths.mjs.map +1 -1
  178. package/dist/esm/memory/recallTracking.mjs +3 -3
  179. package/dist/esm/memory/recallTracking.mjs.map +1 -1
  180. package/dist/esm/memory/temporalDecay.mjs +2 -2
  181. package/dist/esm/memory/temporalDecay.mjs.map +1 -1
  182. package/dist/esm/messages/cache.mjs +89 -0
  183. package/dist/esm/messages/cache.mjs.map +1 -1
  184. package/dist/esm/messages/contextPruning.mjs +154 -0
  185. package/dist/esm/messages/contextPruning.mjs.map +1 -0
  186. package/dist/esm/messages/contextPruningSettings.mjs +50 -0
  187. package/dist/esm/messages/contextPruningSettings.mjs.map +1 -0
  188. package/dist/esm/messages/format.mjs +136 -12
  189. package/dist/esm/messages/format.mjs.map +1 -1
  190. package/dist/esm/messages/prune.mjs +504 -7
  191. package/dist/esm/messages/prune.mjs.map +1 -1
  192. package/dist/esm/run.mjs +141 -1
  193. package/dist/esm/run.mjs.map +1 -1
  194. package/dist/esm/tools/BashExecutor.mjs +227 -0
  195. package/dist/esm/tools/BashExecutor.mjs.map +1 -0
  196. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +288 -0
  197. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -0
  198. package/dist/esm/tools/CodeExecutor.mjs +45 -48
  199. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  200. package/dist/esm/tools/ProgrammaticToolCalling.mjs +17 -12
  201. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  202. package/dist/esm/tools/ReadFile.mjs +39 -0
  203. package/dist/esm/tools/ReadFile.mjs.map +1 -0
  204. package/dist/esm/tools/SkillTool.mjs +46 -0
  205. package/dist/esm/tools/SkillTool.mjs.map +1 -0
  206. package/dist/esm/tools/SubagentTool.mjs +86 -0
  207. package/dist/esm/tools/SubagentTool.mjs.map +1 -0
  208. package/dist/esm/tools/ToolNode.mjs +452 -26
  209. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  210. package/dist/esm/tools/memory/memoryAppendTool.mjs +1 -1
  211. package/dist/esm/tools/memory/memoryAppendTool.mjs.map +1 -1
  212. package/dist/esm/tools/memory/memoryGetTool.mjs +2 -2
  213. package/dist/esm/tools/memory/memoryGetTool.mjs.map +1 -1
  214. package/dist/esm/tools/memory/memorySearchTool.mjs +3 -3
  215. package/dist/esm/tools/memory/memorySearchTool.mjs.map +1 -1
  216. package/dist/esm/tools/memory/shared.mjs +1 -1
  217. package/dist/esm/tools/memory/shared.mjs.map +1 -1
  218. package/dist/esm/tools/search/search.mjs +11 -3
  219. package/dist/esm/tools/search/search.mjs.map +1 -1
  220. package/dist/esm/tools/search/tavily-scraper.mjs +186 -0
  221. package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -0
  222. package/dist/esm/tools/search/tavily-search.mjs +370 -0
  223. package/dist/esm/tools/search/tavily-search.mjs.map +1 -0
  224. package/dist/esm/tools/search/tool.mjs +28 -4
  225. package/dist/esm/tools/search/tool.mjs.map +1 -1
  226. package/dist/esm/tools/search/utils.mjs +10 -3
  227. package/dist/esm/tools/search/utils.mjs.map +1 -1
  228. package/dist/esm/tools/skillCatalog.mjs +82 -0
  229. package/dist/esm/tools/skillCatalog.mjs.map +1 -0
  230. package/dist/esm/tools/subagent/SubagentExecutor.mjs +506 -0
  231. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -0
  232. package/dist/esm/tools/toolOutputReferences.mjs +662 -0
  233. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -0
  234. package/dist/esm/types/agent-cache.mjs +52 -0
  235. package/dist/esm/types/agent-cache.mjs.map +1 -0
  236. package/dist/esm/types/graph.mjs.map +1 -1
  237. package/dist/esm/utils/truncation.mjs +128 -0
  238. package/dist/esm/utils/truncation.mjs.map +1 -0
  239. package/dist/types/agents/AgentContext.d.ts +101 -8
  240. package/dist/types/common/enum.d.ts +39 -12
  241. package/dist/types/common/index.d.ts +0 -1
  242. package/dist/types/graphs/Graph.d.ts +43 -0
  243. package/dist/types/graphs/MultiAgentGraph.d.ts +26 -150
  244. package/dist/types/graphs/index.d.ts +0 -1
  245. package/dist/types/graphs/phases/memoryFlushPhase.d.ts +2 -2
  246. package/dist/types/hooks/HookRegistry.d.ts +56 -0
  247. package/dist/types/hooks/executeHooks.d.ts +79 -0
  248. package/dist/types/hooks/index.d.ts +6 -0
  249. package/dist/types/hooks/matchers.d.ts +95 -0
  250. package/dist/types/hooks/types.d.ts +320 -0
  251. package/dist/types/index.d.ts +9 -9
  252. package/dist/types/langchain/google-common.d.ts +1 -0
  253. package/dist/types/langchain/index.d.ts +8 -0
  254. package/dist/types/langchain/language_models/chat_models.d.ts +1 -0
  255. package/dist/types/langchain/messages/tool.d.ts +1 -0
  256. package/dist/types/langchain/messages.d.ts +2 -0
  257. package/dist/types/langchain/openai.d.ts +1 -0
  258. package/dist/types/langchain/prompts.d.ts +1 -0
  259. package/dist/types/langchain/runnables.d.ts +2 -0
  260. package/dist/types/langchain/tools.d.ts +2 -0
  261. package/dist/types/langchain/utils/env.d.ts +1 -0
  262. package/dist/types/llm/bedrock/cacheSupport.d.ts +35 -0
  263. package/dist/types/llm/bedrock/index.d.ts +54 -1
  264. package/dist/types/llm/openai/index.d.ts +1 -1
  265. package/dist/types/memory/citations.d.ts +4 -4
  266. package/dist/types/memory/constants.d.ts +17 -17
  267. package/dist/types/memory/mmr.d.ts +3 -3
  268. package/dist/types/memory/paths.d.ts +1 -1
  269. package/dist/types/memory/temporalDecay.d.ts +2 -2
  270. package/dist/types/memory/types.d.ts +3 -3
  271. package/dist/types/messages/contextPruning.d.ts +42 -0
  272. package/dist/types/messages/contextPruningSettings.d.ts +44 -0
  273. package/dist/types/messages/format.d.ts +9 -1
  274. package/dist/types/messages/index.d.ts +2 -0
  275. package/dist/types/messages/prune.d.ts +91 -1
  276. package/dist/types/run.d.ts +2 -0
  277. package/dist/types/tools/BashExecutor.d.ts +76 -0
  278. package/dist/types/tools/BashProgrammaticToolCalling.d.ts +72 -0
  279. package/dist/types/tools/CodeExecutor.d.ts +8 -26
  280. package/dist/types/tools/ReadFile.d.ts +28 -0
  281. package/dist/types/tools/SkillTool.d.ts +40 -0
  282. package/dist/types/tools/SubagentTool.d.ts +36 -0
  283. package/dist/types/tools/ToolNode.d.ts +77 -5
  284. package/dist/types/tools/memory/shared.d.ts +1 -1
  285. package/dist/types/tools/search/tavily-scraper.d.ts +19 -0
  286. package/dist/types/tools/search/tavily-search.d.ts +4 -0
  287. package/dist/types/tools/search/types.d.ts +99 -5
  288. package/dist/types/tools/search/utils.d.ts +2 -2
  289. package/dist/types/tools/skillCatalog.d.ts +19 -0
  290. package/dist/types/tools/subagent/SubagentExecutor.d.ts +137 -0
  291. package/dist/types/tools/subagent/index.d.ts +2 -0
  292. package/dist/types/tools/subagent/types.d.ts +84 -0
  293. package/dist/types/tools/toolOutputReferences.d.ts +236 -0
  294. package/dist/types/types/agent-cache.d.ts +71 -0
  295. package/dist/types/types/graph.d.ts +163 -22
  296. package/dist/types/types/index.d.ts +3 -0
  297. package/dist/types/types/messages.d.ts +26 -0
  298. package/dist/types/types/run.d.ts +22 -0
  299. package/dist/types/types/skill.d.ts +9 -0
  300. package/dist/types/types/tools.d.ts +111 -0
  301. package/dist/types/utils/index.d.ts +1 -3
  302. package/dist/types/utils/truncation.d.ts +70 -0
  303. package/package.json +57 -17
  304. package/src/agents/AgentContext.ts +321 -78
  305. package/src/agents/__tests__/AgentContext.cacheTtl.live.test.ts +259 -0
  306. package/src/agents/__tests__/AgentContext.crossAgentTier1.live.test.ts +266 -0
  307. package/src/agents/__tests__/AgentContext.crossUserCache.live.test.ts +342 -0
  308. package/src/agents/__tests__/AgentContext.test.ts +632 -0
  309. package/src/common/__tests__/enum.test.ts +7 -17
  310. package/src/common/enum.ts +43 -12
  311. package/src/common/index.ts +0 -1
  312. package/src/graphs/Graph.ts +222 -2
  313. package/src/graphs/MultiAgentGraph.ts +154 -1466
  314. package/src/graphs/__tests__/MultiAgentGraph.test.ts +91 -0
  315. package/src/graphs/gapFeatures.test.ts +1 -1
  316. package/src/graphs/index.ts +0 -1
  317. package/src/graphs/phases/__tests__/memoryFlushPhase.test.ts +1 -1
  318. package/src/graphs/phases/memoryFlushPhase.ts +2 -2
  319. package/src/hooks/HookRegistry.ts +208 -0
  320. package/src/hooks/__tests__/HookRegistry.test.ts +190 -0
  321. package/src/hooks/__tests__/compactHooks.test.ts +214 -0
  322. package/src/hooks/__tests__/executeHooks.test.ts +1013 -0
  323. package/src/hooks/__tests__/integration.test.ts +337 -0
  324. package/src/hooks/__tests__/matchers.test.ts +238 -0
  325. package/src/hooks/__tests__/toolHooks.test.ts +665 -0
  326. package/src/hooks/executeHooks.ts +375 -0
  327. package/src/hooks/index.ts +57 -0
  328. package/src/hooks/matchers.ts +280 -0
  329. package/src/hooks/types.ts +404 -0
  330. package/src/index.ts +15 -24
  331. package/src/langchain/google-common.ts +1 -0
  332. package/src/langchain/index.ts +8 -0
  333. package/src/langchain/language_models/chat_models.ts +1 -0
  334. package/src/langchain/messages/tool.ts +5 -0
  335. package/src/langchain/messages.ts +21 -0
  336. package/src/langchain/openai.ts +1 -0
  337. package/src/langchain/prompts.ts +1 -0
  338. package/src/langchain/runnables.ts +7 -0
  339. package/src/langchain/tools.ts +8 -0
  340. package/src/langchain/utils/env.ts +1 -0
  341. package/src/llm/anthropic/utils/message_inputs.ts +10 -1
  342. package/src/llm/anthropic/utils/server-tool-inputs.test.ts +436 -0
  343. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +166 -18
  344. package/src/llm/bedrock/cacheSupport.test.ts +99 -0
  345. package/src/llm/bedrock/cacheSupport.ts +53 -0
  346. package/src/llm/bedrock/index.ts +116 -41
  347. package/src/llm/openai/index.ts +2 -2
  348. package/src/llm/openai/utils/index.ts +31 -14
  349. package/src/memory/citations.ts +4 -4
  350. package/src/memory/constants.ts +17 -17
  351. package/src/memory/mmr.ts +3 -3
  352. package/src/memory/paths.ts +1 -1
  353. package/src/memory/recallTracking.ts +3 -3
  354. package/src/memory/temporalDecay.ts +2 -2
  355. package/src/memory/types.ts +3 -3
  356. package/src/messages/__tests__/contextPruning.test.ts +228 -0
  357. package/src/messages/cache.test.ts +62 -24
  358. package/src/messages/cache.ts +112 -0
  359. package/src/messages/contextPruning.ts +191 -0
  360. package/src/messages/contextPruningSettings.ts +90 -0
  361. package/src/messages/ensureThinkingBlock.test.ts +1 -1
  362. package/src/messages/format.ts +164 -12
  363. package/src/messages/formatAgentMessages.skills.test.ts +413 -0
  364. package/src/messages/formatAgentMessages.test.ts +1 -1
  365. package/src/messages/index.ts +2 -0
  366. package/src/messages/prune.ts +661 -4
  367. package/src/run.ts +155 -1
  368. package/src/scripts/multi-agent-chain.ts +2 -2
  369. package/src/scripts/multi-agent-document-review-chain.ts +2 -2
  370. package/src/scripts/multi-agent-hybrid-flow.ts +4 -4
  371. package/src/scripts/multi-agent-parallel.ts +3 -3
  372. package/src/scripts/multi-agent-sequence.ts +3 -3
  373. package/src/scripts/multi-agent-subagent.ts +246 -0
  374. package/src/scripts/multi-agent-supervisor.ts +5 -5
  375. package/src/scripts/poc-multi-agent-comprehensive.ts +8 -8
  376. package/src/scripts/sequential-full-metadata-test.ts +2 -2
  377. package/src/scripts/subagent-event-driven-debug.ts +190 -0
  378. package/src/scripts/subagent-tools-debug.ts +160 -0
  379. package/src/scripts/test-custom-prompt-key.ts +3 -3
  380. package/src/scripts/test-handoff-input.ts +1 -1
  381. package/src/scripts/test-handoff-steering.ts +3 -3
  382. package/src/scripts/test-multi-agent-list-handoff.ts +1 -1
  383. package/src/scripts/test-parallel-agent-labeling.ts +3 -3
  384. package/src/scripts/test-parallel-handoffs.ts +2 -2
  385. package/src/scripts/test-thinking-handoff-bedrock.ts +1 -1
  386. package/src/scripts/test-thinking-handoff.ts +1 -1
  387. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +1 -1
  388. package/src/scripts/test-tool-before-handoff-role-order.ts +1 -1
  389. package/src/scripts/test-tools-before-handoff.ts +1 -1
  390. package/src/specs/agent-handoffs.test.ts +26 -483
  391. package/src/specs/anthropic.simple.test.ts +61 -0
  392. package/src/specs/multi-agent-summarization.test.ts +396 -0
  393. package/src/specs/prune.orphans.test.ts +248 -0
  394. package/src/specs/prune.test.ts +104 -16
  395. package/src/specs/thinking-handoff.test.ts +19 -19
  396. package/src/tools/BashExecutor.ts +281 -0
  397. package/src/tools/BashProgrammaticToolCalling.ts +397 -0
  398. package/src/tools/CodeExecutor.ts +63 -54
  399. package/src/tools/ProgrammaticToolCalling.ts +29 -14
  400. package/src/tools/ReadFile.ts +39 -0
  401. package/src/tools/SkillTool.ts +46 -0
  402. package/src/tools/SubagentTool.ts +100 -0
  403. package/src/tools/ToolNode.ts +548 -26
  404. package/src/tools/__tests__/BashExecutor.test.ts +49 -0
  405. package/src/tools/__tests__/CodeExecutor.test.ts +37 -36
  406. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +60 -0
  407. package/src/tools/__tests__/ReadFile.test.ts +44 -0
  408. package/src/tools/__tests__/SkillTool.test.ts +442 -0
  409. package/src/tools/__tests__/SubagentExecutor.test.ts +1148 -0
  410. package/src/tools/__tests__/SubagentTool.test.ts +149 -0
  411. package/src/tools/__tests__/ToolNode.outputReferences.test.ts +1438 -0
  412. package/src/tools/__tests__/annotateMessagesForLLM.test.ts +479 -0
  413. package/src/tools/__tests__/skillCatalog.test.ts +161 -0
  414. package/src/tools/__tests__/subagentHooks.test.ts +210 -0
  415. package/src/tools/__tests__/toolOutputReferences.test.ts +415 -0
  416. package/src/tools/memory/memoryAppendTool.ts +1 -1
  417. package/src/tools/memory/memoryGetTool.ts +2 -2
  418. package/src/tools/memory/memorySearchTool.ts +3 -3
  419. package/src/tools/memory/shared.ts +1 -1
  420. package/src/tools/search/search.ts +12 -2
  421. package/src/tools/search/tavily-scraper.ts +235 -0
  422. package/src/tools/search/tavily-search.ts +424 -0
  423. package/src/tools/search/tavily.test.ts +965 -0
  424. package/src/tools/search/tool.ts +36 -2
  425. package/src/tools/search/types.ts +133 -8
  426. package/src/tools/search/utils.ts +13 -5
  427. package/src/tools/skillCatalog.ts +126 -0
  428. package/src/tools/subagent/SubagentExecutor.ts +676 -0
  429. package/src/tools/subagent/index.ts +13 -0
  430. package/src/tools/subagent/types.test.ts +70 -0
  431. package/src/tools/subagent/types.ts +115 -0
  432. package/src/tools/toolOutputReferences.ts +825 -0
  433. package/src/types/agent-cache.ts +74 -0
  434. package/src/types/graph.ts +172 -20
  435. package/src/types/index.ts +3 -0
  436. package/src/types/messages.ts +27 -0
  437. package/src/types/run.ts +22 -0
  438. package/src/types/skill.ts +11 -0
  439. package/src/types/tools.ts +118 -0
  440. package/src/utils/__tests__/truncation.test.ts +66 -0
  441. package/src/utils/index.ts +1 -3
  442. package/src/utils/truncation.ts +154 -0
  443. package/dist/cjs/common/spawnPath.cjs +0 -104
  444. package/dist/cjs/common/spawnPath.cjs.map +0 -1
  445. package/dist/cjs/content/ArtifactStore.cjs +0 -579
  446. package/dist/cjs/content/ArtifactStore.cjs.map +0 -1
  447. package/dist/cjs/content/ContentStore.cjs +0 -638
  448. package/dist/cjs/content/ContentStore.cjs.map +0 -1
  449. package/dist/cjs/content/contentAnalyzer.cjs +0 -91
  450. package/dist/cjs/content/contentAnalyzer.cjs.map +0 -1
  451. package/dist/cjs/content/index.cjs +0 -20
  452. package/dist/cjs/content/index.cjs.map +0 -1
  453. package/dist/cjs/content/mcpAutoCache.cjs +0 -115
  454. package/dist/cjs/content/mcpAutoCache.cjs.map +0 -1
  455. package/dist/cjs/graphs/HandoffRegistry.cjs +0 -143
  456. package/dist/cjs/graphs/HandoffRegistry.cjs.map +0 -1
  457. package/dist/cjs/providers/a2a/A2ACapabilityProvider.cjs +0 -288
  458. package/dist/cjs/providers/a2a/A2ACapabilityProvider.cjs.map +0 -1
  459. package/dist/cjs/providers/a2a/client.cjs +0 -92
  460. package/dist/cjs/providers/a2a/client.cjs.map +0 -1
  461. package/dist/cjs/providers/a2a/config.cjs +0 -38
  462. package/dist/cjs/providers/a2a/config.cjs.map +0 -1
  463. package/dist/cjs/providers/capabilityNaming.cjs +0 -43
  464. package/dist/cjs/providers/capabilityNaming.cjs.map +0 -1
  465. package/dist/cjs/providers/mcp/MCPCapabilityProvider.cjs +0 -244
  466. package/dist/cjs/providers/mcp/MCPCapabilityProvider.cjs.map +0 -1
  467. package/dist/cjs/providers/mcp/config.cjs +0 -42
  468. package/dist/cjs/providers/mcp/config.cjs.map +0 -1
  469. package/dist/cjs/providers/mcp/transport.cjs +0 -65
  470. package/dist/cjs/providers/mcp/transport.cjs.map +0 -1
  471. package/dist/cjs/providers/tools-server/ToolsServerCapabilityProvider.cjs +0 -128
  472. package/dist/cjs/providers/tools-server/ToolsServerCapabilityProvider.cjs.map +0 -1
  473. package/dist/cjs/providers/types.cjs +0 -51
  474. package/dist/cjs/providers/types.cjs.map +0 -1
  475. package/dist/cjs/tools/artifacts/schema.cjs +0 -86
  476. package/dist/cjs/tools/artifacts/schema.cjs.map +0 -1
  477. package/dist/cjs/tools/artifacts/tool.cjs +0 -219
  478. package/dist/cjs/tools/artifacts/tool.cjs.map +0 -1
  479. package/dist/cjs/tools/fileSearch/formatter.cjs +0 -93
  480. package/dist/cjs/tools/fileSearch/formatter.cjs.map +0 -1
  481. package/dist/cjs/tools/fileSearch/ragClient.cjs +0 -102
  482. package/dist/cjs/tools/fileSearch/ragClient.cjs.map +0 -1
  483. package/dist/cjs/tools/fileSearch/schema.cjs +0 -18
  484. package/dist/cjs/tools/fileSearch/schema.cjs.map +0 -1
  485. package/dist/cjs/tools/fileSearch/tool.cjs +0 -155
  486. package/dist/cjs/tools/fileSearch/tool.cjs.map +0 -1
  487. package/dist/cjs/tools/proxyTool.cjs +0 -102
  488. package/dist/cjs/tools/proxyTool.cjs.map +0 -1
  489. package/dist/cjs/utils/childAgentContext.cjs +0 -242
  490. package/dist/cjs/utils/childAgentContext.cjs.map +0 -1
  491. package/dist/cjs/utils/credentials.cjs +0 -142
  492. package/dist/cjs/utils/credentials.cjs.map +0 -1
  493. package/dist/cjs/utils/httpClient.cjs +0 -74
  494. package/dist/cjs/utils/httpClient.cjs.map +0 -1
  495. package/dist/cjs/utils/toolManifest.cjs +0 -100
  496. package/dist/cjs/utils/toolManifest.cjs.map +0 -1
  497. package/dist/esm/common/spawnPath.mjs +0 -95
  498. package/dist/esm/common/spawnPath.mjs.map +0 -1
  499. package/dist/esm/content/ArtifactStore.mjs +0 -576
  500. package/dist/esm/content/ArtifactStore.mjs.map +0 -1
  501. package/dist/esm/content/ContentStore.mjs +0 -635
  502. package/dist/esm/content/ContentStore.mjs.map +0 -1
  503. package/dist/esm/content/contentAnalyzer.mjs +0 -87
  504. package/dist/esm/content/contentAnalyzer.mjs.map +0 -1
  505. package/dist/esm/content/index.mjs +0 -5
  506. package/dist/esm/content/mcpAutoCache.mjs +0 -111
  507. package/dist/esm/content/mcpAutoCache.mjs.map +0 -1
  508. package/dist/esm/graphs/HandoffRegistry.mjs +0 -141
  509. package/dist/esm/graphs/HandoffRegistry.mjs.map +0 -1
  510. package/dist/esm/providers/a2a/A2ACapabilityProvider.mjs +0 -281
  511. package/dist/esm/providers/a2a/A2ACapabilityProvider.mjs.map +0 -1
  512. package/dist/esm/providers/a2a/client.mjs +0 -88
  513. package/dist/esm/providers/a2a/client.mjs.map +0 -1
  514. package/dist/esm/providers/a2a/config.mjs +0 -35
  515. package/dist/esm/providers/a2a/config.mjs.map +0 -1
  516. package/dist/esm/providers/capabilityNaming.mjs +0 -39
  517. package/dist/esm/providers/capabilityNaming.mjs.map +0 -1
  518. package/dist/esm/providers/mcp/MCPCapabilityProvider.mjs +0 -240
  519. package/dist/esm/providers/mcp/MCPCapabilityProvider.mjs.map +0 -1
  520. package/dist/esm/providers/mcp/config.mjs +0 -39
  521. package/dist/esm/providers/mcp/config.mjs.map +0 -1
  522. package/dist/esm/providers/mcp/transport.mjs +0 -63
  523. package/dist/esm/providers/mcp/transport.mjs.map +0 -1
  524. package/dist/esm/providers/tools-server/ToolsServerCapabilityProvider.mjs +0 -126
  525. package/dist/esm/providers/tools-server/ToolsServerCapabilityProvider.mjs.map +0 -1
  526. package/dist/esm/providers/types.mjs +0 -51
  527. package/dist/esm/providers/types.mjs.map +0 -1
  528. package/dist/esm/tools/artifacts/schema.mjs +0 -79
  529. package/dist/esm/tools/artifacts/schema.mjs.map +0 -1
  530. package/dist/esm/tools/artifacts/tool.mjs +0 -213
  531. package/dist/esm/tools/artifacts/tool.mjs.map +0 -1
  532. package/dist/esm/tools/fileSearch/formatter.mjs +0 -90
  533. package/dist/esm/tools/fileSearch/formatter.mjs.map +0 -1
  534. package/dist/esm/tools/fileSearch/ragClient.mjs +0 -98
  535. package/dist/esm/tools/fileSearch/ragClient.mjs.map +0 -1
  536. package/dist/esm/tools/fileSearch/schema.mjs +0 -15
  537. package/dist/esm/tools/fileSearch/schema.mjs.map +0 -1
  538. package/dist/esm/tools/fileSearch/tool.mjs +0 -152
  539. package/dist/esm/tools/fileSearch/tool.mjs.map +0 -1
  540. package/dist/esm/tools/proxyTool.mjs +0 -100
  541. package/dist/esm/tools/proxyTool.mjs.map +0 -1
  542. package/dist/esm/utils/childAgentContext.mjs +0 -237
  543. package/dist/esm/utils/childAgentContext.mjs.map +0 -1
  544. package/dist/esm/utils/credentials.mjs +0 -135
  545. package/dist/esm/utils/credentials.mjs.map +0 -1
  546. package/dist/esm/utils/httpClient.mjs +0 -70
  547. package/dist/esm/utils/httpClient.mjs.map +0 -1
  548. package/dist/esm/utils/toolManifest.mjs +0 -96
  549. package/dist/esm/utils/toolManifest.mjs.map +0 -1
  550. package/dist/types/common/spawnPath.d.ts +0 -59
  551. package/dist/types/content/ArtifactStore.d.ts +0 -223
  552. package/dist/types/content/ContentStore.d.ts +0 -140
  553. package/dist/types/content/contentAnalyzer.d.ts +0 -38
  554. package/dist/types/content/index.d.ts +0 -24
  555. package/dist/types/content/mcpAutoCache.d.ts +0 -89
  556. package/dist/types/content/types.d.ts +0 -75
  557. package/dist/types/graphs/HandoffRegistry.d.ts +0 -97
  558. package/dist/types/providers/a2a/A2ACapabilityProvider.d.ts +0 -89
  559. package/dist/types/providers/a2a/client.d.ts +0 -47
  560. package/dist/types/providers/a2a/config.d.ts +0 -18
  561. package/dist/types/providers/a2a/index.d.ts +0 -6
  562. package/dist/types/providers/a2a/types.d.ts +0 -173
  563. package/dist/types/providers/capabilityNaming.d.ts +0 -25
  564. package/dist/types/providers/index.d.ts +0 -12
  565. package/dist/types/providers/mcp/MCPCapabilityProvider.d.ts +0 -54
  566. package/dist/types/providers/mcp/config.d.ts +0 -20
  567. package/dist/types/providers/mcp/index.d.ts +0 -5
  568. package/dist/types/providers/mcp/transport.d.ts +0 -18
  569. package/dist/types/providers/mcp/types.d.ts +0 -112
  570. package/dist/types/providers/tools-server/ToolsServerCapabilityProvider.d.ts +0 -59
  571. package/dist/types/providers/tools-server/index.d.ts +0 -1
  572. package/dist/types/providers/types.d.ts +0 -184
  573. package/dist/types/tools/artifacts/index.d.ts +0 -3
  574. package/dist/types/tools/artifacts/schema.d.ts +0 -63
  575. package/dist/types/tools/artifacts/tool.d.ts +0 -16
  576. package/dist/types/tools/artifacts/types.d.ts +0 -127
  577. package/dist/types/tools/fileSearch/formatter.d.ts +0 -25
  578. package/dist/types/tools/fileSearch/index.d.ts +0 -5
  579. package/dist/types/tools/fileSearch/ragClient.d.ts +0 -32
  580. package/dist/types/tools/fileSearch/schema.d.ts +0 -13
  581. package/dist/types/tools/fileSearch/tool.d.ts +0 -18
  582. package/dist/types/tools/fileSearch/types.d.ts +0 -139
  583. package/dist/types/tools/proxyTool.d.ts +0 -62
  584. package/dist/types/tools/search/test.d.ts +0 -1
  585. package/dist/types/utils/childAgentContext.d.ts +0 -99
  586. package/dist/types/utils/credentials.d.ts +0 -77
  587. package/dist/types/utils/httpClient.d.ts +0 -46
  588. package/dist/types/utils/toolManifest.d.ts +0 -49
  589. package/src/common/__tests__/spawnPath.test.ts +0 -110
  590. package/src/common/spawnPath.ts +0 -101
  591. package/src/content/ArtifactStore.ts +0 -782
  592. package/src/content/ContentStore.ts +0 -753
  593. package/src/content/contentAnalyzer.ts +0 -105
  594. package/src/content/index.ts +0 -51
  595. package/src/content/mcpAutoCache.ts +0 -185
  596. package/src/content/types.ts +0 -82
  597. package/src/graphs/HandoffRegistry.ts +0 -199
  598. package/src/graphs/__tests__/HandoffRegistry.test.ts +0 -410
  599. package/src/graphs/__tests__/multi-agent-delegate.test.ts +0 -458
  600. package/src/graphs/__tests__/multi-agent-edges.test.ts +0 -276
  601. package/src/graphs/__tests__/multi-agent-nested-subgraph.test.ts +0 -221
  602. package/src/graphs/handoffValidation.test.ts +0 -353
  603. package/src/providers/__tests__/ToolsServerCapabilityProvider.integration.spec.ts +0 -79
  604. package/src/providers/__tests__/ToolsServerCapabilityProvider.test.ts +0 -271
  605. package/src/providers/__tests__/types.test.ts +0 -64
  606. package/src/providers/a2a/A2ACapabilityProvider.ts +0 -384
  607. package/src/providers/a2a/__tests__/A2ACapabilityProvider.integration.spec.ts +0 -345
  608. package/src/providers/a2a/__tests__/A2ACapabilityProvider.test.ts +0 -460
  609. package/src/providers/a2a/client.ts +0 -115
  610. package/src/providers/a2a/config.ts +0 -40
  611. package/src/providers/a2a/index.ts +0 -29
  612. package/src/providers/a2a/types.ts +0 -191
  613. package/src/providers/capabilityNaming.ts +0 -42
  614. package/src/providers/index.ts +0 -68
  615. package/src/providers/mcp/MCPCapabilityProvider.ts +0 -345
  616. package/src/providers/mcp/__tests__/MCPCapabilityProvider.integration.spec.ts +0 -386
  617. package/src/providers/mcp/__tests__/MCPCapabilityProvider.test.ts +0 -371
  618. package/src/providers/mcp/config.ts +0 -45
  619. package/src/providers/mcp/index.ts +0 -21
  620. package/src/providers/mcp/transport.ts +0 -76
  621. package/src/providers/mcp/types.ts +0 -139
  622. package/src/providers/tools-server/ToolsServerCapabilityProvider.ts +0 -249
  623. package/src/providers/tools-server/index.ts +0 -1
  624. package/src/providers/types.ts +0 -204
  625. package/src/scripts/test-bedrock-handoff-autonomous.ts +0 -267
  626. package/src/scripts/test-handoff-preamble.ts +0 -278
  627. package/src/specs/agent-handoffs-bedrock.integration.test.ts +0 -415
  628. package/src/tools/artifacts/__tests__/tool.test.ts +0 -259
  629. package/src/tools/artifacts/index.ts +0 -33
  630. package/src/tools/artifacts/schema.ts +0 -99
  631. package/src/tools/artifacts/tool.ts +0 -289
  632. package/src/tools/artifacts/types.ts +0 -162
  633. package/src/tools/fileSearch/__tests__/tool.test.ts +0 -261
  634. package/src/tools/fileSearch/formatter.ts +0 -129
  635. package/src/tools/fileSearch/index.ts +0 -23
  636. package/src/tools/fileSearch/ragClient.ts +0 -137
  637. package/src/tools/fileSearch/schema.ts +0 -19
  638. package/src/tools/fileSearch/tool.ts +0 -207
  639. package/src/tools/fileSearch/types.ts +0 -149
  640. package/src/tools/proxyTool.ts +0 -166
  641. package/src/tools/search/output.md +0 -2775
  642. package/src/tools/search/test.html +0 -884
  643. package/src/tools/search/test.md +0 -643
  644. package/src/tools/search/test.ts +0 -159
  645. package/src/utils/__tests__/childAgentContext.test.ts +0 -217
  646. package/src/utils/__tests__/credentials.test.ts +0 -130
  647. package/src/utils/__tests__/httpClient.test.ts +0 -75
  648. package/src/utils/__tests__/toolManifest.test.ts +0 -116
  649. package/src/utils/childAgentContext.ts +0 -259
  650. package/src/utils/credentials.ts +0 -157
  651. package/src/utils/httpClient.ts +0 -92
  652. package/src/utils/toolManifest.ts +0 -109
  653. /package/dist/esm/{content → langchain}/index.mjs.map +0 -0
@@ -1,6 +1,8 @@
1
- import { AIMessage } from '@langchain/core/messages';
2
- import { Providers, ContentTypes } from '../common/enum.mjs';
1
+ import { AIMessage, ToolMessage } from '@langchain/core/messages';
2
+ import { Providers, ContentTypes, Constants } from '../common/enum.mjs';
3
3
  import '../tools/approval/constants.mjs';
4
+ import { truncateToolInput, truncateToolResultContent, calculateMaxToolResultChars } from '../utils/truncation.mjs';
5
+ import { applyContextPruning } from './contextPruning.mjs';
4
6
 
5
7
  function isIndexInContext(arrayA, arrayB, targetIndex) {
6
8
  const startingIndexInA = arrayA.length - arrayB.length;
@@ -82,12 +84,12 @@ function buildEmergencyContext(messages, endIndex) {
82
84
  }
83
85
  return result;
84
86
  }
85
- function getMessagesWithinTokenLimit({ messages: _messages, maxContextTokens, indexTokenCountMap, startType: _startType, thinkingEnabled, tokenCounter, thinkingStartIndex: _thinkingStartIndex = -1, reasoningType = ContentTypes.THINKING, }) {
87
+ function getMessagesWithinTokenLimit({ messages: _messages, maxContextTokens, indexTokenCountMap, startType: _startType, thinkingEnabled, tokenCounter, thinkingStartIndex: _thinkingStartIndex = -1, reasoningType = ContentTypes.THINKING, instructionTokens: _instructionTokens = 0, }) {
86
88
  // Every reply is primed with <|start|>assistant<|message|>, so we
87
89
  // start with 3 tokens for the label after all messages have been counted.
88
90
  let currentTokenCount = 3;
89
91
  const instructions = _messages[0]?.getType() === 'system' ? _messages[0] : undefined;
90
- const instructionsTokenCount = instructions != null ? (indexTokenCountMap[0] ?? 0) : 0;
92
+ const instructionsTokenCount = instructions != null ? (indexTokenCountMap[0] ?? 0) : _instructionTokens;
91
93
  const initialContextTokens = maxContextTokens - instructionsTokenCount;
92
94
  let remainingContextTokens = initialContextTokens;
93
95
  let startType = _startType;
@@ -306,12 +308,443 @@ function getMessagesWithinTokenLimit({ messages: _messages, maxContextTokens, in
306
308
  function checkValidNumber(value) {
307
309
  return typeof value === 'number' && !isNaN(value) && value > 0;
308
310
  }
311
+ /**
312
+ * Returns the set of tool_call ids referenced by an AIMessage — both via the
313
+ * canonical `tool_calls` array and via inline `tool_use` / `tool_call` content
314
+ * blocks (Anthropic-style content arrays).
315
+ */
316
+ function getToolCallIds(message) {
317
+ if (message.getType() !== 'ai') {
318
+ return new Set();
319
+ }
320
+ const ids = new Set();
321
+ const aiMessage = message;
322
+ for (const toolCall of aiMessage.tool_calls ?? []) {
323
+ if (typeof toolCall.id === 'string' && toolCall.id.length > 0) {
324
+ ids.add(toolCall.id);
325
+ }
326
+ }
327
+ if (Array.isArray(aiMessage.content)) {
328
+ for (const part of aiMessage.content) {
329
+ if (typeof part !== 'object') {
330
+ continue;
331
+ }
332
+ const record = part;
333
+ if ((record.type === 'tool_use' || record.type === 'tool_call') &&
334
+ typeof record.id === 'string' &&
335
+ record.id.length > 0) {
336
+ ids.add(record.id);
337
+ }
338
+ }
339
+ }
340
+ return ids;
341
+ }
342
+ function getToolResultId(message) {
343
+ if (message.getType() !== 'tool') {
344
+ return null;
345
+ }
346
+ const toolMessage = message;
347
+ if (typeof toolMessage.tool_call_id === 'string' &&
348
+ toolMessage.tool_call_id.length > 0) {
349
+ return toolMessage.tool_call_id;
350
+ }
351
+ if (typeof toolMessage.toolCallId === 'string' &&
352
+ toolMessage.toolCallId.length > 0) {
353
+ return toolMessage.toolCallId;
354
+ }
355
+ return null;
356
+ }
357
+ function resolveTokenCountForMessage({ message, messageIndexMap, tokenCounter, indexTokenCountMap, }) {
358
+ const originalIndex = messageIndexMap.get(message) ?? -1;
359
+ if (originalIndex > -1 && indexTokenCountMap[originalIndex] != null) {
360
+ return indexTokenCountMap[originalIndex];
361
+ }
362
+ return tokenCounter(message);
363
+ }
364
+ /**
365
+ * Repairs orphan tool messages in a pruned context. Drops `ToolMessage`s whose
366
+ * matching `AIMessage` was pruned, and strips orphan `tool_use` content blocks
367
+ * (and `tool_calls` entries) from `AIMessage`s whose corresponding tool results
368
+ * are missing. Without this, Anthropic / Bedrock / OpenAI reject the request
369
+ * with a structural validation 400.
370
+ *
371
+ * Intended to run on the post-prune `context` array (not the pre-prune
372
+ * `allMessages`). The dropped messages are returned so the caller can append
373
+ * them to `messagesToRefine` for summarization fidelity.
374
+ */
375
+ function repairOrphanedToolMessages({ context, allMessages, tokenCounter, indexTokenCountMap, }) {
376
+ const messageIndexMap = new Map();
377
+ for (let i = 0; i < allMessages.length; i++) {
378
+ messageIndexMap.set(allMessages[i], i);
379
+ }
380
+ const validToolCallIds = new Set();
381
+ const presentToolResultIds = new Set();
382
+ for (const message of context) {
383
+ for (const id of getToolCallIds(message)) {
384
+ validToolCallIds.add(id);
385
+ }
386
+ const resultId = getToolResultId(message);
387
+ if (resultId != null) {
388
+ presentToolResultIds.add(resultId);
389
+ }
390
+ }
391
+ let reclaimedTokens = 0;
392
+ let droppedOrphanCount = 0;
393
+ const repairedContext = [];
394
+ const droppedMessages = [];
395
+ for (const message of context) {
396
+ if (message.getType() === 'tool') {
397
+ const toolResultId = getToolResultId(message);
398
+ if (toolResultId == null || !validToolCallIds.has(toolResultId)) {
399
+ droppedOrphanCount += 1;
400
+ reclaimedTokens += resolveTokenCountForMessage({
401
+ message,
402
+ tokenCounter,
403
+ messageIndexMap,
404
+ indexTokenCountMap,
405
+ });
406
+ droppedMessages.push(message);
407
+ continue;
408
+ }
409
+ repairedContext.push(message);
410
+ continue;
411
+ }
412
+ if (message.getType() === 'ai' && message instanceof AIMessage) {
413
+ const toolCallIds = getToolCallIds(message);
414
+ if (toolCallIds.size > 0) {
415
+ let hasOrphanToolCalls = false;
416
+ for (const id of toolCallIds) {
417
+ if (!presentToolResultIds.has(id)) {
418
+ hasOrphanToolCalls = true;
419
+ break;
420
+ }
421
+ }
422
+ if (hasOrphanToolCalls) {
423
+ const originalTokens = resolveTokenCountForMessage({
424
+ message,
425
+ messageIndexMap,
426
+ tokenCounter,
427
+ indexTokenCountMap,
428
+ });
429
+ const stripped = stripOrphanToolUseBlocks(message, presentToolResultIds);
430
+ if (stripped != null) {
431
+ const strippedTokens = tokenCounter(stripped);
432
+ reclaimedTokens += originalTokens - strippedTokens;
433
+ repairedContext.push(stripped);
434
+ }
435
+ else {
436
+ droppedOrphanCount += 1;
437
+ reclaimedTokens += originalTokens;
438
+ droppedMessages.push(message);
439
+ }
440
+ continue;
441
+ }
442
+ }
443
+ }
444
+ repairedContext.push(message);
445
+ }
446
+ return {
447
+ context: repairedContext,
448
+ reclaimedTokens,
449
+ droppedOrphanCount,
450
+ droppedMessages,
451
+ };
452
+ }
453
+ /**
454
+ * Strips tool_use content blocks and tool_calls entries from an AI message
455
+ * when their corresponding ToolMessages are not in the context.
456
+ * Returns null if the message has no content left after stripping.
457
+ */
458
+ function stripOrphanToolUseBlocks(message, presentToolResultIds) {
459
+ const keptToolCalls = (message.tool_calls ?? []).filter((tc) => typeof tc.id === 'string' && presentToolResultIds.has(tc.id));
460
+ let keptContent;
461
+ if (Array.isArray(message.content)) {
462
+ const filtered = message.content.filter((block) => {
463
+ if (typeof block !== 'object') {
464
+ return true;
465
+ }
466
+ const record = block;
467
+ if ((record.type === 'tool_use' || record.type === 'tool_call') &&
468
+ typeof record.id === 'string') {
469
+ return presentToolResultIds.has(record.id);
470
+ }
471
+ return true;
472
+ });
473
+ if (filtered.length === 0) {
474
+ return null;
475
+ }
476
+ keptContent = filtered;
477
+ }
478
+ else {
479
+ keptContent = message.content;
480
+ }
481
+ return new AIMessage({
482
+ ...message,
483
+ content: keptContent,
484
+ tool_calls: keptToolCalls.length > 0 ? keptToolCalls : undefined,
485
+ });
486
+ }
487
+ /**
488
+ * Lightweight structural cleanup: strips orphan tool_use blocks from AI messages
489
+ * and drops orphan ToolMessages whose AI counterpart is missing.
490
+ *
491
+ * Unlike `repairOrphanedToolMessages`, this does NOT track tokens — it is
492
+ * intended as a final safety net right before model invocation to prevent
493
+ * Anthropic / Bedrock structural validation errors.
494
+ *
495
+ * Uses duck-typing instead of `getType()` because messages at this stage
496
+ * may be plain objects (from LangGraph state serialization) rather than
497
+ * proper BaseMessage class instances.
498
+ *
499
+ * Includes a fast-path: if every tool_call has a matching tool_result and
500
+ * vice-versa, the original array is returned immediately with zero allocation.
501
+ */
502
+ function sanitizeOrphanToolBlocks(messages) {
503
+ const allToolCallIds = new Set();
504
+ const allToolResultIds = new Set();
505
+ for (const msg of messages) {
506
+ const msgAny = msg;
507
+ const toolCalls = msgAny.tool_calls;
508
+ if (Array.isArray(toolCalls)) {
509
+ for (const tc of toolCalls) {
510
+ if (typeof tc.id === 'string' &&
511
+ tc.id.length > 0 &&
512
+ !tc.id.startsWith(Constants.ANTHROPIC_SERVER_TOOL_PREFIX)) {
513
+ allToolCallIds.add(tc.id);
514
+ }
515
+ }
516
+ }
517
+ if (Array.isArray(msgAny.content)) {
518
+ for (const block of msgAny.content) {
519
+ if (typeof block === 'object' &&
520
+ (block.type === 'tool_use' || block.type === 'tool_call') &&
521
+ typeof block.id === 'string' &&
522
+ !block.id.startsWith(Constants.ANTHROPIC_SERVER_TOOL_PREFIX)) {
523
+ allToolCallIds.add(block.id);
524
+ }
525
+ }
526
+ }
527
+ const toolCallId = msgAny.tool_call_id;
528
+ if (typeof toolCallId === 'string' && toolCallId.length > 0) {
529
+ allToolResultIds.add(toolCallId);
530
+ }
531
+ }
532
+ let hasOrphans = false;
533
+ for (const id of allToolCallIds) {
534
+ if (!allToolResultIds.has(id)) {
535
+ hasOrphans = true;
536
+ break;
537
+ }
538
+ }
539
+ if (!hasOrphans) {
540
+ for (const id of allToolResultIds) {
541
+ if (!allToolCallIds.has(id)) {
542
+ hasOrphans = true;
543
+ break;
544
+ }
545
+ }
546
+ }
547
+ if (!hasOrphans) {
548
+ return messages;
549
+ }
550
+ const result = [];
551
+ const strippedAiIndices = new Set();
552
+ for (const msg of messages) {
553
+ const msgAny = msg;
554
+ const msgType = typeof msg.getType === 'function'
555
+ ? msg.getType()
556
+ : (msgAny.role ??
557
+ msgAny._type);
558
+ const toolCallId = msgAny.tool_call_id;
559
+ if ((msgType === 'tool' || msg instanceof ToolMessage) &&
560
+ typeof toolCallId === 'string' &&
561
+ !allToolCallIds.has(toolCallId)) {
562
+ continue;
563
+ }
564
+ const toolCalls = msgAny.tool_calls;
565
+ if ((msgType === 'ai' ||
566
+ msgType === 'assistant' ||
567
+ msg instanceof AIMessage) &&
568
+ Array.isArray(toolCalls) &&
569
+ toolCalls.length > 0) {
570
+ const hasOrphanCalls = toolCalls.some((tc) => typeof tc.id === 'string' && !allToolResultIds.has(tc.id));
571
+ if (hasOrphanCalls) {
572
+ if (msg instanceof AIMessage) {
573
+ const stripped = stripOrphanToolUseBlocks(msg, allToolResultIds);
574
+ if (stripped != null) {
575
+ strippedAiIndices.add(result.length);
576
+ result.push(stripped);
577
+ }
578
+ continue;
579
+ }
580
+ const keptToolCalls = toolCalls.filter((tc) => typeof tc.id === 'string' && allToolResultIds.has(tc.id));
581
+ const keptContent = Array.isArray(msgAny.content)
582
+ ? msgAny.content.filter((block) => {
583
+ if (typeof block !== 'object')
584
+ return true;
585
+ if ((block.type === 'tool_use' || block.type === 'tool_call') &&
586
+ typeof block.id === 'string') {
587
+ return allToolResultIds.has(block.id);
588
+ }
589
+ return true;
590
+ })
591
+ : msgAny.content;
592
+ if (keptToolCalls.length === 0 &&
593
+ Array.isArray(keptContent) &&
594
+ keptContent.length === 0) {
595
+ continue;
596
+ }
597
+ strippedAiIndices.add(result.length);
598
+ const patched = Object.create(Object.getPrototypeOf(msg), Object.getOwnPropertyDescriptors(msg));
599
+ patched.tool_calls = keptToolCalls.length > 0 ? keptToolCalls : [];
600
+ patched.content = keptContent;
601
+ result.push(patched);
602
+ continue;
603
+ }
604
+ }
605
+ result.push(msg);
606
+ }
607
+ // Bedrock/Anthropic require the conversation to end with a user message;
608
+ // a stripped AI message (tool_use removed) represents a dead-end exchange.
609
+ while (result.length > 0 && strippedAiIndices.has(result.length - 1)) {
610
+ result.pop();
611
+ }
612
+ return result;
613
+ }
614
+ /**
615
+ * Pre-flight truncation: truncates oversized tool result string content before
616
+ * the budget walker runs. Older results get smaller budgets (recency factor),
617
+ * with a 200-char floor so even ancient entries keep diagnostic signal. Returns
618
+ * the number of ToolMessages truncated.
619
+ */
620
+ function preFlightTruncateToolResults(params) {
621
+ const { messages, maxContextTokens, indexTokenCountMap, tokenCounter } = params;
622
+ const baseMaxChars = calculateMaxToolResultChars(maxContextTokens);
623
+ let truncatedCount = 0;
624
+ const toolIndices = [];
625
+ for (let i = 0; i < messages.length; i++) {
626
+ if (messages[i].getType() === 'tool') {
627
+ toolIndices.push(i);
628
+ }
629
+ }
630
+ for (let t = 0; t < toolIndices.length; t++) {
631
+ const i = toolIndices[t];
632
+ const message = messages[i];
633
+ const content = message.content;
634
+ if (typeof content !== 'string') {
635
+ continue;
636
+ }
637
+ const position = toolIndices.length > 1 ? t / (toolIndices.length - 1) : 1;
638
+ const recencyFactor = 0.2 + 0.8 * position;
639
+ const maxChars = Math.max(200, Math.floor(baseMaxChars * recencyFactor));
640
+ if (content.length <= maxChars) {
641
+ continue;
642
+ }
643
+ const truncated = truncateToolResultContent(content, maxChars);
644
+ const cloned = new ToolMessage({
645
+ content: truncated,
646
+ tool_call_id: message.tool_call_id,
647
+ name: message.name,
648
+ id: message.id,
649
+ additional_kwargs: message.additional_kwargs,
650
+ response_metadata: message.response_metadata,
651
+ });
652
+ messages[i] = cloned;
653
+ indexTokenCountMap[i] = tokenCounter(cloned);
654
+ truncatedCount++;
655
+ }
656
+ return truncatedCount;
657
+ }
658
+ /**
659
+ * Pre-flight truncation: truncates oversized `tool_use` input fields in AI messages.
660
+ *
661
+ * Tool call inputs (arguments) can be very large — e.g., code evaluation payloads from
662
+ * MCP tools like chrome-devtools. Since these tool calls have already been executed,
663
+ * the model only needs a summary of what was called, not the full arguments. Truncating
664
+ * them before pruning can prevent entire messages from being dropped.
665
+ *
666
+ * Uses 15% of the context window (in estimated characters, ~4 chars/token) as the
667
+ * per-input cap, capped at 200K chars.
668
+ *
669
+ * @returns The number of AI messages that had tool_use inputs truncated.
670
+ */
671
+ function preFlightTruncateToolCallInputs(params) {
672
+ const { messages, maxContextTokens, indexTokenCountMap, tokenCounter } = params;
673
+ const maxInputChars = Math.min(Math.floor(maxContextTokens * 0.15) * 4, 200_000);
674
+ let truncatedCount = 0;
675
+ for (let i = 0; i < messages.length; i++) {
676
+ const message = messages[i];
677
+ if (message.getType() !== 'ai') {
678
+ continue;
679
+ }
680
+ if (!Array.isArray(message.content)) {
681
+ continue;
682
+ }
683
+ const originalContent = message.content;
684
+ const state = { changed: false };
685
+ const newContent = originalContent.map((block) => {
686
+ if (typeof block !== 'object') {
687
+ return block;
688
+ }
689
+ const record = block;
690
+ if (record.type !== 'tool_use' && record.type !== 'tool_call') {
691
+ return block;
692
+ }
693
+ const input = record.input;
694
+ if (input == null) {
695
+ return block;
696
+ }
697
+ const serialized = typeof input === 'string' ? input : JSON.stringify(input);
698
+ if (serialized.length <= maxInputChars) {
699
+ return block;
700
+ }
701
+ state.changed = true;
702
+ // Replaces original input with { _truncated, _originalChars } —
703
+ // safe because the tool call already executed in a prior turn.
704
+ return {
705
+ ...record,
706
+ input: truncateToolInput(serialized, maxInputChars),
707
+ };
708
+ });
709
+ if (!state.changed) {
710
+ continue;
711
+ }
712
+ const aiMsg = message;
713
+ const newToolCalls = (aiMsg.tool_calls ?? []).map((tc) => {
714
+ const serializedArgs = JSON.stringify(tc.args);
715
+ if (serializedArgs.length <= maxInputChars) {
716
+ return tc;
717
+ }
718
+ // Replaces original args with { _truncated, _originalChars } —
719
+ // safe because the tool call already executed in a prior turn.
720
+ return {
721
+ ...tc,
722
+ args: truncateToolInput(serializedArgs, maxInputChars),
723
+ };
724
+ });
725
+ messages[i] = new AIMessage({
726
+ ...aiMsg,
727
+ content: newContent,
728
+ tool_calls: newToolCalls.length > 0 ? newToolCalls : undefined,
729
+ });
730
+ indexTokenCountMap[i] = tokenCounter(messages[i]);
731
+ truncatedCount++;
732
+ }
733
+ return truncatedCount;
734
+ }
309
735
  function createPruneMessages(factoryParams) {
310
736
  const indexTokenCountMap = { ...factoryParams.indexTokenCountMap };
311
737
  let lastTurnStartIndex = factoryParams.startIndex;
312
738
  let lastCutOffIndex = 0;
313
739
  let totalTokens = Object.values(indexTokenCountMap).reduce((a = 0, b = 0) => a + b, 0);
314
740
  let runThinkingStartIndex = -1;
741
+ /**
742
+ * Original (pre-truncation) tool result content keyed by message index.
743
+ * Lets the summarizer see full tool outputs even after pre-flight truncation
744
+ * has shortened them in the live messages array. Cleared whenever the
745
+ * factory is recreated (e.g. after a summarization checkpoint).
746
+ */
747
+ const originalToolContent = new Map();
315
748
  return function pruneMessages(params) {
316
749
  if (factoryParams.provider === Providers.OPENAI &&
317
750
  factoryParams.thinkingEnabled === true) {
@@ -410,6 +843,47 @@ function createPruneMessages(factoryParams) {
410
843
  messagesToRefine: [],
411
844
  };
412
845
  }
846
+ /*
847
+ * Pre-flight truncation: chop oversized tool result content and oversized
848
+ * tool_use input args BEFORE the budget walker runs. Older results get
849
+ * smaller per-message budgets (recencyFactor) so they degrade first while
850
+ * recent turns stay intact. Saves the originals in `originalToolContent`
851
+ * keyed by message index so the summarizer can later reconstruct full
852
+ * fidelity even after the live array was shortened.
853
+ */
854
+ for (let i = 0; i < params.messages.length; i++) {
855
+ const m = params.messages[i];
856
+ if (m.getType() === 'tool' &&
857
+ typeof m.content === 'string' &&
858
+ !originalToolContent.has(i)) {
859
+ originalToolContent.set(i, m.content);
860
+ }
861
+ }
862
+ preFlightTruncateToolResults({
863
+ messages: params.messages,
864
+ maxContextTokens: factoryParams.maxTokens,
865
+ indexTokenCountMap,
866
+ tokenCounter: factoryParams.tokenCounter,
867
+ });
868
+ preFlightTruncateToolCallInputs({
869
+ messages: params.messages,
870
+ maxContextTokens: factoryParams.maxTokens,
871
+ indexTokenCountMap,
872
+ tokenCounter: factoryParams.tokenCounter,
873
+ });
874
+ /*
875
+ * Position-based content degradation: soft-trim then hard-clear older tool
876
+ * results before the budget walker runs. Off by default — caller opts in
877
+ * via `contextPruningConfig.enabled`.
878
+ */
879
+ if (factoryParams.contextPruningConfig?.enabled) {
880
+ applyContextPruning({
881
+ messages: params.messages,
882
+ indexTokenCountMap,
883
+ tokenCounter: factoryParams.tokenCounter,
884
+ config: factoryParams.contextPruningConfig,
885
+ });
886
+ }
413
887
  const { context, thinkingStartIndex, messagesToRefine } = getMessagesWithinTokenLimit({
414
888
  maxContextTokens: factoryParams.maxTokens,
415
889
  messages: params.messages,
@@ -425,10 +899,33 @@ function createPruneMessages(factoryParams) {
425
899
  : undefined,
426
900
  });
427
901
  runThinkingStartIndex = thinkingStartIndex ?? -1;
902
+ /*
903
+ * Orphan repair pass — drops tool messages whose AIMessage was pruned and
904
+ * strips orphan tool_use blocks from AIMessages whose tool results are
905
+ * missing. Without this, the budget walker can split tool_use ↔ tool_result
906
+ * pairs and the provider rejects the request with a structural 400.
907
+ * Dropped messages flow into messagesToRefine for summarization.
908
+ */
909
+ const repaired = repairOrphanedToolMessages({
910
+ context,
911
+ allMessages: params.messages,
912
+ tokenCounter: factoryParams.tokenCounter,
913
+ indexTokenCountMap,
914
+ });
915
+ const finalContext = repaired.context;
916
+ const finalMessagesToRefine = repaired.droppedMessages.length > 0
917
+ ? [...messagesToRefine, ...repaired.droppedMessages]
918
+ : messagesToRefine;
428
919
  /** The index is the first value of `context`, index relative to `params.messages` */
429
920
  lastCutOffIndex = Math.max(params.messages.length -
430
- (context.length - (context[0]?.getType() === 'system' ? 1 : 0)), 0);
431
- return { context, indexTokenCountMap, messagesToRefine };
921
+ (finalContext.length -
922
+ (finalContext[0]?.getType() === 'system' ? 1 : 0)), 0);
923
+ return {
924
+ context: finalContext,
925
+ indexTokenCountMap,
926
+ messagesToRefine: finalMessagesToRefine,
927
+ originalToolContent,
928
+ };
432
929
  };
433
930
  }
434
931
  /** Calculates context utilization as a percentage (0-100) */
@@ -442,5 +939,5 @@ function getContextUtilization(indexTokenCountMap, instructionTokens, maxContext
442
939
  return (totalTokens / maxContextTokens) * 100;
443
940
  }
444
941
 
445
- export { calculateTotalTokens, checkValidNumber, createPruneMessages, getContextUtilization, getMessagesWithinTokenLimit };
942
+ export { calculateTotalTokens, checkValidNumber, createPruneMessages, getContextUtilization, getMessagesWithinTokenLimit, preFlightTruncateToolCallInputs, preFlightTruncateToolResults, repairOrphanedToolMessages, sanitizeOrphanToolBlocks };
446
943
  //# sourceMappingURL=prune.mjs.map