@librechat/agents 3.3.3 → 3.3.5

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 (274) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +2 -1
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/common/constants.cjs +21 -0
  4. package/dist/cjs/common/constants.cjs.map +1 -1
  5. package/dist/cjs/events.cjs +10 -1
  6. package/dist/cjs/events.cjs.map +1 -1
  7. package/dist/cjs/graphs/Graph.cjs +793 -111
  8. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  9. package/dist/cjs/graphs/MultiAgentGraph.cjs +3 -1
  10. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  11. package/dist/cjs/hooks/HookRegistry.cjs +25 -0
  12. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  13. package/dist/cjs/hooks/index.cjs +12 -0
  14. package/dist/cjs/hooks/index.cjs.map +1 -1
  15. package/dist/cjs/hooks/types.cjs +1 -0
  16. package/dist/cjs/hooks/types.cjs.map +1 -1
  17. package/dist/cjs/langfuse.cjs +8 -0
  18. package/dist/cjs/langfuse.cjs.map +1 -1
  19. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +79 -6
  20. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  21. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +38 -13
  22. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
  23. package/dist/cjs/llm/google/utils/common.cjs +19 -7
  24. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  25. package/dist/cjs/llm/invoke.cjs +331 -5
  26. package/dist/cjs/llm/invoke.cjs.map +1 -1
  27. package/dist/cjs/llm/openai/index.cjs +41 -5
  28. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  29. package/dist/cjs/llm/openai/utils/index.cjs +25 -4
  30. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  31. package/dist/cjs/llm/openrouter/index.cjs +4 -1
  32. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  33. package/dist/cjs/llm/preempt.cjs +132 -0
  34. package/dist/cjs/llm/preempt.cjs.map +1 -0
  35. package/dist/cjs/main.cjs +36 -5
  36. package/dist/cjs/messages/alternation.cjs +92 -0
  37. package/dist/cjs/messages/alternation.cjs.map +1 -0
  38. package/dist/cjs/messages/cache.cjs +54 -33
  39. package/dist/cjs/messages/cache.cjs.map +1 -1
  40. package/dist/cjs/messages/contextPruning.cjs +17 -43
  41. package/dist/cjs/messages/contextPruning.cjs.map +1 -1
  42. package/dist/cjs/messages/core.cjs +315 -23
  43. package/dist/cjs/messages/core.cjs.map +1 -1
  44. package/dist/cjs/messages/format.cjs +290 -60
  45. package/dist/cjs/messages/format.cjs.map +1 -1
  46. package/dist/cjs/messages/handoffCue.cjs +63 -0
  47. package/dist/cjs/messages/handoffCue.cjs.map +1 -0
  48. package/dist/cjs/messages/index.cjs +4 -1
  49. package/dist/cjs/messages/injected.cjs +60 -0
  50. package/dist/cjs/messages/injected.cjs.map +1 -0
  51. package/dist/cjs/messages/prune.cjs +503 -127
  52. package/dist/cjs/messages/prune.cjs.map +1 -1
  53. package/dist/cjs/run.cjs +80 -7
  54. package/dist/cjs/run.cjs.map +1 -1
  55. package/dist/cjs/session/handlers.cjs +18 -9
  56. package/dist/cjs/session/handlers.cjs.map +1 -1
  57. package/dist/cjs/stream.cjs +35 -10
  58. package/dist/cjs/stream.cjs.map +1 -1
  59. package/dist/cjs/summarization/node.cjs +28 -14
  60. package/dist/cjs/summarization/node.cjs.map +1 -1
  61. package/dist/cjs/tools/ToolNode.cjs +56 -63
  62. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  63. package/dist/cjs/tools/search/keenable-scraper.cjs +90 -0
  64. package/dist/cjs/tools/search/keenable-scraper.cjs.map +1 -0
  65. package/dist/cjs/tools/search/tool.cjs +9 -1
  66. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  67. package/dist/cjs/tools/toolOutputReferences.cjs +6 -0
  68. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
  69. package/dist/cjs/utils/index.cjs +1 -1
  70. package/dist/cjs/utils/llm.cjs +1 -1
  71. package/dist/cjs/utils/llm.cjs.map +1 -1
  72. package/dist/cjs/utils/tokens.cjs +307 -20
  73. package/dist/cjs/utils/tokens.cjs.map +1 -1
  74. package/dist/cjs/utils/toolContent.cjs +1514 -0
  75. package/dist/cjs/utils/toolContent.cjs.map +1 -0
  76. package/dist/esm/agents/AgentContext.mjs +2 -1
  77. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  78. package/dist/esm/common/constants.mjs +19 -1
  79. package/dist/esm/common/constants.mjs.map +1 -1
  80. package/dist/esm/events.mjs +10 -1
  81. package/dist/esm/events.mjs.map +1 -1
  82. package/dist/esm/graphs/Graph.mjs +798 -116
  83. package/dist/esm/graphs/Graph.mjs.map +1 -1
  84. package/dist/esm/graphs/MultiAgentGraph.mjs +3 -1
  85. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  86. package/dist/esm/hooks/HookRegistry.mjs +25 -0
  87. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  88. package/dist/esm/hooks/index.mjs +12 -1
  89. package/dist/esm/hooks/index.mjs.map +1 -1
  90. package/dist/esm/hooks/types.mjs +1 -0
  91. package/dist/esm/hooks/types.mjs.map +1 -1
  92. package/dist/esm/langfuse.mjs +9 -1
  93. package/dist/esm/langfuse.mjs.map +1 -1
  94. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +79 -6
  95. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  96. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +38 -13
  97. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
  98. package/dist/esm/llm/google/utils/common.mjs +19 -7
  99. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  100. package/dist/esm/llm/invoke.mjs +332 -8
  101. package/dist/esm/llm/invoke.mjs.map +1 -1
  102. package/dist/esm/llm/openai/index.mjs +41 -5
  103. package/dist/esm/llm/openai/index.mjs.map +1 -1
  104. package/dist/esm/llm/openai/utils/index.mjs +25 -4
  105. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  106. package/dist/esm/llm/openrouter/index.mjs +4 -1
  107. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  108. package/dist/esm/llm/preempt.mjs +131 -0
  109. package/dist/esm/llm/preempt.mjs.map +1 -0
  110. package/dist/esm/main.mjs +14 -11
  111. package/dist/esm/messages/alternation.mjs +91 -0
  112. package/dist/esm/messages/alternation.mjs.map +1 -0
  113. package/dist/esm/messages/cache.mjs +55 -34
  114. package/dist/esm/messages/cache.mjs.map +1 -1
  115. package/dist/esm/messages/contextPruning.mjs +17 -43
  116. package/dist/esm/messages/contextPruning.mjs.map +1 -1
  117. package/dist/esm/messages/core.mjs +305 -24
  118. package/dist/esm/messages/core.mjs.map +1 -1
  119. package/dist/esm/messages/format.mjs +290 -61
  120. package/dist/esm/messages/format.mjs.map +1 -1
  121. package/dist/esm/messages/handoffCue.mjs +61 -0
  122. package/dist/esm/messages/handoffCue.mjs.map +1 -0
  123. package/dist/esm/messages/index.mjs +4 -1
  124. package/dist/esm/messages/injected.mjs +60 -0
  125. package/dist/esm/messages/injected.mjs.map +1 -0
  126. package/dist/esm/messages/prune.mjs +500 -128
  127. package/dist/esm/messages/prune.mjs.map +1 -1
  128. package/dist/esm/run.mjs +80 -7
  129. package/dist/esm/run.mjs.map +1 -1
  130. package/dist/esm/session/handlers.mjs +19 -10
  131. package/dist/esm/session/handlers.mjs.map +1 -1
  132. package/dist/esm/stream.mjs +34 -11
  133. package/dist/esm/stream.mjs.map +1 -1
  134. package/dist/esm/summarization/node.mjs +28 -14
  135. package/dist/esm/summarization/node.mjs.map +1 -1
  136. package/dist/esm/tools/ToolNode.mjs +56 -63
  137. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  138. package/dist/esm/tools/search/keenable-scraper.mjs +88 -0
  139. package/dist/esm/tools/search/keenable-scraper.mjs.map +1 -0
  140. package/dist/esm/tools/search/tool.mjs +9 -1
  141. package/dist/esm/tools/search/tool.mjs.map +1 -1
  142. package/dist/esm/tools/toolOutputReferences.mjs +6 -0
  143. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
  144. package/dist/esm/utils/index.mjs +1 -1
  145. package/dist/esm/utils/llm.mjs +1 -1
  146. package/dist/esm/utils/llm.mjs.map +1 -1
  147. package/dist/esm/utils/tokens.mjs +307 -21
  148. package/dist/esm/utils/tokens.mjs.map +1 -1
  149. package/dist/esm/utils/toolContent.mjs +1503 -0
  150. package/dist/esm/utils/toolContent.mjs.map +1 -0
  151. package/dist/types/common/constants.d.ts +18 -0
  152. package/dist/types/graphs/Graph.d.ts +139 -2
  153. package/dist/types/hooks/HookRegistry.d.ts +15 -0
  154. package/dist/types/hooks/index.d.ts +12 -1
  155. package/dist/types/hooks/types.d.ts +45 -6
  156. package/dist/types/index.d.ts +1 -1
  157. package/dist/types/llm/invoke.d.ts +34 -1
  158. package/dist/types/llm/openai/index.d.ts +4 -0
  159. package/dist/types/llm/openai/utils/index.d.ts +2 -0
  160. package/dist/types/llm/openrouter/index.d.ts +5 -0
  161. package/dist/types/llm/preempt.d.ts +40 -0
  162. package/dist/types/messages/alternation.d.ts +23 -0
  163. package/dist/types/messages/contextPruning.d.ts +2 -1
  164. package/dist/types/messages/core.d.ts +36 -0
  165. package/dist/types/messages/format.d.ts +6 -0
  166. package/dist/types/messages/handoffCue.d.ts +40 -0
  167. package/dist/types/messages/index.d.ts +3 -0
  168. package/dist/types/messages/injected.d.ts +3 -0
  169. package/dist/types/messages/prune.d.ts +16 -12
  170. package/dist/types/run.d.ts +7 -0
  171. package/dist/types/stream.d.ts +14 -0
  172. package/dist/types/tools/ToolNode.d.ts +0 -7
  173. package/dist/types/tools/search/keenable-scraper.d.ts +15 -0
  174. package/dist/types/tools/search/types.d.ts +31 -2
  175. package/dist/types/types/graph.d.ts +8 -1
  176. package/dist/types/types/run.d.ts +65 -0
  177. package/dist/types/types/stream.d.ts +1 -26
  178. package/dist/types/utils/tokens.d.ts +7 -0
  179. package/dist/types/utils/toolContent.d.ts +107 -0
  180. package/package.json +1 -1
  181. package/src/__tests__/stream.eagerEventExecution.test.ts +74 -0
  182. package/src/agents/AgentContext.ts +1 -0
  183. package/src/{splitStream.test.ts → aggregator.test.ts} +59 -666
  184. package/src/common/constants.ts +21 -0
  185. package/src/events.ts +15 -1
  186. package/src/graphs/Graph.ts +1261 -198
  187. package/src/graphs/MultiAgentGraph.ts +6 -1
  188. package/src/graphs/__tests__/Graph.contextOverflow.test.ts +1139 -4
  189. package/src/graphs/__tests__/Graph.preemptSignal.test.ts +126 -0
  190. package/src/hooks/HookRegistry.ts +40 -0
  191. package/src/hooks/__tests__/preemptBoundary.test.ts +152 -0
  192. package/src/hooks/index.ts +16 -2
  193. package/src/hooks/types.ts +47 -3
  194. package/src/index.ts +1 -1
  195. package/src/langfuse.ts +26 -1
  196. package/src/llm/anthropic/utils/message_inputs.ts +158 -12
  197. package/src/llm/anthropic/utils/tool-id-normalization.test.ts +109 -0
  198. package/src/llm/bedrock/utils/message_inputs.test.ts +131 -1
  199. package/src/llm/bedrock/utils/message_inputs.ts +100 -24
  200. package/src/llm/bedrock/utils/toolResultCachePoint.test.ts +15 -0
  201. package/src/llm/google/utils/common.test.ts +75 -9
  202. package/src/llm/google/utils/common.ts +34 -3
  203. package/src/llm/invoke.alternation.test.ts +87 -0
  204. package/src/llm/invoke.handoffCue.test.ts +112 -0
  205. package/src/llm/invoke.test.ts +488 -0
  206. package/src/llm/invoke.ts +611 -8
  207. package/src/llm/openai/index.ts +106 -6
  208. package/src/llm/openai/utils/index.ts +109 -53
  209. package/src/llm/openai/utils/messages.test.ts +330 -1
  210. package/src/llm/openrouter/index.ts +12 -2
  211. package/src/llm/openrouter/reasoning.test.ts +314 -0
  212. package/src/llm/preempt.test.ts +323 -0
  213. package/src/llm/preempt.ts +178 -0
  214. package/src/messages/__tests__/observationMasking.test.ts +93 -2
  215. package/src/messages/alternation.test.ts +212 -0
  216. package/src/messages/alternation.ts +112 -0
  217. package/src/messages/cache.tail.test.ts +193 -0
  218. package/src/messages/cache.test.ts +113 -0
  219. package/src/messages/cache.ts +92 -60
  220. package/src/messages/contextPruning.test.ts +184 -0
  221. package/src/messages/contextPruning.ts +49 -42
  222. package/src/messages/core.ts +653 -40
  223. package/src/messages/ensureThinkingBlock.test.ts +49 -1
  224. package/src/messages/foldToollessToolBlocks.test.ts +163 -5
  225. package/src/messages/format.ts +454 -91
  226. package/src/messages/formatAgentMessages.steer.test.ts +267 -0
  227. package/src/messages/formatAgentMessages.test.ts +604 -14
  228. package/src/messages/formatAgentMessages.tools.test.ts +103 -0
  229. package/src/messages/handoffCue.test.ts +96 -0
  230. package/src/messages/handoffCue.ts +78 -0
  231. package/src/messages/index.ts +3 -0
  232. package/src/messages/injected.test.ts +90 -0
  233. package/src/messages/injected.ts +74 -0
  234. package/src/messages/prune.ts +996 -183
  235. package/src/run.ts +91 -6
  236. package/src/scripts/preempt-probe.ts +330 -0
  237. package/src/scripts/preempt-scenarios.ts +388 -0
  238. package/src/session/handlers.ts +32 -12
  239. package/src/specs/handoffCue.test.ts +165 -0
  240. package/src/specs/langfuse-callbacks.test.ts +352 -2
  241. package/src/specs/preemptSeal.test.ts +309 -0
  242. package/src/specs/prune.test.ts +1083 -6
  243. package/src/specs/summarization-unit.test.ts +105 -0
  244. package/src/specs/tokens.test.ts +609 -32
  245. package/src/stream.dispatch.test.ts +63 -0
  246. package/src/stream.ts +59 -23
  247. package/src/summarization/__tests__/node.test.ts +77 -0
  248. package/src/summarization/node.ts +46 -18
  249. package/src/tools/ToolNode.ts +150 -99
  250. package/src/tools/__tests__/ToolNode.onResultCompletion.test.ts +148 -1
  251. package/src/tools/__tests__/ToolNode.outputReferences.test.ts +112 -3
  252. package/src/tools/__tests__/annotateMessagesForLLM.test.ts +32 -0
  253. package/src/tools/__tests__/directToolHooks.test.ts +255 -7
  254. package/src/tools/search/keenable-scraper.test.ts +153 -0
  255. package/src/tools/search/keenable-scraper.ts +137 -0
  256. package/src/tools/search/tool.ts +13 -2
  257. package/src/tools/search/types.ts +50 -3
  258. package/src/tools/toolOutputReferences.ts +6 -0
  259. package/src/types/graph.ts +12 -1
  260. package/src/types/run.ts +67 -0
  261. package/src/types/stream.ts +1 -42
  262. package/src/utils/llm.test.ts +18 -0
  263. package/src/utils/llm.ts +4 -1
  264. package/src/utils/tokens.ts +586 -31
  265. package/src/utils/toolContent.test.ts +1432 -0
  266. package/src/utils/toolContent.ts +2707 -0
  267. package/dist/cjs/splitStream.cjs +0 -151
  268. package/dist/cjs/splitStream.cjs.map +0 -1
  269. package/dist/esm/splitStream.mjs +0 -150
  270. package/dist/esm/splitStream.mjs.map +0 -1
  271. package/dist/types/mockStream.d.ts +0 -32
  272. package/dist/types/splitStream.d.ts +0 -37
  273. package/src/mockStream.ts +0 -99
  274. package/src/splitStream.ts +0 -234
