@librechat/agents 3.2.31 → 3.2.33

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 (582) 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 -696
  53. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  54. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +171 -252
  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 +195 -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 +105 -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 +398 -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 +991 -1276
  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 +427 -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 +308 -401
  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 -1382
  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 +856 -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 +2109 -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 +19 -36
  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 -690
  324. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  325. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +171 -249
  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 +195 -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 +105 -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 +397 -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 +991 -1271
  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 +427 -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 +308 -399
  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 -1378
  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 +854 -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 +2107 -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 +19 -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/messages/format.d.ts +5 -0
  545. package/dist/types/tools/search/tool.d.ts +17 -0
  546. package/dist/types/tools/search/types.d.ts +4 -0
  547. package/package.json +11 -17
  548. package/src/llm/anthropic/llm.spec.ts +36 -0
  549. package/src/llm/anthropic/utils/message_inputs.ts +45 -3
  550. package/src/llm/anthropic/utils/message_outputs.ts +6 -2
  551. package/src/llm/anthropic/utils/streaming-tool-input.test.ts +186 -0
  552. package/src/messages/cache.test.ts +122 -0
  553. package/src/messages/cache.ts +25 -1
  554. package/src/messages/format.ts +9 -0
  555. package/src/messages/formatAgentMessages.skills.test.ts +100 -0
  556. package/src/tools/search/highlights.ts +9 -1
  557. package/src/tools/search/search.ts +41 -3
  558. package/src/tools/search/source-processing.test.ts +373 -0
  559. package/src/tools/search/tool.ts +22 -2
  560. package/src/tools/search/types.ts +4 -0
  561. package/dist/cjs/langchain/google-common.cjs.map +0 -1
  562. package/dist/cjs/langchain/index.cjs.map +0 -1
  563. package/dist/cjs/langchain/language_models/chat_models.cjs.map +0 -1
  564. package/dist/cjs/langchain/messages/tool.cjs.map +0 -1
  565. package/dist/cjs/langchain/messages.cjs.map +0 -1
  566. package/dist/cjs/langchain/openai.cjs.map +0 -1
  567. package/dist/cjs/langchain/prompts.cjs.map +0 -1
  568. package/dist/cjs/langchain/runnables.cjs.map +0 -1
  569. package/dist/cjs/langchain/tools.cjs.map +0 -1
  570. package/dist/cjs/langchain/utils/env.cjs.map +0 -1
  571. package/dist/cjs/main.cjs.map +0 -1
  572. package/dist/esm/langchain/google-common.mjs.map +0 -1
  573. package/dist/esm/langchain/index.mjs.map +0 -1
  574. package/dist/esm/langchain/language_models/chat_models.mjs.map +0 -1
  575. package/dist/esm/langchain/messages/tool.mjs.map +0 -1
  576. package/dist/esm/langchain/messages.mjs.map +0 -1
  577. package/dist/esm/langchain/openai.mjs.map +0 -1
  578. package/dist/esm/langchain/prompts.mjs.map +0 -1
  579. package/dist/esm/langchain/runnables.mjs.map +0 -1
  580. package/dist/esm/langchain/tools.mjs.map +0 -1
  581. package/dist/esm/langchain/utils/env.mjs.map +0 -1
  582. package/dist/esm/main.mjs.map +0 -1
@@ -1,36 +1,35 @@
1
- 'use strict';
2
-
3
- var messages = require('@langchain/core/messages');
4
- var _enum = require('../common/enum.cjs');
5
- var events = require('../utils/events.cjs');
6
- var invoke = require('../llm/invoke.cjs');
7
- var reducer = require('../messages/reducer.cjs');
8
- var recency = require('../messages/recency.cjs');
9
- var request = require('../llm/request.cjs');
10
- var cache = require('../messages/cache.cjs');
11
- var init = require('../llm/init.cjs');
12
- var stream = require('../stream.cjs');
13
- var executeHooks = require('../hooks/executeHooks.cjs');
14
- require('../hooks/createWorkspacePolicyHook.cjs');
15
-
16
- const SUMMARIZATION_PARAM_KEYS = new Set(['maxSummaryTokens']);
1
+ require("../common/enum.cjs");
2
+ require("../common/index.cjs");
3
+ const require_events = require("../utils/events.cjs");
4
+ const require_cache = require("../messages/cache.cjs");
5
+ const require_reducer = require("../messages/reducer.cjs");
6
+ const require_recency = require("../messages/recency.cjs");
7
+ const require_stream = require("../stream.cjs");
8
+ const require_executeHooks = require("../hooks/executeHooks.cjs");
9
+ require("../hooks/index.cjs");
10
+ const require_init = require("../llm/init.cjs");
11
+ const require_invoke = require("../llm/invoke.cjs");
12
+ const require_request = require("../llm/request.cjs");
13
+ let _langchain_core_messages = require("@langchain/core/messages");
14
+ //#region src/summarization/node.ts
15
+ const SUMMARIZATION_PARAM_KEYS = new Set(["maxSummaryTokens"]);
17
16
  /**
18
- * Default number of recent user-led turns preserved verbatim during
19
- * compaction. A turn begins at a HumanMessage and includes every
20
- * following AIMessage and ToolMessage up to the next HumanMessage.
21
- * The most recent turn is always retained regardless of this value;
22
- * the default of `2` additionally keeps the prior exchange so the
23
- * model has fresh context on what just happened. Setting
24
- * `retainRecent.turns` to `0` reverts to the legacy "summarize every
25
- * message" behavior.
26
- */
17
+ * Default number of recent user-led turns preserved verbatim during
18
+ * compaction. A turn begins at a HumanMessage and includes every
19
+ * following AIMessage and ToolMessage up to the next HumanMessage.
20
+ * The most recent turn is always retained regardless of this value;
21
+ * the default of `2` additionally keeps the prior exchange so the
22
+ * model has fresh context on what just happened. Setting
23
+ * `retainRecent.turns` to `0` reverts to the legacy "summarize every
24
+ * message" behavior.
25
+ */
27
26
  const DEFAULT_RETAIN_RECENT_TURNS = 2;
28
27
  /**
29
- * Token overhead of the XML wrapper + instruction text added around the
30
- * summary at injection time in AgentContext.buildSystemRunnable:
31
- * `<summary>\n${text}\n</summary>\n\nYour context window was compacted...`
32
- * ~33 tokens on Anthropic, ~24-27 on OpenAI. Using 33 as a safe ceiling.
33
- */
28
+ * Token overhead of the XML wrapper + instruction text added around the
29
+ * summary at injection time in AgentContext.buildSystemRunnable:
30
+ * `<summary>\n${text}\n</summary>\n\nYour context window was compacted...`
31
+ * ~33 tokens on Anthropic, ~24-27 on OpenAI. Using 33 as a safe ceiling.
32
+ */
34
33
  const SUMMARY_WRAPPER_OVERHEAD_TOKENS = 33;
35
34
  /** Structured checkpoint prompt for fresh summarization (no prior summary). */
36
35
  const DEFAULT_SUMMARIZATION_PROMPT = `Hold on, before you continue I need you to write me a checkpoint of everything so far. Your context window is filling up and this checkpoint replaces the messages above, so capture everything you need to pick right back up.
@@ -83,821 +82,669 @@ Rules:
83
82
  - Preserve exact identifiers, names, errors, and references verbatim
84
83
  - Skip empty sections`;
85
84
  function separateParameters(parameters) {
86
- const llmParams = {};
87
- let maxSummaryTokens;
88
- for (const [key, value] of Object.entries(parameters)) {
89
- if (SUMMARIZATION_PARAM_KEYS.has(key)) {
90
- if (key === 'maxSummaryTokens' &&
91
- typeof value === 'number' &&
92
- value > 0) {
93
- maxSummaryTokens = value;
94
- }
95
- }
96
- else {
97
- llmParams[key] = value;
98
- }
99
- }
100
- return { llmParams, maxSummaryTokens };
85
+ const llmParams = {};
86
+ let maxSummaryTokens;
87
+ for (const [key, value] of Object.entries(parameters)) if (SUMMARIZATION_PARAM_KEYS.has(key)) {
88
+ if (key === "maxSummaryTokens" && typeof value === "number" && value > 0) maxSummaryTokens = value;
89
+ } else llmParams[key] = value;
90
+ return {
91
+ llmParams,
92
+ maxSummaryTokens
93
+ };
101
94
  }
