@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
@@ -0,0 +1,436 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { AIMessage, HumanMessage, ToolMessage } from '@langchain/core/messages';
3
+ import type { BaseMessage } from '@langchain/core/messages';
4
+ import { _convertMessagesToAnthropicPayload } from './message_inputs';
5
+
6
+ describe('_convertMessagesToAnthropicPayload — server tool use (web search) multi-turn', () => {
7
+ /* Skipped: this fork intentionally diverged from the reference implementation's
8
+ * `_convertLangChainToolCallToAnthropic` — local always emits
9
+ * `tool_use` regardless of `srvtoolu_` ID prefix (see message_inputs.ts
10
+ * line ~144). These tests assert the standard server_tool_use emission
11
+ * which this fork does not implement. The text→server_tool_use correction
12
+ * test (next, "corrects text-typed server tool blocks") still passes
13
+ * because that path lives in `_formatContent`. */
14
+ it.skip('corrects tool_use blocks with srvtoolu_ IDs to server_tool_use', () => {
15
+ const messageHistory: BaseMessage[] = [
16
+ new HumanMessage('search for X and Y'),
17
+ new AIMessage({
18
+ content: [
19
+ { type: 'text', text: 'I will search for that.' },
20
+ {
21
+ type: 'tool_use',
22
+ id: 'srvtoolu_1',
23
+ name: 'web_search',
24
+ input: { query: 'X' },
25
+ },
26
+ {
27
+ type: 'web_search_tool_result',
28
+ tool_use_id: 'srvtoolu_1',
29
+ content: [
30
+ {
31
+ type: 'web_search_result',
32
+ url: 'https://example.com',
33
+ title: 'Result',
34
+ encrypted_content: 'abc',
35
+ page_age: '1d',
36
+ },
37
+ ],
38
+ },
39
+ {
40
+ type: 'tool_use',
41
+ id: 'srvtoolu_2',
42
+ name: 'web_search',
43
+ input: { query: 'Y' },
44
+ },
45
+ {
46
+ type: 'web_search_tool_result',
47
+ tool_use_id: 'srvtoolu_2',
48
+ content: [
49
+ {
50
+ type: 'web_search_result',
51
+ url: 'https://example2.com',
52
+ title: 'Result 2',
53
+ encrypted_content: 'def',
54
+ page_age: '2d',
55
+ },
56
+ ],
57
+ },
58
+ { type: 'text', text: 'Here are the results.' },
59
+ ],
60
+ tool_calls: [
61
+ {
62
+ id: 'srvtoolu_1',
63
+ name: 'web_search',
64
+ args: { query: 'X' },
65
+ type: 'tool_call',
66
+ },
67
+ {
68
+ id: 'srvtoolu_2',
69
+ name: 'web_search',
70
+ args: { query: 'Y' },
71
+ type: 'tool_call',
72
+ },
73
+ ],
74
+ }),
75
+ new HumanMessage('follow up question'),
76
+ ];
77
+
78
+ const { messages } = _convertMessagesToAnthropicPayload(messageHistory);
79
+ expect(messages).toHaveLength(3);
80
+
81
+ const assistantContent = messages[1].content as any[];
82
+ const serverToolBlocks = assistantContent.filter(
83
+ (b: any) => b.type === 'server_tool_use'
84
+ );
85
+ const searchResultBlocks = assistantContent.filter(
86
+ (b: any) => b.type === 'web_search_tool_result'
87
+ );
88
+ const regularToolUseBlocks = assistantContent.filter(
89
+ (b: any) => b.type === 'tool_use' && b.id?.startsWith('srvtoolu_')
90
+ );
91
+
92
+ expect(serverToolBlocks).toHaveLength(2);
93
+ expect(searchResultBlocks).toHaveLength(2);
94
+ expect(regularToolUseBlocks).toHaveLength(0);
95
+
96
+ // Verify blocks are clean (no extra streaming properties)
97
+ for (const b of serverToolBlocks) {
98
+ expect(Object.keys(b).sort()).toEqual(
99
+ ['id', 'input', 'name', 'type'].sort()
100
+ );
101
+ }
102
+ for (const b of searchResultBlocks) {
103
+ expect(Object.keys(b).sort()).toEqual(
104
+ ['content', 'tool_use_id', 'type'].sort()
105
+ );
106
+ }
107
+ });
108
+
109
+ it('corrects text-typed server tool blocks back to correct types', () => {
110
+ const messageHistory: BaseMessage[] = [
111
+ new HumanMessage('search for X'),
112
+ new AIMessage({
113
+ content: [
114
+ {
115
+ type: 'text',
116
+ id: 'srvtoolu_1',
117
+ name: 'web_search',
118
+ input: '{"query":"X"}',
119
+ },
120
+ {
121
+ type: 'text',
122
+ tool_use_id: 'srvtoolu_1',
123
+ content: [
124
+ {
125
+ type: 'web_search_result',
126
+ url: 'https://example.com',
127
+ title: 'Result',
128
+ encrypted_content: 'abc',
129
+ page_age: '1d',
130
+ },
131
+ ],
132
+ },
133
+ { type: 'text', text: 'Found results.' },
134
+ ],
135
+ tool_calls: [
136
+ {
137
+ id: 'srvtoolu_1',
138
+ name: 'web_search',
139
+ args: { query: 'X' },
140
+ type: 'tool_call',
141
+ },
142
+ ],
143
+ }),
144
+ new HumanMessage('follow up'),
145
+ ];
146
+
147
+ const { messages } = _convertMessagesToAnthropicPayload(messageHistory);
148
+ const assistantContent = messages[1].content as any[];
149
+
150
+ expect(assistantContent[0]).toEqual({
151
+ type: 'server_tool_use',
152
+ id: 'srvtoolu_1',
153
+ name: 'web_search',
154
+ input: { query: 'X' },
155
+ });
156
+ expect(assistantContent[1].type).toBe('web_search_tool_result');
157
+ expect(assistantContent[1].tool_use_id).toBe('srvtoolu_1');
158
+ expect(assistantContent[2]).toEqual({
159
+ type: 'text',
160
+ text: 'Found results.',
161
+ });
162
+ });
163
+
164
+ /* Skipped: depends on the standard server_tool_use emission, see header. */
165
+ it.skip('filters server tool calls when content is a string', () => {
166
+ const messageHistory: BaseMessage[] = [
167
+ new HumanMessage('search for X'),
168
+ new AIMessage({
169
+ content: 'I searched and found results.',
170
+ tool_calls: [
171
+ {
172
+ id: 'srvtoolu_1',
173
+ name: 'web_search',
174
+ args: { query: 'X' },
175
+ type: 'tool_call',
176
+ },
177
+ {
178
+ id: 'toolu_regular',
179
+ name: 'calculator',
180
+ args: { expr: '2+2' },
181
+ type: 'tool_call',
182
+ },
183
+ ],
184
+ }),
185
+ new ToolMessage({
186
+ content: '4',
187
+ tool_call_id: 'toolu_regular',
188
+ }),
189
+ new HumanMessage('follow up'),
190
+ ];
191
+
192
+ const { messages } = _convertMessagesToAnthropicPayload(messageHistory);
193
+ const assistantContent = messages[1].content as any[];
194
+
195
+ const toolUseBlocks = assistantContent.filter(
196
+ (b: any) => b.type === 'tool_use'
197
+ );
198
+ expect(toolUseBlocks).toHaveLength(1);
199
+ expect(toolUseBlocks[0].id).toBe('toolu_regular');
200
+
201
+ const serverToolBlocks = assistantContent.filter((b: any) =>
202
+ b.id?.startsWith('srvtoolu_')
203
+ );
204
+ expect(serverToolBlocks).toHaveLength(0);
205
+ });
206
+
207
+ /* Skipped: depends on the standard server_tool_use emission, see header. */
208
+ it.skip('handles empty string content with only server tool calls', () => {
209
+ const messageHistory: BaseMessage[] = [
210
+ new HumanMessage('search for X'),
211
+ new AIMessage({
212
+ content: '',
213
+ tool_calls: [
214
+ {
215
+ id: 'srvtoolu_1',
216
+ name: 'web_search',
217
+ args: { query: 'X' },
218
+ type: 'tool_call',
219
+ },
220
+ ],
221
+ }),
222
+ new HumanMessage('follow up'),
223
+ ];
224
+
225
+ const { messages } = _convertMessagesToAnthropicPayload(messageHistory);
226
+ const assistantContent = messages[1].content as any[];
227
+ expect(assistantContent).toHaveLength(1);
228
+ expect(assistantContent[0].type).toBe('text');
229
+ expect(assistantContent[0].text).toBe(' ');
230
+ });
231
+
232
+ /* Skipped: depends on the standard server_tool_use emission, see header. */
233
+ it.skip('preserves regular tool_use blocks alongside corrected server tool blocks', () => {
234
+ const messageHistory: BaseMessage[] = [
235
+ new HumanMessage('search for X and calculate 2+2'),
236
+ new AIMessage({
237
+ content: [
238
+ { type: 'text', text: 'Let me help.' },
239
+ {
240
+ type: 'tool_use',
241
+ id: 'srvtoolu_1',
242
+ name: 'web_search',
243
+ input: { query: 'X' },
244
+ },
245
+ {
246
+ type: 'web_search_tool_result',
247
+ tool_use_id: 'srvtoolu_1',
248
+ content: [
249
+ {
250
+ type: 'web_search_result',
251
+ url: 'https://example.com',
252
+ title: 'Result',
253
+ encrypted_content: 'abc',
254
+ page_age: '1d',
255
+ },
256
+ ],
257
+ },
258
+ {
259
+ type: 'tool_use',
260
+ id: 'toolu_calc',
261
+ name: 'calculator',
262
+ input: { expr: '2+2' },
263
+ },
264
+ ],
265
+ tool_calls: [
266
+ {
267
+ id: 'srvtoolu_1',
268
+ name: 'web_search',
269
+ args: { query: 'X' },
270
+ type: 'tool_call',
271
+ },
272
+ {
273
+ id: 'toolu_calc',
274
+ name: 'calculator',
275
+ args: { expr: '2+2' },
276
+ type: 'tool_call',
277
+ },
278
+ ],
279
+ }),
280
+ new ToolMessage({
281
+ content: '4',
282
+ tool_call_id: 'toolu_calc',
283
+ }),
284
+ new HumanMessage('follow up'),
285
+ ];
286
+
287
+ const { messages } = _convertMessagesToAnthropicPayload(messageHistory);
288
+ const assistantContent = messages[1].content as any[];
289
+
290
+ const serverToolUse = assistantContent.filter(
291
+ (b: any) => b.type === 'server_tool_use'
292
+ );
293
+ const webSearchResult = assistantContent.filter(
294
+ (b: any) => b.type === 'web_search_tool_result'
295
+ );
296
+ const regularToolUse = assistantContent.filter(
297
+ (b: any) => b.type === 'tool_use' && !b.id?.startsWith('srvtoolu_')
298
+ );
299
+
300
+ expect(serverToolUse).toHaveLength(1);
301
+ expect(serverToolUse[0].id).toBe('srvtoolu_1');
302
+ expect(webSearchResult).toHaveLength(1);
303
+ expect(regularToolUse).toHaveLength(1);
304
+ expect(regularToolUse[0].id).toBe('toolu_calc');
305
+ });
306
+
307
+ it('filters out empty text blocks from array content', () => {
308
+ const messageHistory: BaseMessage[] = [
309
+ new HumanMessage('search for X'),
310
+ new AIMessage({
311
+ content: [
312
+ { type: 'text', text: '' },
313
+ {
314
+ type: 'server_tool_use',
315
+ id: 'srvtoolu_1',
316
+ name: 'web_search',
317
+ input: { query: 'X' },
318
+ },
319
+ {
320
+ type: 'web_search_tool_result',
321
+ tool_use_id: 'srvtoolu_1',
322
+ content: [
323
+ {
324
+ type: 'web_search_result',
325
+ url: 'https://example.com',
326
+ title: 'Result',
327
+ encrypted_content: 'abc',
328
+ page_age: '1d',
329
+ },
330
+ ],
331
+ },
332
+ { type: 'text', text: '' },
333
+ { type: 'text', text: 'Here are the results.' },
334
+ ],
335
+ tool_calls: [
336
+ {
337
+ id: 'srvtoolu_1',
338
+ name: 'web_search',
339
+ args: { query: 'X' },
340
+ type: 'tool_call',
341
+ },
342
+ ],
343
+ }),
344
+ new HumanMessage('follow up'),
345
+ ];
346
+
347
+ const { messages } = _convertMessagesToAnthropicPayload(messageHistory);
348
+ const assistantContent = messages[1].content as any[];
349
+
350
+ const emptyTextBlocks = assistantContent.filter(
351
+ (b: any) => b.type === 'text' && b.text === ''
352
+ );
353
+ expect(emptyTextBlocks).toHaveLength(0);
354
+
355
+ const textBlocks = assistantContent.filter((b: any) => b.type === 'text');
356
+ expect(textBlocks).toHaveLength(1);
357
+ expect(textBlocks[0].text).toBe('Here are the results.');
358
+ });
359
+
360
+ /**
361
+ * Regression for discussion #12806.
362
+ *
363
+ * Anthropic web_search responses can include text blocks whose text is
364
+ * whitespace-only (e.g. ' ', '\n', '\t') alongside server_tool_use and
365
+ * web_search_tool_result blocks. On follow-up turns the API rejects these
366
+ * with: "messages: text content blocks must contain non-whitespace text".
367
+ *
368
+ * The empty-string check alone is insufficient — the filter must drop any
369
+ * text block whose trimmed content is empty.
370
+ */
371
+ it.each([
372
+ ['single space', ' '],
373
+ ['newline', '\n'],
374
+ ['tab', '\t'],
375
+ ['multiple spaces', ' '],
376
+ ['mixed whitespace', ' \n\t '],
377
+ ])(
378
+ 'filters whitespace-only text blocks from array content (%s)',
379
+ (_label, whitespace) => {
380
+ const messageHistory: BaseMessage[] = [
381
+ new HumanMessage('search for X'),
382
+ new AIMessage({
383
+ content: [
384
+ { type: 'text', text: whitespace },
385
+ {
386
+ type: 'server_tool_use',
387
+ id: 'srvtoolu_1',
388
+ name: 'web_search',
389
+ input: { query: 'X' },
390
+ },
391
+ {
392
+ type: 'web_search_tool_result',
393
+ tool_use_id: 'srvtoolu_1',
394
+ content: [
395
+ {
396
+ type: 'web_search_result',
397
+ url: 'https://example.com',
398
+ title: 'Result',
399
+ encrypted_content: 'abc',
400
+ page_age: '1d',
401
+ },
402
+ ],
403
+ },
404
+ { type: 'text', text: 'Here are the results.' },
405
+ ],
406
+ tool_calls: [
407
+ {
408
+ id: 'srvtoolu_1',
409
+ name: 'web_search',
410
+ args: { query: 'X' },
411
+ type: 'tool_call',
412
+ },
413
+ ],
414
+ }),
415
+ new HumanMessage('follow up'),
416
+ ];
417
+
418
+ const { messages } = _convertMessagesToAnthropicPayload(messageHistory);
419
+ const assistantContent = messages[1].content as any[];
420
+
421
+ const whitespaceTextBlocks = assistantContent.filter(
422
+ (b: any) =>
423
+ b.type === 'text' &&
424
+ typeof b.text === 'string' &&
425
+ b.text.trim() === ''
426
+ );
427
+ expect(whitespaceTextBlocks).toHaveLength(0);
428
+
429
+ const textBlocks = assistantContent.filter(
430
+ (b: any) => b.type === 'text'
431
+ );
432
+ expect(textBlocks).toHaveLength(1);
433
+ expect(textBlocks[0].text).toBe('Here are the results.');
434
+ }
435
+ );
436
+ });
@@ -194,6 +194,134 @@ describe('Bedrock Prompt Caching', () => {
194
194
  expect(model.promptCache).toBe(false);
195
195
  });