package/dist/cjs/main.cjs CHANGED
@@ -3,19 +3,23 @@ const require_misc = require("./utils/misc.cjs");
3
3
  const require_constants = require("./common/constants.cjs");
4
4
  const require_enum = require("./common/enum.cjs");
5
5
  require("./common/index.cjs");
6
+ const require_truncation = require("./utils/truncation.cjs");
6
7
  const require_tokens = require("./utils/tokens.cjs");
8
+ const require_preempt = require("./llm/preempt.cjs");
9
+ const require_cache = require("./messages/cache.cjs");
7
10
  const require_core = require("./messages/core.cjs");
8
11
  const require_ids = require("./messages/ids.cjs");
9
- const require_truncation = require("./utils/truncation.cjs");
10
12
  const require_contextPruningSettings = require("./messages/contextPruningSettings.cjs");
11
13
  const require_contextPruning = require("./messages/contextPruning.cjs");
12
14
  const require_prune = require("./messages/prune.cjs");
13
15
  const require_budget = require("./messages/budget.cjs");
14
16
  const require_format = require("./messages/format.cjs");
15
- const require_cache = require("./messages/cache.cjs");
16
17
  const require_anthropicToolCache = require("./messages/anthropicToolCache.cjs");
17
18
  const require_content = require("./messages/content.cjs");
