@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
@@ -10,10 +10,9 @@ var toonFormat = require('../utils/toonFormat.cjs');
10
10
  var run = require('../utils/run.cjs');
11
11
  require('ai-tokenizer');
12
12
  require('zod-to-json-schema');
13
- require('axios');
14
- require('https-proxy-agent');
15
- require('../utils/credentials.cjs');
16
13
  var events = require('../utils/events.cjs');
14
+ var executeHooks = require('../hooks/executeHooks.cjs');
15
+ var toolOutputReferences = require('./toolOutputReferences.cjs');
17
16
 
18
17
  /**
19
18
  * Helper to check if a value is a Send object
@@ -84,7 +83,30 @@ class ToolNode extends run.RunnableCallable {
84
83
  toolApprovalConfig;
85
84
  /** Buffer for recovering truncated tool call arguments from streaming data */
86
85
  streamingToolCallBuffer;
87
- constructor({ tools, toolMap, name, tags, errorHandler, toolCallStepIds, handleToolErrors, loadRuntimeTools, toolRegistry, sessions, eventDrivenMode, agentId, directToolNames, streamingToolCallBuffer, toolApprovalConfig, }) {
86
+ /** Hook registry threaded down from Run for tool-lifecycle events. */
87
+ hookRegistry;
88
+ /**
89
+ * Tool output reference registry threaded down from Run / Graph
90
+ * (PR #114). When set, dispatchToolEvents resolves
91
+ * `{{tool<i>turn<n>}}` placeholders in args before invoking each tool
92
+ * and stores successful outputs under their stable reference keys for
93
+ * subsequent calls in the same run to pipe through.
94
+ */
95
+ toolOutputRegistry;
96
+ /**
97
+ * Per-batch turn counter for the registry. Increments once per
98
+ * `dispatchToolEvents` invocation so `tool<i>turn<n>` keys remain
99
+ * unique across overlapping batches in a single run.
100
+ */
101
+ toolOutputTurn = 0;
102
+ /**
103
+ * Counter for synthesising scope ids when `run()` is called without a
104
+ * `run_id` in config. Each anonymous batch gets a unique
105
+ * `\0anon-<n>` scope so concurrent invocations don't collide on the
106
+ * shared `toolOutputRegistry`.
107
+ */
108
+ anonBatchCounter = 0;
109
+ constructor({ tools, toolMap, name, tags, errorHandler, toolCallStepIds, handleToolErrors, loadRuntimeTools, toolRegistry, sessions, eventDrivenMode, agentId, directToolNames, streamingToolCallBuffer, toolApprovalConfig, hookRegistry, toolOutputRegistry, toolOutputReferences: toolOutputReferences$1, maxToolResultChars: _maxToolResultChars, }) {
88
110
  super({ name, tags, func: (input, config) => this.run(input, config) });
89
111
  this.toolMap = toolMap ?? new Map(tools.map((tool) => [tool.name, tool]));
90
112
  this.toolCallStepIds = toolCallStepIds;
@@ -99,6 +121,31 @@ class ToolNode extends run.RunnableCallable {
99
121
  this.directToolNames = directToolNames;
100
122
  this.streamingToolCallBuffer = streamingToolCallBuffer;
101
123
  this.toolApprovalConfig = toolApprovalConfig;
124
+ this.hookRegistry = hookRegistry;
125
+ /**
126
+ * Precedence: an explicitly passed `toolOutputRegistry` instance
127
+ * wins (the multi-agent case where every ToolNode shares one registry
128
+ * for the run); otherwise the per-ToolNode `toolOutputReferences`
129
+ * config builds an instance scoped to this ToolNode.
130
+ */
131
+ if (toolOutputRegistry != null) {
132
+ this.toolOutputRegistry = toolOutputRegistry;
133
+ }
134
+ else if (toolOutputReferences$1?.enabled === true) {
135
+ this.toolOutputRegistry = new toolOutputReferences.ToolOutputReferenceRegistry({
136
+ maxOutputSize: toolOutputReferences$1.maxOutputSize,
137
+ maxTotalSize: toolOutputReferences$1.maxTotalSize,
138
+ });
139
+ }
140
+ }
141
+ /**
142
+ * Test-observation accessor for the tool-output reference registry.
143
+ * @internal Exposed for test observation only. Host code should rely on
144
+ * `{{tool<i>turn<n>}}` substitution at tool-invocation time and not
145
+ * mutate the registry directly.
146
+ */
147
+ _unsafeGetToolOutputRegistry() {
148
+ return this.toolOutputRegistry;
102
149
  }
103
150
  /**
104
151
  * Returns cached programmatic tools, computing once on first access.
@@ -166,8 +213,7 @@ class ToolNode extends run.RunnableCallable {
166
213
  // `ask_user` execute without ever firing interrupt(), defeating the whole tool.
167
214
  // Instead, gate the bypass on the actual routing-tool name prefix.
168
215
  if (this.directToolNames?.has(toolName) &&
169
- (toolName.startsWith(_enum.Constants.LC_TRANSFER_TO_) ||
170
- toolName.startsWith(_enum.Constants.LC_HANDOFF_TO_))) {
216
+ toolName.startsWith(_enum.Constants.LC_TRANSFER_TO_)) {
171
217
  return false;
172
218
  }
173
219
  // Determine the effective policy for this tool
@@ -221,10 +267,41 @@ class ToolNode extends run.RunnableCallable {
221
267
  return response;
222
268
  }
223
269
  /**
224
- * Runs a single tool call with error handling
270
+ * Runs a single tool call with error handling.
271
+ *
272
+ * @param batchContext Optional per-batch context (PR #117).
273
+ * Threaded from `run()` for tool output reference annotation. The
274
+ * `batchScopeId` field carries an anonymous synthetic scope when the
275
+ * caller has no `run_id`, so concurrent batches don't collide on the
276
+ * shared registry.
225
277
  */
226
- async runTool(call, config) {
278
+ async runTool(call, config, batchContext = {}) {
279
+ const { batchIndex, turn: batchTurn, batchScopeId, resolvedArgsByCallId, } = batchContext;
227
280
  const tool = this.toolMap.get(call.name);
281
+ const registry = this.toolOutputRegistry;
282
+ /**
283
+ * Precompute the reference key once per call — captured locally so
284
+ * concurrent `invoke()` calls on the same ToolNode cannot race on a
285
+ * shared turn field.
286
+ */
287
+ const refKey = registry != null && batchIndex != null && batchTurn != null
288
+ ? toolOutputReferences.buildReferenceKey(batchIndex, batchTurn)
289
+ : undefined;
290
+ /**
291
+ * Hoisted outside the try so the catch branch can stamp
292
+ * `_unresolvedRefs` into error ToolMessage metadata. This lets the
293
+ * lazy annotation transform surface a `[unresolved refs: …]` hint to
294
+ * the LLM, helping the model self-correct when its reference key
295
+ * caused the failure.
296
+ */
297
+ let unresolvedRefs = [];
298
+ /**
299
+ * Use the caller-provided `batchScopeId` when threaded from `run()`.
300
+ * Fall back to the config's `run_id` when runTool is invoked from a
301
+ * context that doesn't thread the batch context — that still
302
+ * preserves the runId-based partitioning for named runs.
303
+ */
304
+ const runId = batchScopeId ?? config.configurable?.run_id;
228
305
  try {
229
306
  if (tool === undefined) {
230
307
  throw new Error(`Tool "${call.name}" not found.`);
@@ -244,6 +321,23 @@ class ToolNode extends run.RunnableCallable {
244
321
  args = this.recoverTruncatedArgs(call.name, call.id, args);
245
322
  this.streamingToolCallBuffer.clear(call.id);
246
323
  }
324
+ /**
325
+ * Resolve `{{tool<i>turn<n>}}` placeholders in args against the
326
+ * registry. Captures `unresolvedRefs` so error/success branches can
327
+ * surface them to the LLM via `additional_kwargs._unresolvedRefs`.
328
+ */
329
+ if (registry != null) {
330
+ const { resolved, unresolved } = registry.resolve(runId, args);
331
+ args = resolved;
332
+ unresolvedRefs = unresolved;
333
+ if (resolvedArgsByCallId != null &&
334
+ call.id != null &&
335
+ call.id !== '' &&
336
+ resolved !== call.args &&
337
+ typeof resolved === 'object') {
338
+ resolvedArgsByCallId.set(call.id, resolved);
339
+ }
340
+ }
247
341
  // Build invoke params - LangChain extracts non-schema fields to config.toolCall
248
342
  let invokeParams = {
249
343
  ...call,
@@ -276,8 +370,7 @@ class ToolNode extends run.RunnableCallable {
276
370
  * session_id is always injected when available (even without tracked files)
277
371
  * so the CodeExecutor can fall back to the /files endpoint for session continuity.
278
372
  */
279
- if (call.name === _enum.Constants.EXECUTE_CODE ||
280
- call.name === _enum.Constants.PROGRAMMATIC_TOOL_CALLING) {
373
+ if (_enum.CODE_EXECUTION_TOOLS.has(call.name)) {
281
374
  const codeSession = this.sessions?.get(_enum.Constants.EXECUTE_CODE);
282
375
  if (codeSession != null && codeSession.session_id !== '') {
283
376
  /**
@@ -362,22 +455,49 @@ class ToolNode extends run.RunnableCallable {
362
455
  minSizeForToon: 1000,
363
456
  minReductionPercent: 10, // Only apply TOON when clearly beneficial
364
457
  });
365
- // Step 4: Return ToolMessage with processed string content
458
+ /**
459
+ * Tool output reference metadata (PR #117). Register the
460
+ * raw, untruncated content so future `{{...}}` substitutions deliver
461
+ * the full payload, and stamp `_refKey` / `_refScope` /
462
+ * `_unresolvedRefs` into `additional_kwargs` for the lazy
463
+ * annotation transform to apply at LLM request time. Persisted
464
+ * `content` stays clean.
465
+ *
466
+ * For error ToolMessages from the underlying tool: bypass
467
+ * registration but still stamp `_unresolvedRefs` so the model can
468
+ * self-correct.
469
+ */
366
470
  if (messages.isBaseMessage(output) && output._getType() === 'tool') {
367
471
  const toolMsg = output;
472
+ const isError = toolMsg.status === 'error';
473
+ const refMeta = isError
474
+ ? unresolvedRefs.length > 0
475
+ ? { _unresolvedRefs: unresolvedRefs }
476
+ : undefined
477
+ : this.recordOutputReference(runId, rawContent, refKey, unresolvedRefs);
368
478
  return new messages.ToolMessage({
369
479
  status: toolMsg.status,
370
480
  name: toolMsg.name,
371
481
  content: processed.content,
372
482
  tool_call_id: toolMsg.tool_call_id,
483
+ ...(refMeta != null && {
484
+ additional_kwargs: {
485
+ ...toolMsg.additional_kwargs,
486
+ ...refMeta,
487
+ },
488
+ }),
373
489
  });
374
490
  }
375
491
  else {
492
+ const refMeta = this.recordOutputReference(runId, rawContent, refKey, unresolvedRefs);
376
493
  return new messages.ToolMessage({
377
494
  status: 'success',
378
495
  name: tool.name,
379
496
  content: processed.content,
380
497
  tool_call_id: call.id,
498
+ ...(refMeta != null && {
499
+ additional_kwargs: refMeta,
500
+ }),
381
501
  });
382
502
  }
383
503
  }
@@ -427,6 +547,9 @@ class ToolNode extends run.RunnableCallable {
427
547
  content: `Error: ${e.message}\n Please fix your mistakes.`,
428
548
  name: call.name,
429
549
  tool_call_id: call.id ?? '',
550
+ ...(unresolvedRefs.length > 0 && {
551
+ additional_kwargs: { _unresolvedRefs: unresolvedRefs },
552
+ }),
430
553
  });
431
554
  }
432
555
  }
@@ -510,6 +633,31 @@ class ToolNode extends run.RunnableCallable {
510
633
  }
511
634
  return parsedArgs;
512
635
  }
636
+ /**
637
+ * Stores the raw, untruncated tool output in the registry under `refKey`
638
+ * (when registry + refKey are both present) and returns the metadata
639
+ * envelope to stamp on `ToolMessage.additional_kwargs`. The lazy
640
+ * annotation transform reads `_refKey` / `_refScope` / `_unresolvedRefs`
641
+ * at LLM request time to produce the transient annotated copy.
642
+ */
643
+ recordOutputReference(runId, registryContent, refKey, unresolved) {
644
+ if (this.toolOutputRegistry != null && refKey != null) {
645
+ this.toolOutputRegistry.set(runId, refKey, registryContent);
646
+ }
647
+ if (refKey == null && unresolved.length === 0)
648
+ return undefined;
649
+ const meta = {};
650
+ if (refKey != null) {
651
+ meta._refKey = refKey;
652
+ // Anonymous invocations use a synthetic scope minted in run() — stamp
653
+ // it onto the message so annotateMessagesForLLM can recover it later.
654
+ if (runId != null)
655
+ meta._refScope = runId;
656
+ }
657
+ if (unresolved.length > 0)
658
+ meta._unresolvedRefs = unresolved;
659
+ return meta;
660
+ }
513
661
  /**
514
662
  * Builds code session context for injection into event-driven tool calls.
515
663
  * Mirrors the session injection logic in runTool() for direct execution.
@@ -664,8 +812,33 @@ class ToolNode extends run.RunnableCallable {
664
812
  }
665
813
  }
666
814
  /**
667
- * Dispatches tool calls to the host via ON_TOOL_EXECUTE event and returns raw ToolMessages.
668
- * Core logic for event-driven execution, separated from output shaping.
815
+ * Converts InjectedMessage entries into LangChain HumanMessages.
816
+ * 'user' and 'system' both become HumanMessage to avoid provider rejections
817
+ * (Anthropic/Google reject non-leading SystemMessages); the original role
818
+ * and metadata are preserved in additional_kwargs for downstream consumers.
819
+ */
820
+ convertInjectedMessages(messages$1) {
821
+ const converted = [];
822
+ for (const msg of messages$1) {
823
+ const additional_kwargs = {
824
+ role: msg.role,
825
+ };
826
+ if (msg.isMeta != null)
827
+ additional_kwargs.isMeta = msg.isMeta;
828
+ if (msg.source != null)
829
+ additional_kwargs.source = msg.source;
830
+ if (msg.skillName != null)
831
+ additional_kwargs.skillName = msg.skillName;
832
+ converted.push(new messages.HumanMessage({ content: msg.content, additional_kwargs }));
833
+ }
834
+ return converted;
835
+ }
836
+ /**
837
+ * Dispatches tool calls to the host via ON_TOOL_EXECUTE event and returns
838
+ * the resulting ToolMessages along with any injected messages emitted by
839
+ * the host (e.g. SkillTool body injection). Injected messages must be
840
+ * placed AFTER the ToolMessages so the AIMessage tool_calls -> ToolMessage
841
+ * adjacency required by some providers is preserved.
669
842
  */
670
843
  async dispatchToolEvents(toolCalls, config) {
671
844
  // ========================================================================
@@ -696,9 +869,117 @@ class ToolNode extends run.RunnableCallable {
696
869
  }
697
870
  // If all tools were denied, return denial messages without dispatching
698
871
  if (approvedCalls.length === 0) {
699
- return denialMessages;
872
+ return { toolMessages: denialMessages, injected: [] };
873
+ }
874
+ const runId = config.configurable?.run_id;
875
+ const threadId = config.configurable?.thread_id;
876
+ /**
877
+ * PreToolUse hooks may deny / ask / allow each call, and may rewrite
878
+ * `toolInput` via `updatedInput`. A denied/asked call short-circuits
879
+ * with a synthetic error ToolMessage and fires PermissionDenied so
880
+ * the host can audit. Survivors continue to dispatch.
881
+ */
882
+ const hookDenialMessages = [];
883
+ let postHookCalls = approvedCalls;
884
+ if (runId != null &&
885
+ this.hookRegistry?.hasHookFor('PreToolUse', runId) === true) {
886
+ const HOOK_FALLBACK = {
887
+ additionalContexts: [],
888
+ errors: [],
889
+ };
890
+ const surviving = [];
891
+ const preResults = await Promise.all(approvedCalls.map((call) => executeHooks.executeHooks({
892
+ registry: this.hookRegistry,
893
+ input: {
894
+ hook_event_name: 'PreToolUse',
895
+ runId,
896
+ threadId,
897
+ agentId: this.agentId,
898
+ toolName: call.name,
899
+ toolInput: call.args,
900
+ toolUseId: call.id ?? '',
901
+ stepId: this.toolCallStepIds?.get(call.id ?? ''),
902
+ turn: this.toolUsageCount.get(call.name) ?? 0,
903
+ },
904
+ sessionId: runId,
905
+ matchQuery: call.name,
906
+ }).catch(() => HOOK_FALLBACK)));
907
+ for (let i = 0; i < approvedCalls.length; i++) {
908
+ const call = approvedCalls[i];
909
+ const hookResult = preResults[i];
910
+ const denied = hookResult.decision === 'deny' || hookResult.decision === 'ask';
911
+ if (denied) {
912
+ const reason = hookResult.reason ?? 'Blocked by hook';
913
+ hookDenialMessages.push(new messages.ToolMessage({
914
+ status: 'error',
915
+ content: `Blocked: ${reason}`,
916
+ name: call.name,
917
+ tool_call_id: call.id ?? '',
918
+ }));
919
+ if (this.hookRegistry.hasHookFor('PermissionDenied', runId)) {
920
+ // Fire-and-forget — denial accounting must not block dispatch.
921
+ void executeHooks.executeHooks({
922
+ registry: this.hookRegistry,
923
+ input: {
924
+ hook_event_name: 'PermissionDenied',
925
+ runId,
926
+ threadId,
927
+ agentId: this.agentId,
928
+ toolName: call.name,
929
+ toolInput: call.args,
930
+ toolUseId: call.id ?? '',
931
+ reason,
932
+ },
933
+ sessionId: runId,
934
+ matchQuery: call.name,
935
+ }).catch(() => {
936
+ /* swallow — denial is informational */
937
+ });
938
+ }
939
+ continue;
940
+ }
941
+ if (hookResult.updatedInput != null &&
942
+ typeof hookResult.updatedInput === 'object') {
943
+ call.args = hookResult.updatedInput;
944
+ }
945
+ surviving.push(call);
946
+ }
947
+ postHookCalls = surviving;
948
+ if (postHookCalls.length === 0) {
949
+ return {
950
+ toolMessages: [...denialMessages, ...hookDenialMessages],
951
+ injected: [],
952
+ };
953
+ }
700
954
  }
701
- const requests = approvedCalls.map((call) => {
955
+ /**
956
+ * Tool output reference resolution (PR #114): walk each call's
957
+ * args and substitute `{{tool<i>turn<n>}}` placeholders with the stored
958
+ * raw output. Captured here BEFORE request shaping so the substituted
959
+ * args flow through the rest of the dispatch unchanged.
960
+ *
961
+ * Failures are non-fatal: the registry resolver returns the original
962
+ * string unchanged for unknown keys, and surfaces them via `unresolved`
963
+ * which we currently log-only. Future work can route unresolved-key
964
+ * complaints into a hint message for the LLM.
965
+ */
966
+ const batchTurn = this.toolOutputTurn++;
967
+ if (this.toolOutputRegistry != null && runId != null) {
968
+ const registry = this.toolOutputRegistry;
969
+ for (const call of postHookCalls) {
970
+ const args = call.args;
971
+ if (args == null)
972
+ continue;
973
+ try {
974
+ const { resolved } = registry.resolve(runId, args);
975
+ call.args = resolved;
976
+ }
977
+ catch {
978
+ /* leave args untouched on resolver failure */
979
+ }
980
+ }
981
+ }
982
+ const requests = postHookCalls.map((call) => {
702
983
  const turn = this.toolUsageCount.get(call.name) ?? 0;
703
984
  this.toolUsageCount.set(call.name, turn + 1);
704
985
  // Recover truncated args from streaming buffer (same as runTool path)
@@ -733,7 +1014,77 @@ class ToolNode extends run.RunnableCallable {
733
1014
  events.safeDispatchCustomEvent(_enum.GraphEvents.ON_TOOL_EXECUTE, request, config);
734
1015
  });
735
1016
  this.storeCodeSessionFromResults(results, requests);
736
- const eventMessages = results.map((result) => {
1017
+ const injected = [];
1018
+ for (const result of results) {
1019
+ if (result.injectedMessages && result.injectedMessages.length > 0) {
1020
+ try {
1021
+ injected.push(...this.convertInjectedMessages(result.injectedMessages));
1022
+ }
1023
+ catch (e) {
1024
+ // eslint-disable-next-line no-console
1025
+ console.warn(`[ToolNode] Failed to convert injectedMessages for toolCallId=${result.toolCallId}:`, e instanceof Error ? e.message : e);
1026
+ }
1027
+ }
1028
+ }
1029
+ /**
1030
+ * Fire PostToolUse / PostToolUseFailure hooks after results are in.
1031
+ * These run in parallel and never block the return — failures are
1032
+ * swallowed so a hook bug can't masquerade as a tool failure.
1033
+ */
1034
+ if (runId != null && this.hookRegistry != null) {
1035
+ const hasPost = this.hookRegistry.hasHookFor('PostToolUse', runId);
1036
+ const hasFail = this.hookRegistry.hasHookFor('PostToolUseFailure', runId);
1037
+ if (hasPost || hasFail) {
1038
+ const postPromises = [];
1039
+ for (const result of results) {
1040
+ const request = requests.find((r) => r.id === result.toolCallId);
1041
+ if (!request)
1042
+ continue;
1043
+ if (result.status === 'success' && hasPost) {
1044
+ postPromises.push(executeHooks.executeHooks({
1045
+ registry: this.hookRegistry,
1046
+ input: {
1047
+ hook_event_name: 'PostToolUse',
1048
+ runId,
1049
+ threadId,
1050
+ agentId: this.agentId,
1051
+ toolName: request.name,
1052
+ toolInput: request.args,
1053
+ toolOutput: result.content,
1054
+ toolUseId: result.toolCallId,
1055
+ stepId: this.toolCallStepIds?.get(result.toolCallId),
1056
+ turn: request.turn,
1057
+ },
1058
+ sessionId: runId,
1059
+ matchQuery: request.name,
1060
+ }).catch(() => undefined));
1061
+ }
1062
+ else if (result.status === 'error' && hasFail) {
1063
+ postPromises.push(executeHooks.executeHooks({
1064
+ registry: this.hookRegistry,
1065
+ input: {
1066
+ hook_event_name: 'PostToolUseFailure',
1067
+ runId,
1068
+ threadId,
1069
+ agentId: this.agentId,
1070
+ toolName: request.name,
1071
+ toolInput: request.args,
1072
+ toolUseId: result.toolCallId,
1073
+ error: result.errorMessage ?? 'Unknown error',
1074
+ stepId: this.toolCallStepIds?.get(result.toolCallId),
1075
+ turn: request.turn,
1076
+ },
1077
+ sessionId: runId,
1078
+ matchQuery: request.name,
1079
+ }).catch(() => undefined));
1080
+ }
1081
+ }
1082
+ if (postPromises.length > 0) {
1083
+ await Promise.all(postPromises);
1084
+ }
1085
+ }
1086
+ }
1087
+ const eventMessages = results.map((result, idx) => {
737
1088
  const request = requests.find((r) => r.id === result.toolCallId);
738
1089
  const toolName = request?.name ?? 'unknown';
739
1090
  const stepId = this.toolCallStepIds?.get(result.toolCallId) ?? '';
@@ -759,12 +1110,40 @@ class ToolNode extends run.RunnableCallable {
759
1110
  typeof result.content === 'string'
760
1111
  ? result.content
761
1112
  : JSON.stringify(result.content);
1113
+ /**
1114
+ * Tool output reference — lazy annotation (PRs #114 + #117).
1115
+ * Register the raw output under `tool<idx>turn<turn>` in the
1116
+ * registry but leave `ToolMessage.content` clean. Stamp the ref
1117
+ * metadata into `additional_kwargs` instead. The lazy
1118
+ * `annotateMessagesForLLM` transform applies the visible
1119
+ * `[ref: …]` / `_ref` annotation only on the transient copy sent
1120
+ * to the model. Persisted message stays unannotated so
1121
+ * conversation exports / pruning / token accounting stay clean.
1122
+ */
1123
+ const additionalKwargs = {};
1124
+ if (this.toolOutputRegistry != null && runId != null) {
1125
+ try {
1126
+ const refKey = toolOutputReferences.buildReferenceKey(idx, batchTurn);
1127
+ this.toolOutputRegistry.set(runId, refKey, contentString);
1128
+ const meta = {
1129
+ _refKey: refKey,
1130
+ _refScope: runId,
1131
+ };
1132
+ Object.assign(additionalKwargs, meta);
1133
+ }
1134
+ catch {
1135
+ /* registry store failure is non-fatal — message stays clean, no annotation */
1136
+ }
1137
+ }
762
1138
  toolMessage = new messages.ToolMessage({
763
1139
  status: 'success',
764
1140
  name: toolName,
765
1141
  content: contentString,
766
1142
  artifact: result.artifact,
767
1143
  tool_call_id: result.toolCallId,
1144
+ additional_kwargs: Object.keys(additionalKwargs).length > 0
1145
+ ? additionalKwargs
1146
+ : undefined,
768
1147
  });
769
1148
  }
770
1149
  const tool_call = {
@@ -787,7 +1166,14 @@ class ToolNode extends run.RunnableCallable {
787
1166
  events.safeDispatchCustomEvent(_enum.GraphEvents.ON_RUN_STEP_COMPLETED, runStepCompletedData, config);
788
1167
  return toolMessage;
789
1168
  });
790
- return [...denialMessages, ...eventMessages];
1169
+ return {
1170
+ toolMessages: [
1171
+ ...denialMessages,
1172
+ ...hookDenialMessages,
1173
+ ...eventMessages,
1174
+ ],
1175
+ injected,
1176
+ };
791
1177
  }
792
1178
  /**
793
1179
  * Execute all tool calls via ON_TOOL_EXECUTE event dispatch.
@@ -796,19 +1182,42 @@ class ToolNode extends run.RunnableCallable {
796
1182
  async executeViaEvent(toolCalls, config,
797
1183
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
798
1184
  input) {
799
- const outputs = await this.dispatchToolEvents(toolCalls, config);
1185
+ const { toolMessages, injected } = await this.dispatchToolEvents(toolCalls, config);
1186
+ const outputs = [...toolMessages, ...injected];
800
1187
  return (Array.isArray(input) ? outputs : { messages: outputs });
801
1188
  }
802
1189
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
803
1190
  async run(input, config) {
804
1191
  this.toolCallTurns.clear();
1192
+ /**
1193
+ * Per-batch local map for resolved (post-substitution) args. Lives
1194
+ * on the stack so concurrent `run()` calls on the same ToolNode
1195
+ * cannot read or wipe each other's entries.
1196
+ */
1197
+ const resolvedArgsByCallId = new Map();
1198
+ /**
1199
+ * Claim this batch's turn synchronously from the registry (or fall
1200
+ * back to 0 when the feature is disabled). For anonymous callers
1201
+ * (no `run_id` in config), mint a unique per-batch scope id so two
1202
+ * concurrent anonymous invocations don't target the same bucket.
1203
+ */
1204
+ const incomingRunId = config.configurable?.run_id;
1205
+ const batchScopeId = incomingRunId ?? `\0anon-${this.anonBatchCounter++}`;
1206
+ const batchTurn = this.toolOutputRegistry?.nextTurn(batchScopeId) ?? 0;
805
1207
  let outputs;
806
1208
  if (this.isSendInput(input)) {
807
1209
  const isDirectTool = this.directToolNames?.has(input.lg_tool_call.name);
808
1210
  if (this.eventDrivenMode && isDirectTool !== true) {
809
1211
  return this.executeViaEvent([input.lg_tool_call], config, input);
810
1212
  }
811
- outputs = [await this.runTool(input.lg_tool_call, config)];
1213
+ outputs = [
1214
+ await this.runTool(input.lg_tool_call, config, {
1215
+ batchIndex: 0,
1216
+ turn: batchTurn,
1217
+ batchScopeId,
1218
+ resolvedArgsByCallId,
1219
+ }),
1220
+ ];
812
1221
  this.handleRunToolCompletions([input.lg_tool_call], outputs, config);
813
1222
  }
814
1223
  else {
@@ -859,21 +1268,38 @@ class ToolNode extends run.RunnableCallable {
859
1268
  const directCalls = filteredCalls.filter((c) => this.directToolNames.has(c.name));
860
1269
  const eventCalls = filteredCalls.filter((c) => !this.directToolNames.has(c.name));
861
1270
  // Run direct tools and event tools in parallel — they are independent
862
- const [directOutputs, eventOutputs] = (await Promise.all([
1271
+ const [directOutputs, eventDispatch] = (await Promise.all([
863
1272
  directCalls.length > 0
864
- ? Promise.all(directCalls.map((call) => this.runTool(call, config)))
1273
+ ? Promise.all(directCalls.map((call, idx) => this.runTool(call, config, {
1274
+ batchIndex: idx,
1275
+ turn: batchTurn,
1276
+ batchScopeId,
1277
+ resolvedArgsByCallId,
1278
+ })))
865
1279
  : [],
866
1280
  eventCalls.length > 0
867
1281
  ? this.dispatchToolEvents(eventCalls, config)
868
- : [],
1282
+ : { toolMessages: [], injected: [] },
869
1283
  ]));
870
1284
  if (directCalls.length > 0 && directOutputs.length > 0) {
871
1285
  this.handleRunToolCompletions(directCalls, directOutputs, config);
872
1286
  }
873
- outputs = [...directOutputs, ...eventOutputs];
1287
+ // Injected messages MUST follow ToolMessages so the AIMessage
1288
+ // tool_calls -> ToolMessage adjacency required by some providers
1289
+ // is preserved.
1290
+ outputs = [
1291
+ ...directOutputs,
1292
+ ...eventDispatch.toolMessages,
1293
+ ...eventDispatch.injected,
1294
+ ];
874
1295
  }
875
1296
  else {
876
- outputs = await Promise.all(filteredCalls.map((call) => this.runTool(call, config)));
1297
+ outputs = await Promise.all(filteredCalls.map((call, idx) => this.runTool(call, config, {
1298
+ batchIndex: idx,
1299
+ turn: batchTurn,
1300
+ batchScopeId,
1301
+ resolvedArgsByCallId,
1302
+ })));
877
1303
  this.handleRunToolCompletions(filteredCalls, outputs, config);
878
1304
  }
879
1305
  }