@librechat/agents 3.2.32 → 3.2.34

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 (597) hide show
  1. package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
  2. package/dist/cjs/agents/AgentContext.cjs +844 -1046
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  4. package/dist/cjs/common/constants.cjs +13 -13
  5. package/dist/cjs/common/constants.cjs.map +1 -1
  6. package/dist/cjs/common/enum.cjs +233 -240
  7. package/dist/cjs/common/enum.cjs.map +1 -1
  8. package/dist/cjs/common/index.cjs +2 -0
  9. package/dist/cjs/events.cjs +121 -169
  10. package/dist/cjs/events.cjs.map +1 -1
  11. package/dist/cjs/graphs/Graph.cjs +1389 -1807
  12. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  13. package/dist/cjs/graphs/MultiAgentGraph.cjs +713 -945
  14. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  15. package/dist/cjs/graphs/index.cjs +2 -0
  16. package/dist/cjs/hitl/askUserQuestion.cjs +60 -62
  17. package/dist/cjs/hitl/askUserQuestion.cjs.map +1 -1
  18. package/dist/cjs/hitl/index.cjs +1 -0
  19. package/dist/cjs/hooks/HookRegistry.cjs +176 -202
  20. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  21. package/dist/cjs/hooks/createToolPolicyHook.cjs +71 -101
  22. package/dist/cjs/hooks/createToolPolicyHook.cjs.map +1 -1
  23. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +170 -273
  24. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs.map +1 -1
  25. package/dist/cjs/hooks/executeHooks.cjs +227 -282
  26. package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
  27. package/dist/cjs/hooks/index.cjs +6 -0
  28. package/dist/cjs/hooks/matchers.cjs +196 -230
  29. package/dist/cjs/hooks/matchers.cjs.map +1 -1
  30. package/dist/cjs/hooks/types.cjs +24 -24
  31. package/dist/cjs/hooks/types.cjs.map +1 -1
  32. package/dist/cjs/instrumentation.cjs +110 -137
  33. package/dist/cjs/instrumentation.cjs.map +1 -1
  34. package/dist/cjs/langchain/google-common.cjs +0 -3
  35. package/dist/cjs/langchain/index.cjs +80 -43
  36. package/dist/cjs/langchain/language_models/chat_models.cjs +0 -3
  37. package/dist/cjs/langchain/messages/tool.cjs +0 -3
  38. package/dist/cjs/langchain/messages.cjs +35 -18
  39. package/dist/cjs/langchain/openai.cjs +0 -3
  40. package/dist/cjs/langchain/prompts.cjs +5 -8
  41. package/dist/cjs/langchain/runnables.cjs +11 -10
  42. package/dist/cjs/langchain/tools.cjs +14 -11
  43. package/dist/cjs/langchain/utils/env.cjs +5 -8
  44. package/dist/cjs/langfuse.cjs +60 -79
  45. package/dist/cjs/langfuse.cjs.map +1 -1
  46. package/dist/cjs/langfuseToolOutputTracing.cjs +267 -399
  47. package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
  48. package/dist/cjs/llm/anthropic/index.cjs +432 -562
  49. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  50. package/dist/cjs/llm/anthropic/types.cjs +23 -47
  51. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  52. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +441 -731
  53. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  54. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +171 -256
  55. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
  56. package/dist/cjs/llm/anthropic/utils/output_parsers.cjs +2 -0
  57. package/dist/cjs/llm/anthropic/utils/tools.cjs +12 -26
  58. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
  59. package/dist/cjs/llm/bedrock/index.cjs +214 -240
  60. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  61. package/dist/cjs/llm/bedrock/toolCache.cjs +84 -106
  62. package/dist/cjs/llm/bedrock/toolCache.cjs.map +1 -1
  63. package/dist/cjs/llm/bedrock/utils/index.cjs +2 -0
  64. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +357 -620
  65. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
  66. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +141 -149
  67. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
  68. package/dist/cjs/llm/fake.cjs +86 -96
  69. package/dist/cjs/llm/fake.cjs.map +1 -1
  70. package/dist/cjs/llm/google/index.cjs +183 -237
  71. package/dist/cjs/llm/google/index.cjs.map +1 -1
  72. package/dist/cjs/llm/google/utils/common.cjs +404 -674
  73. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  74. package/dist/cjs/llm/google/utils/zod_to_genai_parameters.cjs +2 -0
  75. package/dist/cjs/llm/init.cjs +44 -53
  76. package/dist/cjs/llm/init.cjs.map +1 -1
  77. package/dist/cjs/llm/invoke.cjs +142 -182
  78. package/dist/cjs/llm/invoke.cjs.map +1 -1
  79. package/dist/cjs/llm/openai/index.cjs +1035 -1273
  80. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  81. package/dist/cjs/llm/openai/utils/index.cjs +189 -316
  82. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  83. package/dist/cjs/llm/openrouter/index.cjs +102 -153
  84. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  85. package/dist/cjs/llm/openrouter/toolCache.cjs +35 -44
  86. package/dist/cjs/llm/openrouter/toolCache.cjs.map +1 -1
  87. package/dist/cjs/llm/providers.cjs +29 -37
  88. package/dist/cjs/llm/providers.cjs.map +1 -1
  89. package/dist/cjs/llm/request.cjs +20 -33
  90. package/dist/cjs/llm/request.cjs.map +1 -1
  91. package/dist/cjs/llm/vertexai/index.cjs +446 -453
  92. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  93. package/dist/cjs/main.cjs +547 -528
  94. package/dist/cjs/messages/anthropicToolCache.cjs +68 -119
  95. package/dist/cjs/messages/anthropicToolCache.cjs.map +1 -1
  96. package/dist/cjs/messages/cache.cjs +305 -418
  97. package/dist/cjs/messages/cache.cjs.map +1 -1
  98. package/dist/cjs/messages/content.cjs +36 -49
  99. package/dist/cjs/messages/content.cjs.map +1 -1
  100. package/dist/cjs/messages/contextPruning.cjs +112 -145
  101. package/dist/cjs/messages/contextPruning.cjs.map +1 -1
  102. package/dist/cjs/messages/contextPruningSettings.cjs +36 -46
  103. package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -1
  104. package/dist/cjs/messages/core.cjs +256 -397
  105. package/dist/cjs/messages/core.cjs.map +1 -1
  106. package/dist/cjs/messages/format.cjs +904 -1387
  107. package/dist/cjs/messages/format.cjs.map +1 -1
  108. package/dist/cjs/messages/ids.cjs +16 -20
  109. package/dist/cjs/messages/ids.cjs.map +1 -1
  110. package/dist/cjs/messages/index.cjs +12 -0
  111. package/dist/cjs/messages/langchain.cjs +18 -18
  112. package/dist/cjs/messages/langchain.cjs.map +1 -1
  113. package/dist/cjs/messages/prune.cjs +1054 -1517
  114. package/dist/cjs/messages/prune.cjs.map +1 -1
  115. package/dist/cjs/messages/recency.cjs +77 -95
  116. package/dist/cjs/messages/recency.cjs.map +1 -1
  117. package/dist/cjs/messages/reducer.cjs +63 -78
  118. package/dist/cjs/messages/reducer.cjs.map +1 -1
  119. package/dist/cjs/messages/tools.cjs +51 -79
  120. package/dist/cjs/messages/tools.cjs.map +1 -1
  121. package/dist/cjs/openai/index.cjs +171 -217
  122. package/dist/cjs/openai/index.cjs.map +1 -1
  123. package/dist/cjs/responses/index.cjs +302 -391
  124. package/dist/cjs/responses/index.cjs.map +1 -1
  125. package/dist/cjs/run.cjs +903 -1113
  126. package/dist/cjs/run.cjs.map +1 -1
  127. package/dist/cjs/session/AgentSession.cjs +805 -986
  128. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  129. package/dist/cjs/session/JsonlSessionStore.cjs +327 -410
  130. package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
  131. package/dist/cjs/session/handlers.cjs +192 -208
  132. package/dist/cjs/session/handlers.cjs.map +1 -1
  133. package/dist/cjs/session/ids.cjs +9 -10
  134. package/dist/cjs/session/ids.cjs.map +1 -1
  135. package/dist/cjs/session/index.cjs +4 -0
  136. package/dist/cjs/session/messageSerialization.cjs +94 -156
  137. package/dist/cjs/session/messageSerialization.cjs.map +1 -1
  138. package/dist/cjs/splitStream.cjs +147 -206
  139. package/dist/cjs/splitStream.cjs.map +1 -1
  140. package/dist/cjs/stream.cjs +874 -1344
  141. package/dist/cjs/stream.cjs.map +1 -1
  142. package/dist/cjs/summarization/index.cjs +57 -101
  143. package/dist/cjs/summarization/index.cjs.map +1 -1
  144. package/dist/cjs/summarization/node.cjs +643 -796
  145. package/dist/cjs/summarization/node.cjs.map +1 -1
  146. package/dist/cjs/tools/BashExecutor.cjs +110 -136
  147. package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
  148. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +165 -245
  149. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
  150. package/dist/cjs/tools/Calculator.cjs +36 -57
  151. package/dist/cjs/tools/Calculator.cjs.map +1 -1
  152. package/dist/cjs/tools/CodeExecutor.cjs +126 -168
  153. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  154. package/dist/cjs/tools/CodeSessionFileSummary.cjs +36 -46
  155. package/dist/cjs/tools/CodeSessionFileSummary.cjs.map +1 -1
  156. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +459 -649
  157. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  158. package/dist/cjs/tools/ReadFile.cjs +17 -20
  159. package/dist/cjs/tools/ReadFile.cjs.map +1 -1
  160. package/dist/cjs/tools/SkillTool.cjs +26 -27
  161. package/dist/cjs/tools/SkillTool.cjs.map +1 -1
  162. package/dist/cjs/tools/SubagentTool.cjs +59 -61
  163. package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
  164. package/dist/cjs/tools/ToolNode.cjs +2146 -2686
  165. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  166. package/dist/cjs/tools/ToolSearch.cjs +663 -825
  167. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  168. package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs +248 -340
  169. package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs.map +1 -1
  170. package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs +170 -197
  171. package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs.map +1 -1
  172. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +425 -520
  173. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -1
  174. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +91 -124
  175. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -1
  176. package/dist/cjs/tools/cloudflare/index.cjs +4 -0
  177. package/dist/cjs/tools/eagerEventExecution.cjs +75 -99
  178. package/dist/cjs/tools/eagerEventExecution.cjs.map +1 -1
  179. package/dist/cjs/tools/handlers.cjs +200 -262
  180. package/dist/cjs/tools/handlers.cjs.map +1 -1
  181. package/dist/cjs/tools/local/CompileCheckTool.cjs +150 -212
  182. package/dist/cjs/tools/local/CompileCheckTool.cjs.map +1 -1
  183. package/dist/cjs/tools/local/FileCheckpointer.cjs +77 -85
  184. package/dist/cjs/tools/local/FileCheckpointer.cjs.map +1 -1
  185. package/dist/cjs/tools/local/LocalCodingTools.cjs +763 -1022
  186. package/dist/cjs/tools/local/LocalCodingTools.cjs.map +1 -1
  187. package/dist/cjs/tools/local/LocalExecutionEngine.cjs +666 -941
  188. package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
  189. package/dist/cjs/tools/local/LocalExecutionTools.cjs +49 -92
  190. package/dist/cjs/tools/local/LocalExecutionTools.cjs.map +1 -1
  191. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +286 -354
  192. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs.map +1 -1
  193. package/dist/cjs/tools/local/attachments.cjs +108 -165
  194. package/dist/cjs/tools/local/attachments.cjs.map +1 -1
  195. package/dist/cjs/tools/local/bashAst.cjs +99 -113
  196. package/dist/cjs/tools/local/bashAst.cjs.map +1 -1
  197. package/dist/cjs/tools/local/editStrategies.cjs +126 -169
  198. package/dist/cjs/tools/local/editStrategies.cjs.map +1 -1
  199. package/dist/cjs/tools/local/index.cjs +12 -0
  200. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +136 -218
  201. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
  202. package/dist/cjs/tools/local/syntaxCheck.cjs +142 -161
  203. package/dist/cjs/tools/local/syntaxCheck.cjs.map +1 -1
  204. package/dist/cjs/tools/local/textEncoding.cjs +25 -23
  205. package/dist/cjs/tools/local/textEncoding.cjs.map +1 -1
  206. package/dist/cjs/tools/local/workspaceFS.cjs +38 -46
  207. package/dist/cjs/tools/local/workspaceFS.cjs.map +1 -1
  208. package/dist/cjs/tools/ptcTimeout.cjs +27 -47
  209. package/dist/cjs/tools/ptcTimeout.cjs.map +1 -1
  210. package/dist/cjs/tools/schema.cjs +24 -23
  211. package/dist/cjs/tools/schema.cjs.map +1 -1
  212. package/dist/cjs/tools/search/anthropic.cjs +24 -33
  213. package/dist/cjs/tools/search/anthropic.cjs.map +1 -1
  214. package/dist/cjs/tools/search/content.cjs +95 -137
  215. package/dist/cjs/tools/search/content.cjs.map +1 -1
  216. package/dist/cjs/tools/search/firecrawl.cjs +141 -172
  217. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  218. package/dist/cjs/tools/search/format.cjs +128 -196
  219. package/dist/cjs/tools/search/format.cjs.map +1 -1
  220. package/dist/cjs/tools/search/highlights.cjs +165 -232
  221. package/dist/cjs/tools/search/highlights.cjs.map +1 -1
  222. package/dist/cjs/tools/search/index.cjs +2 -0
  223. package/dist/cjs/tools/search/rerankers.cjs +151 -174
  224. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  225. package/dist/cjs/tools/search/schema.cjs +40 -39
  226. package/dist/cjs/tools/search/schema.cjs.map +1 -1
  227. package/dist/cjs/tools/search/search.cjs +428 -530
  228. package/dist/cjs/tools/search/search.cjs.map +1 -1
  229. package/dist/cjs/tools/search/serper-scraper.cjs +106 -127
  230. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
  231. package/dist/cjs/tools/search/tavily-scraper.cjs +129 -181
  232. package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -1
  233. package/dist/cjs/tools/search/tavily-search.cjs +295 -359
  234. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
  235. package/dist/cjs/tools/search/tool.cjs +260 -299
  236. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  237. package/dist/cjs/tools/search/utils.cjs +74 -117
  238. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  239. package/dist/cjs/tools/skillCatalog.cjs +54 -72
  240. package/dist/cjs/tools/skillCatalog.cjs.map +1 -1
  241. package/dist/cjs/tools/streamedToolCallSeals.cjs +46 -34
  242. package/dist/cjs/tools/streamedToolCallSeals.cjs.map +1 -1
  243. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +612 -771
  244. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  245. package/dist/cjs/tools/subagent/index.cjs +1 -0
  246. package/dist/cjs/tools/toolOutputReferences.cjs +523 -630
  247. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
  248. package/dist/cjs/utils/callbacks.cjs +11 -21
  249. package/dist/cjs/utils/callbacks.cjs.map +1 -1
  250. package/dist/cjs/utils/errors.cjs +70 -95
  251. package/dist/cjs/utils/errors.cjs.map +1 -1
  252. package/dist/cjs/utils/events.cjs +32 -42
  253. package/dist/cjs/utils/events.cjs.map +1 -1
  254. package/dist/cjs/utils/graph.cjs +8 -12
  255. package/dist/cjs/utils/graph.cjs.map +1 -1
  256. package/dist/cjs/utils/handlers.cjs +60 -82
  257. package/dist/cjs/utils/handlers.cjs.map +1 -1
  258. package/dist/cjs/utils/index.cjs +9 -0
  259. package/dist/cjs/utils/llm.cjs +19 -27
  260. package/dist/cjs/utils/llm.cjs.map +1 -1
  261. package/dist/cjs/utils/misc.cjs +30 -46
  262. package/dist/cjs/utils/misc.cjs.map +1 -1
  263. package/dist/cjs/utils/run.cjs +50 -66
  264. package/dist/cjs/utils/run.cjs.map +1 -1
  265. package/dist/cjs/utils/schema.cjs +11 -19
  266. package/dist/cjs/utils/schema.cjs.map +1 -1
  267. package/dist/cjs/utils/title.cjs +71 -106
  268. package/dist/cjs/utils/title.cjs.map +1 -1
  269. package/dist/cjs/utils/tokens.cjs +186 -283
  270. package/dist/cjs/utils/tokens.cjs.map +1 -1
  271. package/dist/cjs/utils/truncation.cjs +95 -114
  272. package/dist/cjs/utils/truncation.cjs.map +1 -1
  273. package/dist/esm/agents/AgentContext.mjs +844 -1044
  274. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  275. package/dist/esm/common/constants.mjs +13 -11
  276. package/dist/esm/common/constants.mjs.map +1 -1
  277. package/dist/esm/common/enum.mjs +221 -238
  278. package/dist/esm/common/enum.mjs.map +1 -1
  279. package/dist/esm/common/index.mjs +3 -0
  280. package/dist/esm/events.mjs +121 -167
  281. package/dist/esm/events.mjs.map +1 -1
  282. package/dist/esm/graphs/Graph.mjs +1388 -1804
  283. package/dist/esm/graphs/Graph.mjs.map +1 -1
  284. package/dist/esm/graphs/MultiAgentGraph.mjs +713 -943
  285. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  286. package/dist/esm/graphs/index.mjs +3 -0
  287. package/dist/esm/hitl/askUserQuestion.mjs +60 -60
  288. package/dist/esm/hitl/askUserQuestion.mjs.map +1 -1
  289. package/dist/esm/hitl/index.mjs +2 -0
  290. package/dist/esm/hooks/HookRegistry.mjs +176 -200
  291. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  292. package/dist/esm/hooks/createToolPolicyHook.mjs +71 -99
  293. package/dist/esm/hooks/createToolPolicyHook.mjs.map +1 -1
  294. package/dist/esm/hooks/createWorkspacePolicyHook.mjs +170 -271
  295. package/dist/esm/hooks/createWorkspacePolicyHook.mjs.map +1 -1
  296. package/dist/esm/hooks/executeHooks.mjs +227 -280
  297. package/dist/esm/hooks/executeHooks.mjs.map +1 -1
  298. package/dist/esm/hooks/index.mjs +7 -0
  299. package/dist/esm/hooks/matchers.mjs +196 -228
  300. package/dist/esm/hooks/matchers.mjs.map +1 -1
  301. package/dist/esm/hooks/types.mjs +24 -22
  302. package/dist/esm/hooks/types.mjs.map +1 -1
  303. package/dist/esm/instrumentation.mjs +109 -132
  304. package/dist/esm/instrumentation.mjs.map +1 -1
  305. package/dist/esm/langchain/google-common.mjs +1 -2
  306. package/dist/esm/langchain/index.mjs +5 -5
  307. package/dist/esm/langchain/language_models/chat_models.mjs +1 -2
  308. package/dist/esm/langchain/messages/tool.mjs +1 -2
  309. package/dist/esm/langchain/messages.mjs +2 -2
  310. package/dist/esm/langchain/openai.mjs +1 -2
  311. package/dist/esm/langchain/prompts.mjs +2 -2
  312. package/dist/esm/langchain/runnables.mjs +2 -2
  313. package/dist/esm/langchain/tools.mjs +2 -2
  314. package/dist/esm/langchain/utils/env.mjs +2 -2
  315. package/dist/esm/langfuse.mjs +60 -76
  316. package/dist/esm/langfuse.mjs.map +1 -1
  317. package/dist/esm/langfuseToolOutputTracing.mjs +267 -395
  318. package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
  319. package/dist/esm/llm/anthropic/index.mjs +432 -559
  320. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  321. package/dist/esm/llm/anthropic/types.mjs +23 -45
  322. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  323. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +439 -725
  324. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  325. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +171 -253
  326. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
  327. package/dist/esm/llm/anthropic/utils/output_parsers.mjs +3 -0
  328. package/dist/esm/llm/anthropic/utils/tools.mjs +12 -24
  329. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
  330. package/dist/esm/llm/bedrock/index.mjs +214 -238
  331. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  332. package/dist/esm/llm/bedrock/toolCache.mjs +84 -104
  333. package/dist/esm/llm/bedrock/toolCache.mjs.map +1 -1
  334. package/dist/esm/llm/bedrock/utils/index.mjs +3 -0
  335. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +357 -618
  336. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
  337. package/dist/esm/llm/bedrock/utils/message_outputs.mjs +140 -147
  338. package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
  339. package/dist/esm/llm/fake.mjs +86 -94
  340. package/dist/esm/llm/fake.mjs.map +1 -1
  341. package/dist/esm/llm/google/index.mjs +183 -235
  342. package/dist/esm/llm/google/index.mjs.map +1 -1
  343. package/dist/esm/llm/google/utils/common.mjs +403 -666
  344. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  345. package/dist/esm/llm/google/utils/zod_to_genai_parameters.mjs +3 -0
  346. package/dist/esm/llm/init.mjs +44 -51
  347. package/dist/esm/llm/init.mjs.map +1 -1
  348. package/dist/esm/llm/invoke.mjs +142 -180
  349. package/dist/esm/llm/invoke.mjs.map +1 -1
  350. package/dist/esm/llm/openai/index.mjs +1035 -1268
  351. package/dist/esm/llm/openai/index.mjs.map +1 -1
  352. package/dist/esm/llm/openai/utils/index.mjs +188 -312
  353. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  354. package/dist/esm/llm/openrouter/index.mjs +102 -151
  355. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  356. package/dist/esm/llm/openrouter/toolCache.mjs +35 -42
  357. package/dist/esm/llm/openrouter/toolCache.mjs.map +1 -1
  358. package/dist/esm/llm/providers.mjs +29 -34
  359. package/dist/esm/llm/providers.mjs.map +1 -1
  360. package/dist/esm/llm/request.mjs +20 -31
  361. package/dist/esm/llm/request.mjs.map +1 -1
  362. package/dist/esm/llm/vertexai/index.mjs +446 -449
  363. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  364. package/dist/esm/main.mjs +99 -87
  365. package/dist/esm/messages/anthropicToolCache.mjs +68 -117
  366. package/dist/esm/messages/anthropicToolCache.mjs.map +1 -1
  367. package/dist/esm/messages/cache.mjs +305 -416
  368. package/dist/esm/messages/cache.mjs.map +1 -1
  369. package/dist/esm/messages/content.mjs +36 -47
  370. package/dist/esm/messages/content.mjs.map +1 -1
  371. package/dist/esm/messages/contextPruning.mjs +112 -143
  372. package/dist/esm/messages/contextPruning.mjs.map +1 -1
  373. package/dist/esm/messages/contextPruningSettings.mjs +36 -44
  374. package/dist/esm/messages/contextPruningSettings.mjs.map +1 -1
  375. package/dist/esm/messages/core.mjs +254 -393
  376. package/dist/esm/messages/core.mjs.map +1 -1
  377. package/dist/esm/messages/format.mjs +902 -1383
  378. package/dist/esm/messages/format.mjs.map +1 -1
  379. package/dist/esm/messages/ids.mjs +16 -18
  380. package/dist/esm/messages/ids.mjs.map +1 -1
  381. package/dist/esm/messages/index.mjs +13 -0
  382. package/dist/esm/messages/langchain.mjs +18 -16
  383. package/dist/esm/messages/langchain.mjs.map +1 -1
  384. package/dist/esm/messages/prune.mjs +1053 -1514
  385. package/dist/esm/messages/prune.mjs.map +1 -1
  386. package/dist/esm/messages/recency.mjs +77 -93
  387. package/dist/esm/messages/recency.mjs.map +1 -1
  388. package/dist/esm/messages/reducer.mjs +63 -76
  389. package/dist/esm/messages/reducer.mjs.map +1 -1
  390. package/dist/esm/messages/tools.mjs +49 -75
  391. package/dist/esm/messages/tools.mjs.map +1 -1
  392. package/dist/esm/openai/index.mjs +170 -215
  393. package/dist/esm/openai/index.mjs.map +1 -1
  394. package/dist/esm/responses/index.mjs +301 -389
  395. package/dist/esm/responses/index.mjs.map +1 -1
  396. package/dist/esm/run.mjs +903 -1111
  397. package/dist/esm/run.mjs.map +1 -1
  398. package/dist/esm/session/AgentSession.mjs +806 -985
  399. package/dist/esm/session/AgentSession.mjs.map +1 -1
  400. package/dist/esm/session/JsonlSessionStore.mjs +326 -407
  401. package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
  402. package/dist/esm/session/handlers.mjs +192 -206
  403. package/dist/esm/session/handlers.mjs.map +1 -1
  404. package/dist/esm/session/ids.mjs +9 -8
  405. package/dist/esm/session/ids.mjs.map +1 -1
  406. package/dist/esm/session/index.mjs +5 -0
  407. package/dist/esm/session/messageSerialization.mjs +94 -154
  408. package/dist/esm/session/messageSerialization.mjs.map +1 -1
  409. package/dist/esm/splitStream.mjs +147 -204
  410. package/dist/esm/splitStream.mjs.map +1 -1
  411. package/dist/esm/stream.mjs +872 -1341
  412. package/dist/esm/stream.mjs.map +1 -1
  413. package/dist/esm/summarization/index.mjs +57 -99
  414. package/dist/esm/summarization/index.mjs.map +1 -1
  415. package/dist/esm/summarization/node.mjs +640 -790
  416. package/dist/esm/summarization/node.mjs.map +1 -1
  417. package/dist/esm/tools/BashExecutor.mjs +103 -129
  418. package/dist/esm/tools/BashExecutor.mjs.map +1 -1
  419. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +162 -239
  420. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
  421. package/dist/esm/tools/Calculator.mjs +34 -36
  422. package/dist/esm/tools/Calculator.mjs.map +1 -1
  423. package/dist/esm/tools/CodeExecutor.mjs +123 -164
  424. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  425. package/dist/esm/tools/CodeSessionFileSummary.mjs +36 -44
  426. package/dist/esm/tools/CodeSessionFileSummary.mjs.map +1 -1
  427. package/dist/esm/tools/ProgrammaticToolCalling.mjs +454 -644
  428. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  429. package/dist/esm/tools/ReadFile.mjs +17 -18
  430. package/dist/esm/tools/ReadFile.mjs.map +1 -1
  431. package/dist/esm/tools/SkillTool.mjs +26 -25
  432. package/dist/esm/tools/SkillTool.mjs.map +1 -1
  433. package/dist/esm/tools/SubagentTool.mjs +59 -59
  434. package/dist/esm/tools/SubagentTool.mjs.map +1 -1
  435. package/dist/esm/tools/ToolNode.mjs +2144 -2684
  436. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  437. package/dist/esm/tools/ToolSearch.mjs +659 -804
  438. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  439. package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs +248 -338
  440. package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs.map +1 -1
  441. package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs +170 -195
  442. package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs.map +1 -1
  443. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +424 -517
  444. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -1
  445. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +91 -122
  446. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -1
  447. package/dist/esm/tools/cloudflare/index.mjs +5 -0
  448. package/dist/esm/tools/eagerEventExecution.mjs +75 -96
  449. package/dist/esm/tools/eagerEventExecution.mjs.map +1 -1
  450. package/dist/esm/tools/handlers.mjs +200 -260
  451. package/dist/esm/tools/handlers.mjs.map +1 -1
  452. package/dist/esm/tools/local/CompileCheckTool.mjs +150 -210
  453. package/dist/esm/tools/local/CompileCheckTool.mjs.map +1 -1
  454. package/dist/esm/tools/local/FileCheckpointer.mjs +77 -83
  455. package/dist/esm/tools/local/FileCheckpointer.mjs.map +1 -1
  456. package/dist/esm/tools/local/LocalCodingTools.mjs +760 -1017
  457. package/dist/esm/tools/local/LocalCodingTools.mjs.map +1 -1
  458. package/dist/esm/tools/local/LocalExecutionEngine.mjs +663 -936
  459. package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
  460. package/dist/esm/tools/local/LocalExecutionTools.mjs +49 -90
  461. package/dist/esm/tools/local/LocalExecutionTools.mjs.map +1 -1
  462. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +283 -349
  463. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs.map +1 -1
  464. package/dist/esm/tools/local/attachments.mjs +108 -163
  465. package/dist/esm/tools/local/attachments.mjs.map +1 -1
  466. package/dist/esm/tools/local/bashAst.mjs +99 -111
  467. package/dist/esm/tools/local/bashAst.mjs.map +1 -1
  468. package/dist/esm/tools/local/editStrategies.mjs +126 -167
  469. package/dist/esm/tools/local/editStrategies.mjs.map +1 -1
  470. package/dist/esm/tools/local/index.mjs +13 -0
  471. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +136 -216
  472. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
  473. package/dist/esm/tools/local/syntaxCheck.mjs +138 -155
  474. package/dist/esm/tools/local/syntaxCheck.mjs.map +1 -1
  475. package/dist/esm/tools/local/textEncoding.mjs +25 -21
  476. package/dist/esm/tools/local/textEncoding.mjs.map +1 -1
  477. package/dist/esm/tools/local/workspaceFS.mjs +38 -44
  478. package/dist/esm/tools/local/workspaceFS.mjs.map +1 -1
  479. package/dist/esm/tools/ptcTimeout.mjs +27 -42
  480. package/dist/esm/tools/ptcTimeout.mjs.map +1 -1
  481. package/dist/esm/tools/schema.mjs +24 -21
  482. package/dist/esm/tools/schema.mjs.map +1 -1
  483. package/dist/esm/tools/search/anthropic.mjs +24 -31
  484. package/dist/esm/tools/search/anthropic.mjs.map +1 -1
  485. package/dist/esm/tools/search/content.mjs +93 -116
  486. package/dist/esm/tools/search/content.mjs.map +1 -1
  487. package/dist/esm/tools/search/firecrawl.mjs +139 -169
  488. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  489. package/dist/esm/tools/search/format.mjs +128 -194
  490. package/dist/esm/tools/search/format.mjs.map +1 -1
  491. package/dist/esm/tools/search/highlights.mjs +165 -230
  492. package/dist/esm/tools/search/highlights.mjs.map +1 -1
  493. package/dist/esm/tools/search/index.mjs +3 -0
  494. package/dist/esm/tools/search/rerankers.mjs +149 -168
  495. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  496. package/dist/esm/tools/search/schema.mjs +39 -37
  497. package/dist/esm/tools/search/schema.mjs.map +1 -1
  498. package/dist/esm/tools/search/search.mjs +426 -528
  499. package/dist/esm/tools/search/search.mjs.map +1 -1
  500. package/dist/esm/tools/search/serper-scraper.mjs +104 -124
  501. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
  502. package/dist/esm/tools/search/tavily-scraper.mjs +127 -178
  503. package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -1
  504. package/dist/esm/tools/search/tavily-search.mjs +293 -357
  505. package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
  506. package/dist/esm/tools/search/tool.mjs +259 -297
  507. package/dist/esm/tools/search/tool.mjs.map +1 -1
  508. package/dist/esm/tools/search/utils.mjs +74 -115
  509. package/dist/esm/tools/search/utils.mjs.map +1 -1
  510. package/dist/esm/tools/skillCatalog.mjs +54 -70
  511. package/dist/esm/tools/skillCatalog.mjs.map +1 -1
  512. package/dist/esm/tools/streamedToolCallSeals.mjs +42 -31
  513. package/dist/esm/tools/streamedToolCallSeals.mjs.map +1 -1
  514. package/dist/esm/tools/subagent/SubagentExecutor.mjs +612 -768
  515. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  516. package/dist/esm/tools/subagent/index.mjs +2 -0
  517. package/dist/esm/tools/toolOutputReferences.mjs +523 -624
  518. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
  519. package/dist/esm/utils/callbacks.mjs +11 -19
  520. package/dist/esm/utils/callbacks.mjs.map +1 -1
  521. package/dist/esm/utils/errors.mjs +70 -93
  522. package/dist/esm/utils/errors.mjs.map +1 -1
  523. package/dist/esm/utils/events.mjs +32 -40
  524. package/dist/esm/utils/events.mjs.map +1 -1
  525. package/dist/esm/utils/graph.mjs +8 -10
  526. package/dist/esm/utils/graph.mjs.map +1 -1
  527. package/dist/esm/utils/handlers.mjs +60 -80
  528. package/dist/esm/utils/handlers.mjs.map +1 -1
  529. package/dist/esm/utils/index.mjs +10 -0
  530. package/dist/esm/utils/llm.mjs +19 -25
  531. package/dist/esm/utils/llm.mjs.map +1 -1
  532. package/dist/esm/utils/misc.mjs +30 -44
  533. package/dist/esm/utils/misc.mjs.map +1 -1
  534. package/dist/esm/utils/run.mjs +50 -64
  535. package/dist/esm/utils/run.mjs.map +1 -1
  536. package/dist/esm/utils/schema.mjs +11 -17
  537. package/dist/esm/utils/schema.mjs.map +1 -1
  538. package/dist/esm/utils/title.mjs +71 -104
  539. package/dist/esm/utils/title.mjs.map +1 -1
  540. package/dist/esm/utils/tokens.mjs +186 -281
  541. package/dist/esm/utils/tokens.mjs.map +1 -1
  542. package/dist/esm/utils/truncation.mjs +95 -112
  543. package/dist/esm/utils/truncation.mjs.map +1 -1
  544. package/dist/types/llm/bedrock/utils/index.d.ts +1 -1
  545. package/dist/types/llm/bedrock/utils/message_outputs.d.ts +9 -0
  546. package/dist/types/llm/vertexai/index.d.ts +10 -0
  547. package/dist/types/tools/ToolNode.d.ts +8 -0
  548. package/dist/types/tools/search/tool.d.ts +17 -0
  549. package/dist/types/tools/search/types.d.ts +4 -0
  550. package/dist/types/tools/streamedToolCallSeals.d.ts +5 -1
  551. package/dist/types/types/tools.d.ts +10 -0
  552. package/package.json +4 -10
  553. package/src/__tests__/stream.eagerEventExecution.test.ts +703 -0
  554. package/src/llm/bedrock/index.ts +40 -0
  555. package/src/llm/bedrock/streamSealDispatch.test.ts +158 -0
  556. package/src/llm/bedrock/utils/index.ts +1 -0
  557. package/src/llm/bedrock/utils/message_outputs.test.ts +85 -0
  558. package/src/llm/bedrock/utils/message_outputs.ts +43 -0
  559. package/src/llm/google/utils/common.test.ts +64 -0
  560. package/src/llm/google/utils/common.ts +18 -0
  561. package/src/llm/openai/index.ts +95 -1
  562. package/src/llm/openai/sequentialToolCallSeals.test.ts +199 -0
  563. package/src/llm/vertexai/index.ts +31 -0
  564. package/src/llm/vertexai/sealStreamedToolCalls.test.ts +88 -0
  565. package/src/llm/vertexai/streamSealDispatch.test.ts +148 -0
  566. package/src/stream.ts +40 -6
  567. package/src/tools/ToolNode.ts +85 -3
  568. package/src/tools/__tests__/ToolNode.onResultCompletion.test.ts +368 -0
  569. package/src/tools/search/highlights.ts +9 -1
  570. package/src/tools/search/search.ts +41 -3
  571. package/src/tools/search/source-processing.test.ts +373 -0
  572. package/src/tools/search/tool.ts +22 -2
  573. package/src/tools/search/types.ts +4 -0
  574. package/src/tools/streamedToolCallSeals.ts +37 -9
  575. package/src/types/tools.ts +10 -0
  576. package/dist/cjs/langchain/google-common.cjs.map +0 -1
  577. package/dist/cjs/langchain/index.cjs.map +0 -1
  578. package/dist/cjs/langchain/language_models/chat_models.cjs.map +0 -1
  579. package/dist/cjs/langchain/messages/tool.cjs.map +0 -1
  580. package/dist/cjs/langchain/messages.cjs.map +0 -1
  581. package/dist/cjs/langchain/openai.cjs.map +0 -1
  582. package/dist/cjs/langchain/prompts.cjs.map +0 -1
  583. package/dist/cjs/langchain/runnables.cjs.map +0 -1
  584. package/dist/cjs/langchain/tools.cjs.map +0 -1
  585. package/dist/cjs/langchain/utils/env.cjs.map +0 -1
  586. package/dist/cjs/main.cjs.map +0 -1
  587. package/dist/esm/langchain/google-common.mjs.map +0 -1
  588. package/dist/esm/langchain/index.mjs.map +0 -1
  589. package/dist/esm/langchain/language_models/chat_models.mjs.map +0 -1
  590. package/dist/esm/langchain/messages/tool.mjs.map +0 -1
  591. package/dist/esm/langchain/messages.mjs.map +0 -1
  592. package/dist/esm/langchain/openai.mjs.map +0 -1
  593. package/dist/esm/langchain/prompts.mjs.map +0 -1
  594. package/dist/esm/langchain/runnables.mjs.map +0 -1
  595. package/dist/esm/langchain/tools.mjs.map +0 -1
  596. package/dist/esm/langchain/utils/env.mjs.map +0 -1
  597. package/dist/esm/main.mjs.map +0 -1
