@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,353 +0,0 @@
1
- /**
2
- * Unit tests for MultiAgentGraph handoff validation and pre-handoff compaction.
3
- *
4
- * These tests exercise the handoff logic (destination validation, compaction threshold,
5
- * briefing generation, error formatting) without instantiating the full MultiAgentGraph.
6
- * We test the helper functions directly and verify the behavioral patterns that
7
- * the graph's agent node closure relies on.
8
- */
9
- import {
10
- HumanMessage,
11
- AIMessage,
12
- SystemMessage,
13
- ToolMessage,
14
- } from '@langchain/core/messages';
15
- import {
16
- summarize,
17
- createEmergencySummary,
18
- buildFullSummaryPrompt,
19
- formatMessagesForSummary,
20
- } from '@/messages';
21
-
22
- // ---------------------------------------------------------------------------
23
- // 1. Handoff destination validation logic
24
- // ---------------------------------------------------------------------------
25
- describe('handoff destination validation', () => {
26
- it('detects non-existent agent in contexts map', () => {
27
- const agentContexts = new Map([
28
- ['agent-a', { agentId: 'agent-a', name: 'Agent A' }],
29
- ['agent-b', { agentId: 'agent-b', name: 'Agent B' }],
30
- ]);
31
-
32
- const handoffDest = 'agent-c';
33
- expect(agentContexts.has(handoffDest)).toBe(false);
34
-
35
- const availableAgents = Array.from(agentContexts.keys()).join(', ');
36
- expect(availableAgents).toBe('agent-a, agent-b');
37
- });
38
-
39
- it('passes validation for existing agent', () => {
40
- const agentContexts = new Map([
41
- ['agent-a', { agentId: 'agent-a', name: 'Agent A' }],
42
- ]);
43
-
44
- expect(agentContexts.has('agent-a')).toBe(true);
45
- });
46
-
47
- it('handles empty contexts map', () => {
48
- const agentContexts = new Map<string, { agentId: string; name: string }>();
49
- expect(agentContexts.has('any-agent')).toBe(false);
50
-
51
- const availableAgents = Array.from(agentContexts.keys()).join(', ');
52
- expect(availableAgents).toBe('');
53
- });
54
- });
55
-
56
- // ---------------------------------------------------------------------------
57
- // 2. Pre-handoff compaction threshold
58
- // ---------------------------------------------------------------------------
59
- describe('pre-handoff compaction threshold', () => {
60
- it('triggers compaction when context exceeds 70% of receiver budget', () => {
61
- const receiverBudget = 100000;
62
- const currentSize = 75000; // 75%
63
- expect(currentSize > receiverBudget * 0.7).toBe(true);
64
- });
65
-
66
- it('skips compaction when context fits within 70% of receiver budget', () => {
67
- const receiverBudget = 100000;
68
- const currentSize = 60000; // 60%
69
- expect(currentSize > receiverBudget * 0.7).toBe(false);
70
- });
71
-
72
- it('triggers compaction at exactly the boundary (>70%)', () => {
73
- const receiverBudget = 100000;
74
- // Exactly 70% should NOT trigger (condition is strictly >)
75
- expect(70000 > receiverBudget * 0.7).toBe(false);
76
- // Just above 70% should trigger
77
- expect(70001 > receiverBudget * 0.7).toBe(true);
78
- });
79
-
80
- it('computes summary budget as 20% of receiver budget', () => {
81
- const receiverBudget = 100000;
82
- const summaryBudget = Math.floor(receiverBudget * 0.2);
83
- expect(summaryBudget).toBe(20000);
84
- });
85
- });
86
-
87
- // ---------------------------------------------------------------------------
88
- // 3. Handoff briefing via summarize (multi-agent aware)
89
- // ---------------------------------------------------------------------------
90
- describe('handoff briefing generation', () => {
91
- it('generates multi-agent aware briefing', async () => {
92
- const messages = [
93
- new HumanMessage('Analyze the data'),
94
- new AIMessage('I found 3 key patterns...'),
95
- new HumanMessage('Can you elaborate on pattern 2?'),
96
- new AIMessage('Pattern 2 shows...'),
97
- ];
98
-
99
- const callback = jest
100
- .fn()
101
- .mockResolvedValue(
102
- '## 5. Agent Workflow State\n- Agent A analyzed data and found 3 patterns'
103
- );
104
-
105
- const result = await summarize(messages, callback, {
106
- isMultiAgent: true,
107
- agentWorkflowState: {
108
- currentAgentId: 'agent-b',
109
- agentChain: ['agent-a', 'agent-b'],
110
- pendingAgents: [],
111
- },
112
- summaryBudget: 2000,
113
- });
114
-
115
- // Without a tokenCounter the budget check is skipped, so full tier is returned
116
- expect(result.tier).toBe('full');
117
- expect(result.summary).toContain('Agent Workflow State');
118
- // Verify callback was called with the full prompt containing agent workflow info
119
- expect(callback).toHaveBeenCalledWith(
120
- expect.stringContaining('Agent Workflow State'),
121
- expect.any(Number)
122
- );
123
- });
124
-
125
- it('includes agent chain in the prompt', () => {
126
- const conversation = formatMessagesForSummary([new HumanMessage('Hello')]);
127
- const prompt = buildFullSummaryPrompt(conversation, {
128
- isMultiAgent: true,
129
- agentWorkflowState: {
130
- currentAgentId: 'agent-b',
131
- agentChain: ['agent-a', 'agent-b'],
132
- pendingAgents: ['agent-c'],
133
- },
134
- });
135
-
136
- expect(prompt).toContain('Current agent: agent-b');
137
- expect(prompt).toContain('Agent chain: agent-a -> agent-b');
138
- expect(prompt).toContain('Pending agents: agent-c');
139
- });
140
-
141
- it('shows N/A for single-agent conversations', () => {
142
- const conversation = formatMessagesForSummary([new HumanMessage('Hello')]);
143
- const prompt = buildFullSummaryPrompt(conversation);
144
-
145
- expect(prompt).toContain('N/A (single-agent conversation)');
146
- });
147
- });
148
-
149
- // ---------------------------------------------------------------------------
150
- // 4. Emergency briefing fallback
151
- // ---------------------------------------------------------------------------
152
- describe('emergency briefing fallback', () => {
153
- it('generates briefing without LLM when callback fails', async () => {
154
- const messages = [
155
- new HumanMessage('Analyze this'),
156
- new AIMessage('Here is the analysis...'),
157
- ];
158
-
159
- const failingCallback = jest
160
- .fn()
161
- .mockRejectedValue(new Error('LLM timeout'));
162
- const result = await summarize(messages, failingCallback);
163
-
164
- expect(result.tier).toBe('emergency');
165
- expect(result.summary).toContain('[Emergency Context Summary]');
166
- expect(result.summary).toContain('Analyze this');
167
- });
168
-
169
- it('falls to emergency when both full and simple callbacks fail', async () => {
170
- let callCount = 0;
171
- const failingCallback = jest.fn().mockImplementation(() => {
172
- callCount++;
173
- throw new Error(`Failure #${callCount}`);
174
- });
175
-
176
- const messages = [
177
- new HumanMessage('Do something'),
178
- new AIMessage('Working on it...'),
179
- new ToolMessage({
180
- content: 'result',
181
- tool_call_id: 'tc-1',
182
- name: 'search',
183
- }),
184
- ];
185
-
186
- const result = await summarize(messages, failingCallback);
187
-
188
- expect(result.tier).toBe('emergency');
189
- expect(result.summary).toContain('Do something');
190
- expect(result.summary).toContain('Working on it...');
191
- expect(result.summary).toContain('search');
192
- expect(result.messagesCompacted).toBe(3);
193
- });
194
-
195
- it('createEmergencySummary captures first user message and last AI message', () => {
196
- const messages = [
197
- new HumanMessage('First user message'),
198
- new AIMessage('First AI response'),
199
- new HumanMessage('Second user message'),
200
- new AIMessage('Second AI response'),
201
- ];
202
-
203
- const summary = createEmergencySummary(messages);
204
-
205
- expect(summary).toContain('[Emergency Context Summary]');
206
- expect(summary).toContain('Original request: First user message');
207
- expect(summary).toContain('Last response: Second AI response');
208
- expect(summary).toContain('Tools used: none');
209
- expect(summary).toContain('Messages compacted: 4');
210
- });
211
-
212
- it('createEmergencySummary collects unique tool names', () => {
213
- const messages = [
214
- new HumanMessage('Test'),
215
- new ToolMessage({ content: 'ok', tool_call_id: 'tc-1', name: 'search' }),
216
- new ToolMessage({ content: 'ok', tool_call_id: 'tc-2', name: 'search' }),
217
- new ToolMessage({
218
- content: 'ok',
219
- tool_call_id: 'tc-3',
220
- name: 'calculator',
221
- }),
222
- ];
223
-
224
- const summary = createEmergencySummary(messages);
225
-
226
- expect(summary).toContain('search');
227
- expect(summary).toContain('calculator');
228
- });
229
- });
230
-
231
- // ---------------------------------------------------------------------------
232
- // 5. Handoff error ToolMessage format
233
- // ---------------------------------------------------------------------------
234
- describe('handoff error message format', () => {
235
- it('creates properly formatted error ToolMessage', () => {
236
- const availableAgents = 'agent-a, agent-b, agent-c';
237
- const handoffDest = 'nonexistent-agent';
238
-
239
- const errorMsg = new ToolMessage({
240
- content: `Transfer failed: agent "${handoffDest}" does not exist. Available agents: ${availableAgents}. Please choose a valid agent to transfer to.`,
241
- tool_call_id: 'call-123',
242
- name: `transfer_to_${handoffDest}`,
243
- });
244
-
245
- expect(errorMsg.content).toContain('does not exist');
246
- expect(errorMsg.content).toContain(availableAgents);
247
- expect(errorMsg.tool_call_id).toBe('call-123');
248
- expect(errorMsg.name).toBe('transfer_to_nonexistent-agent');
249
- });
250
-
251
- it('error message includes all available agents', () => {
252
- const agentContexts = new Map([
253
- ['alpha', {}],
254
- ['beta', {}],
255
- ['gamma', {}],
256
- ]);
257
- const availableAgents = Array.from(agentContexts.keys()).join(', ');
258
-
259
- const errorMsg = new ToolMessage({
260
- content: `Transfer failed: agent "delta" does not exist. Available agents: ${availableAgents}. Please choose a valid agent to transfer to.`,
261
- tool_call_id: 'call-456',
262
- name: 'lc_transfer_to_delta',
263
- });
264
-
265
- expect(errorMsg.content).toContain('alpha, beta, gamma');
266
- expect(errorMsg.getType()).toBe('tool');
267
- });
268
- });
269
-
270
- // ---------------------------------------------------------------------------
271
- // 6. Compacted handoff message structure
272
- // ---------------------------------------------------------------------------
273
- describe('compacted handoff message structure', () => {
274
- it('keeps briefing + last 3 messages', () => {
275
- const originalMessages = [
276
- new HumanMessage('msg 1'),
277
- new AIMessage('msg 2'),
278
- new HumanMessage('msg 3'),
279
- new AIMessage('msg 4'),
280
- new HumanMessage('msg 5'),
281
- new AIMessage('msg 6'),
282
- ];
283
-
284
- const briefingMsg = new SystemMessage(
285
- '[Handoff Briefing]\nAgent A completed analysis'
286
- );
287
- const keepCount = Math.min(3, originalMessages.length);
288
- const compacted = [
289
- briefingMsg,
290
- ...originalMessages.slice(originalMessages.length - keepCount),
291
- ];
292
-
293
- expect(compacted).toHaveLength(4); // briefing + 3 messages
294
- expect(compacted[0].getType()).toBe('system');
295
- expect(compacted[0].content).toContain('Handoff Briefing');
296
- expect(compacted[3].getType()).toBe('ai'); // last message preserved
297
- });
298
-
299
- it('keeps all messages when fewer than 3 remain', () => {
300
- const originalMessages = [
301
- new HumanMessage('only message'),
302
- new AIMessage('only response'),
303
- ];
304
-
305
- const briefingMsg = new SystemMessage('[Handoff Briefing]\nBriefing text');
306
- const keepCount = Math.min(3, originalMessages.length);
307
- const compacted = [
308
- briefingMsg,
309
- ...originalMessages.slice(originalMessages.length - keepCount),
310
- ];
311
-
312
- // briefing + 2 original messages
313
- expect(compacted).toHaveLength(3);
314
- expect(compacted[1].content).toBe('only message');
315
- expect(compacted[2].content).toBe('only response');
316
- });
317
-
318
- it('preserves the handoff tool message as the last message', () => {
319
- const originalMessages = [
320
- new HumanMessage('do X'),
321
- new AIMessage('calling agent-b'),
322
- new ToolMessage({
323
- content: 'Transferred to agent-b',
324
- tool_call_id: 'tc-handoff',
325
- name: 'lc_transfer_to_agent-b',
326
- }),
327
- ];
328
-
329
- const briefingMsg = new SystemMessage('[Handoff Briefing]\nContext');
330
- const keepCount = Math.min(3, originalMessages.length);
331
- const compacted = [
332
- briefingMsg,
333
- ...originalMessages.slice(originalMessages.length - keepCount),
334
- ];
335
-
336
- const lastMsg = compacted[compacted.length - 1];
337
- expect(lastMsg.getType()).toBe('tool');
338
- expect((lastMsg as ToolMessage).name).toContain('lc_transfer_to_');
339
- });
340
-
341
- it('briefing contains sender name in the expected format', () => {
342
- const senderName = 'Research Agent';
343
- const summaryText = 'User asked about market trends. Found 5 data points.';
344
- const briefingMsg = new SystemMessage(
345
- `[Handoff Briefing from "${senderName}"]\n${summaryText}`
346
- );
347
-
348
- expect(briefingMsg.content).toContain(
349
- 'Handoff Briefing from "Research Agent"'
350
- );
351
- expect(briefingMsg.content).toContain(summaryText);
352
- });
353
- });
@@ -1,79 +0,0 @@
1
- /**
2
- * Integration test — exercises ToolsServerCapabilityProvider against a live
3
- * tools-server instance.
4
- *
5
- * RUN REQUIREMENTS:
6
- * 1. tools-server must be running locally at TOOLS_SERVER_URL
7
- * 2. TOOLS_SERVER_API_KEY must match the server's configured key
8
- *
9
- * The suite is skipped when TOOLS_SERVER_URL is not set so unit CI passes.
10
- * To run: TOOLS_SERVER_URL=http://localhost:3500 TOOLS_SERVER_API_KEY=test \
11
- * npx jest --testPathPatterns=integration
12
- */
13
-
14
- import { ToolsServerCapabilityProvider } from '../tools-server/ToolsServerCapabilityProvider';
15
- import { CapabilityKind } from '../types';
16
-
17
- const baseUrl = process.env.TOOLS_SERVER_URL;
18
- const apiKey = process.env.TOOLS_SERVER_API_KEY;
19
-
20
- const describeIfLive = baseUrl && apiKey ? describe : describe.skip;
21
-
22
- describeIfLive('ToolsServerCapabilityProvider (live integration)', () => {
23
- let provider: ToolsServerCapabilityProvider;
24
-
25
- beforeAll(() => {
26
- provider = new ToolsServerCapabilityProvider({
27
- baseUrl: baseUrl as string,
28
- apiKey: apiKey as string,
29
- manifestTtlMs: 0, // always fresh for tests
30
- });
31
- });
32
-
33
- it('fetches manifest from live server', async () => {
34
- const caps = await provider.fetchManifest();
35
- expect(caps.length).toBeGreaterThan(0);
36
- for (const cap of caps) {
37
- expect(cap.kind).toBe(CapabilityKind.TOOL);
38
- expect(typeof cap.name).toBe('string');
39
- expect(typeof cap.description).toBe('string');
40
- expect(Array.isArray(cap.authConfig)).toBe(true);
41
- }
42
- });
43
-
44
- it('live manifest contains wikipedia', async () => {
45
- const caps = await provider.fetchManifest();
46
- const wikipedia = caps.find((c) => c.name === 'wikipedia');
47
- expect(wikipedia).toBeDefined();
48
- expect(wikipedia?.schema).toBeDefined();
49
- });
50
-
51
- it('builds runnables that invoke wikipedia end-to-end', async () => {
52
- const caps = await provider.fetchManifest({ names: ['wikipedia'] });
53
- expect(caps).toHaveLength(1);
54
-
55
- const [tool] = await provider.createRunnables(caps, {});
56
- const result = await tool.invoke({ action: 'search', query: 'TypeScript' });
57
-
58
- // Wikipedia returns JSON-serialized results; just check it's non-empty
59
- expect(typeof result).toBe('string');
60
- expect((result as string).length).toBeGreaterThan(0);
61
- });
62
-
63
- it('surfaces backend failure as thrown error', async () => {
64
- // Invoke wikipedia with missing required field → backend returns success:false
65
- const caps = await provider.fetchManifest({ names: ['wikipedia'] });
66
- const [tool] = await provider.createRunnables(caps, {});
67
- await expect(tool.invoke({})).rejects.toThrow();
68
- });
69
-
70
- it('filters manifest by names correctly', async () => {
71
- const caps = await provider.fetchManifest({
72
- names: ['wikipedia', 'arxiv_search'],
73
- });
74
- expect(caps.length).toBeLessThanOrEqual(2);
75
- for (const cap of caps) {
76
- expect(['wikipedia', 'arxiv_search']).toContain(cap.name);
77
- }
78
- });
79
- });
@@ -1,271 +0,0 @@
1
- import axios from 'axios';
2
- import { ToolsServerCapabilityProvider } from '../tools-server/ToolsServerCapabilityProvider';
3
- import { CapabilityKind } from '../types';
4
-
5
- /**
6
- * Tests use a stub axios instance passed via config — no real HTTP.
7
- */
8
- function makeStubClient(response: {
9
- status: number;
10
- data: unknown;
11
- }): ReturnType<typeof axios.create> {
12
- const stub = {
13
- get: jest.fn().mockResolvedValue(response),
14
- post: jest.fn().mockResolvedValue(response),
15
- defaults: { baseURL: 'http://stub', headers: {} },
16
- };
17
- return stub as unknown as ReturnType<typeof axios.create>;
18
- }
19
-
20
- const manifestFixture = [
21
- {
22
- pluginKey: 'wikipedia',
23
- name: 'Wikipedia',
24
- description: 'Search Wikipedia',
25
- icon: '/assets/icons/wikipedia.svg',
26
- authConfig: [],
27
- schema: { type: 'object', properties: { query: { type: 'string' } } },
28
- tags: ['search', 'knowledge'],
29
- },
30
- {
31
- pluginKey: 'dalle',
32
- name: 'DALL-E 3',
33
- description: 'Generate images',
34
- authConfig: [
35
- {
36
- authField: 'OPENAI_API_KEY',
37
- label: 'OpenAI API Key',
38
- source: 'user',
39
- required: true,
40
- },
41
- ],
42
- jsonSchema: { type: 'object', properties: { prompt: { type: 'string' } } },
43
- tags: ['image'],
44
- },
45
- ];
46
-
47
- describe('ToolsServerCapabilityProvider construction', () => {
48
- it('throws when baseUrl missing', () => {
49
- expect(
50
- () => new ToolsServerCapabilityProvider({ baseUrl: '', apiKey: 'k' })
51
- ).toThrow(/baseUrl is required/);
52
- });
53
- it('throws when apiKey missing', () => {
54
- expect(
55
- () =>
56
- new ToolsServerCapabilityProvider({ baseUrl: 'http://x', apiKey: '' })
57
- ).toThrow(/apiKey is required/);
58
- });
59
- it('composes providerId from baseUrl', () => {
60
- const p = new ToolsServerCapabilityProvider({
61
- baseUrl: 'http://localhost:3500',
62
- apiKey: 'k',
63
- client: makeStubClient({ status: 200, data: [] }),
64
- });
65
- expect(p.providerId).toBe('tools-server:http://localhost:3500');
66
- });
67
- });
68
-
69
- describe('ToolsServerCapabilityProvider.fetchManifest', () => {
70
- it('normalizes manifest entries into Capability shape', async () => {
71
- const client = makeStubClient({ status: 200, data: manifestFixture });
72
- const p = new ToolsServerCapabilityProvider({
73
- baseUrl: 'http://x',
74
- apiKey: 'k',
75
- client,
76
- });
77
- const caps = await p.fetchManifest();
78
- expect(caps).toHaveLength(2);
79
- expect(caps[0].kind).toBe(CapabilityKind.TOOL);
80
- expect(caps[0].name).toBe('wikipedia');
81
- expect(caps[0].metadata.tags).toEqual(['search', 'knowledge']);
82
- expect(caps[1].authConfig[0].authField).toBe('OPENAI_API_KEY');
83
- expect(caps[1].authConfig[0].required).toBe(true);
84
- });
85
-
86
- it('caches manifest between calls', async () => {
87
- const client = makeStubClient({ status: 200, data: manifestFixture });
88
- const p = new ToolsServerCapabilityProvider({
89
- baseUrl: 'http://x',
90
- apiKey: 'k',
91
- client,
92
- });
93
- await p.fetchManifest();
94
- await p.fetchManifest();
95
- expect((client.get as jest.Mock).mock.calls).toHaveLength(1);
96
- });
97
-
98
- it('invalidateCache forces refetch', async () => {
99
- const client = makeStubClient({ status: 200, data: manifestFixture });
100
- const p = new ToolsServerCapabilityProvider({
101
- baseUrl: 'http://x',
102
- apiKey: 'k',
103
- client,
104
- });
105
- await p.fetchManifest();
106
- p.invalidateCache();
107
- await p.fetchManifest();
108
- expect((client.get as jest.Mock).mock.calls).toHaveLength(2);
109
- });
110
-
111
- it('filters by name', async () => {
112
- const client = makeStubClient({ status: 200, data: manifestFixture });
113
- const p = new ToolsServerCapabilityProvider({
114
- baseUrl: 'http://x',
115
- apiKey: 'k',
116
- client,
117
- });
118
- const caps = await p.fetchManifest({ names: ['wikipedia'] });
119
- expect(caps).toHaveLength(1);
120
- expect(caps[0].name).toBe('wikipedia');
121
- });
122
-
123
- it('throws HttpError on non-2xx', async () => {
124
- const client = makeStubClient({ status: 500, data: { error: 'boom' } });
125
- const p = new ToolsServerCapabilityProvider({
126
- baseUrl: 'http://x',
127
- apiKey: 'k',
128
- client,
129
- });
130
- await expect(p.fetchManifest()).rejects.toThrow(/HTTP 500/);
131
- });
132
- });
133
-
134
- describe('ToolsServerCapabilityProvider.createRunnables', () => {
135
- it('returns one StructuredTool per capability', async () => {
136
- const client = makeStubClient({ status: 200, data: manifestFixture });
137
- const p = new ToolsServerCapabilityProvider({
138
- baseUrl: 'http://x',
139
- apiKey: 'k',
140
- client,
141
- });
142
- const caps = await p.fetchManifest();
143
- const tools = await p.createRunnables(caps, {});
144
- expect(tools).toHaveLength(2);
145
- expect(tools[0].name).toBe('wikipedia');
146
- expect(tools[1].name).toBe('dalle');
147
- });
148
-
149
- it('proxy tool invocation POSTs to /execute/:name with credentials', async () => {
150
- const client = {
151
- get: jest.fn().mockResolvedValue({ status: 200, data: manifestFixture }),
152
- post: jest.fn().mockResolvedValue({
153
- status: 200,
154
- data: {
155
- success: true,
156
- result: 'Node.js is a JS runtime',
157
- timing: { durationMs: 42 },
158
- },
159
- }),
160
- defaults: { baseURL: 'http://stub', headers: {} },
161
- };
162
- const p = new ToolsServerCapabilityProvider({
163
- baseUrl: 'http://x',
164
- apiKey: 'k',
165
- client: client as unknown as ReturnType<typeof axios.create>,
166
- });
167
- const caps = await p.fetchManifest();
168
- const [wikipedia] = await p.createRunnables(
169
- caps.filter((c) => c.name === 'wikipedia'),
170
- { WIKIPEDIA_API_KEY: 'test' }
171
- );
172
- const result = await wikipedia.invoke({ query: 'Node.js' });
173
- expect(result).toBe('Node.js is a JS runtime');
174
- expect((client.post as jest.Mock).mock.calls[0][0]).toBe(
175
- '/execute/wikipedia'
176
- );
177
- expect((client.post as jest.Mock).mock.calls[0][1]).toEqual({
178
- input: { query: 'Node.js' },
179
- credentials: { WIKIPEDIA_API_KEY: 'test' },
180
- });
181
- });
182
-
183
- it('proxy tool surfaces backend success:false as thrown error', async () => {
184
- const client = {
185
- get: jest.fn().mockResolvedValue({ status: 200, data: manifestFixture }),
186
- post: jest.fn().mockResolvedValue({
187
- status: 200,
188
- data: { success: false, error: 'missing API key' },
189
- }),
190
- defaults: { baseURL: 'http://stub', headers: {} },
191
- };
192
- const p = new ToolsServerCapabilityProvider({
193
- baseUrl: 'http://x',
194
- apiKey: 'k',
195
- client: client as unknown as ReturnType<typeof axios.create>,
196
- });
197
- const caps = await p.fetchManifest();
198
- const [dalle] = await p.createRunnables(
199
- caps.filter((c) => c.name === 'dalle'),
200
- {}
201
- );
202
- await expect(dalle.invoke({ prompt: 'cat' })).rejects.toThrow(
203
- /missing API key/
204
- );
205
- });
206
-
207
- it('getExecuteAuthHeaders is invoked per call and forwarded as HTTP headers', async () => {
208
- const client = {
209
- get: jest.fn().mockResolvedValue({ status: 200, data: manifestFixture }),
210
- post: jest.fn().mockResolvedValue({
211
- status: 200,
212
- data: {
213
- success: true,
214
- result: 'ok',
215
- timing: { durationMs: 1 },
216
- },
217
- }),
218
- defaults: { baseURL: 'http://stub', headers: {} },
219
- };
220
-
221
- let mintCount = 0;
222
- const p = new ToolsServerCapabilityProvider({
223
- baseUrl: 'http://x',
224
- apiKey: 'k',
225
- client: client as unknown as ReturnType<typeof axios.create>,
226
- getExecuteAuthHeaders: async () => {
227
- mintCount += 1;
228
- return { Authorization: `Bearer TOKEN-${mintCount}` };
229
- },
230
- });
231
- const caps = await p.fetchManifest();
232
- const [wikipedia] = await p.createRunnables(
233
- caps.filter((c) => c.name === 'wikipedia'),
234
- {}
235
- );
236
-
237
- await wikipedia.invoke({ query: 'a' });
238
- await wikipedia.invoke({ query: 'b' });
239
-
240
- // Two invocations → two mints (fresh token each call)
241
- expect(mintCount).toBe(2);
242
-
243
- // Each POST includes the Authorization header from the mint
244
- const firstCall = (client.post as jest.Mock).mock.calls[0];
245
- const secondCall = (client.post as jest.Mock).mock.calls[1];
246
- expect(firstCall[2]?.headers).toEqual({ Authorization: 'Bearer TOKEN-1' });
247
- expect(secondCall[2]?.headers).toEqual({ Authorization: 'Bearer TOKEN-2' });
248
- });
249
-
250
- it('getExecuteAuthHeaders is NOT called during manifest fetch (service-to-service)', async () => {
251
- const client = {
252
- get: jest.fn().mockResolvedValue({ status: 200, data: manifestFixture }),
253
- post: jest.fn(),
254
- defaults: { baseURL: 'http://stub', headers: {} },
255
- };
256
-
257
- const authBuilder = jest
258
- .fn()
259
- .mockReturnValue({ Authorization: 'Bearer X' });
260
- const p = new ToolsServerCapabilityProvider({
261
- baseUrl: 'http://x',
262
- apiKey: 'k',
263
- client: client as unknown as ReturnType<typeof axios.create>,
264
- getExecuteAuthHeaders: authBuilder,
265
- });
266
-
267
- await p.fetchManifest();
268
- // Manifest fetch is service-to-service — no per-user auth headers
269
- expect(authBuilder).not.toHaveBeenCalled();
270
- });
271
- });