@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
package/src/run.ts CHANGED
@@ -22,9 +22,47 @@ import { GraphEvents, Callback, TitleMethod } from '@/common';
22
22
  import { MultiAgentGraph } from '@/graphs/MultiAgentGraph';
23
23
  import { StandardGraph } from '@/graphs/Graph';
24
24
  import { HandlerRegistry } from '@/events';
25
+ import { executeHooks } from '@/hooks';
26
+ import type { HookRegistry } from '@/hooks';
27
+ import { ToolOutputReferenceRegistry } from '@/tools/toolOutputReferences';
25
28
  import { isOpenAILike } from '@/utils/llm';
26
29
  import { isPresent } from '@/utils/misc';
27
30
 
31
+ function findLastMessageOfType(
32
+ messages: BaseMessage[],
33
+ type: string
34
+ ): BaseMessage | undefined {
35
+ for (let i = messages.length - 1; i >= 0; i--) {
36
+ if (messages[i].getType() === type) {
37
+ return messages[i];
38
+ }
39
+ }
40
+ return undefined;
41
+ }
42
+
43
+ function extractPromptText(message: BaseMessage): string {
44
+ const content = message.content;
45
+ if (typeof content === 'string') {
46
+ return content;
47
+ }
48
+ if (!Array.isArray(content)) {
49
+ return String(content);
50
+ }
51
+ const parts: string[] = [];
52
+ for (const block of content) {
53
+ if (
54
+ typeof block === 'object' &&
55
+ 'type' in block &&
56
+ block.type === 'text' &&
57
+ 'text' in block &&
58
+ typeof block.text === 'string'
59
+ ) {
60
+ parts.push(block.text);
61
+ }
62
+ }
63
+ return parts.join('\n');
64
+ }
65
+
28
66
  export const defaultOmitOptions = new Set([
29
67
  'stream',
30
68
  'thinking',
@@ -42,6 +80,8 @@ export class Run<_T extends t.BaseGraphState> {
42
80
  id: string;
43
81
  private tokenCounter?: t.TokenCounter;
44
82
  private handlerRegistry?: HandlerRegistry;
83
+ private hookRegistry?: HookRegistry;
84
+ private toolOutputRegistry?: ToolOutputReferenceRegistry;
45
85
  private indexTokenCountMap?: Record<string, number>;
46
86
  graphRunnable?: t.CompiledStateWorkflow;
47
87
  Graph: StandardGraph | MultiAgentGraph | undefined;
@@ -70,6 +110,26 @@ export class Run<_T extends t.BaseGraphState> {
70
110
  }
71
111
 
72
112
  this.handlerRegistry = handlerRegistry;
113
+ /**
114
+ * Capture hookRegistry BEFORE graph compilation so it propagates into
115
+ * any ToolNode the graph builds during createWorkflow(). createLegacyGraph
116
+ * threads `this.hookRegistry` onto the graph instance via Graph.hookRegistry
117
+ * before compile, which Graph.createToolNodeForAgent reads when constructing
118
+ * each ToolNode.
119
+ */
120
+ this.hookRegistry = config.hooks;
121
+ /**
122
+ * Same lifecycle for the tool-output reference registry: build it
123
+ * here (when enabled) and let createLegacyGraph / createMultiAgentGraph
124
+ * thread it onto the graph before compile so every ToolNode sees the
125
+ * same instance.
126
+ */
127
+ if (config.toolOutputReferences?.enabled === true) {
128
+ this.toolOutputRegistry = new ToolOutputReferenceRegistry({
129
+ maxOutputSize: config.toolOutputReferences.maxOutputSize,
130
+ maxTotalSize: config.toolOutputReferences.maxTotalSize,
131
+ });
132
+ }
73
133
 
74
134
  if (!config.graphConfig) {
75
135
  throw new Error('Graph config not provided');
@@ -138,6 +198,12 @@ export class Run<_T extends t.BaseGraphState> {
138
198
  });
139
199
  /** Propagate compile options from graph config */
140
200
  standardGraph.compileOptions = config.compileOptions;
201
+ if (this.hookRegistry) {
202
+ standardGraph.hookRegistry = this.hookRegistry;
203
+ }
204
+ if (this.toolOutputRegistry) {
205
+ standardGraph.toolOutputRegistry = this.toolOutputRegistry;
206
+ }
141
207
  this.Graph = standardGraph;
142
208
  return standardGraph.createWorkflow();
143
209
  }
@@ -160,6 +226,12 @@ export class Run<_T extends t.BaseGraphState> {
160
226
  multiAgentGraph.compileOptions = compileOptions;
161
227
  }
162
228
 
229
+ if (this.hookRegistry) {
230
+ multiAgentGraph.hookRegistry = this.hookRegistry;
231
+ }
232
+ if (this.toolOutputRegistry) {
233
+ multiAgentGraph.toolOutputRegistry = this.toolOutputRegistry;
234
+ }
163
235
  this.Graph = multiAgentGraph;
164
236
  return multiAgentGraph.createWorkflow();
165
237
  }
@@ -216,7 +288,11 @@ export class Run<_T extends t.BaseGraphState> {
216
288
  */
217
289
  getLastActiveAgentId(): string | undefined {
218
290
  if (this.Graph && this.Graph instanceof MultiAgentGraph) {
219
- return this.Graph.getLastActiveAgentId();
291
+ // Last entry in the run's participating agent set is the most-recent
292
+ // active agent. Derived from contentData step trail rather than
293
+ // a tracked field — same observation surface, fewer state slots.
294
+ const ids = this.Graph.getActiveAgentIds();
295
+ return ids.length > 0 ? ids[ids.length - 1] : undefined;
220
296
  }
221
297
  return undefined;
222
298
  }
@@ -349,6 +425,46 @@ export class Run<_T extends t.BaseGraphState> {
349
425
  run_id: this.id,
350
426
  });
351
427
 
428
+ const threadId = config.configurable.thread_id as string | undefined;
429
+
430
+ if (this.hookRegistry != null) {
431
+ await executeHooks({
432
+ registry: this.hookRegistry,
433
+ input: {
434
+ hook_event_name: 'RunStart',
435
+ runId: this.id,
436
+ threadId,
437
+ agentId: this.Graph.defaultAgentId,
438
+ messages: (inputs as { messages?: BaseMessage[] }).messages ?? [],
439
+ },
440
+ sessionId: this.id,
441
+ });
442
+
443
+ const messages = (inputs as { messages?: BaseMessage[] }).messages ?? [];
444
+ const lastHuman = findLastMessageOfType(messages, 'human');
445
+ if (lastHuman != null) {
446
+ const promptResult = await executeHooks({
447
+ registry: this.hookRegistry,
448
+ input: {
449
+ hook_event_name: 'UserPromptSubmit',
450
+ runId: this.id,
451
+ threadId,
452
+ agentId: this.Graph.defaultAgentId,
453
+ prompt: extractPromptText(lastHuman),
454
+ },
455
+ sessionId: this.id,
456
+ });
457
+ if (
458
+ promptResult.decision === 'deny' ||
459
+ promptResult.decision === 'ask'
460
+ ) {
461
+ this.hookRegistry.clearSession(this.id);
462
+ config.callbacks = undefined;
463
+ return undefined;
464
+ }
465
+ }
466
+ }
467
+
352
468
  const stream = this.graphRunnable.streamEvents(inputs, config, {
353
469
  raiseError: true,
354
470
  /**
@@ -378,13 +494,51 @@ export class Run<_T extends t.BaseGraphState> {
378
494
  await handler.handle(eventName, data, metadata, this.Graph);
379
495
  }
380
496
  }
497
+
498
+ if (this.hookRegistry?.hasHookFor('Stop', this.id) === true) {
499
+ const inputMessages =
500
+ (inputs as { messages?: BaseMessage[] }).messages ?? [];
501
+ await executeHooks({
502
+ registry: this.hookRegistry,
503
+ input: {
504
+ hook_event_name: 'Stop',
505
+ runId: this.id,
506
+ threadId,
507
+ agentId: this.Graph.defaultAgentId,
508
+ messages: this.Graph.getRunMessages() ?? inputMessages,
509
+ stopHookActive: false,
510
+ },
511
+ sessionId: this.id,
512
+ }).catch(() => {
513
+ /* Stop hook errors must not masquerade as stream failures */
514
+ });
515
+ }
381
516
  } catch (e) {
382
517
  // GraphInterrupt is expected when interrupt() fires (HITL approval flow).
383
518
  // Exit gracefully so the host can check hasInterrupts() and resume.
384
519
  if (isGraphInterrupt(e)) {
385
520
  return undefined;
386
521
  }
522
+ if (this.hookRegistry?.hasHookFor('StopFailure', this.id) === true) {
523
+ const runMessages = this.Graph.getRunMessages() ?? [];
524
+ await executeHooks({
525
+ registry: this.hookRegistry,
526
+ input: {
527
+ hook_event_name: 'StopFailure',
528
+ runId: this.id,
529
+ threadId,
530
+ agentId: this.Graph.defaultAgentId,
531
+ error: e instanceof Error ? e.message : String(e),
532
+ lastAssistantMessage: findLastMessageOfType(runMessages, 'ai'),
533
+ },
534
+ sessionId: this.id,
535
+ }).catch(() => {
536
+ /* swallow hook errors — original error must propagate */
537
+ });
538
+ }
387
539
  throw e;
540
+ } finally {
541
+ this.hookRegistry?.clearSession(this.id);
388
542
  }