@@ -1,99 +1,81 @@
1
- 'use strict';
2
-
1
+ //#region src/messages/recency.ts
3
2
  /**
4
- * Splits `messages` into a head (older, to summarize) and a tail (recent,
5
- * to preserve verbatim) at user-message boundaries. The most recent
6
- * user-led turn is always included in the tail; additional older turns
7
- * are added subject to `turns` and `tokens` caps.
8
- *
9
- * Cutting strictly at HumanMessage boundaries ensures that:
10
- * - tool_use ↔ tool_result pairs are never split (they always live within
11
- * the same turn);
12
- * - the first user message is never replaced by a summary, addressing
13
- * the "first turn destruction" failure mode where a single large
14
- * user-pasted payload would otherwise be replaced by a generic summary.
15
- *
16
- * When `messages` contains no HumanMessage (degenerate state — e.g. system
17
- * + assistant messages from a programmatic preamble), everything is
18
- * placed in the head and the tail is empty. The summarize node treats
19
- * an empty tail as "nothing recent to preserve" and falls through to its
20
- * existing logic.
21
- */
3
+ * Splits `messages` into a head (older, to summarize) and a tail (recent,
4
+ * to preserve verbatim) at user-message boundaries. The most recent
5
+ * user-led turn is always included in the tail; additional older turns
6
+ * are added subject to `turns` and `tokens` caps.
7
+ *
8
+ * Cutting strictly at HumanMessage boundaries ensures that:
9
+ * - tool_use ↔ tool_result pairs are never split (they always live within
10
+ * the same turn);
11
+ * - the first user message is never replaced by a summary, addressing
12
+ * the "first turn destruction" failure mode where a single large
13
+ * user-pasted payload would otherwise be replaced by a generic summary.
14
+ *
15
+ * When `messages` contains no HumanMessage (degenerate state — e.g. system
16
+ * + assistant messages from a programmatic preamble), everything is
17
+ * placed in the head and the tail is empty. The summarize node treats
18
+ * an empty tail as "nothing recent to preserve" and falls through to its
19
+ * existing logic.
20
+ */
22
21
  function splitAtRecencyBoundary(messages, options = {}) {
23
- const turnsCap = options.turns ?? 2;
24
- if (messages.length === 0 || turnsCap <= 0) {
25
- return {
26
- head: messages,
27
- tail: [],
28
- tailTurnCount: 0,
29
- tailStartIndex: messages.length,
30
- };
31
- }
32
- const turnStarts = [];
33
- for (let i = 0; i < messages.length; i++) {
34
- if (messages[i].getType() === 'human') {
35
- turnStarts.push(i);
36
- }
37
- }
38
- if (turnStarts.length === 0) {
39
- return {
40
- head: messages,
41
- tail: [],
42
- tailTurnCount: 0,
43
- tailStartIndex: messages.length,
44
- };
45
- }
46
- const lastTurnStart = turnStarts[turnStarts.length - 1];
47
- let tailStartIndex = lastTurnStart;
48
- let tailTurnCount = 1;
49
- const tokensCap = options.tokens;
50
- const tokenCounter = options.tokenCounter;
51
- const trackTokens = tokensCap != null && Number.isFinite(tokensCap) && tokenCounter != null;
52
- /**
53
- * Token-counting strategy: each candidate turn `t` spans the half-open
54
- * range `[turnStarts[t], turnStarts[t + 1])` (or `[turnStarts[t], messages.length)`
55
- * for the most recent turn). Successive iterations of the outer loop
56
- * walk older turns one at a time and never revisit messages from a
57
- * later turn — so each message contributes to `tokenCounter` at most
58
- * once across the entire selection, making the boundary search
59
- * `O(messages_in_visited_turns)` and bounded by `O(messages.length)`
60
- * even before the `turnsCap` short-circuit applies. The inner upper
61
- * bound uses `turnStarts[t + 1]` (a value derived from immutable
62
- * `turnStarts`) rather than the mutated `tailStartIndex` to make the
63
- * disjoint-range invariant self-evident.
64
- */
65
- let tailTokens = 0;
66
- if (trackTokens) {
67
- for (let i = lastTurnStart; i < messages.length; i++) {
68
- tailTokens += tokenCounter(messages[i]);
69
- }
70
- }
71
- for (let t = turnStarts.length - 2; t >= 0; t--) {
72
- if (tailTurnCount >= turnsCap) {
73
- break;
74
- }
75
- const turnStart = turnStarts[t];
76
- const turnEnd = turnStarts[t + 1];
77
- if (trackTokens) {
78
- let turnTokens = 0;
79
- for (let i = turnStart; i < turnEnd; i++) {
80
- turnTokens += tokenCounter(messages[i]);
81
- }
82
- if (tailTokens + turnTokens > tokensCap) {
83
- break;
84
- }
85
- tailTokens += turnTokens;
86
- }
87
- tailStartIndex = turnStart;
88
- tailTurnCount += 1;
89
- }
90
- return {
91
- head: messages.slice(0, tailStartIndex),
92
- tail: messages.slice(tailStartIndex),
93
- tailTurnCount,
94
- tailStartIndex,
95
- };
22
+ const turnsCap = options.turns ?? 2;
23
+ if (messages.length === 0 || turnsCap <= 0) return {
24
+ head: messages,
25
+ tail: [],
26
+ tailTurnCount: 0,
27
+ tailStartIndex: messages.length
28
+ };
29
+ const turnStarts = [];
30
+ for (let i = 0; i < messages.length; i++) if (messages[i].getType() === "human") turnStarts.push(i);
31
+ if (turnStarts.length === 0) return {
32
+ head: messages,
33
+ tail: [],
34
+ tailTurnCount: 0,
35
+ tailStartIndex: messages.length
36
+ };
37
+ const lastTurnStart = turnStarts[turnStarts.length - 1];
38
+ let tailStartIndex = lastTurnStart;
39
+ let tailTurnCount = 1;
40
+ const tokensCap = options.tokens;
41
+ const tokenCounter = options.tokenCounter;
42
+ const trackTokens = tokensCap != null && Number.isFinite(tokensCap) && tokenCounter != null;
43
+ /**
44
+ * Token-counting strategy: each candidate turn `t` spans the half-open
45
+ * range `[turnStarts[t], turnStarts[t + 1])` (or `[turnStarts[t], messages.length)`
46
+ * for the most recent turn). Successive iterations of the outer loop
47
+ * walk older turns one at a time and never revisit messages from a
48
+ * later turn — so each message contributes to `tokenCounter` at most
49
+ * once across the entire selection, making the boundary search
50
+ * `O(messages_in_visited_turns)` and bounded by `O(messages.length)`
51
+ * even before the `turnsCap` short-circuit applies. The inner upper
52
+ * bound uses `turnStarts[t + 1]` (a value derived from immutable
53
+ * `turnStarts`) rather than the mutated `tailStartIndex` to make the
54
+ * disjoint-range invariant self-evident.
55
+ */
56
+ let tailTokens = 0;
57
+ if (trackTokens) for (let i = lastTurnStart; i < messages.length; i++) tailTokens += tokenCounter(messages[i]);
58
+ for (let t = turnStarts.length - 2; t >= 0; t--) {
59
+ if (tailTurnCount >= turnsCap) break;
60
+ const turnStart = turnStarts[t];
61
+ const turnEnd = turnStarts[t + 1];
62
+ if (trackTokens) {
63
+ let turnTokens = 0;
64
+ for (let i = turnStart; i < turnEnd; i++) turnTokens += tokenCounter(messages[i]);
65
+ if (tailTokens + turnTokens > tokensCap) break;
66
+ tailTokens += turnTokens;
67
+ }
68
+ tailStartIndex = turnStart;
69
+ tailTurnCount += 1;
70
+ }
71
+ return {
72
+ head: messages.slice(0, tailStartIndex),
73
+ tail: messages.slice(tailStartIndex),
74
+ tailTurnCount,
75
+ tailStartIndex
76
+ };
96
77
  }
