@librechat/agents 3.3.13 → 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.
Files changed (192) hide show
  1. package/dist/cjs/graphs/Graph.cjs +121 -27
  2. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  3. package/dist/cjs/hooks/HookRegistry.cjs +83 -0
  4. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  5. package/dist/cjs/hooks/executeHooks.cjs +60 -14
  6. package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
  7. package/dist/cjs/hooks/index.cjs.map +1 -1
  8. package/dist/cjs/hooks/types.cjs +2 -0
  9. package/dist/cjs/hooks/types.cjs.map +1 -1
  10. package/dist/cjs/llm/anthropic/index.cjs +35 -206
  11. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  12. package/dist/cjs/llm/bedrock/index.cjs +121 -241
  13. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  14. package/dist/cjs/llm/google/index.cjs +19 -12
  15. package/dist/cjs/llm/google/index.cjs.map +1 -1
  16. package/dist/cjs/llm/init.cjs +3 -3
  17. package/dist/cjs/llm/invoke.cjs +2 -2
  18. package/dist/cjs/llm/mistral/index.cjs +26 -0
  19. package/dist/cjs/llm/mistral/index.cjs.map +1 -0
  20. package/dist/cjs/llm/openai/index.cjs +82 -80
  21. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  22. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  23. package/dist/cjs/llm/providers.cjs +19 -19
  24. package/dist/cjs/llm/providers.cjs.map +1 -1
  25. package/dist/cjs/llm/stream/chunkAdapters.cjs +198 -0
  26. package/dist/cjs/llm/stream/chunkAdapters.cjs.map +1 -0
  27. package/dist/cjs/llm/stream/smoother.cjs +369 -0
  28. package/dist/cjs/llm/stream/smoother.cjs.map +1 -0
  29. package/dist/cjs/llm/vertexai/index.cjs +13 -1
  30. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  31. package/dist/cjs/main.cjs +25 -16
  32. package/dist/cjs/messages/format.cjs +40 -23
  33. package/dist/cjs/messages/format.cjs.map +1 -1
  34. package/dist/cjs/run.cjs +82 -15
  35. package/dist/cjs/run.cjs.map +1 -1
  36. package/dist/cjs/session/AgentSession.cjs +37 -2
  37. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  38. package/dist/cjs/stream.cjs +1 -1
  39. package/dist/cjs/summarization/node.cjs +6 -3
  40. package/dist/cjs/summarization/node.cjs.map +1 -1
  41. package/dist/cjs/tools/BashExecutor.cjs +1 -1
  42. package/dist/cjs/tools/CodeExecutor.cjs +1 -1
  43. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +1 -1
  44. package/dist/cjs/tools/ToolNode.cjs +316 -94
  45. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  46. package/dist/cjs/tools/ToolSearch.cjs +1 -1
  47. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +664 -80
  48. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  49. package/dist/cjs/tools/subagent/SubagentReplay.cjs +175 -0
  50. package/dist/cjs/tools/subagent/SubagentReplay.cjs.map +1 -0
  51. package/dist/cjs/tools/toolOutputReferences.cjs +20 -0
  52. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
  53. package/dist/cjs/utils/index.cjs +2 -2
  54. package/dist/cjs/utils/tokens.cjs +76 -29
  55. package/dist/cjs/utils/tokens.cjs.map +1 -1
  56. package/dist/esm/graphs/Graph.mjs +121 -27
  57. package/dist/esm/graphs/Graph.mjs.map +1 -1
  58. package/dist/esm/hooks/HookRegistry.mjs +83 -0
  59. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  60. package/dist/esm/hooks/executeHooks.mjs +60 -14
  61. package/dist/esm/hooks/executeHooks.mjs.map +1 -1
  62. package/dist/esm/hooks/index.mjs.map +1 -1
  63. package/dist/esm/hooks/types.mjs +2 -1
  64. package/dist/esm/hooks/types.mjs.map +1 -1
  65. package/dist/esm/llm/anthropic/index.mjs +34 -205
  66. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  67. package/dist/esm/llm/bedrock/index.mjs +120 -240
  68. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  69. package/dist/esm/llm/google/index.mjs +19 -12
  70. package/dist/esm/llm/google/index.mjs.map +1 -1
  71. package/dist/esm/llm/init.mjs +1 -1
  72. package/dist/esm/llm/invoke.mjs +2 -2
  73. package/dist/esm/llm/mistral/index.mjs +26 -0
  74. package/dist/esm/llm/mistral/index.mjs.map +1 -0
  75. package/dist/esm/llm/openai/index.mjs +82 -80
  76. package/dist/esm/llm/openai/index.mjs.map +1 -1
  77. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  78. package/dist/esm/llm/providers.mjs +3 -3
  79. package/dist/esm/llm/providers.mjs.map +1 -1
  80. package/dist/esm/llm/stream/chunkAdapters.mjs +195 -0
  81. package/dist/esm/llm/stream/chunkAdapters.mjs.map +1 -0
  82. package/dist/esm/llm/stream/smoother.mjs +365 -0
  83. package/dist/esm/llm/stream/smoother.mjs.map +1 -0
  84. package/dist/esm/llm/vertexai/index.mjs +13 -1
  85. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  86. package/dist/esm/main.mjs +13 -11
  87. package/dist/esm/messages/format.mjs +40 -23
  88. package/dist/esm/messages/format.mjs.map +1 -1
  89. package/dist/esm/run.mjs +83 -16
  90. package/dist/esm/run.mjs.map +1 -1
  91. package/dist/esm/session/AgentSession.mjs +37 -2
  92. package/dist/esm/session/AgentSession.mjs.map +1 -1
  93. package/dist/esm/stream.mjs +1 -1
  94. package/dist/esm/summarization/node.mjs +6 -3
  95. package/dist/esm/summarization/node.mjs.map +1 -1
  96. package/dist/esm/tools/BashExecutor.mjs +1 -1
  97. package/dist/esm/tools/CodeExecutor.mjs +1 -1
  98. package/dist/esm/tools/ProgrammaticToolCalling.mjs +1 -1
  99. package/dist/esm/tools/ToolNode.mjs +317 -95
  100. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  101. package/dist/esm/tools/ToolSearch.mjs +1 -1
  102. package/dist/esm/tools/subagent/SubagentExecutor.mjs +665 -81
  103. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  104. package/dist/esm/tools/subagent/SubagentReplay.mjs +168 -0
  105. package/dist/esm/tools/subagent/SubagentReplay.mjs.map +1 -0
  106. package/dist/esm/tools/toolOutputReferences.mjs +20 -0
  107. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
  108. package/dist/esm/utils/index.mjs +2 -2
  109. package/dist/esm/utils/tokens.mjs +76 -30
  110. package/dist/esm/utils/tokens.mjs.map +1 -1
  111. package/dist/types/graphs/Graph.d.ts +19 -1
  112. package/dist/types/hooks/HookRegistry.d.ts +10 -1
  113. package/dist/types/hooks/executeHooks.d.ts +5 -1
  114. package/dist/types/hooks/index.d.ts +2 -2
  115. package/dist/types/hooks/types.d.ts +12 -0
  116. package/dist/types/index.d.ts +3 -0
  117. package/dist/types/llm/google/index.d.ts +2 -0
  118. package/dist/types/llm/mistral/index.d.ts +11 -0
  119. package/dist/types/llm/openai/index.d.ts +20 -4
  120. package/dist/types/llm/openrouter/index.d.ts +4 -1
  121. package/dist/types/llm/stream/chunkAdapters.d.ts +48 -0
  122. package/dist/types/llm/stream/smoother.d.ts +95 -0
  123. package/dist/types/llm/vertexai/index.d.ts +2 -0
  124. package/dist/types/run.d.ts +4 -1
  125. package/dist/types/session/AgentSession.d.ts +1 -0
  126. package/dist/types/tools/ToolNode.d.ts +23 -15
  127. package/dist/types/tools/subagent/SubagentExecutor.d.ts +49 -7
  128. package/dist/types/tools/subagent/SubagentReplay.d.ts +81 -0
  129. package/dist/types/tools/toolOutputReferences.d.ts +12 -0
  130. package/dist/types/types/graph.d.ts +5 -5
  131. package/dist/types/types/hitl.d.ts +15 -0
  132. package/dist/types/types/llm.d.ts +21 -14
  133. package/dist/types/utils/tokens.d.ts +10 -0
  134. package/package.json +6 -2
  135. package/src/graphs/Graph.ts +257 -52
  136. package/src/graphs/__tests__/Graph.breakerLifecycle.test.ts +48 -9
  137. package/src/graphs/__tests__/Graph.contextOverflow.test.ts +1 -1
  138. package/src/graphs/__tests__/Graph.subagentResumeState.test.ts +80 -0
  139. package/src/hooks/HookRegistry.ts +151 -1
  140. package/src/hooks/__tests__/HookRegistry.test.ts +96 -0
  141. package/src/hooks/__tests__/executeHooks.test.ts +160 -0
  142. package/src/hooks/executeHooks.ts +133 -15
  143. package/src/hooks/index.ts +3 -1
  144. package/src/hooks/types.ts +16 -0
  145. package/src/index.ts +8 -0
  146. package/src/llm/anthropic/index.ts +85 -354
  147. package/src/llm/bedrock/index.ts +174 -390
  148. package/src/llm/bedrock/llm.spec.ts +2 -0
  149. package/src/llm/bedrock/streamSealDispatch.test.ts +76 -0
  150. package/src/llm/custom-chat-models.smoke.test.ts +16 -1
  151. package/src/llm/google/index.ts +17 -18
  152. package/src/llm/google/streamSmoothing.test.ts +121 -0
  153. package/src/llm/mistral/index.ts +33 -0
  154. package/src/llm/mistral/streamSmoothing.test.ts +97 -0
  155. package/src/llm/openai/deepseek.test.ts +56 -0
  156. package/src/llm/openai/index.ts +119 -126
  157. package/src/llm/openrouter/index.ts +4 -1
  158. package/src/llm/providers.ts +3 -3
  159. package/src/llm/stream/chunkAdapters.test.ts +202 -0
  160. package/src/llm/stream/chunkAdapters.ts +317 -0
  161. package/src/llm/stream/reassembly.test.ts +241 -0
  162. package/src/llm/stream/smoother.bench.test.ts +155 -0
  163. package/src/llm/stream/smoother.test.ts +519 -0
  164. package/src/llm/stream/smoother.ts +574 -0
  165. package/src/llm/vertexai/index.ts +17 -1
  166. package/src/llm/vertexai/streamSmoothing.test.ts +109 -0
  167. package/src/messages/format.ts +54 -26
  168. package/src/messages/formatAgentMessages.reducer.test.ts +162 -0
  169. package/src/messages/formatAgentMessages.steer.test.ts +16 -11
  170. package/src/messages/formatAgentMessages.test.ts +7 -2
  171. package/src/run.ts +164 -18
  172. package/src/session/AgentSession.ts +52 -2
  173. package/src/session/__tests__/JsonlSessionStore.test.ts +53 -0
  174. package/src/specs/subagent.test.ts +44 -0
  175. package/src/specs/tokens.test.ts +159 -14
  176. package/src/summarization/__tests__/node.test.ts +32 -14
  177. package/src/summarization/node.ts +15 -11
  178. package/src/tools/ToolNode.ts +631 -157
  179. package/src/tools/__tests__/SubagentExecutor.test.ts +590 -7
  180. package/src/tools/__tests__/SubagentReplay.test.ts +300 -0
  181. package/src/tools/__tests__/ToolNode.breakerSignal.test.ts +208 -2
  182. package/src/tools/__tests__/directToolHITLResumeScope.test.ts +486 -2
  183. package/src/tools/__tests__/hitl.test.ts +234 -5
  184. package/src/tools/__tests__/subagentHooks.test.ts +1040 -62
  185. package/src/tools/__tests__/toolOutputReferences.test.ts +19 -2
  186. package/src/tools/subagent/SubagentExecutor.ts +1438 -136
  187. package/src/tools/subagent/SubagentReplay.ts +575 -0
  188. package/src/tools/toolOutputReferences.ts +40 -1
  189. package/src/types/graph.ts +5 -5
  190. package/src/types/hitl.ts +16 -0
  191. package/src/types/llm.ts +53 -36
  192. package/src/utils/tokens.ts +115 -30