18
19
  const require_tools = require("./messages/tools.cjs");
20
+ const require_injected = require("./messages/injected.cjs");
21
+ const require_alternation = require("./messages/alternation.cjs");
22
+ const require_handoffCue = require("./messages/handoffCue.cjs");
19
23
  const require_reducer = require("./messages/reducer.cjs");
20
24
  const require_recency = require("./messages/recency.cjs");
21
25
  require("./messages/index.cjs");
@@ -75,7 +79,6 @@ const require_fake = require("./llm/fake.cjs");
75
79
  const require_Graph = require("./graphs/Graph.cjs");
76
80
  const require_MultiAgentGraph = require("./graphs/MultiAgentGraph.cjs");
77
81
  const require_run$1 = require("./run.cjs");
78
- const require_splitStream = require("./splitStream.cjs");
79
82
  require("./graphs/index.cjs");
80
83
  const require_projection = require("./agents/projection.cjs");
81
84
  const require_Calculator = require("./tools/Calculator.cjs");
@@ -182,8 +185,10 @@ exports.DATE_RANGE = require_schema$2.DATE_RANGE;
182
185
  exports.DEFAULT_CONTEXT_PRUNING_SETTINGS = require_contextPruningSettings.DEFAULT_CONTEXT_PRUNING_SETTINGS;
183
186
  exports.DEFAULT_COUNTRY_DESCRIPTION = require_schema$2.DEFAULT_COUNTRY_DESCRIPTION;
184
187
  exports.DEFAULT_HOOK_TIMEOUT_MS = require_executeHooks.DEFAULT_HOOK_TIMEOUT_MS;
188
+ exports.DEFAULT_MAX_SEALS = require_constants.DEFAULT_MAX_SEALS;
185
189
  exports.DEFAULT_PROMPT_CACHE_TTL = require_cache.DEFAULT_PROMPT_CACHE_TTL;
186
190
  exports.DEFAULT_QUERY_DESCRIPTION = require_schema$2.DEFAULT_QUERY_DESCRIPTION;
