@librechat/agents 4.0.1 → 4.0.3
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/agents/AgentContext.cjs +3 -2
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/decisions/deadline.cjs +52 -0
- package/dist/cjs/decisions/deadline.cjs.map +1 -0
- package/dist/cjs/decisions/dialect.cjs +88 -0
- package/dist/cjs/decisions/dialect.cjs.map +1 -0
- package/dist/cjs/decisions/http.cjs +77 -0
- package/dist/cjs/decisions/http.cjs.map +1 -0
- package/dist/cjs/decisions/index.cjs +7 -0
- package/dist/cjs/decisions/presets.cjs +82 -0
- package/dist/cjs/decisions/presets.cjs.map +1 -0
- package/dist/cjs/decisions/questions.cjs +70 -0
- package/dist/cjs/decisions/questions.cjs.map +1 -0
- package/dist/cjs/decisions/structuredChat.cjs +172 -0
- package/dist/cjs/decisions/structuredChat.cjs.map +1 -0
- package/dist/cjs/decisions/structuredOutput.cjs +18 -0
- package/dist/cjs/decisions/structuredOutput.cjs.map +1 -0
- package/dist/cjs/decisions/traceMarker.cjs +6 -0
- package/dist/cjs/decisions/traceMarker.cjs.map +1 -0
- package/dist/cjs/decisions/transport.cjs +166 -0
- package/dist/cjs/decisions/transport.cjs.map +1 -0
- package/dist/cjs/decisions/types.cjs +44 -0
- package/dist/cjs/decisions/types.cjs.map +1 -0
- package/dist/cjs/graphs/Graph.cjs +28 -9
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/langfuseToolOutputTracing.cjs +6 -1
- package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
- package/dist/cjs/llm/google/index.cjs +1 -1
- package/dist/cjs/llm/invoke.cjs +34 -12
- package/dist/cjs/llm/invoke.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +7 -0
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/providerTextBoundary.cjs +355 -0
- package/dist/cjs/llm/providerTextBoundary.cjs.map +1 -0
- package/dist/cjs/llm/providerTextChunk.cjs +14 -0
- package/dist/cjs/llm/providerTextChunk.cjs.map +1 -0
- package/dist/cjs/llm/providerTextControls.cjs +236 -0
- package/dist/cjs/llm/providerTextControls.cjs.map +1 -0
- package/dist/cjs/llm/stream/smoother.cjs +2 -1
- package/dist/cjs/llm/stream/smoother.cjs.map +1 -1
- package/dist/cjs/main.cjs +49 -1
- package/dist/cjs/protection/providerText.cjs +224 -0
- package/dist/cjs/protection/providerText.cjs.map +1 -0
- package/dist/cjs/protection/providerTextInput.cjs +25 -0
- package/dist/cjs/protection/providerTextInput.cjs.map +1 -0
- package/dist/cjs/rerank/index.cjs +2 -0
- package/dist/cjs/rerank/search.cjs +45 -0
- package/dist/cjs/rerank/search.cjs.map +1 -0
- package/dist/cjs/rerank/systemone.cjs +70 -0
- package/dist/cjs/rerank/systemone.cjs.map +1 -0
- package/dist/cjs/run.cjs +11 -1
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/stream.cjs +42 -14
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/summarization/node.cjs +26 -8
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/SubagentTool.cjs +11 -3
- package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +6 -5
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/search/rerankers.cjs +1 -0
- package/dist/cjs/tools/search/search.cjs +3 -3
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +4 -3
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs +13 -2
- package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +149 -26
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentReplay.cjs +4 -2
- package/dist/cjs/tools/subagent/SubagentReplay.cjs.map +1 -1
- package/dist/cjs/tools/subagent/childGraphConfig.cjs +3 -1
- package/dist/cjs/tools/subagent/childGraphConfig.cjs.map +1 -1
- package/dist/cjs/tools/subagent/diagnostics.cjs +88 -2
- package/dist/cjs/tools/subagent/diagnostics.cjs.map +1 -1
- package/dist/cjs/tools/subagent/hostArgs.cjs +214 -0
- package/dist/cjs/tools/subagent/hostArgs.cjs.map +1 -0
- package/dist/cjs/tools/subagent/index.cjs +2 -0
- package/dist/cjs/tools/toolErrorContent.cjs +1 -1
- package/dist/esm/agents/AgentContext.mjs +3 -2
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/decisions/deadline.mjs +52 -0
- package/dist/esm/decisions/deadline.mjs.map +1 -0
- package/dist/esm/decisions/dialect.mjs +87 -0
- package/dist/esm/decisions/dialect.mjs.map +1 -0
- package/dist/esm/decisions/http.mjs +75 -0
- package/dist/esm/decisions/http.mjs.map +1 -0
- package/dist/esm/decisions/index.mjs +8 -0
- package/dist/esm/decisions/presets.mjs +77 -0
- package/dist/esm/decisions/presets.mjs.map +1 -0
- package/dist/esm/decisions/questions.mjs +67 -0
- package/dist/esm/decisions/questions.mjs.map +1 -0
- package/dist/esm/decisions/structuredChat.mjs +172 -0
- package/dist/esm/decisions/structuredChat.mjs.map +1 -0
- package/dist/esm/decisions/structuredOutput.mjs +18 -0
- package/dist/esm/decisions/structuredOutput.mjs.map +1 -0
- package/dist/esm/decisions/traceMarker.mjs +6 -0
- package/dist/esm/decisions/traceMarker.mjs.map +1 -0
- package/dist/esm/decisions/transport.mjs +164 -0
- package/dist/esm/decisions/transport.mjs.map +1 -0
- package/dist/esm/decisions/types.mjs +39 -0
- package/dist/esm/decisions/types.mjs.map +1 -0
- package/dist/esm/graphs/Graph.mjs +28 -9
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/langfuseToolOutputTracing.mjs +6 -1
- package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
- package/dist/esm/llm/google/index.mjs +1 -1
- package/dist/esm/llm/invoke.mjs +34 -12
- package/dist/esm/llm/invoke.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +7 -0
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/providerTextBoundary.mjs +355 -0
- package/dist/esm/llm/providerTextBoundary.mjs.map +1 -0
- package/dist/esm/llm/providerTextChunk.mjs +13 -0
- package/dist/esm/llm/providerTextChunk.mjs.map +1 -0
- package/dist/esm/llm/providerTextControls.mjs +230 -0
- package/dist/esm/llm/providerTextControls.mjs.map +1 -0
- package/dist/esm/llm/stream/smoother.mjs +2 -1
- package/dist/esm/llm/stream/smoother.mjs.map +1 -1
- package/dist/esm/main.mjs +16 -2
- package/dist/esm/protection/providerText.mjs +218 -0
- package/dist/esm/protection/providerText.mjs.map +1 -0
- package/dist/esm/protection/providerTextInput.mjs +24 -0
- package/dist/esm/protection/providerTextInput.mjs.map +1 -0
- package/dist/esm/rerank/index.mjs +3 -0
- package/dist/esm/rerank/search.mjs +45 -0
- package/dist/esm/rerank/search.mjs.map +1 -0
- package/dist/esm/rerank/systemone.mjs +70 -0
- package/dist/esm/rerank/systemone.mjs.map +1 -0
- package/dist/esm/run.mjs +11 -1
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/stream.mjs +42 -14
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/summarization/node.mjs +26 -8
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/SubagentTool.mjs +11 -3
- package/dist/esm/tools/SubagentTool.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +6 -5
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/search/rerankers.mjs +1 -1
- package/dist/esm/tools/search/search.mjs +3 -3
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +4 -3
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs +13 -2
- package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +149 -26
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentReplay.mjs +4 -2
- package/dist/esm/tools/subagent/SubagentReplay.mjs.map +1 -1
- package/dist/esm/tools/subagent/childGraphConfig.mjs +3 -1
- package/dist/esm/tools/subagent/childGraphConfig.mjs.map +1 -1
- package/dist/esm/tools/subagent/diagnostics.mjs +84 -3
- package/dist/esm/tools/subagent/diagnostics.mjs.map +1 -1
- package/dist/esm/tools/subagent/hostArgs.mjs +207 -0
- package/dist/esm/tools/subagent/hostArgs.mjs.map +1 -0
- package/dist/esm/tools/subagent/index.mjs +2 -0
- package/dist/esm/tools/toolErrorContent.mjs +1 -1
- package/dist/types/decisions/deadline.d.ts +3 -0
- package/dist/types/decisions/dialect.d.ts +11 -0
- package/dist/types/decisions/http.d.ts +22 -0
- package/dist/types/decisions/index.d.ts +10 -0
- package/dist/types/decisions/presets.d.ts +17 -0
- package/dist/types/decisions/questions.d.ts +8 -0
- package/dist/types/decisions/structuredChat.d.ts +17 -0
- package/dist/types/decisions/structuredOutput.d.ts +4 -0
- package/dist/types/decisions/traceMarker.d.ts +2 -0
- package/dist/types/decisions/transport.d.ts +29 -0
- package/dist/types/decisions/types.d.ts +119 -0
- package/dist/types/graphs/Graph.d.ts +7 -3
- package/dist/types/index.d.ts +4 -0
- package/dist/types/llm/invoke.d.ts +4 -1
- package/dist/types/llm/providerTextBoundary.d.ts +4 -0
- package/dist/types/llm/providerTextChunk.d.ts +7 -0
- package/dist/types/llm/providerTextControls.d.ts +18 -0
- package/dist/types/protection/providerText.d.ts +77 -0
- package/dist/types/protection/providerTextInput.d.ts +3 -0
- package/dist/types/rerank/index.d.ts +4 -0
- package/dist/types/rerank/search.d.ts +7 -0
- package/dist/types/rerank/systemone.d.ts +13 -0
- package/dist/types/rerank/types.d.ts +24 -0
- package/dist/types/run.d.ts +2 -0
- package/dist/types/tools/BashExecutor.d.ts +4 -0
- package/dist/types/tools/CodeExecutor.d.ts +4 -0
- package/dist/types/tools/ReadFile.d.ts +4 -0
- package/dist/types/tools/SkillTool.d.ts +4 -0
- package/dist/types/tools/SubagentTool.d.ts +2 -0
- package/dist/types/tools/ToolSearch.d.ts +4 -0
- package/dist/types/tools/search/schema.d.ts +4 -0
- package/dist/types/tools/search/types.d.ts +3 -1
- package/dist/types/tools/subagent/SubagentExecutionRegistry.d.ts +6 -0
- package/dist/types/tools/subagent/SubagentExecutor.d.ts +22 -1
- package/dist/types/tools/subagent/SubagentReplay.d.ts +3 -1
- package/dist/types/tools/subagent/diagnostics.d.ts +56 -8
- package/dist/types/tools/subagent/hostArgs.d.ts +57 -0
- package/dist/types/tools/subagent/index.d.ts +3 -0
- package/dist/types/types/graph.d.ts +39 -0
- package/dist/types/types/run.d.ts +6 -2
- package/dist/types/types/tools.d.ts +2 -0
- package/package.json +4 -4
- package/src/agents/AgentContext.ts +3 -2
- package/src/decisions/deadline.ts +92 -0
- package/src/decisions/dialect.ts +200 -0
- package/src/decisions/http.ts +175 -0
- package/src/decisions/index.ts +14 -0
- package/src/decisions/presets.ts +111 -0
- package/src/decisions/questions.ts +128 -0
- package/src/decisions/structuredChat.ts +358 -0
- package/src/decisions/structuredOutput.ts +25 -0
- package/src/decisions/traceMarker.ts +2 -0
- package/src/decisions/transport.ts +335 -0
- package/src/decisions/types.ts +193 -0
- package/src/graphs/Graph.ts +57 -9
- package/src/index.ts +9 -0
- package/src/langfuseToolOutputTracing.ts +8 -1
- package/src/llm/invoke.ts +48 -7
- package/src/llm/openai/index.ts +8 -0
- package/src/llm/providerTextBoundary.ts +446 -0
- package/src/llm/providerTextChunk.ts +15 -0
- package/src/llm/providerTextControls.ts +173 -0
- package/src/llm/stream/smoother.ts +4 -2
- package/src/protection/providerText.ts +325 -0
- package/src/protection/providerTextInput.ts +21 -0
- package/src/rerank/index.ts +4 -0
- package/src/rerank/search.ts +85 -0
- package/src/rerank/systemone.ts +140 -0
- package/src/rerank/types.ts +28 -0
- package/src/run.ts +13 -0
- package/src/stream.ts +33 -7
- package/src/summarization/node.ts +32 -14
- package/src/tools/SubagentTool.ts +14 -3
- package/src/tools/ToolNode.ts +7 -3
- package/src/tools/search/search.ts +4 -4
- package/src/tools/search/tool.ts +27 -25
- package/src/tools/search/types.ts +4 -1
- package/src/tools/subagent/SubagentExecutionRegistry.ts +27 -2
- package/src/tools/subagent/SubagentExecutor.ts +323 -28
- package/src/tools/subagent/SubagentReplay.ts +10 -3
- package/src/tools/subagent/childGraphConfig.ts +12 -1
- package/src/tools/subagent/diagnostics.ts +180 -9
- package/src/tools/subagent/hostArgs.ts +413 -0
- package/src/tools/subagent/index.ts +20 -0
- package/src/types/graph.ts +44 -0
- package/src/types/run.ts +6 -2
- package/src/types/tools.ts +6 -1
|
@@ -7,19 +7,21 @@ const require_hitl = require("../../types/hitl.cjs");
|
|
|
7
7
|
const require_types = require("../../hooks/types.cjs");
|
|
8
8
|
const require_eagerEventExecution = require("../eagerEventExecution.cjs");
|
|
9
9
|
const require_toolBatchReplay = require("../toolBatchReplay.cjs");
|
|
10
|
+
const require_streamLimits = require("../../llm/streamLimits.cjs");
|
|
11
|
+
const require_providerText = require("../../protection/providerText.cjs");
|
|
10
12
|
const require_HookRegistry = require("../../hooks/HookRegistry.cjs");
|
|
11
13
|
const require_executeHooks = require("../../hooks/executeHooks.cjs");
|
|
12
14
|
require("../../hooks/index.cjs");
|
|
13
15
|
const require_injected = require("../../messages/injected.cjs");
|
|
14
16
|
const require_toolSessions = require("../../utils/toolSessions.cjs");
|
|
15
17
|
const require_request = require("../../llm/request.cjs");
|
|
16
|
-
const require_streamLimits = require("../../llm/streamLimits.cjs");
|
|
17
18
|
const require_events = require("../../events.cjs");
|
|
18
19
|
const require_run = require("../../utils/run.cjs");
|
|
19
20
|
const require_SubagentExecutionRegistry = require("./SubagentExecutionRegistry.cjs");
|
|
21
|
+
const require_hostArgs = require("./hostArgs.cjs");
|
|
22
|
+
const require_diagnostics = require("./diagnostics.cjs");
|
|
20
23
|
require("./runtimeLimits.cjs");
|
|
21
24
|
const require_childGraphConfig = require("./childGraphConfig.cjs");
|
|
22
|
-
const require_diagnostics = require("./diagnostics.cjs");
|
|
23
25
|
let nanoid = require("nanoid");
|
|
24
26
|
let _langchain_core_callbacks_base = require("@langchain/core/callbacks/base");
|
|
25
27
|
let _langchain_core_messages = require("@langchain/core/messages");
|
|
@@ -32,9 +34,15 @@ const MAX_QUEUED_SUBAGENT_UPDATES = 64;
|
|
|
32
34
|
const MAX_BACKGROUND_SUBAGENT_SEALS = 32;
|
|
33
35
|
const SUBAGENT_UPDATE_HANDLER_TIMEOUT_MS = 5e3;
|
|
34
36
|
const TEXT_DELTA_CONTENT_TYPE = `text_delta`;
|
|
35
|
-
const SUBAGENT_RESOLUTION_ERROR_MESSAGE = "Subagent error: Unable to initialize the selected subagent.";
|
|
36
37
|
const SUBAGENT_CONFIG_CHANGED_MESSAGE = "Subagent error: Subagent configuration changed since this execution was paused.";
|
|
37
38
|
const SUBAGENT_INVOCATION_CHANGED_MESSAGE = "Subagent error: Subagent invocation changed for this execution.";
|
|
39
|
+
function isSubagentResolutionControlFlow(error) {
|
|
40
|
+
try {
|
|
41
|
+
return error instanceof require_streamLimits.StreamLimitExceededError || error instanceof require_providerText.ProviderTextProtectionError || (0, _langchain_langgraph.isGraphInterrupt)(error);
|
|
42
|
+
} catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
38
46
|
function seedChildGraphSessions(childGraph, agents) {
|
|
39
47
|
require_toolSessions.seedAgentInitialSessions(childGraph.sessions, agents);
|
|
40
48
|
}
|
|
@@ -188,13 +196,21 @@ function serializeToolOutput(settled) {
|
|
|
188
196
|
function getSettlementFingerprint(output) {
|
|
189
197
|
return (0, crypto.createHash)("sha256").update(require_eagerEventExecution.stableStringify(output)).digest("hex");
|
|
190
198
|
}
|
|
191
|
-
function getBackgroundTaskFingerprint(description, subagentType, threadId) {
|
|
199
|
+
function getBackgroundTaskFingerprint(description, subagentType, threadId, hostArgsDigest) {
|
|
192
200
|
return (0, crypto.createHash)("sha256").update(require_eagerEventExecution.stableStringify({
|
|
193
201
|
description,
|
|
194
202
|
subagentType,
|
|
195
|
-
...threadId == null || threadId === "" ? {} : { threadId }
|
|
203
|
+
...threadId == null || threadId === "" ? {} : { threadId },
|
|
204
|
+
...hostArgsDigest == null ? {} : { hostArgsDigest }
|
|
196
205
|
})).digest("hex");
|
|
197
206
|
}
|
|
207
|
+
function getHostArgsDigestFromArgs(config, args) {
|
|
208
|
+
if (config == null || !isObjectLike(args)) return;
|
|
209
|
+
const picked = require_hostArgs.pickSubagentHostArgInput(args, new Set(require_hostArgs.getSubagentHostArgSpecs(config).map(([name]) => name)));
|
|
210
|
+
if (!picked.ok) return;
|
|
211
|
+
const resolved = require_hostArgs.resolveSubagentHostArgs(config, picked.hostArgs);
|
|
212
|
+
return resolved.ok ? require_hostArgs.getSubagentHostArgsDigest(resolved.hostArgs) : void 0;
|
|
213
|
+
}
|
|
198
214
|
function getBackgroundTaskHookSessionId(sourceHookSessionId, taskId) {
|
|
199
215
|
return `${sourceHookSessionId}:subagent-task:${taskId}`;
|
|
200
216
|
}
|
|
@@ -289,6 +305,7 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
289
305
|
executionContext;
|
|
290
306
|
langfuse;
|
|
291
307
|
tokenCounter;
|
|
308
|
+
providerTextProtection;
|
|
292
309
|
streamLimits;
|
|
293
310
|
humanInTheLoop;
|
|
294
311
|
checkpointer;
|
|
@@ -299,6 +316,7 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
299
316
|
usageSink;
|
|
300
317
|
taskConfig;
|
|
301
318
|
subagentContext;
|
|
319
|
+
onResolutionFailure;
|
|
302
320
|
executions;
|
|
303
321
|
replayCheckpointWorkflow;
|
|
304
322
|
resolveParentHandlerRegistry;
|
|
@@ -318,6 +336,7 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
318
336
|
this.langfuse = options.langfuse;
|
|
319
337
|
this.tokenCounter = options.tokenCounter;
|
|
320
338
|
this.streamLimits = options.streamLimits;
|
|
339
|
+
this.providerTextProtection = options.providerTextProtection;
|
|
321
340
|
this.humanInTheLoop = options.humanInTheLoop;
|
|
322
341
|
this.checkpointer = isCheckpointSaver(options.checkpointer) ? options.checkpointer : void 0;
|
|
323
342
|
this.executions = new require_SubagentExecutionRegistry.SubagentExecutionRegistry({
|
|
@@ -332,6 +351,7 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
332
351
|
this.usageSink = options.usageSink;
|
|
333
352
|
this.taskConfig = options.taskConfig;
|
|
334
353
|
this.subagentContext = options.subagentContext;
|
|
354
|
+
this.onResolutionFailure = options.onResolutionFailure;
|
|
335
355
|
const rawRegistry = options.parentHandlerRegistry;
|
|
336
356
|
if (typeof rawRegistry === "function") this.resolveParentHandlerRegistry = rawRegistry;
|
|
337
357
|
else if (rawRegistry != null) this.resolveParentHandlerRegistry = () => rawRegistry;
|
|
@@ -355,6 +375,13 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
355
375
|
status: "rejected",
|
|
356
376
|
message: `Unknown subagent type "${params.subagentType}".`
|
|
357
377
|
});
|
|
378
|
+
const hostArgResult = require_hostArgs.resolveSubagentHostArgs(executableConfig, params.hostArgs);
|
|
379
|
+
if (!hostArgResult.ok) return JSON.stringify({
|
|
380
|
+
status: "rejected",
|
|
381
|
+
tool: "subagent",
|
|
382
|
+
message: hostArgResult.message
|
|
383
|
+
});
|
|
384
|
+
const { hostArgs } = hostArgResult;
|
|
358
385
|
if (this.maxDepth <= 0) return JSON.stringify({
|
|
359
386
|
status: "rejected",
|
|
360
387
|
message: "Maximum subagent nesting depth exceeded."
|
|
@@ -390,13 +417,14 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
390
417
|
parentRunId: this.parentRunId,
|
|
391
418
|
...this.parentAgentId == null ? {} : { parentAgentId: this.parentAgentId },
|
|
392
419
|
parentToolCallId,
|
|
393
|
-
requestFingerprint: getBackgroundTaskFingerprint(params.description, params.subagentType, subagentThreadId),
|
|
420
|
+
requestFingerprint: getBackgroundTaskFingerprint(params.description, params.subagentType, subagentThreadId, require_hostArgs.getSubagentHostArgsDigest(hostArgs)),
|
|
394
421
|
...subagentThreadId == null || subagentThreadId === "" ? {} : { threadId: subagentThreadId },
|
|
395
422
|
input: params.description,
|
|
396
423
|
subagentKind: "kind" in executableConfig && executableConfig.kind === "graph" ? "graph" : "agent",
|
|
397
424
|
subagentType: params.subagentType,
|
|
398
425
|
run: (runtime, initialMessages) => this.executeDetached({
|
|
399
426
|
...params,
|
|
427
|
+
hostArgs,
|
|
400
428
|
...initialMessages == null ? {} : { initialMessages }
|
|
401
429
|
}, runtime, detachedHandlers, taskHookRegistry, detachedGraphFactory)
|
|
402
430
|
});
|
|
@@ -457,7 +485,9 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
457
485
|
tokenCounter: this.tokenCounter,
|
|
458
486
|
usageSink: this.usageSink,
|
|
459
487
|
subagentContext: this.subagentContext,
|
|
488
|
+
onResolutionFailure: this.onResolutionFailure,
|
|
460
489
|
streamLimits: this.streamLimits,
|
|
490
|
+
providerTextProtection: this.providerTextProtection,
|
|
461
491
|
humanInTheLoop: this.humanInTheLoop?.enabled === true || this.humanInTheLoop?.backgroundPausePolicy === "deny" ? {
|
|
462
492
|
enabled: false,
|
|
463
493
|
backgroundPausePolicy: "deny",
|
|
@@ -493,7 +523,10 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
493
523
|
deliveryAttempts += 1;
|
|
494
524
|
result = await executeAttempt();
|
|
495
525
|
}
|
|
496
|
-
if (result.error != null)
|
|
526
|
+
if (result.error != null) {
|
|
527
|
+
if (result.resolutionFailure != null) throw new require_diagnostics.SubagentResolutionError(result.resolutionFailure.phase, result.resolutionFailure.cause, result.resolutionFailure.hostArgument);
|
|
528
|
+
throw new Error(result.error);
|
|
529
|
+
}
|
|
497
530
|
if (this.humanInTheLoop?.enabled === true) {
|
|
498
531
|
const deniedTools = /* @__PURE__ */ new Set();
|
|
499
532
|
for (const message of result.messages) if (message instanceof _langchain_core_messages.ToolMessage && message.status === "error" && typeof message.content === "string" && message.content.startsWith("Blocked: Approval required for \"") && message.name != null) {
|
|
@@ -538,7 +571,8 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
538
571
|
parentToolCallId: context.parentToolCallId,
|
|
539
572
|
threadId: context.threadId,
|
|
540
573
|
signal: context.childSignal,
|
|
541
|
-
configurable: context.parentConfigurable == null ? void 0 : sanitizeResolverConfigurable(context.parentConfigurable)
|
|
574
|
+
configurable: context.parentConfigurable == null ? void 0 : sanitizeResolverConfigurable(context.parentConfigurable),
|
|
575
|
+
...context.hostArgs == null ? {} : { hostArgs: context.hostArgs }
|
|
542
576
|
}), context.childSignal).then((agentInputs) => ({
|
|
543
577
|
...config,
|
|
544
578
|
agentInputs
|
|
@@ -632,14 +666,15 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
632
666
|
approvalExecutionScope: require_SubagentExecutionRegistry.getSubagentApprovalExecutionScope(childRunId, resumeAttemptId)
|
|
633
667
|
});
|
|
634
668
|
}
|
|
635
|
-
const sourceCheckpoints = await this.getLatestCheckpointSnapshot(baseChildThreadId);
|
|
636
|
-
if (sourceCheckpoints.length === 0) throw new Error(`Cannot fork subagent checkpoint thread "${baseChildThreadId}" without a checkpoint ID.`);
|
|
637
669
|
const childRunId = persistedChildRunId ?? currentChildRunId;
|
|
638
670
|
const identity = {
|
|
639
671
|
childRunId,
|
|
640
672
|
childThreadId: branchChildThreadId,
|
|
641
673
|
approvalExecutionScope: require_SubagentExecutionRegistry.getSubagentApprovalExecutionScope(childRunId, resumeAttemptId)
|
|
642
674
|
};
|
|
675
|
+
execution.recordIdentityAttempt(identity);
|
|
676
|
+
const sourceCheckpoints = await this.getLatestCheckpointSnapshot(baseChildThreadId);
|
|
677
|
+
if (sourceCheckpoints.length === 0) throw new Error(`Cannot fork subagent checkpoint thread "${baseChildThreadId}" without a checkpoint ID.`);
|
|
643
678
|
const lease = this.executions.beginIdentityPreparation(execution, identity);
|
|
644
679
|
await this.prepareCheckpointFork(sourceCheckpoints, branchChildThreadId, lease);
|
|
645
680
|
return {
|
|
@@ -745,7 +780,7 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
745
780
|
if (this.checkpointer == null) return;
|
|
746
781
|
const executions = [];
|
|
747
782
|
for (const record of records) {
|
|
748
|
-
const { identity, binding, activeRun } = record.snapshot;
|
|
783
|
+
const { identity, binding, invocation, activeRun } = record.snapshot;
|
|
749
784
|
if (identity == null) continue;
|
|
750
785
|
const { parentToolCallId } = record.address;
|
|
751
786
|
const checkpoints = await this.getLatestCheckpointSnapshot(identity.childThreadId);
|
|
@@ -766,6 +801,7 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
766
801
|
childRunId: identity.childRunId,
|
|
767
802
|
...binding?.subagentType == null ? {} : { subagentType: binding.subagentType },
|
|
768
803
|
...binding?.configId == null ? {} : { configId: binding.configId },
|
|
804
|
+
...invocation?.hostArgsDigest == null ? {} : { hostArgsDigest: invocation.hostArgsDigest },
|
|
769
805
|
approvalExecutionScope: identity.approvalExecutionScope,
|
|
770
806
|
checkpoints,
|
|
771
807
|
graphState,
|
|
@@ -833,7 +869,8 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
833
869
|
}
|
|
834
870
|
async getSettledToolOutput(call, config) {
|
|
835
871
|
const parentToolCallId = call.id;
|
|
836
|
-
|
|
872
|
+
const checkpointer = this.checkpointer;
|
|
873
|
+
if (this.humanInTheLoop?.enabled !== true || checkpointer == null || parentToolCallId == null || parentToolCallId === "") return;
|
|
837
874
|
const parentConfigurable = config.configurable;
|
|
838
875
|
const threadId = parentConfigurable?.thread_id;
|
|
839
876
|
const execution = this.executions.open({
|
|
@@ -841,6 +878,25 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
841
878
|
parentToolCallId,
|
|
842
879
|
parentConfigurable
|
|
843
880
|
});
|
|
881
|
+
const signal = this.getReplaySignal(config);
|
|
882
|
+
try {
|
|
883
|
+
return await this.restoreSettledToolOutput(call, parentConfigurable, parentToolCallId, execution, checkpointer);
|
|
884
|
+
} catch (error) {
|
|
885
|
+
if (isSubagentResolutionControlFlow(error)) throw error;
|
|
886
|
+
const failure = this.createReplayResolutionError(call, config, execution, signal, error);
|
|
887
|
+
if (signal.aborted) throw failure;
|
|
888
|
+
return {
|
|
889
|
+
output: new _langchain_core_messages.ToolMessage({
|
|
890
|
+
content: failure.message,
|
|
891
|
+
name: call.name,
|
|
892
|
+
tool_call_id: parentToolCallId,
|
|
893
|
+
status: "error"
|
|
894
|
+
}),
|
|
895
|
+
additionalContexts: []
|
|
896
|
+
};
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
async restoreSettledToolOutput(call, parentConfigurable, parentToolCallId, execution, checkpointer) {
|
|
844
900
|
const { resumeExecution } = execution;
|
|
845
901
|
const inProcessSettledOutput = execution.settledOutput;
|
|
846
902
|
if (inProcessSettledOutput != null) {
|
|
@@ -862,7 +918,7 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
862
918
|
}
|
|
863
919
|
const { childThreadId } = await this.resolveChildExecutionIdentity(execution);
|
|
864
920
|
if (marker == null) {
|
|
865
|
-
messages = getCheckpointMessages((await
|
|
921
|
+
messages = getCheckpointMessages((await checkpointer.getTuple({ configurable: { thread_id: childThreadId } }))?.checkpoint.channel_values.messages);
|
|
866
922
|
marker = getSubagentCheckpointMarker(messages, parentToolCallId);
|
|
867
923
|
persistedSubagentType = getSubagentTypeFromArgs(marker?.settledOutput?.resolvedArgs);
|
|
868
924
|
if (persistedSubagentType != null) {
|
|
@@ -902,6 +958,8 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
902
958
|
const resolvedDescription = getSubagentDescriptionFromArgs(settled.resolvedArgs);
|
|
903
959
|
const boundInvocation = execution.invocation;
|
|
904
960
|
if (boundInvocation != null && resolvedDescription != null && resolvedDescription !== boundInvocation.description) return;
|
|
961
|
+
const resolvedHostArgsDigest = settled.resolvedArgs == null ? void 0 : getHostArgsDigestFromArgs(this.configs.get(resolvedSubagentType ?? execution.binding?.subagentType ?? ""), settled.resolvedArgs);
|
|
962
|
+
if (boundInvocation != null && settled.resolvedArgs != null && resolvedHostArgsDigest !== boundInvocation.hostArgsDigest) return;
|
|
905
963
|
const description = boundInvocation?.description ?? resolvedDescription ?? getSubagentDescriptionFromArgs(call.args) ?? "No task description provided";
|
|
906
964
|
const subagentType = resolvedSubagentType ?? execution.binding?.subagentType ?? getSubagentType(call);
|
|
907
965
|
const executableConfig = subagentType == null ? void 0 : this.configs.get(subagentType);
|
|
@@ -912,10 +970,12 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
912
970
|
return;
|
|
913
971
|
}
|
|
914
972
|
const persistedOutput = serializeToolOutput(settled);
|
|
973
|
+
const hostArgsDigest = settled.resolvedArgs == null ? getHostArgsDigestFromArgs(executableConfig, call.args) : resolvedHostArgsDigest;
|
|
915
974
|
const invocation = boundInvocation ?? {
|
|
916
975
|
description,
|
|
917
976
|
subagentType,
|
|
918
|
-
...configId == null ? {} : { configId }
|
|
977
|
+
...configId == null ? {} : { configId },
|
|
978
|
+
...hostArgsDigest == null ? {} : { hostArgsDigest }
|
|
919
979
|
};
|
|
920
980
|
try {
|
|
921
981
|
await execution.settle({
|
|
@@ -925,7 +985,14 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
925
985
|
subagentType,
|
|
926
986
|
...configId == null ? {} : { configId }
|
|
927
987
|
}, persistedOutput, async () => {
|
|
928
|
-
|
|
988
|
+
let identity;
|
|
989
|
+
try {
|
|
990
|
+
identity = await this.resolveChildExecutionIdentity(execution);
|
|
991
|
+
} catch (error) {
|
|
992
|
+
if (isSubagentResolutionControlFlow(error)) throw error;
|
|
993
|
+
throw this.createReplayResolutionError(call, config, execution, this.getReplaySignal(config), error);
|
|
994
|
+
}
|
|
995
|
+
const { childRunId, childThreadId } = identity;
|
|
929
996
|
const activeChildRun = execution.activeRun;
|
|
930
997
|
if (activeChildRun != null) {
|
|
931
998
|
await this.persistChildCheckpointMarker(activeChildRun, parentToolCallId, persistedOutput);
|
|
@@ -964,6 +1031,10 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
964
1031
|
const available = [...this.configs.keys()].join(", ");
|
|
965
1032
|
return Promise.resolve(createSubagentFailure(`Error: Unknown subagent type "${params.subagentType}". Available types: ${available}`));
|
|
966
1033
|
}
|
|
1034
|
+
const hostArgResult = require_hostArgs.resolveSubagentHostArgs(executableConfig, params.hostArgs);
|
|
1035
|
+
if (!hostArgResult.ok) return Promise.resolve(createSubagentFailure(hostArgResult.message));
|
|
1036
|
+
const { hostArgs } = hostArgResult;
|
|
1037
|
+
const hostArgsDigest = require_hostArgs.getSubagentHostArgsDigest(hostArgs);
|
|
967
1038
|
if (this.maxDepth <= 0) return Promise.resolve(createSubagentFailure("Error: Maximum subagent nesting depth exceeded."));
|
|
968
1039
|
if (require_childGraphConfig.isGraphSubagentConfig(executableConfig) && this.humanInTheLoop?.enabled === true) return Promise.resolve(createSubagentFailure("Error: Human-in-the-loop execution is not yet supported for graph subagents."));
|
|
969
1040
|
if (this.humanInTheLoop?.enabled === true && (params.parentToolCallId == null || params.parentToolCallId === "")) return Promise.resolve(createSubagentFailure("Error: Resumable subagent execution requires a parent tool call ID."));
|
|
@@ -976,14 +1047,61 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
976
1047
|
return execution.execute({
|
|
977
1048
|
description: params.description,
|
|
978
1049
|
subagentType: params.subagentType,
|
|
979
|
-
...executableConfig.configId == null ? {} : { configId: executableConfig.configId }
|
|
980
|
-
|
|
1050
|
+
...executableConfig.configId == null ? {} : { configId: executableConfig.configId },
|
|
1051
|
+
...hostArgsDigest == null ? {} : { hostArgsDigest }
|
|
1052
|
+
}, () => this.executeOnce({
|
|
1053
|
+
...params,
|
|
1054
|
+
hostArgs
|
|
1055
|
+
}, execution, executableConfig));
|
|
981
1056
|
} catch (error) {
|
|
982
1057
|
if (error instanceof require_SubagentExecutionRegistry.SubagentDefinitionBindingError) return Promise.resolve(createSubagentFailure(SUBAGENT_CONFIG_CHANGED_MESSAGE));
|
|
983
1058
|
if (error instanceof require_SubagentExecutionRegistry.SubagentInvocationBindingError) return Promise.resolve(createSubagentFailure(SUBAGENT_INVOCATION_CHANGED_MESSAGE));
|
|
984
1059
|
throw error;
|
|
985
1060
|
}
|
|
986
1061
|
}
|
|
1062
|
+
getReplaySignal(config) {
|
|
1063
|
+
const scope = config.configurable?.[require_streamLimits.RUN_BREAKER_SCOPE_CONFIG_KEY];
|
|
1064
|
+
return this.composeChildSignal(scope?.controller ?? this.resolveBreakerController(), config.signal);
|
|
1065
|
+
}
|
|
1066
|
+
createReplayResolutionError(call, config, execution, signal, error) {
|
|
1067
|
+
const selectedType = execution.binding?.subagentType ?? execution.resumeExecution?.subagentType ?? getSubagentType(call);
|
|
1068
|
+
const threadId = config.configurable?.thread_id;
|
|
1069
|
+
return new require_diagnostics.SubagentResolutionError("identity", this.createResolutionFailure("identity", {
|
|
1070
|
+
subagentType: selectedType == null ? "unknown" : this.configs.get(selectedType)?.type ?? "unknown",
|
|
1071
|
+
description: "No task description provided",
|
|
1072
|
+
parentToolCallId: call.id,
|
|
1073
|
+
threadId: typeof threadId === "string" ? threadId : void 0
|
|
1074
|
+
}, execution, signal, error).resolutionFailure?.cause ?? "unknown");
|
|
1075
|
+
}
|
|
1076
|
+
createResolutionFailure(phase, params, execution, signal, error) {
|
|
1077
|
+
const identity = execution.identity ?? execution.attemptedIdentity;
|
|
1078
|
+
const resumeExecution = this.humanInTheLoop?.enabled === true && this.checkpointer != null ? execution.resumeExecution : void 0;
|
|
1079
|
+
const detail = require_diagnostics.logSubagentResolutionFailure(phase, params.subagentType, signal, error, {
|
|
1080
|
+
parentRunId: this.parentRunId,
|
|
1081
|
+
parentAgentId: this.parentAgentId,
|
|
1082
|
+
parentToolCallId: params.parentToolCallId,
|
|
1083
|
+
threadId: params.threadId,
|
|
1084
|
+
childRunId: identity?.childRunId ?? resumeExecution?.childRunId ?? execution.address.currentChildRunId,
|
|
1085
|
+
childThreadId: identity?.childThreadId ?? (resumeExecution == null ? execution.address.baseChildThreadId : execution.address.branchChildThreadId),
|
|
1086
|
+
taskId: params.taskRuntime?.taskId
|
|
1087
|
+
}, this.onResolutionFailure, params.hostArgs);
|
|
1088
|
+
const hostArgument = phase === "config" ? require_diagnostics.getSubagentHostArgumentFailure(error, params.hostArgs) : void 0;
|
|
1089
|
+
if (hostArgument != null) return {
|
|
1090
|
+
...createSubagentFailure(require_diagnostics.getSubagentHostArgumentFailureMessage(hostArgument)),
|
|
1091
|
+
resolutionFailure: {
|
|
1092
|
+
phase,
|
|
1093
|
+
cause: detail.cause,
|
|
1094
|
+
hostArgument
|
|
1095
|
+
}
|
|
1096
|
+
};
|
|
1097
|
+
return {
|
|
1098
|
+
...createSubagentFailure(detail.message),
|
|
1099
|
+
resolutionFailure: {
|
|
1100
|
+
phase,
|
|
1101
|
+
cause: detail.cause
|
|
1102
|
+
}
|
|
1103
|
+
};
|
|
1104
|
+
}
|
|
987
1105
|
async executeOnce(params, execution, executableConfig) {
|
|
988
1106
|
const { description, subagentType, threadId, parentToolCallId } = params;
|
|
989
1107
|
const childBreaker = params.breaker ?? this.resolveBreakerController();
|
|
@@ -994,14 +1112,17 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
994
1112
|
this.executions.remove(execution);
|
|
995
1113
|
return createSubagentFailure(SUBAGENT_CONFIG_CHANGED_MESSAGE);
|
|
996
1114
|
}
|
|
1115
|
+
if (resumeExecution != null && resumeExecution.hostArgsDigest !== require_hostArgs.getSubagentHostArgsDigest(params.hostArgs)) {
|
|
1116
|
+
this.executions.remove(execution);
|
|
1117
|
+
return createSubagentFailure(SUBAGENT_INVOCATION_CHANGED_MESSAGE);
|
|
1118
|
+
}
|
|
997
1119
|
let identity;
|
|
998
1120
|
try {
|
|
999
1121
|
identity = await this.resolveChildExecutionIdentity(execution);
|
|
1000
1122
|
execution.assertUsable(childSignal);
|
|
1001
1123
|
} catch (error) {
|
|
1002
|
-
if (error
|
|
1003
|
-
|
|
1004
|
-
return createSubagentFailure(SUBAGENT_RESOLUTION_ERROR_MESSAGE);
|
|
1124
|
+
if (isSubagentResolutionControlFlow(error)) throw error;
|
|
1125
|
+
return this.createResolutionFailure("identity", params, execution, childSignal, error);
|
|
1005
1126
|
}
|
|
1006
1127
|
const { childRunId, childThreadId, approvalExecutionScope } = identity;
|
|
1007
1128
|
if (!this.bindExecutionDefinition(execution, {
|
|
@@ -1015,13 +1136,13 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
1015
1136
|
childSignal,
|
|
1016
1137
|
threadId,
|
|
1017
1138
|
parentToolCallId,
|
|
1018
|
-
parentConfigurable: params.parentConfigurable
|
|
1139
|
+
parentConfigurable: params.parentConfigurable,
|
|
1140
|
+
hostArgs: params.hostArgs
|
|
1019
1141
|
});
|
|
1020
1142
|
execution.assertUsable(childSignal);
|
|
1021
1143
|
} catch (error) {
|
|
1022
|
-
if (error
|
|
1023
|
-
|
|
1024
|
-
return createSubagentFailure(SUBAGENT_RESOLUTION_ERROR_MESSAGE);
|
|
1144
|
+
if (isSubagentResolutionControlFlow(error)) throw error;
|
|
1145
|
+
return this.createResolutionFailure("config", params, execution, childSignal, error);
|
|
1025
1146
|
}
|
|
1026
1147
|
const parentRegistry = this.getParentHandlerRegistry();
|
|
1027
1148
|
const forwardingEnabled = parentRegistry != null;
|
|
@@ -1095,9 +1216,11 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
1095
1216
|
langfuse: this.langfuse,
|
|
1096
1217
|
tokenCounter: this.tokenCounter,
|
|
1097
1218
|
streamLimits: this.streamLimits,
|
|
1219
|
+
providerTextProtection: this.providerTextProtection,
|
|
1098
1220
|
subagentScope: true,
|
|
1099
1221
|
subagentExecutionContext: childExecutionContext,
|
|
1100
1222
|
subagentContext: this.subagentContext,
|
|
1223
|
+
onSubagentResolutionFailure: this.onResolutionFailure,
|
|
1101
1224
|
...resumeExecution?.graphState.fadingTier == null ? {} : { fadingTier: resumeExecution.graphState.fadingTier },
|
|
1102
1225
|
...resumeExecution?.graphState.fadingTiers == null ? {} : { fadingTiers: resumeExecution.graphState.fadingTiers },
|
|
1103
1226
|
subagentUsageSink,
|
|
@@ -1316,7 +1439,7 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
1316
1439
|
parent_tool_call_id: parentToolCallId
|
|
1317
1440
|
}, resumeManifest));
|
|
1318
1441
|
}
|
|
1319
|
-
if (error instanceof require_streamLimits.StreamLimitExceededError) childBreaker.abort(error);
|
|
1442
|
+
if (error instanceof require_streamLimits.StreamLimitExceededError || error instanceof require_providerText.ProviderTextProtectionError) childBreaker.abort(error);
|
|
1320
1443
|
const errorMessage = truncateErrorMessage(error);
|
|
1321
1444
|
await this.closeChildRunSteps(childGraph, abortedBeforeError ? "cancelled" : "failed", childTerminalAt);
|
|
1322
1445
|
if (forwarding) {
|
|
@@ -1335,7 +1458,7 @@ var SubagentExecutor = class SubagentExecutor {
|
|
|
1335
1458
|
}
|
|
1336
1459
|
this.clearChildGraph(childGraph);
|
|
1337
1460
|
execution.markFailed();
|
|
1338
|
-
if (error instanceof require_streamLimits.StreamLimitExceededError) throw error;
|
|
1461
|
+
if (error instanceof require_streamLimits.StreamLimitExceededError || error instanceof require_providerText.ProviderTextProtectionError) throw error;
|
|
1339
1462
|
return createSubagentFailure(`Subagent error: ${errorMessage}`, errorMessage);
|
|
1340
1463
|
}
|
|
1341
1464
|
const childTerminalAt = Date.now();
|