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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (653) hide show
  1. package/README.md +62 -0
  2. package/dist/cjs/agents/AgentContext.cjs +274 -67
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  4. package/dist/cjs/common/enum.cjs +44 -13
  5. package/dist/cjs/common/enum.cjs.map +1 -1
  6. package/dist/cjs/graphs/Graph.cjs +182 -5
  7. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  8. package/dist/cjs/graphs/MultiAgentGraph.cjs +152 -1167
  9. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  10. package/dist/cjs/graphs/phases/memoryFlushPhase.cjs +1 -1
  11. package/dist/cjs/graphs/phases/memoryFlushPhase.cjs.map +1 -1
  12. package/dist/cjs/hooks/HookRegistry.cjs +162 -0
  13. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -0
  14. package/dist/cjs/hooks/executeHooks.cjs +276 -0
  15. package/dist/cjs/hooks/executeHooks.cjs.map +1 -0
  16. package/dist/cjs/hooks/matchers.cjs +256 -0
  17. package/dist/cjs/hooks/matchers.cjs.map +1 -0
  18. package/dist/cjs/hooks/types.cjs +27 -0
  19. package/dist/cjs/hooks/types.cjs.map +1 -0
  20. package/dist/cjs/langchain/google-common.cjs +3 -0
  21. package/dist/cjs/langchain/google-common.cjs.map +1 -0
  22. package/dist/cjs/langchain/index.cjs +86 -0
  23. package/dist/cjs/langchain/index.cjs.map +1 -0
  24. package/dist/cjs/langchain/language_models/chat_models.cjs +3 -0
  25. package/dist/cjs/langchain/language_models/chat_models.cjs.map +1 -0
  26. package/dist/cjs/langchain/messages/tool.cjs +3 -0
  27. package/dist/cjs/langchain/messages/tool.cjs.map +1 -0
  28. package/dist/cjs/langchain/messages.cjs +51 -0
  29. package/dist/cjs/langchain/messages.cjs.map +1 -0
  30. package/dist/cjs/langchain/openai.cjs +3 -0
  31. package/dist/cjs/langchain/openai.cjs.map +1 -0
  32. package/dist/cjs/langchain/prompts.cjs +11 -0
  33. package/dist/cjs/langchain/prompts.cjs.map +1 -0
  34. package/dist/cjs/langchain/runnables.cjs +19 -0
  35. package/dist/cjs/langchain/runnables.cjs.map +1 -0
  36. package/dist/cjs/langchain/tools.cjs +23 -0
  37. package/dist/cjs/langchain/tools.cjs.map +1 -0
  38. package/dist/cjs/langchain/utils/env.cjs +11 -0
  39. package/dist/cjs/langchain/utils/env.cjs.map +1 -0
  40. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +5 -1
  41. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  42. package/dist/cjs/llm/bedrock/cacheSupport.cjs +55 -0
  43. package/dist/cjs/llm/bedrock/cacheSupport.cjs.map +1 -0
  44. package/dist/cjs/llm/bedrock/index.cjs +61 -33
  45. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  46. package/dist/cjs/llm/openai/index.cjs +1 -4
  47. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  48. package/dist/cjs/llm/openai/utils/index.cjs +27 -10
  49. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  50. package/dist/cjs/main.cjs +178 -127
  51. package/dist/cjs/main.cjs.map +1 -1
  52. package/dist/cjs/memory/citations.cjs +4 -4
  53. package/dist/cjs/memory/citations.cjs.map +1 -1
  54. package/dist/cjs/memory/constants.cjs +17 -17
  55. package/dist/cjs/memory/constants.cjs.map +1 -1
  56. package/dist/cjs/memory/mmr.cjs +1 -1
  57. package/dist/cjs/memory/mmr.cjs.map +1 -1
  58. package/dist/cjs/memory/paths.cjs +1 -1
  59. package/dist/cjs/memory/paths.cjs.map +1 -1
  60. package/dist/cjs/memory/recallTracking.cjs +3 -3
  61. package/dist/cjs/memory/recallTracking.cjs.map +1 -1
  62. package/dist/cjs/memory/temporalDecay.cjs +2 -2
  63. package/dist/cjs/memory/temporalDecay.cjs.map +1 -1
  64. package/dist/cjs/messages/cache.cjs +89 -0
  65. package/dist/cjs/messages/cache.cjs.map +1 -1
  66. package/dist/cjs/messages/contextPruning.cjs +156 -0
  67. package/dist/cjs/messages/contextPruning.cjs.map +1 -0
  68. package/dist/cjs/messages/contextPruningSettings.cjs +53 -0
  69. package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -0
  70. package/dist/cjs/messages/format.cjs +144 -20
  71. package/dist/cjs/messages/format.cjs.map +1 -1
  72. package/dist/cjs/messages/prune.cjs +505 -4
  73. package/dist/cjs/messages/prune.cjs.map +1 -1
  74. package/dist/cjs/run.cjs +141 -1
  75. package/dist/cjs/run.cjs.map +1 -1
  76. package/dist/cjs/tools/BashExecutor.cjs +235 -0
  77. package/dist/cjs/tools/BashExecutor.cjs.map +1 -0
  78. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +297 -0
  79. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -0
  80. package/dist/cjs/tools/CodeExecutor.cjs +45 -47
  81. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  82. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +16 -11
  83. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  84. package/dist/cjs/tools/ReadFile.cjs +44 -0
  85. package/dist/cjs/tools/ReadFile.cjs.map +1 -0
  86. package/dist/cjs/tools/SkillTool.cjs +51 -0
  87. package/dist/cjs/tools/SkillTool.cjs.map +1 -0
  88. package/dist/cjs/tools/SubagentTool.cjs +93 -0
  89. package/dist/cjs/tools/SubagentTool.cjs.map +1 -0
  90. package/dist/cjs/tools/ToolNode.cjs +450 -24
  91. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  92. package/dist/cjs/tools/memory/memoryAppendTool.cjs +1 -1
  93. package/dist/cjs/tools/memory/memoryAppendTool.cjs.map +1 -1
  94. package/dist/cjs/tools/memory/memoryGetTool.cjs +2 -2
  95. package/dist/cjs/tools/memory/memoryGetTool.cjs.map +1 -1
  96. package/dist/cjs/tools/memory/memorySearchTool.cjs +3 -3
  97. package/dist/cjs/tools/memory/memorySearchTool.cjs.map +1 -1
  98. package/dist/cjs/tools/memory/shared.cjs +1 -1
  99. package/dist/cjs/tools/memory/shared.cjs.map +1 -1
  100. package/dist/cjs/tools/search/search.cjs +11 -3
  101. package/dist/cjs/tools/search/search.cjs.map +1 -1
  102. package/dist/cjs/tools/search/tavily-scraper.cjs +189 -0
  103. package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -0
  104. package/dist/cjs/tools/search/tavily-search.cjs +372 -0
  105. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -0
  106. package/dist/cjs/tools/search/tool.cjs +28 -4
  107. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  108. package/dist/cjs/tools/search/utils.cjs +10 -3
  109. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  110. package/dist/cjs/tools/skillCatalog.cjs +84 -0
  111. package/dist/cjs/tools/skillCatalog.cjs.map +1 -0
  112. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +512 -0
  113. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -0
  114. package/dist/cjs/tools/toolOutputReferences.cjs +670 -0
  115. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -0
  116. package/dist/cjs/types/agent-cache.cjs +54 -0
  117. package/dist/cjs/types/agent-cache.cjs.map +1 -0
  118. package/dist/cjs/types/graph.cjs.map +1 -1
  119. package/dist/cjs/utils/truncation.cjs +135 -0
  120. package/dist/cjs/utils/truncation.cjs.map +1 -0
  121. package/dist/esm/agents/AgentContext.mjs +274 -67
  122. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  123. package/dist/esm/common/enum.mjs +44 -12
  124. package/dist/esm/common/enum.mjs.map +1 -1
  125. package/dist/esm/graphs/Graph.mjs +182 -5
  126. package/dist/esm/graphs/Graph.mjs.map +1 -1
  127. package/dist/esm/graphs/MultiAgentGraph.mjs +155 -1170
  128. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  129. package/dist/esm/graphs/phases/memoryFlushPhase.mjs +1 -1
  130. package/dist/esm/graphs/phases/memoryFlushPhase.mjs.map +1 -1
  131. package/dist/esm/hooks/HookRegistry.mjs +160 -0
  132. package/dist/esm/hooks/HookRegistry.mjs.map +1 -0
  133. package/dist/esm/hooks/executeHooks.mjs +273 -0
  134. package/dist/esm/hooks/executeHooks.mjs.map +1 -0
  135. package/dist/esm/hooks/matchers.mjs +251 -0
  136. package/dist/esm/hooks/matchers.mjs.map +1 -0
  137. package/dist/esm/hooks/types.mjs +25 -0
  138. package/dist/esm/hooks/types.mjs.map +1 -0
  139. package/dist/esm/langchain/google-common.mjs +2 -0
  140. package/dist/esm/langchain/google-common.mjs.map +1 -0
  141. package/dist/esm/langchain/index.mjs +5 -0
  142. package/dist/esm/langchain/language_models/chat_models.mjs +2 -0
  143. package/dist/esm/langchain/language_models/chat_models.mjs.map +1 -0
  144. package/dist/esm/langchain/messages/tool.mjs +2 -0
  145. package/dist/esm/langchain/messages/tool.mjs.map +1 -0
  146. package/dist/esm/langchain/messages.mjs +2 -0
  147. package/dist/esm/langchain/messages.mjs.map +1 -0
  148. package/dist/esm/langchain/openai.mjs +2 -0
  149. package/dist/esm/langchain/openai.mjs.map +1 -0
  150. package/dist/esm/langchain/prompts.mjs +2 -0
  151. package/dist/esm/langchain/prompts.mjs.map +1 -0
  152. package/dist/esm/langchain/runnables.mjs +2 -0
  153. package/dist/esm/langchain/runnables.mjs.map +1 -0
  154. package/dist/esm/langchain/tools.mjs +2 -0
  155. package/dist/esm/langchain/tools.mjs.map +1 -0
  156. package/dist/esm/langchain/utils/env.mjs +2 -0
  157. package/dist/esm/langchain/utils/env.mjs.map +1 -0
  158. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +5 -1
  159. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  160. package/dist/esm/llm/bedrock/cacheSupport.mjs +52 -0
  161. package/dist/esm/llm/bedrock/cacheSupport.mjs.map +1 -0
  162. package/dist/esm/llm/bedrock/index.mjs +61 -34
  163. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  164. package/dist/esm/llm/openai/index.mjs +1 -4
  165. package/dist/esm/llm/openai/index.mjs.map +1 -1
  166. package/dist/esm/llm/openai/utils/index.mjs +27 -10
  167. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  168. package/dist/esm/main.mjs +21 -27
  169. package/dist/esm/main.mjs.map +1 -1
  170. package/dist/esm/memory/citations.mjs +4 -4
  171. package/dist/esm/memory/citations.mjs.map +1 -1
  172. package/dist/esm/memory/constants.mjs +17 -17
  173. package/dist/esm/memory/constants.mjs.map +1 -1
  174. package/dist/esm/memory/mmr.mjs +1 -1
  175. package/dist/esm/memory/mmr.mjs.map +1 -1
  176. package/dist/esm/memory/paths.mjs +1 -1
  177. package/dist/esm/memory/paths.mjs.map +1 -1
  178. package/dist/esm/memory/recallTracking.mjs +3 -3
  179. package/dist/esm/memory/recallTracking.mjs.map +1 -1
  180. package/dist/esm/memory/temporalDecay.mjs +2 -2
  181. package/dist/esm/memory/temporalDecay.mjs.map +1 -1
  182. package/dist/esm/messages/cache.mjs +89 -0
  183. package/dist/esm/messages/cache.mjs.map +1 -1
  184. package/dist/esm/messages/contextPruning.mjs +154 -0
  185. package/dist/esm/messages/contextPruning.mjs.map +1 -0
  186. package/dist/esm/messages/contextPruningSettings.mjs +50 -0
  187. package/dist/esm/messages/contextPruningSettings.mjs.map +1 -0
  188. package/dist/esm/messages/format.mjs +136 -12
  189. package/dist/esm/messages/format.mjs.map +1 -1
  190. package/dist/esm/messages/prune.mjs +504 -7
  191. package/dist/esm/messages/prune.mjs.map +1 -1
  192. package/dist/esm/run.mjs +141 -1
  193. package/dist/esm/run.mjs.map +1 -1
  194. package/dist/esm/tools/BashExecutor.mjs +227 -0
  195. package/dist/esm/tools/BashExecutor.mjs.map +1 -0
  196. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +288 -0
  197. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -0
  198. package/dist/esm/tools/CodeExecutor.mjs +45 -48
  199. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  200. package/dist/esm/tools/ProgrammaticToolCalling.mjs +17 -12
  201. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  202. package/dist/esm/tools/ReadFile.mjs +39 -0
  203. package/dist/esm/tools/ReadFile.mjs.map +1 -0
  204. package/dist/esm/tools/SkillTool.mjs +46 -0
  205. package/dist/esm/tools/SkillTool.mjs.map +1 -0
  206. package/dist/esm/tools/SubagentTool.mjs +86 -0
  207. package/dist/esm/tools/SubagentTool.mjs.map +1 -0
  208. package/dist/esm/tools/ToolNode.mjs +452 -26
  209. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  210. package/dist/esm/tools/memory/memoryAppendTool.mjs +1 -1
  211. package/dist/esm/tools/memory/memoryAppendTool.mjs.map +1 -1
  212. package/dist/esm/tools/memory/memoryGetTool.mjs +2 -2
  213. package/dist/esm/tools/memory/memoryGetTool.mjs.map +1 -1
  214. package/dist/esm/tools/memory/memorySearchTool.mjs +3 -3
  215. package/dist/esm/tools/memory/memorySearchTool.mjs.map +1 -1
  216. package/dist/esm/tools/memory/shared.mjs +1 -1
  217. package/dist/esm/tools/memory/shared.mjs.map +1 -1
  218. package/dist/esm/tools/search/search.mjs +11 -3
  219. package/dist/esm/tools/search/search.mjs.map +1 -1
  220. package/dist/esm/tools/search/tavily-scraper.mjs +186 -0
  221. package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -0
  222. package/dist/esm/tools/search/tavily-search.mjs +370 -0
  223. package/dist/esm/tools/search/tavily-search.mjs.map +1 -0
  224. package/dist/esm/tools/search/tool.mjs +28 -4
  225. package/dist/esm/tools/search/tool.mjs.map +1 -1
  226. package/dist/esm/tools/search/utils.mjs +10 -3
  227. package/dist/esm/tools/search/utils.mjs.map +1 -1
  228. package/dist/esm/tools/skillCatalog.mjs +82 -0
  229. package/dist/esm/tools/skillCatalog.mjs.map +1 -0
  230. package/dist/esm/tools/subagent/SubagentExecutor.mjs +506 -0
  231. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -0
  232. package/dist/esm/tools/toolOutputReferences.mjs +662 -0
  233. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -0
  234. package/dist/esm/types/agent-cache.mjs +52 -0
  235. package/dist/esm/types/agent-cache.mjs.map +1 -0
  236. package/dist/esm/types/graph.mjs.map +1 -1
  237. package/dist/esm/utils/truncation.mjs +128 -0
  238. package/dist/esm/utils/truncation.mjs.map +1 -0
  239. package/dist/types/agents/AgentContext.d.ts +101 -8
  240. package/dist/types/common/enum.d.ts +39 -12
  241. package/dist/types/common/index.d.ts +0 -1
  242. package/dist/types/graphs/Graph.d.ts +43 -0
  243. package/dist/types/graphs/MultiAgentGraph.d.ts +26 -150
  244. package/dist/types/graphs/index.d.ts +0 -1
  245. package/dist/types/graphs/phases/memoryFlushPhase.d.ts +2 -2
  246. package/dist/types/hooks/HookRegistry.d.ts +56 -0
  247. package/dist/types/hooks/executeHooks.d.ts +79 -0
  248. package/dist/types/hooks/index.d.ts +6 -0
  249. package/dist/types/hooks/matchers.d.ts +95 -0
  250. package/dist/types/hooks/types.d.ts +320 -0
  251. package/dist/types/index.d.ts +9 -9
  252. package/dist/types/langchain/google-common.d.ts +1 -0
  253. package/dist/types/langchain/index.d.ts +8 -0
  254. package/dist/types/langchain/language_models/chat_models.d.ts +1 -0
  255. package/dist/types/langchain/messages/tool.d.ts +1 -0
  256. package/dist/types/langchain/messages.d.ts +2 -0
  257. package/dist/types/langchain/openai.d.ts +1 -0
  258. package/dist/types/langchain/prompts.d.ts +1 -0
  259. package/dist/types/langchain/runnables.d.ts +2 -0
  260. package/dist/types/langchain/tools.d.ts +2 -0
  261. package/dist/types/langchain/utils/env.d.ts +1 -0
  262. package/dist/types/llm/bedrock/cacheSupport.d.ts +35 -0
  263. package/dist/types/llm/bedrock/index.d.ts +54 -1
  264. package/dist/types/llm/openai/index.d.ts +1 -1
  265. package/dist/types/memory/citations.d.ts +4 -4
  266. package/dist/types/memory/constants.d.ts +17 -17
  267. package/dist/types/memory/mmr.d.ts +3 -3
  268. package/dist/types/memory/paths.d.ts +1 -1
  269. package/dist/types/memory/temporalDecay.d.ts +2 -2
  270. package/dist/types/memory/types.d.ts +3 -3
  271. package/dist/types/messages/contextPruning.d.ts +42 -0
  272. package/dist/types/messages/contextPruningSettings.d.ts +44 -0
  273. package/dist/types/messages/format.d.ts +9 -1
  274. package/dist/types/messages/index.d.ts +2 -0
  275. package/dist/types/messages/prune.d.ts +91 -1
  276. package/dist/types/run.d.ts +2 -0
  277. package/dist/types/tools/BashExecutor.d.ts +76 -0
  278. package/dist/types/tools/BashProgrammaticToolCalling.d.ts +72 -0
  279. package/dist/types/tools/CodeExecutor.d.ts +8 -26
  280. package/dist/types/tools/ReadFile.d.ts +28 -0
  281. package/dist/types/tools/SkillTool.d.ts +40 -0
  282. package/dist/types/tools/SubagentTool.d.ts +36 -0
  283. package/dist/types/tools/ToolNode.d.ts +77 -5
  284. package/dist/types/tools/memory/shared.d.ts +1 -1
  285. package/dist/types/tools/search/tavily-scraper.d.ts +19 -0
  286. package/dist/types/tools/search/tavily-search.d.ts +4 -0
  287. package/dist/types/tools/search/types.d.ts +99 -5
  288. package/dist/types/tools/search/utils.d.ts +2 -2
  289. package/dist/types/tools/skillCatalog.d.ts +19 -0
  290. package/dist/types/tools/subagent/SubagentExecutor.d.ts +137 -0
  291. package/dist/types/tools/subagent/index.d.ts +2 -0
  292. package/dist/types/tools/subagent/types.d.ts +84 -0
  293. package/dist/types/tools/toolOutputReferences.d.ts +236 -0
  294. package/dist/types/types/agent-cache.d.ts +71 -0
  295. package/dist/types/types/graph.d.ts +163 -22
  296. package/dist/types/types/index.d.ts +3 -0
  297. package/dist/types/types/messages.d.ts +26 -0
  298. package/dist/types/types/run.d.ts +22 -0
  299. package/dist/types/types/skill.d.ts +9 -0
  300. package/dist/types/types/tools.d.ts +111 -0
  301. package/dist/types/utils/index.d.ts +1 -3
  302. package/dist/types/utils/truncation.d.ts +70 -0
  303. package/package.json +57 -17
  304. package/src/agents/AgentContext.ts +321 -78
  305. package/src/agents/__tests__/AgentContext.cacheTtl.live.test.ts +259 -0
  306. package/src/agents/__tests__/AgentContext.crossAgentTier1.live.test.ts +266 -0
  307. package/src/agents/__tests__/AgentContext.crossUserCache.live.test.ts +342 -0
  308. package/src/agents/__tests__/AgentContext.test.ts +632 -0
  309. package/src/common/__tests__/enum.test.ts +7 -17
  310. package/src/common/enum.ts +43 -12
  311. package/src/common/index.ts +0 -1
  312. package/src/graphs/Graph.ts +222 -2
  313. package/src/graphs/MultiAgentGraph.ts +154 -1466
  314. package/src/graphs/__tests__/MultiAgentGraph.test.ts +91 -0
  315. package/src/graphs/gapFeatures.test.ts +1 -1
  316. package/src/graphs/index.ts +0 -1
  317. package/src/graphs/phases/__tests__/memoryFlushPhase.test.ts +1 -1
  318. package/src/graphs/phases/memoryFlushPhase.ts +2 -2
  319. package/src/hooks/HookRegistry.ts +208 -0
  320. package/src/hooks/__tests__/HookRegistry.test.ts +190 -0
  321. package/src/hooks/__tests__/compactHooks.test.ts +214 -0
  322. package/src/hooks/__tests__/executeHooks.test.ts +1013 -0
  323. package/src/hooks/__tests__/integration.test.ts +337 -0
  324. package/src/hooks/__tests__/matchers.test.ts +238 -0
  325. package/src/hooks/__tests__/toolHooks.test.ts +665 -0
  326. package/src/hooks/executeHooks.ts +375 -0
  327. package/src/hooks/index.ts +57 -0
  328. package/src/hooks/matchers.ts +280 -0
  329. package/src/hooks/types.ts +404 -0
  330. package/src/index.ts +15 -24
  331. package/src/langchain/google-common.ts +1 -0
  332. package/src/langchain/index.ts +8 -0
  333. package/src/langchain/language_models/chat_models.ts +1 -0
  334. package/src/langchain/messages/tool.ts +5 -0
  335. package/src/langchain/messages.ts +21 -0
  336. package/src/langchain/openai.ts +1 -0
  337. package/src/langchain/prompts.ts +1 -0
  338. package/src/langchain/runnables.ts +7 -0
  339. package/src/langchain/tools.ts +8 -0
  340. package/src/langchain/utils/env.ts +1 -0
  341. package/src/llm/anthropic/utils/message_inputs.ts +10 -1
  342. package/src/llm/anthropic/utils/server-tool-inputs.test.ts +436 -0
  343. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +166 -18
  344. package/src/llm/bedrock/cacheSupport.test.ts +99 -0
  345. package/src/llm/bedrock/cacheSupport.ts +53 -0
  346. package/src/llm/bedrock/index.ts +116 -41
  347. package/src/llm/openai/index.ts +2 -2
  348. package/src/llm/openai/utils/index.ts +31 -14
  349. package/src/memory/citations.ts +4 -4
  350. package/src/memory/constants.ts +17 -17
  351. package/src/memory/mmr.ts +3 -3
  352. package/src/memory/paths.ts +1 -1
  353. package/src/memory/recallTracking.ts +3 -3
  354. package/src/memory/temporalDecay.ts +2 -2
  355. package/src/memory/types.ts +3 -3
  356. package/src/messages/__tests__/contextPruning.test.ts +228 -0
  357. package/src/messages/cache.test.ts +62 -24
  358. package/src/messages/cache.ts +112 -0
  359. package/src/messages/contextPruning.ts +191 -0
  360. package/src/messages/contextPruningSettings.ts +90 -0
  361. package/src/messages/ensureThinkingBlock.test.ts +1 -1
  362. package/src/messages/format.ts +164 -12
  363. package/src/messages/formatAgentMessages.skills.test.ts +413 -0
  364. package/src/messages/formatAgentMessages.test.ts +1 -1
  365. package/src/messages/index.ts +2 -0
  366. package/src/messages/prune.ts +661 -4
  367. package/src/run.ts +155 -1
  368. package/src/scripts/multi-agent-chain.ts +2 -2
  369. package/src/scripts/multi-agent-document-review-chain.ts +2 -2
  370. package/src/scripts/multi-agent-hybrid-flow.ts +4 -4
  371. package/src/scripts/multi-agent-parallel.ts +3 -3
  372. package/src/scripts/multi-agent-sequence.ts +3 -3
  373. package/src/scripts/multi-agent-subagent.ts +246 -0
  374. package/src/scripts/multi-agent-supervisor.ts +5 -5
  375. package/src/scripts/poc-multi-agent-comprehensive.ts +8 -8
  376. package/src/scripts/sequential-full-metadata-test.ts +2 -2
  377. package/src/scripts/subagent-event-driven-debug.ts +190 -0
  378. package/src/scripts/subagent-tools-debug.ts +160 -0
  379. package/src/scripts/test-custom-prompt-key.ts +3 -3
  380. package/src/scripts/test-handoff-input.ts +1 -1
  381. package/src/scripts/test-handoff-steering.ts +3 -3
  382. package/src/scripts/test-multi-agent-list-handoff.ts +1 -1
  383. package/src/scripts/test-parallel-agent-labeling.ts +3 -3
  384. package/src/scripts/test-parallel-handoffs.ts +2 -2
  385. package/src/scripts/test-thinking-handoff-bedrock.ts +1 -1
  386. package/src/scripts/test-thinking-handoff.ts +1 -1
  387. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +1 -1
  388. package/src/scripts/test-tool-before-handoff-role-order.ts +1 -1
  389. package/src/scripts/test-tools-before-handoff.ts +1 -1
  390. package/src/specs/agent-handoffs.test.ts +26 -483
  391. package/src/specs/anthropic.simple.test.ts +61 -0
  392. package/src/specs/multi-agent-summarization.test.ts +396 -0
  393. package/src/specs/prune.orphans.test.ts +248 -0
  394. package/src/specs/prune.test.ts +104 -16
  395. package/src/specs/thinking-handoff.test.ts +19 -19
  396. package/src/tools/BashExecutor.ts +281 -0
  397. package/src/tools/BashProgrammaticToolCalling.ts +397 -0
  398. package/src/tools/CodeExecutor.ts +63 -54
  399. package/src/tools/ProgrammaticToolCalling.ts +29 -14
  400. package/src/tools/ReadFile.ts +39 -0
  401. package/src/tools/SkillTool.ts +46 -0
  402. package/src/tools/SubagentTool.ts +100 -0
  403. package/src/tools/ToolNode.ts +548 -26
  404. package/src/tools/__tests__/BashExecutor.test.ts +49 -0
  405. package/src/tools/__tests__/CodeExecutor.test.ts +37 -36
  406. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +60 -0
  407. package/src/tools/__tests__/ReadFile.test.ts +44 -0
  408. package/src/tools/__tests__/SkillTool.test.ts +442 -0
  409. package/src/tools/__tests__/SubagentExecutor.test.ts +1148 -0
  410. package/src/tools/__tests__/SubagentTool.test.ts +149 -0
  411. package/src/tools/__tests__/ToolNode.outputReferences.test.ts +1438 -0
  412. package/src/tools/__tests__/annotateMessagesForLLM.test.ts +479 -0
  413. package/src/tools/__tests__/skillCatalog.test.ts +161 -0
  414. package/src/tools/__tests__/subagentHooks.test.ts +210 -0
  415. package/src/tools/__tests__/toolOutputReferences.test.ts +415 -0
  416. package/src/tools/memory/memoryAppendTool.ts +1 -1
  417. package/src/tools/memory/memoryGetTool.ts +2 -2
  418. package/src/tools/memory/memorySearchTool.ts +3 -3
  419. package/src/tools/memory/shared.ts +1 -1
  420. package/src/tools/search/search.ts +12 -2
  421. package/src/tools/search/tavily-scraper.ts +235 -0
  422. package/src/tools/search/tavily-search.ts +424 -0
  423. package/src/tools/search/tavily.test.ts +965 -0
  424. package/src/tools/search/tool.ts +36 -2
  425. package/src/tools/search/types.ts +133 -8
  426. package/src/tools/search/utils.ts +13 -5
  427. package/src/tools/skillCatalog.ts +126 -0
  428. package/src/tools/subagent/SubagentExecutor.ts +676 -0
  429. package/src/tools/subagent/index.ts +13 -0
  430. package/src/tools/subagent/types.test.ts +70 -0
  431. package/src/tools/subagent/types.ts +115 -0
  432. package/src/tools/toolOutputReferences.ts +825 -0
  433. package/src/types/agent-cache.ts +74 -0
  434. package/src/types/graph.ts +172 -20
  435. package/src/types/index.ts +3 -0
  436. package/src/types/messages.ts +27 -0
  437. package/src/types/run.ts +22 -0
  438. package/src/types/skill.ts +11 -0
  439. package/src/types/tools.ts +118 -0
  440. package/src/utils/__tests__/truncation.test.ts +66 -0
  441. package/src/utils/index.ts +1 -3
  442. package/src/utils/truncation.ts +154 -0
  443. package/dist/cjs/common/spawnPath.cjs +0 -104
  444. package/dist/cjs/common/spawnPath.cjs.map +0 -1
  445. package/dist/cjs/content/ArtifactStore.cjs +0 -579
  446. package/dist/cjs/content/ArtifactStore.cjs.map +0 -1
  447. package/dist/cjs/content/ContentStore.cjs +0 -638
  448. package/dist/cjs/content/ContentStore.cjs.map +0 -1
  449. package/dist/cjs/content/contentAnalyzer.cjs +0 -91
  450. package/dist/cjs/content/contentAnalyzer.cjs.map +0 -1
  451. package/dist/cjs/content/index.cjs +0 -20
  452. package/dist/cjs/content/index.cjs.map +0 -1
  453. package/dist/cjs/content/mcpAutoCache.cjs +0 -115
  454. package/dist/cjs/content/mcpAutoCache.cjs.map +0 -1
  455. package/dist/cjs/graphs/HandoffRegistry.cjs +0 -143
  456. package/dist/cjs/graphs/HandoffRegistry.cjs.map +0 -1
  457. package/dist/cjs/providers/a2a/A2ACapabilityProvider.cjs +0 -288
  458. package/dist/cjs/providers/a2a/A2ACapabilityProvider.cjs.map +0 -1
  459. package/dist/cjs/providers/a2a/client.cjs +0 -92
  460. package/dist/cjs/providers/a2a/client.cjs.map +0 -1
  461. package/dist/cjs/providers/a2a/config.cjs +0 -38
  462. package/dist/cjs/providers/a2a/config.cjs.map +0 -1
  463. package/dist/cjs/providers/capabilityNaming.cjs +0 -43
  464. package/dist/cjs/providers/capabilityNaming.cjs.map +0 -1
  465. package/dist/cjs/providers/mcp/MCPCapabilityProvider.cjs +0 -244
  466. package/dist/cjs/providers/mcp/MCPCapabilityProvider.cjs.map +0 -1
  467. package/dist/cjs/providers/mcp/config.cjs +0 -42
  468. package/dist/cjs/providers/mcp/config.cjs.map +0 -1
  469. package/dist/cjs/providers/mcp/transport.cjs +0 -65
  470. package/dist/cjs/providers/mcp/transport.cjs.map +0 -1
  471. package/dist/cjs/providers/tools-server/ToolsServerCapabilityProvider.cjs +0 -128
  472. package/dist/cjs/providers/tools-server/ToolsServerCapabilityProvider.cjs.map +0 -1
  473. package/dist/cjs/providers/types.cjs +0 -51
  474. package/dist/cjs/providers/types.cjs.map +0 -1
  475. package/dist/cjs/tools/artifacts/schema.cjs +0 -86
  476. package/dist/cjs/tools/artifacts/schema.cjs.map +0 -1
  477. package/dist/cjs/tools/artifacts/tool.cjs +0 -219
  478. package/dist/cjs/tools/artifacts/tool.cjs.map +0 -1
  479. package/dist/cjs/tools/fileSearch/formatter.cjs +0 -93
  480. package/dist/cjs/tools/fileSearch/formatter.cjs.map +0 -1
  481. package/dist/cjs/tools/fileSearch/ragClient.cjs +0 -102
  482. package/dist/cjs/tools/fileSearch/ragClient.cjs.map +0 -1
  483. package/dist/cjs/tools/fileSearch/schema.cjs +0 -18
  484. package/dist/cjs/tools/fileSearch/schema.cjs.map +0 -1
  485. package/dist/cjs/tools/fileSearch/tool.cjs +0 -155
  486. package/dist/cjs/tools/fileSearch/tool.cjs.map +0 -1
  487. package/dist/cjs/tools/proxyTool.cjs +0 -102
  488. package/dist/cjs/tools/proxyTool.cjs.map +0 -1
  489. package/dist/cjs/utils/childAgentContext.cjs +0 -242
  490. package/dist/cjs/utils/childAgentContext.cjs.map +0 -1
  491. package/dist/cjs/utils/credentials.cjs +0 -142
  492. package/dist/cjs/utils/credentials.cjs.map +0 -1
  493. package/dist/cjs/utils/httpClient.cjs +0 -74
  494. package/dist/cjs/utils/httpClient.cjs.map +0 -1
  495. package/dist/cjs/utils/toolManifest.cjs +0 -100
  496. package/dist/cjs/utils/toolManifest.cjs.map +0 -1
  497. package/dist/esm/common/spawnPath.mjs +0 -95
  498. package/dist/esm/common/spawnPath.mjs.map +0 -1
  499. package/dist/esm/content/ArtifactStore.mjs +0 -576
  500. package/dist/esm/content/ArtifactStore.mjs.map +0 -1
  501. package/dist/esm/content/ContentStore.mjs +0 -635
  502. package/dist/esm/content/ContentStore.mjs.map +0 -1
  503. package/dist/esm/content/contentAnalyzer.mjs +0 -87
  504. package/dist/esm/content/contentAnalyzer.mjs.map +0 -1
  505. package/dist/esm/content/index.mjs +0 -5
  506. package/dist/esm/content/mcpAutoCache.mjs +0 -111
  507. package/dist/esm/content/mcpAutoCache.mjs.map +0 -1
  508. package/dist/esm/graphs/HandoffRegistry.mjs +0 -141
  509. package/dist/esm/graphs/HandoffRegistry.mjs.map +0 -1
  510. package/dist/esm/providers/a2a/A2ACapabilityProvider.mjs +0 -281
  511. package/dist/esm/providers/a2a/A2ACapabilityProvider.mjs.map +0 -1
  512. package/dist/esm/providers/a2a/client.mjs +0 -88
  513. package/dist/esm/providers/a2a/client.mjs.map +0 -1
  514. package/dist/esm/providers/a2a/config.mjs +0 -35
  515. package/dist/esm/providers/a2a/config.mjs.map +0 -1
  516. package/dist/esm/providers/capabilityNaming.mjs +0 -39
  517. package/dist/esm/providers/capabilityNaming.mjs.map +0 -1
  518. package/dist/esm/providers/mcp/MCPCapabilityProvider.mjs +0 -240
  519. package/dist/esm/providers/mcp/MCPCapabilityProvider.mjs.map +0 -1
  520. package/dist/esm/providers/mcp/config.mjs +0 -39
  521. package/dist/esm/providers/mcp/config.mjs.map +0 -1
  522. package/dist/esm/providers/mcp/transport.mjs +0 -63
  523. package/dist/esm/providers/mcp/transport.mjs.map +0 -1
  524. package/dist/esm/providers/tools-server/ToolsServerCapabilityProvider.mjs +0 -126
  525. package/dist/esm/providers/tools-server/ToolsServerCapabilityProvider.mjs.map +0 -1
  526. package/dist/esm/providers/types.mjs +0 -51
  527. package/dist/esm/providers/types.mjs.map +0 -1
  528. package/dist/esm/tools/artifacts/schema.mjs +0 -79
  529. package/dist/esm/tools/artifacts/schema.mjs.map +0 -1
  530. package/dist/esm/tools/artifacts/tool.mjs +0 -213
  531. package/dist/esm/tools/artifacts/tool.mjs.map +0 -1
  532. package/dist/esm/tools/fileSearch/formatter.mjs +0 -90
  533. package/dist/esm/tools/fileSearch/formatter.mjs.map +0 -1
  534. package/dist/esm/tools/fileSearch/ragClient.mjs +0 -98
  535. package/dist/esm/tools/fileSearch/ragClient.mjs.map +0 -1
  536. package/dist/esm/tools/fileSearch/schema.mjs +0 -15
  537. package/dist/esm/tools/fileSearch/schema.mjs.map +0 -1
  538. package/dist/esm/tools/fileSearch/tool.mjs +0 -152
  539. package/dist/esm/tools/fileSearch/tool.mjs.map +0 -1
  540. package/dist/esm/tools/proxyTool.mjs +0 -100
  541. package/dist/esm/tools/proxyTool.mjs.map +0 -1
  542. package/dist/esm/utils/childAgentContext.mjs +0 -237
  543. package/dist/esm/utils/childAgentContext.mjs.map +0 -1
  544. package/dist/esm/utils/credentials.mjs +0 -135
  545. package/dist/esm/utils/credentials.mjs.map +0 -1
  546. package/dist/esm/utils/httpClient.mjs +0 -70
  547. package/dist/esm/utils/httpClient.mjs.map +0 -1
  548. package/dist/esm/utils/toolManifest.mjs +0 -96
  549. package/dist/esm/utils/toolManifest.mjs.map +0 -1
  550. package/dist/types/common/spawnPath.d.ts +0 -59
  551. package/dist/types/content/ArtifactStore.d.ts +0 -223
  552. package/dist/types/content/ContentStore.d.ts +0 -140
  553. package/dist/types/content/contentAnalyzer.d.ts +0 -38
  554. package/dist/types/content/index.d.ts +0 -24
  555. package/dist/types/content/mcpAutoCache.d.ts +0 -89
  556. package/dist/types/content/types.d.ts +0 -75
  557. package/dist/types/graphs/HandoffRegistry.d.ts +0 -97
  558. package/dist/types/providers/a2a/A2ACapabilityProvider.d.ts +0 -89
  559. package/dist/types/providers/a2a/client.d.ts +0 -47
  560. package/dist/types/providers/a2a/config.d.ts +0 -18
  561. package/dist/types/providers/a2a/index.d.ts +0 -6
  562. package/dist/types/providers/a2a/types.d.ts +0 -173
  563. package/dist/types/providers/capabilityNaming.d.ts +0 -25
  564. package/dist/types/providers/index.d.ts +0 -12
  565. package/dist/types/providers/mcp/MCPCapabilityProvider.d.ts +0 -54
  566. package/dist/types/providers/mcp/config.d.ts +0 -20
  567. package/dist/types/providers/mcp/index.d.ts +0 -5
  568. package/dist/types/providers/mcp/transport.d.ts +0 -18
  569. package/dist/types/providers/mcp/types.d.ts +0 -112
  570. package/dist/types/providers/tools-server/ToolsServerCapabilityProvider.d.ts +0 -59
  571. package/dist/types/providers/tools-server/index.d.ts +0 -1
  572. package/dist/types/providers/types.d.ts +0 -184
  573. package/dist/types/tools/artifacts/index.d.ts +0 -3
  574. package/dist/types/tools/artifacts/schema.d.ts +0 -63
  575. package/dist/types/tools/artifacts/tool.d.ts +0 -16
  576. package/dist/types/tools/artifacts/types.d.ts +0 -127
  577. package/dist/types/tools/fileSearch/formatter.d.ts +0 -25
  578. package/dist/types/tools/fileSearch/index.d.ts +0 -5
  579. package/dist/types/tools/fileSearch/ragClient.d.ts +0 -32
  580. package/dist/types/tools/fileSearch/schema.d.ts +0 -13
  581. package/dist/types/tools/fileSearch/tool.d.ts +0 -18
  582. package/dist/types/tools/fileSearch/types.d.ts +0 -139
  583. package/dist/types/tools/proxyTool.d.ts +0 -62
  584. package/dist/types/tools/search/test.d.ts +0 -1
  585. package/dist/types/utils/childAgentContext.d.ts +0 -99
  586. package/dist/types/utils/credentials.d.ts +0 -77
  587. package/dist/types/utils/httpClient.d.ts +0 -46
  588. package/dist/types/utils/toolManifest.d.ts +0 -49
  589. package/src/common/__tests__/spawnPath.test.ts +0 -110
  590. package/src/common/spawnPath.ts +0 -101
  591. package/src/content/ArtifactStore.ts +0 -782
  592. package/src/content/ContentStore.ts +0 -753
  593. package/src/content/contentAnalyzer.ts +0 -105
  594. package/src/content/index.ts +0 -51
  595. package/src/content/mcpAutoCache.ts +0 -185
  596. package/src/content/types.ts +0 -82
  597. package/src/graphs/HandoffRegistry.ts +0 -199
  598. package/src/graphs/__tests__/HandoffRegistry.test.ts +0 -410
  599. package/src/graphs/__tests__/multi-agent-delegate.test.ts +0 -458
  600. package/src/graphs/__tests__/multi-agent-edges.test.ts +0 -276
  601. package/src/graphs/__tests__/multi-agent-nested-subgraph.test.ts +0 -221
  602. package/src/graphs/handoffValidation.test.ts +0 -353
  603. package/src/providers/__tests__/ToolsServerCapabilityProvider.integration.spec.ts +0 -79
  604. package/src/providers/__tests__/ToolsServerCapabilityProvider.test.ts +0 -271
  605. package/src/providers/__tests__/types.test.ts +0 -64
  606. package/src/providers/a2a/A2ACapabilityProvider.ts +0 -384
  607. package/src/providers/a2a/__tests__/A2ACapabilityProvider.integration.spec.ts +0 -345
  608. package/src/providers/a2a/__tests__/A2ACapabilityProvider.test.ts +0 -460
  609. package/src/providers/a2a/client.ts +0 -115
  610. package/src/providers/a2a/config.ts +0 -40
  611. package/src/providers/a2a/index.ts +0 -29
  612. package/src/providers/a2a/types.ts +0 -191
  613. package/src/providers/capabilityNaming.ts +0 -42
  614. package/src/providers/index.ts +0 -68
  615. package/src/providers/mcp/MCPCapabilityProvider.ts +0 -345
  616. package/src/providers/mcp/__tests__/MCPCapabilityProvider.integration.spec.ts +0 -386
  617. package/src/providers/mcp/__tests__/MCPCapabilityProvider.test.ts +0 -371
  618. package/src/providers/mcp/config.ts +0 -45
  619. package/src/providers/mcp/index.ts +0 -21
  620. package/src/providers/mcp/transport.ts +0 -76
  621. package/src/providers/mcp/types.ts +0 -139
  622. package/src/providers/tools-server/ToolsServerCapabilityProvider.ts +0 -249
  623. package/src/providers/tools-server/index.ts +0 -1
  624. package/src/providers/types.ts +0 -204
  625. package/src/scripts/test-bedrock-handoff-autonomous.ts +0 -267
  626. package/src/scripts/test-handoff-preamble.ts +0 -278
  627. package/src/specs/agent-handoffs-bedrock.integration.test.ts +0 -415
  628. package/src/tools/artifacts/__tests__/tool.test.ts +0 -259
  629. package/src/tools/artifacts/index.ts +0 -33
  630. package/src/tools/artifacts/schema.ts +0 -99
  631. package/src/tools/artifacts/tool.ts +0 -289
  632. package/src/tools/artifacts/types.ts +0 -162
  633. package/src/tools/fileSearch/__tests__/tool.test.ts +0 -261
  634. package/src/tools/fileSearch/formatter.ts +0 -129
  635. package/src/tools/fileSearch/index.ts +0 -23
  636. package/src/tools/fileSearch/ragClient.ts +0 -137
  637. package/src/tools/fileSearch/schema.ts +0 -19
  638. package/src/tools/fileSearch/tool.ts +0 -207
  639. package/src/tools/fileSearch/types.ts +0 -149
  640. package/src/tools/proxyTool.ts +0 -166
  641. package/src/tools/search/output.md +0 -2775
  642. package/src/tools/search/test.html +0 -884
  643. package/src/tools/search/test.md +0 -643
  644. package/src/tools/search/test.ts +0 -159
  645. package/src/utils/__tests__/childAgentContext.test.ts +0 -217
  646. package/src/utils/__tests__/credentials.test.ts +0 -130
  647. package/src/utils/__tests__/httpClient.test.ts +0 -75
  648. package/src/utils/__tests__/toolManifest.test.ts +0 -116
  649. package/src/utils/childAgentContext.ts +0 -259
  650. package/src/utils/credentials.ts +0 -157
  651. package/src/utils/httpClient.ts +0 -92
  652. package/src/utils/toolManifest.ts +0 -109
  653. /package/dist/esm/{content → langchain}/index.mjs.map +0 -0