191
+ exports.DEFAULT_RECURSION_LIMIT = require_constants.DEFAULT_RECURSION_LIMIT;
187
192
  exports.DEFAULT_RESERVE_RATIO = require_prune.DEFAULT_RESERVE_RATIO;
188
193
  exports.DEFAULT_RETAIN_RECENT_TURNS = require_recency.DEFAULT_RETAIN_RECENT_TURNS;
189
194
  exports.DEFAULT_TOOL_TOKEN_MULTIPLIER = require_constants.DEFAULT_TOOL_TOKEN_MULTIPLIER;
@@ -204,6 +209,7 @@ exports.HARD_MAX_TOOL_RESULT_CHARS = require_truncation.HARD_MAX_TOOL_RESULT_CHA
204
209
  exports.HARD_MAX_TOTAL_TOOL_OUTPUT_SIZE = require_truncation.HARD_MAX_TOTAL_TOOL_OUTPUT_SIZE;
205
210
  exports.HOOK_EVENTS = require_types.HOOK_EVENTS;
206
211
  exports.HOOK_INJECTED_MESSAGES_CAPABLE = require_index$5.HOOK_INJECTED_MESSAGES_CAPABLE;
212
+ exports.HOOK_PREEMPT_BOUNDARY_CAPABLE = require_index$5.HOOK_PREEMPT_BOUNDARY_CAPABLE;
207
213
  exports.HandlerRegistry = require_events.HandlerRegistry;
208
214
  exports.HookRegistry = require_HookRegistry.HookRegistry;
