@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,159 +0,0 @@
1
- /* eslint-disable no-console */
2
- // processWikipedia.ts
3
- import * as fs from 'fs';
4
- import * as path from 'path';
5
- import { processContent } from './content';
6
-
7
- /**
8
- * Process a Wikipedia article (HTML and Markdown) and create a referenced version
9
- */
10
- async function processWikipediaArticle(): Promise<void> {
11
- try {
12
- console.log('Starting Wikipedia article processing...');
13
-
14
- // Define file paths - adapt these to your specific file locations
15
- const htmlPath = path.resolve('./test.html');
16
- const markdownPath = path.resolve('./test.md');
17
- const outputPath = path.resolve('./output.md');
18
-
19
- // Check if input files exist
20
- if (!fs.existsSync(htmlPath)) {
21
- throw new Error(`Wikipedia HTML file not found at ${htmlPath}`);
22
- }
23
-
24
- if (!fs.existsSync(markdownPath)) {
25
- throw new Error(`Wikipedia Markdown file not found at ${markdownPath}`);
26
- }
27
-
28
- console.log('Reading Wikipedia article files...');
29
- const html = fs.readFileSync(htmlPath, 'utf-8');
30
- const markdown = fs.readFileSync(markdownPath, 'utf-8');
31
-
32
- // Extract article title for logging
33
- const titleMatch = /<h1[^>]*>([^<]+)<\/h1>/i.exec(html);
34
- const articleTitle = titleMatch
35
- ? titleMatch[1].trim()
36
- : 'Wikipedia article';
37
-
38
- console.log(`Processing "${articleTitle}"...`);
39
-
40
- // Measure processing time
41
- const startTime = process.hrtime();
42
-
43
- // Process content
44
- const result = processContent(html, markdown);
45
-
46
- // Calculate processing time
47
- const elapsed = process.hrtime(startTime);
48
- const timeInMs = elapsed[0] * 1000 + elapsed[1] / 1000000;
49
-
50
- // Generate reference appendix
51
- const appendix = generateReferenceAppendix(result);
52
-
53
- // Create complete output with the processed content and appendix
54
- const completeOutput = result.markdown + appendix;
55
-
56
- // Write to output file
57
- fs.writeFileSync(outputPath, completeOutput);
58
-
59
- // Print processing statistics
60
- console.log('\nWikipedia article processing complete! ✓');
61
- console.log('-'.repeat(60));
62
- console.log(`Article: ${articleTitle}`);
63
- console.log(`Processing time: ${timeInMs.toFixed(2)}ms`);
64
- console.log('Media references replaced:');
65
- console.log(` - Links: ${result.links.length}`);
66
- console.log(` - Images: ${result.images.length}`);
67
- console.log(` - Videos: ${result.videos.length}`);
68
- console.log(
69
- ` - Total: ${result.links.length + result.images.length + result.videos.length}`
70
- );
71
- console.log(`Output saved to: ${outputPath}`);
72
- console.log('-'.repeat(60));
73
-
74
- // Print sample of the transformation
75
- const sampleLines = result.markdown.split('\n').slice(0, 10).join('\n');
76
- console.log('\nSample of transformed content:');
77
- console.log('-'.repeat(30));
78
- console.log(sampleLines);
79
- console.log('-'.repeat(30));
80
- console.log('... (continued in output file)');
81
- } catch (error) {
82
- console.error('Error processing Wikipedia article:', error);
83
- process.exit(1);
84
- }
85
- }
86
-
87
- /**
88
- * Generate a comprehensive reference appendix with all media links
89
- */
90
- function generateReferenceAppendix(result: {
91
- links: Array<{ originalUrl: string; title?: string; text?: string }>;
92
- images: Array<{ originalUrl: string; title?: string }>;
93
- videos: Array<{ originalUrl: string; title?: string }>;
94
- }): string {
95
- let appendix = '\n\n' + '---'.repeat(10) + '\n\n';
96
- appendix += '# References\n\n';
97
-
98
- if (result.links.length > 0) {
99
- appendix += '## Links\n\n';
100
- result.links.forEach((link, index) => {
101
- // Clean and format text for display
102
- let displayText = '';
103
- if (link.text != null && link.text.trim()) {
104
- // Limit length for very long link text
105
- let cleanText = link.text.trim();
106
- if (cleanText.length > 50) {
107
- cleanText = cleanText.substring(0, 47) + '...';
108
- }
109
- displayText = ` - "${cleanText}"`;
110
- }
111
-
112
- appendix += `**link#${index + 1}**: ${link.originalUrl}${displayText}\n\n`;
113
- });
114
- }
115
-
116
- if (result.images.length > 0) {
117
- appendix += '## Images\n\n';
118
- result.images.forEach((image, index) => {
119
- const displayTitle =
120
- image.title != null && image.title.trim()
121
- ? ` - ${image.title.trim()}`
122
- : '';
123
- appendix += `**image#${index + 1}**: ${image.originalUrl}${displayTitle}\n\n`;
124
- });
125
- }
126
-
127
- if (result.videos.length > 0) {
128
- appendix += '## Videos\n\n';
129
- result.videos.forEach((video, index) => {
130
- const displayTitle =
131
- video.title != null && video.title.trim()
132
- ? ` - ${video.title.trim()}`
133
- : '';
134
- appendix += `**video#${index + 1}**: ${video.originalUrl}${displayTitle}\n\n`;
135
- });
136
- }
137
-
138
- // Add a category breakdown to show what types of links were found
139
- const totalRefs =
140
- result.links.length + result.images.length + result.videos.length;
141
-
142
- appendix += '## Summary\n\n';
143
- appendix += `Total references: **${totalRefs}**\n\n`;
144
- appendix += `- Links: ${result.links.length}\n`;
145
- appendix += `- Images: ${result.images.length}\n`;
146
- appendix += `- Videos: ${result.videos.length}\n`;
147
-
148
- return appendix;
149
- }
150
-
151
- // Using async IIFE to allow for better error handling
152
- (async (): Promise<void> => {
153
- try {
154
- await processWikipediaArticle();
155
- } catch (error) {
156
- console.error('Unhandled error:', error);
157
- process.exit(1);
158
- }
159
- })();
@@ -1,217 +0,0 @@
1
- /**
2
- * Unit tests for child-agent context preparation.
3
- *
4
- * These strategies are the primary defense against schema confusion and
5
- * Bedrock/VertexAI message-shape rejections, so their behavior must be
6
- * locked down with fixtures that mirror real provider output shapes.
7
- */
8
- import {
9
- AIMessage,
10
- HumanMessage,
11
- SystemMessage,
12
- ToolMessage,
13
- } from '@langchain/core/messages';
14
- import type { BaseMessage } from '@langchain/core/messages';
15
- import {
16
- HANDOFF_TAIL_CONTEXT_PREFIX,
17
- buildIsolatedChildPrompt,
18
- prepareHandoffMessages,
19
- prepareIsolatedChildMessages,
20
- } from '../childAgentContext';
21
-
22
- describe('buildIsolatedChildPrompt', () => {
23
- it('wraps upstream text in the prior-step / your-task sections', () => {
24
- const out = buildIsolatedChildPrompt('RESEARCH FINDINGS');
25
- expect(out).toContain('## Prior step output');
26
- expect(out).toContain('RESEARCH FINDINGS');
27
- expect(out).toContain('## Your task');
28
- expect(out).toMatch(/You MUST now/);
29
- });
30
-
31
- it('instructs the model to call tools directly without asking for clarification', () => {
32
- const out = buildIsolatedChildPrompt('x');
33
- expect(out).toMatch(/call it directly/);
34
- expect(out).toMatch(/do not ask for clarification/);
35
- });
36
- });
37
-
38
- describe('prepareHandoffMessages', () => {
39
- it('returns an empty array unchanged', () => {
40
- expect(prepareHandoffMessages([])).toEqual([]);
41
- });
42
-
43
- it('preserves system and human messages verbatim', () => {
44
- const msgs: BaseMessage[] = [
45
- new SystemMessage('sys'),
46
- new HumanMessage('hello'),
47
- ];
48
- const out = prepareHandoffMessages(msgs);
49
- expect(out).toHaveLength(2);
50
- expect(out[0].getType()).toBe('system');
51
- expect(out[1].getType()).toBe('human');
52
- });
53
-
54
- it('drops orphaned tool_use blocks (handoff tool has no matching result)', () => {
55
- const ai = new AIMessage({
56
- content: 'transferring',
57
- tool_calls: [{ name: 'handoff_to_writer', args: {}, id: 'call_1' }],
58
- });
59
- const out = prepareHandoffMessages([new HumanMessage('go'), ai]);
60
- // The assistant tail becomes a HumanMessage with the context prefix
61
- // because the orphaned tool_use was stripped, leaving only text.
62
- expect(out).toHaveLength(2);
63
- expect(out[1].getType()).toBe('human');
64
- expect(out[1].content).toContain('transferring');
65
- expect(out[1].content).toContain(HANDOFF_TAIL_CONTEXT_PREFIX);
66
- });
67
-
68
- it('compacts paired tool_use/tool_result into a text summary', () => {
69
- const ai = new AIMessage({
70
- content: '',
71
- tool_calls: [{ name: 'search', args: { q: 'x' }, id: 'call_a' }],
72
- });
73
- const toolResult = new ToolMessage({
74
- content: 'hit: 42',
75
- tool_call_id: 'call_a',
76
- });
77
- const out = prepareHandoffMessages([
78
- new HumanMessage('find x'),
79
- ai,
80
- toolResult,
81
- new HumanMessage('what did you find?'),
82
- ]);
83
- // The paired tool_use+result should have become a text summary on the
84
- // rewritten AI message; the original ToolMessage should be gone.
85
- expect(out.some((m) => m.getType() === 'tool')).toBe(false);
86
- const rewrittenAI = out.find((m) => m.getType() === 'ai');
87
- expect(rewrittenAI).toBeDefined();
88
- expect(String(rewrittenAI?.content)).toContain('[Tool "search"');
89
- expect(String(rewrittenAI?.content)).toContain('hit: 42');
90
- });
91
-
92
- it('truncates long tool_result content at 500 chars in the summary', () => {
93
- const long = 'x'.repeat(1200);
94
- const ai = new AIMessage({
95
- content: '',
96
- tool_calls: [{ name: 'dump', args: {}, id: 'call_big' }],
97
- });
98
- const tool = new ToolMessage({ content: long, tool_call_id: 'call_big' });
99
- const out = prepareHandoffMessages([new HumanMessage('hi'), ai, tool]);
100
- // After the paired compaction the tail is an AIMessage with no text, so
101
- // it gets dropped (empty) — find the one that carries the summary by
102
- // scanning for the "[Tool" marker in any message.
103
- const blob = out.map((m) => String(m.content)).join(' ');
104
- expect(blob).toContain('[Tool "dump"');
105
- // The truncated slice is 500 chars of x, not the full 1200.
106
- const match = blob.match(/x+/);
107
- expect(match).toBeTruthy();
108
- expect((match?.[0].length ?? 0) <= 500).toBe(true);
109
- });
110
-
111
- it('ensures the tail message is a HumanMessage by rewriting a trailing AI', () => {
112
- const msgs: BaseMessage[] = [
113
- new HumanMessage('question'),
114
- new AIMessage('plain text answer'),
115
- ];
116
- const out = prepareHandoffMessages(msgs);
117
- expect(out[out.length - 1].getType()).toBe('human');
118
- expect(out[out.length - 1].content).toBe(
119
- `${HANDOFF_TAIL_CONTEXT_PREFIX}plain text answer`
120
- );
121
- });
122
-
123
- it('drops a trailing empty AIMessage instead of creating an empty human', () => {
124
- const msgs: BaseMessage[] = [
125
- new HumanMessage('q'),
126
- new AIMessage(''), // empty, nothing to carry forward
127
- ];
128
- const out = prepareHandoffMessages(msgs);
129
- expect(out).toHaveLength(1);
130
- expect(out[0].getType()).toBe('human');
131
- });
132
- });
133
-
134
- describe('prepareIsolatedChildMessages', () => {
135
- it('returns empty input unchanged', () => {
136
- expect(prepareIsolatedChildMessages([])).toEqual([]);
137
- });
138
-
139
- it('keeps only the first human message and a synthetic directive', () => {
140
- const msgs: BaseMessage[] = [
141
- new HumanMessage('original request'),
142
- new AIMessage('upstream produced this result'),
143
- ];
144
- const out = prepareIsolatedChildMessages(msgs);
145
- expect(out).toHaveLength(2);
146
- expect(out[0].getType()).toBe('human');
147
- expect(out[0].content).toBe('original request');
148
- expect(out[1].getType()).toBe('human');
149
- expect(String(out[1].content)).toContain('upstream produced this result');
150
- expect(String(out[1].content)).toContain('## Your task');
151
- });
152
-
153
- it('discards upstream tool_use/tool_result blocks entirely', () => {
154
- const aiWithTool = new AIMessage({
155
- content: 'working',
156
- tool_calls: [{ name: 'search', args: {}, id: 'c1' }],
157
- });
158
- const toolResult = new ToolMessage({
159
- content: 'search result',
160
- tool_call_id: 'c1',
161
- });
162
- const aiFinal = new AIMessage('final summary text');
163
- const out = prepareIsolatedChildMessages([
164
- new HumanMessage('user ask'),
165
- aiWithTool,
166
- toolResult,
167
- aiFinal,
168
- ]);
169
- // Must not contain any ToolMessage or upstream tool_calls.
170
- expect(out.some((m) => m.getType() === 'tool')).toBe(false);
171
- // The synthetic directive should reference only the final text output.
172
- const directive = String(out[1].content);
173
- expect(directive).toContain('final summary text');
174
- expect(directive).not.toContain('search result');
175
- });
176
-
177
- it('picks the most recent non-empty AI text output', () => {
178
- const msgs: BaseMessage[] = [
179
- new HumanMessage('req'),
180
- new AIMessage('older text'),
181
- new AIMessage(''),
182
- new AIMessage('newer text'),
183
- ];
184
- const out = prepareIsolatedChildMessages(msgs);
185
- expect(String(out[1].content)).toContain('newer text');
186
- expect(String(out[1].content)).not.toContain('older text');
187
- });
188
-
189
- it('handles AI content in Anthropic array-of-blocks shape', () => {
190
- const ai = new AIMessage({
191
- content: [
192
- { type: 'tool_use', name: 'x', input: {}, id: 'c1' },
193
- { type: 'text', text: 'block text result' },
194
- ] as unknown as string, // the SDK types are strict, cast for fixture
195
- });
196
- const out = prepareIsolatedChildMessages([new HumanMessage('q'), ai]);
197
- expect(out).toHaveLength(2);
198
- expect(String(out[1].content)).toContain('block text result');
199
- });
200
-
201
- it('falls back to raw messages if no human and no upstream text exist', () => {
202
- const msgs: BaseMessage[] = [new SystemMessage('just system')];
203
- const out = prepareIsolatedChildMessages(msgs);
204
- expect(out).toBe(msgs);
205
- });
206
-
207
- it('returns just the user message when upstream has no text content', () => {
208
- const msgs: BaseMessage[] = [
209
- new HumanMessage('only user'),
210
- new AIMessage(''),
211
- ];
212
- const out = prepareIsolatedChildMessages(msgs);
213
- expect(out).toHaveLength(1);
214
- expect(out[0].getType()).toBe('human');
215
- expect(out[0].content).toBe('only user');
216
- });
217
- });
@@ -1,130 +0,0 @@
1
- import {
2
- mergeCredentials,
3
- collectRequiredAuthFields,
4
- filterForwardableCredentials,
5
- findMissingCredentials,
6
- credentialsFromEnv,
7
- isForwardable,
8
- CredentialOrigin,
9
- } from '../credentials';
10
- import { AuthSource, CapabilityKind, type Capability } from '@/providers/types';
11
-
12
- const makeCap = (
13
- name: string,
14
- authFields: Array<[string, AuthSource?, boolean?]>
15
- ): Capability => ({
16
- kind: CapabilityKind.TOOL,
17
- name,
18
- description: `${name} capability`,
19
- authConfig: authFields.map(([authField, source, required]) => ({
20
- authField,
21
- source,
22
- required,
23
- })),
24
- metadata: {},
25
- });
26
-
27
- describe('mergeCredentials', () => {
28
- it('first layer wins on collision', () => {
29
- const result = mergeCredentials(
30
- { origin: CredentialOrigin.RUNTIME, values: { KEY: 'runtime' } },
31
- {
32
- origin: CredentialOrigin.AGENT,
33
- values: { KEY: 'agent', OTHER: 'agent' },
34
- },
35
- { origin: CredentialOrigin.ENV, values: { KEY: 'env', THIRD: 'env' } }
36
- );
37
- expect(result.KEY).toBe('runtime');
38
- expect(result.OTHER).toBe('agent');
39
- expect(result.THIRD).toBe('env');
40
- });
41
-
42
- it('skips empty/undefined/null values', () => {
43
- const result = mergeCredentials(
44
- { origin: CredentialOrigin.RUNTIME, values: { KEY: '' } },
45
- { origin: CredentialOrigin.ENV, values: { KEY: 'fallback' } }
46
- );
47
- expect(result.KEY).toBe('fallback');
48
- });
49
-
50
- it('returns empty map when all layers empty', () => {
51
- const result = mergeCredentials();
52
- expect(result).toEqual({});
53
- });
54
- });
55
-
56
- describe('collectRequiredAuthFields', () => {
57
- it('unions auth fields across capabilities', () => {
58
- const caps = [
59
- makeCap('a', [['KEY_1'], ['KEY_2']]),
60
- makeCap('b', [['KEY_2'], ['KEY_3']]),
61
- ];
62
- const fields = collectRequiredAuthFields(caps);
63
- expect(fields.sort()).toEqual(['KEY_1', 'KEY_2', 'KEY_3']);
64
- });
65
- });
66
-
67
- describe('filterForwardableCredentials', () => {
68
- it('strips credentials whose source is SERVER', () => {
69
- const caps = [
70
- makeCap('x', [
71
- ['SERVER_KEY', AuthSource.SERVER],
72
- ['USER_KEY', AuthSource.USER],
73
- ]),
74
- ];
75
- const filtered = filterForwardableCredentials(
76
- { SERVER_KEY: 'secret', USER_KEY: 'u1', UNRELATED: 'ok' },
77
- caps
78
- );
79
- expect(filtered).toEqual({ USER_KEY: 'u1', UNRELATED: 'ok' });
80
- });
81
- });
82
-
83
- describe('findMissingCredentials', () => {
84
- it('flags missing required fields that are not server-resolved', () => {
85
- const cap = makeCap('tool', [
86
- ['REQUIRED_USER', AuthSource.USER, true],
87
- ['OPTIONAL_USER', AuthSource.USER, false],
88
- ['SERVER_MANAGED', AuthSource.SERVER, true],
89
- ]);
90
- const missing = findMissingCredentials(cap, {});
91
- expect(missing).toEqual(['REQUIRED_USER']);
92
- });
93
-
94
- it('returns empty when all required are present', () => {
95
- const cap = makeCap('tool', [['KEY', AuthSource.USER, true]]);
96
- expect(findMissingCredentials(cap, { KEY: 'val' })).toEqual([]);
97
- });
98
- });
99
-
100
- describe('credentialsFromEnv', () => {
101
- it('reads only fields present in env', () => {
102
- const layer = credentialsFromEnv(['A', 'B', 'C'], {
103
- A: '1',
104
- C: '3',
105
- } as NodeJS.ProcessEnv);
106
- expect(layer.values).toEqual({ A: '1', C: '3' });
107
- expect(layer.origin).toBe(CredentialOrigin.ENV);
108
- });
109
- });
110
-
111
- describe('isForwardable', () => {
112
- it('SERVER is not forwardable', () => {
113
- expect(isForwardable({ authField: 'K', source: AuthSource.SERVER })).toBe(
114
- false
115
- );
116
- });
117
- it('USER is forwardable', () => {
118
- expect(isForwardable({ authField: 'K', source: AuthSource.USER })).toBe(
119
- true
120
- );
121
- });
122
- it('FORWARDED is forwardable', () => {
123
- expect(
124
- isForwardable({ authField: 'K', source: AuthSource.FORWARDED })
125
- ).toBe(true);
126
- });
127
- it('defaults to forwardable when source is undefined', () => {
128
- expect(isForwardable({ authField: 'K' })).toBe(true);
129
- });
130
- });
@@ -1,75 +0,0 @@
1
- import { createHttpClient, HttpError, assertOk } from '../httpClient';
2
-
3
- describe('createHttpClient', () => {
4
- it('creates an axios instance with baseURL', () => {
5
- const client = createHttpClient({
6
- baseURL: 'http://localhost:3500',
7
- apiKey: 'k',
8
- });
9
- expect(client.defaults.baseURL).toBe('http://localhost:3500');
10
- });
11
-
12
- it('sets x-api-key header when apiKey provided', () => {
13
- const client = createHttpClient({ baseURL: 'http://x', apiKey: 'my-key' });
14
- expect(client.defaults.headers['x-api-key']).toBe('my-key');
15
- });
16
-
17
- it('omits x-api-key when apiKey not provided', () => {
18
- const client = createHttpClient({ baseURL: 'http://x' });
19
- expect(client.defaults.headers['x-api-key']).toBeUndefined();
20
- });
21
-
22
- it('merges custom headers', () => {
23
- const client = createHttpClient({
24
- baseURL: 'http://x',
25
- apiKey: 'k',
26
- headers: { 'x-custom': 'v' },
27
- });
28
- expect(client.defaults.headers['x-custom']).toBe('v');
29
- });
30
-
31
- it('applies timeout', () => {
32
- const client = createHttpClient({ baseURL: 'http://x', timeoutMs: 5000 });
33
- expect(client.defaults.timeout).toBe(5000);
34
- });
35
-
36
- it('default timeout is 30_000ms', () => {
37
- const client = createHttpClient({ baseURL: 'http://x' });
38
- expect(client.defaults.timeout).toBe(30_000);
39
- });
40
-
41
- it('proxy=null disables proxy even if env is set', () => {
42
- const prev = process.env.PROXY;
43
- process.env.PROXY = 'http://should-be-ignored';
44
- try {
45
- const client = createHttpClient({ baseURL: 'http://x', proxy: null });
46
- expect(client.defaults.httpsAgent).toBeUndefined();
47
- } finally {
48
- process.env.PROXY = prev;
49
- }
50
- });
51
- });
52
-
53
- describe('HttpError', () => {
54
- it('captures status, url, and body', () => {
55
- const err = new HttpError(404, '/foo', { message: 'not found' });
56
- expect(err.status).toBe(404);
57
- expect(err.url).toBe('/foo');
58
- expect(err.body).toEqual({ message: 'not found' });
59
- expect(err.name).toBe('HttpError');
60
- expect(err.message).toContain('404');
61
- });
62
- });
63
-
64
- describe('assertOk', () => {
65
- it('passes for 2xx', () => {
66
- expect(() => assertOk(200, '/x', {})).not.toThrow();
67
- expect(() => assertOk(204, '/x', {})).not.toThrow();
68
- expect(() => assertOk(299, '/x', {})).not.toThrow();
69
- });
70
- it('throws for non-2xx', () => {
71
- expect(() => assertOk(400, '/x', {})).toThrow(HttpError);
72
- expect(() => assertOk(500, '/x', {})).toThrow(HttpError);
73
- expect(() => assertOk(199, '/x', {})).toThrow(HttpError);
74
- });
75
- });
@@ -1,116 +0,0 @@
1
- import { ManifestCache, filterToCacheKey, applyFilter } from '../toolManifest';
2
- import { CapabilityKind, type Capability } from '@/providers/types';
3
-
4
- const makeCap = (
5
- name: string,
6
- tags: string[] = [],
7
- kind: CapabilityKind = CapabilityKind.TOOL
8
- ): Capability => ({
9
- kind,
10
- name,
11
- description: `${name} cap`,
12
- authConfig: [],
13
- metadata: { tags },
14
- });
15
-
16
- describe('ManifestCache', () => {
17
- it('stores and retrieves by key', () => {
18
- const cache = new ManifestCache({ ttlMs: 10_000 });
19
- const caps = [makeCap('a')];
20
- cache.set('k', caps);
21
- expect(cache.get('k')).toBe(caps);
22
- expect(cache.size).toBe(1);
23
- });
24
-
25
- it('returns undefined on miss', () => {
26
- const cache = new ManifestCache();
27
- expect(cache.get('nope')).toBeUndefined();
28
- });
29
-
30
- it('expires after ttlMs', async () => {
31
- const cache = new ManifestCache({ ttlMs: 1 });
32
- cache.set('k', [makeCap('a')]);
33
- await new Promise((r) => setTimeout(r, 5));
34
- expect(cache.get('k')).toBeUndefined();
35
- });
36
-
37
- it('ttlMs=0 disables caching', () => {
38
- const cache = new ManifestCache({ ttlMs: 0 });
39
- cache.set('k', [makeCap('a')]);
40
- expect(cache.get('k')).toBeUndefined();
41
- });
42
-
43
- it('clear removes all entries', () => {
44
- const cache = new ManifestCache({ ttlMs: 10_000 });
45
- cache.set('a', []);
46
- cache.set('b', []);
47
- cache.clear();
48
- expect(cache.size).toBe(0);
49
- });
50
- });
51
-
52
- describe('filterToCacheKey', () => {
53
- it('returns __all__ for undefined filter', () => {
54
- expect(filterToCacheKey()).toBe('__all__');
55
- expect(filterToCacheKey({})).toBe('__all__');
56
- });
57
-
58
- it('is deterministic regardless of tag order', () => {
59
- const k1 = filterToCacheKey({ tags: ['b', 'a'] });
60
- const k2 = filterToCacheKey({ tags: ['a', 'b'] });
61
- expect(k1).toBe(k2);
62
- });
63
-
64
- it('is deterministic regardless of names order', () => {
65
- const k1 = filterToCacheKey({ names: ['z', 'a'] });
66
- const k2 = filterToCacheKey({ names: ['a', 'z'] });
67
- expect(k1).toBe(k2);
68
- });
69
-
70
- it('combines kind + tags + names', () => {
71
- const k = filterToCacheKey({
72
- kind: CapabilityKind.TOOL,
73
- tags: ['x'],
74
- names: ['y'],
75
- });
76
- expect(k).toContain('kind=tool');
77
- expect(k).toContain('tags=x');
78
- expect(k).toContain('names=y');
79
- });
80
- });
81
-
82
- describe('applyFilter', () => {
83
- const caps = [
84
- makeCap('alpha', ['search', 'web'], CapabilityKind.TOOL),
85
- makeCap('beta', ['image'], CapabilityKind.TOOL),
86
- makeCap('gamma', ['search'], CapabilityKind.SKILL),
87
- ];
88
-
89
- it('no filter returns all', () => {
90
- expect(applyFilter(caps)).toHaveLength(3);
91
- expect(applyFilter(caps, {})).toHaveLength(3);
92
- });
93
-
94
- it('kind filter', () => {
95
- const out = applyFilter(caps, { kind: CapabilityKind.TOOL });
96
- expect(out.map((c) => c.name)).toEqual(['alpha', 'beta']);
97
- });
98
-
99
- it('tags filter — any match', () => {
100
- const out = applyFilter(caps, { tags: ['search'] });
101
- expect(out.map((c) => c.name).sort()).toEqual(['alpha', 'gamma']);
102
- });
103
-
104
- it('names filter — inclusion', () => {
105
- const out = applyFilter(caps, { names: ['alpha', 'gamma'] });
106
- expect(out.map((c) => c.name).sort()).toEqual(['alpha', 'gamma']);
107
- });
108
-
109
- it('combined filter — AND semantics', () => {
110
- const out = applyFilter(caps, {
111
- kind: CapabilityKind.TOOL,
112
- tags: ['search'],
113
- });
114
- expect(out.map((c) => c.name)).toEqual(['alpha']);
115
- });
116
- });