@librechat/agents 3.3.11 → 3.3.12

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 (192) hide show
  1. package/dist/cjs/graphs/Graph.cjs +246 -25
  2. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  3. package/dist/cjs/llm/bedrock/index.cjs +13 -2
  4. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  5. package/dist/cjs/llm/invoke.cjs +146 -36
  6. package/dist/cjs/llm/invoke.cjs.map +1 -1
  7. package/dist/cjs/llm/openai/index.cjs +2 -2
  8. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  9. package/dist/cjs/llm/streamLimits.cjs +723 -0
  10. package/dist/cjs/llm/streamLimits.cjs.map +1 -0
  11. package/dist/cjs/main.cjs +8 -0
  12. package/dist/cjs/run.cjs +6 -2
  13. package/dist/cjs/run.cjs.map +1 -1
  14. package/dist/cjs/session/AgentSession.cjs +4 -1
  15. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  16. package/dist/cjs/stream.cjs +103 -12
  17. package/dist/cjs/stream.cjs.map +1 -1
  18. package/dist/cjs/summarization/node.cjs +157 -37
  19. package/dist/cjs/summarization/node.cjs.map +1 -1
  20. package/dist/cjs/tools/BashExecutor.cjs +3 -2
  21. package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
  22. package/dist/cjs/tools/CodeExecutor.cjs +4 -3
  23. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  24. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +5 -3
  25. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  26. package/dist/cjs/tools/ToolNode.cjs +76 -3
  27. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  28. package/dist/cjs/tools/ToolSearch.cjs +3 -2
  29. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  30. package/dist/cjs/tools/search/crw-scraper.cjs +7 -1
  31. package/dist/cjs/tools/search/crw-scraper.cjs.map +1 -1
  32. package/dist/cjs/tools/search/crw-search.cjs +3 -1
  33. package/dist/cjs/tools/search/crw-search.cjs.map +1 -1
  34. package/dist/cjs/tools/search/firecrawl.cjs +7 -1
  35. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  36. package/dist/cjs/tools/search/keenable-scraper.cjs +7 -1
  37. package/dist/cjs/tools/search/keenable-scraper.cjs.map +1 -1
  38. package/dist/cjs/tools/search/keenable-search.cjs +3 -1
  39. package/dist/cjs/tools/search/keenable-search.cjs.map +1 -1
  40. package/dist/cjs/tools/search/rerankers.cjs +26 -8
  41. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  42. package/dist/cjs/tools/search/search.cjs +30 -10
  43. package/dist/cjs/tools/search/search.cjs.map +1 -1
  44. package/dist/cjs/tools/search/serper-scraper.cjs +7 -1
  45. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
  46. package/dist/cjs/tools/search/tavily-scraper.cjs +7 -1
  47. package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -1
  48. package/dist/cjs/tools/search/tavily-search.cjs +3 -1
  49. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
  50. package/dist/cjs/tools/search/tool.cjs +16 -2
  51. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  52. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +54 -3
  53. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  54. package/dist/cjs/utils/index.cjs +1 -0
  55. package/dist/cjs/utils/misc.cjs +12 -0
  56. package/dist/cjs/utils/misc.cjs.map +1 -1
  57. package/dist/cjs/utils/proxy.cjs +63 -0
  58. package/dist/cjs/utils/proxy.cjs.map +1 -0
  59. package/dist/esm/graphs/Graph.mjs +245 -24
  60. package/dist/esm/graphs/Graph.mjs.map +1 -1
  61. package/dist/esm/llm/bedrock/index.mjs +13 -2
  62. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  63. package/dist/esm/llm/invoke.mjs +146 -36
  64. package/dist/esm/llm/invoke.mjs.map +1 -1
  65. package/dist/esm/llm/openai/index.mjs +2 -2
  66. package/dist/esm/llm/openai/index.mjs.map +1 -1
  67. package/dist/esm/llm/streamLimits.mjs +704 -0
  68. package/dist/esm/llm/streamLimits.mjs.map +1 -0
  69. package/dist/esm/main.mjs +4 -2
  70. package/dist/esm/run.mjs +6 -2
  71. package/dist/esm/run.mjs.map +1 -1
  72. package/dist/esm/session/AgentSession.mjs +4 -1
  73. package/dist/esm/session/AgentSession.mjs.map +1 -1
  74. package/dist/esm/stream.mjs +103 -12
  75. package/dist/esm/stream.mjs.map +1 -1
  76. package/dist/esm/summarization/node.mjs +157 -37
  77. package/dist/esm/summarization/node.mjs.map +1 -1
  78. package/dist/esm/tools/BashExecutor.mjs +3 -2
  79. package/dist/esm/tools/BashExecutor.mjs.map +1 -1
  80. package/dist/esm/tools/CodeExecutor.mjs +4 -3
  81. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  82. package/dist/esm/tools/ProgrammaticToolCalling.mjs +5 -3
  83. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  84. package/dist/esm/tools/ToolNode.mjs +76 -3
  85. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  86. package/dist/esm/tools/ToolSearch.mjs +3 -2
  87. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  88. package/dist/esm/tools/search/crw-scraper.mjs +7 -1
  89. package/dist/esm/tools/search/crw-scraper.mjs.map +1 -1
  90. package/dist/esm/tools/search/crw-search.mjs +3 -1
  91. package/dist/esm/tools/search/crw-search.mjs.map +1 -1
  92. package/dist/esm/tools/search/firecrawl.mjs +7 -1
  93. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  94. package/dist/esm/tools/search/keenable-scraper.mjs +7 -1
  95. package/dist/esm/tools/search/keenable-scraper.mjs.map +1 -1
  96. package/dist/esm/tools/search/keenable-search.mjs +3 -1
  97. package/dist/esm/tools/search/keenable-search.mjs.map +1 -1
  98. package/dist/esm/tools/search/rerankers.mjs +26 -8
  99. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  100. package/dist/esm/tools/search/search.mjs +30 -10
  101. package/dist/esm/tools/search/search.mjs.map +1 -1
  102. package/dist/esm/tools/search/serper-scraper.mjs +7 -1
  103. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
  104. package/dist/esm/tools/search/tavily-scraper.mjs +7 -1
  105. package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -1
  106. package/dist/esm/tools/search/tavily-search.mjs +3 -1
  107. package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
  108. package/dist/esm/tools/search/tool.mjs +16 -2
  109. package/dist/esm/tools/search/tool.mjs.map +1 -1
  110. package/dist/esm/tools/subagent/SubagentExecutor.mjs +54 -3
  111. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  112. package/dist/esm/utils/index.mjs +1 -0
  113. package/dist/esm/utils/misc.mjs +12 -1
  114. package/dist/esm/utils/misc.mjs.map +1 -1
  115. package/dist/esm/utils/proxy.mjs +62 -0
  116. package/dist/esm/utils/proxy.mjs.map +1 -0
  117. package/dist/types/graphs/Graph.d.ts +53 -1
  118. package/dist/types/index.d.ts +2 -0
  119. package/dist/types/llm/invoke.d.ts +25 -4
  120. package/dist/types/llm/openai/index.d.ts +3 -0
  121. package/dist/types/llm/streamLimits.d.ts +314 -0
  122. package/dist/types/run.d.ts +1 -0
  123. package/dist/types/summarization/node.d.ts +27 -2
  124. package/dist/types/tools/BashExecutor.d.ts +2 -2
  125. package/dist/types/tools/CodeExecutor.d.ts +3 -3
  126. package/dist/types/tools/ToolNode.d.ts +11 -1
  127. package/dist/types/tools/search/crw-scraper.d.ts +2 -0
  128. package/dist/types/tools/search/firecrawl.d.ts +2 -0
  129. package/dist/types/tools/search/keenable-scraper.d.ts +2 -0
  130. package/dist/types/tools/search/rerankers.d.ts +9 -5
  131. package/dist/types/tools/search/serper-scraper.d.ts +2 -0
  132. package/dist/types/tools/search/tavily-scraper.d.ts +2 -0
  133. package/dist/types/tools/search/types.d.ts +28 -33
  134. package/dist/types/tools/subagent/SubagentExecutor.d.ts +44 -0
  135. package/dist/types/types/graph.d.ts +7 -1
  136. package/dist/types/types/run.d.ts +46 -1
  137. package/dist/types/types/tools.d.ts +21 -0
  138. package/dist/types/utils/index.d.ts +1 -0
  139. package/dist/types/utils/misc.d.ts +7 -0
  140. package/dist/types/utils/proxy.d.ts +31 -0
  141. package/package.json +2 -1
  142. package/src/__tests__/stream.eagerArgsDivergence.test.ts +158 -0
  143. package/src/__tests__/stream.eagerEventExecution.test.ts +1 -0
  144. package/src/__tests__/stream.streamLimits.test.ts +1982 -0
  145. package/src/graphs/Graph.ts +302 -27
  146. package/src/graphs/__tests__/Graph.breakerLifecycle.test.ts +234 -0
  147. package/src/index.ts +11 -0
  148. package/src/llm/bedrock/index.ts +22 -2
  149. package/src/llm/invoke.streamLimits.test.ts +142 -0
  150. package/src/llm/invoke.test.ts +89 -1
  151. package/src/llm/invoke.ts +197 -20
  152. package/src/llm/openai/cacheWriteTokens.test.ts +112 -0
  153. package/src/llm/openai/index.ts +14 -6
  154. package/src/llm/streamLimits.test.ts +450 -0
  155. package/src/llm/streamLimits.ts +1158 -0
  156. package/src/run.ts +4 -0
  157. package/src/session/AgentSession.ts +5 -0
  158. package/src/stream.ts +141 -6
  159. package/src/summarization/__tests__/node.test.ts +269 -0
  160. package/src/summarization/chunkHandler.test.ts +196 -0
  161. package/src/summarization/node.ts +203 -6
  162. package/src/tools/BashExecutor.ts +4 -3
  163. package/src/tools/CodeExecutor.ts +5 -4
  164. package/src/tools/ProgrammaticToolCalling.ts +7 -5
  165. package/src/tools/ToolNode.ts +109 -6
  166. package/src/tools/ToolSearch.ts +4 -3
  167. package/src/tools/__tests__/BashExecutor.test.ts +2 -2
  168. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +2 -4
  169. package/src/tools/__tests__/SubagentExecutor.test.ts +126 -0
  170. package/src/tools/__tests__/ToolNode.breakerSignal.test.ts +389 -0
  171. package/src/tools/__tests__/ToolNode.streamLimits.test.ts +69 -0
  172. package/src/tools/search/crw-scraper.ts +6 -0
  173. package/src/tools/search/crw-search.ts +6 -1
  174. package/src/tools/search/firecrawl.ts +6 -0
  175. package/src/tools/search/http-agent.test.ts +133 -0
  176. package/src/tools/search/keenable-scraper.ts +6 -0
  177. package/src/tools/search/keenable-search.ts +6 -1
  178. package/src/tools/search/rerankers.ts +36 -10
  179. package/src/tools/search/search.ts +29 -11
  180. package/src/tools/search/serper-scraper.ts +6 -0
  181. package/src/tools/search/tavily-scraper.ts +6 -0
  182. package/src/tools/search/tavily-search.ts +2 -0
  183. package/src/tools/search/tool.ts +16 -0
  184. package/src/tools/search/types.ts +31 -33
  185. package/src/tools/subagent/SubagentExecutor.ts +96 -3
  186. package/src/types/graph.ts +7 -0
  187. package/src/types/run.ts +49 -1
  188. package/src/types/tools.ts +21 -0
  189. package/src/utils/index.ts +1 -0
  190. package/src/utils/misc.ts +19 -0
  191. package/src/utils/proxy.test.ts +176 -0
  192. package/src/utils/proxy.ts +93 -0