97
-
78
+ //#endregion
98
79
  exports.splitAtRecencyBoundary = splitAtRecencyBoundary;
99
- //# sourceMappingURL=recency.cjs.map
80
+
81
+ //# sourceMappingURL=recency.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"recency.cjs","sources":["../../../src/messages/recency.ts"],"sourcesContent":["import type { BaseMessage } from '@langchain/core/messages';\n\n/**\n * Configuration for splitting a message list into a head (to be summarized)\n * and a tail (to be preserved verbatim).\n */\nexport interface RecencyWindowOptions {\n /**\n * Maximum number of recent user-led turns to keep in the tail. A \"turn\"\n * begins at a HumanMessage and includes every following AIMessage and\n * ToolMessage up to (but not including) the next HumanMessage. Cutting\n * at turn boundaries guarantees that tool_use / tool_result pairs are\n * never split across the head/tail divide.\n *\n * The most recent turn is always preserved regardless of this value or\n * the token cap, so that a single oversized first message is never\n * destroyed by summarization.\n *\n * Defaults to `2`. A value of `0` disables the recency window (head =\n * everything, tail = empty), restoring the pre-recency-window behavior.\n */\n turns?: number;\n /**\n * Optional cap on tail size in tokens. When set, additional turns\n * beyond the most recent one are added to the tail only while the\n * cumulative token count stays at or below this cap. Turns are added\n * whole — never partially — so a turn that would exceed the cap is\n * left in the head.\n *\n * The most recent turn is always preserved even if it exceeds the cap.\n */\n tokens?: number;\n /** Token-counter used to evaluate the optional `tokens` cap. */\n tokenCounter?: (m: BaseMessage) => number;\n}\n\nexport interface RecencySplit {\n /** Older messages eligible for summarization. Empty when nothing to summarize. */\n head: BaseMessage[];\n /** Recent messages preserved verbatim. Always contains the most recent turn when any HumanMessage exists. */\n tail: BaseMessage[];\n /** Number of user-led turns retained in the tail (0 if no HumanMessage exists). */\n tailTurnCount: number;\n /** Index in the original `messages` array where the tail begins. */\n tailStartIndex: number;\n}\n\n/**\n * Splits `messages` into a head (older, to summarize) and a tail (recent,\n * to preserve verbatim) at user-message boundaries. The most recent\n * user-led turn is always included in the tail; additional older turns\n * are added subject to `turns` and `tokens` caps.\n *\n * Cutting strictly at HumanMessage boundaries ensures that:\n * - tool_use ↔ tool_result pairs are never split (they always live within\n * the same turn);\n * - the first user message is never replaced by a summary, addressing\n * the \"first turn destruction\" failure mode where a single large\n * user-pasted payload would otherwise be replaced by a generic summary.\n *\n * When `messages` contains no HumanMessage (degenerate state — e.g. system\n * + assistant messages from a programmatic preamble), everything is\n * placed in the head and the tail is empty. The summarize node treats\n * an empty tail as \"nothing recent to preserve\" and falls through to its\n * existing logic.\n */\nexport function splitAtRecencyBoundary(\n messages: BaseMessage[],\n options: RecencyWindowOptions = {}\n): RecencySplit {\n const turnsCap = options.turns ?? 2;\n\n if (messages.length === 0 || turnsCap <= 0) {\n return {\n head: messages,\n tail: [],\n tailTurnCount: 0,\n tailStartIndex: messages.length,\n };\n }\n\n const turnStarts: number[] = [];\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].getType() === 'human') {\n turnStarts.push(i);\n }\n }\n\n if (turnStarts.length === 0) {\n return {\n head: messages,\n tail: [],\n tailTurnCount: 0,\n tailStartIndex: messages.length,\n };\n }\n\n const lastTurnStart = turnStarts[turnStarts.length - 1] as number;\n let tailStartIndex = lastTurnStart;\n let tailTurnCount = 1;\n\n const tokensCap = options.tokens;\n const tokenCounter = options.tokenCounter;\n const trackTokens =\n tokensCap != null && Number.isFinite(tokensCap) && tokenCounter != null;\n\n /**\n * Token-counting strategy: each candidate turn `t` spans the half-open\n * range `[turnStarts[t], turnStarts[t + 1])` (or `[turnStarts[t], messages.length)`\n * for the most recent turn). Successive iterations of the outer loop\n * walk older turns one at a time and never revisit messages from a\n * later turn — so each message contributes to `tokenCounter` at most\n * once across the entire selection, making the boundary search\n * `O(messages_in_visited_turns)` and bounded by `O(messages.length)`\n * even before the `turnsCap` short-circuit applies. The inner upper\n * bound uses `turnStarts[t + 1]` (a value derived from immutable\n * `turnStarts`) rather than the mutated `tailStartIndex` to make the\n * disjoint-range invariant self-evident.\n */\n let tailTokens = 0;\n if (trackTokens) {\n for (let i = lastTurnStart; i < messages.length; i++) {\n tailTokens += tokenCounter(messages[i] as BaseMessage);\n }\n }\n\n for (let t = turnStarts.length - 2; t >= 0; t--) {\n if (tailTurnCount >= turnsCap) {\n break;\n }\n const turnStart = turnStarts[t] as number;\n const turnEnd = turnStarts[t + 1] as number;\n\n if (trackTokens) {\n let turnTokens = 0;\n for (let i = turnStart; i < turnEnd; i++) {\n turnTokens += tokenCounter(messages[i] as BaseMessage);\n }\n if (tailTokens + turnTokens > (tokensCap as number)) {\n break;\n }\n tailTokens += turnTokens;\n }\n\n tailStartIndex = turnStart;\n tailTurnCount += 1;\n }\n\n return {\n head: messages.slice(0, tailStartIndex),\n tail: messages.slice(tailStartIndex),\n tailTurnCount,\n tailStartIndex,\n };\n}\n"],"names":[],"mappings":";;AA+CA;;;;;;;;;;;;;;;;;;AAkBG;SACa,sBAAsB,CACpC,QAAuB,EACvB,UAAgC,EAAE,EAAA;AAElC,IAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC;IAEnC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE;QAC1C,OAAO;AACL,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,aAAa,EAAE,CAAC;YAChB,cAAc,EAAE,QAAQ,CAAC,MAAM;SAChC;IACH;IAEA,MAAM,UAAU,GAAa,EAAE;AAC/B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACxC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,OAAO,EAAE;AACrC,YAAA,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACpB;IACF;AAEA,IAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;QAC3B,OAAO;AACL,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,aAAa,EAAE,CAAC;YAChB,cAAc,EAAE,QAAQ,CAAC,MAAM;SAChC;IACH;IAEA,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAW;IACjE,IAAI,cAAc,GAAG,aAAa;IAClC,IAAI,aAAa,GAAG,CAAC;AAErB,IAAA,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM;AAChC,IAAA,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY;AACzC,IAAA,MAAM,WAAW,GACf,SAAS,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,YAAY,IAAI,IAAI;AAEzE;;;;;;;;;;;;AAYG;IACH,IAAI,UAAU,GAAG,CAAC;IAClB,IAAI,WAAW,EAAE;AACf,QAAA,KAAK,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpD,UAAU,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAgB,CAAC;QACxD;IACF;AAEA,IAAA,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAC/C,QAAA,IAAI,aAAa,IAAI,QAAQ,EAAE;YAC7B;QACF;AACA,QAAA,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAW;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAW;QAE3C,IAAI,WAAW,EAAE;YACf,IAAI,UAAU,GAAG,CAAC;AAClB,YAAA,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;gBACxC,UAAU,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAgB,CAAC;YACxD;AACA,YAAA,IAAI,UAAU,GAAG,UAAU,GAAI,SAAoB,EAAE;gBACnD;YACF;YACA,UAAU,IAAI,UAAU;QAC1B;QAEA,cAAc,GAAG,SAAS;QAC1B,aAAa,IAAI,CAAC;IACpB;IAEA,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC;AACvC,QAAA,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC;QACpC,aAAa;QACb,cAAc;KACf;AACH;;;;"}
1
+ {"version":3,"file":"recency.cjs","names":[],"sources":["../../../src/messages/recency.ts"],"sourcesContent":["import type { BaseMessage } from '@langchain/core/messages';\n\n/**\n * Configuration for splitting a message list into a head (to be summarized)\n * and a tail (to be preserved verbatim).\n */\nexport interface RecencyWindowOptions {\n /**\n * Maximum number of recent user-led turns to keep in the tail. A \"turn\"\n * begins at a HumanMessage and includes every following AIMessage and\n * ToolMessage up to (but not including) the next HumanMessage. Cutting\n * at turn boundaries guarantees that tool_use / tool_result pairs are\n * never split across the head/tail divide.\n *\n * The most recent turn is always preserved regardless of this value or\n * the token cap, so that a single oversized first message is never\n * destroyed by summarization.\n *\n * Defaults to `2`. A value of `0` disables the recency window (head =\n * everything, tail = empty), restoring the pre-recency-window behavior.\n */\n turns?: number;\n /**\n * Optional cap on tail size in tokens. When set, additional turns\n * beyond the most recent one are added to the tail only while the\n * cumulative token count stays at or below this cap. Turns are added\n * whole — never partially — so a turn that would exceed the cap is\n * left in the head.\n *\n * The most recent turn is always preserved even if it exceeds the cap.\n */\n tokens?: number;\n /** Token-counter used to evaluate the optional `tokens` cap. */\n tokenCounter?: (m: BaseMessage) => number;\n}\n\nexport interface RecencySplit {\n /** Older messages eligible for summarization. Empty when nothing to summarize. */\n head: BaseMessage[];\n /** Recent messages preserved verbatim. Always contains the most recent turn when any HumanMessage exists. */\n tail: BaseMessage[];\n /** Number of user-led turns retained in the tail (0 if no HumanMessage exists). */\n tailTurnCount: number;\n /** Index in the original `messages` array where the tail begins. */\n tailStartIndex: number;\n}\n\n/**\n * Splits `messages` into a head (older, to summarize) and a tail (recent,\n * to preserve verbatim) at user-message boundaries. The most recent\n * user-led turn is always included in the tail; additional older turns\n * are added subject to `turns` and `tokens` caps.\n *\n * Cutting strictly at HumanMessage boundaries ensures that:\n * - tool_use ↔ tool_result pairs are never split (they always live within\n * the same turn);\n * - the first user message is never replaced by a summary, addressing\n * the \"first turn destruction\" failure mode where a single large\n * user-pasted payload would otherwise be replaced by a generic summary.\n *\n * When `messages` contains no HumanMessage (degenerate state — e.g. system\n * + assistant messages from a programmatic preamble), everything is\n * placed in the head and the tail is empty. The summarize node treats\n * an empty tail as \"nothing recent to preserve\" and falls through to its\n * existing logic.\n */\nexport function splitAtRecencyBoundary(\n messages: BaseMessage[],\n options: RecencyWindowOptions = {}\n): RecencySplit {\n const turnsCap = options.turns ?? 2;\n\n if (messages.length === 0 || turnsCap <= 0) {\n return {\n head: messages,\n tail: [],\n tailTurnCount: 0,\n tailStartIndex: messages.length,\n };\n }\n\n const turnStarts: number[] = [];\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].getType() === 'human') {\n turnStarts.push(i);\n }\n }\n\n if (turnStarts.length === 0) {\n return {\n head: messages,\n tail: [],\n tailTurnCount: 0,\n tailStartIndex: messages.length,\n };\n }\n\n const lastTurnStart = turnStarts[turnStarts.length - 1] as number;\n let tailStartIndex = lastTurnStart;\n let tailTurnCount = 1;\n\n const tokensCap = options.tokens;\n const tokenCounter = options.tokenCounter;\n const trackTokens =\n tokensCap != null && Number.isFinite(tokensCap) && tokenCounter != null;\n\n /**\n * Token-counting strategy: each candidate turn `t` spans the half-open\n * range `[turnStarts[t], turnStarts[t + 1])` (or `[turnStarts[t], messages.length)`\n * for the most recent turn). Successive iterations of the outer loop\n * walk older turns one at a time and never revisit messages from a\n * later turn — so each message contributes to `tokenCounter` at most\n * once across the entire selection, making the boundary search\n * `O(messages_in_visited_turns)` and bounded by `O(messages.length)`\n * even before the `turnsCap` short-circuit applies. The inner upper\n * bound uses `turnStarts[t + 1]` (a value derived from immutable\n * `turnStarts`) rather than the mutated `tailStartIndex` to make the\n * disjoint-range invariant self-evident.\n */\n let tailTokens = 0;\n if (trackTokens) {\n for (let i = lastTurnStart; i < messages.length; i++) {\n tailTokens += tokenCounter(messages[i] as BaseMessage);\n }\n }\n\n for (let t = turnStarts.length - 2; t >= 0; t--) {\n if (tailTurnCount >= turnsCap) {\n break;\n }\n const turnStart = turnStarts[t] as number;\n const turnEnd = turnStarts[t + 1] as number;\n\n if (trackTokens) {\n let turnTokens = 0;\n for (let i = turnStart; i < turnEnd; i++) {\n turnTokens += tokenCounter(messages[i] as BaseMessage);\n }\n if (tailTokens + turnTokens > (tokensCap as number)) {\n break;\n }\n tailTokens += turnTokens;\n }\n\n tailStartIndex = turnStart;\n tailTurnCount += 1;\n }\n\n return {\n head: messages.slice(0, tailStartIndex),\n tail: messages.slice(tailStartIndex),\n tailTurnCount,\n tailStartIndex,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAkEA,SAAgB,uBACd,UACA,UAAgC,CAAC,GACnB;CACd,MAAM,WAAW,QAAQ,SAAS;CAElC,IAAI,SAAS,WAAW,KAAK,YAAY,GACvC,OAAO;EACL,MAAM;EACN,MAAM,CAAC;EACP,eAAe;EACf,gBAAgB,SAAS;CAC3B;CAGF,MAAM,aAAuB,CAAC;CAC9B,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KACnC,IAAI,SAAS,EAAE,CAAC,QAAQ,MAAM,SAC5B,WAAW,KAAK,CAAC;CAIrB,IAAI,WAAW,WAAW,GACxB,OAAO;EACL,MAAM;EACN,MAAM,CAAC;EACP,eAAe;EACf,gBAAgB,SAAS;CAC3B;CAGF,MAAM,gBAAgB,WAAW,WAAW,SAAS;CACrD,IAAI,iBAAiB;CACrB,IAAI,gBAAgB;CAEpB,MAAM,YAAY,QAAQ;CAC1B,MAAM,eAAe,QAAQ;CAC7B,MAAM,cACJ,aAAa,QAAQ,OAAO,SAAS,SAAS,KAAK,gBAAgB;;;;;;;;;;;;;;CAerE,IAAI,aAAa;CACjB,IAAI,aACF,KAAK,IAAI,IAAI,eAAe,IAAI,SAAS,QAAQ,KAC/C,cAAc,aAAa,SAAS,EAAiB;CAIzD,KAAK,IAAI,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,KAAK;EAC/C,IAAI,iBAAiB,UACnB;EAEF,MAAM,YAAY,WAAW;EAC7B,MAAM,UAAU,WAAW,IAAI;EAE/B,IAAI,aAAa;GACf,IAAI,aAAa;GACjB,KAAK,IAAI,IAAI,WAAW,IAAI,SAAS,KACnC,cAAc,aAAa,SAAS,EAAiB;GAEvD,IAAI,aAAa,aAAc,WAC7B;GAEF,cAAc;EAChB;EAEA,iBAAiB;EACjB,iBAAiB;CACnB;CAEA,OAAO;EACL,MAAM,SAAS,MAAM,GAAG,cAAc;EACtC,MAAM,SAAS,MAAM,cAAc;EACnC;EACA;CACF;AACF"}
@@ -1,87 +1,72 @@
1
- 'use strict';
2
-
3
- var uuid = require('uuid');
4
- var messages = require('@langchain/core/messages');
5
-
6
- const REMOVE_ALL_MESSAGES = '__remove_all__';
1
+ let _langchain_core_messages = require("@langchain/core/messages");
2
+ let uuid = require("uuid");
3
+ //#region src/messages/reducer.ts
4
+ const REMOVE_ALL_MESSAGES = "__remove_all__";
7
5
  /**
8
- * Creates a message that instructs messagesStateReducer to remove ALL
9
- * existing messages from state. Messages appearing after this one in
10
- * the array become the new state.
11
- *
12
- * Usage (in a node return value):
13
- * ```ts
14
- * return { messages: [createRemoveAllMessage(), ...survivingMessages] };
15
- * ```
16
- *
17
- * This works because the reducer checks for `getType() === 'remove'`
18
- * with `id === REMOVE_ALL_MESSAGES` and discards everything before it.
19
- *
20
- * NOTE: Uses RemoveMessage from @langchain/core with a sentinel id so
21
- * the reducer can distinguish a "remove-all" marker from a single-message
22
- * removal.
23
- */
6
+ * Creates a message that instructs messagesStateReducer to remove ALL
7
+ * existing messages from state. Messages appearing after this one in
8
+ * the array become the new state.
9
+ *
10
+ * Usage (in a node return value):
11
+ * ```ts
12
+ * return { messages: [createRemoveAllMessage(), ...survivingMessages] };
13
+ * ```
14
+ *
15
+ * This works because the reducer checks for `getType() === 'remove'`
16
+ * with `id === REMOVE_ALL_MESSAGES` and discards everything before it.
17
+ *
18
+ * NOTE: Uses RemoveMessage from @langchain/core with a sentinel id so
19
+ * the reducer can distinguish a "remove-all" marker from a single-message
20
+ * removal.
21
+ */
24
22
  function createRemoveAllMessage() {
25
- return new messages.RemoveMessage({ id: REMOVE_ALL_MESSAGES });
23
+ return new _langchain_core_messages.RemoveMessage({ id: REMOVE_ALL_MESSAGES });
26
24
  }
27
25
  /**
28
- * Prebuilt reducer that combines returned messages.
29
- * Can handle standard messages and special modifiers like {@link RemoveMessage}
30
- * instances.
31
- */
26
+ * Prebuilt reducer that combines returned messages.
27
+ * Can handle standard messages and special modifiers like {@link RemoveMessage}
28
+ * instances.
29
+ */
32
30
  function messagesStateReducer(left, right) {
33
- const leftArray = Array.isArray(left) ? left : [left];
34
- const rightArray = Array.isArray(right) ? right : [right];
35
- // coerce to message
36
- const leftMessages = leftArray.map(messages.coerceMessageLikeToMessage);
37
- const rightMessages = rightArray.map(messages.coerceMessageLikeToMessage);
38
- // assign missing ids
39
- for (const m of leftMessages) {
40
- if (m.id === null || m.id === undefined) {
41
- m.id = uuid.v4();
42
- m.lc_kwargs.id = m.id;
43
- }
44
- }
45
- let removeAllIdx;
46
- for (let i = 0; i < rightMessages.length; i += 1) {
47
- const m = rightMessages[i];
48
- if (m.id === null || m.id === undefined) {
49
- m.id = uuid.v4();
50
- m.lc_kwargs.id = m.id;
51
- }
52
- if (m.getType() === 'remove' && m.id === REMOVE_ALL_MESSAGES) {
53
- removeAllIdx = i;
54
- }
55
- }
56
- if (removeAllIdx != null)
57
- return rightMessages.slice(removeAllIdx + 1);
58
- // merge
59
- const merged = [...leftMessages];
60
- const mergedById = new Map(merged.map((m, i) => [m.id, i]));
61
- const idsToRemove = new Set();
62
- for (const m of rightMessages) {
63
- const existingIdx = mergedById.get(m.id);
64
- if (existingIdx !== undefined) {
65
- if (m.getType() === 'remove') {
66
- idsToRemove.add(m.id);
67
- }
68
- else {
69
- idsToRemove.delete(m.id);
70
- merged[existingIdx] = m;
71
- }
72
- }
73
- else {
74
- if (m.getType() === 'remove') {
75
- throw new Error(`Attempting to delete a message with an ID that doesn't exist ('${m.id}')`);
76
- }
77
- mergedById.set(m.id, merged.length);
78
- merged.push(m);
79
- }
80
- }
81
- return merged.filter((m) => !idsToRemove.has(m.id));
31
+ const leftArray = Array.isArray(left) ? left : [left];
32
+ const rightArray = Array.isArray(right) ? right : [right];
33
+ const leftMessages = leftArray.map(_langchain_core_messages.coerceMessageLikeToMessage);
34
+ const rightMessages = rightArray.map(_langchain_core_messages.coerceMessageLikeToMessage);
35
+ for (const m of leftMessages) if (m.id === null || m.id === void 0) {
36
+ m.id = (0, uuid.v4)();
37
+ m.lc_kwargs.id = m.id;
38
+ }
39
+ let removeAllIdx;
40
+ for (let i = 0; i < rightMessages.length; i += 1) {
41
+ const m = rightMessages[i];
42
+ if (m.id === null || m.id === void 0) {
43
+ m.id = (0, uuid.v4)();
44
+ m.lc_kwargs.id = m.id;
45
+ }
46
+ if (m.getType() === "remove" && m.id === "__remove_all__") removeAllIdx = i;
47
+ }
48
+ if (removeAllIdx != null) return rightMessages.slice(removeAllIdx + 1);
49
+ const merged = [...leftMessages];
50
+ const mergedById = new Map(merged.map((m, i) => [m.id, i]));
51
+ const idsToRemove = /* @__PURE__ */ new Set();
52
+ for (const m of rightMessages) {
53
+ const existingIdx = mergedById.get(m.id);
54
+ if (existingIdx !== void 0) if (m.getType() === "remove") idsToRemove.add(m.id);
55
+ else {
56
+ idsToRemove.delete(m.id);
57
+ merged[existingIdx] = m;
58
+ }
59
+ else {
60
+ if (m.getType() === "remove") throw new Error(`Attempting to delete a message with an ID that doesn't exist ('${m.id}')`);
61
+ mergedById.set(m.id, merged.length);
62
+ merged.push(m);
63
+ }
64
+ }
65
+ return merged.filter((m) => !idsToRemove.has(m.id));
82
66
  }
83
-
67
+ //#endregion
84
68
  exports.REMOVE_ALL_MESSAGES = REMOVE_ALL_MESSAGES;
85
69
  exports.createRemoveAllMessage = createRemoveAllMessage;
86
70
  exports.messagesStateReducer = messagesStateReducer;
87
- //# sourceMappingURL=reducer.cjs.map
71
+
72
+ //# sourceMappingURL=reducer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"reducer.cjs","sources":["../../../src/messages/reducer.ts"],"sourcesContent":["import { v4 } from 'uuid';\nimport {\n BaseMessage,\n RemoveMessage,\n BaseMessageLike,\n coerceMessageLikeToMessage,\n} from '@langchain/core/messages';\n\nexport const REMOVE_ALL_MESSAGES = '__remove_all__';\n\n/**\n * Creates a message that instructs messagesStateReducer to remove ALL\n * existing messages from state. Messages appearing after this one in\n * the array become the new state.\n *\n * Usage (in a node return value):\n * ```ts\n * return { messages: [createRemoveAllMessage(), ...survivingMessages] };\n * ```\n *\n * This works because the reducer checks for `getType() === 'remove'`\n * with `id === REMOVE_ALL_MESSAGES` and discards everything before it.\n *\n * NOTE: Uses RemoveMessage from @langchain/core with a sentinel id so\n * the reducer can distinguish a \"remove-all\" marker from a single-message\n * removal.\n */\nexport function createRemoveAllMessage(): BaseMessage {\n return new RemoveMessage({ id: REMOVE_ALL_MESSAGES });\n}\n\nexport type Messages =\n | Array<BaseMessage | BaseMessageLike>\n | BaseMessage\n | BaseMessageLike;\n\n/**\n * Prebuilt reducer that combines returned messages.\n * Can handle standard messages and special modifiers like {@link RemoveMessage}\n * instances.\n */\nexport function messagesStateReducer(\n left: Messages,\n right: Messages\n): BaseMessage[] {\n const leftArray = Array.isArray(left) ? left : [left];\n const rightArray = Array.isArray(right) ? right : [right];\n // coerce to message\n const leftMessages = (leftArray as BaseMessageLike[]).map(\n coerceMessageLikeToMessage\n );\n const rightMessages = (rightArray as BaseMessageLike[]).map(\n coerceMessageLikeToMessage\n );\n // assign missing ids\n for (const m of leftMessages) {\n if (m.id === null || m.id === undefined) {\n m.id = v4();\n m.lc_kwargs.id = m.id;\n }\n }\n\n let removeAllIdx: number | undefined;\n for (let i = 0; i < rightMessages.length; i += 1) {\n const m = rightMessages[i];\n if (m.id === null || m.id === undefined) {\n m.id = v4();\n m.lc_kwargs.id = m.id;\n }\n\n if (m.getType() === 'remove' && m.id === REMOVE_ALL_MESSAGES) {\n removeAllIdx = i;\n }\n }\n\n if (removeAllIdx != null) return rightMessages.slice(removeAllIdx + 1);\n\n // merge\n const merged = [...leftMessages];\n const mergedById = new Map(merged.map((m, i) => [m.id, i]));\n const idsToRemove = new Set();\n for (const m of rightMessages) {\n const existingIdx = mergedById.get(m.id);\n if (existingIdx !== undefined) {\n if (m.getType() === 'remove') {\n idsToRemove.add(m.id);\n } else {\n idsToRemove.delete(m.id);\n merged[existingIdx] = m;\n }\n } else {\n if (m.getType() === 'remove') {\n throw new Error(\n `Attempting to delete a message with an ID that doesn't exist ('${m.id}')`\n );\n }\n mergedById.set(m.id, merged.length);\n merged.push(m);\n }\n }\n return merged.filter((m) => !idsToRemove.has(m.id));\n}\n"],"names":["RemoveMessage","coerceMessageLikeToMessage","v4"],"mappings":"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"}
1
+ {"version":3,"file":"reducer.cjs","names":["RemoveMessage","coerceMessageLikeToMessage"],"sources":["../../../src/messages/reducer.ts"],"sourcesContent":["import { v4 } from 'uuid';\nimport {\n BaseMessage,\n RemoveMessage,\n BaseMessageLike,\n coerceMessageLikeToMessage,\n} from '@langchain/core/messages';\n\nexport const REMOVE_ALL_MESSAGES = '__remove_all__';\n\n/**\n * Creates a message that instructs messagesStateReducer to remove ALL\n * existing messages from state. Messages appearing after this one in\n * the array become the new state.\n *\n * Usage (in a node return value):\n * ```ts\n * return { messages: [createRemoveAllMessage(), ...survivingMessages] };\n * ```\n *\n * This works because the reducer checks for `getType() === 'remove'`\n * with `id === REMOVE_ALL_MESSAGES` and discards everything before it.\n *\n * NOTE: Uses RemoveMessage from @langchain/core with a sentinel id so\n * the reducer can distinguish a \"remove-all\" marker from a single-message\n * removal.\n */\nexport function createRemoveAllMessage(): BaseMessage {\n return new RemoveMessage({ id: REMOVE_ALL_MESSAGES });\n}\n\nexport type Messages =\n | Array<BaseMessage | BaseMessageLike>\n | BaseMessage\n | BaseMessageLike;\n\n/**\n * Prebuilt reducer that combines returned messages.\n * Can handle standard messages and special modifiers like {@link RemoveMessage}\n * instances.\n */\nexport function messagesStateReducer(\n left: Messages,\n right: Messages\n): BaseMessage[] {\n const leftArray = Array.isArray(left) ? left : [left];\n const rightArray = Array.isArray(right) ? right : [right];\n // coerce to message\n const leftMessages = (leftArray as BaseMessageLike[]).map(\n coerceMessageLikeToMessage\n );\n const rightMessages = (rightArray as BaseMessageLike[]).map(\n coerceMessageLikeToMessage\n );\n // assign missing ids\n for (const m of leftMessages) {\n if (m.id === null || m.id === undefined) {\n m.id = v4();\n m.lc_kwargs.id = m.id;\n }\n }\n\n let removeAllIdx: number | undefined;\n for (let i = 0; i < rightMessages.length; i += 1) {\n const m = rightMessages[i];\n if (m.id === null || m.id === undefined) {\n m.id = v4();\n m.lc_kwargs.id = m.id;\n }\n\n if (m.getType() === 'remove' && m.id === REMOVE_ALL_MESSAGES) {\n removeAllIdx = i;\n }\n }\n\n if (removeAllIdx != null) return rightMessages.slice(removeAllIdx + 1);\n\n // merge\n const merged = [...leftMessages];\n const mergedById = new Map(merged.map((m, i) => [m.id, i]));\n const idsToRemove = new Set();\n for (const m of rightMessages) {\n const existingIdx = mergedById.get(m.id);\n if (existingIdx !== undefined) {\n if (m.getType() === 'remove') {\n idsToRemove.add(m.id);\n } else {\n idsToRemove.delete(m.id);\n merged[existingIdx] = m;\n }\n } else {\n if (m.getType() === 'remove') {\n throw new Error(\n `Attempting to delete a message with an ID that doesn't exist ('${m.id}')`\n );\n }\n mergedById.set(m.id, merged.length);\n merged.push(m);\n }\n }\n return merged.filter((m) => !idsToRemove.has(m.id));\n}\n"],"mappings":";;;AAQA,MAAa,sBAAsB;;;;;;;;;;;;;;;;;;AAmBnC,SAAgB,yBAAsC;CACpD,OAAO,IAAIA,yBAAAA,cAAc,EAAE,IAAI,oBAAoB,CAAC;AACtD;;;;;;AAYA,SAAgB,qBACd,MACA,OACe;CACf,MAAM,YAAY,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;CACpD,MAAM,aAAa,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;CAExD,MAAM,eAAgB,UAAgC,IACpDC,yBAAAA,0BACF;CACA,MAAM,gBAAiB,WAAiC,IACtDA,yBAAAA,0BACF;CAEA,KAAK,MAAM,KAAK,cACd,IAAI,EAAE,OAAO,QAAQ,EAAE,OAAO,KAAA,GAAW;EACvC,EAAE,MAAA,GAAA,KAAA,GAAA,CAAQ;EACV,EAAE,UAAU,KAAK,EAAE;CACrB;CAGF,IAAI;CACJ,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK,GAAG;EAChD,MAAM,IAAI,cAAc;EACxB,IAAI,EAAE,OAAO,QAAQ,EAAE,OAAO,KAAA,GAAW;GACvC,EAAE,MAAA,GAAA,KAAA,GAAA,CAAQ;GACV,EAAE,UAAU,KAAK,EAAE;EACrB;EAEA,IAAI,EAAE,QAAQ,MAAM,YAAY,EAAE,OAAA,kBAChC,eAAe;CAEnB;CAEA,IAAI,gBAAgB,MAAM,OAAO,cAAc,MAAM,eAAe,CAAC;CAGrE,MAAM,SAAS,CAAC,GAAG,YAAY;CAC/B,MAAM,aAAa,IAAI,IAAI,OAAO,KAAK,GAAG,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;CAC1D,MAAM,8BAAc,IAAI,IAAI;CAC5B,KAAK,MAAM,KAAK,eAAe;EAC7B,MAAM,cAAc,WAAW,IAAI,EAAE,EAAE;EACvC,IAAI,gBAAgB,KAAA,GAClB,IAAI,EAAE,QAAQ,MAAM,UAClB,YAAY,IAAI,EAAE,EAAE;OACf;GACL,YAAY,OAAO,EAAE,EAAE;GACvB,OAAO,eAAe;EACxB;OACK;GACL,IAAI,EAAE,QAAQ,MAAM,UAClB,MAAM,IAAI,MACR,kEAAkE,EAAE,GAAG,GACzE;GAEF,WAAW,IAAI,EAAE,IAAI,OAAO,MAAM;GAClC,OAAO,KAAK,CAAC;EACf;CACF;CACA,OAAO,OAAO,QAAQ,MAAM,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;AACpD"}
@@ -1,85 +1,57 @@
1
- 'use strict';
2
-
3
- var messages = require('@langchain/core/messages');
4
- var core = require('./core.cjs');
5
- var _enum = require('../common/enum.cjs');
6
-
7
- // src/messages/toolDiscovery.ts
1
+ require("../common/enum.cjs");
2
+ require("../common/index.cjs");
3
+ const require_core = require("./core.cjs");
4
+ let _langchain_core_messages = require("@langchain/core/messages");
5
+ //#region src/messages/tools.ts
8
6
  /**
9
- * Extracts discovered tool names from tool search results in the current turn.
10
- * Only processes tool search messages after the latest AI message with tool calls.
11
- *
12
- * Similar pattern to formatArtifactPayload - finds relevant messages efficiently
13
- * by identifying the latest AI parent and only processing subsequent tool messages.
14
- *
15
- * @param messages - All messages in the conversation
16
- * @returns Array of discovered tool names (empty if no new discoveries)
17
- */
18
- function extractToolDiscoveries(messages$1) {
19
- const lastMessage = messages$1[messages$1.length - 1];
20
- if (!(lastMessage instanceof messages.ToolMessage))
21
- return [];
22
- // Find the latest AIMessage with tool_calls that this tool message belongs to
23
- const latestAIParentIndex = core.findLastIndex(messages$1, (msg) => (msg instanceof messages.AIMessageChunk &&
24
- (msg.tool_calls?.length ?? 0) > 0 &&
25
- msg.tool_calls?.some((tc) => tc.id === lastMessage.tool_call_id)) ??
26
- false);
27
- if (latestAIParentIndex === -1)
28
- return [];
29
- // Collect tool_call_ids from the AI message
30
- const aiMessage = messages$1[latestAIParentIndex];
31
- const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);
32
- // Only process tool search results after the AI message that belong to this turn
33
- const discoveredNames = [];
34
- for (let i = latestAIParentIndex + 1; i < messages$1.length; i++) {
35
- const msg = messages$1[i];
36
- if (!(msg instanceof messages.ToolMessage))
37
- continue;
38
- if (msg.name !== _enum.Constants.TOOL_SEARCH)
39
- continue;
40
- if (!toolCallIds.has(msg.tool_call_id))
41
- continue;
42
- // This is a tool search result from the current turn
43
- if (typeof msg.artifact === 'object' && msg.artifact != null) {
44
- const artifact = msg.artifact;
45
- if (artifact.tool_references && artifact.tool_references.length > 0) {
46
- for (const ref of artifact.tool_references) {
47
- discoveredNames.push(ref.tool_name);
48
- }
49
- }
50
- }
51
- }
52
- return discoveredNames;
7
+ * Extracts discovered tool names from tool search results in the current turn.
8
+ * Only processes tool search messages after the latest AI message with tool calls.
9
+ *
10
+ * Similar pattern to formatArtifactPayload - finds relevant messages efficiently
11
+ * by identifying the latest AI parent and only processing subsequent tool messages.
12
+ *
13
+ * @param messages - All messages in the conversation
14
+ * @returns Array of discovered tool names (empty if no new discoveries)
15
+ */
16
+ function extractToolDiscoveries(messages) {
17
+ const lastMessage = messages[messages.length - 1];
18
+ if (!(lastMessage instanceof _langchain_core_messages.ToolMessage)) return [];
19
+ const latestAIParentIndex = require_core.findLastIndex(messages, (msg) => (msg instanceof _langchain_core_messages.AIMessageChunk && (msg.tool_calls?.length ?? 0) > 0 && msg.tool_calls?.some((tc) => tc.id === lastMessage.tool_call_id)) ?? false);
20
+ if (latestAIParentIndex === -1) return [];
21
+ const aiMessage = messages[latestAIParentIndex];
22
+ const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);
23
+ const discoveredNames = [];
24
+ for (let i = latestAIParentIndex + 1; i < messages.length; i++) {
25
+ const msg = messages[i];
26
+ if (!(msg instanceof _langchain_core_messages.ToolMessage)) continue;
27
+ if (msg.name !== "tool_search") continue;
28
+ if (!toolCallIds.has(msg.tool_call_id)) continue;
29
+ if (typeof msg.artifact === "object" && msg.artifact != null) {
30
+ const artifact = msg.artifact;
31
+ if (artifact.tool_references && artifact.tool_references.length > 0) for (const ref of artifact.tool_references) discoveredNames.push(ref.tool_name);
32
+ }
33
+ }
34
+ return discoveredNames;
53
35
  }
