@librechat/agents 3.2.32 → 3.2.33
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/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/cjs/agents/AgentContext.cjs +844 -1046
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/common/constants.cjs +13 -13
- package/dist/cjs/common/constants.cjs.map +1 -1
- package/dist/cjs/common/enum.cjs +233 -240
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/common/index.cjs +2 -0
- package/dist/cjs/events.cjs +121 -169
- package/dist/cjs/events.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +1389 -1807
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +713 -945
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/graphs/index.cjs +2 -0
- package/dist/cjs/hitl/askUserQuestion.cjs +60 -62
- package/dist/cjs/hitl/askUserQuestion.cjs.map +1 -1
- package/dist/cjs/hitl/index.cjs +1 -0
- package/dist/cjs/hooks/HookRegistry.cjs +176 -202
- package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
- package/dist/cjs/hooks/createToolPolicyHook.cjs +71 -101
- package/dist/cjs/hooks/createToolPolicyHook.cjs.map +1 -1
- package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +170 -273
- package/dist/cjs/hooks/createWorkspacePolicyHook.cjs.map +1 -1
- package/dist/cjs/hooks/executeHooks.cjs +227 -282
- package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
- package/dist/cjs/hooks/index.cjs +6 -0
- package/dist/cjs/hooks/matchers.cjs +196 -230
- package/dist/cjs/hooks/matchers.cjs.map +1 -1
- package/dist/cjs/hooks/types.cjs +24 -24
- package/dist/cjs/hooks/types.cjs.map +1 -1
- package/dist/cjs/instrumentation.cjs +110 -137
- package/dist/cjs/instrumentation.cjs.map +1 -1
- package/dist/cjs/langchain/google-common.cjs +0 -3
- package/dist/cjs/langchain/index.cjs +80 -43
- package/dist/cjs/langchain/language_models/chat_models.cjs +0 -3
- package/dist/cjs/langchain/messages/tool.cjs +0 -3
- package/dist/cjs/langchain/messages.cjs +35 -18
- package/dist/cjs/langchain/openai.cjs +0 -3
- package/dist/cjs/langchain/prompts.cjs +5 -8
- package/dist/cjs/langchain/runnables.cjs +11 -10
- package/dist/cjs/langchain/tools.cjs +14 -11
- package/dist/cjs/langchain/utils/env.cjs +5 -8
- package/dist/cjs/langfuse.cjs +60 -79
- package/dist/cjs/langfuse.cjs.map +1 -1
- package/dist/cjs/langfuseToolOutputTracing.cjs +267 -399
- package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/index.cjs +432 -562
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/types.cjs +23 -47
- package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +441 -731
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +171 -256
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/output_parsers.cjs +2 -0
- package/dist/cjs/llm/anthropic/utils/tools.cjs +12 -26
- package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +195 -240
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/toolCache.cjs +84 -106
- package/dist/cjs/llm/bedrock/toolCache.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/index.cjs +2 -0
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +357 -620
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +105 -149
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/fake.cjs +86 -96
- package/dist/cjs/llm/fake.cjs.map +1 -1
- package/dist/cjs/llm/google/index.cjs +183 -237
- package/dist/cjs/llm/google/index.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/common.cjs +398 -674
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/zod_to_genai_parameters.cjs +2 -0
- package/dist/cjs/llm/init.cjs +44 -53
- package/dist/cjs/llm/init.cjs.map +1 -1
- package/dist/cjs/llm/invoke.cjs +142 -182
- package/dist/cjs/llm/invoke.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +991 -1276
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs +189 -316
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs +102 -153
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/toolCache.cjs +35 -44
- package/dist/cjs/llm/openrouter/toolCache.cjs.map +1 -1
- package/dist/cjs/llm/providers.cjs +29 -37
- package/dist/cjs/llm/providers.cjs.map +1 -1
- package/dist/cjs/llm/request.cjs +20 -33
- package/dist/cjs/llm/request.cjs.map +1 -1
- package/dist/cjs/llm/vertexai/index.cjs +427 -453
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +547 -528
- package/dist/cjs/messages/anthropicToolCache.cjs +68 -119
- package/dist/cjs/messages/anthropicToolCache.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +305 -418
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/content.cjs +36 -49
- package/dist/cjs/messages/content.cjs.map +1 -1
- package/dist/cjs/messages/contextPruning.cjs +112 -145
- package/dist/cjs/messages/contextPruning.cjs.map +1 -1
- package/dist/cjs/messages/contextPruningSettings.cjs +36 -46
- package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +256 -397
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +904 -1387
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/ids.cjs +16 -20
- package/dist/cjs/messages/ids.cjs.map +1 -1
- package/dist/cjs/messages/index.cjs +12 -0
- package/dist/cjs/messages/langchain.cjs +18 -18
- package/dist/cjs/messages/langchain.cjs.map +1 -1
- package/dist/cjs/messages/prune.cjs +1054 -1517
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/messages/recency.cjs +77 -95
- package/dist/cjs/messages/recency.cjs.map +1 -1
- package/dist/cjs/messages/reducer.cjs +63 -78
- package/dist/cjs/messages/reducer.cjs.map +1 -1
- package/dist/cjs/messages/tools.cjs +51 -79
- package/dist/cjs/messages/tools.cjs.map +1 -1
- package/dist/cjs/openai/index.cjs +171 -217
- package/dist/cjs/openai/index.cjs.map +1 -1
- package/dist/cjs/responses/index.cjs +302 -391
- package/dist/cjs/responses/index.cjs.map +1 -1
- package/dist/cjs/run.cjs +903 -1113
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/session/AgentSession.cjs +805 -986
- package/dist/cjs/session/AgentSession.cjs.map +1 -1
- package/dist/cjs/session/JsonlSessionStore.cjs +327 -410
- package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
- package/dist/cjs/session/handlers.cjs +192 -208
- package/dist/cjs/session/handlers.cjs.map +1 -1
- package/dist/cjs/session/ids.cjs +9 -10
- package/dist/cjs/session/ids.cjs.map +1 -1
- package/dist/cjs/session/index.cjs +4 -0
- package/dist/cjs/session/messageSerialization.cjs +94 -156
- package/dist/cjs/session/messageSerialization.cjs.map +1 -1
- package/dist/cjs/splitStream.cjs +147 -206
- package/dist/cjs/splitStream.cjs.map +1 -1
- package/dist/cjs/stream.cjs +856 -1344
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/summarization/index.cjs +57 -101
- package/dist/cjs/summarization/index.cjs.map +1 -1
- package/dist/cjs/summarization/node.cjs +643 -796
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/BashExecutor.cjs +110 -136
- package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +165 -245
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/Calculator.cjs +36 -57
- package/dist/cjs/tools/Calculator.cjs.map +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs +126 -168
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/CodeSessionFileSummary.cjs +36 -46
- package/dist/cjs/tools/CodeSessionFileSummary.cjs.map +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +459 -649
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/ReadFile.cjs +17 -20
- package/dist/cjs/tools/ReadFile.cjs.map +1 -1
- package/dist/cjs/tools/SkillTool.cjs +26 -27
- package/dist/cjs/tools/SkillTool.cjs.map +1 -1
- package/dist/cjs/tools/SubagentTool.cjs +59 -61
- package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +2109 -2686
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/ToolSearch.cjs +663 -825
- package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs +248 -340
- package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs +170 -197
- package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +425 -520
- package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +91 -124
- package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/index.cjs +4 -0
- package/dist/cjs/tools/eagerEventExecution.cjs +75 -99
- package/dist/cjs/tools/eagerEventExecution.cjs.map +1 -1
- package/dist/cjs/tools/handlers.cjs +200 -262
- package/dist/cjs/tools/handlers.cjs.map +1 -1
- package/dist/cjs/tools/local/CompileCheckTool.cjs +150 -212
- package/dist/cjs/tools/local/CompileCheckTool.cjs.map +1 -1
- package/dist/cjs/tools/local/FileCheckpointer.cjs +77 -85
- package/dist/cjs/tools/local/FileCheckpointer.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalCodingTools.cjs +763 -1022
- package/dist/cjs/tools/local/LocalCodingTools.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalExecutionEngine.cjs +666 -941
- package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalExecutionTools.cjs +49 -92
- package/dist/cjs/tools/local/LocalExecutionTools.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +286 -354
- package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/local/attachments.cjs +108 -165
- package/dist/cjs/tools/local/attachments.cjs.map +1 -1
- package/dist/cjs/tools/local/bashAst.cjs +99 -113
- package/dist/cjs/tools/local/bashAst.cjs.map +1 -1
- package/dist/cjs/tools/local/editStrategies.cjs +126 -169
- package/dist/cjs/tools/local/editStrategies.cjs.map +1 -1
- package/dist/cjs/tools/local/index.cjs +12 -0
- package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +136 -218
- package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
- package/dist/cjs/tools/local/syntaxCheck.cjs +142 -161
- package/dist/cjs/tools/local/syntaxCheck.cjs.map +1 -1
- package/dist/cjs/tools/local/textEncoding.cjs +25 -23
- package/dist/cjs/tools/local/textEncoding.cjs.map +1 -1
- package/dist/cjs/tools/local/workspaceFS.cjs +38 -46
- package/dist/cjs/tools/local/workspaceFS.cjs.map +1 -1
- package/dist/cjs/tools/ptcTimeout.cjs +27 -47
- package/dist/cjs/tools/ptcTimeout.cjs.map +1 -1
- package/dist/cjs/tools/schema.cjs +24 -23
- package/dist/cjs/tools/schema.cjs.map +1 -1
- package/dist/cjs/tools/search/anthropic.cjs +24 -33
- package/dist/cjs/tools/search/anthropic.cjs.map +1 -1
- package/dist/cjs/tools/search/content.cjs +95 -137
- package/dist/cjs/tools/search/content.cjs.map +1 -1
- package/dist/cjs/tools/search/firecrawl.cjs +141 -172
- package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
- package/dist/cjs/tools/search/format.cjs +128 -196
- package/dist/cjs/tools/search/format.cjs.map +1 -1
- package/dist/cjs/tools/search/highlights.cjs +165 -232
- package/dist/cjs/tools/search/highlights.cjs.map +1 -1
- package/dist/cjs/tools/search/index.cjs +2 -0
- package/dist/cjs/tools/search/rerankers.cjs +151 -174
- package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
- package/dist/cjs/tools/search/schema.cjs +40 -39
- package/dist/cjs/tools/search/schema.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +428 -530
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/serper-scraper.cjs +106 -127
- package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
- package/dist/cjs/tools/search/tavily-scraper.cjs +129 -181
- package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -1
- package/dist/cjs/tools/search/tavily-search.cjs +295 -359
- package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +260 -299
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs +74 -117
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/cjs/tools/skillCatalog.cjs +54 -72
- package/dist/cjs/tools/skillCatalog.cjs.map +1 -1
- package/dist/cjs/tools/streamedToolCallSeals.cjs +19 -36
- package/dist/cjs/tools/streamedToolCallSeals.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +612 -771
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
- package/dist/cjs/tools/subagent/index.cjs +1 -0
- package/dist/cjs/tools/toolOutputReferences.cjs +523 -630
- package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
- package/dist/cjs/utils/callbacks.cjs +11 -21
- package/dist/cjs/utils/callbacks.cjs.map +1 -1
- package/dist/cjs/utils/errors.cjs +70 -95
- package/dist/cjs/utils/errors.cjs.map +1 -1
- package/dist/cjs/utils/events.cjs +32 -42
- package/dist/cjs/utils/events.cjs.map +1 -1
- package/dist/cjs/utils/graph.cjs +8 -12
- package/dist/cjs/utils/graph.cjs.map +1 -1
- package/dist/cjs/utils/handlers.cjs +60 -82
- package/dist/cjs/utils/handlers.cjs.map +1 -1
- package/dist/cjs/utils/index.cjs +9 -0
- package/dist/cjs/utils/llm.cjs +19 -27
- package/dist/cjs/utils/llm.cjs.map +1 -1
- package/dist/cjs/utils/misc.cjs +30 -46
- package/dist/cjs/utils/misc.cjs.map +1 -1
- package/dist/cjs/utils/run.cjs +50 -66
- package/dist/cjs/utils/run.cjs.map +1 -1
- package/dist/cjs/utils/schema.cjs +11 -19
- package/dist/cjs/utils/schema.cjs.map +1 -1
- package/dist/cjs/utils/title.cjs +71 -106
- package/dist/cjs/utils/title.cjs.map +1 -1
- package/dist/cjs/utils/tokens.cjs +186 -283
- package/dist/cjs/utils/tokens.cjs.map +1 -1
- package/dist/cjs/utils/truncation.cjs +95 -114
- package/dist/cjs/utils/truncation.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +844 -1044
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/common/constants.mjs +13 -11
- package/dist/esm/common/constants.mjs.map +1 -1
- package/dist/esm/common/enum.mjs +221 -238
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/common/index.mjs +3 -0
- package/dist/esm/events.mjs +121 -167
- package/dist/esm/events.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +1388 -1804
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +713 -943
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/graphs/index.mjs +3 -0
- package/dist/esm/hitl/askUserQuestion.mjs +60 -60
- package/dist/esm/hitl/askUserQuestion.mjs.map +1 -1
- package/dist/esm/hitl/index.mjs +2 -0
- package/dist/esm/hooks/HookRegistry.mjs +176 -200
- package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
- package/dist/esm/hooks/createToolPolicyHook.mjs +71 -99
- package/dist/esm/hooks/createToolPolicyHook.mjs.map +1 -1
- package/dist/esm/hooks/createWorkspacePolicyHook.mjs +170 -271
- package/dist/esm/hooks/createWorkspacePolicyHook.mjs.map +1 -1
- package/dist/esm/hooks/executeHooks.mjs +227 -280
- package/dist/esm/hooks/executeHooks.mjs.map +1 -1
- package/dist/esm/hooks/index.mjs +7 -0
- package/dist/esm/hooks/matchers.mjs +196 -228
- package/dist/esm/hooks/matchers.mjs.map +1 -1
- package/dist/esm/hooks/types.mjs +24 -22
- package/dist/esm/hooks/types.mjs.map +1 -1
- package/dist/esm/instrumentation.mjs +109 -132
- package/dist/esm/instrumentation.mjs.map +1 -1
- package/dist/esm/langchain/google-common.mjs +1 -2
- package/dist/esm/langchain/index.mjs +5 -5
- package/dist/esm/langchain/language_models/chat_models.mjs +1 -2
- package/dist/esm/langchain/messages/tool.mjs +1 -2
- package/dist/esm/langchain/messages.mjs +2 -2
- package/dist/esm/langchain/openai.mjs +1 -2
- package/dist/esm/langchain/prompts.mjs +2 -2
- package/dist/esm/langchain/runnables.mjs +2 -2
- package/dist/esm/langchain/tools.mjs +2 -2
- package/dist/esm/langchain/utils/env.mjs +2 -2
- package/dist/esm/langfuse.mjs +60 -76
- package/dist/esm/langfuse.mjs.map +1 -1
- package/dist/esm/langfuseToolOutputTracing.mjs +267 -395
- package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
- package/dist/esm/llm/anthropic/index.mjs +432 -559
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/anthropic/types.mjs +23 -45
- package/dist/esm/llm/anthropic/types.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +439 -725
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs +171 -253
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/output_parsers.mjs +3 -0
- package/dist/esm/llm/anthropic/utils/tools.mjs +12 -24
- package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +195 -238
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/bedrock/toolCache.mjs +84 -104
- package/dist/esm/llm/bedrock/toolCache.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/index.mjs +3 -0
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs +357 -618
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs +105 -147
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/fake.mjs +86 -94
- package/dist/esm/llm/fake.mjs.map +1 -1
- package/dist/esm/llm/google/index.mjs +183 -235
- package/dist/esm/llm/google/index.mjs.map +1 -1
- package/dist/esm/llm/google/utils/common.mjs +397 -666
- package/dist/esm/llm/google/utils/common.mjs.map +1 -1
- package/dist/esm/llm/google/utils/zod_to_genai_parameters.mjs +3 -0
- package/dist/esm/llm/init.mjs +44 -51
- package/dist/esm/llm/init.mjs.map +1 -1
- package/dist/esm/llm/invoke.mjs +142 -180
- package/dist/esm/llm/invoke.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +991 -1271
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs +188 -312
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs +102 -151
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/toolCache.mjs +35 -42
- package/dist/esm/llm/openrouter/toolCache.mjs.map +1 -1
- package/dist/esm/llm/providers.mjs +29 -34
- package/dist/esm/llm/providers.mjs.map +1 -1
- package/dist/esm/llm/request.mjs +20 -31
- package/dist/esm/llm/request.mjs.map +1 -1
- package/dist/esm/llm/vertexai/index.mjs +427 -449
- package/dist/esm/llm/vertexai/index.mjs.map +1 -1
- package/dist/esm/main.mjs +99 -87
- package/dist/esm/messages/anthropicToolCache.mjs +68 -117
- package/dist/esm/messages/anthropicToolCache.mjs.map +1 -1
- package/dist/esm/messages/cache.mjs +305 -416
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/content.mjs +36 -47
- package/dist/esm/messages/content.mjs.map +1 -1
- package/dist/esm/messages/contextPruning.mjs +112 -143
- package/dist/esm/messages/contextPruning.mjs.map +1 -1
- package/dist/esm/messages/contextPruningSettings.mjs +36 -44
- package/dist/esm/messages/contextPruningSettings.mjs.map +1 -1
- package/dist/esm/messages/core.mjs +254 -393
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +902 -1383
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/ids.mjs +16 -18
- package/dist/esm/messages/ids.mjs.map +1 -1
- package/dist/esm/messages/index.mjs +13 -0
- package/dist/esm/messages/langchain.mjs +18 -16
- package/dist/esm/messages/langchain.mjs.map +1 -1
- package/dist/esm/messages/prune.mjs +1053 -1514
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/messages/recency.mjs +77 -93
- package/dist/esm/messages/recency.mjs.map +1 -1
- package/dist/esm/messages/reducer.mjs +63 -76
- package/dist/esm/messages/reducer.mjs.map +1 -1
- package/dist/esm/messages/tools.mjs +49 -75
- package/dist/esm/messages/tools.mjs.map +1 -1
- package/dist/esm/openai/index.mjs +170 -215
- package/dist/esm/openai/index.mjs.map +1 -1
- package/dist/esm/responses/index.mjs +301 -389
- package/dist/esm/responses/index.mjs.map +1 -1
- package/dist/esm/run.mjs +903 -1111
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/session/AgentSession.mjs +806 -985
- package/dist/esm/session/AgentSession.mjs.map +1 -1
- package/dist/esm/session/JsonlSessionStore.mjs +326 -407
- package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
- package/dist/esm/session/handlers.mjs +192 -206
- package/dist/esm/session/handlers.mjs.map +1 -1
- package/dist/esm/session/ids.mjs +9 -8
- package/dist/esm/session/ids.mjs.map +1 -1
- package/dist/esm/session/index.mjs +5 -0
- package/dist/esm/session/messageSerialization.mjs +94 -154
- package/dist/esm/session/messageSerialization.mjs.map +1 -1
- package/dist/esm/splitStream.mjs +147 -204
- package/dist/esm/splitStream.mjs.map +1 -1
- package/dist/esm/stream.mjs +854 -1341
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/summarization/index.mjs +57 -99
- package/dist/esm/summarization/index.mjs.map +1 -1
- package/dist/esm/summarization/node.mjs +640 -790
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/BashExecutor.mjs +103 -129
- package/dist/esm/tools/BashExecutor.mjs.map +1 -1
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs +162 -239
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/Calculator.mjs +34 -36
- package/dist/esm/tools/Calculator.mjs.map +1 -1
- package/dist/esm/tools/CodeExecutor.mjs +123 -164
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/CodeSessionFileSummary.mjs +36 -44
- package/dist/esm/tools/CodeSessionFileSummary.mjs.map +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +454 -644
- package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/ReadFile.mjs +17 -18
- package/dist/esm/tools/ReadFile.mjs.map +1 -1
- package/dist/esm/tools/SkillTool.mjs +26 -25
- package/dist/esm/tools/SkillTool.mjs.map +1 -1
- package/dist/esm/tools/SubagentTool.mjs +59 -59
- package/dist/esm/tools/SubagentTool.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +2107 -2684
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/ToolSearch.mjs +659 -804
- package/dist/esm/tools/ToolSearch.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs +248 -338
- package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs +170 -195
- package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +424 -517
- package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +91 -122
- package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/index.mjs +5 -0
- package/dist/esm/tools/eagerEventExecution.mjs +75 -96
- package/dist/esm/tools/eagerEventExecution.mjs.map +1 -1
- package/dist/esm/tools/handlers.mjs +200 -260
- package/dist/esm/tools/handlers.mjs.map +1 -1
- package/dist/esm/tools/local/CompileCheckTool.mjs +150 -210
- package/dist/esm/tools/local/CompileCheckTool.mjs.map +1 -1
- package/dist/esm/tools/local/FileCheckpointer.mjs +77 -83
- package/dist/esm/tools/local/FileCheckpointer.mjs.map +1 -1
- package/dist/esm/tools/local/LocalCodingTools.mjs +760 -1017
- package/dist/esm/tools/local/LocalCodingTools.mjs.map +1 -1
- package/dist/esm/tools/local/LocalExecutionEngine.mjs +663 -936
- package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
- package/dist/esm/tools/local/LocalExecutionTools.mjs +49 -90
- package/dist/esm/tools/local/LocalExecutionTools.mjs.map +1 -1
- package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +283 -349
- package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/local/attachments.mjs +108 -163
- package/dist/esm/tools/local/attachments.mjs.map +1 -1
- package/dist/esm/tools/local/bashAst.mjs +99 -111
- package/dist/esm/tools/local/bashAst.mjs.map +1 -1
- package/dist/esm/tools/local/editStrategies.mjs +126 -167
- package/dist/esm/tools/local/editStrategies.mjs.map +1 -1
- package/dist/esm/tools/local/index.mjs +13 -0
- package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +136 -216
- package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
- package/dist/esm/tools/local/syntaxCheck.mjs +138 -155
- package/dist/esm/tools/local/syntaxCheck.mjs.map +1 -1
- package/dist/esm/tools/local/textEncoding.mjs +25 -21
- package/dist/esm/tools/local/textEncoding.mjs.map +1 -1
- package/dist/esm/tools/local/workspaceFS.mjs +38 -44
- package/dist/esm/tools/local/workspaceFS.mjs.map +1 -1
- package/dist/esm/tools/ptcTimeout.mjs +27 -42
- package/dist/esm/tools/ptcTimeout.mjs.map +1 -1
- package/dist/esm/tools/schema.mjs +24 -21
- package/dist/esm/tools/schema.mjs.map +1 -1
- package/dist/esm/tools/search/anthropic.mjs +24 -31
- package/dist/esm/tools/search/anthropic.mjs.map +1 -1
- package/dist/esm/tools/search/content.mjs +93 -116
- package/dist/esm/tools/search/content.mjs.map +1 -1
- package/dist/esm/tools/search/firecrawl.mjs +139 -169
- package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
- package/dist/esm/tools/search/format.mjs +128 -194
- package/dist/esm/tools/search/format.mjs.map +1 -1
- package/dist/esm/tools/search/highlights.mjs +165 -230
- package/dist/esm/tools/search/highlights.mjs.map +1 -1
- package/dist/esm/tools/search/index.mjs +3 -0
- package/dist/esm/tools/search/rerankers.mjs +149 -168
- package/dist/esm/tools/search/rerankers.mjs.map +1 -1
- package/dist/esm/tools/search/schema.mjs +39 -37
- package/dist/esm/tools/search/schema.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +426 -528
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/serper-scraper.mjs +104 -124
- package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
- package/dist/esm/tools/search/tavily-scraper.mjs +127 -178
- package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -1
- package/dist/esm/tools/search/tavily-search.mjs +293 -357
- package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +259 -297
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs +74 -115
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/esm/tools/skillCatalog.mjs +54 -70
- package/dist/esm/tools/skillCatalog.mjs.map +1 -1
- package/dist/esm/tools/streamedToolCallSeals.mjs +19 -31
- package/dist/esm/tools/streamedToolCallSeals.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +612 -768
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
- package/dist/esm/tools/subagent/index.mjs +2 -0
- package/dist/esm/tools/toolOutputReferences.mjs +523 -624
- package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
- package/dist/esm/utils/callbacks.mjs +11 -19
- package/dist/esm/utils/callbacks.mjs.map +1 -1
- package/dist/esm/utils/errors.mjs +70 -93
- package/dist/esm/utils/errors.mjs.map +1 -1
- package/dist/esm/utils/events.mjs +32 -40
- package/dist/esm/utils/events.mjs.map +1 -1
- package/dist/esm/utils/graph.mjs +8 -10
- package/dist/esm/utils/graph.mjs.map +1 -1
- package/dist/esm/utils/handlers.mjs +60 -80
- package/dist/esm/utils/handlers.mjs.map +1 -1
- package/dist/esm/utils/index.mjs +10 -0
- package/dist/esm/utils/llm.mjs +19 -25
- package/dist/esm/utils/llm.mjs.map +1 -1
- package/dist/esm/utils/misc.mjs +30 -44
- package/dist/esm/utils/misc.mjs.map +1 -1
- package/dist/esm/utils/run.mjs +50 -64
- package/dist/esm/utils/run.mjs.map +1 -1
- package/dist/esm/utils/schema.mjs +11 -17
- package/dist/esm/utils/schema.mjs.map +1 -1
- package/dist/esm/utils/title.mjs +71 -104
- package/dist/esm/utils/title.mjs.map +1 -1
- package/dist/esm/utils/tokens.mjs +186 -281
- package/dist/esm/utils/tokens.mjs.map +1 -1
- package/dist/esm/utils/truncation.mjs +95 -112
- package/dist/esm/utils/truncation.mjs.map +1 -1
- package/dist/types/tools/search/tool.d.ts +17 -0
- package/dist/types/tools/search/types.d.ts +4 -0
- package/package.json +4 -10
- package/src/tools/search/highlights.ts +9 -1
- package/src/tools/search/search.ts +41 -3
- package/src/tools/search/source-processing.test.ts +373 -0
- package/src/tools/search/tool.ts +22 -2
- package/src/tools/search/types.ts +4 -0
- package/dist/cjs/langchain/google-common.cjs.map +0 -1
- package/dist/cjs/langchain/index.cjs.map +0 -1
- package/dist/cjs/langchain/language_models/chat_models.cjs.map +0 -1
- package/dist/cjs/langchain/messages/tool.cjs.map +0 -1
- package/dist/cjs/langchain/messages.cjs.map +0 -1
- package/dist/cjs/langchain/openai.cjs.map +0 -1
- package/dist/cjs/langchain/prompts.cjs.map +0 -1
- package/dist/cjs/langchain/runnables.cjs.map +0 -1
- package/dist/cjs/langchain/tools.cjs.map +0 -1
- package/dist/cjs/langchain/utils/env.cjs.map +0 -1
- package/dist/cjs/main.cjs.map +0 -1
- package/dist/esm/langchain/google-common.mjs.map +0 -1
- package/dist/esm/langchain/index.mjs.map +0 -1
- package/dist/esm/langchain/language_models/chat_models.mjs.map +0 -1
- package/dist/esm/langchain/messages/tool.mjs.map +0 -1
- package/dist/esm/langchain/messages.mjs.map +0 -1
- package/dist/esm/langchain/openai.mjs.map +0 -1
- package/dist/esm/langchain/prompts.mjs.map +0 -1
- package/dist/esm/langchain/runnables.mjs.map +0 -1
- package/dist/esm/langchain/tools.mjs.map +0 -1
- package/dist/esm/langchain/utils/env.mjs.map +0 -1
- package/dist/esm/main.mjs.map +0 -1
|
@@ -1,836 +1,677 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
require("../../common/enum.cjs");
|
|
2
|
+
require("../../common/index.cjs");
|
|
3
|
+
const require_executeHooks = require("../../hooks/executeHooks.cjs");
|
|
4
|
+
require("../../hooks/index.cjs");
|
|
5
|
+
let _langchain_core_messages = require("@langchain/core/messages");
|
|
6
|
+
let _langchain_core_callbacks_base = require("@langchain/core/callbacks/base");
|
|
7
|
+
let nanoid = require("nanoid");
|
|
8
|
+
//#region src/tools/subagent/SubagentExecutor.ts
|
|
10
9
|
const DEFAULT_MAX_TURNS = 25;
|
|
11
10
|
const RECURSION_MULTIPLIER = 3;
|
|
12
11
|
const ERROR_MESSAGE_MAX_CHARS = 200;
|
|
13
12
|
const MAX_PENDING_SUBAGENT_UPDATES = 64;
|
|
14
13
|
const HOOK_FALLBACK = Object.freeze({
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
additionalContexts: [],
|
|
15
|
+
errors: []
|
|
17
16
|
});
|
|
18
|
-
const LANGGRAPH_RUNTIME_CONFIG_PREFIX =
|
|
17
|
+
const LANGGRAPH_RUNTIME_CONFIG_PREFIX = "__pregel_";
|
|
19
18
|
const LANGGRAPH_CHECKPOINT_CONFIG_KEYS = new Set([
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
"checkpoint_id",
|
|
20
|
+
"checkpoint_map",
|
|
21
|
+
"checkpoint_ns"
|
|
23
22
|
]);
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
scheduleWrap(eventName, 'run_step', data);
|
|
393
|
-
return;
|
|
394
|
-
}
|
|
395
|
-
if (eventName === _enum.GraphEvents.ON_RUN_STEP_DELTA) {
|
|
396
|
-
scheduleWrap(eventName, 'run_step_delta', data);
|
|
397
|
-
return;
|
|
398
|
-
}
|
|
399
|
-
if (eventName === _enum.GraphEvents.ON_RUN_STEP_COMPLETED) {
|
|
400
|
-
scheduleWrap(eventName, 'run_step_completed', data);
|
|
401
|
-
return;
|
|
402
|
-
}
|
|
403
|
-
if (eventName === _enum.GraphEvents.ON_MESSAGE_DELTA) {
|
|
404
|
-
scheduleWrap(eventName, 'message_delta', data);
|
|
405
|
-
return;
|
|
406
|
-
}
|
|
407
|
-
if (eventName === _enum.GraphEvents.ON_REASONING_DELTA) {
|
|
408
|
-
scheduleWrap(eventName, 'reasoning_delta', data);
|
|
409
|
-
return;
|
|
410
|
-
}
|
|
411
|
-
},
|
|
412
|
-
});
|
|
413
|
-
/**
|
|
414
|
-
* `awaitHandlers = true` is required so the child's `ToolNode` actually
|
|
415
|
-
* blocks on the parent's `ON_TOOL_EXECUTE` handler until it resolves
|
|
416
|
-
* the batch request. Observational `ON_SUBAGENT_UPDATE` calls are queued
|
|
417
|
-
* behind a bounded sequential dispatcher so host UI publication cannot
|
|
418
|
-
* backpressure each child emission or run unbounded concurrent publishes.
|
|
419
|
-
* The executor drains this queue before terminal stop/error envelopes to
|
|
420
|
-
* preserve phase ordering.
|
|
421
|
-
*/
|
|
422
|
-
handler.awaitHandlers = true;
|
|
423
|
-
return { handler, drain };
|
|
424
|
-
}
|
|
425
|
-
}
|
|
23
|
+
var SubagentExecutor = class {
|
|
24
|
+
configs;
|
|
25
|
+
parentSignal;
|
|
26
|
+
hookRegistry;
|
|
27
|
+
parentRunId;
|
|
28
|
+
parentAgentId;
|
|
29
|
+
langfuse;
|
|
30
|
+
tokenCounter;
|
|
31
|
+
maxDepth;
|
|
32
|
+
createChildGraph;
|
|
33
|
+
resolveParentHandlerRegistry;
|
|
34
|
+
constructor(options) {
|
|
35
|
+
this.configs = options.configs;
|
|
36
|
+
this.parentSignal = options.parentSignal;
|
|
37
|
+
this.hookRegistry = options.hookRegistry;
|
|
38
|
+
this.parentRunId = options.parentRunId;
|
|
39
|
+
this.parentAgentId = options.parentAgentId;
|
|
40
|
+
this.langfuse = options.langfuse;
|
|
41
|
+
this.tokenCounter = options.tokenCounter;
|
|
42
|
+
this.maxDepth = options.maxDepth ?? 1;
|
|
43
|
+
this.createChildGraph = options.createChildGraph;
|
|
44
|
+
const rawRegistry = options.parentHandlerRegistry;
|
|
45
|
+
if (typeof rawRegistry === "function") this.resolveParentHandlerRegistry = rawRegistry;
|
|
46
|
+
else if (rawRegistry != null) this.resolveParentHandlerRegistry = () => rawRegistry;
|
|
47
|
+
}
|
|
48
|
+
/** Snapshot of the parent's registry at the moment a subagent is dispatched. */
|
|
49
|
+
getParentHandlerRegistry() {
|
|
50
|
+
return this.resolveParentHandlerRegistry?.();
|
|
51
|
+
}
|
|
52
|
+
async execute(params) {
|
|
53
|
+
const { description, subagentType, threadId, parentToolCallId } = params;
|
|
54
|
+
const config = this.configs.get(subagentType);
|
|
55
|
+
if (!config) return {
|
|
56
|
+
content: `Error: Unknown subagent type "${subagentType}". Available types: ${[...this.configs.keys()].join(", ")}`,
|
|
57
|
+
messages: []
|
|
58
|
+
};
|
|
59
|
+
if (this.maxDepth <= 0) return {
|
|
60
|
+
content: "Error: Maximum subagent nesting depth exceeded.",
|
|
61
|
+
messages: []
|
|
62
|
+
};
|
|
63
|
+
const childAgentId = config.agentInputs.agentId || `${this.parentAgentId ?? "agent"}_sub_${(0, nanoid.nanoid)(8)}`;
|
|
64
|
+
if (this.hookRegistry?.hasHookFor("SubagentStart", this.parentRunId) === true) {
|
|
65
|
+
const hookResult = await require_executeHooks.executeHooks({
|
|
66
|
+
registry: this.hookRegistry,
|
|
67
|
+
input: {
|
|
68
|
+
hook_event_name: "SubagentStart",
|
|
69
|
+
runId: this.parentRunId,
|
|
70
|
+
threadId,
|
|
71
|
+
parentAgentId: this.parentAgentId,
|
|
72
|
+
agentId: childAgentId,
|
|
73
|
+
agentType: subagentType,
|
|
74
|
+
inputs: [new _langchain_core_messages.HumanMessage(description)]
|
|
75
|
+
},
|
|
76
|
+
sessionId: this.parentRunId,
|
|
77
|
+
matchQuery: subagentType
|
|
78
|
+
}).catch(() => HOOK_FALLBACK);
|
|
79
|
+
/**
|
|
80
|
+
* `ask` is treated identically to `deny` in the subagent context:
|
|
81
|
+
* subagents are non-interactive, so there is no prompt path for `ask`.
|
|
82
|
+
* Both decisions block execution and return a "Blocked" tool result.
|
|
83
|
+
*/
|
|
84
|
+
if (hookResult.decision === "deny" || hookResult.decision === "ask") return {
|
|
85
|
+
content: `Blocked: ${hookResult.reason ?? "Blocked by hook"}`,
|
|
86
|
+
messages: []
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const parentRegistry = this.getParentHandlerRegistry();
|
|
90
|
+
const forwardingEnabled = parentRegistry != null;
|
|
91
|
+
/**
|
|
92
|
+
* Keep `toolDefinitions` only when the host has actually wired an
|
|
93
|
+
* `ON_TOOL_EXECUTE` handler. `Run` always constructs a `HandlerRegistry`,
|
|
94
|
+
* so treating any registry as "forwarding enabled" would leak
|
|
95
|
+
* `toolDefinitions` into children whose hosts cannot execute them — the
|
|
96
|
+
* child's `ToolNode` batch promise would hang forever with no handler to
|
|
97
|
+
* resolve/reject. Gating on the tool-execute handler preserves the
|
|
98
|
+
* recoverable "no tools" path for registry-but-no-handler configs.
|
|
99
|
+
*/
|
|
100
|
+
const hasToolExecuteHandler = parentRegistry?.getHandler("on_tool_execute") != null;
|
|
101
|
+
const childInputs = buildChildInputs(config, childAgentId, this.maxDepth, hasToolExecuteHandler);
|
|
102
|
+
const childRunId = `${this.parentRunId}_sub_${(0, nanoid.nanoid)(8)}`;
|
|
103
|
+
const maxTurns = config.maxTurns ?? DEFAULT_MAX_TURNS;
|
|
104
|
+
const childGraph = this.createChildGraph({
|
|
105
|
+
runId: childRunId,
|
|
106
|
+
signal: this.parentSignal,
|
|
107
|
+
agents: [childInputs],
|
|
108
|
+
langfuse: this.langfuse,
|
|
109
|
+
tokenCounter: this.tokenCounter
|
|
110
|
+
});
|
|
111
|
+
let forwarding;
|
|
112
|
+
if (forwardingEnabled) forwarding = this.createForwarderCallback({
|
|
113
|
+
parentRegistry,
|
|
114
|
+
subagentType,
|
|
115
|
+
subagentAgentId: childAgentId,
|
|
116
|
+
childRunId,
|
|
117
|
+
parentToolCallId
|
|
118
|
+
});
|
|
119
|
+
const forwarder = forwarding?.handler;
|
|
120
|
+
if (forwarder) await this.emitSubagentUpdate(parentRegistry, {
|
|
121
|
+
childRunId,
|
|
122
|
+
subagentType,
|
|
123
|
+
subagentAgentId: childAgentId,
|
|
124
|
+
parentToolCallId,
|
|
125
|
+
phase: "start",
|
|
126
|
+
label: `Subagent "${subagentType}" started`
|
|
127
|
+
});
|
|
128
|
+
let result;
|
|
129
|
+
try {
|
|
130
|
+
const workflow = childGraph.createWorkflow();
|
|
131
|
+
/**
|
|
132
|
+
* When `parentHandlerRegistry` is provided (forwarding mode), attach a
|
|
133
|
+
* lightweight callback that intercepts the child's `on_custom_event`
|
|
134
|
+
* dispatches and routes them to the parent's registry — either as
|
|
135
|
+
* operational events (ON_TOOL_EXECUTE) or wrapped ON_SUBAGENT_UPDATE
|
|
136
|
+
* envelopes. Native LangChain streaming events (on_chat_model_stream,
|
|
137
|
+
* etc.) still do NOT propagate to the parent's outer streamEvents
|
|
138
|
+
* iterator — the `callbacks` array REPLACES the inherited chain, so
|
|
139
|
+
* parent handlers won't receive child stream chunks and raise "No
|
|
140
|
+
* agent context found" lookups on the parent's agentContexts map.
|
|
141
|
+
*
|
|
142
|
+
* When no registry is provided (legacy isolation), `callbacks: []`
|
|
143
|
+
* fully detaches the child.
|
|
144
|
+
*
|
|
145
|
+
* `runName` gives the child a distinct LangSmith trace root (avoids
|
|
146
|
+
* nested trace pollution).
|
|
147
|
+
*/
|
|
148
|
+
const callbacks = forwarder ? [forwarder] : [];
|
|
149
|
+
/**
|
|
150
|
+
* Inherit the parent's host `configurable` — host-set fields
|
|
151
|
+
* (`requestBody`, `user`, `userMCPAuthMap`, etc.) AND the run-
|
|
152
|
+
* identity fields (`run_id`, `parent_run_id`, `thread_id`) all
|
|
153
|
+
* propagate. LangGraph's own runtime keys are excluded because the
|
|
154
|
+
* child graph creates its own scratchpad/checkpoint/abort plumbing.
|
|
155
|
+
*
|
|
156
|
+
* Run-identity propagation is intentional and matches the
|
|
157
|
+
* convention this executor itself already uses for `SubagentStart`
|
|
158
|
+
* / `SubagentStop` hooks (`sessionId: this.parentRunId`): the
|
|
159
|
+
* subagent runs under the parent's session scope, not its own.
|
|
160
|
+
* Forwarding `run_id` / `parent_run_id` / `thread_id` makes
|
|
161
|
+
* `ToolNode`'s hook lookups (`hasHookFor(eventName, runId)`),
|
|
162
|
+
* `ToolOutputReferenceRegistry` keying, and trace lineage all
|
|
163
|
+
* resolve to the parent's session for tools dispatched from the
|
|
164
|
+
* subagent — so `PreToolUse` / `PostToolUse` hooks the host
|
|
165
|
+
* registered against the parent's run fire for subagent tool
|
|
166
|
+
* calls too. "Same run" matches the user-perceptual mental model.
|
|
167
|
+
*
|
|
168
|
+
* `thread_id` falls back to `childRunId` only when the parent
|
|
169
|
+
* didn't supply one (legacy behavior preserved for hosts that
|
|
170
|
+
* never set thread_id).
|
|
171
|
+
*
|
|
172
|
+
* NOTE: a future revision will likely make this configurable per
|
|
173
|
+
* spawn type — e.g. a background / async subagent that runs after
|
|
174
|
+
* the parent's run completes wants isolation, not inheritance.
|
|
175
|
+
* For now the inheritance path matches LibreChat's primary use
|
|
176
|
+
* case (synchronous subagents within a single user turn).
|
|
177
|
+
*/
|
|
178
|
+
const inheritedConfigurable = sanitizeChildConfigurable(params.parentConfigurable);
|
|
179
|
+
result = await workflow.invoke({ messages: [new _langchain_core_messages.HumanMessage(description)] }, {
|
|
180
|
+
recursionLimit: maxTurns * RECURSION_MULTIPLIER,
|
|
181
|
+
signal: this.parentSignal,
|
|
182
|
+
callbacks,
|
|
183
|
+
runName: `subagent:${subagentType}`,
|
|
184
|
+
configurable: {
|
|
185
|
+
thread_id: childRunId,
|
|
186
|
+
...inheritedConfigurable
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
} catch (error) {
|
|
190
|
+
const errorMessage = truncateErrorMessage(error);
|
|
191
|
+
if (forwarding) {
|
|
192
|
+
await forwarding.drain();
|
|
193
|
+
await this.emitSubagentUpdate(parentRegistry, {
|
|
194
|
+
childRunId,
|
|
195
|
+
subagentType,
|
|
196
|
+
subagentAgentId: childAgentId,
|
|
197
|
+
parentToolCallId,
|
|
198
|
+
phase: "error",
|
|
199
|
+
label: `Subagent "${subagentType}" errored: ${errorMessage}`,
|
|
200
|
+
data: { message: errorMessage }
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
childGraph.clearHeavyState();
|
|
204
|
+
return {
|
|
205
|
+
content: `Subagent error: ${errorMessage}`,
|
|
206
|
+
messages: []
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
const filteredContent = filterSubagentResult(result.messages);
|
|
210
|
+
if (this.hookRegistry?.hasHookFor("SubagentStop", this.parentRunId) === true)
|
|
211
|
+
/**
|
|
212
|
+
* Awaited (not fire-and-forget) for deterministic test synchronization
|
|
213
|
+
* and consistency with PostCompact. The parent is already waiting on the
|
|
214
|
+
* tool result, so the small extra latency is acceptable. Errors are
|
|
215
|
+
* swallowed — SubagentStop is observational.
|
|
216
|
+
*/
|
|
217
|
+
await require_executeHooks.executeHooks({
|
|
218
|
+
registry: this.hookRegistry,
|
|
219
|
+
input: {
|
|
220
|
+
hook_event_name: "SubagentStop",
|
|
221
|
+
runId: this.parentRunId,
|
|
222
|
+
threadId,
|
|
223
|
+
agentId: childAgentId,
|
|
224
|
+
agentType: subagentType,
|
|
225
|
+
messages: result.messages
|
|
226
|
+
},
|
|
227
|
+
sessionId: this.parentRunId,
|
|
228
|
+
matchQuery: subagentType
|
|
229
|
+
}).catch(() => {});
|
|
230
|
+
if (forwarding) {
|
|
231
|
+
await forwarding.drain();
|
|
232
|
+
await this.emitSubagentUpdate(parentRegistry, {
|
|
233
|
+
childRunId,
|
|
234
|
+
subagentType,
|
|
235
|
+
subagentAgentId: childAgentId,
|
|
236
|
+
parentToolCallId,
|
|
237
|
+
phase: "stop",
|
|
238
|
+
label: `Subagent "${subagentType}" finished`
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
childGraph.clearHeavyState();
|
|
242
|
+
return {
|
|
243
|
+
content: filteredContent,
|
|
244
|
+
messages: result.messages
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Emits a single {@link GraphEvents.ON_SUBAGENT_UPDATE} envelope through the
|
|
249
|
+
* parent's handler registry. Silent no-op when no parent registry is set.
|
|
250
|
+
* Errors are swallowed — update events are observational.
|
|
251
|
+
*/
|
|
252
|
+
async emitSubagentUpdate(parentRegistry, args) {
|
|
253
|
+
const handler = parentRegistry.getHandler("on_subagent_update");
|
|
254
|
+
if (!handler) return;
|
|
255
|
+
const event = {
|
|
256
|
+
runId: this.parentRunId,
|
|
257
|
+
subagentRunId: args.childRunId,
|
|
258
|
+
subagentType: args.subagentType,
|
|
259
|
+
subagentAgentId: args.subagentAgentId,
|
|
260
|
+
parentAgentId: this.parentAgentId,
|
|
261
|
+
parentToolCallId: args.parentToolCallId,
|
|
262
|
+
phase: args.phase,
|
|
263
|
+
data: args.data,
|
|
264
|
+
label: args.label,
|
|
265
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
266
|
+
};
|
|
267
|
+
try {
|
|
268
|
+
await handler.handle("on_subagent_update", event);
|
|
269
|
+
} catch {}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Builds a BaseCallbackHandler that intercepts the child graph's custom
|
|
273
|
+
* events. Routing rules:
|
|
274
|
+
* - `ON_TOOL_EXECUTE` → forwarded as-is to the parent's ON_TOOL_EXECUTE
|
|
275
|
+
* handler (so event-driven tools work identically for child and parent).
|
|
276
|
+
* - `ON_RUN_STEP` / `ON_RUN_STEP_DELTA` / `ON_RUN_STEP_COMPLETED` /
|
|
277
|
+
* `ON_MESSAGE_DELTA` / `ON_REASONING_DELTA` → wrapped in a
|
|
278
|
+
* {@link GraphEvents.ON_SUBAGENT_UPDATE} envelope with a human-readable
|
|
279
|
+
* label, delivered to the parent's subagent-update handler.
|
|
280
|
+
* - Everything else → ignored (keeps parent's UI scoped to the events it
|
|
281
|
+
* cares about; host apps can extend by registering more phases).
|
|
282
|
+
*/
|
|
283
|
+
createForwarderCallback(args) {
|
|
284
|
+
const { parentRegistry, subagentType, subagentAgentId, childRunId, parentToolCallId } = args;
|
|
285
|
+
const parentRunId = this.parentRunId;
|
|
286
|
+
const parentAgentId = this.parentAgentId;
|
|
287
|
+
const wrap = async (eventName, phase, data) => {
|
|
288
|
+
const handler = parentRegistry.getHandler("on_subagent_update");
|
|
289
|
+
if (!handler) return;
|
|
290
|
+
try {
|
|
291
|
+
const event = {
|
|
292
|
+
runId: parentRunId,
|
|
293
|
+
subagentRunId: childRunId,
|
|
294
|
+
subagentType,
|
|
295
|
+
subagentAgentId,
|
|
296
|
+
parentAgentId,
|
|
297
|
+
parentToolCallId,
|
|
298
|
+
phase,
|
|
299
|
+
data: sanitizeForwardedSubagentUpdateData(eventName, data),
|
|
300
|
+
label: summarizeEvent(eventName, data),
|
|
301
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
302
|
+
};
|
|
303
|
+
await handler.handle("on_subagent_update", event);
|
|
304
|
+
} catch {}
|
|
305
|
+
};
|
|
306
|
+
const queuedUpdates = [];
|
|
307
|
+
let drainPromise;
|
|
308
|
+
const enqueue = (update) => {
|
|
309
|
+
if (queuedUpdates.length >= MAX_PENDING_SUBAGENT_UPDATES) {
|
|
310
|
+
const dropIndex = queuedUpdates.findIndex((queued) => isDroppableSubagentUpdatePhase(queued.phase));
|
|
311
|
+
if (dropIndex >= 0) queuedUpdates.splice(dropIndex, 1);
|
|
312
|
+
else if (isDroppableSubagentUpdatePhase(update.phase)) return;
|
|
313
|
+
}
|
|
314
|
+
queuedUpdates.push(update);
|
|
315
|
+
};
|
|
316
|
+
const drain = async () => {
|
|
317
|
+
if (drainPromise != null) {
|
|
318
|
+
await drainPromise;
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
drainPromise = (async () => {
|
|
322
|
+
while (queuedUpdates.length > 0) {
|
|
323
|
+
const update = queuedUpdates.shift();
|
|
324
|
+
if (update == null) continue;
|
|
325
|
+
await wrap(update.eventName, update.phase, update.data);
|
|
326
|
+
}
|
|
327
|
+
})();
|
|
328
|
+
try {
|
|
329
|
+
await drainPromise;
|
|
330
|
+
} finally {
|
|
331
|
+
drainPromise = void 0;
|
|
332
|
+
if (queuedUpdates.length > 0) await drain();
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
const scheduleWrap = (eventName, phase, data) => {
|
|
336
|
+
enqueue({
|
|
337
|
+
eventName,
|
|
338
|
+
phase,
|
|
339
|
+
data
|
|
340
|
+
});
|
|
341
|
+
drain();
|
|
342
|
+
};
|
|
343
|
+
const handler = _langchain_core_callbacks_base.BaseCallbackHandler.fromMethods({ ["handleCustomEvent"]: async (eventName, data) => {
|
|
344
|
+
if (eventName === "on_tool_execute") {
|
|
345
|
+
const toolHandler = parentRegistry.getHandler("on_tool_execute");
|
|
346
|
+
if (toolHandler) await toolHandler.handle("on_tool_execute", data);
|
|
347
|
+
/**
|
|
348
|
+
* We also surface a short notice in the subagent-update stream so
|
|
349
|
+
* the UI can show "calling <tool>" for each tool the child spawns.
|
|
350
|
+
*/
|
|
351
|
+
scheduleWrap(eventName, "run_step", data);
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
if (eventName === "on_run_step") {
|
|
355
|
+
scheduleWrap(eventName, "run_step", data);
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (eventName === "on_run_step_delta") {
|
|
359
|
+
scheduleWrap(eventName, "run_step_delta", data);
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
if (eventName === "on_run_step_completed") {
|
|
363
|
+
scheduleWrap(eventName, "run_step_completed", data);
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
if (eventName === "on_message_delta") {
|
|
367
|
+
scheduleWrap(eventName, "message_delta", data);
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
if (eventName === "on_reasoning_delta") {
|
|
371
|
+
scheduleWrap(eventName, "reasoning_delta", data);
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
} });
|
|
375
|
+
/**
|
|
376
|
+
* `awaitHandlers = true` is required so the child's `ToolNode` actually
|
|
377
|
+
* blocks on the parent's `ON_TOOL_EXECUTE` handler until it resolves
|
|
378
|
+
* the batch request. Observational `ON_SUBAGENT_UPDATE` calls are queued
|
|
379
|
+
* behind a bounded sequential dispatcher so host UI publication cannot
|
|
380
|
+
* backpressure each child emission or run unbounded concurrent publishes.
|
|
381
|
+
* The executor drains this queue before terminal stop/error envelopes to
|
|
382
|
+
* preserve phase ordering.
|
|
383
|
+
*/
|
|
384
|
+
handler.awaitHandlers = true;
|
|
385
|
+
return {
|
|
386
|
+
handler,
|
|
387
|
+
drain
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
};
|
|
426
391
|
function sanitizeChildConfigurable(parentConfigurable) {
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
}
|
|
430
|
-
return Object.fromEntries(Object.entries(parentConfigurable).filter(([key]) => !isLangGraphRuntimeConfigKey(key)));
|
|
392
|
+
if (parentConfigurable == null) return {};
|
|
393
|
+
return Object.fromEntries(Object.entries(parentConfigurable).filter(([key]) => !isLangGraphRuntimeConfigKey(key)));
|
|
431
394
|
}
|
|
432
395
|
function isLangGraphRuntimeConfigKey(key) {
|
|
433
|
-
|
|
434
|
-
LANGGRAPH_CHECKPOINT_CONFIG_KEYS.has(key));
|
|
396
|
+
return key.startsWith(LANGGRAPH_RUNTIME_CONFIG_PREFIX) || LANGGRAPH_CHECKPOINT_CONFIG_KEYS.has(key);
|
|
435
397
|
}
|
|
436
398
|
function sanitizeForwardedSubagentUpdateData(eventName, data) {
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
if (eventName === _enum.GraphEvents.ON_RUN_STEP_DELTA) {
|
|
444
|
-
return sanitizeRunStepDeltaUpdateData(data);
|
|
445
|
-
}
|
|
446
|
-
if (eventName === _enum.GraphEvents.ON_RUN_STEP_COMPLETED) {
|
|
447
|
-
return sanitizeRunStepCompletedUpdateData(data);
|
|
448
|
-
}
|
|
449
|
-
if (eventName === _enum.GraphEvents.ON_MESSAGE_DELTA) {
|
|
450
|
-
return sanitizeMessageDeltaUpdateData(data);
|
|
451
|
-
}
|
|
452
|
-
if (eventName === _enum.GraphEvents.ON_REASONING_DELTA) {
|
|
453
|
-
return sanitizeReasoningDeltaUpdateData(data);
|
|
454
|
-
}
|
|
455
|
-
return undefined;
|
|
399
|
+
if (eventName === "on_tool_execute") return sanitizeToolExecuteUpdateData(data);
|
|
400
|
+
if (eventName === "on_run_step") return sanitizeRunStepUpdateData(data);
|
|
401
|
+
if (eventName === "on_run_step_delta") return sanitizeRunStepDeltaUpdateData(data);
|
|
402
|
+
if (eventName === "on_run_step_completed") return sanitizeRunStepCompletedUpdateData(data);
|
|
403
|
+
if (eventName === "on_message_delta") return sanitizeMessageDeltaUpdateData(data);
|
|
404
|
+
if (eventName === "on_reasoning_delta") return sanitizeReasoningDeltaUpdateData(data);
|
|
456
405
|
}
|
|
457
406
|
function isDroppableSubagentUpdatePhase(phase) {
|
|
458
|
-
|
|
459
|
-
phase === 'reasoning_delta' ||
|
|
460
|
-
phase === 'run_step_delta');
|
|
407
|
+
return phase === "message_delta" || phase === "reasoning_delta" || phase === "run_step_delta";
|
|
461
408
|
}
|
|
462
409
|
function sanitizeToolExecuteUpdateData(data) {
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
const sanitized = { toolCalls };
|
|
468
|
-
if (typeof request.agentId === 'string') {
|
|
469
|
-
sanitized.agentId = request.agentId;
|
|
470
|
-
}
|
|
471
|
-
return sanitized;
|
|
410
|
+
const request = data;
|
|
411
|
+
const sanitized = { toolCalls: Array.isArray(request.toolCalls) ? request.toolCalls.map(sanitizeToolCallForUpdate) : [] };
|
|
412
|
+
if (typeof request.agentId === "string") sanitized.agentId = request.agentId;
|
|
413
|
+
return sanitized;
|
|
472
414
|
}
|
|
473
415
|
function sanitizeToolCallForUpdate(call) {
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
return sanitized;
|
|
416
|
+
return {
|
|
417
|
+
id: call.id,
|
|
418
|
+
name: call.name,
|
|
419
|
+
args: call.args
|
|
420
|
+
};
|
|
480
421
|
}
|
|
481
422
|
function sanitizeRunStepUpdateData(data) {
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
}
|
|
497
|
-
if (step.usage !== undefined) {
|
|
498
|
-
sanitized.usage = step.usage;
|
|
499
|
-
}
|
|
500
|
-
sanitized.stepDetails = sanitizeStepDetails(step.stepDetails);
|
|
501
|
-
return sanitized;
|
|
423
|
+
if (!isObjectLike(data)) return;
|
|
424
|
+
const step = data;
|
|
425
|
+
const sanitized = {};
|
|
426
|
+
assignString(sanitized, "agentId", step.agentId);
|
|
427
|
+
assignNumber(sanitized, "groupId", step.groupId);
|
|
428
|
+
assignString(sanitized, "id", step.id);
|
|
429
|
+
assignNumber(sanitized, "index", step.index);
|
|
430
|
+
assignString(sanitized, "runId", step.runId);
|
|
431
|
+
assignNumber(sanitized, "stepIndex", step.stepIndex);
|
|
432
|
+
assignString(sanitized, "type", step.type);
|
|
433
|
+
if (step.summary !== void 0) sanitized.summary = step.summary;
|
|
434
|
+
if (step.usage !== void 0) sanitized.usage = step.usage;
|
|
435
|
+
sanitized.stepDetails = sanitizeStepDetails(step.stepDetails);
|
|
436
|
+
return sanitized;
|
|
502
437
|
}
|
|
503
438
|
function sanitizeRunStepDeltaUpdateData(data) {
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
sanitized.delta = sanitizeToolCallDelta(event.delta);
|
|
511
|
-
return sanitized;
|
|
439
|
+
if (!isObjectLike(data)) return;
|
|
440
|
+
const event = data;
|
|
441
|
+
const sanitized = {};
|
|
442
|
+
assignString(sanitized, "id", event.id);
|
|
443
|
+
sanitized.delta = sanitizeToolCallDelta(event.delta);
|
|
444
|
+
return sanitized;
|
|
512
445
|
}
|
|
513
446
|
function sanitizeRunStepCompletedUpdateData(data) {
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
}
|
|
517
|
-
const event = data;
|
|
518
|
-
return { result: sanitizeStepCompleted(event.result) };
|
|
447
|
+
if (!isObjectLike(data)) return;
|
|
448
|
+
return { result: sanitizeStepCompleted(data.result) };
|
|
519
449
|
}
|
|
520
450
|
function sanitizeMessageDeltaUpdateData(data) {
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
}
|
|
532
|
-
if (event.delta.tool_call_ids !== undefined) {
|
|
533
|
-
sanitized.delta.tool_call_ids = event.delta.tool_call_ids;
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
return sanitized;
|
|
451
|
+
if (!isObjectLike(data)) return;
|
|
452
|
+
const event = data;
|
|
453
|
+
const sanitized = {};
|
|
454
|
+
assignString(sanitized, "id", event.id);
|
|
455
|
+
if (event.delta != null) {
|
|
456
|
+
sanitized.delta = {};
|
|
457
|
+
if (event.delta.content !== void 0) sanitized.delta.content = event.delta.content;
|
|
458
|
+
if (event.delta.tool_call_ids !== void 0) sanitized.delta.tool_call_ids = event.delta.tool_call_ids;
|
|
459
|
+
}
|
|
460
|
+
return sanitized;
|
|
537
461
|
}
|
|
538
462
|
function sanitizeReasoningDeltaUpdateData(data) {
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
if (event.delta?.content !== undefined) {
|
|
546
|
-
sanitized.delta = { content: event.delta.content };
|
|
547
|
-
}
|
|
548
|
-
return sanitized;
|
|
463
|
+
if (!isObjectLike(data)) return;
|
|
464
|
+
const event = data;
|
|
465
|
+
const sanitized = {};
|
|
466
|
+
assignString(sanitized, "id", event.id);
|
|
467
|
+
if (event.delta?.content !== void 0) sanitized.delta = { content: event.delta.content };
|
|
468
|
+
return sanitized;
|
|
549
469
|
}
|
|
550
470
|
function sanitizeStepDetails(stepDetails) {
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
}
|
|
565
|
-
if (rawDetails.type === _enum.StepTypes.TOOL_CALLS) {
|
|
566
|
-
const sanitized = {
|
|
567
|
-
type: _enum.StepTypes.TOOL_CALLS,
|
|
568
|
-
};
|
|
569
|
-
if (Array.isArray(rawDetails.tool_calls)) {
|
|
570
|
-
sanitized.tool_calls = rawDetails.tool_calls.map(sanitizeAgentToolCall);
|
|
571
|
-
}
|
|
572
|
-
return sanitized;
|
|
573
|
-
}
|
|
574
|
-
return undefined;
|
|
471
|
+
if (!isObjectLike(stepDetails)) return;
|
|
472
|
+
const rawDetails = stepDetails;
|
|
473
|
+
if (rawDetails.type === "message_creation") {
|
|
474
|
+
const sanitized = { type: "message_creation" };
|
|
475
|
+
const messageId = rawDetails.message_creation?.message_id;
|
|
476
|
+
if (typeof messageId === "string") sanitized.message_creation = { message_id: messageId };
|
|
477
|
+
return sanitized;
|
|
478
|
+
}
|
|
479
|
+
if (rawDetails.type === "tool_calls") {
|
|
480
|
+
const sanitized = { type: "tool_calls" };
|
|
481
|
+
if (Array.isArray(rawDetails.tool_calls)) sanitized.tool_calls = rawDetails.tool_calls.map(sanitizeAgentToolCall);
|
|
482
|
+
return sanitized;
|
|
483
|
+
}
|
|
575
484
|
}
|
|
576
485
|
function sanitizeToolCallDelta(delta) {
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
sanitized.summary = delta.summary;
|
|
586
|
-
}
|
|
587
|
-
if (Array.isArray(delta.tool_calls)) {
|
|
588
|
-
sanitized.tool_calls = delta.tool_calls.map(sanitizeAgentToolCall);
|
|
589
|
-
}
|
|
590
|
-
return sanitized;
|
|
486
|
+
if (!isObjectLike(delta)) return;
|
|
487
|
+
const sanitized = {};
|
|
488
|
+
assignString(sanitized, "auth", delta.auth);
|
|
489
|
+
assignNumber(sanitized, "expires_at", delta.expires_at);
|
|
490
|
+
assignString(sanitized, "type", delta.type);
|
|
491
|
+
if (delta.summary !== void 0) sanitized.summary = delta.summary;
|
|
492
|
+
if (Array.isArray(delta.tool_calls)) sanitized.tool_calls = delta.tool_calls.map(sanitizeAgentToolCall);
|
|
493
|
+
return sanitized;
|
|
591
494
|
}
|
|
592
495
|
function sanitizeStepCompleted(data) {
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
}
|
|
606
|
-
const sanitized = { type: 'tool_call' };
|
|
607
|
-
assignString(sanitized, 'id', completed.id);
|
|
608
|
-
assignNumber(sanitized, 'index', completed.index);
|
|
609
|
-
sanitized.tool_call = sanitizeProcessedToolCall(completed.tool_call);
|
|
610
|
-
return sanitized;
|
|
496
|
+
if (!isObjectLike(data)) return;
|
|
497
|
+
const completed = data;
|
|
498
|
+
if (completed.type === "summary") return {
|
|
499
|
+
type: "summary",
|
|
500
|
+
summary: completed.summary
|
|
501
|
+
};
|
|
502
|
+
if (completed.type !== "tool_call") return;
|
|
503
|
+
const sanitized = { type: "tool_call" };
|
|
504
|
+
assignString(sanitized, "id", completed.id);
|
|
505
|
+
assignNumber(sanitized, "index", completed.index);
|
|
506
|
+
sanitized.tool_call = sanitizeProcessedToolCall(completed.tool_call);
|
|
507
|
+
return sanitized;
|
|
611
508
|
}
|
|
612
509
|
function sanitizeProcessedToolCall(toolCall) {
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
}
|
|
623
|
-
assignString(sanitized, 'output', call.output);
|
|
624
|
-
assignNumber(sanitized, 'progress', call.progress);
|
|
625
|
-
return sanitized;
|
|
510
|
+
if (!isObjectLike(toolCall)) return;
|
|
511
|
+
const call = toolCall;
|
|
512
|
+
const sanitized = {};
|
|
513
|
+
assignString(sanitized, "id", call.id);
|
|
514
|
+
assignString(sanitized, "name", call.name);
|
|
515
|
+
if (call.args !== void 0) sanitized.args = call.args;
|
|
516
|
+
assignString(sanitized, "output", call.output);
|
|
517
|
+
assignNumber(sanitized, "progress", call.progress);
|
|
518
|
+
return sanitized;
|
|
626
519
|
}
|
|
627
520
|
function sanitizeAgentToolCall(toolCall) {
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
if (typeof call.function.arguments === 'string' ||
|
|
643
|
-
isObjectLike(call.function.arguments)) {
|
|
644
|
-
fn.arguments = call.function.arguments;
|
|
645
|
-
}
|
|
646
|
-
sanitized.function = fn;
|
|
647
|
-
}
|
|
648
|
-
return sanitized;
|
|
521
|
+
if (!isObjectLike(toolCall)) return {};
|
|
522
|
+
const call = toolCall;
|
|
523
|
+
const sanitized = {};
|
|
524
|
+
assignString(sanitized, "id", call.id);
|
|
525
|
+
assignString(sanitized, "name", call.name);
|
|
526
|
+
assignString(sanitized, "type", call.type);
|
|
527
|
+
if (call.args !== void 0) sanitized.args = call.args;
|
|
528
|
+
if (isObjectLike(call.function)) {
|
|
529
|
+
const fn = {};
|
|
530
|
+
assignString(fn, "name", call.function.name);
|
|
531
|
+
if (typeof call.function.arguments === "string" || isObjectLike(call.function.arguments)) fn.arguments = call.function.arguments;
|
|
532
|
+
sanitized.function = fn;
|
|
533
|
+
}
|
|
534
|
+
return sanitized;
|
|
649
535
|
}
|
|
650
536
|
function isObjectLike(value) {
|
|
651
|
-
|
|
537
|
+
return value != null && typeof value === "object" && !Array.isArray(value);
|
|
652
538
|
}
|
|
653
539
|
function assignString(target, key, value) {
|
|
654
|
-
|
|
655
|
-
target[key] = value;
|
|
656
|
-
}
|
|
540
|
+
if (typeof value === "string") target[key] = value;
|
|
657
541
|
}
|
|
658
542
|
function assignNumber(target, key, value) {
|
|
659
|
-
|
|
660
|
-
target[key] = value;
|
|
661
|
-
}
|
|
543
|
+
if (typeof value === "number") target[key] = value;
|
|
662
544
|
}
|
|
663
545
|
/**
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
546
|
+
* Produces a short single-line label for an arbitrary forwarded child event.
|
|
547
|
+
* Used to populate {@link SubagentUpdateEvent.label} so the host UI can show
|
|
548
|
+
* a compact status ticker without parsing the raw payload.
|
|
549
|
+
*/
|
|
668
550
|
function summarizeEvent(eventName, data) {
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
return `Step: ${detailType}`;
|
|
691
|
-
}
|
|
692
|
-
if (eventName === _enum.GraphEvents.ON_RUN_STEP_COMPLETED) {
|
|
693
|
-
const step = data;
|
|
694
|
-
const tool = step.result?.tool_call;
|
|
695
|
-
if (tool?.name != null && tool.name !== '') {
|
|
696
|
-
return `Tool ${tool.name} complete`;
|
|
697
|
-
}
|
|
698
|
-
return 'Step complete';
|
|
699
|
-
}
|
|
700
|
-
if (eventName === _enum.GraphEvents.ON_MESSAGE_DELTA) {
|
|
701
|
-
return 'Streaming…';
|
|
702
|
-
}
|
|
703
|
-
return eventName;
|
|
551
|
+
if (eventName === "on_tool_execute") {
|
|
552
|
+
const names = (data.toolCalls ?? []).map((c) => c.name).filter((n) => typeof n === "string");
|
|
553
|
+
return names.length > 0 ? `Calling ${names.join(", ")}` : "Calling tool";
|
|
554
|
+
}
|
|
555
|
+
if (eventName === "on_run_step") {
|
|
556
|
+
const step = data;
|
|
557
|
+
const detailType = step.stepDetails?.type ?? step.type ?? "step";
|
|
558
|
+
if (detailType === "tool_calls") {
|
|
559
|
+
const names = (step.stepDetails?.tool_calls ?? []).map((c) => c.name).filter((n) => typeof n === "string");
|
|
560
|
+
return names.length > 0 ? `Using tool: ${names.join(", ")}` : "Planning tool call";
|
|
561
|
+
}
|
|
562
|
+
if (detailType === "message_creation") return "Thinking…";
|
|
563
|
+
return `Step: ${detailType}`;
|
|
564
|
+
}
|
|
565
|
+
if (eventName === "on_run_step_completed") {
|
|
566
|
+
const tool = data.result?.tool_call;
|
|
567
|
+
if (tool?.name != null && tool.name !== "") return `Tool ${tool.name} complete`;
|
|
568
|
+
return "Step complete";
|
|
569
|
+
}
|
|
570
|
+
if (eventName === "on_message_delta") return "Streaming…";
|
|
571
|
+
return eventName;
|
|
704
572
|
}
|
|
705
573
|
/**
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
574
|
+
* Walk messages from last to first, returning the text content of the most
|
|
575
|
+
* recent AIMessage that has any. Non-text blocks (tool_use, thinking,
|
|
576
|
+
* redacted_thinking, tool_result) are stripped. If the last AIMessage is
|
|
577
|
+
* pure tool_use (e.g. the subagent hit `maxTurns` mid-tool-call), the walk
|
|
578
|
+
* continues to earlier AIMessages so partial progress is salvaged — this
|
|
579
|
+
* matches Claude Code's behavior in `agentToolUtils.finalizeAgentTool`.
|
|
580
|
+
* Returns "Task completed" only when no AIMessage in the history contains
|
|
581
|
+
* any text.
|
|
582
|
+
*/
|
|
715
583
|
function filterSubagentResult(messages) {
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
for (const block of content) {
|
|
731
|
-
if (typeof block === 'string') {
|
|
732
|
-
textParts.push(block);
|
|
733
|
-
}
|
|
734
|
-
else if ('type' in block && block.type === 'text' && 'text' in block) {
|
|
735
|
-
textParts.push(block.text);
|
|
736
|
-
}
|
|
737
|
-
}
|
|
738
|
-
if (textParts.length > 0) {
|
|
739
|
-
return textParts.join('\n');
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
return 'Task completed';
|
|
584
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
585
|
+
if (messages[i]._getType() !== "ai") continue;
|
|
586
|
+
const content = messages[i].content;
|
|
587
|
+
if (typeof content === "string") {
|
|
588
|
+
if (content) return content;
|
|
589
|
+
continue;
|
|
590
|
+
}
|
|
591
|
+
if (!Array.isArray(content)) continue;
|
|
592
|
+
const textParts = [];
|
|
593
|
+
for (const block of content) if (typeof block === "string") textParts.push(block);
|
|
594
|
+
else if ("type" in block && block.type === "text" && "text" in block) textParts.push(block.text);
|
|
595
|
+
if (textParts.length > 0) return textParts.join("\n");
|
|
596
|
+
}
|
|
597
|
+
return "Task completed";
|
|
743
598
|
}
|
|
744
599
|
/**
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
600
|
+
* Resolve self-spawn configs by filling in agentInputs from the parent context.
|
|
601
|
+
* Returns configs with agentInputs guaranteed present. Throws on duplicate
|
|
602
|
+
* `type` values to prevent silent config shadowing.
|
|
603
|
+
*/
|
|
749
604
|
function resolveSubagentConfigs(configs, parentContext) {
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
const seenTypes = new Set();
|
|
765
|
-
for (const config of resolved) {
|
|
766
|
-
if (seenTypes.has(config.type)) {
|
|
767
|
-
throw new Error(`Duplicate subagent type "${config.type}". Each SubagentConfig must have a unique "type" field.`);
|
|
768
|
-
}
|
|
769
|
-
seenTypes.add(config.type);
|
|
770
|
-
}
|
|
771
|
-
return resolved;
|
|
605
|
+
const resolved = configs.map((config) => {
|
|
606
|
+
if (config.agentInputs != null) return config;
|
|
607
|
+
if (config.self !== true || parentContext._sourceInputs == null) return null;
|
|
608
|
+
return {
|
|
609
|
+
...config,
|
|
610
|
+
agentInputs: { ...parentContext._sourceInputs }
|
|
611
|
+
};
|
|
612
|
+
}).filter((c) => c != null);
|
|
613
|
+
const seenTypes = /* @__PURE__ */ new Set();
|
|
614
|
+
for (const config of resolved) {
|
|
615
|
+
if (seenTypes.has(config.type)) throw new Error(`Duplicate subagent type "${config.type}". Each SubagentConfig must have a unique "type" field.`);
|
|
616
|
+
seenTypes.add(config.type);
|
|
617
|
+
}
|
|
618
|
+
return resolved;
|
|
772
619
|
}
|
|
773
620
|
/**
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
621
|
+
* Build child AgentInputs from a resolved config, stripping nesting and
|
|
622
|
+
* (optionally) event-driven fields. When `allowNested: true`, the child's
|
|
623
|
+
* `maxSubagentDepth` is decremented so that depth is consumed as the call
|
|
624
|
+
* chain deepens across graph boundaries — the parent's executor-level check
|
|
625
|
+
* alone cannot see into the child graph's separate executor.
|
|
626
|
+
*
|
|
627
|
+
* When `keepToolDefinitions` is `true`, the child retains the parent's
|
|
628
|
+
* `toolDefinitions` so event-driven tools remain usable. This is only safe
|
|
629
|
+
* when the caller has wired a forwarder for `ON_TOOL_EXECUTE` to a
|
|
630
|
+
* registered handler — otherwise the child will hang on tool dispatch.
|
|
631
|
+
*
|
|
632
|
+
* @remarks Advanced utility: exported primarily for testing and by
|
|
633
|
+
* {@link SubagentExecutor}. Host applications configuring subagents should
|
|
634
|
+
* not need to call this directly — it is invoked internally when a subagent
|
|
635
|
+
* tool is dispatched. The depth-countdown contract (parent's `maxDepth` in,
|
|
636
|
+
* child's decremented `maxSubagentDepth` on the returned inputs) is the
|
|
637
|
+
* mechanism that bounds nesting across graph boundaries; callers must
|
|
638
|
+
* respect it.
|
|
639
|
+
*/
|
|
793
640
|
function buildChildInputs(config, childAgentId, parentMaxDepth, keepToolDefinitions = false) {
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
childInputs.subagentConfigs = undefined;
|
|
818
|
-
childInputs.maxSubagentDepth = undefined;
|
|
819
|
-
}
|
|
820
|
-
return childInputs;
|
|
641
|
+
const { agentInputs } = config;
|
|
642
|
+
const childInputs = {
|
|
643
|
+
...agentInputs,
|
|
644
|
+
agentId: childAgentId,
|
|
645
|
+
toolDefinitions: keepToolDefinitions ? agentInputs.toolDefinitions : void 0,
|
|
646
|
+
/**
|
|
647
|
+
* Subagents run in an isolated context by contract. Parent-run-scoped
|
|
648
|
+
* fields that would otherwise survive the shallow-spread clone — the
|
|
649
|
+
* cross-run conversation summary and the prior-turn tool-discovery
|
|
650
|
+
* set — are cleared here so the child starts fresh. Host applications
|
|
651
|
+
* that want a subagent to see parent context must thread it in
|
|
652
|
+
* explicitly (e.g. via the `description` argument to the subagent
|
|
653
|
+
* tool), not via inherited state.
|
|
654
|
+
*/
|
|
655
|
+
initialSummary: void 0,
|
|
656
|
+
discoveredTools: void 0
|
|
657
|
+
};
|
|
658
|
+
if (config.allowNested === true) childInputs.maxSubagentDepth = Math.max(0, parentMaxDepth - 1);
|
|
659
|
+
else {
|
|
660
|
+
childInputs.subagentConfigs = void 0;
|
|
661
|
+
childInputs.maxSubagentDepth = void 0;
|
|
662
|
+
}
|
|
663
|
+
return childInputs;
|
|
821
664
|
}
|
|
822
665
|
function truncateErrorMessage(error) {
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
}
|
|
827
|
-
return `${message.slice(0, ERROR_MESSAGE_MAX_CHARS)}...`;
|
|
666
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
667
|
+
if (message.length <= ERROR_MESSAGE_MAX_CHARS) return message;
|
|
668
|
+
return `${message.slice(0, ERROR_MESSAGE_MAX_CHARS)}...`;
|
|
828
669
|
}
|
|
829
|
-
|
|
670
|
+
//#endregion
|
|
830
671
|
exports.SubagentExecutor = SubagentExecutor;
|
|
831
672
|
exports.buildChildInputs = buildChildInputs;
|
|
832
673
|
exports.filterSubagentResult = filterSubagentResult;
|
|
833
674
|
exports.resolveSubagentConfigs = resolveSubagentConfigs;
|
|
834
|
-
exports.sanitizeForwardedSubagentUpdateData = sanitizeForwardedSubagentUpdateData;
|
|
835
675
|
exports.summarizeEvent = summarizeEvent;
|
|
836
|
-
|
|
676
|
+
|
|
677
|
+
//# sourceMappingURL=SubagentExecutor.cjs.map
|