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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (653) hide show
  1. package/README.md +62 -0
  2. package/dist/cjs/agents/AgentContext.cjs +274 -67
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  4. package/dist/cjs/common/enum.cjs +44 -13
  5. package/dist/cjs/common/enum.cjs.map +1 -1
  6. package/dist/cjs/graphs/Graph.cjs +182 -5
  7. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  8. package/dist/cjs/graphs/MultiAgentGraph.cjs +152 -1167
  9. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  10. package/dist/cjs/graphs/phases/memoryFlushPhase.cjs +1 -1
  11. package/dist/cjs/graphs/phases/memoryFlushPhase.cjs.map +1 -1
  12. package/dist/cjs/hooks/HookRegistry.cjs +162 -0
  13. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -0
  14. package/dist/cjs/hooks/executeHooks.cjs +276 -0
  15. package/dist/cjs/hooks/executeHooks.cjs.map +1 -0
  16. package/dist/cjs/hooks/matchers.cjs +256 -0
  17. package/dist/cjs/hooks/matchers.cjs.map +1 -0
  18. package/dist/cjs/hooks/types.cjs +27 -0
  19. package/dist/cjs/hooks/types.cjs.map +1 -0
  20. package/dist/cjs/langchain/google-common.cjs +3 -0
  21. package/dist/cjs/langchain/google-common.cjs.map +1 -0
  22. package/dist/cjs/langchain/index.cjs +86 -0
  23. package/dist/cjs/langchain/index.cjs.map +1 -0
  24. package/dist/cjs/langchain/language_models/chat_models.cjs +3 -0
  25. package/dist/cjs/langchain/language_models/chat_models.cjs.map +1 -0
  26. package/dist/cjs/langchain/messages/tool.cjs +3 -0
  27. package/dist/cjs/langchain/messages/tool.cjs.map +1 -0
  28. package/dist/cjs/langchain/messages.cjs +51 -0
  29. package/dist/cjs/langchain/messages.cjs.map +1 -0
  30. package/dist/cjs/langchain/openai.cjs +3 -0
  31. package/dist/cjs/langchain/openai.cjs.map +1 -0
  32. package/dist/cjs/langchain/prompts.cjs +11 -0
  33. package/dist/cjs/langchain/prompts.cjs.map +1 -0
  34. package/dist/cjs/langchain/runnables.cjs +19 -0
  35. package/dist/cjs/langchain/runnables.cjs.map +1 -0
  36. package/dist/cjs/langchain/tools.cjs +23 -0
  37. package/dist/cjs/langchain/tools.cjs.map +1 -0
  38. package/dist/cjs/langchain/utils/env.cjs +11 -0
  39. package/dist/cjs/langchain/utils/env.cjs.map +1 -0
  40. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +5 -1
  41. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  42. package/dist/cjs/llm/bedrock/cacheSupport.cjs +55 -0
  43. package/dist/cjs/llm/bedrock/cacheSupport.cjs.map +1 -0
  44. package/dist/cjs/llm/bedrock/index.cjs +61 -33
  45. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  46. package/dist/cjs/llm/openai/index.cjs +1 -4
  47. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  48. package/dist/cjs/llm/openai/utils/index.cjs +27 -10
  49. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  50. package/dist/cjs/main.cjs +178 -127
  51. package/dist/cjs/main.cjs.map +1 -1
  52. package/dist/cjs/memory/citations.cjs +4 -4
  53. package/dist/cjs/memory/citations.cjs.map +1 -1
  54. package/dist/cjs/memory/constants.cjs +17 -17
  55. package/dist/cjs/memory/constants.cjs.map +1 -1
  56. package/dist/cjs/memory/mmr.cjs +1 -1
  57. package/dist/cjs/memory/mmr.cjs.map +1 -1
  58. package/dist/cjs/memory/paths.cjs +1 -1
  59. package/dist/cjs/memory/paths.cjs.map +1 -1
  60. package/dist/cjs/memory/recallTracking.cjs +3 -3
  61. package/dist/cjs/memory/recallTracking.cjs.map +1 -1
  62. package/dist/cjs/memory/temporalDecay.cjs +2 -2
  63. package/dist/cjs/memory/temporalDecay.cjs.map +1 -1
  64. package/dist/cjs/messages/cache.cjs +89 -0
  65. package/dist/cjs/messages/cache.cjs.map +1 -1
  66. package/dist/cjs/messages/contextPruning.cjs +156 -0
  67. package/dist/cjs/messages/contextPruning.cjs.map +1 -0
  68. package/dist/cjs/messages/contextPruningSettings.cjs +53 -0
  69. package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -0
  70. package/dist/cjs/messages/format.cjs +144 -20
  71. package/dist/cjs/messages/format.cjs.map +1 -1
  72. package/dist/cjs/messages/prune.cjs +505 -4
  73. package/dist/cjs/messages/prune.cjs.map +1 -1
  74. package/dist/cjs/run.cjs +141 -1
  75. package/dist/cjs/run.cjs.map +1 -1
  76. package/dist/cjs/tools/BashExecutor.cjs +235 -0
  77. package/dist/cjs/tools/BashExecutor.cjs.map +1 -0
  78. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +297 -0
  79. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -0
  80. package/dist/cjs/tools/CodeExecutor.cjs +45 -47
  81. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  82. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +16 -11
  83. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  84. package/dist/cjs/tools/ReadFile.cjs +44 -0
  85. package/dist/cjs/tools/ReadFile.cjs.map +1 -0
  86. package/dist/cjs/tools/SkillTool.cjs +51 -0
  87. package/dist/cjs/tools/SkillTool.cjs.map +1 -0
  88. package/dist/cjs/tools/SubagentTool.cjs +93 -0
  89. package/dist/cjs/tools/SubagentTool.cjs.map +1 -0
  90. package/dist/cjs/tools/ToolNode.cjs +450 -24
  91. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  92. package/dist/cjs/tools/memory/memoryAppendTool.cjs +1 -1
  93. package/dist/cjs/tools/memory/memoryAppendTool.cjs.map +1 -1
  94. package/dist/cjs/tools/memory/memoryGetTool.cjs +2 -2
  95. package/dist/cjs/tools/memory/memoryGetTool.cjs.map +1 -1
  96. package/dist/cjs/tools/memory/memorySearchTool.cjs +3 -3
  97. package/dist/cjs/tools/memory/memorySearchTool.cjs.map +1 -1
  98. package/dist/cjs/tools/memory/shared.cjs +1 -1
  99. package/dist/cjs/tools/memory/shared.cjs.map +1 -1
  100. package/dist/cjs/tools/search/search.cjs +11 -3
  101. package/dist/cjs/tools/search/search.cjs.map +1 -1
  102. package/dist/cjs/tools/search/tavily-scraper.cjs +189 -0
  103. package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -0
  104. package/dist/cjs/tools/search/tavily-search.cjs +372 -0
  105. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -0
  106. package/dist/cjs/tools/search/tool.cjs +28 -4
  107. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  108. package/dist/cjs/tools/search/utils.cjs +10 -3
  109. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  110. package/dist/cjs/tools/skillCatalog.cjs +84 -0
  111. package/dist/cjs/tools/skillCatalog.cjs.map +1 -0
  112. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +512 -0
  113. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -0
  114. package/dist/cjs/tools/toolOutputReferences.cjs +670 -0
  115. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -0
  116. package/dist/cjs/types/agent-cache.cjs +54 -0
  117. package/dist/cjs/types/agent-cache.cjs.map +1 -0
  118. package/dist/cjs/types/graph.cjs.map +1 -1
  119. package/dist/cjs/utils/truncation.cjs +135 -0
  120. package/dist/cjs/utils/truncation.cjs.map +1 -0
  121. package/dist/esm/agents/AgentContext.mjs +274 -67
  122. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  123. package/dist/esm/common/enum.mjs +44 -12
  124. package/dist/esm/common/enum.mjs.map +1 -1
  125. package/dist/esm/graphs/Graph.mjs +182 -5
  126. package/dist/esm/graphs/Graph.mjs.map +1 -1
  127. package/dist/esm/graphs/MultiAgentGraph.mjs +155 -1170
  128. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  129. package/dist/esm/graphs/phases/memoryFlushPhase.mjs +1 -1
  130. package/dist/esm/graphs/phases/memoryFlushPhase.mjs.map +1 -1
  131. package/dist/esm/hooks/HookRegistry.mjs +160 -0
  132. package/dist/esm/hooks/HookRegistry.mjs.map +1 -0
  133. package/dist/esm/hooks/executeHooks.mjs +273 -0
  134. package/dist/esm/hooks/executeHooks.mjs.map +1 -0
  135. package/dist/esm/hooks/matchers.mjs +251 -0
  136. package/dist/esm/hooks/matchers.mjs.map +1 -0
  137. package/dist/esm/hooks/types.mjs +25 -0
  138. package/dist/esm/hooks/types.mjs.map +1 -0
  139. package/dist/esm/langchain/google-common.mjs +2 -0
  140. package/dist/esm/langchain/google-common.mjs.map +1 -0
  141. package/dist/esm/langchain/index.mjs +5 -0
  142. package/dist/esm/langchain/language_models/chat_models.mjs +2 -0
  143. package/dist/esm/langchain/language_models/chat_models.mjs.map +1 -0
  144. package/dist/esm/langchain/messages/tool.mjs +2 -0
  145. package/dist/esm/langchain/messages/tool.mjs.map +1 -0
  146. package/dist/esm/langchain/messages.mjs +2 -0
  147. package/dist/esm/langchain/messages.mjs.map +1 -0
  148. package/dist/esm/langchain/openai.mjs +2 -0
  149. package/dist/esm/langchain/openai.mjs.map +1 -0
  150. package/dist/esm/langchain/prompts.mjs +2 -0
  151. package/dist/esm/langchain/prompts.mjs.map +1 -0
  152. package/dist/esm/langchain/runnables.mjs +2 -0
  153. package/dist/esm/langchain/runnables.mjs.map +1 -0
  154. package/dist/esm/langchain/tools.mjs +2 -0
  155. package/dist/esm/langchain/tools.mjs.map +1 -0
  156. package/dist/esm/langchain/utils/env.mjs +2 -0
  157. package/dist/esm/langchain/utils/env.mjs.map +1 -0
  158. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +5 -1
  159. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  160. package/dist/esm/llm/bedrock/cacheSupport.mjs +52 -0
  161. package/dist/esm/llm/bedrock/cacheSupport.mjs.map +1 -0
  162. package/dist/esm/llm/bedrock/index.mjs +61 -34
  163. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  164. package/dist/esm/llm/openai/index.mjs +1 -4
  165. package/dist/esm/llm/openai/index.mjs.map +1 -1
  166. package/dist/esm/llm/openai/utils/index.mjs +27 -10
  167. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  168. package/dist/esm/main.mjs +21 -27
  169. package/dist/esm/main.mjs.map +1 -1
  170. package/dist/esm/memory/citations.mjs +4 -4
  171. package/dist/esm/memory/citations.mjs.map +1 -1
  172. package/dist/esm/memory/constants.mjs +17 -17
  173. package/dist/esm/memory/constants.mjs.map +1 -1
  174. package/dist/esm/memory/mmr.mjs +1 -1
  175. package/dist/esm/memory/mmr.mjs.map +1 -1
  176. package/dist/esm/memory/paths.mjs +1 -1
  177. package/dist/esm/memory/paths.mjs.map +1 -1
  178. package/dist/esm/memory/recallTracking.mjs +3 -3
  179. package/dist/esm/memory/recallTracking.mjs.map +1 -1
  180. package/dist/esm/memory/temporalDecay.mjs +2 -2
  181. package/dist/esm/memory/temporalDecay.mjs.map +1 -1
  182. package/dist/esm/messages/cache.mjs +89 -0
  183. package/dist/esm/messages/cache.mjs.map +1 -1
  184. package/dist/esm/messages/contextPruning.mjs +154 -0
  185. package/dist/esm/messages/contextPruning.mjs.map +1 -0
  186. package/dist/esm/messages/contextPruningSettings.mjs +50 -0
  187. package/dist/esm/messages/contextPruningSettings.mjs.map +1 -0
  188. package/dist/esm/messages/format.mjs +136 -12
  189. package/dist/esm/messages/format.mjs.map +1 -1
  190. package/dist/esm/messages/prune.mjs +504 -7
  191. package/dist/esm/messages/prune.mjs.map +1 -1
  192. package/dist/esm/run.mjs +141 -1
  193. package/dist/esm/run.mjs.map +1 -1
  194. package/dist/esm/tools/BashExecutor.mjs +227 -0
  195. package/dist/esm/tools/BashExecutor.mjs.map +1 -0
  196. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +288 -0
  197. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -0
  198. package/dist/esm/tools/CodeExecutor.mjs +45 -48
  199. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  200. package/dist/esm/tools/ProgrammaticToolCalling.mjs +17 -12
  201. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  202. package/dist/esm/tools/ReadFile.mjs +39 -0
  203. package/dist/esm/tools/ReadFile.mjs.map +1 -0
  204. package/dist/esm/tools/SkillTool.mjs +46 -0
  205. package/dist/esm/tools/SkillTool.mjs.map +1 -0
  206. package/dist/esm/tools/SubagentTool.mjs +86 -0
  207. package/dist/esm/tools/SubagentTool.mjs.map +1 -0
  208. package/dist/esm/tools/ToolNode.mjs +452 -26
  209. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  210. package/dist/esm/tools/memory/memoryAppendTool.mjs +1 -1
  211. package/dist/esm/tools/memory/memoryAppendTool.mjs.map +1 -1
  212. package/dist/esm/tools/memory/memoryGetTool.mjs +2 -2
  213. package/dist/esm/tools/memory/memoryGetTool.mjs.map +1 -1
  214. package/dist/esm/tools/memory/memorySearchTool.mjs +3 -3
  215. package/dist/esm/tools/memory/memorySearchTool.mjs.map +1 -1
  216. package/dist/esm/tools/memory/shared.mjs +1 -1
  217. package/dist/esm/tools/memory/shared.mjs.map +1 -1
  218. package/dist/esm/tools/search/search.mjs +11 -3
  219. package/dist/esm/tools/search/search.mjs.map +1 -1
  220. package/dist/esm/tools/search/tavily-scraper.mjs +186 -0
  221. package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -0
  222. package/dist/esm/tools/search/tavily-search.mjs +370 -0
  223. package/dist/esm/tools/search/tavily-search.mjs.map +1 -0
  224. package/dist/esm/tools/search/tool.mjs +28 -4
  225. package/dist/esm/tools/search/tool.mjs.map +1 -1
  226. package/dist/esm/tools/search/utils.mjs +10 -3
  227. package/dist/esm/tools/search/utils.mjs.map +1 -1
  228. package/dist/esm/tools/skillCatalog.mjs +82 -0
  229. package/dist/esm/tools/skillCatalog.mjs.map +1 -0
  230. package/dist/esm/tools/subagent/SubagentExecutor.mjs +506 -0
  231. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -0
  232. package/dist/esm/tools/toolOutputReferences.mjs +662 -0
  233. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -0
  234. package/dist/esm/types/agent-cache.mjs +52 -0
  235. package/dist/esm/types/agent-cache.mjs.map +1 -0
  236. package/dist/esm/types/graph.mjs.map +1 -1
  237. package/dist/esm/utils/truncation.mjs +128 -0
  238. package/dist/esm/utils/truncation.mjs.map +1 -0
  239. package/dist/types/agents/AgentContext.d.ts +101 -8
  240. package/dist/types/common/enum.d.ts +39 -12
  241. package/dist/types/common/index.d.ts +0 -1
  242. package/dist/types/graphs/Graph.d.ts +43 -0
  243. package/dist/types/graphs/MultiAgentGraph.d.ts +26 -150
  244. package/dist/types/graphs/index.d.ts +0 -1
  245. package/dist/types/graphs/phases/memoryFlushPhase.d.ts +2 -2
  246. package/dist/types/hooks/HookRegistry.d.ts +56 -0
  247. package/dist/types/hooks/executeHooks.d.ts +79 -0
  248. package/dist/types/hooks/index.d.ts +6 -0
  249. package/dist/types/hooks/matchers.d.ts +95 -0
  250. package/dist/types/hooks/types.d.ts +320 -0
  251. package/dist/types/index.d.ts +9 -9
  252. package/dist/types/langchain/google-common.d.ts +1 -0
  253. package/dist/types/langchain/index.d.ts +8 -0
  254. package/dist/types/langchain/language_models/chat_models.d.ts +1 -0
  255. package/dist/types/langchain/messages/tool.d.ts +1 -0
  256. package/dist/types/langchain/messages.d.ts +2 -0
  257. package/dist/types/langchain/openai.d.ts +1 -0
  258. package/dist/types/langchain/prompts.d.ts +1 -0
  259. package/dist/types/langchain/runnables.d.ts +2 -0
  260. package/dist/types/langchain/tools.d.ts +2 -0
  261. package/dist/types/langchain/utils/env.d.ts +1 -0
  262. package/dist/types/llm/bedrock/cacheSupport.d.ts +35 -0
  263. package/dist/types/llm/bedrock/index.d.ts +54 -1
  264. package/dist/types/llm/openai/index.d.ts +1 -1
  265. package/dist/types/memory/citations.d.ts +4 -4
  266. package/dist/types/memory/constants.d.ts +17 -17
  267. package/dist/types/memory/mmr.d.ts +3 -3
  268. package/dist/types/memory/paths.d.ts +1 -1
  269. package/dist/types/memory/temporalDecay.d.ts +2 -2
  270. package/dist/types/memory/types.d.ts +3 -3
  271. package/dist/types/messages/contextPruning.d.ts +42 -0
  272. package/dist/types/messages/contextPruningSettings.d.ts +44 -0
  273. package/dist/types/messages/format.d.ts +9 -1
  274. package/dist/types/messages/index.d.ts +2 -0
  275. package/dist/types/messages/prune.d.ts +91 -1
  276. package/dist/types/run.d.ts +2 -0
  277. package/dist/types/tools/BashExecutor.d.ts +76 -0
  278. package/dist/types/tools/BashProgrammaticToolCalling.d.ts +72 -0
  279. package/dist/types/tools/CodeExecutor.d.ts +8 -26
  280. package/dist/types/tools/ReadFile.d.ts +28 -0
  281. package/dist/types/tools/SkillTool.d.ts +40 -0
  282. package/dist/types/tools/SubagentTool.d.ts +36 -0
  283. package/dist/types/tools/ToolNode.d.ts +77 -5
  284. package/dist/types/tools/memory/shared.d.ts +1 -1
  285. package/dist/types/tools/search/tavily-scraper.d.ts +19 -0
  286. package/dist/types/tools/search/tavily-search.d.ts +4 -0
  287. package/dist/types/tools/search/types.d.ts +99 -5
  288. package/dist/types/tools/search/utils.d.ts +2 -2
  289. package/dist/types/tools/skillCatalog.d.ts +19 -0
  290. package/dist/types/tools/subagent/SubagentExecutor.d.ts +137 -0
  291. package/dist/types/tools/subagent/index.d.ts +2 -0
  292. package/dist/types/tools/subagent/types.d.ts +84 -0
  293. package/dist/types/tools/toolOutputReferences.d.ts +236 -0
  294. package/dist/types/types/agent-cache.d.ts +71 -0
  295. package/dist/types/types/graph.d.ts +163 -22
  296. package/dist/types/types/index.d.ts +3 -0
  297. package/dist/types/types/messages.d.ts +26 -0
  298. package/dist/types/types/run.d.ts +22 -0
  299. package/dist/types/types/skill.d.ts +9 -0
  300. package/dist/types/types/tools.d.ts +111 -0
  301. package/dist/types/utils/index.d.ts +1 -3
  302. package/dist/types/utils/truncation.d.ts +70 -0
  303. package/package.json +57 -17
  304. package/src/agents/AgentContext.ts +321 -78
  305. package/src/agents/__tests__/AgentContext.cacheTtl.live.test.ts +259 -0
  306. package/src/agents/__tests__/AgentContext.crossAgentTier1.live.test.ts +266 -0
  307. package/src/agents/__tests__/AgentContext.crossUserCache.live.test.ts +342 -0
  308. package/src/agents/__tests__/AgentContext.test.ts +632 -0
  309. package/src/common/__tests__/enum.test.ts +7 -17
  310. package/src/common/enum.ts +43 -12
  311. package/src/common/index.ts +0 -1
  312. package/src/graphs/Graph.ts +222 -2
  313. package/src/graphs/MultiAgentGraph.ts +154 -1466
  314. package/src/graphs/__tests__/MultiAgentGraph.test.ts +91 -0
  315. package/src/graphs/gapFeatures.test.ts +1 -1
  316. package/src/graphs/index.ts +0 -1
  317. package/src/graphs/phases/__tests__/memoryFlushPhase.test.ts +1 -1
  318. package/src/graphs/phases/memoryFlushPhase.ts +2 -2
  319. package/src/hooks/HookRegistry.ts +208 -0
  320. package/src/hooks/__tests__/HookRegistry.test.ts +190 -0
  321. package/src/hooks/__tests__/compactHooks.test.ts +214 -0
  322. package/src/hooks/__tests__/executeHooks.test.ts +1013 -0
  323. package/src/hooks/__tests__/integration.test.ts +337 -0
  324. package/src/hooks/__tests__/matchers.test.ts +238 -0
  325. package/src/hooks/__tests__/toolHooks.test.ts +665 -0
  326. package/src/hooks/executeHooks.ts +375 -0
  327. package/src/hooks/index.ts +57 -0
  328. package/src/hooks/matchers.ts +280 -0
  329. package/src/hooks/types.ts +404 -0
  330. package/src/index.ts +15 -24
  331. package/src/langchain/google-common.ts +1 -0
  332. package/src/langchain/index.ts +8 -0
  333. package/src/langchain/language_models/chat_models.ts +1 -0
  334. package/src/langchain/messages/tool.ts +5 -0
  335. package/src/langchain/messages.ts +21 -0
  336. package/src/langchain/openai.ts +1 -0
  337. package/src/langchain/prompts.ts +1 -0
  338. package/src/langchain/runnables.ts +7 -0
  339. package/src/langchain/tools.ts +8 -0
  340. package/src/langchain/utils/env.ts +1 -0
  341. package/src/llm/anthropic/utils/message_inputs.ts +10 -1
  342. package/src/llm/anthropic/utils/server-tool-inputs.test.ts +436 -0
  343. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +166 -18
  344. package/src/llm/bedrock/cacheSupport.test.ts +99 -0
  345. package/src/llm/bedrock/cacheSupport.ts +53 -0
  346. package/src/llm/bedrock/index.ts +116 -41
  347. package/src/llm/openai/index.ts +2 -2
  348. package/src/llm/openai/utils/index.ts +31 -14
  349. package/src/memory/citations.ts +4 -4
  350. package/src/memory/constants.ts +17 -17
  351. package/src/memory/mmr.ts +3 -3
  352. package/src/memory/paths.ts +1 -1
  353. package/src/memory/recallTracking.ts +3 -3
  354. package/src/memory/temporalDecay.ts +2 -2
  355. package/src/memory/types.ts +3 -3
  356. package/src/messages/__tests__/contextPruning.test.ts +228 -0
  357. package/src/messages/cache.test.ts +62 -24
  358. package/src/messages/cache.ts +112 -0
  359. package/src/messages/contextPruning.ts +191 -0
  360. package/src/messages/contextPruningSettings.ts +90 -0
  361. package/src/messages/ensureThinkingBlock.test.ts +1 -1
  362. package/src/messages/format.ts +164 -12
  363. package/src/messages/formatAgentMessages.skills.test.ts +413 -0
  364. package/src/messages/formatAgentMessages.test.ts +1 -1
  365. package/src/messages/index.ts +2 -0
  366. package/src/messages/prune.ts +661 -4
  367. package/src/run.ts +155 -1
  368. package/src/scripts/multi-agent-chain.ts +2 -2
  369. package/src/scripts/multi-agent-document-review-chain.ts +2 -2
  370. package/src/scripts/multi-agent-hybrid-flow.ts +4 -4
  371. package/src/scripts/multi-agent-parallel.ts +3 -3
  372. package/src/scripts/multi-agent-sequence.ts +3 -3
  373. package/src/scripts/multi-agent-subagent.ts +246 -0
  374. package/src/scripts/multi-agent-supervisor.ts +5 -5
  375. package/src/scripts/poc-multi-agent-comprehensive.ts +8 -8
  376. package/src/scripts/sequential-full-metadata-test.ts +2 -2
  377. package/src/scripts/subagent-event-driven-debug.ts +190 -0
  378. package/src/scripts/subagent-tools-debug.ts +160 -0
  379. package/src/scripts/test-custom-prompt-key.ts +3 -3
  380. package/src/scripts/test-handoff-input.ts +1 -1
  381. package/src/scripts/test-handoff-steering.ts +3 -3
  382. package/src/scripts/test-multi-agent-list-handoff.ts +1 -1
  383. package/src/scripts/test-parallel-agent-labeling.ts +3 -3
  384. package/src/scripts/test-parallel-handoffs.ts +2 -2
  385. package/src/scripts/test-thinking-handoff-bedrock.ts +1 -1
  386. package/src/scripts/test-thinking-handoff.ts +1 -1
  387. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +1 -1
  388. package/src/scripts/test-tool-before-handoff-role-order.ts +1 -1
  389. package/src/scripts/test-tools-before-handoff.ts +1 -1
  390. package/src/specs/agent-handoffs.test.ts +26 -483
  391. package/src/specs/anthropic.simple.test.ts +61 -0
  392. package/src/specs/multi-agent-summarization.test.ts +396 -0
  393. package/src/specs/prune.orphans.test.ts +248 -0
  394. package/src/specs/prune.test.ts +104 -16
  395. package/src/specs/thinking-handoff.test.ts +19 -19
  396. package/src/tools/BashExecutor.ts +281 -0
  397. package/src/tools/BashProgrammaticToolCalling.ts +397 -0
  398. package/src/tools/CodeExecutor.ts +63 -54
  399. package/src/tools/ProgrammaticToolCalling.ts +29 -14
  400. package/src/tools/ReadFile.ts +39 -0
  401. package/src/tools/SkillTool.ts +46 -0
  402. package/src/tools/SubagentTool.ts +100 -0
  403. package/src/tools/ToolNode.ts +548 -26
  404. package/src/tools/__tests__/BashExecutor.test.ts +49 -0
  405. package/src/tools/__tests__/CodeExecutor.test.ts +37 -36
  406. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +60 -0
  407. package/src/tools/__tests__/ReadFile.test.ts +44 -0
  408. package/src/tools/__tests__/SkillTool.test.ts +442 -0
  409. package/src/tools/__tests__/SubagentExecutor.test.ts +1148 -0
  410. package/src/tools/__tests__/SubagentTool.test.ts +149 -0
  411. package/src/tools/__tests__/ToolNode.outputReferences.test.ts +1438 -0
  412. package/src/tools/__tests__/annotateMessagesForLLM.test.ts +479 -0
  413. package/src/tools/__tests__/skillCatalog.test.ts +161 -0
  414. package/src/tools/__tests__/subagentHooks.test.ts +210 -0
  415. package/src/tools/__tests__/toolOutputReferences.test.ts +415 -0
  416. package/src/tools/memory/memoryAppendTool.ts +1 -1
  417. package/src/tools/memory/memoryGetTool.ts +2 -2
  418. package/src/tools/memory/memorySearchTool.ts +3 -3
  419. package/src/tools/memory/shared.ts +1 -1
  420. package/src/tools/search/search.ts +12 -2
  421. package/src/tools/search/tavily-scraper.ts +235 -0
  422. package/src/tools/search/tavily-search.ts +424 -0
  423. package/src/tools/search/tavily.test.ts +965 -0
  424. package/src/tools/search/tool.ts +36 -2
  425. package/src/tools/search/types.ts +133 -8
  426. package/src/tools/search/utils.ts +13 -5
  427. package/src/tools/skillCatalog.ts +126 -0
  428. package/src/tools/subagent/SubagentExecutor.ts +676 -0
  429. package/src/tools/subagent/index.ts +13 -0
  430. package/src/tools/subagent/types.test.ts +70 -0
  431. package/src/tools/subagent/types.ts +115 -0
  432. package/src/tools/toolOutputReferences.ts +825 -0
  433. package/src/types/agent-cache.ts +74 -0
  434. package/src/types/graph.ts +172 -20
  435. package/src/types/index.ts +3 -0
  436. package/src/types/messages.ts +27 -0
  437. package/src/types/run.ts +22 -0
  438. package/src/types/skill.ts +11 -0
  439. package/src/types/tools.ts +118 -0
  440. package/src/utils/__tests__/truncation.test.ts +66 -0
  441. package/src/utils/index.ts +1 -3
  442. package/src/utils/truncation.ts +154 -0
  443. package/dist/cjs/common/spawnPath.cjs +0 -104
  444. package/dist/cjs/common/spawnPath.cjs.map +0 -1
  445. package/dist/cjs/content/ArtifactStore.cjs +0 -579
  446. package/dist/cjs/content/ArtifactStore.cjs.map +0 -1
  447. package/dist/cjs/content/ContentStore.cjs +0 -638
  448. package/dist/cjs/content/ContentStore.cjs.map +0 -1
  449. package/dist/cjs/content/contentAnalyzer.cjs +0 -91
  450. package/dist/cjs/content/contentAnalyzer.cjs.map +0 -1
  451. package/dist/cjs/content/index.cjs +0 -20
  452. package/dist/cjs/content/index.cjs.map +0 -1
  453. package/dist/cjs/content/mcpAutoCache.cjs +0 -115
  454. package/dist/cjs/content/mcpAutoCache.cjs.map +0 -1
  455. package/dist/cjs/graphs/HandoffRegistry.cjs +0 -143
  456. package/dist/cjs/graphs/HandoffRegistry.cjs.map +0 -1
  457. package/dist/cjs/providers/a2a/A2ACapabilityProvider.cjs +0 -288
  458. package/dist/cjs/providers/a2a/A2ACapabilityProvider.cjs.map +0 -1
  459. package/dist/cjs/providers/a2a/client.cjs +0 -92
  460. package/dist/cjs/providers/a2a/client.cjs.map +0 -1
  461. package/dist/cjs/providers/a2a/config.cjs +0 -38
  462. package/dist/cjs/providers/a2a/config.cjs.map +0 -1
  463. package/dist/cjs/providers/capabilityNaming.cjs +0 -43
  464. package/dist/cjs/providers/capabilityNaming.cjs.map +0 -1
  465. package/dist/cjs/providers/mcp/MCPCapabilityProvider.cjs +0 -244
  466. package/dist/cjs/providers/mcp/MCPCapabilityProvider.cjs.map +0 -1
  467. package/dist/cjs/providers/mcp/config.cjs +0 -42
  468. package/dist/cjs/providers/mcp/config.cjs.map +0 -1
  469. package/dist/cjs/providers/mcp/transport.cjs +0 -65
  470. package/dist/cjs/providers/mcp/transport.cjs.map +0 -1
  471. package/dist/cjs/providers/tools-server/ToolsServerCapabilityProvider.cjs +0 -128
  472. package/dist/cjs/providers/tools-server/ToolsServerCapabilityProvider.cjs.map +0 -1
  473. package/dist/cjs/providers/types.cjs +0 -51
  474. package/dist/cjs/providers/types.cjs.map +0 -1
  475. package/dist/cjs/tools/artifacts/schema.cjs +0 -86
  476. package/dist/cjs/tools/artifacts/schema.cjs.map +0 -1
  477. package/dist/cjs/tools/artifacts/tool.cjs +0 -219
  478. package/dist/cjs/tools/artifacts/tool.cjs.map +0 -1
  479. package/dist/cjs/tools/fileSearch/formatter.cjs +0 -93
  480. package/dist/cjs/tools/fileSearch/formatter.cjs.map +0 -1
  481. package/dist/cjs/tools/fileSearch/ragClient.cjs +0 -102
  482. package/dist/cjs/tools/fileSearch/ragClient.cjs.map +0 -1
  483. package/dist/cjs/tools/fileSearch/schema.cjs +0 -18
  484. package/dist/cjs/tools/fileSearch/schema.cjs.map +0 -1
  485. package/dist/cjs/tools/fileSearch/tool.cjs +0 -155
  486. package/dist/cjs/tools/fileSearch/tool.cjs.map +0 -1
  487. package/dist/cjs/tools/proxyTool.cjs +0 -102
  488. package/dist/cjs/tools/proxyTool.cjs.map +0 -1
  489. package/dist/cjs/utils/childAgentContext.cjs +0 -242
  490. package/dist/cjs/utils/childAgentContext.cjs.map +0 -1
  491. package/dist/cjs/utils/credentials.cjs +0 -142
  492. package/dist/cjs/utils/credentials.cjs.map +0 -1
  493. package/dist/cjs/utils/httpClient.cjs +0 -74
  494. package/dist/cjs/utils/httpClient.cjs.map +0 -1
  495. package/dist/cjs/utils/toolManifest.cjs +0 -100
  496. package/dist/cjs/utils/toolManifest.cjs.map +0 -1
  497. package/dist/esm/common/spawnPath.mjs +0 -95
  498. package/dist/esm/common/spawnPath.mjs.map +0 -1
  499. package/dist/esm/content/ArtifactStore.mjs +0 -576
  500. package/dist/esm/content/ArtifactStore.mjs.map +0 -1
  501. package/dist/esm/content/ContentStore.mjs +0 -635
  502. package/dist/esm/content/ContentStore.mjs.map +0 -1
  503. package/dist/esm/content/contentAnalyzer.mjs +0 -87
  504. package/dist/esm/content/contentAnalyzer.mjs.map +0 -1
  505. package/dist/esm/content/index.mjs +0 -5
  506. package/dist/esm/content/mcpAutoCache.mjs +0 -111
  507. package/dist/esm/content/mcpAutoCache.mjs.map +0 -1
  508. package/dist/esm/graphs/HandoffRegistry.mjs +0 -141
  509. package/dist/esm/graphs/HandoffRegistry.mjs.map +0 -1
  510. package/dist/esm/providers/a2a/A2ACapabilityProvider.mjs +0 -281
  511. package/dist/esm/providers/a2a/A2ACapabilityProvider.mjs.map +0 -1
  512. package/dist/esm/providers/a2a/client.mjs +0 -88
  513. package/dist/esm/providers/a2a/client.mjs.map +0 -1
  514. package/dist/esm/providers/a2a/config.mjs +0 -35
  515. package/dist/esm/providers/a2a/config.mjs.map +0 -1
  516. package/dist/esm/providers/capabilityNaming.mjs +0 -39
  517. package/dist/esm/providers/capabilityNaming.mjs.map +0 -1
  518. package/dist/esm/providers/mcp/MCPCapabilityProvider.mjs +0 -240
  519. package/dist/esm/providers/mcp/MCPCapabilityProvider.mjs.map +0 -1
  520. package/dist/esm/providers/mcp/config.mjs +0 -39
  521. package/dist/esm/providers/mcp/config.mjs.map +0 -1
  522. package/dist/esm/providers/mcp/transport.mjs +0 -63
  523. package/dist/esm/providers/mcp/transport.mjs.map +0 -1
  524. package/dist/esm/providers/tools-server/ToolsServerCapabilityProvider.mjs +0 -126
  525. package/dist/esm/providers/tools-server/ToolsServerCapabilityProvider.mjs.map +0 -1
  526. package/dist/esm/providers/types.mjs +0 -51
  527. package/dist/esm/providers/types.mjs.map +0 -1
  528. package/dist/esm/tools/artifacts/schema.mjs +0 -79
  529. package/dist/esm/tools/artifacts/schema.mjs.map +0 -1
  530. package/dist/esm/tools/artifacts/tool.mjs +0 -213
  531. package/dist/esm/tools/artifacts/tool.mjs.map +0 -1
  532. package/dist/esm/tools/fileSearch/formatter.mjs +0 -90
  533. package/dist/esm/tools/fileSearch/formatter.mjs.map +0 -1
  534. package/dist/esm/tools/fileSearch/ragClient.mjs +0 -98
  535. package/dist/esm/tools/fileSearch/ragClient.mjs.map +0 -1
  536. package/dist/esm/tools/fileSearch/schema.mjs +0 -15
  537. package/dist/esm/tools/fileSearch/schema.mjs.map +0 -1
  538. package/dist/esm/tools/fileSearch/tool.mjs +0 -152
  539. package/dist/esm/tools/fileSearch/tool.mjs.map +0 -1
  540. package/dist/esm/tools/proxyTool.mjs +0 -100
  541. package/dist/esm/tools/proxyTool.mjs.map +0 -1
  542. package/dist/esm/utils/childAgentContext.mjs +0 -237
  543. package/dist/esm/utils/childAgentContext.mjs.map +0 -1
  544. package/dist/esm/utils/credentials.mjs +0 -135
  545. package/dist/esm/utils/credentials.mjs.map +0 -1
  546. package/dist/esm/utils/httpClient.mjs +0 -70
  547. package/dist/esm/utils/httpClient.mjs.map +0 -1
  548. package/dist/esm/utils/toolManifest.mjs +0 -96
  549. package/dist/esm/utils/toolManifest.mjs.map +0 -1
  550. package/dist/types/common/spawnPath.d.ts +0 -59
  551. package/dist/types/content/ArtifactStore.d.ts +0 -223
  552. package/dist/types/content/ContentStore.d.ts +0 -140
  553. package/dist/types/content/contentAnalyzer.d.ts +0 -38
  554. package/dist/types/content/index.d.ts +0 -24
  555. package/dist/types/content/mcpAutoCache.d.ts +0 -89
  556. package/dist/types/content/types.d.ts +0 -75
  557. package/dist/types/graphs/HandoffRegistry.d.ts +0 -97
  558. package/dist/types/providers/a2a/A2ACapabilityProvider.d.ts +0 -89
  559. package/dist/types/providers/a2a/client.d.ts +0 -47
  560. package/dist/types/providers/a2a/config.d.ts +0 -18
  561. package/dist/types/providers/a2a/index.d.ts +0 -6
  562. package/dist/types/providers/a2a/types.d.ts +0 -173
  563. package/dist/types/providers/capabilityNaming.d.ts +0 -25
  564. package/dist/types/providers/index.d.ts +0 -12
  565. package/dist/types/providers/mcp/MCPCapabilityProvider.d.ts +0 -54
  566. package/dist/types/providers/mcp/config.d.ts +0 -20
  567. package/dist/types/providers/mcp/index.d.ts +0 -5
  568. package/dist/types/providers/mcp/transport.d.ts +0 -18
  569. package/dist/types/providers/mcp/types.d.ts +0 -112
  570. package/dist/types/providers/tools-server/ToolsServerCapabilityProvider.d.ts +0 -59
  571. package/dist/types/providers/tools-server/index.d.ts +0 -1
  572. package/dist/types/providers/types.d.ts +0 -184
  573. package/dist/types/tools/artifacts/index.d.ts +0 -3
  574. package/dist/types/tools/artifacts/schema.d.ts +0 -63
  575. package/dist/types/tools/artifacts/tool.d.ts +0 -16
  576. package/dist/types/tools/artifacts/types.d.ts +0 -127
  577. package/dist/types/tools/fileSearch/formatter.d.ts +0 -25
  578. package/dist/types/tools/fileSearch/index.d.ts +0 -5
  579. package/dist/types/tools/fileSearch/ragClient.d.ts +0 -32
  580. package/dist/types/tools/fileSearch/schema.d.ts +0 -13
  581. package/dist/types/tools/fileSearch/tool.d.ts +0 -18
  582. package/dist/types/tools/fileSearch/types.d.ts +0 -139
  583. package/dist/types/tools/proxyTool.d.ts +0 -62
  584. package/dist/types/tools/search/test.d.ts +0 -1
  585. package/dist/types/utils/childAgentContext.d.ts +0 -99
  586. package/dist/types/utils/credentials.d.ts +0 -77
  587. package/dist/types/utils/httpClient.d.ts +0 -46
  588. package/dist/types/utils/toolManifest.d.ts +0 -49
  589. package/src/common/__tests__/spawnPath.test.ts +0 -110
  590. package/src/common/spawnPath.ts +0 -101
  591. package/src/content/ArtifactStore.ts +0 -782
  592. package/src/content/ContentStore.ts +0 -753
  593. package/src/content/contentAnalyzer.ts +0 -105
  594. package/src/content/index.ts +0 -51
  595. package/src/content/mcpAutoCache.ts +0 -185
  596. package/src/content/types.ts +0 -82
  597. package/src/graphs/HandoffRegistry.ts +0 -199
  598. package/src/graphs/__tests__/HandoffRegistry.test.ts +0 -410
  599. package/src/graphs/__tests__/multi-agent-delegate.test.ts +0 -458
  600. package/src/graphs/__tests__/multi-agent-edges.test.ts +0 -276
  601. package/src/graphs/__tests__/multi-agent-nested-subgraph.test.ts +0 -221
  602. package/src/graphs/handoffValidation.test.ts +0 -353
  603. package/src/providers/__tests__/ToolsServerCapabilityProvider.integration.spec.ts +0 -79
  604. package/src/providers/__tests__/ToolsServerCapabilityProvider.test.ts +0 -271
  605. package/src/providers/__tests__/types.test.ts +0 -64
  606. package/src/providers/a2a/A2ACapabilityProvider.ts +0 -384
  607. package/src/providers/a2a/__tests__/A2ACapabilityProvider.integration.spec.ts +0 -345
  608. package/src/providers/a2a/__tests__/A2ACapabilityProvider.test.ts +0 -460
  609. package/src/providers/a2a/client.ts +0 -115
  610. package/src/providers/a2a/config.ts +0 -40
  611. package/src/providers/a2a/index.ts +0 -29
  612. package/src/providers/a2a/types.ts +0 -191
  613. package/src/providers/capabilityNaming.ts +0 -42
  614. package/src/providers/index.ts +0 -68
  615. package/src/providers/mcp/MCPCapabilityProvider.ts +0 -345
  616. package/src/providers/mcp/__tests__/MCPCapabilityProvider.integration.spec.ts +0 -386
  617. package/src/providers/mcp/__tests__/MCPCapabilityProvider.test.ts +0 -371
  618. package/src/providers/mcp/config.ts +0 -45
  619. package/src/providers/mcp/index.ts +0 -21
  620. package/src/providers/mcp/transport.ts +0 -76
  621. package/src/providers/mcp/types.ts +0 -139
  622. package/src/providers/tools-server/ToolsServerCapabilityProvider.ts +0 -249
  623. package/src/providers/tools-server/index.ts +0 -1
  624. package/src/providers/types.ts +0 -204
  625. package/src/scripts/test-bedrock-handoff-autonomous.ts +0 -267
  626. package/src/scripts/test-handoff-preamble.ts +0 -278
  627. package/src/specs/agent-handoffs-bedrock.integration.test.ts +0 -415
  628. package/src/tools/artifacts/__tests__/tool.test.ts +0 -259
  629. package/src/tools/artifacts/index.ts +0 -33
  630. package/src/tools/artifacts/schema.ts +0 -99
  631. package/src/tools/artifacts/tool.ts +0 -289
  632. package/src/tools/artifacts/types.ts +0 -162
  633. package/src/tools/fileSearch/__tests__/tool.test.ts +0 -261
  634. package/src/tools/fileSearch/formatter.ts +0 -129
  635. package/src/tools/fileSearch/index.ts +0 -23
  636. package/src/tools/fileSearch/ragClient.ts +0 -137
  637. package/src/tools/fileSearch/schema.ts +0 -19
  638. package/src/tools/fileSearch/tool.ts +0 -207
  639. package/src/tools/fileSearch/types.ts +0 -149
  640. package/src/tools/proxyTool.ts +0 -166
  641. package/src/tools/search/output.md +0 -2775
  642. package/src/tools/search/test.html +0 -884
  643. package/src/tools/search/test.md +0 -643
  644. package/src/tools/search/test.ts +0 -159
  645. package/src/utils/__tests__/childAgentContext.test.ts +0 -217
  646. package/src/utils/__tests__/credentials.test.ts +0 -130
  647. package/src/utils/__tests__/httpClient.test.ts +0 -75
  648. package/src/utils/__tests__/toolManifest.test.ts +0 -116
  649. package/src/utils/childAgentContext.ts +0 -259
  650. package/src/utils/credentials.ts +0 -157
  651. package/src/utils/httpClient.ts +0 -92
  652. package/src/utils/toolManifest.ts +0 -109
  653. /package/dist/esm/{content → langchain}/index.mjs.map +0 -0
