@librechat/agents 3.4.0 → 3.4.1
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 +111 -27
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/hooks/HookRegistry.cjs +83 -0
- package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
- package/dist/cjs/hooks/executeHooks.cjs +60 -14
- package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
- package/dist/cjs/hooks/index.cjs.map +1 -1
- package/dist/cjs/hooks/types.cjs +2 -0
- package/dist/cjs/hooks/types.cjs.map +1 -1
- package/dist/cjs/llm/init.cjs +3 -3
- package/dist/cjs/llm/invoke.cjs +2 -2
- package/dist/cjs/main.cjs +14 -13
- package/dist/cjs/messages/format.cjs +40 -23
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/run.cjs +82 -15
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/session/AgentSession.cjs +37 -2
- package/dist/cjs/session/AgentSession.cjs.map +1 -1
- package/dist/cjs/stream.cjs +1 -1
- package/dist/cjs/summarization/node.cjs +6 -3
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/BashExecutor.cjs +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +1 -1
- package/dist/cjs/tools/ToolNode.cjs +316 -94
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/ToolSearch.cjs +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +630 -78
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentReplay.cjs +175 -0
- package/dist/cjs/tools/subagent/SubagentReplay.cjs.map +1 -0
- package/dist/cjs/tools/toolOutputReferences.cjs +20 -0
- package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
- package/dist/cjs/utils/index.cjs +2 -2
- package/dist/esm/graphs/Graph.mjs +111 -27
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/hooks/HookRegistry.mjs +83 -0
- package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
- package/dist/esm/hooks/executeHooks.mjs +60 -14
- package/dist/esm/hooks/executeHooks.mjs.map +1 -1
- package/dist/esm/hooks/index.mjs.map +1 -1
- package/dist/esm/hooks/types.mjs +2 -1
- package/dist/esm/hooks/types.mjs.map +1 -1
- package/dist/esm/llm/init.mjs +1 -1
- package/dist/esm/llm/invoke.mjs +2 -2
- package/dist/esm/main.mjs +11 -11
- package/dist/esm/messages/format.mjs +40 -23
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/run.mjs +83 -16
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/session/AgentSession.mjs +37 -2
- package/dist/esm/session/AgentSession.mjs.map +1 -1
- package/dist/esm/stream.mjs +1 -1
- package/dist/esm/summarization/node.mjs +6 -3
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/BashExecutor.mjs +1 -1
- package/dist/esm/tools/CodeExecutor.mjs +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +1 -1
- package/dist/esm/tools/ToolNode.mjs +317 -95
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/ToolSearch.mjs +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +631 -79
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentReplay.mjs +168 -0
- package/dist/esm/tools/subagent/SubagentReplay.mjs.map +1 -0
- package/dist/esm/tools/toolOutputReferences.mjs +20 -0
- package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
- package/dist/esm/utils/index.mjs +2 -2
- package/dist/types/graphs/Graph.d.ts +16 -1
- package/dist/types/hooks/HookRegistry.d.ts +10 -1
- package/dist/types/hooks/executeHooks.d.ts +5 -1
- package/dist/types/hooks/index.d.ts +2 -2
- package/dist/types/hooks/types.d.ts +12 -0
- package/dist/types/run.d.ts +4 -1
- package/dist/types/session/AgentSession.d.ts +1 -0
- package/dist/types/tools/ToolNode.d.ts +23 -15
- package/dist/types/tools/subagent/SubagentExecutor.d.ts +46 -7
- package/dist/types/tools/subagent/SubagentReplay.d.ts +81 -0
- package/dist/types/tools/toolOutputReferences.d.ts +12 -0
- package/dist/types/types/graph.d.ts +5 -5
- package/dist/types/types/hitl.d.ts +15 -0
- package/package.json +6 -2
- package/src/graphs/Graph.ts +246 -52
- package/src/graphs/__tests__/Graph.breakerLifecycle.test.ts +48 -9
- package/src/graphs/__tests__/Graph.contextOverflow.test.ts +1 -1
- package/src/graphs/__tests__/Graph.subagentResumeState.test.ts +80 -0
- package/src/hooks/HookRegistry.ts +151 -1
- package/src/hooks/__tests__/HookRegistry.test.ts +96 -0
- package/src/hooks/__tests__/executeHooks.test.ts +160 -0
- package/src/hooks/executeHooks.ts +133 -15
- package/src/hooks/index.ts +3 -1
- package/src/hooks/types.ts +16 -0
- package/src/messages/format.ts +54 -26
- package/src/messages/formatAgentMessages.reducer.test.ts +162 -0
- package/src/messages/formatAgentMessages.steer.test.ts +16 -11
- package/src/messages/formatAgentMessages.test.ts +7 -2
- package/src/run.ts +164 -18
- package/src/session/AgentSession.ts +52 -2
- package/src/session/__tests__/JsonlSessionStore.test.ts +53 -0
- package/src/summarization/__tests__/node.test.ts +32 -14
- package/src/summarization/node.ts +15 -11
- package/src/tools/ToolNode.ts +631 -157
- package/src/tools/__tests__/SubagentExecutor.test.ts +542 -6
- package/src/tools/__tests__/SubagentReplay.test.ts +300 -0
- package/src/tools/__tests__/ToolNode.breakerSignal.test.ts +208 -2
- package/src/tools/__tests__/directToolHITLResumeScope.test.ts +486 -2
- package/src/tools/__tests__/hitl.test.ts +234 -5
- package/src/tools/__tests__/subagentHooks.test.ts +1040 -62
- package/src/tools/__tests__/toolOutputReferences.test.ts +19 -2
- package/src/tools/subagent/SubagentExecutor.ts +1369 -131
- package/src/tools/subagent/SubagentReplay.ts +575 -0
- package/src/tools/toolOutputReferences.ts +40 -1
- package/src/types/graph.ts +5 -5
- package/src/types/hitl.ts +16 -0
package/dist/cjs/main.cjs
CHANGED
|
@@ -22,25 +22,25 @@ const require_handoffCue = require("./messages/handoffCue.cjs");
|
|
|
22
22
|
const require_reducer = require("./messages/reducer.cjs");
|
|
23
23
|
const require_recency = require("./messages/recency.cjs");
|
|
24
24
|
require("./messages/index.cjs");
|
|
25
|
+
const require_graph = require("./utils/graph.cjs");
|
|
26
|
+
const require_llm = require("./utils/llm.cjs");
|
|
27
|
+
const require_proxy = require("./utils/proxy.cjs");
|
|
25
28
|
const require_handlers = require("./tools/handlers.cjs");
|
|
26
29
|
const require_streamLimits = require("./llm/streamLimits.cjs");
|
|
27
30
|
const require_intentArg = require("./tools/intentArg.cjs");
|
|
28
|
-
const require_llm = require("./utils/llm.cjs");
|
|
29
31
|
const require_stream = require("./stream.cjs");
|
|
30
|
-
const require_smoother = require("./llm/stream/smoother.cjs");
|
|
31
|
-
const require_index$2 = require("./llm/mistral/index.cjs");
|
|
32
|
-
const require_index$3 = require("./llm/openai/index.cjs");
|
|
33
|
-
const require_index$4 = require("./llm/openrouter/index.cjs");
|
|
34
|
-
const require_providers = require("./llm/providers.cjs");
|
|
35
|
-
const require_errors = require("./utils/errors.cjs");
|
|
36
|
-
const require_preempt = require("./llm/preempt.cjs");
|
|
37
|
-
const require_graph = require("./utils/graph.cjs");
|
|
38
|
-
const require_proxy = require("./utils/proxy.cjs");
|
|
39
32
|
const require_events = require("./events.cjs");
|
|
40
33
|
const require_handlers$1 = require("./utils/handlers.cjs");
|
|
41
34
|
const require_run = require("./utils/run.cjs");
|
|
42
35
|
const require_schema = require("./utils/schema.cjs");
|
|
36
|
+
const require_errors = require("./utils/errors.cjs");
|
|
43
37
|
require("./utils/index.cjs");
|
|
38
|
+
const require_smoother = require("./llm/stream/smoother.cjs");
|
|
39
|
+
const require_index$3 = require("./llm/mistral/index.cjs");
|
|
40
|
+
const require_index$4 = require("./llm/openai/index.cjs");
|
|
41
|
+
const require_index$5 = require("./llm/openrouter/index.cjs");
|
|
42
|
+
const require_providers = require("./llm/providers.cjs");
|
|
43
|
+
const require_preempt = require("./llm/preempt.cjs");
|
|
44
44
|
const require_init = require("./llm/init.cjs");
|
|
45
45
|
const require_invoke = require("./llm/invoke.cjs");
|
|
46
46
|
const require_bashAst = require("./tools/local/bashAst.cjs");
|
|
@@ -167,7 +167,7 @@ exports.CalculatorToolDescription = require_Calculator.CalculatorToolDescription
|
|
|
167
167
|
exports.CalculatorToolName = require_Calculator.CalculatorToolName;
|
|
168
168
|
exports.Callback = require_enum.Callback;
|
|
169
169
|
exports.ChatModelStreamHandler = require_stream.ChatModelStreamHandler;
|
|
170
|
-
exports.ChatOpenRouter = require_index$
|
|
170
|
+
exports.ChatOpenRouter = require_index$5.ChatOpenRouter;
|
|
171
171
|
exports.CloudflareBashExecutionToolDescription = require_CloudflareSandboxTools.CloudflareBashExecutionToolDescription;
|
|
172
172
|
exports.CloudflareCodeExecutionToolDescription = require_CloudflareSandboxTools.CloudflareCodeExecutionToolDescription;
|
|
173
173
|
exports.CodeApiRequestError = require_CodeExecutor.CodeApiRequestError;
|
|
@@ -185,8 +185,8 @@ exports.CommonEvents = require_enum.CommonEvents;
|
|
|
185
185
|
exports.CompileCheckToolName = require_CompileCheckTool.CompileCheckToolName;
|
|
186
186
|
exports.Constants = require_enum.Constants;
|
|
187
187
|
exports.ContentTypes = require_enum.ContentTypes;
|
|
188
|
-
exports.CustomChatMistralAI = require_index$
|
|
189
|
-
exports.CustomOpenAIClient = require_index$
|
|
188
|
+
exports.CustomChatMistralAI = require_index$3.CustomChatMistralAI;
|
|
189
|
+
exports.CustomOpenAIClient = require_index$4.CustomOpenAIClient;
|
|
190
190
|
exports.DATE_RANGE = require_schema$2.DATE_RANGE;
|
|
191
191
|
exports.DEFAULT_CONTEXT_PRUNING_SETTINGS = require_contextPruningSettings.DEFAULT_CONTEXT_PRUNING_SETTINGS;
|
|
192
192
|
exports.DEFAULT_COUNTRY_DESCRIPTION = require_schema$2.DEFAULT_COUNTRY_DESCRIPTION;
|
|
@@ -338,6 +338,7 @@ Object.defineProperty(exports, "SystemMessage", {
|
|
|
338
338
|
}
|
|
339
339
|
});
|
|
340
340
|
exports.TMP_SCRATCH_OUTPUT_REMINDER = require_CodeExecutor.TMP_SCRATCH_OUTPUT_REMINDER;
|
|
341
|
+
exports.TOOL_APPROVAL_EXECUTION_SCOPE_CONFIG_KEY = require_types.TOOL_APPROVAL_EXECUTION_SCOPE_CONFIG_KEY;
|
|
341
342
|
exports.TestChatStreamHandler = require_events.TestChatStreamHandler;
|
|
342
343
|
exports.TestLLMStreamHandler = require_events.TestLLMStreamHandler;
|
|
343
344
|
exports.TitleMethod = require_enum.TitleMethod;
|
|
@@ -202,6 +202,10 @@ function endsWithSteerMessage(formatted) {
|
|
|
202
202
|
*/
|
|
203
203
|
function formatAssistantMessage(message, options) {
|
|
204
204
|
const formattedMessages = [];
|
|
205
|
+
const appendFormattedMessage = (formattedMessage) => {
|
|
206
|
+
stampSourceMessageIdentity(formattedMessage, options?.sourceMessageId, formattedMessages.length);
|
|
207
|
+
formattedMessages.push(formattedMessage);
|
|
208
|
+
};
|
|
205
209
|
let currentContent = [];
|
|
206
210
|
let lastAIMessage = null;
|
|
207
211
|
let hasReasoning = false;
|
|
@@ -270,7 +274,7 @@ function formatAssistantMessage(message, options) {
|
|
|
270
274
|
if (currentContent.some((content) => content.type !== "text")) {
|
|
271
275
|
currentContent.push(part);
|
|
272
276
|
lastAIMessage = createAIMessage(require_langchain.toLangChainContent(currentContent));
|
|
273
|
-
|
|
277
|
+
appendFormattedMessage(lastAIMessage);
|
|
274
278
|
currentContent = [];
|
|
275
279
|
continue;
|
|
276
280
|
}
|
|
@@ -280,12 +284,12 @@ function formatAssistantMessage(message, options) {
|
|
|
280
284
|
}, "");
|
|
281
285
|
content = `${content}\n${getTextContent(part)}`.trim();
|
|
282
286
|
lastAIMessage = createAIMessage(content);
|
|
283
|
-
|
|
287
|
+
appendFormattedMessage(lastAIMessage);
|
|
284
288
|
currentContent = [];
|
|
285
289
|
continue;
|
|
286
290
|
}
|
|
287
291
|
lastAIMessage = createAIMessage(getTextContent(part));
|
|
288
|
-
|
|
292
|
+
appendFormattedMessage(lastAIMessage);
|
|
289
293
|
} else if (part.type === "tool_call") {
|
|
290
294
|
if (part.tool_call == null) continue;
|
|
291
295
|
const toolCallId = getToolCallId(part);
|
|
@@ -305,7 +309,7 @@ function formatAssistantMessage(message, options) {
|
|
|
305
309
|
}
|
|
306
310
|
if (!lastAIMessage) {
|
|
307
311
|
lastAIMessage = createAIMessage("");
|
|
308
|
-
|
|
312
|
+
appendFormattedMessage(lastAIMessage);
|
|
309
313
|
} else attachPendingReasoningContent(lastAIMessage);
|
|
310
314
|
const tool_call = _tool_call;
|
|
311
315
|
let args = _args;
|
|
@@ -328,7 +332,7 @@ function formatAssistantMessage(message, options) {
|
|
|
328
332
|
if (!lastAIMessage.tool_calls) lastAIMessage.tool_calls = [];
|
|
329
333
|
lastAIMessage.tool_calls.push(tool_call);
|
|
330
334
|
}
|
|
331
|
-
|
|
335
|
+
appendFormattedMessage(withMessageRole(new _langchain_core_messages.ToolMessage({
|
|
332
336
|
tool_call_id: tool_call.id ?? "",
|
|
333
337
|
name: tool_call.name,
|
|
334
338
|
content: formatToolCallOutput(output)
|
|
@@ -341,12 +345,12 @@ function formatAssistantMessage(message, options) {
|
|
|
341
345
|
if (currentContent.length > 0) {
|
|
342
346
|
if (currentContent.some((content) => content.type !== "text")) {
|
|
343
347
|
lastAIMessage = createAIMessage(require_langchain.toLangChainContent(currentContent));
|
|
344
|
-
|
|
348
|
+
appendFormattedMessage(lastAIMessage);
|
|
345
349
|
} else {
|
|
346
350
|
const flushed = currentContent.reduce((acc, curr) => `${acc}${getTextContent(curr)}\n`, "").trim();
|
|
347
351
|
if (flushed.length > 0) {
|
|
348
352
|
lastAIMessage = createAIMessage(flushed);
|
|
349
|
-
|
|
353
|
+
appendFormattedMessage(lastAIMessage);
|
|
350
354
|
}
|
|
351
355
|
}
|
|
352
356
|
currentContent = [];
|
|
@@ -359,12 +363,11 @@ function formatAssistantMessage(message, options) {
|
|
|
359
363
|
* assistant reasoning silently vanishes on replay.
|
|
360
364
|
*/
|
|
361
365
|
lastAIMessage = createAIMessage("");
|
|
362
|
-
|
|
366
|
+
appendFormattedMessage(lastAIMessage);
|
|
363
367
|
}
|
|
364
368
|
const steerPart = part;
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
content: steerContent,
|
|
369
|
+
appendFormattedMessage(withMessageRole(new _langchain_core_messages.HumanMessage({
|
|
370
|
+
content: Array.isArray(steerPart.media) && steerPart.media.length > 0 ? require_langchain.toLangChainContent(steerPart.media) : steerPart.steer ?? "",
|
|
368
371
|
additional_kwargs: {
|
|
369
372
|
role: "user",
|
|
370
373
|
source: "steer"
|
|
@@ -388,14 +391,14 @@ function formatAssistantMessage(message, options) {
|
|
|
388
391
|
let content = "";
|
|
389
392
|
for (const part of currentContent) {
|
|
390
393
|
if (part.type !== "text") {
|
|
391
|
-
|
|
394
|
+
appendFormattedMessage(createAIMessage(require_langchain.toLangChainContent(currentContent)));
|
|
392
395
|
return formattedMessages;
|
|
393
396
|
}
|
|
394
397
|
content += `${getTextContent(part)}\n`;
|
|
395
398
|
}
|
|
396
399
|
content = content.trim();
|
|
397
|
-
if (content)
|
|
398
|
-
} else if (currentContent.length > 0)
|
|
400
|
+
if (content) appendFormattedMessage(createAIMessage(content));
|
|
401
|
+
} else if (currentContent.length > 0) appendFormattedMessage(createAIMessage(require_langchain.toLangChainContent(currentContent)));
|
|
399
402
|
return formattedMessages;
|
|
400
403
|
}
|
|
401
404
|
function getSourceMessageId(message) {
|
|
@@ -405,6 +408,20 @@ function getSourceMessageId(message) {
|
|
|
405
408
|
return normalized.length > 0 ? normalized : void 0;
|
|
406
409
|
}
|
|
407
410
|
/**
|
|
411
|
+
* Keeps the first formatted message backward-compatible with its persisted
|
|
412
|
+
* source id and preserves source correlation on every derived message.
|
|
413
|
+
* Derived ids remain unset so the reducer can assign collision-free identities
|
|
414
|
+
* during its existing pass. This also prevents invented provider-shaped ids
|
|
415
|
+
* from leaking into provider request payloads.
|
|
416
|
+
*/
|
|
417
|
+
function stampSourceMessageIdentity(message, sourceMessageId, derivedIndex = 0) {
|
|
418
|
+
if (sourceMessageId == null) return;
|
|
419
|
+
message.additional_kwargs.sourceMessageId = sourceMessageId;
|
|
420
|
+
if (derivedIndex !== 0) return;
|
|
421
|
+
message.id = sourceMessageId;
|
|
422
|
+
message.lc_kwargs.id = sourceMessageId;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
408
425
|
* Labels all agent content for parallel patterns (fan-out/fan-in)
|
|
409
426
|
* Groups consecutive content by agent and wraps with clear labels
|
|
410
427
|
*/
|
|
@@ -748,7 +765,7 @@ const formatAgentMessages = (payload, indexTokenCountMap, tools, skills, options
|
|
|
748
765
|
message,
|
|
749
766
|
langChain: true
|
|
750
767
|
});
|
|
751
|
-
|
|
768
|
+
stampSourceMessageIdentity(formattedMessage, sourceMessageId);
|
|
752
769
|
flushSteerAnchor(formattedMessage);
|
|
753
770
|
messages.push(formattedMessage);
|
|
754
771
|
indexMapping[i] = [messages.length - 1];
|
|
@@ -850,9 +867,9 @@ const formatAgentMessages = (payload, indexTokenCountMap, tools, skills, options
|
|
|
850
867
|
const formattedMessages = formatAssistantMessage(processedMessage, {
|
|
851
868
|
preserveUnpairedServerToolUses: i === payload.length - 1,
|
|
852
869
|
preserveReasoningContent: options?.preserveReasoningContent ?? options?.provider === "deepseek",
|
|
853
|
-
provider: options?.provider
|
|
870
|
+
provider: options?.provider,
|
|
871
|
+
sourceMessageId
|
|
854
872
|
});
|
|
855
|
-
if (sourceMessageId != null && sourceMessageId !== "") for (const formattedMessage of formattedMessages) formattedMessage.id = sourceMessageId;
|
|
856
873
|
/**
|
|
857
874
|
* A steer that ends an assistant message leaves the replay on a
|
|
858
875
|
* `HumanMessage`. The next payload message is itself a user turn, so the
|
|
@@ -876,12 +893,12 @@ const formatAgentMessages = (payload, indexTokenCountMap, tools, skills, options
|
|
|
876
893
|
* the model may simply never answer. So the intent is recorded and flushed
|
|
877
894
|
* only when a message actually follows.
|
|
878
895
|
*
|
|
879
|
-
* Pushed AFTER
|
|
880
|
-
*
|
|
881
|
-
*
|
|
882
|
-
*
|
|
883
|
-
*
|
|
884
|
-
*
|
|
896
|
+
* Pushed AFTER source identity stamping above, deliberately. The anchor is
|
|
897
|
+
* synthetic rather than derived from the persisted assistant entry, so it
|
|
898
|
+
* must not claim that entry's source metadata. Left unstamped, it reaches
|
|
899
|
+
* the reducer with a null id and is assigned a fresh one.
|
|
900
|
+
* `endsWithSteerMessage` reads only `additional_kwargs.source`, so the
|
|
901
|
+
* deferral cannot change which messages get anchored.
|
|
885
902
|
*/
|
|
886
903
|
/**
|
|
887
904
|
* Guarded on emission: an assistant entry whose blocks all filtered away
|