209
215
  Object.defineProperty(exports, "HumanMessage", {
@@ -249,6 +255,8 @@ Object.defineProperty(exports, "MemorySaver", {
249
255
  exports.ModelEndHandler = require_events.ModelEndHandler;
250
256
  exports.MultiAgentGraph = require_MultiAgentGraph.MultiAgentGraph;
251
257
  exports.ORIGINAL_CONTENT_MAX_CHARS = require_prune.ORIGINAL_CONTENT_MAX_CHARS;
258
+ exports.PREDECESSOR_HANDOFF_CUE = require_handoffCue.PREDECESSOR_HANDOFF_CUE;
259
+ exports.PREEMPT_BOUNDARY_HOOK_TIMEOUT_MS = require_constants.PREEMPT_BOUNDARY_HOOK_TIMEOUT_MS;
252
260
  exports.ProgrammaticToolCallingDefinition = require_ProgrammaticToolCalling.ProgrammaticToolCallingDefinition;
253
261
  exports.ProgrammaticToolCallingDescription = require_ProgrammaticToolCalling.ProgrammaticToolCallingDescription;
254
262
  exports.ProgrammaticToolCallingName = require_ProgrammaticToolCalling.ProgrammaticToolCallingName;
@@ -261,6 +269,7 @@ Object.defineProperty(exports, "PromptTemplate", {
261
269
  });
262
270
  exports.Providers = require_enum.Providers;
263
271
  exports.REMOVE_ALL_MESSAGES = require_reducer.REMOVE_ALL_MESSAGES;
272
+ exports.REPLY_PRIMER_TOKENS = require_prune.REPLY_PRIMER_TOKENS;
264
273
  exports.ReadFileToolDefinition = require_ReadFile.ReadFileToolDefinition;
265
274
  exports.ReadFileToolDescription = require_ReadFile.ReadFileToolDescription;
266
275
  exports.ReadFileToolName = require_ReadFile.ReadFileToolName;
@@ -285,7 +294,7 @@ Object.defineProperty(exports, "RunnableSequence", {
285
294
  return _langchain_core_runnables.RunnableSequence;
286
295
  }
287
296
  });
288
- exports.SEPARATORS = require_splitStream.SEPARATORS;
297
+ exports.SDK_STREAM_DISPATCH = require_stream.SDK_STREAM_DISPATCH;
289
298
  exports.STATEFUL_BASH_NOTE = require_BashExecutor.STATEFUL_BASH_NOTE;
290
299
  exports.STATEFUL_ENV_NOTE = require_CodeExecutor.STATEFUL_ENV_NOTE;
291
300
  exports.SessionManager = require_JsonlSessionStore.SessionManager;
@@ -293,7 +302,6 @@ exports.SkillToolDefinition = require_SkillTool.SkillToolDefinition;
293
302
  exports.SkillToolDescription = require_SkillTool.SkillToolDescription;
294
303
  exports.SkillToolName = require_SkillTool.SkillToolName;
295
304
  exports.SkillToolSchema = require_SkillTool.SkillToolSchema;
296
- exports.SplitStreamHandler = require_splitStream.SplitStreamHandler;
297
305
  exports.StandardGraph = require_Graph.StandardGraph;
298
306
  exports.StatefulBashExecutionToolDescription = require_BashExecutor.StatefulBashExecutionToolDescription;
299
307
  exports.StatefulCodeExecutionToolDescription = require_CodeExecutor.StatefulCodeExecutionToolDescription;
@@ -355,6 +363,7 @@ exports.addCacheControlToStablePrefixMessages = require_cache.addCacheControlToS
355
363
  exports.addTailCacheControl = require_cache.addTailCacheControl;
356
364
  exports.appendCodeSessionFileSummary = require_CodeSessionFileSummary.appendCodeSessionFileSummary;
357
365
  exports.appendFailedExecutionFileReminder = require_CodeExecutor.appendFailedExecutionFileReminder;
366
+ exports.appendPredecessorHandoffCue = require_handoffCue.appendPredecessorHandoffCue;
358
367
  exports.appendTmpScratchReminder = require_CodeExecutor.appendTmpScratchReminder;
359
368
  exports.applyContextPruning = require_contextPruning.applyContextPruning;
360
369
  exports.applyEdit = require_editStrategies.applyEdit;
@@ -374,16 +383,20 @@ exports.buildCodeExecutionToolDescription = require_CodeExecutor.buildCodeExecut
374
383
  exports.buildCodeExecutionToolSchema = require_CodeExecutor.buildCodeExecutionToolSchema;
375
384
  exports.buildSandboxRuntimeConfig = require_LocalExecutionEngine.buildSandboxRuntimeConfig;
376
385
  exports.buildSubagentToolParams = require_SubagentTool.buildSubagentToolParams;
386
+ exports.calculateMaxToolCallInputChars = require_prune.calculateMaxToolCallInputChars;
377
387
  exports.calculateMaxToolResultChars = require_truncation.calculateMaxToolResultChars;
378
388
  exports.calculateMaxTotalToolOutputSize = require_truncation.calculateMaxTotalToolOutputSize;
379
389
  exports.calculateTotalTokens = require_prune.calculateTotalTokens;
390
+ exports.canSealPreempt = require_preempt.canSealPreempt;
380
391
  exports.checkValidNumber = require_prune.checkValidNumber;
381
392
  exports.clampCalibrationRatio = require_prune.clampCalibrationRatio;
382
393
  exports.classifyAttachment = require_attachments.classifyAttachment;
383
394
  exports.clientExecTimeoutMs = require_CloudflareSandboxExecutionEngine.clientExecTimeoutMs;
384
395
  exports.clientFsTimeoutMs = require_CloudflareSandboxExecutionEngine.clientFsTimeoutMs;
385
396
  exports.cloneMessage = require_cache.cloneMessage;
397
+ exports.coalesceAdjacentUserTurns = require_alternation.coalesceAdjacentUserTurns;
386
398
  exports.composeEventHandlers = require_events.composeEventHandlers;
399
+ exports.convertInjectedMessages = require_injected.convertInjectedMessages;
387
400
  exports.convertMessagesToContent = require_core.convertMessagesToContent;
388
401
  exports.countNestedGroups = require_ToolSearch.countNestedGroups;
389
402
  exports.countrySchema = require_schema$2.countrySchema;
@@ -440,6 +453,7 @@ exports.dateSchema = require_schema$2.dateSchema;
440
453
  exports.decodeFile = require_textEncoding.decodeFile;
441
454
  exports.defaultOmitOptions = require_run$1.defaultOmitOptions;
442
455
  exports.deserializeMessage = require_messageSerialization.deserializeMessage;
456
+ exports.dispatchesChatModelStream = require_stream.dispatchesChatModelStream;
443
457
  exports.emptyOutputMessage = require_CodeExecutor.emptyOutputMessage;
444
458
  exports.encodeFile = require_textEncoding.encodeFile;
445
459
  exports.encodingForModel = require_tokens.encodingForModel;
@@ -518,6 +532,7 @@ exports.handleToolCalls = require_handlers.handleToolCalls;
518
532
  exports.hasNestedQuantifier = require_matchers.hasNestedQuantifier;
519
533
  exports.hasNestedQuantifiers = require_ToolSearch.hasNestedQuantifiers;
520
534
  exports.hasToolSearchInCurrentTurn = require_tools.hasToolSearchInCurrentTurn;
535
+ exports.hasUnsafeStructuredSerialization = require_tokens.hasUnsafeStructuredSerialization;
521
536
  exports.imageAttachmentContent = require_attachments.imageAttachmentContent;
522
537
  exports.imagesSchema = require_schema$2.imagesSchema;
523
538
  exports.initializeModel = require_init.initializeModel;
@@ -555,6 +570,7 @@ exports.isLegacyConvertible = require_content.isLegacyConvertible;
555
570
  exports.isLikelyContextOverflowError = require_errors.isLikelyContextOverflowError;
556
571
  exports.isOpenAILike = require_llm.isOpenAILike;
557
572
  exports.isPresent = require_misc.isPresent;
573
+ exports.isSyntheticProviderContextMessage = require_format.isSyntheticProviderContextMessage;
558
574
  exports.isThinkingEnabled = require_request.isThinkingEnabled;
559
575
  Object.defineProperty(exports, "isToolMessage", {
560
576
  enumerable: true,
@@ -584,7 +600,20 @@ exports.performLocalSearch = require_ToolSearch.performLocalSearch;
584
600
  exports.preFlightTruncateToolCallInputs = require_prune.preFlightTruncateToolCallInputs;
585
601
  exports.preFlightTruncateToolResults = require_prune.preFlightTruncateToolResults;
586
602
  exports.projectAgentContextUsage = require_projection.projectAgentContextUsage;
603
+ exports.projectAnthropicArtifactContent = require_core.projectAnthropicArtifactContent;
604
+ exports.projectArtifactPayload = require_core.projectArtifactPayload;
605
+ exports.projectCacheControlledToolOutputsToText = require_core.projectCacheControlledToolOutputsToText;
606
+ exports.projectComputerCallOutputsToText = require_core.projectComputerCallOutputsToText;
607
+ exports.projectOpenAIChatToolMessageContent = require_core.projectOpenAIChatToolMessageContent;
608
+ exports.projectOpenAIResponsesToolMessageContent = require_core.projectOpenAIResponsesToolMessageContent;
609
+ exports.projectOpenAIToolMessageContent = require_core.projectOpenAIToolMessageContent;
610
+ exports.projectOpenRouterToolMessageContent = require_core.projectOpenRouterToolMessageContent;
611
+ exports.projectSingleTextToolOutputsToText = require_core.projectSingleTextToolOutputsToText;
612
+ exports.projectStructuredToolOutputsToText = require_core.projectStructuredToolOutputsToText;
613
+ exports.projectToolCallInputs = require_prune.projectToolCallInputs;
614
+ exports.projectToolStreamContentForProvider = require_core.projectToolStreamContentForProvider;
587
615
  exports.querySchema = require_schema$2.querySchema;
616
+ exports.removePredecessorHandoffCue = require_handoffCue.removePredecessorHandoffCue;
588
617
  exports.repairOrphanedToolMessages = require_prune.repairOrphanedToolMessages;
589
618
  exports.resetIfNotEmpty = require_graph.resetIfNotEmpty;
590
619
  exports.resolveBedrockPromptCacheTtl = require_cache.resolveBedrockPromptCacheTtl;
@@ -604,12 +633,14 @@ exports.runPostEditSyntaxCheck = require_syntaxCheck.runPostEditSyntaxCheck;
604
633
  exports.sanitizeOrphanToolBlocks = require_prune.sanitizeOrphanToolBlocks;
605
634
  exports.sanitizeRegex = require_ToolSearch.sanitizeRegex;
606
635
  exports.serializeMessage = require_messageSerialization.serializeMessage;
636
+ exports.serializeToolCallInput = require_prune.serializeToolCallInput;
607
637
  exports.shellQuote = require_LocalExecutionEngine.shellQuote;
608
638
  exports.shiftIndexTokenCountMap = require_format.shiftIndexTokenCountMap;
609
639
  exports.shouldTriggerSummarization = require_index$9.shouldTriggerSummarization;
610
640
  exports.sleep = require_run.sleep;
611
641
  exports.spawnLocalProcess = require_LocalExecutionEngine.spawnLocalProcess;
612
642
  exports.splitAtRecencyBoundary = require_recency.splitAtRecencyBoundary;
643
+ exports.strictAlternationProviders = require_alternation.strictAlternationProviders;
613
644
  exports.stripAnthropicCacheControl = require_cache.stripAnthropicCacheControl;
614
645
  exports.stripBedrockCacheControl = require_cache.stripBedrockCacheControl;
615
646
  exports.stripCodeSessionFileSummary = require_CodeSessionFileSummary.stripCodeSessionFileSummary;
@@ -0,0 +1,92 @@
1
+ require("../common/enum.cjs");
2
+ require("../common/index.cjs");
3
+ let _langchain_core_messages = require("@langchain/core/messages");
4
+ //#region src/messages/alternation.ts
5
+ /**
6
+ * Providers whose APIs specify strict user/assistant alternation. Mistral
7
+ * rejects consecutive user turns outright. Bedrock's Converse API documents
8
+ * the alternation requirement across many model families; enforcement varies
9
+ * by family — Claude on Converse currently tolerates adjacent user turns
10
+ * (verified live, 2026-07-28) — so the payload is normalized for all of them
11
+ * rather than betting on per-family leniency. Anthropic's own Messages API,
12
+ * OpenAI and Gemini all accept consecutive user turns, so they are
13
+ * deliberately absent.
14
+ */
15
+ const strictAlternationProviders = new Set([
16
+ "bedrock",
17
+ "mistral",
18
+ "mistralai"
19
+ ]);
20
+ const TOOL_RESULT_TYPES = new Set(["tool_result", "toolResult"]);
21
+ /**
22
+ * True when every block is a tool result. Both vendored converters already
23
+ * merge adjacent runs of these, and folding one into a text turn would break
24
+ * the tool pairing they depend on — so they are left alone here.
25
+ */
26
+ function isToolResultMessage(message) {
27
+ const { content } = message;
28
+ if (typeof content === "string" || content.length === 0) return false;
29
+ return content.every((block) => typeof block.type === "string" && TOOL_RESULT_TYPES.has(block.type));
30
+ }
31
+ function toBlocks(content) {
32
+ if (typeof content === "string") return content === "" ? [] : [{
33
+ type: "text",
34
+ text: content
35
+ }];
36
+ return content;
37
+ }
38
+ function joinContent(left, right) {
39
+ if (typeof left === "string" && typeof right === "string") return left === "" ? right : `${left}\n\n${right}`;
40
+ return [...toBlocks(left), ...toBlocks(right)];
41
+ }
42
+ /**
43
+ * Merges runs of consecutive human turns into one, for providers that reject
44
+ * them. Purely a wire-shaping pass: it returns a new array of new messages,
45
+ * so graph state and the host's persisted messages keep the per-message
46
+ * identity that steer rendering and the trailing-steer anchor rely on.
47
+ *
48
+ * Tool-result turns are excluded — the converters merge those themselves, and
49
+ * combining one with a text turn would orphan the pairing.
50
+ */
51
+ function coalesceAdjacentUserTurns(messages) {
52
+ const result = [];
53
+ let mergedAny = false;
54
+ for (const message of messages) {
55
+ const previous = result[result.length - 1];
56
+ if (!(result.length > 0 && previous.getType() === "human" && message.getType() === "human" && !isToolResultMessage(previous) && !isToolResultMessage(message))) {
57
+ result.push(message);
58
+ continue;
59
+ }
60
+ mergedAny = true;
61
+ result[result.length - 1] = new _langchain_core_messages.HumanMessage({
62
+ content: joinContent(previous.content, message.content),
63
+ /**
64
+ * The LATER turn's kwargs, deliberately. The one provider-path consumer
65
+ * of these flags is the prompt-cache tail anchor, and it reasons
66
+ * positionally: `isSyntheticMetaMessage` decides whether a breakpoint
67
+ * may be inserted after the message's LAST text block. Merging keeps
68
+ * the last block's provenance only if the last part's kwargs survive —
69
+ * a skill body absorbed into a real user turn must stay anchorable
70
+ * (the real turn ends it), while a real steer absorbed into a trailing
71
+ * skill body must not pin the cache to the volatile body. The first
72
+ * turn's id is kept so origin tracking can re-attach by key.
73
+ */
74
+ additional_kwargs: message.additional_kwargs,
75
+ ...previous.id != null && { id: previous.id }
76
+ });
77
+ }
78
+ /**
79
+ * Identity on the no-merge path. The pass runs twice for a primary
80
+ * Bedrock/Mistral call — once in `createCallModel` (must precede the cache
81
+ * breakpoint) and once in the `attemptInvoke` funnel (must cover fallback
82
+ * and summarization sends) — so the already-normalized second pass returns
83
+ * the SAME array rather than reallocating a context-sized copy, and
84
+ * callers can cheaply detect "nothing changed" by identity.
85
+ */
86
+ return mergedAny ? result : messages;
87
+ }
88
+ //#endregion
89
+ exports.coalesceAdjacentUserTurns = coalesceAdjacentUserTurns;
90
+ exports.strictAlternationProviders = strictAlternationProviders;
91
+
92
+ //# sourceMappingURL=alternation.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alternation.cjs","names":["HumanMessage"],"sources":["../../../src/messages/alternation.ts"],"sourcesContent":["// src/messages/alternation.ts\nimport { HumanMessage } from '@langchain/core/messages';\nimport type { BaseMessage, MessageContent } from '@langchain/core/messages';\nimport { Providers } from '@/common';\n\n/**\n * Providers whose APIs specify strict user/assistant alternation. Mistral\n * rejects consecutive user turns outright. Bedrock's Converse API documents\n * the alternation requirement across many model families; enforcement varies\n * by family — Claude on Converse currently tolerates adjacent user turns\n * (verified live, 2026-07-28) — so the payload is normalized for all of them\n * rather than betting on per-family leniency. Anthropic's own Messages API,\n * OpenAI and Gemini all accept consecutive user turns, so they are\n * deliberately absent.\n */\nexport const strictAlternationProviders: ReadonlySet<Providers> = new Set([\n Providers.BEDROCK,\n Providers.MISTRAL,\n Providers.MISTRALAI,\n]);\n\nconst TOOL_RESULT_TYPES = new Set(['tool_result', 'toolResult']);\n\n/**\n * True when every block is a tool result. Both vendored converters already\n * merge adjacent runs of these, and folding one into a text turn would break\n * the tool pairing they depend on — so they are left alone here.\n */\nfunction isToolResultMessage(message: BaseMessage): boolean {\n const { content } = message;\n if (typeof content === 'string' || content.length === 0) {\n return false;\n }\n return content.every(\n (block) =>\n typeof block.type === 'string' && TOOL_RESULT_TYPES.has(block.type)\n );\n}\n\nfunction toBlocks(content: MessageContent): Exclude<MessageContent, string> {\n if (typeof content === 'string') {\n return content === '' ? [] : [{ type: 'text', text: content }];\n }\n return content;\n}\n\nfunction joinContent(\n left: MessageContent,\n right: MessageContent\n): MessageContent {\n if (typeof left === 'string' && typeof right === 'string') {\n return left === '' ? right : `${left}\\n\\n${right}`;\n }\n return [...toBlocks(left), ...toBlocks(right)];\n}\n\n/**\n * Merges runs of consecutive human turns into one, for providers that reject\n * them. Purely a wire-shaping pass: it returns a new array of new messages,\n * so graph state and the host's persisted messages keep the per-message\n * identity that steer rendering and the trailing-steer anchor rely on.\n *\n * Tool-result turns are excluded — the converters merge those themselves, and\n * combining one with a text turn would orphan the pairing.\n */\nexport function coalesceAdjacentUserTurns(\n messages: BaseMessage[]\n): BaseMessage[] {\n const result: BaseMessage[] = [];\n let mergedAny = false;\n for (const message of messages) {\n const previous = result[result.length - 1];\n const mergeable =\n result.length > 0 &&\n previous.getType() === 'human' &&\n message.getType() === 'human' &&\n !isToolResultMessage(previous) &&\n !isToolResultMessage(message);\n\n if (!mergeable) {\n result.push(message);\n continue;\n }\n mergedAny = true;\n\n result[result.length - 1] = new HumanMessage({\n content: joinContent(previous.content, message.content),\n /**\n * The LATER turn's kwargs, deliberately. The one provider-path consumer\n * of these flags is the prompt-cache tail anchor, and it reasons\n * positionally: `isSyntheticMetaMessage` decides whether a breakpoint\n * may be inserted after the message's LAST text block. Merging keeps\n * the last block's provenance only if the last part's kwargs survive —\n * a skill body absorbed into a real user turn must stay anchorable\n * (the real turn ends it), while a real steer absorbed into a trailing\n * skill body must not pin the cache to the volatile body. The first\n * turn's id is kept so origin tracking can re-attach by key.\n */\n additional_kwargs: message.additional_kwargs,\n ...(previous.id != null && { id: previous.id }),\n });\n }\n /**\n * Identity on the no-merge path. The pass runs twice for a primary\n * Bedrock/Mistral call — once in `createCallModel` (must precede the cache\n * breakpoint) and once in the `attemptInvoke` funnel (must cover fallback\n * and summarization sends) — so the already-normalized second pass returns\n * the SAME array rather than reallocating a context-sized copy, and\n * callers can cheaply detect \"nothing changed\" by identity.\n */\n return mergedAny ? result : messages;\n}\n"],"mappings":";;;;;;;;;;;;;;AAeA,MAAa,6BAAqD,IAAI,IAAI;;;;AAI1E,CAAC;AAED,MAAM,oBAAoB,IAAI,IAAI,CAAC,eAAe,YAAY,CAAC;;;;;;AAO/D,SAAS,oBAAoB,SAA+B;CAC1D,MAAM,EAAE,YAAY;CACpB,IAAI,OAAO,YAAY,YAAY,QAAQ,WAAW,GACpD,OAAO;CAET,OAAO,QAAQ,OACZ,UACC,OAAO,MAAM,SAAS,YAAY,kBAAkB,IAAI,MAAM,IAAI,CACtE;AACF;AAEA,SAAS,SAAS,SAA0D;CAC1E,IAAI,OAAO,YAAY,UACrB,OAAO,YAAY,KAAK,CAAC,IAAI,CAAC;EAAE,MAAM;EAAQ,MAAM;CAAQ,CAAC;CAE/D,OAAO;AACT;AAEA,SAAS,YACP,MACA,OACgB;CAChB,IAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAC/C,OAAO,SAAS,KAAK,QAAQ,GAAG,KAAK,MAAM;CAE7C,OAAO,CAAC,GAAG,SAAS,IAAI,GAAG,GAAG,SAAS,KAAK,CAAC;AAC/C;;;;;;;;;;AAWA,SAAgB,0BACd,UACe;CACf,MAAM,SAAwB,CAAC;CAC/B,IAAI,YAAY;CAChB,KAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,WAAW,OAAO,OAAO,SAAS;EAQxC,IAAI,EANF,OAAO,SAAS,KAChB,SAAS,QAAQ,MAAM,WACvB,QAAQ,QAAQ,MAAM,WACtB,CAAC,oBAAoB,QAAQ,KAC7B,CAAC,oBAAoB,OAAO,IAEd;GACd,OAAO,KAAK,OAAO;GACnB;EACF;EACA,YAAY;EAEZ,OAAO,OAAO,SAAS,KAAK,IAAIA,yBAAAA,aAAa;GAC3C,SAAS,YAAY,SAAS,SAAS,QAAQ,OAAO;;;;;;;;;;;;GAYtD,mBAAmB,QAAQ;GAC3B,GAAI,SAAS,MAAM,QAAQ,EAAE,IAAI,SAAS,GAAG;EAC/C,CAAC;CACH;;;;;;;;;CASA,OAAO,YAAY,SAAS;AAC9B"}
@@ -1,7 +1,8 @@
1
1
  require("../common/enum.cjs");
2
+ const require_toolContent = require("../utils/toolContent.cjs");
2
3
  const require_langchain = require("./langchain.cjs");
3
- const require_format = require("./format.cjs");
4
4
  let _langchain_core_messages = require("@langchain/core/messages");
5
+ let node_util_types = require("node:util/types");
5
6
  //#region src/messages/cache.ts
6
7
  /**
7
8
  * Default TTL applied wherever a prompt-cache breakpoint is added. The 1-hour
@@ -83,9 +84,18 @@ function resolveBedrockPromptCacheTtl(ttl, model) {
83
84
  /**
84
85
  * Deep clones a message's content to prevent mutation of the original.
85
86
  */
86
- function deepCloneContent(content) {
87
+ function deepCloneContent(content, omittedProperty) {
87
88
  if (typeof content === "string") return content;
88
- if (Array.isArray(content)) return content.map((block) => ({ ...block }));
89
+ if (Array.isArray(content)) return content.map((block) => {
90
+ if (typeof block !== "object" || block == null || (0, node_util_types.isProxy)(block)) return block;
91
+ try {
92
+ const descriptors = Object.getOwnPropertyDescriptors(block);
93
+ if (omittedProperty != null) delete descriptors[omittedProperty];
94
+ return Object.create(Object.getPrototypeOf(block), descriptors);
95
+ } catch {
96
+ return block;
97
+ }
98
+ });
89
99
  return content;
90
100
  }
91
101
  /**
@@ -96,26 +106,23 @@ function deepCloneContent(content) {
96
106
  */
97
107
  function cloneMessage(message, content) {
98
108
  if (message instanceof _langchain_core_messages.BaseMessage) {
99
- const baseParams = {
100
- content: require_langchain.toLangChainContent(content),
101
- additional_kwargs: { ...message.additional_kwargs },
102
- response_metadata: { ...message.response_metadata },
103
- id: message.id,
104
- name: message.name
109
+ const descriptors = Object.getOwnPropertyDescriptors(message);
110
+ const contentDescriptor = descriptors.content;
111
+ descriptors.content = {
112
+ configurable: contentDescriptor?.configurable ?? true,
113
+ enumerable: contentDescriptor?.enumerable ?? true,
114
+ value: require_langchain.toLangChainContent(content),
115
+ writable: contentDescriptor?.writable ?? true
105
116
  };
106
- switch (message.getType()) {
107
- case "ai": return require_format.withMessageRole(new _langchain_core_messages.AIMessage({
108
- ...baseParams,
109
- tool_calls: message.tool_calls
110
- }), "assistant");
111
- case "human": return require_format.withMessageRole(new _langchain_core_messages.HumanMessage(baseParams), "user");
112
- case "system": return require_format.withMessageRole(new _langchain_core_messages.SystemMessage(baseParams), "system");
113
- case "tool": return require_format.withMessageRole(new _langchain_core_messages.ToolMessage({
114
- ...baseParams,
115
- tool_call_id: message.tool_call_id
116
- }), "tool");
117
- default: break;
118
- }
117
+ const lcKwargs = descriptors.lc_kwargs;
118
+ if (lcKwargs != null && "value" in lcKwargs && typeof lcKwargs.value === "object" && lcKwargs.value != null) descriptors.lc_kwargs = {
119
+ ...lcKwargs,
120
+ value: {
121
+ ...lcKwargs.value,
122
+ content: require_langchain.toLangChainContent(content)
123
+ }
124
+ };
125
+ return Object.create(Object.getPrototypeOf(message), descriptors);
119
126
  }
120
127
  const { lc_kwargs: _lc_kwargs, lc_serializable: _lc_serializable, lc_namespace: _lc_namespace, ...rest } = message;
121
128
  const cloned = {
@@ -149,7 +156,8 @@ function sanitizeBedrockSystemMessage(message, ttl) {
149
156
  let modified = false;
150
157
  for (const block of content) {
151
158
  if (isCachePoint(block)) {
152
- const existing = block.cachePoint;
159
+ const descriptor = Object.getOwnPropertyDescriptor(block, "cachePoint");
160
+ const existing = descriptor != null && "value" in descriptor ? descriptor.value : void 0;
153
161
  const desired = buildBedrockCachePoint(ttl);
154
162
  if (existing?.ttl !== desired.ttl) {
155
163
  modified = true;
@@ -230,7 +238,14 @@ function addCacheControl(messages, ttl) {
230
238
  * Checks if a content block is a cache point
231
239
  */
232
240
  function isCachePoint(block) {
233
- return "cachePoint" in block && !("type" in block);
241
+ if (typeof block !== "object" || block == null || (0, node_util_types.isProxy)(block)) return false;
242
+ try {
243
+ const cachePoint = Object.getOwnPropertyDescriptor(block, "cachePoint");
244
+ const type = Object.getOwnPropertyDescriptor(block, "type");
245
+ return cachePoint?.enumerable === true && type == null;
246
+ } catch {
247
+ return false;
248
+ }
234
249
  }
235
250
  /**
236
251
  * Block types that must never anchor the tail cache breakpoint, because the
@@ -297,7 +312,8 @@ function addTailCacheControl(messages, ttl) {
297
312
  const originalMessage = updatedMessages[i];
298
313
  const content = originalMessage.content;
299
314
  const hasArrayContent = Array.isArray(content);
300
- const canPlaceMarker = !markerPlaced && !isSyntheticMetaMessage(originalMessage);
315
+ const isComputerOutput = originalMessage instanceof _langchain_core_messages.BaseMessage && require_toolContent.hasComputerCallOutputMarker(originalMessage);
316
+ const canPlaceMarker = !markerPlaced && !isSyntheticMetaMessage(originalMessage) && !isComputerOutput;
301
317
  if (!canPlaceMarker && !hasArrayContent) continue;
302
318
  let workingContent;
303
319
  let modified = false;
@@ -426,7 +442,15 @@ function addCacheControlToStablePrefixMessages(messages, maxCachePoints, ttl) {
426
442
  * Checks if a message's content has Anthropic cache_control fields.
427
443
  */
428
444
  function hasAnthropicCacheControl(content) {
429
- for (let i = 0; i < content.length; i++) if ("cache_control" in content[i]) return true;
445
+ for (let i = 0; i < content.length; i++) {
446
+ const block = content[i];
447
+ if (typeof block !== "object" || block == null || (0, node_util_types.isProxy)(block)) continue;
448
+ try {
449
+ if (Object.getOwnPropertyDescriptor(block, "cache_control")?.enumerable === true) return true;
450
+ } catch {
451
+ continue;
452
+ }
453
+ }
430
454
  return false;
431
455
  }
432
456
  /**
@@ -441,12 +465,7 @@ function stripAnthropicCacheControl(messages) {
441
465
  const originalMessage = updatedMessages[i];
442
466
  const content = originalMessage.content;
443
467
  if (!Array.isArray(content) || !hasAnthropicCacheControl(content)) continue;
444
- const clonedContent = deepCloneContent(content);
445
- for (let j = 0; j < clonedContent.length; j++) {
446
- const block = clonedContent[j];
447
- if ("cache_control" in block) delete block.cache_control;
448
- }
449
- updatedMessages[i] = cloneMessage(originalMessage, clonedContent);
468
+ updatedMessages[i] = cloneMessage(originalMessage, deepCloneContent(content, "cache_control"));
450
469
  }
451
470
  return updatedMessages;
452
471
  }
@@ -576,7 +595,9 @@ function addBedrockTailCacheControl(messages, ttl) {
576
595
  const content = originalMessage.content;
577
596
  const hasSerializationProps = "lc_kwargs" in originalMessage || "lc_serializable" in originalMessage || "lc_namespace" in originalMessage;
578
597
  const hasArrayContent = Array.isArray(content);
579
- const canPlaceCachePoint = !cachePointPlaced && !(typeof content === "string" && content === "") && !isSyntheticMetaMessage(originalMessage) && (typeof content === "string" || hasArrayContent);
598
+ const isEmptyString = typeof content === "string" && content === "";
599
+ const isComputerOutput = originalMessage instanceof _langchain_core_messages.BaseMessage && require_toolContent.hasComputerCallOutputMarker(originalMessage);
600
+ const canPlaceCachePoint = !cachePointPlaced && !isEmptyString && !isSyntheticMetaMessage(originalMessage) && !isComputerOutput && (typeof content === "string" || hasArrayContent);
580
601
  if (!canPlaceCachePoint && !hasArrayContent && !hasSerializationProps) continue;
581
602
  let workingContent;
582
603
  let modified = hasSerializationProps;