@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
|
+
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
|
-
|
|
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.
|