196
196
  });
197
+
198
+ describe('Tool cache strategies', () => {
199
+ const fakeTools = [
200
+ {
201
+ toolSpec: {
202
+ name: 'web_search',
203
+ description: 'core search',
204
+ inputSchema: { json: { type: 'object', properties: {} } },
205
+ },
206
+ },
207
+ {
208
+ toolSpec: {
209
+ name: 'execute_code',
210
+ description: 'core code',
211
+ inputSchema: { json: { type: 'object', properties: {} } },
212
+ },
213
+ },
214
+ {
215
+ toolSpec: {
216
+ name: 'search_emails_mcp_Outlook',
217
+ description: 'mcp tool',
218
+ inputSchema: { json: { type: 'object', properties: {} } },
219
+ },
220
+ },
221
+ {
222
+ toolSpec: {
223
+ name: 'list_documents_mcp_SharePoint',
224
+ description: 'mcp tool',
225
+ inputSchema: { json: { type: 'object', properties: {} } },
226
+ },
227
+ },
228
+ ];
229
+
230
+ it("default 'single' strategy: one cachePoint at end of tools array", () => {
231
+ const model = new CustomChatBedrockConverse({
232
+ model: 'anthropic.claude-3-haiku-20240307-v1:0',
233
+ region: 'us-east-1',
234
+ promptCache: true,
235
+ // toolCacheStrategy omitted — default is 'single'
236
+ });
237
+ const params = model.invocationParams({
238
+ tools: fakeTools,
239
+ } satisfies InvocationParamsOptions);
240
+ // 4 tools + 1 cachePoint
241
+ expect(params.toolConfig?.tools).toHaveLength(5);
242
+ expect(params.toolConfig?.tools?.[4]).toEqual({
243
+ cachePoint: { type: 'default' },
244
+ });
245
+ });
246
+
247
+ it("'split' strategy with toolGroupSelector groups tools by selector key, cachePoint after each group", () => {
248
+ const model = new CustomChatBedrockConverse({
249
+ model: 'anthropic.claude-3-haiku-20240307-v1:0',
250
+ region: 'us-east-1',
251
+ promptCache: true,
252
+ toolCacheStrategy: 'split',
253
+ toolGroupSelector: (toolName) =>
254
+ toolName.includes('_mcp_') ? 'mcp' : 'core',
255
+ });
256
+ const params = model.invocationParams({
257
+ tools: fakeTools,
258
+ } satisfies InvocationParamsOptions);
259
+ // [core, core, cp, mcp, mcp, cp] = 6 entries
260
+ expect(params.toolConfig?.tools).toHaveLength(6);
261
+ expect(params.toolConfig?.tools?.[0]).toEqual(fakeTools[0]); // core
262
+ expect(params.toolConfig?.tools?.[1]).toEqual(fakeTools[1]); // core
263
+ expect(params.toolConfig?.tools?.[2]).toEqual({
264
+ cachePoint: { type: 'default' },
265
+ });
266
+ expect(params.toolConfig?.tools?.[3]).toEqual(fakeTools[2]); // mcp
267
+ expect(params.toolConfig?.tools?.[4]).toEqual(fakeTools[3]); // mcp
268
+ expect(params.toolConfig?.tools?.[5]).toEqual({
269
+ cachePoint: { type: 'default' },
270
+ });
271
+ });
272
+
273
+ it("'none' strategy: no cachePoint added at all", () => {
274
+ const model = new CustomChatBedrockConverse({
275
+ model: 'anthropic.claude-3-haiku-20240307-v1:0',
276
+ region: 'us-east-1',
277
+ promptCache: true,
278
+ toolCacheStrategy: 'none',
279
+ });
280
+ const params = model.invocationParams({
281
+ tools: fakeTools,
282
+ } satisfies InvocationParamsOptions);
283
+ expect(params.toolConfig?.tools).toHaveLength(4);
284
+ for (const tool of params.toolConfig?.tools ?? []) {
285
+ expect('cachePoint' in tool).toBe(false);
286
+ }
287
+ });
288
+
289
+ it("'split' with single-group selector behaves like 'single'", () => {
290
+ const model = new CustomChatBedrockConverse({
291
+ model: 'anthropic.claude-3-haiku-20240307-v1:0',
292
+ region: 'us-east-1',
293
+ promptCache: true,
294
+ toolCacheStrategy: 'split',
295
+ toolGroupSelector: () => 'all', // every tool same group
296
+ });
297
+ const params = model.invocationParams({
298
+ tools: fakeTools,
299
+ } satisfies InvocationParamsOptions);
300
+ // 4 tools + 1 cachePoint
301
+ expect(params.toolConfig?.tools).toHaveLength(5);
302
+ expect(params.toolConfig?.tools?.[4]).toEqual({
303
+ cachePoint: { type: 'default' },
304
+ });
305
+ });
306
+
307
+ it("'split' with empty groups skipped (only emits cachePoint after non-empty groups)", () => {
308
+ const model = new CustomChatBedrockConverse({
309
+ model: 'anthropic.claude-3-haiku-20240307-v1:0',
310
+ region: 'us-east-1',
311
+ promptCache: true,
312
+ toolCacheStrategy: 'split',
313
+ toolGroupSelector: (name) =>
314
+ name.includes('_mcp_') ? 'mcp' : 'core',
315
+ });
316
+ // Only core tools — no MCP
317
+ const coreOnly = fakeTools.slice(0, 2);
318
+ const params = model.invocationParams({
319
+ tools: coreOnly,
320
+ } satisfies InvocationParamsOptions);
321
+ // 2 core + 1 cachePoint = 3
322
+ expect(params.toolConfig?.tools).toHaveLength(3);
323
+ });
324
+ });
197
325
  });