54
36
  /**
55
- * Checks if the current turn has any tool search results.
56
- * Quick check to avoid full extraction when not needed.
57
- */
58
- function hasToolSearchInCurrentTurn(messages$1) {
59
- const lastMessage = messages$1[messages$1.length - 1];
60
- if (!(lastMessage instanceof messages.ToolMessage))
61
- return false;
62
- // Find the latest AIMessage with tool_calls
63
- const latestAIParentIndex = core.findLastIndex(messages$1, (msg) => (msg instanceof messages.AIMessageChunk &&
64
- (msg.tool_calls?.length ?? 0) > 0 &&
65
- msg.tool_calls?.some((tc) => tc.id === lastMessage.tool_call_id)) ??
66
- false);
67
- if (latestAIParentIndex === -1)
68
- return false;
69
- const aiMessage = messages$1[latestAIParentIndex];
70
- const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);
71
- // Check if any tool search results exist after the AI message
72
- for (let i = latestAIParentIndex + 1; i < messages$1.length; i++) {
73
- const msg = messages$1[i];
74
- if (msg instanceof messages.ToolMessage &&
75
- msg.name === _enum.Constants.TOOL_SEARCH &&
76
- toolCallIds.has(msg.tool_call_id)) {
77
- return true;
78
- }
79
- }
80
- return false;
37
+ * Checks if the current turn has any tool search results.
38
+ * Quick check to avoid full extraction when not needed.
39
+ */
40
+ function hasToolSearchInCurrentTurn(messages) {
41
+ const lastMessage = messages[messages.length - 1];
42
+ if (!(lastMessage instanceof _langchain_core_messages.ToolMessage)) return false;
43
+ const latestAIParentIndex = require_core.findLastIndex(messages, (msg) => (msg instanceof _langchain_core_messages.AIMessageChunk && (msg.tool_calls?.length ?? 0) > 0 && msg.tool_calls?.some((tc) => tc.id === lastMessage.tool_call_id)) ?? false);
44
+ if (latestAIParentIndex === -1) return false;
45
+ const aiMessage = messages[latestAIParentIndex];
46
+ const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);
47
+ for (let i = latestAIParentIndex + 1; i < messages.length; i++) {
48
+ const msg = messages[i];
49
+ if (msg instanceof _langchain_core_messages.ToolMessage && msg.name === "tool_search" && toolCallIds.has(msg.tool_call_id)) return true;
50
+ }
51
+ return false;
81
52
  }