@@ -1,3 +1,4 @@
1
+ const require_SubagentReplay = require("../tools/subagent/SubagentReplay.cjs");
1
2
  const require_misc = require("../utils/misc.cjs");
2
3
  const require_langfuseConfig = require("../langfuseConfig.cjs");
3
4
  const require_langfuseRuntimeScope = require("../langfuseRuntimeScope.cjs");
@@ -27,16 +28,16 @@ const require_handoffCue = require("../messages/handoffCue.cjs");
27
28
  const require_reducer = require("../messages/reducer.cjs");
28
29
  const require_recency = require("../messages/recency.cjs");
29
30
  require("../messages/index.cjs");
31
+ const require_graph = require("../utils/graph.cjs");
32
+ const require_llm = require("../utils/llm.cjs");
30
33
  const require_handlers = require("../tools/handlers.cjs");
31
34
  const require_streamLimits = require("../llm/streamLimits.cjs");
32
35
  const require_toolOutputReferences = require("../tools/toolOutputReferences.cjs");
33
- const require_llm = require("../utils/llm.cjs");
34
- const require_toolCache = require("../llm/bedrock/toolCache.cjs");
35
- const require_preempt = require("../llm/preempt.cjs");
36
- const require_graph = require("../utils/graph.cjs");
37
36
  const require_events$1 = require("../events.cjs");