198
326
 
199
327
  describe('AgentContext - System Message Caching', () => {
@@ -233,7 +361,13 @@ describe('Bedrock Prompt Caching', () => {
233
361
  };
234
362
 
235
363
  describe('Bedrock system message with promptCache: true', () => {
236
- it('should produce plain string system message (cachePoint is handled at tool level)', async () => {
364
+ /* Updated contract (2026-05-01, PR #128 alignment): Bedrock
365
+ * system message gets a `cachePoint` block inline so the system
366
+ * prefix is cached at the AWS account level (cross-user). Previously
367
+ * cachePoint was only added at the tool level, leaving the system
368
+ * prefix uncached. Tools array still gets its own cachePoints from
369
+ * IllumaBedrockConverse.invocationParams independently. */
370
+ it('emits content array with cachePoint after stable text (Claude model)', async () => {
237
371
  const ctx = createBedrockContext({
238
372
  instructions: 'You are a helpful assistant.',
239
373
  promptCache: true,
@@ -242,17 +376,20 @@ describe('Bedrock Prompt Caching', () => {
242
376
  const systemRunnable = ctx.systemRunnable;
243
377
  expect(systemRunnable).toBeDefined();
244
378
 
245
- // Invoke the runnable to get the messages
246
379
  const result = await systemRunnable!.invoke([]);
247
380
  const systemMessage = result[0];
248
381
 
249
- // Bedrock system messages are plain strings — cachePoint is added
250
- // at the tool level by IllumaBedrockConverse.invocationParams()
251
- expect(typeof systemMessage.content).toBe('string');
252
- expect(systemMessage.content).toBe('You are a helpful assistant.');
382
+ const content = systemMessage.content as Array<Record<string, unknown>>;
383
+ expect(Array.isArray(content)).toBe(true);
384
+ expect(content).toHaveLength(2);
385
+ expect(content[0]).toEqual({
386
+ type: 'text',
387
+ text: 'You are a helpful assistant.',
388
+ });
389
+ expect(content[1]).toEqual({ cachePoint: { type: 'default', ttl: '5m' } });
253
390
  });
254
391
 
255
- it('should include combined instructions and additional_instructions as plain string', async () => {
392
+ it('keeps additional_instructions AFTER cachePoint (dynamic tail not cached)', async () => {
256
393
  const ctx = createBedrockContext({
257
394
  instructions: 'Base instructions.',
258
395
  additionalInstructions: 'Additional context.',
@@ -261,11 +398,20 @@ describe('Bedrock Prompt Caching', () => {
261
398
 
262
399
  const result = await ctx.systemRunnable!.invoke([]);
263
400
  const systemMessage = result[0];
401
+ const content = systemMessage.content as Array<Record<string, unknown>>;
264
402
 
265
- // Bedrock system messages are plain strings even with promptCache
266
- expect(typeof systemMessage.content).toBe('string');
267
- expect(systemMessage.content).toContain('Base instructions.');
268
- expect(systemMessage.content).toContain('Additional context.');
403
+ /* Order is critical: stable text cachePoint dynamic text.
404
+ * Anything after the cachePoint is excluded from the cache, so
405
+ * the per-user/per-request `additional_instructions` does not
406
+ * invalidate the cached prefix. */
407
+ expect(content).toHaveLength(3);
408
+ expect((content[0] as { text: string }).text).toBe(
409
+ 'Base instructions.'
410
+ );
411
+ expect(content[1]).toEqual({ cachePoint: { type: 'default', ttl: '5m' } });
412
+ expect((content[2] as { text: string }).text).toBe(
413
+ 'Additional context.'
414
+ );
269
415
  });
270
416
  });
271
417
 
@@ -312,7 +458,7 @@ describe('Bedrock Prompt Caching', () => {
312
458
  expect(content[0]).toEqual({
313
459
  type: 'text',
314
460
  text: 'You are a helpful assistant.',
315
- cache_control: { type: 'ephemeral' },
461
+ cache_control: { type: 'ephemeral', ttl: '5m' },
316
462
  });
317
463
  });
318
464
 
@@ -330,19 +476,21 @@ describe('Bedrock Prompt Caching', () => {
330
476
  });
331
477
 
332
478
  describe('Provider-specific caching behavior', () => {
333
- it('should produce plain string for Bedrock (cachePoint handled at tool level)', async () => {
479
+ it('emits cachePoint block inline for Bedrock Claude (account-scoped system caching)', async () => {
334
480
  const bedrockCtx = createBedrockContext({
335
481
  instructions: 'Test',
336
482
  promptCache: true,
337
483
  });
338
484
 
339
485
  const result = await bedrockCtx.systemRunnable!.invoke([]);
486
+ const content = result[0].content as Array<Record<string, unknown>>;
340
487
 
341
- // Bedrock system messages are plain strings cachePoint is added
342
- // at the tool level by IllumaBedrockConverse.invocationParams(),
343
- // not inline in the system message content
344
- expect(typeof result[0].content).toBe('string');
345
- expect(result[0].content).toBe('Test');
488
+ // Bedrock system messages now carry an inline cachePoint so the
489
+ // system prefix gets cached at the AWS account level (matching
490
+ // PR #128). Tool-level cachePoint from
491
+ // IllumaBedrockConverse.invocationParams() runs independently.
492
+ expect(Array.isArray(content)).toBe(true);
493
+ expect(content.some((c) => 'cachePoint' in c)).toBe(true);
346
494
  });
347
495
 
348
496
  it('should use cache_control format for Anthropic, not cachePoint', async () => {