@@ -0,0 +1,665 @@
1
+ // src/hooks/__tests__/toolHooks.test.ts
2
+ import { ToolCall } from '@langchain/core/messages/tool';
3
+ import { HumanMessage } from '@langchain/core/messages';
4
+ import { HookRegistry } from '../HookRegistry';
5
+ import { Run } from '@/run';
6
+ import { GraphEvents, Providers } from '@/common';
7
+ import { ToolEndHandler, ModelEndHandler } from '@/events';
8
+ import type * as t from '@/types';
9
+ import type {
10
+ HookCallback,
11
+ PreToolUseHookOutput,
12
+ PostToolUseHookOutput,
13
+ PostToolUseFailureHookOutput,
14
+ PermissionDeniedHookInput,
15
+ PermissionDeniedHookOutput,
16
+ PreToolUseHookInput,
17
+ PostToolUseHookInput,
18
+ PostToolUseFailureHookInput,
19
+ } from '../types';
20
+
21
+ const llmConfig: t.LLMConfig = {
22
+ provider: Providers.OPENAI,
23
+ streaming: true,
24
+ streamUsage: false,
25
+ };
26
+
27
+ const callerConfig = {
28
+ configurable: { thread_id: 'test-thread' },
29
+ streamMode: 'values' as const,
30
+ version: 'v2' as const,
31
+ };
32
+
33
+ const echoToolDef: t.LCTool = {
34
+ name: 'echo',
35
+ description: 'Echoes input',
36
+ parameters: {
37
+ type: 'object' as const,
38
+ properties: { text: { type: 'string' } },
39
+ required: ['text'],
40
+ },
41
+ };
42
+
43
+ let callCounter = 0;
44
+
45
+ function makeToolCall(text = 'hello', name = 'echo'): ToolCall {
46
+ return {
47
+ name,
48
+ args: { text },
49
+ id: `call_${++callCounter}`,
50
+ type: 'tool_call',
51
+ };
52
+ }
53
+
54
+ function createToolExecuteHandler(): t.EventHandler {
55
+ return {
56
+ handle: async (_event: string, rawData: unknown): Promise<void> => {
57
+ const data = rawData as t.ToolExecuteBatchRequest;
58
+ const results: t.ToolExecuteResult[] = data.toolCalls.map(
59
+ (tc: t.ToolCallRequest) => ({
60
+ toolCallId: tc.id,
61
+ content: `echo: ${(tc.args as Record<string, string>).text}`,
62
+ status: 'success' as const,
63
+ })
64
+ );
65
+ data.resolve(results);
66
+ },
67
+ };
68
+ }
69
+
70
+ function createErrorToolExecuteHandler(): t.EventHandler {
71
+ return {
72
+ handle: async (_event: string, rawData: unknown): Promise<void> => {
73
+ const data = rawData as t.ToolExecuteBatchRequest;
74
+ const results: t.ToolExecuteResult[] = data.toolCalls.map(
75
+ (tc: t.ToolCallRequest) => ({
76
+ toolCallId: tc.id,
77
+ content: '',
78
+ status: 'error' as const,
79
+ errorMessage: `tool ${tc.name} failed deliberately`,
80
+ })
81
+ );
82
+ data.resolve(results);
83
+ },
84
+ };
85
+ }
86
+
87
+ async function createEventDrivenRun(
88
+ hooks: HookRegistry,
89
+ toolHandler: t.EventHandler = createToolExecuteHandler(),
90
+ runId = 'tool-hook-run'
91
+ ): Promise<Run<t.IState>> {
92
+ const customHandlers: Record<string, t.EventHandler> = {
93
+ [GraphEvents.ON_TOOL_EXECUTE]: toolHandler,
94
+ [GraphEvents.TOOL_END]: new ToolEndHandler(),
95
+ [GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
96
+ };
97
+
98
+ return Run.create<t.IState>({
99
+ runId,
100
+ graphConfig: {
101
+ type: 'standard',
102
+ llmConfig,
103
+ toolDefinitions: [echoToolDef],
104
+ instructions: 'Use the echo tool when asked.',
105
+ },
106
+ returnContent: true,
107
+ skipCleanup: true,
108
+ customHandlers,
109
+ hooks,
110
+ });
111
+ }
112
+
113
+ describe('Tool-level hook integration (event-driven mode)', () => {
114
+ beforeEach(() => {
115
+ callCounter = 0;
116
+ });
117
+ jest.setTimeout(15000);
118
+
119
+ describe('PreToolUse', () => {
120
+ it('fires with toolName, toolInput, and toolUseId', async () => {
121
+ const registry = new HookRegistry();
122
+ let captured: PreToolUseHookInput | undefined;
123
+ const hook: HookCallback<'PreToolUse'> = async (
124
+ input
125
+ ): Promise<PreToolUseHookOutput> => {
126
+ captured = input;
127
+ return {};
128
+ };
129
+ registry.register('PreToolUse', { hooks: [hook] });
130
+
131
+ const tc = makeToolCall('world');
132
+ const run = await createEventDrivenRun(registry);
133
+ run.Graph!.overrideTestModel(['calling echo'], 5, [tc]);
134
+ await run.processStream(
135
+ { messages: [new HumanMessage('echo world')] },
136
+ callerConfig
137
+ );
138
+
139
+ expect(captured).toBeDefined();
140
+ expect(captured!.hook_event_name).toBe('PreToolUse');
141
+ expect(captured!.toolName).toBe('echo');
142
+ expect(captured!.toolInput).toEqual({ text: 'world' });
143
+ expect(captured!.toolUseId).toBe(tc.id);
144
+ });
145
+
146
+ it('deny blocks tool execution and produces error ToolMessage', async () => {
147
+ const registry = new HookRegistry();
148
+ let toolExecuted = false;
149
+ const denyHook: HookCallback<
150
+ 'PreToolUse'
151
+ > = async (): Promise<PreToolUseHookOutput> => ({
152
+ decision: 'deny',
153
+ reason: 'not allowed',
154
+ });
155
+ registry.register('PreToolUse', {
156
+ pattern: '^echo$',
157
+ hooks: [denyHook],
158
+ });
159
+
160
+ const spyHandler: t.EventHandler = {
161
+ handle: async (_event: string, rawData: unknown): Promise<void> => {
162
+ const data = rawData as t.ToolExecuteBatchRequest;
163
+ toolExecuted = true;
164
+ data.resolve(
165
+ data.toolCalls.map((tc: t.ToolCallRequest) => ({
166
+ toolCallId: tc.id,
167
+ content: 'should not reach',
168
+ status: 'success' as const,
169
+ }))
170
+ );
171
+ },
172
+ };
173
+
174
+ const run = await createEventDrivenRun(registry, spyHandler);
175
+ run.Graph!.overrideTestModel(['calling echo'], 5, [makeToolCall()]);
176
+ await run.processStream(
177
+ { messages: [new HumanMessage('echo hello')] },
178
+ callerConfig
179
+ );
180
+
181
+ expect(toolExecuted).toBe(false);
182
+ });
183
+
184
+ it('deny dispatches ON_RUN_STEP_COMPLETED for the blocked call', async () => {
185
+ const registry = new HookRegistry();
186
+ const denyHook: HookCallback<
187
+ 'PreToolUse'
188
+ > = async (): Promise<PreToolUseHookOutput> => ({
189
+ decision: 'deny',
190
+ reason: 'not allowed',
191
+ });
192
+ registry.register('PreToolUse', {
193
+ pattern: '^echo$',
194
+ hooks: [denyHook],
195
+ });
196
+
197
+ let stepCompletedData: t.ToolCompleteEvent | undefined;
198
+ const stepHandler: t.EventHandler = {
199
+ handle: async (_event: string, rawData: unknown): Promise<void> => {
200
+ const data = rawData as { result: t.ToolCompleteEvent };
201
+ stepCompletedData = data.result;
202
+ },
203
+ };
204
+
205
+ const toolHandler = createToolExecuteHandler();
206
+ const customHandlers: Record<string, t.EventHandler> = {
207
+ [GraphEvents.ON_TOOL_EXECUTE]: toolHandler,
208
+ [GraphEvents.TOOL_END]: new ToolEndHandler(),
209
+ [GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
210
+ [GraphEvents.ON_RUN_STEP_COMPLETED]: stepHandler,
211
+ };
212
+
213
+ const tc = makeToolCall('hello');
214
+ const run = await Run.create<t.IState>({
215
+ runId: 'deny-step-run',
216
+ graphConfig: {
217
+ type: 'standard',
218
+ llmConfig,
219
+ toolDefinitions: [echoToolDef],
220
+ instructions: 'Use the echo tool when asked.',
221
+ },
222
+ returnContent: true,
223
+ skipCleanup: true,
224
+ customHandlers,
225
+ hooks: registry,
226
+ });
227
+
228
+ run.Graph!.overrideTestModel(['calling echo'], 5, [tc]);
229
+ await run.processStream(
230
+ { messages: [new HumanMessage('echo hello')] },
231
+ callerConfig
232
+ );
233
+
234
+ expect(stepCompletedData).toBeDefined();
235
+ expect(stepCompletedData!.type).toBe('tool_call');
236
+ expect(stepCompletedData!.tool_call.name).toBe('echo');
237
+ expect(stepCompletedData!.tool_call.id).toBe(tc.id);
238
+ expect(stepCompletedData!.tool_call.output).toContain('Blocked:');
239
+ });
240
+
241
+ it('ask blocks tool execution in v1 (same as deny)', async () => {
242
+ const registry = new HookRegistry();
243
+ let toolExecuted = false;
244
+ const askHook: HookCallback<
245
+ 'PreToolUse'
246
+ > = async (): Promise<PreToolUseHookOutput> => ({
247
+ decision: 'ask',
248
+ reason: 'needs confirmation',
249
+ });
250
+ registry.register('PreToolUse', { hooks: [askHook] });
251
+
252
+ const spyHandler: t.EventHandler = {
253
+ handle: async (_event: string, rawData: unknown): Promise<void> => {
254
+ const data = rawData as t.ToolExecuteBatchRequest;
255
+ toolExecuted = true;
256
+ data.resolve(
257
+ data.toolCalls.map((tc: t.ToolCallRequest) => ({
258
+ toolCallId: tc.id,
259
+ content: 'x',
260
+ status: 'success' as const,
261
+ }))
262
+ );
263
+ },
264
+ };
265
+
266
+ const run = await createEventDrivenRun(registry, spyHandler);
267
+ run.Graph!.overrideTestModel(['calling echo'], 5, [makeToolCall()]);
268
+ await run.processStream(
269
+ { messages: [new HumanMessage('echo hello')] },
270
+ callerConfig
271
+ );
272
+
273
+ expect(toolExecuted).toBe(false);
274
+ });
275
+
276
+ it('updatedInput rewrites tool args before dispatch', async () => {
277
+ const registry = new HookRegistry();
278
+ let receivedArgs: Record<string, unknown> | undefined;
279
+ const rewriteHook: HookCallback<
280
+ 'PreToolUse'
281
+ > = async (): Promise<PreToolUseHookOutput> => ({
282
+ updatedInput: { text: 'sanitized' },
283
+ });
284
+ registry.register('PreToolUse', { hooks: [rewriteHook] });
285
+
286
+ const captureHandler: t.EventHandler = {
287
+ handle: async (_event: string, rawData: unknown): Promise<void> => {
288
+ const data = rawData as t.ToolExecuteBatchRequest;
289
+ receivedArgs = data.toolCalls[0]?.args;
290
+ data.resolve(
291
+ data.toolCalls.map((tc: t.ToolCallRequest) => ({
292
+ toolCallId: tc.id,
293
+ content: `echo: ${(tc.args as Record<string, string>).text}`,
294
+ status: 'success' as const,
295
+ }))
296
+ );
297
+ },
298
+ };
299
+
300
+ const run = await createEventDrivenRun(registry, captureHandler);
301
+ run.Graph!.overrideTestModel(['calling echo'], 5, [
302
+ makeToolCall('dangerous'),
303
+ ]);
304
+ await run.processStream(
305
+ { messages: [new HumanMessage('echo')] },
306
+ callerConfig
307
+ );
308
+
309
+ expect(receivedArgs).toEqual({ text: 'sanitized' });
310
+ });
311
+
312
+ it('hook errors are non-fatal — tool still executes', async () => {
313
+ const registry = new HookRegistry();
314
+ let toolExecuted = false;
315
+ const throwingHook: HookCallback<
316
+ 'PreToolUse'
317
+ > = async (): Promise<PreToolUseHookOutput> => {
318
+ throw new Error('hook crash');
319
+ };
320
+ registry.register('PreToolUse', { hooks: [throwingHook] });
321
+
322
+ const spyHandler: t.EventHandler = {
323
+ handle: async (_event: string, rawData: unknown): Promise<void> => {
324
+ const data = rawData as t.ToolExecuteBatchRequest;
325
+ toolExecuted = true;
326
+ data.resolve(
327
+ data.toolCalls.map((tc: t.ToolCallRequest) => ({
328
+ toolCallId: tc.id,
329
+ content: 'ok',
330
+ status: 'success' as const,
331
+ }))
332
+ );
333
+ },
334
+ };
335
+
336
+ const run = await createEventDrivenRun(registry, spyHandler);
337
+ run.Graph!.overrideTestModel(['calling echo'], 5, [makeToolCall()]);
338
+ await run.processStream(
339
+ { messages: [new HumanMessage('echo')] },
340
+ callerConfig
341
+ );
342
+
343
+ expect(toolExecuted).toBe(true);
344
+ });
345
+ });
346
+
347
+ describe('PermissionDenied', () => {
348
+ it('fires after PreToolUse deny with the reason', async () => {
349
+ const registry = new HookRegistry();
350
+ let pdResolve: () => void;
351
+ const pdDone = new Promise<void>((r) => {
352
+ pdResolve = r;
353
+ });
354
+ let captured: PermissionDeniedHookInput | undefined;
355
+ const denyHook: HookCallback<
356
+ 'PreToolUse'
357
+ > = async (): Promise<PreToolUseHookOutput> => ({
358
+ decision: 'deny',
359
+ reason: 'security policy',
360
+ });
361
+ const pdHook: HookCallback<'PermissionDenied'> = async (
362
+ input
363
+ ): Promise<PermissionDeniedHookOutput> => {
364
+ captured = input;
365
+ pdResolve();
366
+ return {};
367
+ };
368
+ registry.register('PreToolUse', { hooks: [denyHook] });
369
+ registry.register('PermissionDenied', { hooks: [pdHook] });
370
+
371
+ const run = await createEventDrivenRun(registry);
372
+ run.Graph!.overrideTestModel(['calling echo'], 5, [makeToolCall()]);
373
+ await run.processStream(
374
+ { messages: [new HumanMessage('echo')] },
375
+ callerConfig
376
+ );
377
+
378
+ await pdDone;
379
+ expect(captured).toBeDefined();
380
+ expect(captured!.reason).toBe('security policy');
381
+ expect(captured!.toolName).toBe('echo');
382
+ });
383
+ });
384
+
385
+ describe('PostToolUse', () => {
386
+ it('fires after successful tool execution with output', async () => {
387
+ const registry = new HookRegistry();
388
+ let captured: PostToolUseHookInput | undefined;
389
+ const hook: HookCallback<'PostToolUse'> = async (
390
+ input
391
+ ): Promise<PostToolUseHookOutput> => {
392
+ captured = input;
393
+ return {};
394
+ };
395
+ registry.register('PostToolUse', { hooks: [hook] });
396
+
397
+ const run = await createEventDrivenRun(registry);
398
+ run.Graph!.overrideTestModel(['calling echo'], 5, [makeToolCall('hi')]);
399
+ await run.processStream(
400
+ { messages: [new HumanMessage('echo hi')] },
401
+ callerConfig
402
+ );
403
+
404
+ expect(captured).toBeDefined();
405
+ expect(captured!.hook_event_name).toBe('PostToolUse');
406
+ expect(captured!.toolName).toBe('echo');
407
+ expect(captured!.toolOutput).toBe('echo: hi');
408
+ });
409
+
410
+ it('updatedOutput replaces the ToolMessage content', async () => {
411
+ const registry = new HookRegistry();
412
+ const replaceHook: HookCallback<
413
+ 'PostToolUse'
414
+ > = async (): Promise<PostToolUseHookOutput> => ({
415
+ updatedOutput: 'REDACTED',
416
+ });
417
+ registry.register('PostToolUse', { hooks: [replaceHook] });
418
+
419
+ let resolvedContent: string | undefined;
420
+ const captureHandler: t.EventHandler = {
421
+ handle: async (_event: string, rawData: unknown): Promise<void> => {
422
+ const data = rawData as t.ToolExecuteBatchRequest;
423
+ const results = data.toolCalls.map(
424
+ (tc: t.ToolCallRequest): t.ToolExecuteResult => ({
425
+ toolCallId: tc.id,
426
+ content: 'original secret output',
427
+ status: 'success' as const,
428
+ })
429
+ );
430
+ data.resolve(results);
431
+ },
432
+ };
433
+
434
+ const run = await createEventDrivenRun(registry, captureHandler);
435
+ run.Graph!.overrideTestModel(['calling echo'], 5, [makeToolCall()]);
436
+ await run.processStream(
437
+ { messages: [new HumanMessage('echo')] },
438
+ callerConfig
439
+ );
440
+
441
+ const messages = run.Graph!.getRunMessages() ?? [];
442
+ const toolMsg = messages.find((m) => m.getType() === 'tool');
443
+ expect(toolMsg).toBeDefined();
444
+ if (toolMsg != null) {
445
+ resolvedContent =
446
+ typeof toolMsg.content === 'string'
447
+ ? toolMsg.content
448
+ : JSON.stringify(toolMsg.content);
449
+ }
450
+
451
+ expect(resolvedContent).toBe('REDACTED');
452
+ });
453
+ });
454
+
455
+ describe('PostToolUseFailure', () => {
456
+ it('fires when tool execution returns an error', async () => {
457
+ const registry = new HookRegistry();
458
+ let captured: PostToolUseFailureHookInput | undefined;
459
+ const hook: HookCallback<'PostToolUseFailure'> = async (
460
+ input
461
+ ): Promise<PostToolUseFailureHookOutput> => {
462
+ captured = input;
463
+ return {};
464
+ };
465
+ registry.register('PostToolUseFailure', { hooks: [hook] });
466
+
467
+ const run = await createEventDrivenRun(
468
+ registry,
469
+ createErrorToolExecuteHandler()
470
+ );
471
+ run.Graph!.overrideTestModel(['calling echo'], 5, [makeToolCall()]);
472
+ await run.processStream(
473
+ { messages: [new HumanMessage('echo')] },
474
+ callerConfig
475
+ );
476
+
477
+ expect(captured).toBeDefined();
478
+ expect(captured!.hook_event_name).toBe('PostToolUseFailure');
479
+ expect(captured!.toolName).toBe('echo');
480
+ expect(captured!.error).toContain('failed deliberately');
481
+ });
482
+ });
483
+
484
+ describe('multi-call batch', () => {
485
+ const mathToolDef: t.LCTool = {
486
+ name: 'math',
487
+ description: 'Does math',
488
+ parameters: {
489
+ type: 'object' as const,
490
+ properties: { expr: { type: 'string' } },
491
+ required: ['expr'],
492
+ },
493
+ };
494
+
495
+ function createMultiToolRun(
496
+ hooks: HookRegistry,
497
+ runId = 'multi-run'
498
+ ): Promise<Run<t.IState>> {
499
+ const handler: t.EventHandler = {
500
+ handle: async (_event: string, rawData: unknown): Promise<void> => {
501
+ const data = rawData as t.ToolExecuteBatchRequest;
502
+ data.resolve(
503
+ data.toolCalls.map(
504
+ (tc: t.ToolCallRequest): t.ToolExecuteResult => ({
505
+ toolCallId: tc.id,
506
+ content: `${tc.name}: ok`,
507
+ status: 'success' as const,
508
+ })
509
+ )
510
+ );
511
+ },
512
+ };
513
+ return Run.create<t.IState>({
514
+ runId,
515
+ graphConfig: {
516
+ type: 'standard',
517
+ llmConfig,
518
+ toolDefinitions: [echoToolDef, mathToolDef],
519
+ instructions: 'Use tools.',
520
+ },
521
+ returnContent: true,
522
+ skipCleanup: true,
523
+ customHandlers: {
524
+ [GraphEvents.ON_TOOL_EXECUTE]: handler,
525
+ [GraphEvents.TOOL_END]: new ToolEndHandler(),
526
+ [GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
527
+ },
528
+ hooks,
529
+ });
530
+ }
531
+
532
+ it('partial deny: denied call produces error, approved call executes, order preserved', async () => {
533
+ const registry = new HookRegistry();
534
+ const denyEcho: HookCallback<'PreToolUse'> = async (
535
+ input
536
+ ): Promise<PreToolUseHookOutput> =>
537
+ input.toolName === 'echo'
538
+ ? { decision: 'deny', reason: 'echo blocked' }
539
+ : {};
540
+ registry.register('PreToolUse', { hooks: [denyEcho] });
541
+
542
+ const echoCall = makeToolCall('hi', 'echo');
543
+ const mathCall = makeToolCall('1+1', 'math');
544
+ const run = await createMultiToolRun(registry);
545
+ run.Graph!.overrideTestModel(['calling tools'], 5, [echoCall, mathCall]);
546
+ await run.processStream(
547
+ { messages: [new HumanMessage('do both')] },
548
+ callerConfig
549
+ );
550
+
551
+ const messages = run.Graph!.getRunMessages() ?? [];
552
+ const toolMsgs = messages.filter((m) => m.getType() === 'tool');
553
+
554
+ expect(toolMsgs).toHaveLength(2);
555
+ const first = toolMsgs[0];
556
+ const second = toolMsgs[1];
557
+ expect(first.content).toContain('Blocked');
558
+ expect(second.content).toContain('math: ok');
559
+ });
560
+
561
+ it('all denied: no ON_TOOL_EXECUTE dispatch, all error messages', async () => {
562
+ const registry = new HookRegistry();
563
+ let handlerCalled = false;
564
+ const denyAll: HookCallback<
565
+ 'PreToolUse'
566
+ > = async (): Promise<PreToolUseHookOutput> => ({
567
+ decision: 'deny',
568
+ reason: 'all blocked',
569
+ });
570
+ registry.register('PreToolUse', { hooks: [denyAll] });
571
+
572
+ const handler: t.EventHandler = {
573
+ handle: async (_event: string, rawData: unknown): Promise<void> => {
574
+ handlerCalled = true;
575
+ const data = rawData as t.ToolExecuteBatchRequest;
576
+ data.resolve([]);
577
+ },
578
+ };
579
+
580
+ const run = await Run.create<t.IState>({
581
+ runId: 'all-denied-run',
582
+ graphConfig: {
583
+ type: 'standard',
584
+ llmConfig,
585
+ toolDefinitions: [echoToolDef, mathToolDef],
586
+ instructions: 'Use tools.',
587
+ },
588
+ returnContent: true,
589
+ skipCleanup: true,
590
+ customHandlers: {
591
+ [GraphEvents.ON_TOOL_EXECUTE]: handler,
592
+ [GraphEvents.TOOL_END]: new ToolEndHandler(),
593
+ [GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
594
+ },
595
+ hooks: registry,
596
+ });
597
+ run.Graph!.overrideTestModel(['calling tools'], 5, [
598
+ makeToolCall('a', 'echo'),
599
+ makeToolCall('b', 'math'),
600
+ ]);
601
+ await run.processStream(
602
+ { messages: [new HumanMessage('do both')] },
603
+ callerConfig
604
+ );
605
+
606
+ expect(handlerCalled).toBe(false);
607
+ });
608
+ });
609
+
610
+ describe('PostToolUse error resilience', () => {
611
+ it('PostToolUse hook errors are non-fatal — original output preserved', async () => {
612
+ const registry = new HookRegistry();
613
+ const throwingHook: HookCallback<
614
+ 'PostToolUse'
615
+ > = async (): Promise<PostToolUseHookOutput> => {
616
+ throw new Error('post hook crash');
617
+ };
618
+ registry.register('PostToolUse', { hooks: [throwingHook] });
619
+
620
+ const run = await createEventDrivenRun(registry);
621
+ run.Graph!.overrideTestModel(['calling echo'], 5, [makeToolCall('hi')]);
622
+ await run.processStream(
623
+ { messages: [new HumanMessage('echo hi')] },
624
+ callerConfig
625
+ );
626
+
627
+ const messages = run.Graph!.getRunMessages() ?? [];
628
+ const toolMsg = messages.find((m) => m.getType() === 'tool');
629
+ expect(toolMsg).toBeDefined();
630
+ const content =
631
+ typeof toolMsg!.content === 'string'
632
+ ? toolMsg!.content
633
+ : JSON.stringify(toolMsg!.content);
634
+ expect(content).toContain('echo: hi');
635
+ });
636
+ });
637
+
638
+ describe('no-hooks baseline', () => {
639
+ it('event-driven tool execution works identically without hooks', async () => {
640
+ const run = await Run.create<t.IState>({
641
+ runId: 'no-hooks-tool-run',
642
+ graphConfig: {
643
+ type: 'standard',
644
+ llmConfig,
645
+ toolDefinitions: [echoToolDef],
646
+ instructions: 'Use echo.',
647
+ },
648
+ returnContent: true,
649
+ skipCleanup: true,
650
+ customHandlers: {
651
+ [GraphEvents.ON_TOOL_EXECUTE]: createToolExecuteHandler(),
652
+ [GraphEvents.TOOL_END]: new ToolEndHandler(),
653
+ [GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
654
+ },
655
+ });
656
+ run.Graph!.overrideTestModel(['calling echo'], 5, [makeToolCall('test')]);
657
+ const result = await run.processStream(
658
+ { messages: [new HumanMessage('echo test')] },
659
+ callerConfig
660
+ );
661
+
662
+ expect(result).toBeDefined();
663
+ });
664
+ });
665
+ });