82
-
53
+ //#endregion
83
54
  exports.extractToolDiscoveries = extractToolDiscoveries;
84
55
  exports.hasToolSearchInCurrentTurn = hasToolSearchInCurrentTurn;
85
- //# sourceMappingURL=tools.cjs.map
56
+
57
+ //# sourceMappingURL=tools.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.cjs","sources":["../../../src/messages/tools.ts"],"sourcesContent":["// src/messages/toolDiscovery.ts\nimport { AIMessageChunk, ToolMessage } from '@langchain/core/messages';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport { findLastIndex } from './core';\nimport { Constants } from '@/common';\n\ntype ToolSearchArtifact = {\n tool_references?: Array<{ tool_name: string }>;\n};\n\n/**\n * Extracts discovered tool names from tool search results in the current turn.\n * Only processes tool search messages after the latest AI message with tool calls.\n *\n * Similar pattern to formatArtifactPayload - finds relevant messages efficiently\n * by identifying the latest AI parent and only processing subsequent tool messages.\n *\n * @param messages - All messages in the conversation\n * @returns Array of discovered tool names (empty if no new discoveries)\n */\nexport function extractToolDiscoveries(messages: BaseMessage[]): string[] {\n const lastMessage = messages[messages.length - 1];\n if (!(lastMessage instanceof ToolMessage)) return [];\n\n // Find the latest AIMessage with tool_calls that this tool message belongs to\n const latestAIParentIndex = findLastIndex(\n messages,\n (msg) =>\n (msg instanceof AIMessageChunk &&\n (msg.tool_calls?.length ?? 0) > 0 &&\n msg.tool_calls?.some((tc) => tc.id === lastMessage.tool_call_id)) ??\n false\n );\n\n if (latestAIParentIndex === -1) return [];\n\n // Collect tool_call_ids from the AI message\n const aiMessage = messages[latestAIParentIndex] as AIMessageChunk;\n const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);\n\n // Only process tool search results after the AI message that belong to this turn\n const discoveredNames: string[] = [];\n for (let i = latestAIParentIndex + 1; i < messages.length; i++) {\n const msg = messages[i];\n if (!(msg instanceof ToolMessage)) continue;\n if (msg.name !== Constants.TOOL_SEARCH) continue;\n if (!toolCallIds.has(msg.tool_call_id)) continue;\n\n // This is a tool search result from the current turn\n if (typeof msg.artifact === 'object' && msg.artifact != null) {\n const artifact = msg.artifact as ToolSearchArtifact;\n if (artifact.tool_references && artifact.tool_references.length > 0) {\n for (const ref of artifact.tool_references) {\n discoveredNames.push(ref.tool_name);\n }\n }\n }\n }\n\n return discoveredNames;\n}\n\n/**\n * Checks if the current turn has any tool search results.\n * Quick check to avoid full extraction when not needed.\n */\nexport function hasToolSearchInCurrentTurn(messages: BaseMessage[]): boolean {\n const lastMessage = messages[messages.length - 1];\n if (!(lastMessage instanceof ToolMessage)) return false;\n\n // Find the latest AIMessage with tool_calls\n const latestAIParentIndex = findLastIndex(\n messages,\n (msg) =>\n (msg instanceof AIMessageChunk &&\n (msg.tool_calls?.length ?? 0) > 0 &&\n msg.tool_calls?.some((tc) => tc.id === lastMessage.tool_call_id)) ??\n false\n );\n\n if (latestAIParentIndex === -1) return false;\n\n const aiMessage = messages[latestAIParentIndex] as AIMessageChunk;\n const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);\n\n // Check if any tool search results exist after the AI message\n for (let i = latestAIParentIndex + 1; i < messages.length; i++) {\n const msg = messages[i];\n if (\n msg instanceof ToolMessage &&\n msg.name === Constants.TOOL_SEARCH &&\n toolCallIds.has(msg.tool_call_id)\n ) {\n return true;\n }\n }\n\n return false;\n}\n"],"names":["messages","ToolMessage","findLastIndex","AIMessageChunk","Constants"],"mappings":";;;;;;AAAA;AAUA;;;;;;;;;AASG;AACG,SAAU,sBAAsB,CAACA,UAAuB,EAAA;IAC5D,MAAM,WAAW,GAAGA,UAAQ,CAACA,UAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AACjD,IAAA,IAAI,EAAE,WAAW,YAAYC,oBAAW,CAAC;AAAE,QAAA,OAAO,EAAE;;AAGpD,IAAA,MAAM,mBAAmB,GAAGC,kBAAa,CACvCF,UAAQ,EACR,CAAC,GAAG,KACF,CAAC,GAAG,YAAYG,uBAAc;QAC5B,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;AACjC,QAAA,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,WAAW,CAAC,YAAY,CAAC;AAClE,QAAA,KAAK,CACR;IAED,IAAI,mBAAmB,KAAK,EAAE;AAAE,QAAA,OAAO,EAAE;;AAGzC,IAAA,MAAM,SAAS,GAAGH,UAAQ,CAAC,mBAAmB,CAAmB;IACjE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;;IAG3E,MAAM,eAAe,GAAa,EAAE;AACpC,IAAA,KAAK,IAAI,CAAC,GAAG,mBAAmB,GAAG,CAAC,EAAE,CAAC,GAAGA,UAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC9D,QAAA,MAAM,GAAG,GAAGA,UAAQ,CAAC,CAAC,CAAC;AACvB,QAAA,IAAI,EAAE,GAAG,YAAYC,oBAAW,CAAC;YAAE;AACnC,QAAA,IAAI,GAAG,CAAC,IAAI,KAAKG,eAAS,CAAC,WAAW;YAAE;QACxC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC;YAAE;;AAGxC,QAAA,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,IAAI,EAAE;AAC5D,YAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,QAA8B;AACnD,YAAA,IAAI,QAAQ,CAAC,eAAe,IAAI,QAAQ,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;AACnE,gBAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,eAAe,EAAE;AAC1C,oBAAA,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;gBACrC;YACF;QACF;IACF;AAEA,IAAA,OAAO,eAAe;AACxB;AAEA;;;AAGG;AACG,SAAU,0BAA0B,CAACJ,UAAuB,EAAA;IAChE,MAAM,WAAW,GAAGA,UAAQ,CAACA,UAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AACjD,IAAA,IAAI,EAAE,WAAW,YAAYC,oBAAW,CAAC;AAAE,QAAA,OAAO,KAAK;;AAGvD,IAAA,MAAM,mBAAmB,GAAGC,kBAAa,CACvCF,UAAQ,EACR,CAAC,GAAG,KACF,CAAC,GAAG,YAAYG,uBAAc;QAC5B,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;AACjC,QAAA,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,WAAW,CAAC,YAAY,CAAC;AAClE,QAAA,KAAK,CACR;IAED,IAAI,mBAAmB,KAAK,EAAE;AAAE,QAAA,OAAO,KAAK;AAE5C,IAAA,MAAM,SAAS,GAAGH,UAAQ,CAAC,mBAAmB,CAAmB;IACjE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;;AAG3E,IAAA,KAAK,IAAI,CAAC,GAAG,mBAAmB,GAAG,CAAC,EAAE,CAAC,GAAGA,UAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC9D,QAAA,MAAM,GAAG,GAAGA,UAAQ,CAAC,CAAC,CAAC;QACvB,IACE,GAAG,YAAYC,oBAAW;AAC1B,YAAA,GAAG,CAAC,IAAI,KAAKG,eAAS,CAAC,WAAW;YAClC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,EACjC;AACA,YAAA,OAAO,IAAI;QACb;IACF;AAEA,IAAA,OAAO,KAAK;AACd;;;;;"}
1
+ {"version":3,"file":"tools.cjs","names":["ToolMessage","findLastIndex","AIMessageChunk"],"sources":["../../../src/messages/tools.ts"],"sourcesContent":["// src/messages/toolDiscovery.ts\nimport { AIMessageChunk, ToolMessage } from '@langchain/core/messages';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport { findLastIndex } from './core';\nimport { Constants } from '@/common';\n\ntype ToolSearchArtifact = {\n tool_references?: Array<{ tool_name: string }>;\n};\n\n/**\n * Extracts discovered tool names from tool search results in the current turn.\n * Only processes tool search messages after the latest AI message with tool calls.\n *\n * Similar pattern to formatArtifactPayload - finds relevant messages efficiently\n * by identifying the latest AI parent and only processing subsequent tool messages.\n *\n * @param messages - All messages in the conversation\n * @returns Array of discovered tool names (empty if no new discoveries)\n */\nexport function extractToolDiscoveries(messages: BaseMessage[]): string[] {\n const lastMessage = messages[messages.length - 1];\n if (!(lastMessage instanceof ToolMessage)) return [];\n\n // Find the latest AIMessage with tool_calls that this tool message belongs to\n const latestAIParentIndex = findLastIndex(\n messages,\n (msg) =>\n (msg instanceof AIMessageChunk &&\n (msg.tool_calls?.length ?? 0) > 0 &&\n msg.tool_calls?.some((tc) => tc.id === lastMessage.tool_call_id)) ??\n false\n );\n\n if (latestAIParentIndex === -1) return [];\n\n // Collect tool_call_ids from the AI message\n const aiMessage = messages[latestAIParentIndex] as AIMessageChunk;\n const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);\n\n // Only process tool search results after the AI message that belong to this turn\n const discoveredNames: string[] = [];\n for (let i = latestAIParentIndex + 1; i < messages.length; i++) {\n const msg = messages[i];\n if (!(msg instanceof ToolMessage)) continue;\n if (msg.name !== Constants.TOOL_SEARCH) continue;\n if (!toolCallIds.has(msg.tool_call_id)) continue;\n\n // This is a tool search result from the current turn\n if (typeof msg.artifact === 'object' && msg.artifact != null) {\n const artifact = msg.artifact as ToolSearchArtifact;\n if (artifact.tool_references && artifact.tool_references.length > 0) {\n for (const ref of artifact.tool_references) {\n discoveredNames.push(ref.tool_name);\n }\n }\n }\n }\n\n return discoveredNames;\n}\n\n/**\n * Checks if the current turn has any tool search results.\n * Quick check to avoid full extraction when not needed.\n */\nexport function hasToolSearchInCurrentTurn(messages: BaseMessage[]): boolean {\n const lastMessage = messages[messages.length - 1];\n if (!(lastMessage instanceof ToolMessage)) return false;\n\n // Find the latest AIMessage with tool_calls\n const latestAIParentIndex = findLastIndex(\n messages,\n (msg) =>\n (msg instanceof AIMessageChunk &&\n (msg.tool_calls?.length ?? 0) > 0 &&\n msg.tool_calls?.some((tc) => tc.id === lastMessage.tool_call_id)) ??\n false\n );\n\n if (latestAIParentIndex === -1) return false;\n\n const aiMessage = messages[latestAIParentIndex] as AIMessageChunk;\n const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);\n\n // Check if any tool search results exist after the AI message\n for (let i = latestAIParentIndex + 1; i < messages.length; i++) {\n const msg = messages[i];\n if (\n msg instanceof ToolMessage &&\n msg.name === Constants.TOOL_SEARCH &&\n toolCallIds.has(msg.tool_call_id)\n ) {\n return true;\n }\n }\n\n return false;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAoBA,SAAgB,uBAAuB,UAAmC;CACxE,MAAM,cAAc,SAAS,SAAS,SAAS;CAC/C,IAAI,EAAE,uBAAuBA,yBAAAA,cAAc,OAAO,CAAC;CAGnD,MAAM,sBAAsBC,aAAAA,cAC1B,WACC,SACE,eAAeC,yBAAAA,mBACb,IAAI,YAAY,UAAU,KAAK,KAChC,IAAI,YAAY,MAAM,OAAO,GAAG,OAAO,YAAY,YAAY,MACjE,KACJ;CAEA,IAAI,wBAAwB,IAAI,OAAO,CAAC;CAGxC,MAAM,YAAY,SAAS;CAC3B,MAAM,cAAc,IAAI,IAAI,UAAU,YAAY,KAAK,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;CAG1E,MAAM,kBAA4B,CAAC;CACnC,KAAK,IAAI,IAAI,sBAAsB,GAAG,IAAI,SAAS,QAAQ,KAAK;EAC9D,MAAM,MAAM,SAAS;EACrB,IAAI,EAAE,eAAeF,yBAAAA,cAAc;EACnC,IAAI,IAAI,SAAA,eAAgC;EACxC,IAAI,CAAC,YAAY,IAAI,IAAI,YAAY,GAAG;EAGxC,IAAI,OAAO,IAAI,aAAa,YAAY,IAAI,YAAY,MAAM;GAC5D,MAAM,WAAW,IAAI;GACrB,IAAI,SAAS,mBAAmB,SAAS,gBAAgB,SAAS,GAChE,KAAK,MAAM,OAAO,SAAS,iBACzB,gBAAgB,KAAK,IAAI,SAAS;EAGxC;CACF;CAEA,OAAO;AACT;;;;;AAMA,SAAgB,2BAA2B,UAAkC;CAC3E,MAAM,cAAc,SAAS,SAAS,SAAS;CAC/C,IAAI,EAAE,uBAAuBA,yBAAAA,cAAc,OAAO;CAGlD,MAAM,sBAAsBC,aAAAA,cAC1B,WACC,SACE,eAAeC,yBAAAA,mBACb,IAAI,YAAY,UAAU,KAAK,KAChC,IAAI,YAAY,MAAM,OAAO,GAAG,OAAO,YAAY,YAAY,MACjE,KACJ;CAEA,IAAI,wBAAwB,IAAI,OAAO;CAEvC,MAAM,YAAY,SAAS;CAC3B,MAAM,cAAc,IAAI,IAAI,UAAU,YAAY,KAAK,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;CAG1E,KAAK,IAAI,IAAI,sBAAsB,GAAG,IAAI,SAAS,QAAQ,KAAK;EAC9D,MAAM,MAAM,SAAS;EACrB,IACE,eAAeF,yBAAAA,eACf,IAAI,SAAA,iBACJ,YAAY,IAAI,IAAI,YAAY,GAEhC,OAAO;CAEX;CAEA,OAAO;AACT"}