@@ -1,3 +1,4 @@
1
+ const require_misc = require("../utils/misc.cjs");
1
2
  const require_langfuseRuntimeScope = require("../langfuseRuntimeScope.cjs");
2
3
  const require_enum = require("../common/enum.cjs");
3
4
  require("../common/index.cjs");
@@ -6,6 +7,7 @@ const require_toolContent = require("../utils/toolContent.cjs");
6
7
  const require_events = require("../utils/events.cjs");
7
8
  const require_injected = require("../messages/injected.cjs");
8
9
  const require_eagerEventExecution = require("./eagerEventExecution.cjs");
10
+ const require_streamLimits = require("../llm/streamLimits.cjs");
9
11
  const require_intentArg = require("./intentArg.cjs");
10
12
  const require_toolOutputReferences = require("./toolOutputReferences.cjs");
11
13
  const require_run = require("../utils/run.cjs");
@@ -20,6 +22,13 @@ let _langchain_core_messages = require("@langchain/core/messages");
20
22
  let _langchain_langgraph = require("@langchain/langgraph");
21
23
  let _langchain_core_singletons = require("@langchain/core/singletons");
22
24
  //#region src/tools/ToolNode.ts
25
+ /** Host-facing batch requests must not carry the batch's breaker scope —
26
+ * hosts spread `configurable` into their own run configs. */
27
+ function stripRunBreakerScope(configurable) {
28
+ if (configurable == null || !("lc_run_breaker_scope" in configurable)) return configurable;
29
+ const { [require_streamLimits.RUN_BREAKER_SCOPE_CONFIG_KEY]: _scope, ...rest } = configurable;
30
+ return rest;
31
+ }
23
32
  function createToolErrorOwnership() {
24
33
  return {
25
34
  handlerOwned: /* @__PURE__ */ new Set(),
@@ -357,6 +366,10 @@ var ToolNode = class extends require_run.RunnableCallable {
357
366
  toolOutputRegistry;
358
367
  /** Run-scoped selection for swapping remote code tools to local executors. */
359
368
  toolExecution;
369
+ /** Owning graph's run-scoped breaker signal, composed into each batch's config. */
370
+ getBreakerSignal;
371
+ /** Owning graph's immutable run scope; captured once per batch. */
372
+ getRunScope;
360
373
  /**
361
374
  * Monotonic counter used to mint a unique scope id for anonymous
362
375
  * batches (ones invoked without a `run_id` in
@@ -365,7 +378,7 @@ var ToolNode = class extends require_run.RunnableCallable {
365
378
  * other's in-flight state.
366
379
  */
367
380
  anonBatchCounter = 0;
368
- constructor({ tools, toolMap, name, tags, trace, runLangfuse, agentLangfuse, errorHandler, toolCallStepIds, handleToolErrors, loadRuntimeTools, toolRegistry, sessions, eventDrivenMode, eagerEventToolExecution, eagerEventToolExecutions, eagerEventToolUsageCount, eagerEventToolSuppressions, agentId, executingAgentId, directToolNames, interruptingToolNames, codeSessionToolNames, maxContextTokens, maxToolResultChars, hookRegistry, humanInTheLoop, toolOutputReferences, toolOutputRegistry, toolExecution, fileCheckpointer }) {
381
+ constructor({ tools, toolMap, name, tags, trace, runLangfuse, agentLangfuse, errorHandler, toolCallStepIds, handleToolErrors, loadRuntimeTools, toolRegistry, sessions, eventDrivenMode, eagerEventToolExecution, eagerEventToolExecutions, eagerEventToolUsageCount, eagerEventToolSuppressions, agentId, executingAgentId, directToolNames, interruptingToolNames, codeSessionToolNames, maxContextTokens, maxToolResultChars, hookRegistry, humanInTheLoop, toolOutputReferences, toolOutputRegistry, toolExecution, fileCheckpointer, getBreakerSignal, getRunScope }) {
369
382
  super({
370
383
  name: name ?? TOOL_NODE_RUN_NAME,
371
384
  tags,
@@ -399,6 +412,8 @@ var ToolNode = class extends require_run.RunnableCallable {
399
412
  this.hookRegistry = hookRegistry;
400
413
  this.humanInTheLoop = humanInTheLoop;
401
414
  this.toolExecution = toolExecution;
415
+ this.getBreakerSignal = getBreakerSignal;
416
+ this.getRunScope = getRunScope;
402
417
  this.fileCheckpointer = fileCheckpointer;
403
418
  this.applyToolExecutionOverrides();
404
419
  /**
@@ -698,6 +713,10 @@ var ToolNode = class extends require_run.RunnableCallable {
698
713
  store: lgConfig.store ?? null,
699
714
  writer: lgConfig.writer ?? config.configurable?.writer ?? null
700
715
  };
716
+ /** A sibling can trip the breaker while the PreToolUse hooks above
717
+ * are awaited; a tool that never inspects its runtime signal would
718
+ * still run. Recheck at the last moment before execution. */
719
+ this.throwIfBreakerTripped(config);
701
720
  const output = await tool.invoke(invokeParams, runtime);
702
721
  if ((0, _langchain_langgraph.isCommand)(output)) return output;
703
722
  if ((0, _langchain_core_messages.isBaseMessage)(output) && output._getType() === "tool") {
@@ -759,6 +778,12 @@ var ToolNode = class extends require_run.RunnableCallable {
759
778
  const e = _e;
760
779
  if (!this.handleToolErrors) throw e;
761
780
  if ((0, _langchain_langgraph.isGraphInterrupt)(e)) throw e;
781
+ /**
782
+ * A stream circuit breaker tripped by a child run (subagent) is a
783
+ * safety abort, not a tool failure to report back to the model. It
784
+ * passes through like an interrupt so the whole run rejects.
785
+ */
786
+ if (e instanceof require_streamLimits.StreamLimitExceededError) throw e;
762
787
  if (this.errorHandler) try {
763
788
  const dispatched = await this.errorHandler({
764
789
  error: e,
@@ -1279,7 +1304,17 @@ var ToolNode = class extends require_run.RunnableCallable {
1279
1304
  * 4. Injected messages from results are collected and returned alongside
1280
1305
  * ToolMessages (appended AFTER to respect provider ordering).
1281
1306
  */
1307
+ /** Rethrows a stream-limit trip carried on the batch config's composed
1308
+ * signal. Rechecked at each later execution/dispatch stage because a tool
1309
+ * that ignores cancellation can complete normally across the trip, and
1310
+ * the next stage would otherwise start fresh side effects on a failed
1311
+ * run. */
1312
+ throwIfBreakerTripped(config) {
1313
+ const signal = config.signal;
1314
+ if (signal?.aborted === true && signal.reason instanceof require_streamLimits.StreamLimitExceededError) throw signal.reason;
1315
+ }
1282
1316
  async dispatchToolEvents(toolCalls, config, batchContext = {}) {
1317
+ this.throwIfBreakerTripped(config);
1283
1318
  const { batchIndices, turn, batchScopeId, preResolvedArgs, preBatchSnapshot } = batchContext;
1284
1319
  const runId = config.configurable?.run_id ?? "";
1285
1320
  /**
@@ -1775,7 +1810,10 @@ var ToolNode = class extends require_run.RunnableCallable {
1775
1810
  const earlyCompletionDispatches = [];
1776
1811
  const dispatchRequestById = new Map(dispatchRequests.map((request) => [request.id, request]));
1777
1812
  const onResult = (result) => {
1778
- const request = result.toolCallId != null ? dispatchRequestById.get(result.toolCallId) : void 0;
1813
+ /** Runtime-honest widening: hosts may omit the id despite the
1814
+ * field type. */
1815
+ const resultToolCallId = result.toolCallId;
1816
+ const request = resultToolCallId != null ? dispatchRequestById.get(resultToolCallId) : void 0;
1779
1817
  if (request == null || earlyCompletionDispatchedIds.has(result.toolCallId)) return;
1780
1818
  earlyCompletionDispatchedIds.add(result.toolCallId);
1781
1819
  earlyCompletionDispatches.push(this.dispatchEarlyToolCompletion(result, request, config).then((dispatched) => {
@@ -1784,6 +1822,10 @@ var ToolNode = class extends require_run.RunnableCallable {
1784
1822
  earlyCompletionDispatchedIds.delete(result.toolCallId);
1785
1823
  }));
1786
1824
  };
1825
+ /** The approval hooks above are awaited; a sibling's trip during them
1826
+ * must stop the approved batch before it reaches a host handler that
1827
+ * may never inspect the request signal. */
1828
+ if (dispatchRequests.length > 0) this.throwIfBreakerTripped(config);
1787
1829
  const dispatchPromise = dispatchRequests.length === 0 ? Promise.resolve([]) : new Promise((resolve, reject) => {
1788
1830
  let dispatchSettled = false;
1789
1831
  let resultSettled = false;
@@ -1795,8 +1837,9 @@ var ToolNode = class extends require_run.RunnableCallable {
1795
1837
  toolCalls: dispatchRequests,
1796
1838
  userId: config.configurable?.user_id,
1797
1839
  agentId: this.executingAgentId,
1798
- configurable: config.configurable,
1840
+ configurable: stripRunBreakerScope(config.configurable),
1799
1841
  metadata: config.metadata,
1842
+ signal: config.signal,
1800
1843
  resolve: (results) => {
1801
1844
  resultSettled = true;
1802
1845
  settledResults = results;
@@ -2179,6 +2222,10 @@ var ToolNode = class extends require_run.RunnableCallable {
2179
2222
  interruptingPositions.forEach((i, k) => {
2180
2223
  outputs[i] = interruptingOutputs[k];
2181
2224
  });
2225
+ /** The breaker can trip while the interrupting group is awaited — e.g.
2226
+ * a tool that ignores cancellation and completes normally. Recheck
2227
+ * before starting the non-idempotent siblings. */
2228
+ this.throwIfBreakerTripped(config);
2182
2229
  const regularOutputs = await Promise.all(regularPositions.map((i) => runOne(directCalls[i], i)));
2183
2230
  regularPositions.forEach((i, k) => {
2184
2231
  outputs[i] = regularOutputs[k];
@@ -2202,6 +2249,32 @@ var ToolNode = class extends require_run.RunnableCallable {
2202
2249
  return Array.isArray(input) ? outputs : { messages: outputs };
2203
2250
  }
2204
2251
  async run(input, config) {
2252
+ /**
2253
+ * Breaker read once at batch entry: every downstream path (direct
2254
+ * `tool.invoke` runtimes and the ON_TOOL_EXECUTE dispatch) inherits this
2255
+ * config, and a graph reset mid-batch must not detach in-flight tools
2256
+ * from an already-tripped signal.
2257
+ */
2258
+ const breakerSignal = this.getBreakerSignal?.();
2259
+ const composedSignal = require_misc.composeAbortSignals(config.signal, breakerSignal);
2260
+ /** Immutable batch scope, captured with the signal BEFORE hooks: tools
2261
+ * that spawn runs (subagents) bind their child to this controller, so a
2262
+ * reset during a PreToolUse hook cannot hand them the new run's one. */
2263
+ const batchRunScope = this.getRunScope?.();
2264
+ if (composedSignal !== config.signal || batchRunScope != null) config = {
2265
+ ...config,
2266
+ signal: composedSignal,
2267
+ ...batchRunScope != null && { configurable: {
2268
+ ...config.configurable,
2269
+ ["lc_run_breaker_scope"]: batchRunScope
2270
+ } }
2271
+ };
2272
+ /** Already-tripped-at-entry: a parallel sibling's breach failed the run
2273
+ * before this batch was scheduled. Rethrow before hooks, direct
2274
+ * `tool.invoke` calls, or ON_TOOL_EXECUTE dispatch — a tool or host
2275
+ * handler that doesn't synchronously inspect an aborted signal would
2276
+ * otherwise perform side effects on a failed run. */
2277
+ if (composedSignal?.aborted === true && composedSignal.reason instanceof require_streamLimits.StreamLimitExceededError) throw composedSignal.reason;
2205
2278
  this.toolCallTurns.clear();
2206
2279
  /**
2207
2280
  * Per-batch local map for resolved (post-substitution) args.