102
95
  /**
103
- * Generates a structural metadata summary without making an LLM call.
104
- * Used as a last-resort fallback when all summarization attempts fail.
105
- * Preserves tool names and message counts so the agent retains basic context.
106
- */
107
- function generateMetadataStub(messages$1) {
108
- const counts = {};
109
- const toolNames = new Set();
110
- for (const msg of messages$1) {
111
- const role = msg.getType();
112
- counts[role] = (counts[role] ?? 0) + 1;
113
- if (role === 'tool' && msg.name != null && msg.name !== '') {
114
- toolNames.add(msg.name);
115
- }
116
- if (role === 'ai' &&
117
- msg instanceof messages.AIMessage &&
118
- msg.tool_calls &&
119
- msg.tool_calls.length > 0) {
120
- for (const tc of msg.tool_calls) {
121
- toolNames.add(tc.name);
122
- }
123
- }
124
- }
125
- const countParts = Object.entries(counts)
126
- .map(([role, count]) => `${count} ${role}`)
127
- .join(', ');
128
- const lines = [
129
- `[Metadata summary: ${messages$1.length} messages (${countParts})]`,
130
- ];
131
- if (toolNames.size > 0) {
132
- lines.push(`[Tools used: ${Array.from(toolNames).join(', ')}]`);
133
- }
134
- return lines.join('\n');
96
+ * Generates a structural metadata summary without making an LLM call.
97
+ * Used as a last-resort fallback when all summarization attempts fail.
98
+ * Preserves tool names and message counts so the agent retains basic context.
99
+ */
100
+ function generateMetadataStub(messages) {
101
+ const counts = {};
102
+ const toolNames = /* @__PURE__ */ new Set();
103
+ for (const msg of messages) {
104
+ const role = msg.getType();
105
+ counts[role] = (counts[role] ?? 0) + 1;
106
+ if (role === "tool" && msg.name != null && msg.name !== "") toolNames.add(msg.name);
107
+ if (role === "ai" && msg instanceof _langchain_core_messages.AIMessage && msg.tool_calls && msg.tool_calls.length > 0) for (const tc of msg.tool_calls) toolNames.add(tc.name);
108
+ }
109
+ const countParts = Object.entries(counts).map(([role, count]) => `${count} ${role}`).join(", ");
110
+ const lines = [`[Metadata summary: ${messages.length} messages (${countParts})]`];
111
+ if (toolNames.size > 0) lines.push(`[Tools used: ${Array.from(toolNames).join(", ")}]`);
112
+ return lines.join("\n");
135
113
  }
136
114
  /** Maximum number of tool failures to include in the enrichment section. */
137
115
  const MAX_TOOL_FAILURES = 8;
138
116
  /** Maximum chars per failure summary line. */
139
117
  const MAX_TOOL_FAILURE_CHARS = 240;
140
118
  /**
141
- * Extracts failed tool results from messages and formats them as a structured
142
- * section. LLMs often omit specific failure details (exit codes, error messages)
143
- * from their summaries, this mechanical enrichment guarantees they survive.
144
- */
119
+ * Extracts failed tool results from messages and formats them as a structured
120
+ * section. LLMs often omit specific failure details (exit codes, error messages)
121
+ * from their summaries, this mechanical enrichment guarantees they survive.
122
+ */
145
123
  function extractToolFailuresSection(messages) {
146
- const failures = [];
147
- const seen = new Set();
148
- for (const msg of messages) {
149
- if (msg.getType() !== 'tool') {
150
- continue;
151
- }
152
- const toolMsg = msg;
153
- if (toolMsg.status !== 'error') {
154
- continue;
155
- }
156
- // Deduplicate by tool_call_id
157
- const callId = toolMsg.tool_call_id;
158
- if (callId && seen.has(callId)) {
159
- continue;
160
- }
161
- if (callId) {
162
- seen.add(callId);
163
- }
164
- const toolName = toolMsg.name ?? 'tool';
165
- const content = typeof toolMsg.content === 'string'
166
- ? toolMsg.content
167
- : JSON.stringify(toolMsg.content);
168
- const normalized = content.replace(/\s+/g, ' ').trim();
169
- const summary = normalized.length > MAX_TOOL_FAILURE_CHARS
170
- ? `${normalized.slice(0, MAX_TOOL_FAILURE_CHARS - 3)}...`
171
- : normalized;
172
- failures.push({ toolName, summary });
173
- }
174
- if (failures.length === 0) {
175
- return '';
176
- }
177
- const lines = failures
178
- .slice(0, MAX_TOOL_FAILURES)
179
- .map((f) => `- ${f.toolName}: ${f.summary}`);
180
- if (failures.length > MAX_TOOL_FAILURES) {
181
- lines.push(`- ...and ${failures.length - MAX_TOOL_FAILURES} more`);
182
- }
183
- return `\n\n## Tool Failures\n${lines.join('\n')}`;
124
+ const failures = [];
125
+ const seen = /* @__PURE__ */ new Set();
126
+ for (const msg of messages) {
127
+ if (msg.getType() !== "tool") continue;
128
+ const toolMsg = msg;
129
+ if (toolMsg.status !== "error") continue;
130
+ const callId = toolMsg.tool_call_id;
131
+ if (callId && seen.has(callId)) continue;
132
+ if (callId) seen.add(callId);
133
+ const toolName = toolMsg.name ?? "tool";
134
+ const normalized = (typeof toolMsg.content === "string" ? toolMsg.content : JSON.stringify(toolMsg.content)).replace(/\s+/g, " ").trim();
135
+ const summary = normalized.length > MAX_TOOL_FAILURE_CHARS ? `${normalized.slice(0, MAX_TOOL_FAILURE_CHARS - 3)}...` : normalized;
136
+ failures.push({
137
+ toolName,
138
+ summary
139
+ });
140
+ }
141
+ if (failures.length === 0) return "";
142
+ const lines = failures.slice(0, MAX_TOOL_FAILURES).map((f) => `- ${f.toolName}: ${f.summary}`);
143
+ if (failures.length > MAX_TOOL_FAILURES) lines.push(`- ...and ${failures.length - MAX_TOOL_FAILURES} more`);
144
+ return `\n\n## Tool Failures\n${lines.join("\n")}`;
184
145
  }
185
146
  /**
186
- * Appends mechanical enrichment sections to an LLM-generated summary.
187
- * Tool failures are appended verbatim because LLMs often omit specific
188
- * error details from their summaries.
189
- */
147
+ * Appends mechanical enrichment sections to an LLM-generated summary.
148
+ * Tool failures are appended verbatim because LLMs often omit specific
149
+ * error details from their summaries.
150
+ */
190
151
  function enrichSummary(summaryText, messages) {
191
- return summaryText + extractToolFailuresSection(messages);
152
+ return summaryText + extractToolFailuresSection(messages);
192
153
  }
193
154
  /**
194
- * Restores pre-masking tool content onto the messages array using
195
- * `pendingOriginalToolContent` stored on AgentContext. Only allocates
196
- * a new array when there are entries to restore; otherwise returns the
197
- * input reference unchanged.
198
- */
199
- function restoreOriginalToolContent(messages$1, originalToolContent) {
200
- if (originalToolContent == null || originalToolContent.size === 0) {
201
- return messages$1;
202
- }
203
- const restored = [...messages$1];
204
- for (const [idx, content] of originalToolContent) {
205
- const msg = restored[idx];
206
- if (msg instanceof messages.ToolMessage) {
207
- restored[idx] = new messages.ToolMessage({
208
- content,
209
- tool_call_id: msg.tool_call_id,
210
- name: msg.name,
211
- id: msg.id,
212
- additional_kwargs: msg.additional_kwargs,
213
- response_metadata: msg.response_metadata,
214
- });
215
- }
216
- }
217
- return restored;
155
+ * Restores pre-masking tool content onto the messages array using
156
+ * `pendingOriginalToolContent` stored on AgentContext. Only allocates
157
+ * a new array when there are entries to restore; otherwise returns the
158
+ * input reference unchanged.
159
+ */
160
+ function restoreOriginalToolContent(messages, originalToolContent) {
161
+ if (originalToolContent == null || originalToolContent.size === 0) return messages;
162
+ const restored = [...messages];
163
+ for (const [idx, content] of originalToolContent) {
164
+ const msg = restored[idx];
165
+ if (msg instanceof _langchain_core_messages.ToolMessage) restored[idx] = new _langchain_core_messages.ToolMessage({
166
+ content,
167
+ tool_call_id: msg.tool_call_id,
168
+ name: msg.name,
169
+ id: msg.id,
170
+ additional_kwargs: msg.additional_kwargs,
171
+ response_metadata: msg.response_metadata
172
+ });
173
+ }
174
+ return restored;
218
175
  }
219
176
  /** Assembles the summarization model's client options from agent and config. */
220
177
  function buildSummarizationClientConfig(agentContext, summarizationConfig) {
221
- const provider = (summarizationConfig?.provider ??
222
- agentContext.provider);
223
- const modelName = summarizationConfig?.model;
224
- const parameters = summarizationConfig?.parameters ?? {};
225
- const promptText = summarizationConfig?.prompt ?? DEFAULT_SUMMARIZATION_PROMPT;
226
- const updatePromptText = summarizationConfig?.updatePrompt ?? DEFAULT_UPDATE_SUMMARIZATION_PROMPT;
227
- const { llmParams, maxSummaryTokens: paramMaxSummaryTokens } = separateParameters(parameters);
228
- const isSelfSummarize = provider === agentContext.provider;
229
- const baseOptions = isSelfSummarize && agentContext.clientOptions
230
- ? { ...agentContext.clientOptions }
231
- : {};
232
- const clientOptions = {
233
- ...baseOptions,
234
- ...llmParams,
235
- };
236
- if (modelName != null && modelName !== '') {
237
- clientOptions.model = modelName;
238
- clientOptions.modelName = modelName;
239
- }
240
- const effectiveMaxSummaryTokens = paramMaxSummaryTokens ?? summarizationConfig?.maxSummaryTokens;
241
- if (effectiveMaxSummaryTokens != null) {
242
- clientOptions[request.getMaxOutputTokensKey(provider)] = effectiveMaxSummaryTokens;
243
- }
244
- return {
245
- provider,
246
- modelName,
247
- clientOptions,
248
- effectiveMaxSummaryTokens,
249
- promptText,
250
- updatePromptText,
251
- };
178
+ const provider = summarizationConfig?.provider ?? agentContext.provider;
179
+ const modelName = summarizationConfig?.model;
180
+ const parameters = summarizationConfig?.parameters ?? {};
181
+ const promptText = summarizationConfig?.prompt ?? DEFAULT_SUMMARIZATION_PROMPT;
182
+ const updatePromptText = summarizationConfig?.updatePrompt ?? DEFAULT_UPDATE_SUMMARIZATION_PROMPT;
183
+ const { llmParams, maxSummaryTokens: paramMaxSummaryTokens } = separateParameters(parameters);
184
+ const clientOptions = {
185
+ ...provider === agentContext.provider && agentContext.clientOptions ? { ...agentContext.clientOptions } : {},
186
+ ...llmParams
187
+ };
188
+ if (modelName != null && modelName !== "") {
189
+ clientOptions.model = modelName;
190
+ clientOptions.modelName = modelName;
191
+ }
192
+ const effectiveMaxSummaryTokens = paramMaxSummaryTokens ?? summarizationConfig?.maxSummaryTokens;
193
+ if (effectiveMaxSummaryTokens != null) clientOptions[require_request.getMaxOutputTokensKey(provider)] = effectiveMaxSummaryTokens;
194
+ return {
195
+ provider,
196
+ modelName,
197
+ clientOptions,
198
+ effectiveMaxSummaryTokens,
199
+ promptText,
200
+ updatePromptText
201
+ };
252
202
  }
253
203
  /** Computes the token count for a summary, preferring provider output tokens when available. */
254
204
  function computeSummaryTokenCount(summaryText, summaryUsage, tokenCounter) {
255
- const providerOutputTokens = Number(summaryUsage?.output_tokens) || 0;
256
- if (providerOutputTokens > 0) {
257
- return providerOutputTokens + SUMMARY_WRAPPER_OVERHEAD_TOKENS;
258
- }
259
- if (tokenCounter) {
260
- return (tokenCounter(new messages.SystemMessage(summaryText)) +
261
- SUMMARY_WRAPPER_OVERHEAD_TOKENS);
262
- }
263
- return 0;
205
+ const providerOutputTokens = Number(summaryUsage?.output_tokens) || 0;
206
+ if (providerOutputTokens > 0) return providerOutputTokens + SUMMARY_WRAPPER_OVERHEAD_TOKENS;
207
+ if (tokenCounter) return tokenCounter(new _langchain_core_messages.SystemMessage(summaryText)) + SUMMARY_WRAPPER_OVERHEAD_TOKENS;
208
+ return 0;
264
209
  }
265
210
  /** Constructs the SummaryContentBlock persisted in the run step and dispatched to events. */
266
211
  function buildSummaryBlock(params) {
267
- return {
268
- type: _enum.ContentTypes.SUMMARY,
269
- content: [
270
- {
271
- type: _enum.ContentTypes.TEXT,
272
- text: params.summaryText,
273
- },
274
- ],
275
- tokenCount: params.tokenCount,
276
- summaryVersion: params.summaryVersion,
277
- boundary: {
278
- messageId: params.stepId,
279
- contentIndex: params.stepIndex,
280
- },
281
- model: params.modelName,
282
- provider: params.provider,
283
- createdAt: new Date().toISOString(),
284
- };
212
+ return {
213
+ type: "summary",
214
+ content: [{
215
+ type: "text",
216
+ text: params.summaryText
217
+ }],
218
+ tokenCount: params.tokenCount,
219
+ summaryVersion: params.summaryVersion,
220
+ boundary: {
221
+ messageId: params.stepId,
222
+ contentIndex: params.stepIndex
223
+ },
224
+ model: params.modelName,
225
+ provider: params.provider,
226
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
227
+ };
285
228
  }
286
229
  /**
287
- * Extracts an HTTP status code from a thrown LLM-provider error. Returns
288
- * `undefined` for non-object values (including `null` or `undefined`, both
289
- * valid `throw` targets in JS) so callers never dereference a nullish
290
- * value.
291
- */
230
+ * Extracts an HTTP status code from a thrown LLM-provider error. Returns
231
+ * `undefined` for non-object values (including `null` or `undefined`, both
232
+ * valid `throw` targets in JS) so callers never dereference a nullish
233
+ * value.
234
+ */
292
235
  function extractHttpStatus(err) {
293
- if (err == null || typeof err !== 'object') {
294
- return undefined;
295
- }
296
- const errRecord = err;
297
- const direct = errRecord.status;
298
- if (typeof direct === 'number') {
299
- return direct;
300
- }
301
- const statusCode = errRecord.statusCode;
302
- if (typeof statusCode === 'number') {
303
- return statusCode;
304
- }
305
- const response = errRecord.response;
306
- if (response != null && typeof response === 'object') {
307
- const nested = response.status;
308
- if (typeof nested === 'number') {
309
- return nested;
310
- }
311
- }
312
- return undefined;
236
+ if (err == null || typeof err !== "object") return;
237
+ const errRecord = err;
238
+ const direct = errRecord.status;
239
+ if (typeof direct === "number") return direct;
240
+ const statusCode = errRecord.statusCode;
241
+ if (typeof statusCode === "number") return statusCode;
242
+ const response = errRecord.response;
243
+ if (response != null && typeof response === "object") {
244
+ const nested = response.status;
245
+ if (typeof nested === "number") return nested;
246
+ }
313
247
  }
314
248
  /**
315
- * Formats a provider-level error for logging. Returns both a human-readable
316
- * suffix (safe to include in the message string so it survives any host-side
317
- * formatter) and a structured metadata bag for rich log backends.
318
- */
249
+ * Formats a provider-level error for logging. Returns both a human-readable
250
+ * suffix (safe to include in the message string so it survives any host-side
251
+ * formatter) and a structured metadata bag for rich log backends.
252
+ */
319
253
  function describeProviderError(err, provider, modelName) {
320
- const providerLabel = `${provider}/${modelName ?? '(no-model)'}`;
321
- const errMsg = err instanceof Error ? err.message : String(err);
322
- const data = {
323
- provider,
324
- model: modelName,
325
- };
326
- if (err instanceof Error) {
327
- data.errorName = err.name;
328
- data.errorStack = err.stack;
329
- }
330
- const status = extractHttpStatus(err);
331
- const statusSuffix = status != null ? ` (HTTP ${status})` : '';
332
- if (status != null) {
333
- data.status = status;
334
- }
335
- return {
336
- suffix: `[${providerLabel}]${statusSuffix}: ${errMsg}`,
337
- data,
338
- };
254
+ const providerLabel = `${provider}/${modelName ?? "(no-model)"}`;
255
+ const errMsg = err instanceof Error ? err.message : String(err);
256
+ const data = {
257
+ provider,
258
+ model: modelName
259
+ };
260
+ if (err instanceof Error) {
261
+ data.errorName = err.name;
262
+ data.errorStack = err.stack;
263
+ }
264
+ const status = extractHttpStatus(err);
265
+ const statusSuffix = status != null ? ` (HTTP ${status})` : "";
266
+ if (status != null) data.status = status;
267
+ return {
268
+ suffix: `[${providerLabel}]${statusSuffix}: ${errMsg}`,
269
+ data
270
+ };
339
271
  }
340
272
  /**
341
- * Formats an exhausted-fallback error. `tryFallbackProviders` throws the
342
- * last fallback provider's error, which may be from any of the configured
343
- * fallbacks — not the primary — so we label the log with the list of
344
- * fallback providers attempted rather than mis-attributing to the primary.
345
- *
346
- * Entries in `fallbacks` are normally strongly typed, but we defend against
347
- * malformed runtime config (null/undefined entries, missing `provider`
348
- * field) so a recoverable summarization failure is never promoted to an
349
- * uncaught exception from inside the logging path.
350
- */
273
+ * Formats an exhausted-fallback error. `tryFallbackProviders` throws the
274
+ * last fallback provider's error, which may be from any of the configured
275
+ * fallbacks — not the primary — so we label the log with the list of
276
+ * fallback providers attempted rather than mis-attributing to the primary.
277
+ *
278
+ * Entries in `fallbacks` are normally strongly typed, but we defend against
279
+ * malformed runtime config (null/undefined entries, missing `provider`
280
+ * field) so a recoverable summarization failure is never promoted to an
281
+ * uncaught exception from inside the logging path.
282
+ */
351
283
  function describeFallbackError(err, fallbacks) {
352
- const errMsg = err instanceof Error ? err.message : String(err);
353
- const list = Array.isArray(fallbacks)
354
- ? fallbacks
355
- : [];
356
- const providerNames = list
357
- .map((f) => {
358
- if (f == null || typeof f !== 'object') {
359
- return undefined;
360
- }
361
- const raw = f.provider;
362
- return raw != null ? String(raw) : undefined;
363
- })
364
- .filter((p) => typeof p === 'string');
365
- const label = providerNames.length > 0
366
- ? `fallbacks=[${providerNames.join(',')}]`
367
- : 'no-fallbacks';
368
- const data = {
369
- fallbackProviders: providerNames,
370
- fallbackCount: list.length,
371
- };
372
- if (err instanceof Error) {
373
- data.errorName = err.name;
374
- data.errorStack = err.stack;
375
- }
376
- const status = extractHttpStatus(err);
377
- const statusSuffix = status != null ? ` (HTTP ${status})` : '';
378
- if (status != null) {
379
- data.status = status;
380
- }
381
- return {
382
- suffix: `[${label}]${statusSuffix}: ${errMsg}`,
383
- data,
384
- };
284
+ const errMsg = err instanceof Error ? err.message : String(err);
285
+ const list = Array.isArray(fallbacks) ? fallbacks : [];
286
+ const providerNames = list.map((f) => {
287
+ if (f == null || typeof f !== "object") return;
288
+ const raw = f.provider;
289
+ return raw != null ? String(raw) : void 0;
290
+ }).filter((p) => typeof p === "string");
291
+ const label = providerNames.length > 0 ? `fallbacks=[${providerNames.join(",")}]` : "no-fallbacks";
292
+ const data = {
293
+ fallbackProviders: providerNames,
294
+ fallbackCount: list.length
295
+ };
296
+ if (err instanceof Error) {
297
+ data.errorName = err.name;
298
+ data.errorStack = err.stack;
299
+ }
300
+ const status = extractHttpStatus(err);
301
+ const statusSuffix = status != null ? ` (HTTP ${status})` : "";
302
+ if (status != null) data.status = status;
303
+ return {
304
+ suffix: `[${label}]${statusSuffix}: ${errMsg}`,
305
+ data
306
+ };
385
307
  }
386
308
  /**
387
- * Runs the summarization LLM call with primary + fallback providers,
388
- * falling back to a metadata stub when all calls fail.
389
- */
309
+ * Runs the summarization LLM call with primary + fallback providers,
310
+ * falling back to a metadata stub when all calls fail.
311
+ */
390
312
  async function executeSummarizationWithFallback(params) {
391
- const { agentContext, messages: messages$1, clientConfig, summarizeConfig, stepId, usePromptCache, log, } = params;
392
- const priorSummaryText = agentContext.getSummaryText()?.trim() ?? '';
393
- let summaryText = '';
394
- let summaryUsage;
395
- try {
396
- /**
397
- * Initialize inside the try so that a misconfigured provider
398
- * (e.g. an unrecognized summarization.provider) surfaces through the
399
- * `log('error', ...)` path below rather than bubbling up silently.
400
- */
401
- const summarizationModel = init.initializeModel({
402
- provider: clientConfig.provider,
403
- clientOptions: clientConfig.clientOptions,
404
- tools: agentContext.getToolsForBinding(),
405
- });
406
- const result = await summarizeWithCacheHit({
407
- model: summarizationModel,
408
- messages: messages$1,
409
- promptText: clientConfig.promptText,
410
- updatePromptText: clientConfig.updatePromptText,
411
- priorSummaryText,
412
- config: summarizeConfig,
413
- stepId,
414
- provider: clientConfig.provider,
415
- reasoningKey: agentContext.reasoningKey,
416
- usePromptCache,
417
- log,
418
- });
419
- summaryText = result.text;
420
- summaryUsage = result.usage;
421
- }
422
- catch (primaryError) {
423
- const primaryDescribed = describeProviderError(primaryError, clientConfig.provider, clientConfig.modelName);
424
- log('error', `Summarization LLM call failed ${primaryDescribed.suffix}`, {
425
- ...primaryDescribed.data,
426
- messagesToRefineCount: messages$1.length,
427
- });
428
- const rawFallbacks = clientConfig.clientOptions?.fallbacks;
429
- const fallbacks = Array.isArray(rawFallbacks) ? rawFallbacks : [];
430
- if (fallbacks.length > 0) {
431
- try {
432
- const onChunk = createSummarizationChunkHandler({
433
- stepId,
434
- config: traceConfig(summarizeConfig, 'cache_hit_compaction'),
435
- provider: clientConfig.provider,
436
- reasoningKey: agentContext.reasoningKey,
437
- });
438
- const fbResult = await invoke.tryFallbackProviders({
439
- fallbacks,
440
- tools: agentContext.getToolsForBinding(),
441
- messages: [
442
- ...messages$1,
443
- new messages.HumanMessage(buildSummarizationInstruction(clientConfig.promptText, clientConfig.updatePromptText, priorSummaryText)),
444
- ],
445
- config: traceConfig(summarizeConfig, 'cache_hit_compaction'),
446
- primaryError,
447
- onChunk,
448
- });
449
- const fbMsg = fbResult?.messages?.[0];
450
- if (fbMsg) {
451
- summaryText = extractResponseText(fbMsg);
452
- }
453
- }
454
- catch (fbErr) {
455
- const fbDescribed = describeFallbackError(fbErr, fallbacks);
456
- log('warn', `Fallback providers also failed ${fbDescribed.suffix}`, {
457
- ...fbDescribed.data,
458
- });
459
- }
460
- }
461
- if (!summaryText) {
462
- log('warn', `Summarization failed, falling back to metadata stub ${primaryDescribed.suffix}`, {
463
- ...primaryDescribed.data,
464
- messagesToRefineCount: messages$1.length,
465
- });
466
- summaryText = generateMetadataStub(messages$1);
467
- }
468
- }
469
- return { text: summaryText, usage: summaryUsage };
313
+ const { agentContext, messages, clientConfig, summarizeConfig, stepId, usePromptCache, log } = params;
314
+ const priorSummaryText = agentContext.getSummaryText()?.trim() ?? "";
315
+ let summaryText = "";
316
+ let summaryUsage;
317
+ try {
318
+ const result = await summarizeWithCacheHit({
319
+ model: require_init.initializeModel({
320
+ provider: clientConfig.provider,
321
+ clientOptions: clientConfig.clientOptions,
322
+ tools: agentContext.getToolsForBinding()
323
+ }),
324
+ messages,
325
+ promptText: clientConfig.promptText,
326
+ updatePromptText: clientConfig.updatePromptText,
327
+ priorSummaryText,
328
+ config: summarizeConfig,
329
+ stepId,
330
+ provider: clientConfig.provider,
331
+ reasoningKey: agentContext.reasoningKey,
332
+ usePromptCache,
333
+ log
334
+ });
335
+ summaryText = result.text;
336
+ summaryUsage = result.usage;
337
+ } catch (primaryError) {
338
+ const primaryDescribed = describeProviderError(primaryError, clientConfig.provider, clientConfig.modelName);
339
+ log("error", `Summarization LLM call failed ${primaryDescribed.suffix}`, {
340
+ ...primaryDescribed.data,
341
+ messagesToRefineCount: messages.length
342
+ });
343
+ const rawFallbacks = clientConfig.clientOptions?.fallbacks;
344
+ const fallbacks = Array.isArray(rawFallbacks) ? rawFallbacks : [];
345
+ if (fallbacks.length > 0) try {
346
+ const onChunk = createSummarizationChunkHandler({
347
+ stepId,
348
+ config: traceConfig(summarizeConfig, "cache_hit_compaction"),
349
+ provider: clientConfig.provider,
350
+ reasoningKey: agentContext.reasoningKey
351
+ });
352
+ const fbMsg = (await require_invoke.tryFallbackProviders({
353
+ fallbacks,
354
+ tools: agentContext.getToolsForBinding(),
355
+ messages: [...messages, new _langchain_core_messages.HumanMessage(buildSummarizationInstruction(clientConfig.promptText, clientConfig.updatePromptText, priorSummaryText))],
356
+ config: traceConfig(summarizeConfig, "cache_hit_compaction"),
357
+ primaryError,
358
+ onChunk
359
+ }))?.messages?.[0];
360
+ if (fbMsg) summaryText = extractResponseText(fbMsg);
361
+ } catch (fbErr) {
362
+ const fbDescribed = describeFallbackError(fbErr, fallbacks);
363
+ log("warn", `Fallback providers also failed ${fbDescribed.suffix}`, { ...fbDescribed.data });
364
+ }
365
+ if (!summaryText) {
366
+ log("warn", `Summarization failed, falling back to metadata stub ${primaryDescribed.suffix}`, {
367
+ ...primaryDescribed.data,
368
+ messagesToRefineCount: messages.length
369
+ });
370
+ summaryText = generateMetadataStub(messages);
371
+ }
372
+ }
373
+ return {
374
+ text: summaryText,
375
+ usage: summaryUsage
376
+ };
470
377
  }
471
378
  /** Dispatches run step completion, ON_SUMMARIZE_COMPLETE, and rebuilds token map. */
472
379
  async function dispatchCompletionEvents(params) {
473
- const { graph, runnableConfig, stepId, summaryBlock, agentContext, runStep, summaryUsage, agentId, messagesAfterCount, } = params;
474
- runStep.summary = summaryBlock;
475
- if (summaryUsage) {
476
- runStep.usage = {
477
- prompt_tokens: Number(summaryUsage.input_tokens) || 0,
478
- completion_tokens: Number(summaryUsage.output_tokens) || 0,
479
- total_tokens: (Number(summaryUsage.input_tokens) || 0) +
480
- (Number(summaryUsage.output_tokens) || 0),
481
- };
482
- }
483
- await graph.dispatchRunStepCompleted(stepId, { type: 'summary', summary: summaryBlock }, runnableConfig);
484
- if (runnableConfig) {
485
- await events.safeDispatchCustomEvent(_enum.GraphEvents.ON_SUMMARIZE_COMPLETE, {
486
- id: stepId,
487
- agentId,
488
- summary: summaryBlock,
489
- }, runnableConfig);
490
- }
491
- const sessionId = graph.runId ?? '';
492
- if (graph.hookRegistry?.hasHookFor('PostCompact', sessionId) === true) {
493
- const threadId = runnableConfig?.configurable?.thread_id;
494
- const firstBlock = summaryBlock.content?.[0];
495
- const summaryText = firstBlock != null &&
496
- typeof firstBlock === 'object' &&
497
- 'text' in firstBlock &&
498
- typeof firstBlock.text === 'string'
499
- ? firstBlock.text
500
- : '';
501
- await executeHooks.executeHooks({
502
- registry: graph.hookRegistry,
503
- input: {
504
- hook_event_name: 'PostCompact',
505
- runId: sessionId,
506
- threadId,
507
- agentId,
508
- summary: summaryText,
509
- messagesAfterCount,
510
- },
511
- sessionId,
512
- }).catch(() => {
513
- /* PostCompact is observational — swallow errors */
514
- });
515
- }
516
- agentContext.rebuildTokenMapAfterSummarization({});
380
+ const { graph, runnableConfig, stepId, summaryBlock, agentContext, runStep, summaryUsage, agentId, messagesAfterCount } = params;
381
+ runStep.summary = summaryBlock;
382
+ if (summaryUsage) runStep.usage = {
383
+ prompt_tokens: Number(summaryUsage.input_tokens) || 0,
384
+ completion_tokens: Number(summaryUsage.output_tokens) || 0,
385
+ total_tokens: (Number(summaryUsage.input_tokens) || 0) + (Number(summaryUsage.output_tokens) || 0)
386
+ };
387
+ await graph.dispatchRunStepCompleted(stepId, {
388
+ type: "summary",
389
+ summary: summaryBlock
390
+ }, runnableConfig);
391
+ if (runnableConfig) await require_events.safeDispatchCustomEvent("on_summarize_complete", {
392
+ id: stepId,
393
+ agentId,
394
+ summary: summaryBlock
395
+ }, runnableConfig);
396
+ const sessionId = graph.runId ?? "";
397
+ if (graph.hookRegistry?.hasHookFor("PostCompact", sessionId) === true) {
398
+ const threadId = (runnableConfig?.configurable)?.thread_id;
399
+ const firstBlock = summaryBlock.content?.[0];
400
+ const summaryText = firstBlock != null && typeof firstBlock === "object" && "text" in firstBlock && typeof firstBlock.text === "string" ? firstBlock.text : "";
401
+ await require_executeHooks.executeHooks({
402
+ registry: graph.hookRegistry,
403
+ input: {
404
+ hook_event_name: "PostCompact",
405
+ runId: sessionId,
406
+ threadId,
407
+ agentId,
408
+ summary: summaryText,
409
+ messagesAfterCount
410
+ },
411
+ sessionId
412
+ }).catch(() => {});
413
+ }
414
+ agentContext.rebuildTokenMapAfterSummarization({});
517
415
  }
518
- function createSummarizeNode({ agentContext, graph, generateStepId, }) {
519
- return async (state, config) => {
520
- const request = state.summarizationRequest;
521
- if (request == null) {
522
- return { summarizationRequest: undefined };
523
- }
524
- const maxCtx = agentContext.maxContextTokens ?? 0;
525
- if (maxCtx > 0 && agentContext.instructionTokens >= maxCtx) {
526
- events.emitAgentLog(config, 'warn', 'summarize', 'Summarization skipped, instructions exceed context budget. Reduce the number of tools or increase maxContextTokens.', {
527
- instructionTokens: agentContext.instructionTokens,
528
- maxContextTokens: maxCtx,
529
- breakdown: agentContext.formatTokenBudgetBreakdown(),
530
- }, { runId: graph.runId, agentId: request.agentId });
531
- return { summarizationRequest: undefined };
532
- }
533
- /**
534
- * Capture the original-tool-content map locally before doing the
535
- * split. We need it in three places: to restore the head for
536
- * summarizer quality, to leave intact on the skip path (state is
537
- * unchanged), and critically to carry forward the tail-relevant
538
- * entries on the summarize-fired path. Clearing it eagerly here
539
- * would lose the originals for masked tool messages that the
540
- * recency window keeps in the tail; a future summarization could
541
- * then only summarize the masked stub instead of the full payload.
542
- */
543
- const originalPending = agentContext.pendingOriginalToolContent;
544
- const restoredMessages = restoreOriginalToolContent(state.messages, originalPending);
545
- const runnableConfig = config ?? graph.config;
546
- const retainRecent = agentContext.summarizationConfig?.retainRecent;
547
- const { head: messagesToRefine, tailStartIndex } = recency.splitAtRecencyBoundary(restoredMessages, {
548
- turns: retainRecent?.turns ?? DEFAULT_RETAIN_RECENT_TURNS,
549
- tokens: retainRecent?.tokens,
550
- tokenCounter: agentContext.tokenCounter,
551
- });
552
- /**
553
- * Use the *masked* messages for the retained tail so that any
554
- * truncation prune applied to oversized ToolMessage content stays
555
- * truncated in live state. The summarizer above reads the restored
556
- * (full-content) head for summary quality, but reinjecting restored
557
- * tool payloads into state would defeat masking and bloat the
558
- * checkpoint, forcing more expensive re-pruning on later turns.
559
- * `restoreOriginalToolContent` returns an array with identical
560
- * length and structure to `state.messages` (replacements only at
561
- * specific indices), so the same tailStartIndex slices both arrays
562
- * at the same turn boundary.
563
- */
564
- const messagesToRetain = state.messages.slice(tailStartIndex);
565
- if (messagesToRefine.length === 0) {
566
- /**
567
- * Recency window covers the entire conversation — there is no
568
- * older content to summarize. Skipping prevents the model from
569
- * destroying the user's most recent message (e.g. a large pasted
570
- * payload on the first turn) by replacing it with a generic
571
- * checkpoint summary. Mark the trigger so the same unchanged
572
- * state is not re-evaluated on the next prune cycle.
573
- */
574
- events.emitAgentLog(config, 'debug', 'summarize', 'Summarization skipped — recency window retains all messages', {
575
- messagesRetained: messagesToRetain.length,
576
- retainTurns: retainRecent?.turns ?? DEFAULT_RETAIN_RECENT_TURNS,
577
- }, { runId: graph.runId, agentId: request.agentId });
578
- agentContext.markSummarizationTriggered(state.messages.length);
579
- return { summarizationRequest: undefined };
580
- }
581
- const clientConfig = buildSummarizationClientConfig(agentContext, agentContext.summarizationConfig);
582
- const stepKey = `summarize-${request.agentId}`;
583
- const [stepId, stepIndex] = generateStepId(stepKey);
584
- const placeholderSummary = {
585
- type: _enum.ContentTypes.SUMMARY,
586
- model: clientConfig.modelName,
587
- provider: clientConfig.provider,
588
- };
589
- const runStep = {
590
- stepIndex,
591
- id: stepId,
592
- type: _enum.StepTypes.MESSAGE_CREATION,
593
- index: graph.contentData.length,
594
- stepDetails: {
595
- type: _enum.StepTypes.MESSAGE_CREATION,
596
- message_creation: { message_id: stepId },
597
- },
598
- summary: placeholderSummary,
599
- usage: null,
600
- };
601
- if (graph.runId != null && graph.runId !== '') {
602
- runStep.runId = graph.runId;
603
- }
604
- if (graph.isMultiAgent && agentContext.agentId) {
605
- runStep.agentId = agentContext.agentId;
606
- }
607
- await graph.dispatchRunStep(runStep, runnableConfig);
608
- if (runnableConfig) {
609
- await events.safeDispatchCustomEvent(_enum.GraphEvents.ON_SUMMARIZE_START, {
610
- agentId: request.agentId,
611
- provider: clientConfig.provider,
612
- model: clientConfig.modelName,
613
- messagesToRefineCount: messagesToRefine.length,
614
- summaryVersion: agentContext.summaryVersion + 1,
615
- }, runnableConfig);
616
- }
617
- const sessionId = graph.runId ?? '';
618
- if (graph.hookRegistry?.hasHookFor('PreCompact', sessionId) === true) {
619
- const threadId = runnableConfig?.configurable?.thread_id;
620
- await executeHooks.executeHooks({
621
- registry: graph.hookRegistry,
622
- input: {
623
- hook_event_name: 'PreCompact',
624
- runId: sessionId,
625
- threadId,
626
- agentId: request.agentId,
627
- messagesBeforeCount: messagesToRefine.length,
628
- trigger: agentContext.summarizationConfig?.trigger?.type ?? 'default',
629
- },
630
- sessionId,
631
- }).catch(() => {
632
- /* PreCompact is observational swallow errors */
633
- });
634
- }
635
- const isSelfSummarizeModel = clientConfig.provider === agentContext.provider;
636
- const hasPromptCache = isSelfSummarizeModel &&
637
- agentContext.clientOptions
638
- ?.promptCache === true;
639
- const log = (level, message, data) => {
640
- events.emitAgentLog(runnableConfig, level, 'summarize', message, data, {
641
- runId: graph.runId,
642
- agentId: request.agentId,
643
- });
644
- };
645
- log('debug', 'Summarization starting', {
646
- messagesToRefineCount: messagesToRefine.length,
647
- hasPriorSummary: (agentContext.getSummaryText()?.trim() ?? '') !== '',
648
- summaryVersion: agentContext.summaryVersion + 1,
649
- isSelfSummarize: isSelfSummarizeModel,
650
- hasPromptCache,
651
- provider: clientConfig.provider,
652
- });
653
- const summarizeConfig = config
654
- ? {
655
- ...config,
656
- metadata: {
657
- ...config.metadata,
658
- agent_id: request.agentId,
659
- summarization_provider: clientConfig.provider,
660
- summarization_model: clientConfig.modelName,
661
- },
662
- }
663
- : undefined;
664
- const { text: rawText, usage: summaryUsage } = await executeSummarizationWithFallback({
665
- agentContext,
666
- messages: messagesToRefine,
667
- clientConfig,
668
- summarizeConfig,
669
- stepId,
670
- usePromptCache: isSelfSummarizeModel && hasPromptCache,
671
- log,
672
- });
673
- if (!rawText) {
674
- agentContext.markSummarizationTriggered(0);
675
- if (runnableConfig) {
676
- await events.safeDispatchCustomEvent(_enum.GraphEvents.ON_SUMMARIZE_COMPLETE, {
677
- id: stepId,
678
- agentId: request.agentId,
679
- error: 'Summarization produced empty output',
680
- }, runnableConfig);
681
- }
682
- return { summarizationRequest: undefined };
683
- }
684
- const summaryText = enrichSummary(rawText, messagesToRefine);
685
- const tokenCount = computeSummaryTokenCount(summaryText, summaryUsage, agentContext.tokenCounter);
686
- agentContext.setSummary(summaryText, tokenCount);
687
- log('info', 'Summary persisted');
688
- log('debug', 'Summary details', {
689
- summaryTokens: tokenCount,
690
- textLength: summaryText.length,
691
- messagesCompacted: messagesToRefine.length,
692
- summaryVersion: agentContext.summaryVersion,
693
- ...(summaryUsage != null
694
- ? {
695
- input_tokens: summaryUsage.input_tokens,
696
- output_tokens: summaryUsage.output_tokens,
697
- cache_read: summaryUsage.input_token_details?.cache_read,
698
- cache_creation: summaryUsage.input_token_details?.cache_creation,
699
- }
700
- : {}),
701
- });
702
- const summaryBlock = buildSummaryBlock({
703
- summaryText,
704
- tokenCount,
705
- stepId,
706
- stepIndex: runStep.index,
707
- modelName: clientConfig.modelName,
708
- provider: clientConfig.provider,
709
- summaryVersion: agentContext.summaryVersion,
710
- });
711
- await dispatchCompletionEvents({
712
- graph,
713
- runnableConfig,
714
- stepId,
715
- summaryBlock,
716
- agentContext,
717
- runStep,
718
- summaryUsage,
719
- agentId: request.agentId,
720
- messagesAfterCount: messagesToRetain.length,
721
- });
722
- /**
723
- * `dispatchCompletionEvents` calls `rebuildTokenMapAfterSummarization({})`
724
- * which resets the dedupe baseline to 0 correct under the legacy
725
- * "remove-all only" shape where no messages survived, but stale once
726
- * the recency window keeps a tail. Realign the baseline to the
727
- * surviving tail length so a subsequent prune cycle on the unchanged
728
- * tail short-circuits via `shouldSkipSummarization` instead of
729
- * looping back into another summarize call.
730
- */
731
- agentContext.markSummarizationTriggered(messagesToRetain.length);
732
- /**
733
- * Carry forward the original-content entries that correspond to the
734
- * retained tail, reindexed for the post-removeAll state where tail
735
- * messages start at index 0. Without this, a future summarization
736
- * that pulls these tail messages into its head would only see the
737
- * masked stubs (since `setSummary` clears `pruneMessages`, and the
738
- * fresh pruner at the next turn has no record of prior masks).
739
- * Entries for indices < `tailStartIndex` belong to messages we just
740
- * summarized — they are no longer reachable so they are dropped.
741
- */
742
- if (originalPending != null && originalPending.size > 0) {
743
- const tailPending = new Map();
744
- for (const [idx, content] of originalPending) {
745
- if (idx >= tailStartIndex) {
746
- tailPending.set(idx - tailStartIndex, content);
747
- }
748
- }
749
- agentContext.pendingOriginalToolContent =
750
- tailPending.size > 0 ? tailPending : undefined;
751
- }
752
- else {
753
- agentContext.pendingOriginalToolContent = undefined;
754
- }
755
- return {
756
- summarizationRequest: undefined,
757
- messages: messagesToRetain.length > 0
758
- ? [reducer.createRemoveAllMessage(), ...messagesToRetain]
759
- : [reducer.createRemoveAllMessage()],
760
- };
761
- };
416
+ function createSummarizeNode({ agentContext, graph, generateStepId }) {
417
+ return async (state, config) => {
418
+ const request = state.summarizationRequest;
419
+ if (request == null) return { summarizationRequest: void 0 };
420
+ const maxCtx = agentContext.maxContextTokens ?? 0;
421
+ if (maxCtx > 0 && agentContext.instructionTokens >= maxCtx) {
422
+ require_events.emitAgentLog(config, "warn", "summarize", "Summarization skipped, instructions exceed context budget. Reduce the number of tools or increase maxContextTokens.", {
423
+ instructionTokens: agentContext.instructionTokens,
424
+ maxContextTokens: maxCtx,
425
+ breakdown: agentContext.formatTokenBudgetBreakdown()
426
+ }, {
427
+ runId: graph.runId,
428
+ agentId: request.agentId
429
+ });
430
+ return { summarizationRequest: void 0 };
431
+ }
432
+ /**
433
+ * Capture the original-tool-content map locally before doing the
434
+ * split. We need it in three places: to restore the head for
435
+ * summarizer quality, to leave intact on the skip path (state is
436
+ * unchanged), and critically to carry forward the tail-relevant
437
+ * entries on the summarize-fired path. Clearing it eagerly here
438
+ * would lose the originals for masked tool messages that the
439
+ * recency window keeps in the tail; a future summarization could
440
+ * then only summarize the masked stub instead of the full payload.
441
+ */
442
+ const originalPending = agentContext.pendingOriginalToolContent;
443
+ const restoredMessages = restoreOriginalToolContent(state.messages, originalPending);
444
+ const runnableConfig = config ?? graph.config;
445
+ const retainRecent = agentContext.summarizationConfig?.retainRecent;
446
+ const { head: messagesToRefine, tailStartIndex } = require_recency.splitAtRecencyBoundary(restoredMessages, {
447
+ turns: retainRecent?.turns ?? DEFAULT_RETAIN_RECENT_TURNS,
448
+ tokens: retainRecent?.tokens,
449
+ tokenCounter: agentContext.tokenCounter
450
+ });
451
+ /**
452
+ * Use the *masked* messages for the retained tail so that any
453
+ * truncation prune applied to oversized ToolMessage content stays
454
+ * truncated in live state. The summarizer above reads the restored
455
+ * (full-content) head for summary quality, but reinjecting restored
456
+ * tool payloads into state would defeat masking and bloat the
457
+ * checkpoint, forcing more expensive re-pruning on later turns.
458
+ * `restoreOriginalToolContent` returns an array with identical
459
+ * length and structure to `state.messages` (replacements only at
460
+ * specific indices), so the same tailStartIndex slices both arrays
461
+ * at the same turn boundary.
462
+ */
463
+ const messagesToRetain = state.messages.slice(tailStartIndex);
464
+ if (messagesToRefine.length === 0) {
465
+ /**
466
+ * Recency window covers the entire conversation there is no
467
+ * older content to summarize. Skipping prevents the model from
468
+ * destroying the user's most recent message (e.g. a large pasted
469
+ * payload on the first turn) by replacing it with a generic
470
+ * checkpoint summary. Mark the trigger so the same unchanged
471
+ * state is not re-evaluated on the next prune cycle.
472
+ */
473
+ require_events.emitAgentLog(config, "debug", "summarize", "Summarization skipped — recency window retains all messages", {
474
+ messagesRetained: messagesToRetain.length,
475
+ retainTurns: retainRecent?.turns ?? DEFAULT_RETAIN_RECENT_TURNS
476
+ }, {
477
+ runId: graph.runId,
478
+ agentId: request.agentId
479
+ });
480
+ agentContext.markSummarizationTriggered(state.messages.length);
481
+ return { summarizationRequest: void 0 };
482
+ }
483
+ const clientConfig = buildSummarizationClientConfig(agentContext, agentContext.summarizationConfig);
484
+ const [stepId, stepIndex] = generateStepId(`summarize-${request.agentId}`);
485
+ const placeholderSummary = {
486
+ type: "summary",
487
+ model: clientConfig.modelName,
488
+ provider: clientConfig.provider
489
+ };
490
+ const runStep = {
491
+ stepIndex,
492
+ id: stepId,
493
+ type: "message_creation",
494
+ index: graph.contentData.length,
495
+ stepDetails: {
496
+ type: "message_creation",
497
+ message_creation: { message_id: stepId }
498
+ },
499
+ summary: placeholderSummary,
500
+ usage: null
501
+ };
502
+ if (graph.runId != null && graph.runId !== "") runStep.runId = graph.runId;
503
+ if (graph.isMultiAgent && agentContext.agentId) runStep.agentId = agentContext.agentId;
504
+ await graph.dispatchRunStep(runStep, runnableConfig);
505
+ if (runnableConfig) await require_events.safeDispatchCustomEvent("on_summarize_start", {
506
+ agentId: request.agentId,
507
+ provider: clientConfig.provider,
508
+ model: clientConfig.modelName,
509
+ messagesToRefineCount: messagesToRefine.length,
510
+ summaryVersion: agentContext.summaryVersion + 1
511
+ }, runnableConfig);
512
+ const sessionId = graph.runId ?? "";
513
+ if (graph.hookRegistry?.hasHookFor("PreCompact", sessionId) === true) {
514
+ const threadId = (runnableConfig?.configurable)?.thread_id;
515
+ await require_executeHooks.executeHooks({
516
+ registry: graph.hookRegistry,
517
+ input: {
518
+ hook_event_name: "PreCompact",
519
+ runId: sessionId,
520
+ threadId,
521
+ agentId: request.agentId,
522
+ messagesBeforeCount: messagesToRefine.length,
523
+ trigger: agentContext.summarizationConfig?.trigger?.type ?? "default"
524
+ },
525
+ sessionId
526
+ }).catch(() => {});
527
+ }
528
+ const isSelfSummarizeModel = clientConfig.provider === agentContext.provider;
529
+ const hasPromptCache = isSelfSummarizeModel && agentContext.clientOptions?.promptCache === true;
530
+ const log = (level, message, data) => {
531
+ require_events.emitAgentLog(runnableConfig, level, "summarize", message, data, {
532
+ runId: graph.runId,
533
+ agentId: request.agentId
534
+ });
535
+ };
536
+ log("debug", "Summarization starting", {
537
+ messagesToRefineCount: messagesToRefine.length,
538
+ hasPriorSummary: (agentContext.getSummaryText()?.trim() ?? "") !== "",
539
+ summaryVersion: agentContext.summaryVersion + 1,
540
+ isSelfSummarize: isSelfSummarizeModel,
541
+ hasPromptCache,
542
+ provider: clientConfig.provider
543
+ });
544
+ const { text: rawText, usage: summaryUsage } = await executeSummarizationWithFallback({
545
+ agentContext,
546
+ messages: messagesToRefine,
547
+ clientConfig,
548
+ summarizeConfig: config ? {
549
+ ...config,
550
+ metadata: {
551
+ ...config.metadata,
552
+ agent_id: request.agentId,
553
+ summarization_provider: clientConfig.provider,
554
+ summarization_model: clientConfig.modelName
555
+ }
556
+ } : void 0,
557
+ stepId,
558
+ usePromptCache: isSelfSummarizeModel && hasPromptCache,
559
+ log
560
+ });
561
+ if (!rawText) {
562
+ agentContext.markSummarizationTriggered(0);
563
+ if (runnableConfig) await require_events.safeDispatchCustomEvent("on_summarize_complete", {
564
+ id: stepId,
565
+ agentId: request.agentId,
566
+ error: "Summarization produced empty output"
567
+ }, runnableConfig);
568
+ return { summarizationRequest: void 0 };
569
+ }
570
+ const summaryText = enrichSummary(rawText, messagesToRefine);
571
+ const tokenCount = computeSummaryTokenCount(summaryText, summaryUsage, agentContext.tokenCounter);
572
+ agentContext.setSummary(summaryText, tokenCount);
573
+ log("info", "Summary persisted");
574
+ log("debug", "Summary details", {
575
+ summaryTokens: tokenCount,
576
+ textLength: summaryText.length,
577
+ messagesCompacted: messagesToRefine.length,
578
+ summaryVersion: agentContext.summaryVersion,
579
+ ...summaryUsage != null ? {
580
+ input_tokens: summaryUsage.input_tokens,
581
+ output_tokens: summaryUsage.output_tokens,
582
+ cache_read: summaryUsage.input_token_details?.cache_read,
583
+ cache_creation: summaryUsage.input_token_details?.cache_creation
584
+ } : {}
585
+ });
586
+ await dispatchCompletionEvents({
587
+ graph,
588
+ runnableConfig,
589
+ stepId,
590
+ summaryBlock: buildSummaryBlock({
591
+ summaryText,
592
+ tokenCount,
593
+ stepId,
594
+ stepIndex: runStep.index,
595
+ modelName: clientConfig.modelName,
596
+ provider: clientConfig.provider,
597
+ summaryVersion: agentContext.summaryVersion
598
+ }),
599
+ agentContext,
600
+ runStep,
601
+ summaryUsage,
602
+ agentId: request.agentId,
603
+ messagesAfterCount: messagesToRetain.length
604
+ });
605
+ /**
606
+ * `dispatchCompletionEvents` calls `rebuildTokenMapAfterSummarization({})`
607
+ * which resets the dedupe baseline to 0 — correct under the legacy
608
+ * "remove-all only" shape where no messages survived, but stale once
609
+ * the recency window keeps a tail. Realign the baseline to the
610
+ * surviving tail length so a subsequent prune cycle on the unchanged
611
+ * tail short-circuits via `shouldSkipSummarization` instead of
612
+ * looping back into another summarize call.
613
+ */
614
+ agentContext.markSummarizationTriggered(messagesToRetain.length);
615
+ /**
616
+ * Carry forward the original-content entries that correspond to the
617
+ * retained tail, reindexed for the post-removeAll state where tail
618
+ * messages start at index 0. Without this, a future summarization
619
+ * that pulls these tail messages into its head would only see the
620
+ * masked stubs (since `setSummary` clears `pruneMessages`, and the
621
+ * fresh pruner at the next turn has no record of prior masks).
622
+ * Entries for indices < `tailStartIndex` belong to messages we just
623
+ * summarized they are no longer reachable so they are dropped.
624
+ */
625
+ if (originalPending != null && originalPending.size > 0) {
626
+ const tailPending = /* @__PURE__ */ new Map();
627
+ for (const [idx, content] of originalPending) if (idx >= tailStartIndex) tailPending.set(idx - tailStartIndex, content);
628
+ agentContext.pendingOriginalToolContent = tailPending.size > 0 ? tailPending : void 0;
629
+ } else agentContext.pendingOriginalToolContent = void 0;
630
+ return {
631
+ summarizationRequest: void 0,
632
+ messages: messagesToRetain.length > 0 ? [require_reducer.createRemoveAllMessage(), ...messagesToRetain] : [require_reducer.createRemoveAllMessage()]
633
+ };
634
+ };
762
635
  }
763
636
  /** Extracts text from an LLM response, skipping reasoning/thinking blocks. */
764
637
  function extractResponseText(response) {
765
- const { content } = response;
766
- if (typeof content === 'string') {
767
- return content.trim();
768
- }
769
- if (!Array.isArray(content)) {
770
- return '';
771
- }
772
- const parts = [];
773
- for (const block of content) {
774
- if (typeof block === 'string') {
775
- parts.push(block);
776
- continue;
777
- }
778
- if (block == null || typeof block !== 'object') {
779
- continue;
780
- }
781
- const rec = block;
782
- if (rec.type === _enum.ContentTypes.THINKING ||
783
- rec.type === _enum.ContentTypes.REASONING_CONTENT ||
784
- rec.type === 'redacted_thinking') {
785
- continue;
786
- }
787
- if (rec.type === 'text' && typeof rec.text === 'string') {
788
- parts.push(rec.text);
789
- }
790
- }
791
- return parts.join('').trim();
638
+ const { content } = response;
639
+ if (typeof content === "string") return content.trim();
640
+ if (!Array.isArray(content)) return "";
641
+ const parts = [];
642
+ for (const block of content) {
643
+ if (typeof block === "string") {
644
+ parts.push(block);
645
+ continue;
646
+ }
647
+ if (block == null || typeof block !== "object") continue;
648
+ const rec = block;
649
+ if (rec.type === "thinking" || rec.type === "reasoning_content" || rec.type === "redacted_thinking") continue;
650
+ if (rec.type === "text" && typeof rec.text === "string") parts.push(rec.text);
651
+ }
652
+ return parts.join("").trim();
792
653
  }
793
654
  function buildSummarizationInstruction(promptText, updatePromptText, priorSummaryText) {
794
- const effectivePrompt = priorSummaryText
795
- ? (updatePromptText ?? promptText)
796
- : promptText;
797
- const parts = [effectivePrompt];
798
- if (priorSummaryText) {
799
- parts.push(`\n\n<previous-summary>\n${priorSummaryText}\n</previous-summary>`);
800
- }
801
- return parts.join('');
655
+ const parts = [priorSummaryText ? updatePromptText ?? promptText : promptText];
656
+ if (priorSummaryText) parts.push(`\n\n<previous-summary>\n${priorSummaryText}\n</previous-summary>`);
657
+ return parts.join("");
802
658
  }
803
659
  /** Creates an `onChunk` callback that dispatches `ON_SUMMARIZE_DELTA` events for streaming. */
804
- function createSummarizationChunkHandler({ stepId, config, provider, reasoningKey = 'reasoning_content', }) {
805
- if (stepId == null || stepId === '' || !config) {
806
- return undefined;
807
- }
808
- return (chunk) => {
809
- const chunkAny = chunk;
810
- const raw = stream.getChunkContent({ chunk: chunkAny, provider, reasoningKey });
811
- if (raw == null || (typeof raw === 'string' && !raw)) {
812
- return;
813
- }
814
- const contentBlocks = typeof raw === 'string'
815
- ? [{ type: _enum.ContentTypes.TEXT, text: raw }]
816
- : raw;
817
- void events.safeDispatchCustomEvent(_enum.GraphEvents.ON_SUMMARIZE_DELTA, {
818
- id: stepId,
819
- delta: {
820
- summary: {
821
- type: _enum.ContentTypes.SUMMARY,
822
- content: contentBlocks,
823
- provider: String(config.metadata?.summarization_provider ?? ''),
824
- model: String(config.metadata?.summarization_model ?? ''),
825
- },
826
- },
827
- }, config);
828
- };
660
+ function createSummarizationChunkHandler({ stepId, config, provider, reasoningKey = "reasoning_content" }) {
661
+ if (stepId == null || stepId === "" || !config) return;
662
+ return (chunk) => {
663
+ const raw = require_stream.getChunkContent({
664
+ chunk,
665
+ provider,
666
+ reasoningKey
667
+ });
668
+ if (raw == null || typeof raw === "string" && !raw) return;
669
+ const contentBlocks = typeof raw === "string" ? [{
670
+ type: "text",
671
+ text: raw
672
+ }] : raw;
673
+ require_events.safeDispatchCustomEvent("on_summarize_delta", {
674
+ id: stepId,
675
+ delta: { summary: {
676
+ type: "summary",
677
+ content: contentBlocks,
678
+ provider: String(config.metadata?.summarization_provider ?? ""),
679
+ model: String(config.metadata?.summarization_model ?? "")
680
+ } }
681
+ }, config);
682
+ };
829
683
  }
830
684
  function traceConfig(config, stage) {
831
- if (!config) {
832
- return undefined;
833
- }
834
- return {
835
- ...config,
836
- runName: `summarization:${stage}`,
837
- metadata: { ...config.metadata, summarization: true, stage },
838
- };
685
+ if (!config) return;
686
+ return {
687
+ ...config,
688
+ runName: `summarization:${stage}`,
689
+ metadata: {
690
+ ...config.metadata,
691
+ summarization: true,
692
+ stage
693
+ }
694
+ };
839
695
  }
840
696
  /**
841
- * Cache-friendly compaction: sends raw conversation messages with the
842
- * summarization instruction appended as the final HumanMessage.
843
- * Providers with prompt caching get a cache hit on the system prompt +
844
- * tool definitions prefix.
845
- */
846
- async function summarizeWithCacheHit({ model, messages: messages$1, promptText, updatePromptText, priorSummaryText, config, stepId, provider, reasoningKey, usePromptCache, log, }) {
847
- const instruction = buildSummarizationInstruction(promptText, updatePromptText, priorSummaryText);
848
- const fullMessages = [...messages$1, new messages.HumanMessage(instruction)];
849
- const invokeMessages = usePromptCache === true ? cache.addCacheControl(fullMessages) : fullMessages;
850
- const result = await invoke.attemptInvoke({
851
- model,
852
- messages: invokeMessages,
853
- provider,
854
- onChunk: createSummarizationChunkHandler({
855
- stepId,
856
- config: traceConfig(config, 'cache_hit_compaction'),
857
- provider,
858
- reasoningKey,
859
- }),
860
- }, traceConfig(config, 'cache_hit_compaction'));
861
- const responseMsg = result.messages?.[0];
862
- const text = responseMsg
863
- ? extractResponseText(responseMsg)
864
- : '';
865
- let usage;
866
- let usageSource = 'none';
867
- if (responseMsg != null &&
868
- 'usage_metadata' in responseMsg &&
869
- responseMsg.usage_metadata != null) {
870
- usage = responseMsg.usage_metadata;
871
- usageSource = 'usage_metadata';
872
- }
873
- else if (responseMsg != null) {
874
- const respMeta = responseMsg.response_metadata;
875
- const raw = respMeta?.metadata
876
- ?.usage;
877
- if (raw != null) {
878
- usage = {
879
- input_tokens: Number(raw.inputTokens) || undefined,
880
- output_tokens: Number(raw.outputTokens) || undefined,
881
- };
882
- usageSource = 'response_metadata';
883
- }
884
- }
885
- const cacheDetails = usage?.input_token_details;
886
- log?.('debug', 'Summarization LLM usage', {
887
- source: usageSource,
888
- input_tokens: usage?.input_tokens,
889
- output_tokens: usage?.output_tokens,
890
- ...(cacheDetails?.cache_read != null || cacheDetails?.cache_creation != null
891
- ? {
892
- 'input_token_details.cache_read': cacheDetails.cache_read,
893
- 'input_token_details.cache_creation': cacheDetails.cache_creation,
894
- }
895
- : {}),
896
- });
897
- return { text, usage };
697
+ * Cache-friendly compaction: sends raw conversation messages with the
698
+ * summarization instruction appended as the final HumanMessage.
699
+ * Providers with prompt caching get a cache hit on the system prompt +
700
+ * tool definitions prefix.
701
+ */
702
+ async function summarizeWithCacheHit({ model, messages, promptText, updatePromptText, priorSummaryText, config, stepId, provider, reasoningKey, usePromptCache, log }) {
703
+ const instruction = buildSummarizationInstruction(promptText, updatePromptText, priorSummaryText);
704
+ const fullMessages = [...messages, new _langchain_core_messages.HumanMessage(instruction)];
705
+ const responseMsg = (await require_invoke.attemptInvoke({
706
+ model,
707
+ messages: usePromptCache === true ? require_cache.addCacheControl(fullMessages) : fullMessages,
708
+ provider,
709
+ onChunk: createSummarizationChunkHandler({
710
+ stepId,
711
+ config: traceConfig(config, "cache_hit_compaction"),
712
+ provider,
713
+ reasoningKey
714
+ })
715
+ }, traceConfig(config, "cache_hit_compaction"))).messages?.[0];
716
+ const text = responseMsg ? extractResponseText(responseMsg) : "";
717
+ let usage;
718
+ let usageSource = "none";
719
+ if (responseMsg != null && "usage_metadata" in responseMsg && responseMsg.usage_metadata != null) {
720
+ usage = responseMsg.usage_metadata;
721
+ usageSource = "usage_metadata";
722
+ } else if (responseMsg != null) {
723
+ const raw = (responseMsg.response_metadata?.metadata)?.usage;
724
+ if (raw != null) {
725
+ usage = {
726
+ input_tokens: Number(raw.inputTokens) || void 0,
727
+ output_tokens: Number(raw.outputTokens) || void 0
728
+ };
729
+ usageSource = "response_metadata";
730
+ }
731
+ }
732
+ const cacheDetails = usage?.input_token_details;
733
+ log?.("debug", "Summarization LLM usage", {
734
+ source: usageSource,
735
+ input_tokens: usage?.input_tokens,
736
+ output_tokens: usage?.output_tokens,
737
+ ...cacheDetails?.cache_read != null || cacheDetails?.cache_creation != null ? {
738
+ "input_token_details.cache_read": cacheDetails.cache_read,
739
+ "input_token_details.cache_creation": cacheDetails.cache_creation
740
+ } : {}
741
+ });
742
+ return {
743
+ text,
744
+ usage
745
+ };
898
746
  }
899
-
900
- exports.DEFAULT_SUMMARIZATION_PROMPT = DEFAULT_SUMMARIZATION_PROMPT;
901
- exports.DEFAULT_UPDATE_SUMMARIZATION_PROMPT = DEFAULT_UPDATE_SUMMARIZATION_PROMPT;
747
+ //#endregion
902
748
  exports.createSummarizeNode = createSummarizeNode;
903
- //# sourceMappingURL=node.cjs.map
749
+
750
+ //# sourceMappingURL=node.cjs.map