@librechat/agents 3.3.11 → 3.3.13
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.
- package/dist/cjs/graphs/Graph.cjs +246 -25
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/instrumentation.cjs +1 -0
- package/dist/cjs/instrumentation.cjs.map +1 -1
- package/dist/cjs/langfuseSpanRegistry.cjs +6 -3
- package/dist/cjs/langfuseSpanRegistry.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +13 -2
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/invoke.cjs +146 -36
- package/dist/cjs/llm/invoke.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +2 -2
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/streamLimits.cjs +723 -0
- package/dist/cjs/llm/streamLimits.cjs.map +1 -0
- package/dist/cjs/main.cjs +8 -0
- package/dist/cjs/run.cjs +6 -2
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/session/AgentSession.cjs +4 -1
- package/dist/cjs/session/AgentSession.cjs.map +1 -1
- package/dist/cjs/stream.cjs +103 -12
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/summarization/node.cjs +157 -37
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/BashExecutor.cjs +3 -2
- package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs +4 -3
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +5 -3
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +76 -3
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/ToolSearch.cjs +3 -2
- package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
- package/dist/cjs/tools/search/crw-scraper.cjs +7 -1
- package/dist/cjs/tools/search/crw-scraper.cjs.map +1 -1
- package/dist/cjs/tools/search/crw-search.cjs +3 -1
- package/dist/cjs/tools/search/crw-search.cjs.map +1 -1
- package/dist/cjs/tools/search/firecrawl.cjs +7 -1
- package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
- package/dist/cjs/tools/search/keenable-scraper.cjs +7 -1
- package/dist/cjs/tools/search/keenable-scraper.cjs.map +1 -1
- package/dist/cjs/tools/search/keenable-search.cjs +3 -1
- package/dist/cjs/tools/search/keenable-search.cjs.map +1 -1
- package/dist/cjs/tools/search/rerankers.cjs +26 -8
- package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +30 -10
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/serper-scraper.cjs +7 -1
- package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
- package/dist/cjs/tools/search/tavily-scraper.cjs +7 -1
- package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -1
- package/dist/cjs/tools/search/tavily-search.cjs +3 -1
- package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +16 -2
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +54 -3
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
- package/dist/cjs/utils/index.cjs +1 -0
- package/dist/cjs/utils/misc.cjs +12 -0
- package/dist/cjs/utils/misc.cjs.map +1 -1
- package/dist/cjs/utils/proxy.cjs +63 -0
- package/dist/cjs/utils/proxy.cjs.map +1 -0
- package/dist/esm/graphs/Graph.mjs +245 -24
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/instrumentation.mjs +1 -0
- package/dist/esm/instrumentation.mjs.map +1 -1
- package/dist/esm/langfuseSpanRegistry.mjs +6 -3
- package/dist/esm/langfuseSpanRegistry.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +13 -2
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/invoke.mjs +146 -36
- package/dist/esm/llm/invoke.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +2 -2
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/streamLimits.mjs +704 -0
- package/dist/esm/llm/streamLimits.mjs.map +1 -0
- package/dist/esm/main.mjs +4 -2
- package/dist/esm/run.mjs +6 -2
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/session/AgentSession.mjs +4 -1
- package/dist/esm/session/AgentSession.mjs.map +1 -1
- package/dist/esm/stream.mjs +103 -12
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/summarization/node.mjs +157 -37
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/BashExecutor.mjs +3 -2
- package/dist/esm/tools/BashExecutor.mjs.map +1 -1
- package/dist/esm/tools/CodeExecutor.mjs +4 -3
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +5 -3
- package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +76 -3
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/ToolSearch.mjs +3 -2
- package/dist/esm/tools/ToolSearch.mjs.map +1 -1
- package/dist/esm/tools/search/crw-scraper.mjs +7 -1
- package/dist/esm/tools/search/crw-scraper.mjs.map +1 -1
- package/dist/esm/tools/search/crw-search.mjs +3 -1
- package/dist/esm/tools/search/crw-search.mjs.map +1 -1
- package/dist/esm/tools/search/firecrawl.mjs +7 -1
- package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
- package/dist/esm/tools/search/keenable-scraper.mjs +7 -1
- package/dist/esm/tools/search/keenable-scraper.mjs.map +1 -1
- package/dist/esm/tools/search/keenable-search.mjs +3 -1
- package/dist/esm/tools/search/keenable-search.mjs.map +1 -1
- package/dist/esm/tools/search/rerankers.mjs +26 -8
- package/dist/esm/tools/search/rerankers.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +30 -10
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/serper-scraper.mjs +7 -1
- package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
- package/dist/esm/tools/search/tavily-scraper.mjs +7 -1
- package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -1
- package/dist/esm/tools/search/tavily-search.mjs +3 -1
- package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +16 -2
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +54 -3
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
- package/dist/esm/utils/index.mjs +1 -0
- package/dist/esm/utils/misc.mjs +12 -1
- package/dist/esm/utils/misc.mjs.map +1 -1
- package/dist/esm/utils/proxy.mjs +62 -0
- package/dist/esm/utils/proxy.mjs.map +1 -0
- package/dist/types/graphs/Graph.d.ts +53 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/llm/invoke.d.ts +25 -4
- package/dist/types/llm/openai/index.d.ts +3 -0
- package/dist/types/llm/streamLimits.d.ts +314 -0
- package/dist/types/run.d.ts +1 -0
- package/dist/types/summarization/node.d.ts +27 -2
- package/dist/types/tools/BashExecutor.d.ts +2 -2
- package/dist/types/tools/CodeExecutor.d.ts +3 -3
- package/dist/types/tools/ToolNode.d.ts +11 -1
- package/dist/types/tools/search/crw-scraper.d.ts +2 -0
- package/dist/types/tools/search/firecrawl.d.ts +2 -0
- package/dist/types/tools/search/keenable-scraper.d.ts +2 -0
- package/dist/types/tools/search/rerankers.d.ts +9 -5
- package/dist/types/tools/search/serper-scraper.d.ts +2 -0
- package/dist/types/tools/search/tavily-scraper.d.ts +2 -0
- package/dist/types/tools/search/types.d.ts +28 -33
- package/dist/types/tools/subagent/SubagentExecutor.d.ts +44 -0
- package/dist/types/types/graph.d.ts +12 -1
- package/dist/types/types/run.d.ts +46 -1
- package/dist/types/types/tools.d.ts +21 -0
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/misc.d.ts +7 -0
- package/dist/types/utils/proxy.d.ts +31 -0
- package/package.json +2 -1
- package/src/__tests__/stream.eagerArgsDivergence.test.ts +158 -0
- package/src/__tests__/stream.eagerEventExecution.test.ts +1 -0
- package/src/__tests__/stream.streamLimits.test.ts +1982 -0
- package/src/graphs/Graph.ts +302 -27
- package/src/graphs/__tests__/Graph.breakerLifecycle.test.ts +234 -0
- package/src/index.ts +11 -0
- package/src/instrumentation.ts +1 -0
- package/src/langfuseSpanRegistry.ts +9 -0
- package/src/llm/bedrock/index.ts +22 -2
- package/src/llm/invoke.streamLimits.test.ts +142 -0
- package/src/llm/invoke.test.ts +89 -1
- package/src/llm/invoke.ts +197 -20
- package/src/llm/openai/cacheWriteTokens.test.ts +112 -0
- package/src/llm/openai/index.ts +14 -6
- package/src/llm/streamLimits.test.ts +450 -0
- package/src/llm/streamLimits.ts +1158 -0
- package/src/run.ts +4 -0
- package/src/session/AgentSession.ts +5 -0
- package/src/specs/langfuse-instrumentation.test.ts +26 -0
- package/src/specs/langfuse-span-registry.test.ts +17 -0
- package/src/specs/summarization.test.ts +5 -2
- package/src/stream.ts +141 -6
- package/src/summarization/__tests__/node.test.ts +269 -0
- package/src/summarization/chunkHandler.test.ts +196 -0
- package/src/summarization/node.ts +203 -6
- package/src/tools/BashExecutor.ts +4 -3
- package/src/tools/CodeExecutor.ts +5 -4
- package/src/tools/ProgrammaticToolCalling.ts +7 -5
- package/src/tools/ToolNode.ts +109 -6
- package/src/tools/ToolSearch.ts +4 -3
- package/src/tools/__tests__/BashExecutor.test.ts +2 -2
- package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +2 -4
- package/src/tools/__tests__/SubagentExecutor.test.ts +126 -0
- package/src/tools/__tests__/ToolNode.breakerSignal.test.ts +389 -0
- package/src/tools/__tests__/ToolNode.streamLimits.test.ts +69 -0
- package/src/tools/search/crw-scraper.ts +6 -0
- package/src/tools/search/crw-search.ts +6 -1
- package/src/tools/search/firecrawl.ts +6 -0
- package/src/tools/search/http-agent.test.ts +133 -0
- package/src/tools/search/keenable-scraper.ts +6 -0
- package/src/tools/search/keenable-search.ts +6 -1
- package/src/tools/search/rerankers.ts +36 -10
- package/src/tools/search/search.ts +29 -11
- package/src/tools/search/serper-scraper.ts +6 -0
- package/src/tools/search/tavily-scraper.ts +6 -0
- package/src/tools/search/tavily-search.ts +2 -0
- package/src/tools/search/tool.ts +16 -0
- package/src/tools/search/types.ts +31 -33
- package/src/tools/subagent/SubagentExecutor.ts +96 -3
- package/src/types/graph.ts +12 -0
- package/src/types/run.ts +49 -1
- package/src/types/tools.ts +21 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/misc.ts +19 -0
- package/src/utils/proxy.test.ts +176 -0
- 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
|
-
|
|
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.
|