@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
+ import { composeAbortSignals } from "../utils/misc.mjs";
1
2
  import { resolveLangfuseRuntimeScope, withLangfuseRuntimeScope } from "../langfuseRuntimeScope.mjs";
2
3
  import { CODE_EXECUTION_TOOLS } from "../common/enum.mjs";
3
4
  import "../common/index.mjs";
@@ -6,6 +7,7 @@ import { cloneToolMessageWithContent, compactToolContent, hasComputerCallOutputM
6
7
  import { safeDispatchCustomEvent } from "../utils/events.mjs";
7
8
  import { convertInjectedMessages } from "../messages/injected.mjs";
8
9
  import { buildToolExecutionRequestPlan, recordArgsEqual, resolveRuntimeSessionHint } from "./eagerEventExecution.mjs";
10
+ import { RUN_BREAKER_SCOPE_CONFIG_KEY, StreamLimitExceededError } from "../llm/streamLimits.mjs";
9
11
  import { INTENT_ARG, isIntentLabelProperty, outcomeFieldsFromResult, readOutcomeFields, resolveToolOutcome } from "./intentArg.mjs";
10
12
  import { ToolOutputReferenceRegistry, buildReferenceKey } from "./toolOutputReferences.mjs";
11
13
  import { RunnableCallable } from "../utils/run.mjs";
@@ -20,6 +22,13 @@ import { AIMessage, HumanMessage, ToolMessage, isAIMessage, isBaseMessage } from
20
22
  import { Command, END, Send, interrupt, isCommand, isGraphInterrupt } from "@langchain/langgraph";
21
23
  import { AsyncLocalStorageProviderSingleton } from "@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 { [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 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 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 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 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 (isCommand(output)) return output;
703
722
  if (isBaseMessage(output) && output._getType() === "tool") {
@@ -759,6 +778,12 @@ var ToolNode = class extends RunnableCallable {
759
778
  const e = _e;
760
779
  if (!this.handleToolErrors) throw e;
761
780
  if (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 StreamLimitExceededError) throw e;
762
787
  if (this.errorHandler) try {
763
788
  const dispatched = await this.errorHandler({
764
789
  error: e,
@@ -1278,7 +1303,17 @@ var ToolNode = class extends RunnableCallable {
1278
1303
  * 4. Injected messages from results are collected and returned alongside
1279
1304
  * ToolMessages (appended AFTER to respect provider ordering).
1280
1305
  */
1306
+ /** Rethrows a stream-limit trip carried on the batch config's composed
1307
+ * signal. Rechecked at each later execution/dispatch stage because a tool
1308
+ * that ignores cancellation can complete normally across the trip, and
1309
+ * the next stage would otherwise start fresh side effects on a failed
1310
+ * run. */
1311
+ throwIfBreakerTripped(config) {
1312
+ const signal = config.signal;
1313
+ if (signal?.aborted === true && signal.reason instanceof StreamLimitExceededError) throw signal.reason;
1314
+ }
1281
1315
  async dispatchToolEvents(toolCalls, config, batchContext = {}) {
1316
+ this.throwIfBreakerTripped(config);
1282
1317
  const { batchIndices, turn, batchScopeId, preResolvedArgs, preBatchSnapshot } = batchContext;
1283
1318
  const runId = config.configurable?.run_id ?? "";
1284
1319
  /**
@@ -1774,7 +1809,10 @@ var ToolNode = class extends RunnableCallable {
1774
1809
  const earlyCompletionDispatches = [];
1775
1810
  const dispatchRequestById = new Map(dispatchRequests.map((request) => [request.id, request]));
1776
1811
  const onResult = (result) => {
1777
- const request = result.toolCallId != null ? dispatchRequestById.get(result.toolCallId) : void 0;
1812
+ /** Runtime-honest widening: hosts may omit the id despite the
1813
+ * field type. */
1814
+ const resultToolCallId = result.toolCallId;
1815
+ const request = resultToolCallId != null ? dispatchRequestById.get(resultToolCallId) : void 0;
1778
1816
  if (request == null || earlyCompletionDispatchedIds.has(result.toolCallId)) return;
1779
1817
  earlyCompletionDispatchedIds.add(result.toolCallId);
1780
1818
  earlyCompletionDispatches.push(this.dispatchEarlyToolCompletion(result, request, config).then((dispatched) => {
@@ -1783,6 +1821,10 @@ var ToolNode = class extends RunnableCallable {
1783
1821
  earlyCompletionDispatchedIds.delete(result.toolCallId);
1784
1822
  }));
1785
1823
  };
1824
+ /** The approval hooks above are awaited; a sibling's trip during them
1825
+ * must stop the approved batch before it reaches a host handler that
1826
+ * may never inspect the request signal. */
1827
+ if (dispatchRequests.length > 0) this.throwIfBreakerTripped(config);
1786
1828
  const dispatchPromise = dispatchRequests.length === 0 ? Promise.resolve([]) : new Promise((resolve, reject) => {
1787
1829
  let dispatchSettled = false;
1788
1830
  let resultSettled = false;
@@ -1794,8 +1836,9 @@ var ToolNode = class extends RunnableCallable {
1794
1836
  toolCalls: dispatchRequests,
1795
1837
  userId: config.configurable?.user_id,
1796
1838
  agentId: this.executingAgentId,
1797
- configurable: config.configurable,
1839
+ configurable: stripRunBreakerScope(config.configurable),
1798
1840
  metadata: config.metadata,
1841
+ signal: config.signal,
1799
1842
  resolve: (results) => {
1800
1843
  resultSettled = true;
1801
1844
  settledResults = results;
@@ -2177,6 +2220,10 @@ var ToolNode = class extends RunnableCallable {
2177
2220
  interruptingPositions.forEach((i, k) => {
2178
2221
  outputs[i] = interruptingOutputs[k];
2179
2222
  });
2223
+ /** The breaker can trip while the interrupting group is awaited — e.g.
2224
+ * a tool that ignores cancellation and completes normally. Recheck
2225
+ * before starting the non-idempotent siblings. */
2226
+ this.throwIfBreakerTripped(config);
2180
2227
  const regularOutputs = await Promise.all(regularPositions.map((i) => runOne(directCalls[i], i)));
2181
2228
  regularPositions.forEach((i, k) => {
2182
2229
  outputs[i] = regularOutputs[k];
@@ -2200,6 +2247,32 @@ var ToolNode = class extends RunnableCallable {
2200
2247
  return Array.isArray(input) ? outputs : { messages: outputs };
2201
2248
  }
2202
2249
  async run(input, config) {
2250
+ /**
2251
+ * Breaker read once at batch entry: every downstream path (direct
2252
+ * `tool.invoke` runtimes and the ON_TOOL_EXECUTE dispatch) inherits this
2253
+ * config, and a graph reset mid-batch must not detach in-flight tools
2254
+ * from an already-tripped signal.
2255
+ */
2256
+ const breakerSignal = this.getBreakerSignal?.();
2257
+ const composedSignal = composeAbortSignals(config.signal, breakerSignal);
2258
+ /** Immutable batch scope, captured with the signal BEFORE hooks: tools
2259
+ * that spawn runs (subagents) bind their child to this controller, so a
2260
+ * reset during a PreToolUse hook cannot hand them the new run's one. */
2261
+ const batchRunScope = this.getRunScope?.();
2262
+ if (composedSignal !== config.signal || batchRunScope != null) config = {
2263
+ ...config,
2264
+ signal: composedSignal,
2265
+ ...batchRunScope != null && { configurable: {
2266
+ ...config.configurable,
2267
+ ["lc_run_breaker_scope"]: batchRunScope
2268
+ } }
2269
+ };
2270
+ /** Already-tripped-at-entry: a parallel sibling's breach failed the run
2271
+ * before this batch was scheduled. Rethrow before hooks, direct
2272
+ * `tool.invoke` calls, or ON_TOOL_EXECUTE dispatch — a tool or host
2273
+ * handler that doesn't synchronously inspect an aborted signal would
2274
+ * otherwise perform side effects on a failed run. */
2275
+ if (composedSignal?.aborted === true && composedSignal.reason instanceof StreamLimitExceededError) throw composedSignal.reason;
2203
2276
  this.toolCallTurns.clear();
2204
2277
  /**
2205
2278
  * Per-batch local map for resolved (post-substitution) args.