@librechat/agents 3.4.0 → 3.4.2

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 (204) hide show
  1. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  2. package/dist/cjs/graphs/Graph.cjs +165 -57
  3. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  4. package/dist/cjs/graphs/MultiAgentGraph.cjs +81 -33
  5. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  6. package/dist/cjs/graphs/applyGraphRuntimeConfig.cjs +14 -0
  7. package/dist/cjs/graphs/applyGraphRuntimeConfig.cjs.map +1 -0
  8. package/dist/cjs/graphs/createGraph.cjs +15 -0
  9. package/dist/cjs/graphs/createGraph.cjs.map +1 -0
  10. package/dist/cjs/graphs/index.cjs +1 -0
  11. package/dist/cjs/hooks/HookRegistry.cjs +83 -0
  12. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  13. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +1 -1
  14. package/dist/cjs/hooks/executeHooks.cjs +60 -14
  15. package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
  16. package/dist/cjs/hooks/index.cjs.map +1 -1
  17. package/dist/cjs/hooks/types.cjs +2 -0
  18. package/dist/cjs/hooks/types.cjs.map +1 -1
  19. package/dist/cjs/llm/init.cjs +3 -3
  20. package/dist/cjs/llm/invoke.cjs +2 -2
  21. package/dist/cjs/main.cjs +34 -24
  22. package/dist/cjs/messages/format.cjs +40 -23
  23. package/dist/cjs/messages/format.cjs.map +1 -1
  24. package/dist/cjs/run.cjs +130 -53
  25. package/dist/cjs/run.cjs.map +1 -1
  26. package/dist/cjs/session/AgentSession.cjs +37 -2
  27. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  28. package/dist/cjs/session/JsonlSessionStore.cjs +2 -2
  29. package/dist/cjs/stream.cjs +1 -1
  30. package/dist/cjs/summarization/node.cjs +6 -3
  31. package/dist/cjs/summarization/node.cjs.map +1 -1
  32. package/dist/cjs/tools/BashExecutor.cjs +1 -1
  33. package/dist/cjs/tools/CodeExecutor.cjs +1 -1
  34. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +1 -1
  35. package/dist/cjs/tools/SubagentTool.cjs +4 -4
  36. package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
  37. package/dist/cjs/tools/ToolNode.cjs +321 -95
  38. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  39. package/dist/cjs/tools/ToolSearch.cjs +1 -1
  40. package/dist/cjs/tools/eagerEventExecution.cjs +1 -0
  41. package/dist/cjs/tools/local/LocalExecutionEngine.cjs +3 -3
  42. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +2 -2
  43. package/dist/cjs/tools/search/rerankers.cjs +154 -1
  44. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  45. package/dist/cjs/tools/search/tool.cjs +4 -1
  46. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  47. package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs +601 -0
  48. package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs.map +1 -0
  49. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +1114 -233
  50. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  51. package/dist/cjs/tools/subagent/SubagentReplay.cjs +177 -0
  52. package/dist/cjs/tools/subagent/SubagentReplay.cjs.map +1 -0
  53. package/dist/cjs/tools/subagent/childGraphConfig.cjs +278 -0
  54. package/dist/cjs/tools/subagent/childGraphConfig.cjs.map +1 -0
  55. package/dist/cjs/tools/subagent/index.cjs +1 -0
  56. package/dist/cjs/tools/subagent/runtimeLimits.cjs +5 -0
  57. package/dist/cjs/tools/subagent/runtimeLimits.cjs.map +1 -0
  58. package/dist/cjs/tools/toolOutputReferences.cjs +20 -0
  59. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
  60. package/dist/cjs/utils/index.cjs +2 -2
  61. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  62. package/dist/esm/graphs/Graph.mjs +165 -57
  63. package/dist/esm/graphs/Graph.mjs.map +1 -1
  64. package/dist/esm/graphs/MultiAgentGraph.mjs +81 -33
  65. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  66. package/dist/esm/graphs/applyGraphRuntimeConfig.mjs +14 -0
  67. package/dist/esm/graphs/applyGraphRuntimeConfig.mjs.map +1 -0
  68. package/dist/esm/graphs/createGraph.mjs +15 -0
  69. package/dist/esm/graphs/createGraph.mjs.map +1 -0
  70. package/dist/esm/graphs/index.mjs +1 -0
  71. package/dist/esm/hooks/HookRegistry.mjs +83 -0
  72. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  73. package/dist/esm/hooks/createWorkspacePolicyHook.mjs +1 -1
  74. package/dist/esm/hooks/executeHooks.mjs +60 -14
  75. package/dist/esm/hooks/executeHooks.mjs.map +1 -1
  76. package/dist/esm/hooks/index.mjs.map +1 -1
  77. package/dist/esm/hooks/types.mjs +2 -1
  78. package/dist/esm/hooks/types.mjs.map +1 -1
  79. package/dist/esm/llm/init.mjs +1 -1
  80. package/dist/esm/llm/invoke.mjs +2 -2
  81. package/dist/esm/main.mjs +21 -19
  82. package/dist/esm/messages/format.mjs +40 -23
  83. package/dist/esm/messages/format.mjs.map +1 -1
  84. package/dist/esm/run.mjs +131 -54
  85. package/dist/esm/run.mjs.map +1 -1
  86. package/dist/esm/session/AgentSession.mjs +37 -2
  87. package/dist/esm/session/AgentSession.mjs.map +1 -1
  88. package/dist/esm/session/JsonlSessionStore.mjs +2 -2
  89. package/dist/esm/stream.mjs +1 -1
  90. package/dist/esm/summarization/node.mjs +6 -3
  91. package/dist/esm/summarization/node.mjs.map +1 -1
  92. package/dist/esm/tools/BashExecutor.mjs +1 -1
  93. package/dist/esm/tools/CodeExecutor.mjs +1 -1
  94. package/dist/esm/tools/ProgrammaticToolCalling.mjs +1 -1
  95. package/dist/esm/tools/SubagentTool.mjs +4 -4
  96. package/dist/esm/tools/SubagentTool.mjs.map +1 -1
  97. package/dist/esm/tools/ToolNode.mjs +322 -96
  98. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  99. package/dist/esm/tools/ToolSearch.mjs +1 -1
  100. package/dist/esm/tools/eagerEventExecution.mjs +1 -1
  101. package/dist/esm/tools/local/LocalExecutionEngine.mjs +3 -3
  102. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +2 -2
  103. package/dist/esm/tools/search/rerankers.mjs +154 -1
  104. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  105. package/dist/esm/tools/search/tool.mjs +4 -1
  106. package/dist/esm/tools/search/tool.mjs.map +1 -1
  107. package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs +597 -0
  108. package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs.map +1 -0
  109. package/dist/esm/tools/subagent/SubagentExecutor.mjs +1114 -233
  110. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  111. package/dist/esm/tools/subagent/SubagentReplay.mjs +170 -0
  112. package/dist/esm/tools/subagent/SubagentReplay.mjs.map +1 -0
  113. package/dist/esm/tools/subagent/childGraphConfig.mjs +272 -0
  114. package/dist/esm/tools/subagent/childGraphConfig.mjs.map +1 -0
  115. package/dist/esm/tools/subagent/index.mjs +1 -0
  116. package/dist/esm/tools/subagent/runtimeLimits.mjs +5 -0
  117. package/dist/esm/tools/subagent/runtimeLimits.mjs.map +1 -0
  118. package/dist/esm/tools/toolOutputReferences.mjs +20 -0
  119. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
  120. package/dist/esm/utils/index.mjs +2 -2
  121. package/dist/types/agents/AgentContext.d.ts +1 -1
  122. package/dist/types/graphs/Graph.d.ts +22 -2
  123. package/dist/types/graphs/MultiAgentGraph.d.ts +7 -1
  124. package/dist/types/graphs/applyGraphRuntimeConfig.d.ts +3 -0
  125. package/dist/types/graphs/createGraph.d.ts +13 -0
  126. package/dist/types/graphs/graphFactory.d.ts +13 -0
  127. package/dist/types/graphs/index.d.ts +2 -0
  128. package/dist/types/hooks/HookRegistry.d.ts +10 -1
  129. package/dist/types/hooks/executeHooks.d.ts +5 -1
  130. package/dist/types/hooks/index.d.ts +2 -2
  131. package/dist/types/hooks/types.d.ts +12 -0
  132. package/dist/types/run.d.ts +6 -3
  133. package/dist/types/session/AgentSession.d.ts +1 -0
  134. package/dist/types/tools/SubagentTool.d.ts +1 -1
  135. package/dist/types/tools/ToolNode.d.ts +23 -15
  136. package/dist/types/tools/search/rerankers.d.ts +28 -0
  137. package/dist/types/tools/search/types.d.ts +38 -1
  138. package/dist/types/tools/subagent/SubagentExecutionRegistry.d.ts +171 -0
  139. package/dist/types/tools/subagent/SubagentExecutor.d.ts +70 -36
  140. package/dist/types/tools/subagent/SubagentReplay.d.ts +85 -0
  141. package/dist/types/tools/subagent/childGraphConfig.d.ts +37 -0
  142. package/dist/types/tools/subagent/index.d.ts +1 -1
  143. package/dist/types/tools/subagent/runtimeLimits.d.ts +4 -0
  144. package/dist/types/tools/toolOutputReferences.d.ts +12 -0
  145. package/dist/types/types/graph.d.ts +189 -24
  146. package/dist/types/types/hitl.d.ts +15 -0
  147. package/package.json +8 -2
  148. package/src/agents/AgentContext.ts +1 -1
  149. package/src/graphs/Graph.ts +349 -104
  150. package/src/graphs/MultiAgentGraph.ts +149 -47
  151. package/src/graphs/__tests__/Graph.breakerLifecycle.test.ts +48 -9
  152. package/src/graphs/__tests__/Graph.contextOverflow.test.ts +1 -1
  153. package/src/graphs/__tests__/Graph.subagentResumeState.test.ts +80 -0
  154. package/src/graphs/__tests__/MultiAgentGraph.test.ts +86 -0
  155. package/src/graphs/__tests__/composition.smoke.test.ts +152 -0
  156. package/src/graphs/__tests__/createGraph.test.ts +206 -0
  157. package/src/graphs/applyGraphRuntimeConfig.ts +25 -0
  158. package/src/graphs/createGraph.ts +32 -0
  159. package/src/graphs/graphFactory.ts +12 -0
  160. package/src/graphs/index.ts +2 -0
  161. package/src/hooks/HookRegistry.ts +151 -1
  162. package/src/hooks/__tests__/HookRegistry.test.ts +96 -0
  163. package/src/hooks/__tests__/executeHooks.test.ts +160 -0
  164. package/src/hooks/executeHooks.ts +133 -15
  165. package/src/hooks/index.ts +3 -1
  166. package/src/hooks/types.ts +16 -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 +214 -56
  172. package/src/session/AgentSession.ts +52 -2
  173. package/src/session/__tests__/JsonlSessionStore.test.ts +53 -0
  174. package/src/specs/graph-subagent.live.test.ts +242 -0
  175. package/src/specs/graph-subagent.test.ts +322 -0
  176. package/src/specs/langfuse-routing.integration.test.ts +120 -1
  177. package/src/specs/subagent.test.ts +130 -4
  178. package/src/summarization/__tests__/node.test.ts +32 -14
  179. package/src/summarization/node.ts +15 -11
  180. package/src/tools/SubagentTool.ts +4 -4
  181. package/src/tools/ToolNode.ts +643 -157
  182. package/src/tools/__tests__/SubagentExecutor.test.ts +740 -15
  183. package/src/tools/__tests__/SubagentReplay.test.ts +329 -0
  184. package/src/tools/__tests__/ToolNode.breakerSignal.test.ts +208 -2
  185. package/src/tools/__tests__/directToolHITLResumeScope.test.ts +512 -2
  186. package/src/tools/__tests__/hitl.test.ts +234 -5
  187. package/src/tools/__tests__/subagentHooks.test.ts +1126 -61
  188. package/src/tools/__tests__/toolOutputReferences.test.ts +19 -2
  189. package/src/tools/search/rag-api-reranker.test.ts +891 -0
  190. package/src/tools/search/rerankers.ts +260 -0
  191. package/src/tools/search/tool.ts +6 -0
  192. package/src/tools/search/types.ts +45 -1
  193. package/src/tools/subagent/SubagentExecutionRegistry.ts +1159 -0
  194. package/src/tools/subagent/SubagentExecutor.ts +2232 -312
  195. package/src/tools/subagent/SubagentReplay.ts +584 -0
  196. package/src/tools/subagent/__tests__/SubagentExecutionRegistry.test.ts +637 -0
  197. package/src/tools/subagent/__tests__/SubagentExecutor.lazy.test.ts +3054 -0
  198. package/src/tools/subagent/__tests__/childGraphConfig.test.ts +521 -0
  199. package/src/tools/subagent/childGraphConfig.ts +694 -0
  200. package/src/tools/subagent/index.ts +6 -0
  201. package/src/tools/subagent/runtimeLimits.ts +7 -0
  202. package/src/tools/toolOutputReferences.ts +40 -1
  203. package/src/types/graph.ts +222 -24
  204. package/src/types/hitl.ts +16 -0