389
543
 
390
544
  /**
@@ -7,7 +7,7 @@ import {
7
7
  getBufferString,
8
8
  } from '@langchain/core/messages';
9
9
  import { Run } from '@/run';
10
- import { Providers, GraphEvents } from '@/common';
10
+ import { Providers, GraphEvents, EdgeType } from '@/common';
11
11
  import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
12
12
  import { ToolEndHandler, ModelEndHandler } from '@/events';
13
13
  import type * as t from '@/types';
@@ -28,7 +28,7 @@ function createSequentialChainEdges(agentIds: string[]): t.GraphEdge[] {
28
28
  edges.push({
29
29
  from: fromAgent,
30
30
  to: toAgent,
31
- edgeType: 'sequence',
31
+ edgeType: EdgeType.DIRECT,
32
32
  // Use a prompt function to create the buffer string from all previous results
33
33
  prompt: (messages: BaseMessage[], startIndex: number) => {
34
34
  // Get only the messages from this run (after startIndex)
@@ -7,7 +7,7 @@ import {
7
7
  getBufferString,
8
8
  } from '@langchain/core/messages';
9
9
  import { Run } from '@/run';
10
- import { Providers, GraphEvents } from '@/common';
10
+ import { Providers, GraphEvents, EdgeType } from '@/common';
11
11
  import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
12
12
  import { ToolEndHandler, ModelEndHandler } from '@/events';
13
13
  import type * as t from '@/types';
@@ -22,7 +22,7 @@ function createDocumentReviewChain(agentIds: string[]): t.GraphEdge[] {
22
22
  edges.push({
23
23
  from: agentIds[i],
24
24
  to: agentIds[i + 1],
25
- edgeType: 'sequence',
25
+ edgeType: EdgeType.DIRECT,
26
26
  prompt: (messages: BaseMessage[], startIndex: number) => {
27
27
  const runMessages = messages.slice(startIndex);
28
28
  const bufferString = getBufferString(runMessages);
@@ -3,7 +3,7 @@ config();
3
3
 
4
4
  import { HumanMessage, BaseMessage } from '@langchain/core/messages';
5
5
  import { Run } from '@/run';
6
- import { Providers, GraphEvents, Constants } from '@/common';
6
+ import { Providers, GraphEvents, EdgeType, Constants } from '@/common';
7
7
  import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
8
8
  import { ToolEndHandler, ModelEndHandler } from '@/events';
9
9
  import type * as t from '@/types';
@@ -108,7 +108,7 @@ async function testHybridMultiAgent() {
108
108
  {
109
109
  from: 'primary_agent',
110
110
  to: 'standalone_agent',
111
- edgeType: 'transfer',
111
+ edgeType: EdgeType.HANDOFF,
112
112
  description: 'Transfer to standalone specialist for complex requests',
113
113
  prompt: 'Specific instructions for the specialist',
114
114
  },
@@ -116,14 +116,14 @@ async function testHybridMultiAgent() {
116
116
  {
117
117
  from: 'primary_agent',
118
118
  to: 'agent_b',
119
- edgeType: 'sequence',
119
+ edgeType: EdgeType.DIRECT,
120
120
  description: 'Continue to Agent B only if no handoff occurs',
121
121
  },
122
122
  // Direct edge: agent_b automatically continues to agent_c
123
123
  {
124
124
  from: 'agent_b',
125
125
  to: 'agent_c',
126
- edgeType: 'sequence',
126
+ edgeType: EdgeType.DIRECT,
127
127
  description: 'Automatic progression from B to C',
128
128
  },
129
129
  ];
@@ -5,7 +5,7 @@ import { HumanMessage, BaseMessage } from '@langchain/core/messages';
5
5
  import type * as t from '@/types';
6
6
  import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
7
7
  import { ToolEndHandler, ModelEndHandler } from '@/events';
8
- import { Providers, GraphEvents } from '@/common';
8
+ import { Providers, GraphEvents, EdgeType } from '@/common';
9
9
  import { sleep } from '@/utils/run';
10
10
  import { Run } from '@/run';
11
11
 
@@ -160,13 +160,13 @@ async function testParallelMultiAgent() {
160
160
  from: 'researcher',
161
161
  to: ['analyst1', 'analyst2', 'analyst3'], // Fan-out to multiple analysts
162
162
  description: 'Distribute research to specialist analysts',
163
- edgeType: 'sequence', // Explicitly set as direct for automatic transition (enables parallel execution)
163
+ edgeType: EdgeType.DIRECT, // Explicitly set as direct for automatic transition (enables parallel execution)
164
164
  },
165
165
  {
166
166
  from: ['analyst1', 'analyst2', 'analyst3'], // Fan-in from multiple sources
167
167
  to: 'summarizer',
168
168
  description: 'Aggregate analysis results',
169
- edgeType: 'sequence', // Fan-in is also direct
169
+ edgeType: EdgeType.DIRECT, // Fan-in is also direct
170
170
  // Add prompt when all analysts have provided input
171
171
  // prompt: (messages, runStartIndex) => {
172
172
  // // Check if we have analysis content from all three analysts
@@ -3,7 +3,7 @@ config();
3
3
 
4
4
  import { HumanMessage, BaseMessage } from '@langchain/core/messages';
5
5
  import { Run } from '@/run';
6
- import { Providers, GraphEvents } from '@/common';
6
+ import { Providers, GraphEvents, EdgeType } from '@/common';
7
7
  import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
8
8
  import { ToolEndHandler, ModelEndHandler } from '@/events';
9
9
  import type * as t from '@/types';
@@ -82,13 +82,13 @@ async function testSequentialMultiAgent() {
82
82
  {
83
83
  from: 'agent_a',
84
84
  to: 'agent_b',
85
- edgeType: 'sequence', // This creates direct edges without tools
85
+ edgeType: EdgeType.DIRECT, // This creates direct edges without tools
86
86
  description: 'Automatic transition from A to B',
87
87
  },
88
88
  {
89
89
  from: 'agent_b',
90
90
  to: 'agent_c',
91
- edgeType: 'sequence', // This creates direct edges without tools
91
+ edgeType: EdgeType.DIRECT, // This creates direct edges without tools
92
92
  description: 'Automatic transition from B to C',
93
93
  },
94
94
  ];
@@ -0,0 +1,246 @@
1
+ import { config } from 'dotenv';
2
+ config();
3
+
4
+ import { HumanMessage } from '@langchain/core/messages';
5
+ import type { BaseMessage } from '@langchain/core/messages';
6
+ import type * as t from '@/types';
7
+ import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
8
+ import { ToolEndHandler, ModelEndHandler } from '@/events';
9
+ import { Providers, GraphEvents, Constants } from '@/common';
10
+ import { Run } from '@/run';
11
+
12
+ /**
13
+ * Manual verification script for the subagent primitive.
14
+ *
15
+ * Configures a supervisor agent with two subagent types (researcher, coder),
16
+ * sends a query, and confirms:
17
+ * 1. The parent agent delegates to a subagent via the `subagent` tool
18
+ * 2. The child executes with isolated context (fresh message history)
19
+ * 3. Only the filtered text result returns to the parent
20
+ * 4. The parent incorporates the result and responds
21
+ *
22
+ * Usage:
23
+ * OPENAI_API_KEY=... npx ts-node -r tsconfig-paths/register src/scripts/multi-agent-subagent.ts
24
+ *
25
+ * Or with Anthropic:
26
+ * ANTHROPIC_API_KEY=... npx ts-node -r tsconfig-paths/register src/scripts/multi-agent-subagent.ts --provider anthropic
27
+ */
28
+
29
+ const useAnthropic =
30
+ process.argv.includes('--provider') &&
31
+ process.argv[process.argv.indexOf('--provider') + 1] === 'anthropic';
32
+
33
+ const provider = useAnthropic ? Providers.ANTHROPIC : Providers.OPENAI;
34
+ const apiKey = useAnthropic
35
+ ? process.env.ANTHROPIC_API_KEY
36
+ : process.env.OPENAI_API_KEY;
37
+ const modelName = useAnthropic ? 'claude-sonnet-4-20250514' : 'gpt-5.4';
38
+
39
+ if (!apiKey) {
40
+ console.error(
41
+ `Missing ${useAnthropic ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY'} environment variable`
42
+ );
43
+ process.exit(1);
44
+ }
45
+
46
+ async function testSubagentPrimitive() {
47
+ console.log('=== Subagent Primitive Manual Verification ===\n');
48
+ console.log(`Provider: ${provider}`);
49
+ console.log(`Model: ${modelName}\n`);
50
+
51
+ const { aggregateContent } = createContentAggregator();
52
+
53
+ const parentAgent: t.AgentInputs = {
54
+ agentId: 'supervisor',
55
+ provider,
56
+ clientOptions: { modelName, apiKey },
57
+ instructions: `You are a supervisor agent. You have access to specialized subagents.
58
+
59
+ When the user asks a research question, delegate it to the "researcher" subagent.
60
+ When the user asks for code, delegate it to the "coder" subagent.
61
+
62
+ After receiving the subagent's result, synthesize it into a clear final answer for the user.
63
+ Always use a subagent for research or coding tasks — do not answer directly.`,
64
+ maxContextTokens: 16000,
65
+ subagentConfigs: [
66
+ {
67
+ type: 'researcher',
68
+ name: 'Research Specialist',
69
+ description:
70
+ 'Researches topics and provides detailed summaries with sources.',
71
+ agentInputs: {
72
+ agentId: 'researcher',
73
+ provider,
74
+ clientOptions: { modelName, apiKey },
75
+ instructions: `You are a research specialist working in an isolated context.
76
+ You receive a single task description and must answer it thoroughly.
77
+ Be concise but comprehensive. Include key facts and details.`,
78
+ maxContextTokens: 8000,
79
+ },
80
+ },
81
+ {
82
+ type: 'coder',
83
+ name: 'Coding Specialist',
84
+ description:
85
+ 'Writes, reviews, and explains code in any programming language.',
86
+ agentInputs: {
87
+ agentId: 'coder',
88
+ provider,
89
+ clientOptions: { modelName, apiKey },
90
+ instructions: `You are a coding specialist working in an isolated context.
91
+ You receive a single task description and must provide working code.
92
+ Include brief explanations. Use clean, idiomatic code.`,
93
+ maxContextTokens: 8000,
94
+ },
95
+ },
96
+ ],
97
+ };
98
+
99
+ const customHandlers: Record<string, t.EventHandler> = {
100
+ [GraphEvents.CHAT_MODEL_STREAM]: new ChatModelStreamHandler(),
101
+ [GraphEvents.TOOL_END]: new ToolEndHandler(),
102
+ [GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
103
+ [GraphEvents.ON_RUN_STEP_COMPLETED]: {
104
+ handle: (event: string, data: t.StreamEventData): void => {
105
+ aggregateContent({
106
+ event: event as GraphEvents,
107
+ data: data as t.RunStep,
108
+ });
109
+ },
110
+ },
111
+ [GraphEvents.ON_RUN_STEP]: {
112
+ handle: (event: string, data: t.StreamEventData): void => {
113
+ aggregateContent({
114
+ event: event as GraphEvents,
115
+ data: data as t.RunStep,
116
+ });
117
+ },
118
+ },
119
+ [GraphEvents.ON_RUN_STEP_DELTA]: {
120
+ handle: (event: string, data: t.StreamEventData): void => {
121
+ aggregateContent({
122
+ event: event as GraphEvents,
123
+ data: data as t.RunStepDeltaEvent,
124
+ });
125
+ },
126
+ },
127
+ [GraphEvents.ON_MESSAGE_DELTA]: {
128
+ handle: (event: string, data: t.StreamEventData): void => {
129
+ aggregateContent({
130
+ event: event as GraphEvents,
131
+ data: data as t.MessageDeltaEvent,
132
+ });
133
+ },
134
+ },
135
+ };
136
+
137
+ const run = await Run.create<t.IState>({
138
+ runId: `subagent-manual-${Date.now()}`,
139
+ graphConfig: {
140
+ type: 'standard',
141
+ agents: [parentAgent],
142
+ },
143
+ returnContent: true,
144
+ customHandlers,
145
+ });
146
+
147
+ console.log('--- Run created ---');
148
+ console.log(
149
+ `Subagent tool present: ${
150
+ (
151
+ (run.Graph as import('@/graphs/Graph').StandardGraph).agentContexts.get(
152
+ 'supervisor'
153
+ )?.graphTools as t.GenericTool[] | undefined
154
+ )?.some((t) => 'name' in t && t.name === Constants.SUBAGENT) ?? false
155
+ }\n`
156
+ );
157
+
158
+ const conversationHistory: BaseMessage[] = [];
159
+
160
+ // Turn 1: Research question (should delegate to researcher subagent)
161
+ console.log('=== Turn 1: Research Question ===\n');
162
+ console.log(
163
+ 'User: What are the three laws of thermodynamics? Explain briefly.\n'
164
+ );
165
+
166
+ const userMessage = new HumanMessage(
167
+ 'What are the three laws of thermodynamics? Explain briefly.'
168
+ );
169
+ conversationHistory.push(userMessage);
170
+
171
+ const callerConfig = {
172
+ configurable: { thread_id: 'subagent-verify' },
173
+ streamMode: 'values' as const,
174
+ version: 'v2' as const,
175
+ };
176
+
177
+ console.log('--- Streaming response ---\n');
178
+ const result = await run.processStream(
179
+ { messages: conversationHistory },
180
+ callerConfig
181
+ );
182
+
183
+ const runMessages = run.getRunMessages();
184
+ console.log('\n\n--- Run Messages ---\n');
185
+
186
+ if (runMessages) {
187
+ for (const msg of runMessages) {
188
+ const type = msg._getType();
189
+ if (type === 'tool') {
190
+ const name = 'name' in msg ? msg.name : 'unknown';
191
+ const rawContent =
192
+ typeof msg.content === 'string'
193
+ ? msg.content
194
+ : JSON.stringify(msg.content);
195
+ const content = rawContent.slice(0, 200);
196
+ const truncated = rawContent.length > 200 ? '...' : '';
197
+ console.log(`[ToolMessage] name=${name}`);
198
+ console.log(` content: ${content}${truncated}\n`);
199
+ } else if (type === 'ai') {
200
+ const content =
201
+ typeof msg.content === 'string'
202
+ ? msg.content.slice(0, 300)
203
+ : JSON.stringify(msg.content).slice(0, 300);
204
+ const toolCalls = 'tool_calls' in msg ? msg.tool_calls : undefined;
205
+ console.log(`[AIMessage]`);
206
+ if (toolCalls && Array.isArray(toolCalls) && toolCalls.length > 0) {
207
+ for (const tc of toolCalls) {
208
+ console.log(
209
+ ` tool_call: ${tc.name}(${JSON.stringify(tc.args).slice(0, 100)}...)`
210
+ );
211
+ }
212
+ }
213
+ console.log(
214
+ ` content: ${content}${content.length >= 300 ? '...' : ''}\n`
215
+ );
216
+ }
217
+ }
218
+
219
+ const subagentToolMessages = runMessages.filter(
220
+ (msg) =>
221
+ msg._getType() === 'tool' &&
222
+ 'name' in msg &&
223
+ msg.name === Constants.SUBAGENT
224
+ );
225
+ console.log(`\n--- Verification ---`);
226
+ console.log(`Subagent tool calls found: ${subagentToolMessages.length}`);
227
+ console.log(`Total run messages: ${runMessages.length}`);
228
+ console.log(`Result content parts: ${result?.length ?? 0}`);
229
+
230
+ if (subagentToolMessages.length > 0) {
231
+ console.log(
232
+ '\nSUCCESS: Subagent was invoked and returned a filtered result.'
233
+ );
234
+ console.log(
235
+ 'The child context was isolated — only the final text came back.'
236
+ );
237
+ } else {
238
+ console.log('\nNOTE: No subagent tool calls detected.');
239
+ console.log('The LLM may have answered directly without delegating.');
240
+ }
241
+ }
242
+
243
+ console.log('\n=== Done ===');
244
+ }
245
+
246
+ testSubagentPrimitive().catch(console.error);
@@ -255,32 +255,32 @@ async function testSupervisorMultiAgent() {
255
255
  to: 'data_analyst',
256
256
  description:
257
257
  'Transfer to data analyst for statistical analysis and metrics',
258
- edgeType: 'transfer',
258
+ edgeType: EdgeType.HANDOFF,
259
259
  },
260
260
  {
261
261
  from: 'supervisor',
262
262
  to: 'security_expert',
263
263
  description: 'Transfer to security expert for cybersecurity assessment',
264
- edgeType: 'transfer',
264
+ edgeType: EdgeType.HANDOFF,
265
265
  },
266
266
  {
267
267
  from: 'supervisor',
268
268
  to: 'product_designer',
269
269
  description: 'Transfer to product designer for UX/UI design',
270
- edgeType: 'transfer',
270
+ edgeType: EdgeType.HANDOFF,
271
271
  },
272
272
  {
273
273
  from: 'supervisor',
274
274
  to: 'devops_engineer',
275
275
  description:
276
276
  'Transfer to DevOps engineer for infrastructure and deployment',
277
- edgeType: 'transfer',
277
+ edgeType: EdgeType.HANDOFF,
278
278
  },
279
279
  {
280
280
  from: 'supervisor',
281
281
  to: 'legal_advisor',
282
282
  description: 'Transfer to legal advisor for compliance and licensing',
283
- edgeType: 'transfer',
283
+ edgeType: EdgeType.HANDOFF,
284
284
  },
285
285
  ];
286
286