@@ -0,0 +1,670 @@
1
+ 'use strict';
2
+
3
+ var messages = require('@langchain/core/messages');
4
+ var truncation = require('../utils/truncation.cjs');
5
+
6
+ /**
7
+ * Tool output reference registry.
8
+ *
9
+ * When enabled via `RunConfig.toolOutputReferences.enabled`, ToolNode
10
+ * stores each successful tool output under a stable key
11
+ * (`tool<idx>turn<turn>`) where `idx` is the tool's position within a
12
+ * ToolNode batch and `turn` is the batch index within the run
13
+ * (incremented once per ToolNode invocation).
14
+ *
15
+ * Subsequent tool calls can pipe a previous output into their args by
16
+ * embedding `{{tool<idx>turn<turn>}}` inside any string argument;
17
+ * {@link ToolOutputReferenceRegistry.resolve} walks the args and
18
+ * substitutes the placeholders immediately before invocation.
19
+ *
20
+ * The registry stores the *raw, untruncated* tool output so a later
21
+ * `{{…}}` substitution pipes the full payload into the next tool —
22
+ * even when the LLM only saw a head+tail-truncated preview in
23
+ * `ToolMessage.content`. Outputs are stored without any annotation
24
+ * (the `_ref` key or the `[ref: ...]` prefix seen by the LLM is
25
+ * strictly a UX signal attached to `ToolMessage.content`). Keeping the
26
+ * registry pristine means downstream bash/jq piping receives the
27
+ * complete, verbatim output with no injected fields.
28
+ */
29
+ /** Object key used when a parsed-object output has `_ref` injected. */
30
+ const TOOL_OUTPUT_REF_KEY = '_ref';
31
+ /**
32
+ * Object key used to carry unresolved reference warnings on a parsed-
33
+ * object output. Using a dedicated field instead of a trailing text
34
+ * line keeps the annotated `ToolMessage.content` parseable as JSON for
35
+ * downstream consumers that rely on the object shape.
36
+ */
37
+ const TOOL_OUTPUT_UNRESOLVED_KEY = '_unresolved_refs';
38
+ /** Single-line prefix prepended to non-object tool outputs so the LLM sees the reference key. */
39
+ function buildReferencePrefix(key) {
40
+ return `[ref: ${key}]`;
41
+ }
42
+ /** Stable registry key for a tool output. */
43
+ function buildReferenceKey(toolIndex, turn) {
44
+ return `tool${toolIndex}turn${turn}`;
45
+ }
46
+ const EMPTY_ENTRIES = new Map();
47
+ /**
48
+ * Per-run state bucket held inside the registry. Each distinct
49
+ * `run_id` gets its own bucket so overlapping concurrent runs on a
50
+ * shared registry cannot leak outputs, turn counters, or warn-memos
51
+ * into one another.
52
+ */
53
+ class RunStateBucket {
54
+ entries = new Map();
55
+ totalSize = 0;
56
+ turnCounter = 0;
57
+ warnedNonStringTools = new Set();
58
+ }
59
+ /**
60
+ * Anonymous (`run_id` absent) bucket key. Anonymous batches are
61
+ * treated as fresh runs on every invocation — see `nextTurn`.
62
+ */
63
+ const ANON_RUN_KEY = '\0anon';
64
+ /**
65
+ * Default upper bound on the number of concurrently-tracked runs per
66
+ * registry. When exceeded, the oldest run's bucket (by insertion
67
+ * order) is evicted. Keeps memory bounded when a ToolNode is reused
68
+ * across many runs without explicit `releaseRun` calls.
69
+ */
70
+ const DEFAULT_MAX_ACTIVE_RUNS = 32;
71
+ /**
72
+ * Ordered map of reference-key → stored output, partitioned by run so
73
+ * concurrent / interleaved runs sharing one registry cannot leak
74
+ * outputs between each other.
75
+ *
76
+ * Each public method takes a `runId` which selects the run's bucket.
77
+ * Hosts typically get one registry per run via `Graph`, in which
78
+ * case only a single bucket is ever populated; the partitioning
79
+ * exists so the registry also behaves correctly when a single
80
+ * instance is reused directly.
81
+ */
82
+ class ToolOutputReferenceRegistry {
83
+ runStates = new Map();
84
+ maxOutputSize;
85
+ maxTotalSize;
86
+ maxActiveRuns;
87
+ /**
88
+ * Local stateful matcher used only by `replaceInString`. Kept
89
+ * off-module so callers of the exported `TOOL_OUTPUT_REF_PATTERN`
90
+ * never see a stale `lastIndex`.
91
+ */
92
+ static PLACEHOLDER_MATCHER = /\{\{(tool\d+turn\d+)\}\}/g;
93
+ constructor(options = {}) {
94
+ /**
95
+ * Per-output default is the same ~400 KB budget as the standard
96
+ * tool-result truncation (`HARD_MAX_TOOL_RESULT_CHARS`). This
97
+ * keeps a single `{{…}}` substitution at a size that is safe to
98
+ * pass through typical shell `ARG_MAX` limits and matches what
99
+ * the LLM would otherwise have seen. Hosts that want larger per-
100
+ * output payloads (API consumers, long JSON streams) can raise
101
+ * the cap explicitly up to the 5 MB total budget.
102
+ */
103
+ const perOutput = options.maxOutputSize != null && options.maxOutputSize > 0
104
+ ? options.maxOutputSize
105
+ : truncation.HARD_MAX_TOOL_RESULT_CHARS;
106
+ /**
107
+ * Clamp a caller-supplied `maxTotalSize` to
108
+ * `HARD_MAX_TOTAL_TOOL_OUTPUT_SIZE` (5 MB) so the documented
109
+ * absolute cap is enforced regardless of host config —
110
+ * `calculateMaxTotalToolOutputSize` already applies the same
111
+ * upper bound on its computed default, but the user-provided
112
+ * branch was bypassing it.
113
+ */
114
+ const totalRaw = options.maxTotalSize != null && options.maxTotalSize > 0
115
+ ? Math.min(options.maxTotalSize, truncation.HARD_MAX_TOTAL_TOOL_OUTPUT_SIZE)
116
+ : truncation.calculateMaxTotalToolOutputSize(perOutput);
117
+ this.maxTotalSize = totalRaw;
118
+ /**
119
+ * The per-output cap can never exceed the per-run aggregate cap:
120
+ * if a single entry were allowed to be larger than `maxTotalSize`,
121
+ * the eviction loop would either blow the cap (to keep the entry)
122
+ * or self-evict a just-stored value. Clamping here turns
123
+ * `maxTotalSize` into a hard upper bound on *any* state the
124
+ * registry retains per run.
125
+ */
126
+ this.maxOutputSize = Math.min(perOutput, totalRaw);
127
+ this.maxActiveRuns =
128
+ options.maxActiveRuns != null && options.maxActiveRuns > 0
129
+ ? options.maxActiveRuns
130
+ : DEFAULT_MAX_ACTIVE_RUNS;
131
+ }
132
+ keyFor(runId) {
133
+ return runId ?? ANON_RUN_KEY;
134
+ }
135
+ getOrCreate(runId) {
136
+ const key = this.keyFor(runId);
137
+ let state = this.runStates.get(key);
138
+ if (state == null) {
139
+ state = new RunStateBucket();
140
+ this.runStates.set(key, state);
141
+ if (this.runStates.size > this.maxActiveRuns) {
142
+ const oldest = this.runStates.keys().next().value;
143
+ if (oldest != null && oldest !== key) {
144
+ this.runStates.delete(oldest);
145
+ }
146
+ }
147
+ }
148
+ return state;
149
+ }
150
+ /** Registers (or replaces) the output stored under `key` for `runId`. */
151
+ set(runId, key, value) {
152
+ const bucket = this.getOrCreate(runId);
153
+ const clipped = value.length > this.maxOutputSize
154
+ ? value.slice(0, this.maxOutputSize)
155
+ : value;
156
+ const existing = bucket.entries.get(key);
157
+ if (existing != null) {
158
+ bucket.totalSize -= existing.length;
159
+ bucket.entries.delete(key);
160
+ }
161
+ bucket.entries.set(key, clipped);
162
+ bucket.totalSize += clipped.length;
163
+ this.evictWithinBucket(bucket);
164
+ }
165
+ /** Returns the stored value for `key` in `runId`'s bucket, or `undefined`. */
166
+ get(runId, key) {
167
+ return this.runStates.get(this.keyFor(runId))?.entries.get(key);
168
+ }
169
+ /**
170
+ * Returns `true` when `key` is currently stored in `runId`'s bucket.
171
+ * Used by {@link annotateMessagesForLLM} to gate transient annotation
172
+ * on whether the registry still owns the referenced output (a stale
173
+ * `_refKey` from a prior run silently no-ops here).
174
+ */
175
+ has(runId, key) {
176
+ return this.runStates.get(this.keyFor(runId))?.entries.has(key) ?? false;
177
+ }
178
+ /** Total number of registered outputs across every run bucket. */
179
+ get size() {
180
+ let n = 0;
181
+ for (const bucket of this.runStates.values()) {
182
+ n += bucket.entries.size;
183
+ }
184
+ return n;
185
+ }
186
+ /** Maximum characters retained per output (post-clip). */
187
+ get perOutputLimit() {
188
+ return this.maxOutputSize;
189
+ }
190
+ /** Maximum total characters retained *per run*. */
191
+ get totalLimit() {
192
+ return this.maxTotalSize;
193
+ }
194
+ /** Drops every run's state. */
195
+ clear() {
196
+ this.runStates.clear();
197
+ }
198
+ /**
199
+ * Explicitly release `runId`'s state. Safe to call when a run has
200
+ * finished. Hosts sharing one registry across runs should call this
201
+ * to reclaim memory deterministically; otherwise LRU eviction kicks
202
+ * in when `maxActiveRuns` runs accumulate.
203
+ */
204
+ releaseRun(runId) {
205
+ this.runStates.delete(this.keyFor(runId));
206
+ }
207
+ /**
208
+ * Claims the next batch turn synchronously from `runId`'s bucket.
209
+ *
210
+ * Must be called once at the start of each ToolNode batch before
211
+ * any `await`, so concurrent invocations within the same run see
212
+ * distinct turn values (reads are effectively atomic by JS's
213
+ * single-threaded execution of the sync prefix).
214
+ *
215
+ * If `runId` is missing the anonymous bucket is dropped and a
216
+ * fresh one created so each anonymous call behaves as its own run.
217
+ */
218
+ nextTurn(runId) {
219
+ if (runId == null) {
220
+ this.runStates.delete(ANON_RUN_KEY);
221
+ }
222
+ const bucket = this.getOrCreate(runId);
223
+ return bucket.turnCounter++;
224
+ }
225
+ /**
226
+ * Records that `toolName` has been warned about in `runId` (returns
227
+ * `true` on the first call per run, `false` after). Used by
228
+ * ToolNode to emit one log line per offending tool per run when a
229
+ * `ToolMessage.content` isn't a string.
230
+ */
231
+ claimWarnOnce(runId, toolName) {
232
+ const bucket = this.getOrCreate(runId);
233
+ if (bucket.warnedNonStringTools.has(toolName)) {
234
+ return false;
235
+ }
236
+ bucket.warnedNonStringTools.add(toolName);
237
+ return true;
238
+ }
239
+ /**
240
+ * Walks `args` and replaces every `{{tool<i>turn<n>}}` placeholder in
241
+ * string values with the stored output *from `runId`'s bucket*. Non-
242
+ * string values and object keys are left untouched. Unresolved
243
+ * references are left in-place and reported so the caller can
244
+ * surface them to the LLM. When no placeholder appears anywhere in
245
+ * the serialized args, the original input is returned without
246
+ * walking the tree.
247
+ */
248
+ resolve(runId, args) {
249
+ if (!hasAnyPlaceholder(args)) {
250
+ return { resolved: args, unresolved: [] };
251
+ }
252
+ const bucket = this.runStates.get(this.keyFor(runId));
253
+ return this.resolveAgainst(bucket?.entries ?? EMPTY_ENTRIES, args);
254
+ }
255
+ /**
256
+ * Captures a frozen snapshot of `runId`'s current entries and
257
+ * returns a view that resolves placeholders against *only* that
258
+ * snapshot. The snapshot is decoupled from the live registry, so
259
+ * subsequent `set()` calls (for example, same-turn direct outputs
260
+ * registering while an event branch is still in flight) are
261
+ * invisible to the snapshot's `resolve`. Used by the mixed
262
+ * direct+event dispatch path to preserve same-turn isolation when
263
+ * a `PreToolUse` hook rewrites event args after directs have
264
+ * completed.
265
+ */
266
+ snapshot(runId) {
267
+ const bucket = this.runStates.get(this.keyFor(runId));
268
+ const entries = bucket
269
+ ? new Map(bucket.entries)
270
+ : EMPTY_ENTRIES;
271
+ return {
272
+ resolve: (args) => this.resolveAgainst(entries, args),
273
+ };
274
+ }
275
+ resolveAgainst(entries, args) {
276
+ if (!hasAnyPlaceholder(args)) {
277
+ return { resolved: args, unresolved: [] };
278
+ }
279
+ const unresolved = new Set();
280
+ const resolved = this.transform(entries, args, unresolved);
281
+ return { resolved, unresolved: Array.from(unresolved) };
282
+ }
283
+ transform(entries, value, unresolved) {
284
+ if (typeof value === 'string') {
285
+ return this.replaceInString(entries, value, unresolved);
286
+ }
287
+ if (Array.isArray(value)) {
288
+ return value.map((item) => this.transform(entries, item, unresolved));
289
+ }
290
+ if (value !== null && typeof value === 'object') {
291
+ const source = value;
292
+ const next = {};
293
+ for (const [key, item] of Object.entries(source)) {
294
+ next[key] = this.transform(entries, item, unresolved);
295
+ }
296
+ return next;
297
+ }
298
+ return value;
299
+ }
300
+ replaceInString(entries, input, unresolved) {
301
+ if (input.indexOf('{{tool') === -1) {
302
+ return input;
303
+ }
304
+ return input.replace(ToolOutputReferenceRegistry.PLACEHOLDER_MATCHER, (match, key) => {
305
+ const stored = entries.get(key);
306
+ if (stored == null) {
307
+ unresolved.add(key);
308
+ return match;
309
+ }
310
+ return stored;
311
+ });
312
+ }
313
+ evictWithinBucket(bucket) {
314
+ if (bucket.totalSize <= this.maxTotalSize) {
315
+ return;
316
+ }
317
+ for (const key of bucket.entries.keys()) {
318
+ if (bucket.totalSize <= this.maxTotalSize) {
319
+ return;
320
+ }
321
+ const entry = bucket.entries.get(key);
322
+ if (entry == null) {
323
+ continue;
324
+ }
325
+ bucket.totalSize -= entry.length;
326
+ bucket.entries.delete(key);
327
+ }
328
+ }
329
+ }
330
+ /**
331
+ * Cheap pre-check: returns true if any string value in `args` contains
332
+ * the `{{tool` substring. Lets `resolve()` skip the deep tree walk (and
333
+ * its object allocations) for the common case of plain args.
334
+ */
335
+ function hasAnyPlaceholder(value) {
336
+ if (typeof value === 'string') {
337
+ return value.indexOf('{{tool') !== -1;
338
+ }
339
+ if (Array.isArray(value)) {
340
+ for (const item of value) {
341
+ if (hasAnyPlaceholder(item)) {
342
+ return true;
343
+ }
344
+ }
345
+ return false;
346
+ }
347
+ if (value !== null && typeof value === 'object') {
348
+ for (const item of Object.values(value)) {
349
+ if (hasAnyPlaceholder(item)) {
350
+ return true;
351
+ }
352
+ }
353
+ return false;
354
+ }
355
+ return false;
356
+ }
357
+ /**
358
+ * Annotates `content` with a reference key and/or unresolved-ref
359
+ * warnings so the LLM sees both alongside the tool output.
360
+ *
361
+ * Behavior:
362
+ * - If `content` parses as a plain (non-array, non-null) JSON object
363
+ * and the object does not already have a conflicting `_ref` key,
364
+ * the reference key and (when present) `_unresolved_refs` array
365
+ * are injected as object fields, preserving JSON validity for
366
+ * downstream consumers that parse the output.
367
+ * - Otherwise (string output, JSON array/primitive, parse failure,
368
+ * or `_ref` collision), a `[ref: <key>]\n` prefix line is
369
+ * prepended and unresolved refs are appended as a trailing
370
+ * `[unresolved refs: …]` line.
371
+ *
372
+ * The annotated string is what the LLM sees as `ToolMessage.content`.
373
+ * The *original* (un-annotated) value is what gets stored in the
374
+ * registry, so downstream piping remains pristine.
375
+ *
376
+ * @param content Raw (post-truncation) tool output.
377
+ * @param key Reference key for this output, or undefined when
378
+ * there is nothing to register (errors etc.).
379
+ * @param unresolved Reference keys that failed to resolve during
380
+ * argument substitution. Surfaced so the LLM can
381
+ * self-correct its next tool call.
382
+ */
383
+ function annotateToolOutputWithReference(content, key, unresolved = []) {
384
+ const hasRefKey = key != null;
385
+ const hasUnresolved = unresolved.length > 0;
386
+ if (!hasRefKey && !hasUnresolved) {
387
+ return content;
388
+ }
389
+ const trimmed = content.trimStart();
390
+ if (trimmed.startsWith('{')) {
391
+ const annotated = tryInjectRefIntoJsonObject(content, key, unresolved);
392
+ if (annotated != null) {
393
+ return annotated;
394
+ }
395
+ }
396
+ const prefix = hasRefKey ? `${buildReferencePrefix(key)}\n` : '';
397
+ const trailer = hasUnresolved
398
+ ? `\n[unresolved refs: ${unresolved.join(', ')}]`
399
+ : '';
400
+ return `${prefix}${content}${trailer}`;
401
+ }
402
+ function tryInjectRefIntoJsonObject(content, key, unresolved) {
403
+ let parsed;
404
+ try {
405
+ parsed = JSON.parse(content);
406
+ }
407
+ catch {
408
+ return null;
409
+ }
410
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
411
+ return null;
412
+ }
413
+ const obj = parsed;
414
+ const injectingRef = key != null;
415
+ const injectingUnresolved = unresolved.length > 0;
416
+ /**
417
+ * Reject the JSON-injection path (fall back to prefix form) when
418
+ * either of our keys collides with real payload data:
419
+ * - `_ref` collision: existing value is non-null and differs from
420
+ * the key we're about to inject.
421
+ * - `_unresolved_refs` collision: existing value is non-null and
422
+ * is not a deep-equal match for the array we'd inject.
423
+ * This keeps us from silently overwriting legitimate tool output.
424
+ */
425
+ if (injectingRef &&
426
+ TOOL_OUTPUT_REF_KEY in obj &&
427
+ obj[TOOL_OUTPUT_REF_KEY] !== key &&
428
+ obj[TOOL_OUTPUT_REF_KEY] != null) {
429
+ return null;
430
+ }
431
+ if (injectingUnresolved &&
432
+ TOOL_OUTPUT_UNRESOLVED_KEY in obj &&
433
+ obj[TOOL_OUTPUT_UNRESOLVED_KEY] != null &&
434
+ !arraysShallowEqual(obj[TOOL_OUTPUT_UNRESOLVED_KEY], unresolved)) {
435
+ return null;
436
+ }
437
+ /**
438
+ * Only strip the framework-owned key we're actually injecting —
439
+ * leave everything else (including a pre-existing `_ref` on the
440
+ * unresolved-only path, or a pre-existing `_unresolved_refs` on a
441
+ * plain-annotation path) untouched so we annotate rather than
442
+ * mutate downstream payload data. Our injected keys land first in
443
+ * the serialized JSON so the LLM sees them before the body.
444
+ */
445
+ const omitKeys = new Set();
446
+ if (injectingRef)
447
+ omitKeys.add(TOOL_OUTPUT_REF_KEY);
448
+ if (injectingUnresolved)
449
+ omitKeys.add(TOOL_OUTPUT_UNRESOLVED_KEY);
450
+ const rest = {};
451
+ for (const [k, v] of Object.entries(obj)) {
452
+ if (!omitKeys.has(k)) {
453
+ rest[k] = v;
454
+ }
455
+ }
456
+ const injected = {};
457
+ if (injectingRef) {
458
+ injected[TOOL_OUTPUT_REF_KEY] = key;
459
+ }
460
+ if (injectingUnresolved) {
461
+ injected[TOOL_OUTPUT_UNRESOLVED_KEY] = unresolved;
462
+ }
463
+ Object.assign(injected, rest);
464
+ const pretty = /^\{\s*\n/.test(content);
465
+ return pretty ? JSON.stringify(injected, null, 2) : JSON.stringify(injected);
466
+ }
467
+ function arraysShallowEqual(a, b) {
468
+ if (!Array.isArray(a) || a.length !== b.length) {
469
+ return false;
470
+ }
471
+ for (let i = 0; i < a.length; i++) {
472
+ if (a[i] !== b[i]) {
473
+ return false;
474
+ }
475
+ }
476
+ return true;
477
+ }
478
+ /**
479
+ * Lazy projection that, given a registry and a runId, returns a new
480
+ * `messages` array where each `ToolMessage` carrying ref metadata is
481
+ * projected into a transient copy with annotated content (when the ref
482
+ * is live in the registry) and with the framework-owned `additional_
483
+ * kwargs` keys (`_refKey`, `_refScope`, `_unresolvedRefs`) stripped
484
+ * regardless of whether annotation applied. The original input array
485
+ * and its messages are never mutated.
486
+ *
487
+ * Annotation is gated on registry presence: a stale `_refKey` from a
488
+ * prior run (e.g. one that survived in persisted history) silently
489
+ * no-ops on the *content* side. The strip-metadata side still runs so
490
+ * stale framework keys never leak onto the wire under any custom or
491
+ * future provider serializer that might transmit `additional_kwargs`.
492
+ * `_unresolvedRefs` is always meaningful and is not gated.
493
+ *
494
+ * **Feature-disabled fast path:** when the host hasn't enabled the
495
+ * tool-output-reference feature, the registry is `undefined` and this
496
+ * function returns the input array reference-equal *without iterating
497
+ * a single message*. The loop is exclusive to the feature-enabled
498
+ * code path.
499
+ */
500
+ function annotateMessagesForLLM(messages, registry, runId) {
501
+ if (registry == null)
502
+ return messages;
503
+ /**
504
+ * Lazy-allocate the output array so the common case (no ToolMessage
505
+ * carries framework metadata) returns the input reference-equal with
506
+ * zero allocations beyond the per-message predicate checks.
507
+ */
508
+ let out;
509
+ for (let i = 0; i < messages.length; i++) {
510
+ const m = messages[i];
511
+ if (m._getType() !== 'tool')
512
+ continue;
513
+ /**
514
+ * `additional_kwargs` is untyped at the LangChain layer
515
+ * (`Record<string, unknown>`), so persisted or client-supplied
516
+ * ToolMessages can carry arbitrary shapes — including primitives
517
+ * (a malformed serializer might write a string, or `null`).
518
+ * Guard with a runtime object check before the `in` probes
519
+ * because the `in` operator throws `TypeError` on primitives.
520
+ * A single malformed message must never crash the provider call
521
+ * path; skip its annotation/strip and continue.
522
+ */
523
+ const rawMeta = m.additional_kwargs;
524
+ if (rawMeta == null || typeof rawMeta !== 'object')
525
+ continue;
526
+ const meta = rawMeta;
527
+ const hasRefKey = '_refKey' in meta;
528
+ const hasRefScope = '_refScope' in meta;
529
+ const hasUnresolvedField = '_unresolvedRefs' in meta;
530
+ if (!hasRefKey && !hasRefScope && !hasUnresolvedField)
531
+ continue;
532
+ const refKey = readRefKey(meta);
533
+ const unresolved = readUnresolvedRefs(meta);
534
+ /**
535
+ * Prefer the message-stamped `_refScope` for the registry lookup.
536
+ * For named runs it equals the current `runId`; for anonymous
537
+ * invocations it carries the per-batch synthetic scope minted by
538
+ * ToolNode (`\0anon-<n>`), which `runId` from config cannot
539
+ * recover. Falling back to `runId` keeps backward compatibility
540
+ * with messages stamped before this field existed.
541
+ */
542
+ const lookupScope = readRefScope(meta) ?? runId;
543
+ const liveRef = refKey != null && registry.has(lookupScope, refKey) ? refKey : undefined;
544
+ const annotates = liveRef != null || unresolved.length > 0;
545
+ const tm = m;
546
+ let nextContent = tm.content;
547
+ if (annotates && typeof tm.content === 'string') {
548
+ nextContent = annotateToolOutputWithReference(tm.content, liveRef, unresolved);
549
+ }
550
+ else if (annotates &&
551
+ Array.isArray(tm.content) &&
552
+ unresolved.length > 0) {
553
+ const warningBlock = {
554
+ type: 'text',
555
+ text: `[unresolved refs: ${unresolved.join(', ')}]`,
556
+ };
557
+ /**
558
+ * `as unknown as ToolMessage['content']` is unavoidable here:
559
+ * LangChain's content union (`MessageContentComplex[] |
560
+ * DataContentBlock[] | string`) does not accept a freshly built
561
+ * mixed array literal even though the structural shape is valid
562
+ * at runtime. The double-cast is structurally safe — we
563
+ * preserve every block from `tm.content` and prepend a single
564
+ * `{ type: 'text', text }` block that all providers accept.
565
+ */
566
+ nextContent = [
567
+ warningBlock,
568
+ ...tm.content,
569
+ ];
570
+ }
571
+ /**
572
+ * Project unconditionally: even when no annotation applies (stale
573
+ * `_refKey` or non-annotatable content), `cloneToolMessageWithContent`
574
+ * runs `stripFrameworkRefMetadata` on `additional_kwargs` so the
575
+ * framework-owned keys never reach the wire.
576
+ */
577
+ out ??= messages.slice();
578
+ out[i] = cloneToolMessageWithContent(tm, nextContent);
579
+ }
580
+ return out ?? messages;
581
+ }
582
+ /**
583
+ * Reads `_refKey` defensively from untyped `additional_kwargs`. Returns
584
+ * undefined for non-string values so a malformed field cannot poison
585
+ * the registry lookup or downstream string operations.
586
+ */
587
+ function readRefKey(meta) {
588
+ const v = meta?._refKey;
589
+ return typeof v === 'string' ? v : undefined;
590
+ }
591
+ /**
592
+ * Reads `_refScope` defensively from untyped `additional_kwargs`.
593
+ * Mirrors {@link readRefKey} — non-string scopes are dropped (the
594
+ * caller falls back to the run-derived scope) rather than passed into
595
+ * the registry as a malformed key.
596
+ */
597
+ function readRefScope(meta) {
598
+ const v = meta?._refScope;
599
+ return typeof v === 'string' ? v : undefined;
600
+ }
601
+ /**
602
+ * Reads `_unresolvedRefs` defensively from untyped `additional_kwargs`.
603
+ * Returns an empty array for any non-array value, and filters out
604
+ * non-string entries from a real array. Without this guard, a hydrated
605
+ * ToolMessage carrying e.g. `_unresolvedRefs: 'tool0turn0'` would crash
606
+ * `attemptInvoke` on the eventual `.length` / `.join(...)` call.
607
+ */
608
+ function readUnresolvedRefs(meta) {
609
+ const v = meta?._unresolvedRefs;
610
+ if (!Array.isArray(v))
611
+ return [];
612
+ const out = [];
613
+ for (const item of v) {
614
+ if (typeof item === 'string')
615
+ out.push(item);
616
+ }
617
+ return out;
618
+ }
619
+ /**
620
+ * Builds a fresh `ToolMessage` that mirrors `tm`'s identity fields with
621
+ * the supplied `content`. Every `ToolMessage` field but `content` is
622
+ * carried over so the projection is structurally identical to the
623
+ * original from a LangChain serializer's perspective.
624
+ *
625
+ * `additional_kwargs` is rebuilt with the framework-owned ref keys
626
+ * stripped. Defensive: LangChain's standard provider serializers do not
627
+ * transmit `additional_kwargs` to provider HTTP APIs, but a custom
628
+ * adapter or future LangChain change could. Stripping keeps the
629
+ * implementation correct under any serializer behavior at the cost of a
630
+ * shallow object spread per annotated message.
631
+ */
632
+ function cloneToolMessageWithContent(tm, content) {
633
+ return new messages.ToolMessage({
634
+ id: tm.id,
635
+ name: tm.name,
636
+ status: tm.status,
637
+ artifact: tm.artifact,
638
+ tool_call_id: tm.tool_call_id,
639
+ response_metadata: tm.response_metadata,
640
+ additional_kwargs: stripFrameworkRefMetadata(tm.additional_kwargs),
641
+ content,
642
+ });
643
+ }
644
+ /**
645
+ * Returns a copy of `kwargs` with `_refKey`, `_refScope`, and
646
+ * `_unresolvedRefs` removed. Returns the input reference-equal when
647
+ * none of those keys are present so the no-strip path stays cheap;
648
+ * returns `undefined` when stripping leaves the object empty so the
649
+ * caller can drop the field entirely.
650
+ */
651
+ function stripFrameworkRefMetadata(kwargs) {
652
+ if (kwargs == null)
653
+ return undefined;
654
+ if (!('_refKey' in kwargs) &&
655
+ !('_refScope' in kwargs) &&
656
+ !('_unresolvedRefs' in kwargs)) {
657
+ return kwargs;
658
+ }
659
+ const { _refKey, _refScope, _unresolvedRefs, ...rest } = kwargs;
660
+ return Object.keys(rest).length === 0 ? undefined : rest;
661
+ }
662
+
663
+ exports.TOOL_OUTPUT_REF_KEY = TOOL_OUTPUT_REF_KEY;
664
+ exports.TOOL_OUTPUT_UNRESOLVED_KEY = TOOL_OUTPUT_UNRESOLVED_KEY;
665
+ exports.ToolOutputReferenceRegistry = ToolOutputReferenceRegistry;
666
+ exports.annotateMessagesForLLM = annotateMessagesForLLM;
667
+ exports.annotateToolOutputWithReference = annotateToolOutputWithReference;
668
+ exports.buildReferenceKey = buildReferenceKey;
669
+ exports.buildReferencePrefix = buildReferencePrefix;
670
+ //# sourceMappingURL=toolOutputReferences.cjs.map