@@ -32,8 +32,13 @@ export type BaseGraphState = {
32
32
  export type AgentSubgraphState = BaseGraphState & {
33
33
  summarizationRequest?: SummarizationNodeInput;
34
34
  };
35
+ export type SubagentGraphResult = {
36
+ agentId: string;
37
+ message?: BaseMessage;
38
+ };
35
39
  export type MultiAgentGraphState = BaseGraphState & {
36
40
  agentMessages?: BaseMessage[];
41
+ subagentResult?: SubagentGraphResult;
37
42
  };
38
43
  export type IState = BaseGraphState;
39
44
  export interface AgentLogEvent {
@@ -223,9 +228,9 @@ export type StandardGraphInput = {
223
228
  indexTokenCountMap?: Record<string, number>;
224
229
  calibrationRatio?: number;
225
230
  /**
226
- * Receives a {@link SubagentUsageEvent} for every model call made inside
227
- * a subagent child run spawned from this graph (including nested
228
- * subagents and child-side summarization calls). Child graphs run via
231
+ * Receives a {@link SubagentUsageEvent} for every model call that reports
232
+ * usage metadata inside a subagent child run spawned from this graph
233
+ * (including nested subagents and child-side summarization calls). Child graphs run via
229
234
  * `invoke()` outside the host's `streamEvents` loop, so their
230
235
  * `on_chat_model_end` events never reach the run's handler registry —
231
236
  * this sink is the only way hosts can observe child token usage for
@@ -256,9 +261,11 @@ export type StandardGraphInput = {
256
261
  * every streamed chunk event. See {@link StreamLimits}.
257
262
  */
258
263
  streamLimits?: StreamLimits;
264
+ /** Structured lineage for a graph executing as a subagent child. */
265
+ subagentExecutionContext?: SubagentExecutionContext;
259
266
  };
260
267
  export type GraphEdge = {
261
- /** Agent ID, use a list for multiple sources */
268
+ /** Agent ID; direct edges use an array as an all-of waiting source group. */
262
269
  from: string | string[];
263
270
  /** Agent ID, use a list for multiple destinations */
264
271
  to: string | string[];
@@ -288,40 +295,180 @@ export type GraphEdge = {
288
295
  */
289
296
  promptKey?: string;
290
297
  };
298
+ export type GraphSubagentEdge = Omit<GraphEdge, 'edgeType' | 'condition' | 'promptKey'> & {
299
+ edgeType: 'direct';
300
+ condition?: never;
301
+ promptKey?: never;
302
+ };
291
303
  export type MultiAgentGraphInput = StandardGraphInput & {
292
304
  edges: GraphEdge[];
305
+ /** Captures the designated member's final AI turn in graph state. */
306
+ resultAgentId?: string;
307
+ /** Optional per-member Pregel budget when the outer graph has its own topology budget. */
308
+ memberRecursionLimit?: number;
293
309
  };
294
- /** Configuration for a subagent type that can be spawned by a parent agent. */
295
- export type SubagentConfig = {
296
- /** Identifier used in the tool's `subagent_type` enum (e.g. 'researcher', 'coder'). */
310
+ /** Lightweight identity advertised to the model for a spawnable subagent. */
311
+ export interface SubagentDescriptor {
312
+ /** Stable identifier used in the tool's `subagent_type` enum (e.g. 'researcher', 'coder'). */
297
313
  type: string;
298
314
  /** Human-readable display name. */
299
315
  name: string;
300
316
  /** What this subagent specializes in — shown to the LLM. */
301
317
  description: string;
302
- /** Full agent config for the child graph. Omit when `self` is true. */
303
- agentInputs?: AgentInputs;
304
- /** When true, reuse the parent's AgentInputs (context isolation without separate config). */
305
- self?: boolean;
318
+ /**
319
+ * Opaque, versioned identity of the child configuration. Required when
320
+ * `resolveAgentInputs` is used and changed whenever its resolved inputs
321
+ * change incompatibly.
322
+ */
323
+ configId?: string;
324
+ }
325
+ /** Lazy descriptor with the durable configuration identity required to resolve it. */
326
+ export interface LazySubagentDescriptor extends SubagentDescriptor {
327
+ configId: string;
328
+ }
329
+ /** Stable request identifiers exposed to a selected subagent resolver. */
330
+ export interface SubagentResolveRequestContext {
331
+ conversationId?: string;
332
+ messageId?: string;
333
+ parentMessageId?: string;
334
+ }
335
+ /** Stable user identifiers exposed to a selected subagent resolver. */
336
+ export interface SubagentResolveUserContext {
337
+ id?: string;
338
+ role?: string;
339
+ tenantId?: string;
340
+ }
341
+ /** Sanitized host runtime context safe for lazy subagent resolution. */
342
+ export interface SubagentResolveConfigurable {
343
+ requestBody?: Readonly<SubagentResolveRequestContext>;
344
+ user?: Readonly<SubagentResolveUserContext>;
345
+ user_id?: string;
346
+ }
347
+ /** Runtime context supplied when a host lazily resolves a selected subagent. */
348
+ export interface SubagentResolveContext {
349
+ /** Stable subagent identity selected by the model. */
350
+ descriptor: Readonly<LazySubagentDescriptor>;
351
+ /** Stable child execution identity, including across HITL reconstruction. */
352
+ executionId: string;
353
+ /** Parent run that dispatched this execution. */
354
+ parentRunId: string;
355
+ /** Parent agent that dispatched this execution. */
356
+ parentAgentId?: string;
357
+ /** Parent-side tool call that selected the subagent. */
358
+ parentToolCallId?: string;
359
+ /** Durable parent conversation thread, when supplied by the host. */
360
+ threadId?: string;
361
+ /** Parent/breaker cancellation composed for this child execution. */
362
+ signal: AbortSignal;
363
+ /** Stable, sanitized host context from the parent tool invocation. */
364
+ configurable?: Readonly<SubagentResolveConfigurable>;
365
+ }
366
+ /** Host contract for resolving a selected subagent's full graph inputs. */
367
+ export type SubagentAgentInputsResolver = (context: SubagentResolveContext) => Promise<AgentInputs>;
368
+ interface SubagentConfigBase extends SubagentDescriptor {
306
369
  /** Max AGENT→TOOLS cycles before forced stop (default: 25). */
307
370
  maxTurns?: number;
308
371
  /** Allow this subagent to spawn its own subagents (default: false). */
309
372
  allowNested?: boolean;
310
- };
311
- /** SubagentConfig with agentInputs guaranteed present (self-spawn resolved). */
312
- export type ResolvedSubagentConfig = SubagentConfig & {
373
+ }
374
+ export interface SubagentConfig extends SubagentConfigBase {
375
+ /** Full agent config for the child graph. Omit when `self` is true. */
376
+ agentInputs?: AgentInputs;
377
+ /**
378
+ * Resolve the full child config only after this descriptor is selected.
379
+ * Eager `agentInputs` take precedence when also supplied. `self` and a
380
+ * resolver are mutually exclusive and normalization rejects that pairing.
381
+ *
382
+ * Resolvers should rebuild inputs from the stable execution context instead
383
+ * of retaining request-owned state. The SDK keeps resolved inputs in memory
384
+ * only for the lifetime of the selected execution and supplies cancellation
385
+ * through `context.signal`. A reconstructed execution may invoke the
386
+ * resolver again, so the same `context.executionId` must produce equivalent
387
+ * child inputs. Durable resolver work should be idempotent on
388
+ * `(context.executionId, context.descriptor.configId)`.
389
+ */
390
+ resolveAgentInputs?: SubagentAgentInputsResolver;
391
+ /** When true, reuse the parent's AgentInputs (context isolation without separate config). */
392
+ self?: boolean;
393
+ }
394
+ export interface SingleAgentSubagentConfig extends SubagentConfig {
395
+ kind?: 'agent';
396
+ agents?: never;
397
+ edges?: never;
398
+ entryAgentId?: never;
399
+ resultAgentId?: never;
400
+ }
401
+ export interface GraphSubagentConfig extends SubagentConfigBase {
402
+ kind: 'graph';
403
+ configId?: never;
404
+ resolveAgentInputs?: never;
405
+ allowNested?: false;
406
+ agents: AgentInputs[];
407
+ /**
408
+ * Explicit direct DAG edges. Array-valued sources are all-of waiting edges.
409
+ * Relative message order between parallel branches is implementation-dependent.
410
+ * Prompted edges are supported in chains or on the final converged result transition.
411
+ */
412
+ edges: GraphSubagentEdge[];
413
+ entryAgentId: string;
414
+ resultAgentId: string;
415
+ agentInputs?: never;
416
+ self?: never;
417
+ }
418
+ /** Any configuration that can be spawned through the subagent tool. */
419
+ export type SubagentConfigEntry = SubagentConfig | GraphSubagentConfig;
420
+ /** Legacy single-agent config with self-spawn resolution completed. */
421
+ export interface ResolvedSubagentConfig extends SubagentConfig {
313
422
  agentInputs: AgentInputs;
314
- };
423
+ }
424
+ /** Explicit alias for graph-aware code that needs to name the legacy variant. */
425
+ export interface ResolvedSingleAgentSubagentConfig extends ResolvedSubagentConfig {
426
+ kind?: 'agent';
427
+ agents?: never;
428
+ edges?: never;
429
+ entryAgentId?: never;
430
+ resultAgentId?: never;
431
+ }
432
+ export type ResolvedSubagentConfigEntry = ResolvedSubagentConfig | GraphSubagentConfig;
433
+ /** Lazy single-agent entry accepted after descriptor validation. */
434
+ export interface LazySingleAgentSubagentConfig extends SingleAgentSubagentConfig {
435
+ configId: string;
436
+ resolveAgentInputs: SubagentAgentInputsResolver;
437
+ agentInputs?: never;
438
+ self?: never;
439
+ }
440
+ /** Single-agent config accepted after eager/self/lazy eligibility checks. */
441
+ export type ExecutableSubagentConfig = ResolvedSubagentConfig | LazySingleAgentSubagentConfig;
442
+ /** Graph-aware config accepted by the executor. Graph configs stay eager. */
443
+ export type ExecutableSubagentConfigEntry = ExecutableSubagentConfig | GraphSubagentConfig;
315
444
  /** Lifecycle phase carried on {@link SubagentUpdateEvent}. */
316
445
  export type SubagentUpdatePhase = 'start' | 'run_step' | 'run_step_delta' | 'run_step_completed' | 'message_delta' | 'reasoning_delta' | 'stop' | 'error';
446
+ export interface SubagentAncestryEntry {
447
+ readonly subagentRunId: string;
448
+ readonly subagentType: string;
449
+ readonly subagentKind: 'agent' | 'graph';
450
+ /** Execution subject ID; synthetic for graph subagents. */
451
+ readonly subagentAgentId: string;
452
+ readonly parentRunId: string;
453
+ readonly parentAgentId?: string;
454
+ readonly parentToolCallId?: string;
455
+ }
456
+ export interface SubagentExecutionContext {
457
+ readonly rootRunId: string;
458
+ readonly hookSessionId: string;
459
+ readonly depth: number;
460
+ readonly ancestry: readonly SubagentAncestryEntry[];
461
+ }
317
462
  /**
318
463
  * Wrapper event emitted when a subagent's child graph dispatches activity.
319
464
  * Lets hosts show subagent progress in a UI surface separate from the parent
320
465
  * conversation without having to untangle events by agent ID.
321
466
  */
322
467
  export interface SubagentUpdateEvent {
323
- /** Parent run ID. */
468
+ /** Root run ID that owns this execution tree. */
324
469
  runId: string;
470
+ /** Immediate parent run that spawned this child. */
471
+ parentRunId?: string;
325
472
  /** Child run ID (unique per subagent execution). */
326
473
  subagentRunId: string;
327
474
  /**
@@ -333,8 +480,16 @@ export interface SubagentUpdateEvent {
333
480
  parentToolCallId?: string;
334
481
  /** Subagent `type` identifier from the SubagentConfig. */
335
482
  subagentType: string;
336
- /** Child agent ID assigned to this subagent execution. */
483
+ /** Execution shape. Omitted by older emitters. */
484
+ subagentKind?: 'agent' | 'graph';
485
+ /** Execution subject ID; synthetic for graph subagents. */
337
486
  subagentAgentId: string;
487
+ /** Graph member that produced this update, when attributable. */
488
+ memberAgentId?: string;
489
+ /** One-based nesting depth beneath the root graph. */
490
+ depth?: number;
491
+ /** Root-to-leaf execution lineage, without parsing composed run IDs. */
492
+ ancestry?: readonly SubagentAncestryEntry[];
338
493
  /** Parent agent ID that spawned this subagent. */
339
494
  parentAgentId?: string;
340
495
  /** Lifecycle phase carried by this update. */
@@ -376,10 +531,20 @@ export interface SubagentUsageEvent {
376
531
  provider?: string;
377
532
  /** Subagent `type` identifier from the SubagentConfig. */
378
533
  subagentType: string;
534
+ /** Execution shape. Omitted by older emitters. */
535
+ subagentKind?: 'agent' | 'graph';
379
536
  /** Child run ID (unique per subagent execution). */
380
537
  subagentRunId: string;
381
- /** Child agent ID assigned to this subagent execution. */
538
+ /** Execution subject ID; synthetic for graph subagents. */
382
539
  subagentAgentId: string;
540
+ /** Graph member whose model call produced this usage. */
541
+ memberAgentId?: string;
542
+ /** Immediate parent run that spawned this child. */
543
+ parentRunId?: string;
544
+ /** One-based nesting depth beneath the root graph. */
545
+ depth?: number;
546
+ /** Root-to-leaf execution lineage, without parsing composed run IDs. */
547
+ ancestry?: readonly SubagentAncestryEntry[];
383
548
  /**
384
549
  * ROOT run ID of the host run that owns billing. For nested subagents
385
550
  * each forwarding layer rewrites this upward, so events from any depth
@@ -512,7 +677,7 @@ export interface AgentInputs {
512
677
  /** Pre-computed tool schema token count (from cache). Skips recalculation when provided. */
513
678
  toolSchemaTokens?: number;
514
679
  /** Subagent configurations for hierarchical delegation. Each defines a child agent type. */
515
- subagentConfigs?: SubagentConfig[];
680
+ subagentConfigs?: SubagentConfigEntry[];
516
681
  /** Maximum subagent nesting depth. Default 1 means top-level agents can spawn subagents but subagents cannot nest further. */
517
682
  maxSubagentDepth?: number;
518
683
  /**
@@ -524,11 +689,11 @@ export interface AgentInputs {
524
689
  * raise a LangGraph `interrupt()` (e.g. a tool built on `askUserQuestion()`) —
525
690
  * the host-side event handler runs outside the graph task, where `interrupt()`
526
691
  * throws. Do NOT also list these tools in `toolDefinitions` (they would be bound
527
- * twice). NOT inherited by SELF-SPAWNED subagent children (their config is a
528
- * shallow spread of the parent's inputs, and child graphs compile without a
529
- * checkpointer, so an interrupt-capable tool could never pause there)
530
- * `buildChildInputs` scrubs the inherited copy; an EXPLICIT child config that
531
- * lists its own `graphTools` keeps them.
692
+ * twice). NOT inherited by SELF-SPAWNED subagent children: `buildChildInputs`
693
+ * scrubs the shallow-spread parent copy so parent-scoped direct tools are not
694
+ * exposed to a child implicitly. An EXPLICIT child config that lists its own
695
+ * `graphTools` keeps them; with HITL enabled, those tools share the parent's
696
+ * checkpointer and may pause and resume inside the child graph.
532
697
  *
533
698
  * Deliberately `GenericTool[]`, not `GraphTools`: the wider union admits
534
699
  * schema-only shapes (OpenAI `BindToolsInput`, Google tool objects) that
@@ -97,6 +97,17 @@ export type ToolApprovalDecisionMap = Record<string, ToolApprovalDecision>;
97
97
  * below; this type alias is primarily an integration-layer contract.
98
98
  */
99
99
  export type HumanInterruptType = 'tool_approval' | 'ask_user_question';
100
+ /** Identifies an interrupt that originated inside a checkpointed subagent. */
101
+ export interface SubagentInterruptScope {
102
+ /** Child execution run id used by subagent update and usage events. */
103
+ run_id: string;
104
+ /** Child agent id that owns the interrupted tool call. */
105
+ agent_id: string;
106
+ /** Configured subagent type selected by the parent tool call. */
107
+ subagent_type: string;
108
+ /** Parent `subagent` tool call that launched this child. */
109
+ parent_tool_call_id?: string;
110
+ }
100
111
  /**
101
112
  * Structured payload the SDK passes to `interrupt()` when one or more
102
113
  * pending tool calls require host approval. All `ask`-decision tool calls
@@ -110,6 +121,10 @@ export interface ToolApprovalInterruptPayload {
110
121
  type: 'tool_approval';
111
122
  action_requests: ToolApprovalRequest[];
112
123
  review_configs: ToolApprovalReviewConfig[];
124
+ /** Hook-registry session whose policy raised this interrupt. */
125
+ hook_session_id?: string;
126
+ /** Present when the approval request was bridged from a child graph. */
127
+ subagent?: SubagentInterruptScope;
113
128
  }
114
129
  /**
115
130
  * Pre-defined option the user can pick when answering an
package/package.json CHANGED
@@ -1,6 +1,10 @@
1
1
  {
2
2
  "name": "@librechat/agents",
3
- "version": "3.4.0",
3
+ "version": "3.4.2",
4
+ "reova": {
5
+ "enabled": true,
6
+ "endpoint": "https://telemetry.reo.dev/data"
7
+ },
4
8
  "main": "./dist/cjs/main.cjs",
5
9
  "module": "./dist/esm/main.mjs",
6
10
  "types": "./dist/types/index.d.ts",
@@ -116,6 +120,8 @@
116
120
  "prepublishOnly": "npm run build",
117
121
  "build": "tsdown && tsc -p tsconfig.build.json",
118
122
  "build:dev": "tsdown",
123
+ "check:circular-deps": "node config/circular-deps.mjs",
124
+ "test:circular-deps": "node --test config/circular-deps.test.mjs",
119
125
  "sort-imports": "node scripts/sort-imports.ts",
120
126
  "sort-imports:check": "node scripts/sort-imports.ts --check",
121
127
  "start": "node dist/esm/main.js",
@@ -248,7 +254,7 @@
248
254
  "nanoid": "^3.3.7",
249
255
  "okapibm25": "^1.4.1",
250
256
  "openai": "^6.46.0",
251
- "reo-census": "^1.2.10",
257
+ "reova": "^0.4.1",
252
258
  "socks-proxy-agent": "^8.0.5",
253
259
  "uuid": "^11.1.1"
254
260
  },
@@ -275,7 +275,7 @@ export class AgentContext {
275
275
  /** Original AgentInputs used to create this context — used for self-spawn subagent resolution. */
276
276
  _sourceInputs?: t.AgentInputs;
277
277
  /** Subagent configurations for hierarchical delegation. */
278
- subagentConfigs?: t.SubagentConfig[];
278
+ subagentConfigs?: t.SubagentConfigEntry[];
279
279
  /** Maximum subagent nesting depth. */
280
280
  maxSubagentDepth?: number;
281
281
  /** Instructions for this agent */