38
37
  const require_run = require("../utils/run.cjs");
39
38
  require("../utils/index.cjs");
39
+ const require_toolCache = require("../llm/bedrock/toolCache.cjs");
40
+ const require_preempt = require("../llm/preempt.cjs");
40
41
  const require_init = require("../llm/init.cjs");
41
42
  const require_invoke = require("../llm/invoke.cjs");
42
43
  const require_contextOverflowRecovery = require("../llm/contextOverflowRecovery.cjs");
@@ -262,6 +263,7 @@ function getDispatchableFinalReasoningContent({ agentContext, responseReasoningC
262
263
  return responseReasoningContent;
263
264
  }
264
265
  var Graph = class {
266
+ restoreCheckpointMessages(_messages, _pendingMessages) {}
265
267
  /** Returns a snapshot of deferred tools discovered by this graph. */
266
268
  getDiscoveredTools(_agentId) {
267
269
  return [];
@@ -419,7 +421,7 @@ var Graph = class {
419
421
  this._toolOutputRegistry?.clear();
420
422
  this._toolOutputRegistry = void 0;
421
423
  for (const node of this._compiledToolNodes) node.clearDirectPathTurns();
422
- this._compiledToolNodes.clear();
424
+ for (const executor of this._subagentExecutors) executor.clearHeavyState();
423
425
  this.sessions.clear();
424
426
  }
425
427
  getEagerEventToolUsageCount(agentId) {
@@ -460,6 +462,73 @@ var Graph = class {
460
462
  registerCompiledToolNode(node) {
461
463
  this._compiledToolNodes.add(node);
462
464
  }
465
+ registerSubagentExecutor(executor) {
466
+ this._subagentExecutors.add(executor);
467
+ }
468
+ resetSubagentCheckpointThreadIds() {
469
+ for (const executor of this._subagentExecutors) executor.resetCheckpointThreadIds();
470
+ }
471
+ getChildCheckpointThreadIds() {
472
+ const threadIds = /* @__PURE__ */ new Set();
473
+ for (const executor of this._subagentExecutors) for (const threadId of executor.getChildCheckpointThreadIds()) threadIds.add(threadId);
474
+ return [...threadIds];
475
+ }
476
+ createSubagentResumeState(runId) {
477
+ return {
478
+ toolCallSteps: [...this.toolCallStepIds].map(([toolCallId, stepId]) => ({
479
+ toolCallId,
480
+ stepId
481
+ })),
482
+ toolSessions: [...this.sessions].map(([toolName, context]) => ({
483
+ toolName,
484
+ context: {
485
+ ...context,
486
+ ...context.files == null ? {} : { files: context.files.map((file) => ({ ...file })) }
487
+ }
488
+ })),
489
+ toolNodes: [...this._compiledToolNodes].map((node) => node.createSubagentResumeState()),
490
+ eagerToolUsage: [{
491
+ agentId: "",
492
+ toolUsageCounts: [...this.eagerEventToolUsageCount].map(([toolName, count]) => ({
493
+ toolName,
494
+ count
495
+ }))
496
+ }, ...[...this.eagerEventToolUsageCountsByAgentId].map(([agentId, usageCounts]) => ({
497
+ agentId,
498
+ toolUsageCounts: [...usageCounts].map(([toolName, count]) => ({
499
+ toolName,
500
+ count
501
+ }))
502
+ }))],
503
+ eagerToolSuppressions: [...this.eagerEventToolSuppressions],
504
+ ...this._toolOutputRegistry == null ? {} : { toolOutputReferences: this._toolOutputRegistry.snapshotState(runId) }
505
+ };
506
+ }
507
+ restoreSubagentResumeState(state, runId) {
508
+ const toolNodesByKey = new Map([...this._compiledToolNodes].map((node) => {
509
+ return [node.createSubagentResumeState().stateKey, node];
510
+ }));
511
+ if (toolNodesByKey.size !== state.toolNodes.length) throw new Error("Cannot restore changed subagent tool topology.");
512
+ for (const nodeState of state.toolNodes) if (!toolNodesByKey.has(nodeState.stateKey)) throw new Error(`Cannot restore subagent tool state for "${nodeState.stateKey}".`);
513
+ const registry = state.toolOutputReferences == null ? void 0 : this.getOrCreateToolOutputRegistry();
514
+ if (state.toolOutputReferences != null && registry == null) throw new Error("Cannot restore disabled tool output references.");
515
+ this.toolCallStepIds.clear();
516
+ for (const { toolCallId, stepId } of state.toolCallSteps) this.toolCallStepIds.set(toolCallId, stepId);
517
+ this.sessions.clear();
518
+ for (const { toolName, context } of state.toolSessions) this.sessions.set(toolName, {
519
+ ...context,
520
+ ...context.files == null ? {} : { files: context.files.map((file) => ({ ...file })) }
521
+ });
522
+ for (const nodeState of state.toolNodes) toolNodesByKey.get(nodeState.stateKey).restoreSubagentResumeState(nodeState);
523
+ this.clearEagerEventToolUsageCounts();
524
+ for (const usageState of state.eagerToolUsage) {
525
+ const usageCounts = this.getEagerEventToolUsageCount(usageState.agentId);
526
+ for (const { toolName, count } of usageState.toolUsageCounts) usageCounts.set(toolName, count);
527
+ }
528
+ this.eagerEventToolSuppressions.clear();
529
+ for (const toolName of state.eagerToolSuppressions) this.eagerEventToolSuppressions.add(toolName);
530
+ if (state.toolOutputReferences != null && registry != null) registry.restoreState(runId, state.toolOutputReferences);
531
+ }
463
532
  /**
464
533
  * Returns the shared `ToolOutputReferenceRegistry` for this run,
465
534
  * constructing it on first access. Returns `undefined` when the
@@ -501,6 +570,7 @@ var Graph = class {
501
570
  * across Runs if a provider reuses call ids (Codex P2 #33).
502
571
  */
503
572
  _compiledToolNodes = /* @__PURE__ */ new Set();
573
+ _subagentExecutors = /* @__PURE__ */ new Set();
504
574
  getOrCreateFileCheckpointer() {
505
575
  if (this._fileCheckpointer != null) return this._fileCheckpointer;
506
576
  if (this.toolExecution?.engine === "local" && this.toolExecution.local?.fileCheckpointing === true) {
@@ -517,11 +587,14 @@ var Graph = class {
517
587
  };
518
588
  var StandardGraph = class StandardGraph extends Graph {
519
589
  overrideModel;
590
+ subagentModelOverride;
520
591
  /** Optional compile options passed into workflow.compile() */
521
592
  compileOptions;
522
593
  /** Whether the workflow was actually compiled with a checkpointer. */
523
594
  hasCompiledCheckpointer = false;
524
595
  messages = [];
596
+ /** Whether a rebuilt resume seeded the message baseline from its checkpoint. */
597
+ hasRestoredCheckpointMessages = false;
525
598
  /** Cached run messages preserved before clearHeavyState() so getRunMessages() works after cleanup. */
526
599
  cachedRunMessages;
527
600
  /** Per-agent discovery snapshots preserved before contexts are reset on cleanup. */
@@ -685,7 +758,9 @@ var StandardGraph = class StandardGraph extends Graph {
685
758
  this.defaultAgentId = agents[0].agentId;
686
759
  }
687
760
  resetValues(keepContent, checkpointScope) {
761
+ this.resetSubagentCheckpointThreadIds();
688
762
  this.messages = [];
763
+ this.hasRestoredCheckpointMessages = false;
689
764
  this.cachedRunMessages = void 0;
690
765
  this.cachedDiscoveredTools = void 0;
691
766
  this.config = require_graph.resetIfNotEmpty(this.config, void 0);
@@ -743,12 +818,21 @@ var StandardGraph = class StandardGraph extends Graph {
743
818
  for (const context of this.agentContexts.values()) context.reset({ preserveOriginalToolContent });
744
819
  this.originalToolContentCheckpointScope = hasScopedCheckpoint ? checkpointScope : void 0;
745
820
  }
821
+ /** Seeds the sidecar message view that checkpoint restoration bypasses. */
822
+ restoreCheckpointMessages(messages, pendingMessages) {
823
+ if (this.messages.length > 0) return;
824
+ this.messages = pendingMessages == null ? [...messages] : require_reducer.messagesStateReducer(messages, pendingMessages);
825
+ this.startIndex = this.messages.length;
826
+ this.hasRestoredCheckpointMessages = true;
827
+ this.cachedRunMessages = void 0;
828
+ }
746
829
  clearHeavyState() {
747
830
  this.cachedRunMessages = this.messages.slice(this.startIndex);
748
831
  this.cachedDiscoveredTools = new Map(Array.from(this.agentContexts, ([agentId, context]) => [agentId, context.getDiscoveredTools()]));
749
832
  super.clearHeavyState();
750
833
  this.messages = [];
751
834
  this.overrideModel = void 0;
835
+ this.subagentModelOverride = void 0;
752
836
  /** Stream-limit accounting (argument tallies, event counts, charge
753
837
  * credits) deliberately SURVIVES cleanup: this runs in `processStream`'s
754
838
  * finally, which an ordinary parallel-branch failure reaches while
@@ -1029,6 +1113,9 @@ var StandardGraph = class StandardGraph extends Graph {
1029
1113
  runLangfuse: this.langfuse,
1030
1114
  agentLangfuse: agentContext?.langfuse
1031
1115
  });
1116
+ const interruptingToolNames = new Set(this.interruptingToolNames ?? []);
1117
+ if (this.humanInTheLoop?.enabled === true && (agentContext?.subagentConfigs?.length ?? 0) > 0) interruptingToolNames.add("subagent");
1118
+ const effectiveInterruptingToolNames = interruptingToolNames.size > 0 ? interruptingToolNames : void 0;
1032
1119
  if (eventDrivenMode) {
1033
1120
  const schemaTools = require_schema.createSchemaOnlyTools(toolDefinitions);
1034
1121
  const toolDefMap = new Map(toolDefinitions.map((def) => [def.name, def]));
@@ -1065,7 +1152,7 @@ var StandardGraph = class StandardGraph extends Graph {
1065
1152
  eagerEventToolSuppressions: this.eagerEventToolSuppressions,
1066
1153
  toolExecution: this.toolExecution,
1067
1154
  directToolNames: directToolNames.size > 0 ? directToolNames : void 0,
1068
- interruptingToolNames: this.interruptingToolNames != null && this.interruptingToolNames.length > 0 ? new Set(this.interruptingToolNames) : void 0,
1155
+ interruptingToolNames: effectiveInterruptingToolNames,
1069
1156
  maxContextTokens: agentContext?.maxContextTokens,
1070
1157
  maxToolResultChars: agentContext?.maxToolResultChars,
1071
1158
  toolOutputRegistry: this.getOrCreateToolOutputRegistry(),
@@ -1093,7 +1180,7 @@ var StandardGraph = class StandardGraph extends Graph {
1093
1180
  sessions: this.sessions,
1094
1181
  toolExecution: this.toolExecution,
1095
1182
  codeSessionToolNames: this.codeSessionToolNames,
1096
- interruptingToolNames: this.interruptingToolNames != null && this.interruptingToolNames.length > 0 ? new Set(this.interruptingToolNames) : void 0,
1183
+ interruptingToolNames: effectiveInterruptingToolNames,
1097
1184
  hookRegistry: this.hookRegistry,
1098
1185
  humanInTheLoop: this.humanInTheLoop,
1099
1186
  maxContextTokens: agentContext?.maxContextTokens,
@@ -1113,6 +1200,10 @@ var StandardGraph = class StandardGraph extends Graph {
1113
1200
  toolCalls
1114
1201
  });
1115
1202
  }
1203
+ /** Explicitly overrides the model used by isolated descendant subagent graphs. */
1204
+ setSubagentModelOverride(model) {
1205
+ this.subagentModelOverride = model;
1206
+ }
1116
1207
  getUsageMetadata(finalMessage) {
1117
1208
  if (finalMessage && "usage_metadata" in finalMessage && finalMessage.usage_metadata != null) return finalMessage.usage_metadata;
1118
1209
  }
@@ -2335,17 +2426,19 @@ var StandardGraph = class StandardGraph extends Graph {
2335
2426
  tokenCounter: agentContext.tokenCounter,
2336
2427
  usageSink: this.subagentUsageSink,
2337
2428
  streamLimits: this.streamLimits,
2429
+ humanInTheLoop: this.humanInTheLoop,
2430
+ checkpointer: this.compileOptions?.checkpointer,
2338
2431
  maxDepth: effectiveSubagentDepth,
2339
2432
  createChildGraph: (input) => {
2340
2433
  const childGraph = new StandardGraph(input);
2434
+ if (this.subagentModelOverride != null) {
2435
+ childGraph.overrideModel = this.subagentModelOverride;
2436
+ childGraph.setSubagentModelOverride(this.subagentModelOverride);
2437
+ }
2341
2438
  const toolHandlerRegistry = createToolHandlerRegistry(getParentHandlerRegistry());
2342
2439
  childGraph.hookRegistry = this.hookRegistry;
2343
- /**
2344
- * Do not propagate `humanInTheLoop` into the child graph yet:
2345
- * nested subagent interrupts need a stable child checkpoint and
2346
- * resume bridge. Child hooks still fire; `ask` decisions fail
2347
- * closed inside the subagent until that flow is implemented.
2348
- */
2440
+ childGraph.humanInTheLoop = this.humanInTheLoop;
2441
+ if (this.humanInTheLoop?.enabled === true) childGraph.compileOptions = { checkpointer: this.compileOptions?.checkpointer };
2349
2442
  childGraph.toolOutputReferences = this.toolOutputReferences;
2350
2443
  childGraph.eagerEventToolExecution = this.eagerEventToolExecution;
2351
2444
  childGraph.codeSessionToolNames = this.codeSessionToolNames;
@@ -2356,24 +2449,19 @@ var StandardGraph = class StandardGraph extends Graph {
2356
2449
  return childGraph;
2357
2450
  }
2358
2451
  });
2452
+ this.registerSubagentExecutor(executor);
2359
2453
  const subagentTool = (0, _langchain_core_tools.tool)(async (rawInput, config) => {
2360
2454
  const input = rawInput;
2361
2455
  const description = typeof input.description === "string" && input.description.trim().length > 0 ? input.description : "No task description provided";
2362
2456
  const subagentType = typeof input.subagent_type === "string" ? input.subagent_type : "";
2363
2457
  const threadId = config.configurable?.thread_id;
2364
- /**
2365
- * When the tool is dispatched from an LLM's `tool_call`, LangChain
2366
- * threads the originating `ToolCall` onto the RunnableConfig as
2367
- * `config.toolCall` (see `ToolRunnableConfig` in
2368
- * `@langchain/core/tools` — internal but stable since ≥0.3.x).
2369
- * Surfacing its id lets hosts correlate `SubagentUpdateEvent`s
2370
- * back to the parent's `tool_call_id` deterministically no
2371
- * temporal heuristics needed. If a future LangChain version
2372
- * changes the threading, the type-guarded read falls back to
2373
- * `undefined` and the correlation degrades gracefully.
2374
- */
2375
- const toolCall = config.toolCall;
2376
- const parentToolCallId = typeof toolCall?.id === "string" ? toolCall.id : void 0;
2458
+ /** Surface the parent call id so child checkpoints, interrupts, and
2459
+ * update events remain correlated across replay and resume. */
2460
+ const toolRuntime = config;
2461
+ const toolCall = toolRuntime.toolCall;
2462
+ let parentToolCallId;
2463
+ if (typeof toolRuntime.toolCallId === "string" && toolRuntime.toolCallId !== "") parentToolCallId = toolRuntime.toolCallId;
2464
+ else if (typeof toolCall?.id === "string" && toolCall.id !== "") parentToolCallId = toolCall.id;
2377
2465
  /** The parent tool batch's entry-captured scope (stamped by
2378
2466
  * ToolNode before PreToolUse hooks) — binds this child to the
2379
2467
  * run that dispatched it, not to whatever controller a reset
@@ -2394,6 +2482,12 @@ var StandardGraph = class StandardGraph extends Graph {
2394
2482
  parentConfigurable: config.configurable
2395
2483
  })).content;
2396
2484
  }, require_SubagentTool.buildSubagentToolParams(resolvedConfigs));
2485
+ const replayableSubagentTool = subagentTool;
2486
+ replayableSubagentTool[require_SubagentReplay.SUBAGENT_REPLAY_CONTROLLER] = {
2487
+ getResumeManifest: (parentToolCallIds) => executor.getResumeManifest(parentToolCallIds),
2488
+ getSettledOutput: (call, config) => executor.getSettledToolOutput(call, config),
2489
+ persistSettledOutput: (call, config, output) => executor.persistSettledToolOutput(call, config, output)
2490
+ };
2397
2491
  if (!agentContext.graphTools) agentContext.graphTools = [];
2398
2492
  agentContext.graphTools.push(subagentTool);
2399
2493
  /**
@@ -2546,7 +2640,7 @@ var StandardGraph = class StandardGraph extends Graph {
2546
2640
  const agentNode = this.createAgentNode(this.defaultAgentId);
2547
2641
  return new _langchain_langgraph.StateGraph(_langchain_langgraph.Annotation.Root({ messages: (0, _langchain_langgraph.Annotation)({
2548
2642
  reducer: (a, b) => {
2549
- if (!this.messages.length) this.startIndex = a.length + b.length;
2643
+ if (!this.messages.length && !this.hasRestoredCheckpointMessages) this.startIndex = a.length + b.length;
2550
2644
  const result = require_reducer.messagesStateReducer(a, b);
2551
2645
  this.messages = result;
2552
2646
  return result;