@illuma-ai/agents 1.4.0-alpha.6 → 1.5.0
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/README.md +62 -0
- package/dist/cjs/agents/AgentContext.cjs +274 -67
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/common/enum.cjs +44 -13
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +182 -5
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +152 -1167
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/hooks/HookRegistry.cjs +162 -0
- package/dist/cjs/hooks/HookRegistry.cjs.map +1 -0
- package/dist/cjs/hooks/executeHooks.cjs +276 -0
- package/dist/cjs/hooks/executeHooks.cjs.map +1 -0
- package/dist/cjs/hooks/matchers.cjs +256 -0
- package/dist/cjs/hooks/matchers.cjs.map +1 -0
- package/dist/cjs/hooks/types.cjs +27 -0
- package/dist/cjs/hooks/types.cjs.map +1 -0
- package/dist/cjs/langchain/google-common.cjs +3 -0
- package/dist/cjs/langchain/google-common.cjs.map +1 -0
- package/dist/cjs/langchain/index.cjs +86 -0
- package/dist/cjs/langchain/index.cjs.map +1 -0
- package/dist/cjs/langchain/language_models/chat_models.cjs +3 -0
- package/dist/cjs/langchain/language_models/chat_models.cjs.map +1 -0
- package/dist/cjs/langchain/messages/tool.cjs +3 -0
- package/dist/cjs/langchain/messages/tool.cjs.map +1 -0
- package/dist/cjs/langchain/messages.cjs +51 -0
- package/dist/cjs/langchain/messages.cjs.map +1 -0
- package/dist/cjs/langchain/openai.cjs +3 -0
- package/dist/cjs/langchain/openai.cjs.map +1 -0
- package/dist/cjs/langchain/prompts.cjs +11 -0
- package/dist/cjs/langchain/prompts.cjs.map +1 -0
- package/dist/cjs/langchain/runnables.cjs +19 -0
- package/dist/cjs/langchain/runnables.cjs.map +1 -0
- package/dist/cjs/langchain/tools.cjs +23 -0
- package/dist/cjs/langchain/tools.cjs.map +1 -0
- package/dist/cjs/langchain/utils/env.cjs +11 -0
- package/dist/cjs/langchain/utils/env.cjs.map +1 -0
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +5 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/cacheSupport.cjs +55 -0
- package/dist/cjs/llm/bedrock/cacheSupport.cjs.map +1 -0
- package/dist/cjs/llm/bedrock/index.cjs +61 -33
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +0 -3
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs +27 -10
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +178 -127
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +89 -0
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/contextPruning.cjs +156 -0
- package/dist/cjs/messages/contextPruning.cjs.map +1 -0
- package/dist/cjs/messages/contextPruningSettings.cjs +53 -0
- package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -0
- package/dist/cjs/messages/format.cjs +144 -20
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/prune.cjs +505 -4
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/run.cjs +141 -1
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/tools/BashExecutor.cjs +235 -0
- package/dist/cjs/tools/BashExecutor.cjs.map +1 -0
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +297 -0
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -0
- package/dist/cjs/tools/CodeExecutor.cjs +44 -47
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +16 -11
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/ReadFile.cjs +44 -0
- package/dist/cjs/tools/ReadFile.cjs.map +1 -0
- package/dist/cjs/tools/SkillTool.cjs +51 -0
- package/dist/cjs/tools/SkillTool.cjs.map +1 -0
- package/dist/cjs/tools/SubagentTool.cjs +93 -0
- package/dist/cjs/tools/SubagentTool.cjs.map +1 -0
- package/dist/cjs/tools/ToolNode.cjs +450 -24
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +11 -3
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/tavily-scraper.cjs +189 -0
- package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -0
- package/dist/cjs/tools/search/tavily-search.cjs +372 -0
- package/dist/cjs/tools/search/tavily-search.cjs.map +1 -0
- package/dist/cjs/tools/search/tool.cjs +28 -4
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs +10 -3
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/cjs/tools/skillCatalog.cjs +84 -0
- package/dist/cjs/tools/skillCatalog.cjs.map +1 -0
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +512 -0
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -0
- package/dist/cjs/tools/toolOutputReferences.cjs +670 -0
- package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -0
- package/dist/cjs/types/agent-cache.cjs +53 -0
- package/dist/cjs/types/agent-cache.cjs.map +1 -0
- package/dist/cjs/types/graph.cjs.map +1 -1
- package/dist/cjs/utils/truncation.cjs +135 -0
- package/dist/cjs/utils/truncation.cjs.map +1 -0
- package/dist/esm/agents/AgentContext.mjs +274 -67
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/common/enum.mjs +44 -12
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +182 -5
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +155 -1170
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/hooks/HookRegistry.mjs +160 -0
- package/dist/esm/hooks/HookRegistry.mjs.map +1 -0
- package/dist/esm/hooks/executeHooks.mjs +273 -0
- package/dist/esm/hooks/executeHooks.mjs.map +1 -0
- package/dist/esm/hooks/matchers.mjs +251 -0
- package/dist/esm/hooks/matchers.mjs.map +1 -0
- package/dist/esm/hooks/types.mjs +25 -0
- package/dist/esm/hooks/types.mjs.map +1 -0
- package/dist/esm/langchain/google-common.mjs +2 -0
- package/dist/esm/langchain/google-common.mjs.map +1 -0
- package/dist/esm/langchain/index.mjs +5 -0
- package/dist/esm/langchain/language_models/chat_models.mjs +2 -0
- package/dist/esm/langchain/language_models/chat_models.mjs.map +1 -0
- package/dist/esm/langchain/messages/tool.mjs +2 -0
- package/dist/esm/langchain/messages/tool.mjs.map +1 -0
- package/dist/esm/langchain/messages.mjs +2 -0
- package/dist/esm/langchain/messages.mjs.map +1 -0
- package/dist/esm/langchain/openai.mjs +2 -0
- package/dist/esm/langchain/openai.mjs.map +1 -0
- package/dist/esm/langchain/prompts.mjs +2 -0
- package/dist/esm/langchain/prompts.mjs.map +1 -0
- package/dist/esm/langchain/runnables.mjs +2 -0
- package/dist/esm/langchain/runnables.mjs.map +1 -0
- package/dist/esm/langchain/tools.mjs +2 -0
- package/dist/esm/langchain/tools.mjs.map +1 -0
- package/dist/esm/langchain/utils/env.mjs +2 -0
- package/dist/esm/langchain/utils/env.mjs.map +1 -0
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +5 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/cacheSupport.mjs +52 -0
- package/dist/esm/llm/bedrock/cacheSupport.mjs.map +1 -0
- package/dist/esm/llm/bedrock/index.mjs +61 -34
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +0 -3
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs +27 -10
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/main.mjs +21 -27
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/messages/cache.mjs +89 -0
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/contextPruning.mjs +154 -0
- package/dist/esm/messages/contextPruning.mjs.map +1 -0
- package/dist/esm/messages/contextPruningSettings.mjs +50 -0
- package/dist/esm/messages/contextPruningSettings.mjs.map +1 -0
- package/dist/esm/messages/format.mjs +136 -12
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/prune.mjs +504 -7
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/run.mjs +141 -1
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/tools/BashExecutor.mjs +227 -0
- package/dist/esm/tools/BashExecutor.mjs.map +1 -0
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs +288 -0
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -0
- package/dist/esm/tools/CodeExecutor.mjs +44 -48
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +17 -12
- package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/ReadFile.mjs +39 -0
- package/dist/esm/tools/ReadFile.mjs.map +1 -0
- package/dist/esm/tools/SkillTool.mjs +46 -0
- package/dist/esm/tools/SkillTool.mjs.map +1 -0
- package/dist/esm/tools/SubagentTool.mjs +86 -0
- package/dist/esm/tools/SubagentTool.mjs.map +1 -0
- package/dist/esm/tools/ToolNode.mjs +452 -26
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +11 -3
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/tavily-scraper.mjs +186 -0
- package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -0
- package/dist/esm/tools/search/tavily-search.mjs +370 -0
- package/dist/esm/tools/search/tavily-search.mjs.map +1 -0
- package/dist/esm/tools/search/tool.mjs +28 -4
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs +10 -3
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/esm/tools/skillCatalog.mjs +82 -0
- package/dist/esm/tools/skillCatalog.mjs.map +1 -0
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +506 -0
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -0
- package/dist/esm/tools/toolOutputReferences.mjs +662 -0
- package/dist/esm/tools/toolOutputReferences.mjs.map +1 -0
- package/dist/esm/types/agent-cache.mjs +51 -0
- package/dist/esm/types/agent-cache.mjs.map +1 -0
- package/dist/esm/types/graph.mjs.map +1 -1
- package/dist/esm/utils/truncation.mjs +128 -0
- package/dist/esm/utils/truncation.mjs.map +1 -0
- package/dist/types/agents/AgentContext.d.ts +101 -8
- package/dist/types/common/enum.d.ts +39 -12
- package/dist/types/common/index.d.ts +0 -1
- package/dist/types/graphs/Graph.d.ts +43 -0
- package/dist/types/graphs/MultiAgentGraph.d.ts +26 -150
- package/dist/types/graphs/index.d.ts +0 -1
- package/dist/types/hooks/HookRegistry.d.ts +56 -0
- package/dist/types/hooks/executeHooks.d.ts +79 -0
- package/dist/types/hooks/index.d.ts +6 -0
- package/dist/types/hooks/matchers.d.ts +95 -0
- package/dist/types/hooks/types.d.ts +320 -0
- package/dist/types/index.d.ts +9 -9
- package/dist/types/langchain/google-common.d.ts +1 -0
- package/dist/types/langchain/index.d.ts +8 -0
- package/dist/types/langchain/language_models/chat_models.d.ts +1 -0
- package/dist/types/langchain/messages/tool.d.ts +1 -0
- package/dist/types/langchain/messages.d.ts +2 -0
- package/dist/types/langchain/openai.d.ts +1 -0
- package/dist/types/langchain/prompts.d.ts +1 -0
- package/dist/types/langchain/runnables.d.ts +2 -0
- package/dist/types/langchain/tools.d.ts +2 -0
- package/dist/types/langchain/utils/env.d.ts +1 -0
- package/dist/types/llm/bedrock/cacheSupport.d.ts +35 -0
- package/dist/types/llm/bedrock/index.d.ts +54 -1
- package/dist/types/messages/contextPruning.d.ts +42 -0
- package/dist/types/messages/contextPruningSettings.d.ts +44 -0
- package/dist/types/messages/format.d.ts +9 -1
- package/dist/types/messages/index.d.ts +2 -0
- package/dist/types/messages/prune.d.ts +91 -1
- package/dist/types/run.d.ts +2 -0
- package/dist/types/tools/BashExecutor.d.ts +76 -0
- package/dist/types/tools/BashProgrammaticToolCalling.d.ts +72 -0
- package/dist/types/tools/CodeExecutor.d.ts +8 -26
- package/dist/types/tools/ReadFile.d.ts +28 -0
- package/dist/types/tools/SkillTool.d.ts +40 -0
- package/dist/types/tools/SubagentTool.d.ts +36 -0
- package/dist/types/tools/ToolNode.d.ts +77 -5
- package/dist/types/tools/search/tavily-scraper.d.ts +19 -0
- package/dist/types/tools/search/tavily-search.d.ts +4 -0
- package/dist/types/tools/search/types.d.ts +99 -5
- package/dist/types/tools/search/utils.d.ts +2 -2
- package/dist/types/tools/skillCatalog.d.ts +19 -0
- package/dist/types/tools/subagent/SubagentExecutor.d.ts +137 -0
- package/dist/types/tools/subagent/index.d.ts +2 -0
- package/dist/types/tools/subagent/types.d.ts +84 -0
- package/dist/types/tools/toolOutputReferences.d.ts +236 -0
- package/dist/types/types/agent-cache.d.ts +70 -0
- package/dist/types/types/graph.d.ts +162 -22
- package/dist/types/types/index.d.ts +3 -0
- package/dist/types/types/messages.d.ts +26 -0
- package/dist/types/types/run.d.ts +22 -0
- package/dist/types/types/skill.d.ts +9 -0
- package/dist/types/types/tools.d.ts +111 -0
- package/dist/types/utils/index.d.ts +1 -3
- package/dist/types/utils/truncation.d.ts +70 -0
- package/package.json +57 -17
- package/src/agents/AgentContext.js.map +1 -0
- package/src/agents/AgentContext.test.js.map +1 -0
- package/src/agents/AgentContext.ts +321 -78
- package/src/agents/__tests__/AgentContext.cacheTtl.live.test.ts +259 -0
- package/src/agents/__tests__/AgentContext.crossAgentTier1.live.test.ts +264 -0
- package/src/agents/__tests__/AgentContext.crossUserCache.live.test.ts +342 -0
- package/src/agents/__tests__/AgentContext.test.js.map +1 -0
- package/src/agents/__tests__/AgentContext.test.ts +632 -0
- package/src/agents/__tests__/resolveStructuredOutputMode.test.js.map +1 -0
- package/src/common/__tests__/enum.test.ts +7 -17
- package/src/common/enum.js.map +1 -0
- package/src/common/enum.ts +43 -12
- package/src/common/index.js.map +1 -0
- package/src/common/index.ts +0 -1
- package/src/events.js.map +1 -0
- package/src/graphs/Graph.js.map +1 -0
- package/src/graphs/Graph.ts +222 -2
- package/src/graphs/MultiAgentGraph.js.map +1 -0
- package/src/graphs/MultiAgentGraph.ts +154 -1466
- package/src/graphs/__tests__/MultiAgentGraph.test.ts +91 -0
- package/src/graphs/__tests__/structured-output.integration.test.js.map +1 -0
- package/src/graphs/__tests__/structured-output.test.js.map +1 -0
- package/src/graphs/contextManagement.e2e.test.js.map +1 -0
- package/src/graphs/contextManagement.test.js.map +1 -0
- package/src/graphs/handoffValidation.test.js.map +1 -0
- package/src/graphs/index.js.map +1 -0
- package/src/graphs/index.ts +0 -1
- package/src/hooks/HookRegistry.ts +208 -0
- package/src/hooks/__tests__/HookRegistry.test.ts +190 -0
- package/src/hooks/__tests__/compactHooks.test.ts +214 -0
- package/src/hooks/__tests__/executeHooks.test.ts +1013 -0
- package/src/hooks/__tests__/integration.test.ts +337 -0
- package/src/hooks/__tests__/matchers.test.ts +238 -0
- package/src/hooks/__tests__/toolHooks.test.ts +665 -0
- package/src/hooks/executeHooks.ts +375 -0
- package/src/hooks/index.ts +57 -0
- package/src/hooks/matchers.ts +280 -0
- package/src/hooks/types.ts +404 -0
- package/src/index.js.map +1 -0
- package/src/index.ts +15 -24
- package/src/instrumentation.js.map +1 -0
- package/src/langchain/google-common.ts +1 -0
- package/src/langchain/index.ts +8 -0
- package/src/langchain/language_models/chat_models.ts +1 -0
- package/src/langchain/messages/tool.ts +5 -0
- package/src/langchain/messages.ts +21 -0
- package/src/langchain/openai.ts +1 -0
- package/src/langchain/prompts.ts +1 -0
- package/src/langchain/runnables.ts +7 -0
- package/src/langchain/tools.ts +8 -0
- package/src/langchain/utils/env.ts +1 -0
- package/src/llm/anthropic/index.js.map +1 -0
- package/src/llm/anthropic/types.js.map +1 -0
- package/src/llm/anthropic/utils/message_inputs.js.map +1 -0
- package/src/llm/anthropic/utils/message_inputs.ts +10 -1
- package/src/llm/anthropic/utils/message_outputs.js.map +1 -0
- package/src/llm/anthropic/utils/output_parsers.js.map +1 -0
- package/src/llm/anthropic/utils/server-tool-inputs.test.ts +436 -0
- package/src/llm/anthropic/utils/tools.js.map +1 -0
- package/src/llm/bedrock/__tests__/bedrock-caching.test.js.map +1 -0
- package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +166 -18
- package/src/llm/bedrock/cacheSupport.test.ts +99 -0
- package/src/llm/bedrock/cacheSupport.ts +53 -0
- package/src/llm/bedrock/index.js.map +1 -0
- package/src/llm/bedrock/index.ts +116 -41
- package/src/llm/bedrock/types.js.map +1 -0
- package/src/llm/bedrock/utils/index.js.map +1 -0
- package/src/llm/bedrock/utils/message_inputs.js.map +1 -0
- package/src/llm/bedrock/utils/message_outputs.js.map +1 -0
- package/src/llm/fake.js.map +1 -0
- package/src/llm/google/index.js.map +1 -0
- package/src/llm/google/types.js.map +1 -0
- package/src/llm/google/utils/common.js.map +1 -0
- package/src/llm/google/utils/tools.js.map +1 -0
- package/src/llm/google/utils/zod_to_genai_parameters.js.map +1 -0
- package/src/llm/openai/index.js.map +1 -0
- package/src/llm/openai/types.js.map +1 -0
- package/src/llm/openai/utils/index.js.map +1 -0
- package/src/llm/openai/utils/index.ts +31 -14
- package/src/llm/openai/utils/isReasoningModel.test.js.map +1 -0
- package/src/llm/openrouter/index.js.map +1 -0
- package/src/llm/openrouter/reasoning.test.js.map +1 -0
- package/src/llm/providers.js.map +1 -0
- package/src/llm/text.js.map +1 -0
- package/src/llm/vertexai/index.js.map +1 -0
- package/src/messages/__tests__/contextPruning.test.ts +228 -0
- package/src/messages/__tests__/tools.test.js.map +1 -0
- package/src/messages/cache.js.map +1 -0
- package/src/messages/cache.test.js.map +1 -0
- package/src/messages/cache.test.ts +62 -24
- package/src/messages/cache.ts +112 -0
- package/src/messages/content.js.map +1 -0
- package/src/messages/content.test.js.map +1 -0
- package/src/messages/contextPruning.ts +191 -0
- package/src/messages/contextPruningSettings.ts +90 -0
- package/src/messages/core.js.map +1 -0
- package/src/messages/ensureThinkingBlock.test.js.map +1 -0
- package/src/messages/format.js.map +1 -0
- package/src/messages/format.ts +164 -12
- package/src/messages/formatAgentMessages.skills.test.ts +413 -0
- package/src/messages/formatAgentMessages.test.js.map +1 -0
- package/src/messages/formatAgentMessages.tools.test.js.map +1 -0
- package/src/messages/formatMessage.test.js.map +1 -0
- package/src/messages/ids.js.map +1 -0
- package/src/messages/index.js.map +1 -0
- package/src/messages/index.ts +2 -0
- package/src/messages/labelContentByAgent.test.js.map +1 -0
- package/src/messages/prune.js.map +1 -0
- package/src/messages/prune.ts +661 -4
- package/src/messages/reducer.js.map +1 -0
- package/src/messages/shiftIndexTokenCountMap.test.js.map +1 -0
- package/src/messages/summarize.js.map +1 -0
- package/src/messages/summarize.test.js.map +1 -0
- package/src/messages/tools.js.map +1 -0
- package/src/mockStream.js.map +1 -0
- package/src/prompts/collab.js.map +1 -0
- package/src/prompts/index.js.map +1 -0
- package/src/prompts/taskmanager.js.map +1 -0
- package/src/run.js.map +1 -0
- package/src/run.ts +155 -1
- package/src/schemas/index.js.map +1 -0
- package/src/schemas/schema-preparation.test.js.map +1 -0
- package/src/schemas/validate.js.map +1 -0
- package/src/schemas/validate.test.js.map +1 -0
- package/src/scripts/abort.js.map +1 -0
- package/src/scripts/ant_web_search.js.map +1 -0
- package/src/scripts/ant_web_search_edge_case.js.map +1 -0
- package/src/scripts/ant_web_search_error_edge_case.js.map +1 -0
- package/src/scripts/args.js.map +1 -0
- package/src/scripts/bedrock-cache-debug.js.map +1 -0
- package/src/scripts/bedrock-content-aggregation-test.js.map +1 -0
- package/src/scripts/bedrock-merge-test.js.map +1 -0
- package/src/scripts/bedrock-parallel-tools-test.js.map +1 -0
- package/src/scripts/caching.js.map +1 -0
- package/src/scripts/cli.js.map +1 -0
- package/src/scripts/cli2.js.map +1 -0
- package/src/scripts/cli3.js.map +1 -0
- package/src/scripts/cli4.js.map +1 -0
- package/src/scripts/cli5.js.map +1 -0
- package/src/scripts/code_exec.js.map +1 -0
- package/src/scripts/code_exec_files.js.map +1 -0
- package/src/scripts/code_exec_multi_session.js.map +1 -0
- package/src/scripts/code_exec_ptc.js.map +1 -0
- package/src/scripts/code_exec_session.js.map +1 -0
- package/src/scripts/code_exec_simple.js.map +1 -0
- package/src/scripts/content.js.map +1 -0
- package/src/scripts/empty_input.js.map +1 -0
- package/src/scripts/handoff-test.js.map +1 -0
- package/src/scripts/image.js.map +1 -0
- package/src/scripts/memory.js.map +1 -0
- package/src/scripts/multi-agent-chain.js.map +1 -0
- package/src/scripts/multi-agent-chain.ts +2 -2
- package/src/scripts/multi-agent-conditional.js.map +1 -0
- package/src/scripts/multi-agent-document-review-chain.js.map +1 -0
- package/src/scripts/multi-agent-document-review-chain.ts +2 -2
- package/src/scripts/multi-agent-hybrid-flow.js.map +1 -0
- package/src/scripts/multi-agent-hybrid-flow.ts +4 -4
- package/src/scripts/multi-agent-parallel-start.js.map +1 -0
- package/src/scripts/multi-agent-parallel.js.map +1 -0
- package/src/scripts/multi-agent-parallel.ts +3 -3
- package/src/scripts/multi-agent-sequence.js.map +1 -0
- package/src/scripts/multi-agent-sequence.ts +3 -3
- package/src/scripts/multi-agent-subagent.ts +246 -0
- package/src/scripts/multi-agent-supervisor.js.map +1 -0
- package/src/scripts/multi-agent-supervisor.ts +5 -5
- package/src/scripts/multi-agent-test.js.map +1 -0
- package/src/scripts/parallel-asymmetric-tools-test.js.map +1 -0
- package/src/scripts/parallel-full-metadata-test.js.map +1 -0
- package/src/scripts/parallel-tools-test.js.map +1 -0
- package/src/scripts/poc-multi-agent-comprehensive.ts +8 -8
- package/src/scripts/programmatic_exec.js.map +1 -0
- package/src/scripts/programmatic_exec_agent.js.map +1 -0
- package/src/scripts/search.js.map +1 -0
- package/src/scripts/sequential-full-metadata-test.js.map +1 -0
- package/src/scripts/sequential-full-metadata-test.ts +2 -2
- package/src/scripts/simple.js.map +1 -0
- package/src/scripts/single-agent-metadata-test.js.map +1 -0
- package/src/scripts/stream.js.map +1 -0
- package/src/scripts/subagent-event-driven-debug.ts +190 -0
- package/src/scripts/subagent-tools-debug.ts +160 -0
- package/src/scripts/test-custom-prompt-key.js.map +1 -0
- package/src/scripts/test-custom-prompt-key.ts +3 -3
- package/src/scripts/test-handoff-input.js.map +1 -0
- package/src/scripts/test-handoff-input.ts +1 -1
- package/src/scripts/test-handoff-preamble.js.map +1 -0
- package/src/scripts/test-handoff-steering.js.map +1 -0
- package/src/scripts/test-handoff-steering.ts +3 -3
- package/src/scripts/test-multi-agent-list-handoff.js.map +1 -0
- package/src/scripts/test-multi-agent-list-handoff.ts +1 -1
- package/src/scripts/test-parallel-agent-labeling.js.map +1 -0
- package/src/scripts/test-parallel-agent-labeling.ts +3 -3
- package/src/scripts/test-parallel-handoffs.js.map +1 -0
- package/src/scripts/test-parallel-handoffs.ts +2 -2
- package/src/scripts/test-thinking-handoff-bedrock.js.map +1 -0
- package/src/scripts/test-thinking-handoff-bedrock.ts +1 -1
- package/src/scripts/test-thinking-handoff.js.map +1 -0
- package/src/scripts/test-thinking-handoff.ts +1 -1
- package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js.map +1 -0
- package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +1 -1
- package/src/scripts/test-tool-before-handoff-role-order.js.map +1 -0
- package/src/scripts/test-tool-before-handoff-role-order.ts +1 -1
- package/src/scripts/test-tools-before-handoff.js.map +1 -0
- package/src/scripts/test-tools-before-handoff.ts +1 -1
- package/src/scripts/test_code_api.js.map +1 -0
- package/src/scripts/thinking-bedrock.js.map +1 -0
- package/src/scripts/thinking-vertexai.js.map +1 -0
- package/src/scripts/thinking.js.map +1 -0
- package/src/scripts/tool_search.js.map +1 -0
- package/src/scripts/tools.js.map +1 -0
- package/src/specs/agent-handoffs-bedrock.integration.test.js.map +1 -0
- package/src/specs/agent-handoffs.test.js.map +1 -0
- package/src/specs/agent-handoffs.test.ts +26 -483
- package/src/specs/anthropic.simple.test.js.map +1 -0
- package/src/specs/anthropic.simple.test.ts +61 -0
- package/src/specs/azure.simple.test.js.map +1 -0
- package/src/specs/cache.simple.test.js.map +1 -0
- package/src/specs/custom-event-await.test.js.map +1 -0
- package/src/specs/deepseek.simple.test.js.map +1 -0
- package/src/specs/emergency-prune.test.js.map +1 -0
- package/src/specs/moonshot.simple.test.js.map +1 -0
- package/src/specs/multi-agent-summarization.test.ts +396 -0
- package/src/specs/observability.integration.test.js.map +1 -0
- package/src/specs/openai.simple.test.js.map +1 -0
- package/src/specs/openrouter.simple.test.js.map +1 -0
- package/src/specs/prune.orphans.test.ts +248 -0
- package/src/specs/prune.test.js.map +1 -0
- package/src/specs/prune.test.ts +104 -16
- package/src/specs/reasoning.test.js.map +1 -0
- package/src/specs/spec.utils.js.map +1 -0
- package/src/specs/thinking-handoff.test.js.map +1 -0
- package/src/specs/thinking-handoff.test.ts +19 -19
- package/src/specs/thinking-prune.test.js.map +1 -0
- package/src/specs/token-distribution-edge-case.test.js.map +1 -0
- package/src/specs/token-memoization.test.js.map +1 -0
- package/src/specs/tokens.test.js.map +1 -0
- package/src/specs/tool-error.test.js.map +1 -0
- package/src/splitStream.js.map +1 -0
- package/src/splitStream.test.js.map +1 -0
- package/src/stream.js.map +1 -0
- package/src/stream.test.js.map +1 -0
- package/src/test/mockTools.js.map +1 -0
- package/src/tools/BashExecutor.ts +281 -0
- package/src/tools/BashProgrammaticToolCalling.ts +397 -0
- package/src/tools/BrowserTools.js.map +1 -0
- package/src/tools/Calculator.js.map +1 -0
- package/src/tools/Calculator.test.js.map +1 -0
- package/src/tools/CodeExecutor.js.map +1 -0
- package/src/tools/CodeExecutor.ts +62 -54
- package/src/tools/ProgrammaticToolCalling.js.map +1 -0
- package/src/tools/ProgrammaticToolCalling.ts +29 -14
- package/src/tools/ReadFile.ts +39 -0
- package/src/tools/SkillTool.ts +46 -0
- package/src/tools/StreamingToolCallBuffer.js.map +1 -0
- package/src/tools/SubagentTool.ts +100 -0
- package/src/tools/ToolNode.js.map +1 -0
- package/src/tools/ToolNode.ts +548 -26
- package/src/tools/ToolSearch.js.map +1 -0
- package/src/tools/__tests__/BashExecutor.test.ts +49 -0
- package/src/tools/__tests__/BrowserTools.test.js.map +1 -0
- package/src/tools/__tests__/CodeExecutor.test.ts +37 -36
- package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js.map +1 -0
- package/src/tools/__tests__/ProgrammaticToolCalling.test.js.map +1 -0
- package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +60 -0
- package/src/tools/__tests__/ReadFile.test.ts +44 -0
- package/src/tools/__tests__/SkillTool.test.ts +442 -0
- package/src/tools/__tests__/StreamingToolCallBuffer.test.js.map +1 -0
- package/src/tools/__tests__/SubagentExecutor.test.ts +1148 -0
- package/src/tools/__tests__/SubagentTool.test.ts +149 -0
- package/src/tools/__tests__/ToolApproval.test.js.map +1 -0
- package/src/tools/__tests__/ToolNode.outputReferences.test.ts +1438 -0
- package/src/tools/__tests__/ToolNode.recovery.test.js.map +1 -0
- package/src/tools/__tests__/ToolNode.session.test.js.map +1 -0
- package/src/tools/__tests__/ToolSearch.integration.test.js.map +1 -0
- package/src/tools/__tests__/ToolSearch.test.js.map +1 -0
- package/src/tools/__tests__/annotateMessagesForLLM.test.ts +479 -0
- package/src/tools/__tests__/handlers.test.js.map +1 -0
- package/src/tools/__tests__/skillCatalog.test.ts +161 -0
- package/src/tools/__tests__/subagentHooks.test.ts +210 -0
- package/src/tools/__tests__/toolOutputReferences.test.ts +415 -0
- package/src/tools/__tests__/truncation-recovery.integration.test.js.map +1 -0
- package/src/tools/handlers.js.map +1 -0
- package/src/tools/schema.js.map +1 -0
- package/src/tools/search/anthropic.js.map +1 -0
- package/src/tools/search/content.js.map +1 -0
- package/src/tools/search/content.test.js.map +1 -0
- package/src/tools/search/firecrawl.js.map +1 -0
- package/src/tools/search/format.js.map +1 -0
- package/src/tools/search/highlights.js.map +1 -0
- package/src/tools/search/index.js.map +1 -0
- package/src/tools/search/jina-reranker.test.js.map +1 -0
- package/src/tools/search/rerankers.js.map +1 -0
- package/src/tools/search/schema.js.map +1 -0
- package/src/tools/search/search.js.map +1 -0
- package/src/tools/search/search.ts +12 -2
- package/src/tools/search/serper-scraper.js.map +1 -0
- package/src/tools/search/tavily-scraper.ts +235 -0
- package/src/tools/search/tavily-search.ts +424 -0
- package/src/tools/search/tavily.test.ts +965 -0
- package/src/tools/search/test.js.map +1 -0
- package/src/tools/search/tool.js.map +1 -0
- package/src/tools/search/tool.ts +36 -2
- package/src/tools/search/types.js.map +1 -0
- package/src/tools/search/types.ts +133 -8
- package/src/tools/search/utils.js.map +1 -0
- package/src/tools/search/utils.ts +13 -5
- package/src/tools/skillCatalog.ts +126 -0
- package/src/tools/subagent/SubagentExecutor.ts +676 -0
- package/src/tools/subagent/index.ts +13 -0
- package/src/tools/subagent/types.test.ts +70 -0
- package/src/tools/subagent/types.ts +115 -0
- package/src/tools/toolOutputReferences.ts +825 -0
- package/src/types/agent-cache.ts +73 -0
- package/src/types/graph.js.map +1 -0
- package/src/types/graph.test.js.map +1 -0
- package/src/types/graph.ts +171 -20
- package/src/types/index.js.map +1 -0
- package/src/types/index.ts +3 -0
- package/src/types/llm.js.map +1 -0
- package/src/types/messages.js.map +1 -0
- package/src/types/messages.ts +27 -0
- package/src/types/run.js.map +1 -0
- package/src/types/run.ts +22 -0
- package/src/types/skill.ts +11 -0
- package/src/types/stream.js.map +1 -0
- package/src/types/tools.js.map +1 -0
- package/src/types/tools.ts +118 -0
- package/src/utils/__tests__/truncation.test.ts +66 -0
- package/src/utils/contextAnalytics.js.map +1 -0
- package/src/utils/contextAnalytics.test.js.map +1 -0
- package/src/utils/events.js.map +1 -0
- package/src/utils/graph.js.map +1 -0
- package/src/utils/handlers.js.map +1 -0
- package/src/utils/index.js.map +1 -0
- package/src/utils/index.ts +1 -3
- package/src/utils/llm.js.map +1 -0
- package/src/utils/llmConfig.js.map +1 -0
- package/src/utils/logging.js.map +1 -0
- package/src/utils/misc.js.map +1 -0
- package/src/utils/run.js.map +1 -0
- package/src/utils/schema.js.map +1 -0
- package/src/utils/title.js.map +1 -0
- package/src/utils/tokens.js.map +1 -0
- package/src/utils/toonFormat.js.map +1 -0
- package/src/utils/truncation.ts +154 -0
- package/dist/cjs/common/spawnPath.cjs +0 -104
- package/dist/cjs/common/spawnPath.cjs.map +0 -1
- package/dist/cjs/content/ArtifactStore.cjs +0 -579
- package/dist/cjs/content/ArtifactStore.cjs.map +0 -1
- package/dist/cjs/content/ContentStore.cjs +0 -638
- package/dist/cjs/content/ContentStore.cjs.map +0 -1
- package/dist/cjs/content/contentAnalyzer.cjs +0 -91
- package/dist/cjs/content/contentAnalyzer.cjs.map +0 -1
- package/dist/cjs/content/index.cjs +0 -20
- package/dist/cjs/content/index.cjs.map +0 -1
- package/dist/cjs/content/mcpAutoCache.cjs +0 -115
- package/dist/cjs/content/mcpAutoCache.cjs.map +0 -1
- package/dist/cjs/graphs/HandoffRegistry.cjs +0 -143
- package/dist/cjs/graphs/HandoffRegistry.cjs.map +0 -1
- package/dist/cjs/providers/a2a/A2ACapabilityProvider.cjs +0 -288
- package/dist/cjs/providers/a2a/A2ACapabilityProvider.cjs.map +0 -1
- package/dist/cjs/providers/a2a/client.cjs +0 -92
- package/dist/cjs/providers/a2a/client.cjs.map +0 -1
- package/dist/cjs/providers/a2a/config.cjs +0 -38
- package/dist/cjs/providers/a2a/config.cjs.map +0 -1
- package/dist/cjs/providers/capabilityNaming.cjs +0 -43
- package/dist/cjs/providers/capabilityNaming.cjs.map +0 -1
- package/dist/cjs/providers/mcp/MCPCapabilityProvider.cjs +0 -244
- package/dist/cjs/providers/mcp/MCPCapabilityProvider.cjs.map +0 -1
- package/dist/cjs/providers/mcp/config.cjs +0 -42
- package/dist/cjs/providers/mcp/config.cjs.map +0 -1
- package/dist/cjs/providers/mcp/transport.cjs +0 -65
- package/dist/cjs/providers/mcp/transport.cjs.map +0 -1
- package/dist/cjs/providers/tools-server/ToolsServerCapabilityProvider.cjs +0 -128
- package/dist/cjs/providers/tools-server/ToolsServerCapabilityProvider.cjs.map +0 -1
- package/dist/cjs/providers/types.cjs +0 -51
- package/dist/cjs/providers/types.cjs.map +0 -1
- package/dist/cjs/tools/artifacts/schema.cjs +0 -86
- package/dist/cjs/tools/artifacts/schema.cjs.map +0 -1
- package/dist/cjs/tools/artifacts/tool.cjs +0 -219
- package/dist/cjs/tools/artifacts/tool.cjs.map +0 -1
- package/dist/cjs/tools/fileSearch/formatter.cjs +0 -93
- package/dist/cjs/tools/fileSearch/formatter.cjs.map +0 -1
- package/dist/cjs/tools/fileSearch/ragClient.cjs +0 -102
- package/dist/cjs/tools/fileSearch/ragClient.cjs.map +0 -1
- package/dist/cjs/tools/fileSearch/schema.cjs +0 -18
- package/dist/cjs/tools/fileSearch/schema.cjs.map +0 -1
- package/dist/cjs/tools/fileSearch/tool.cjs +0 -155
- package/dist/cjs/tools/fileSearch/tool.cjs.map +0 -1
- package/dist/cjs/tools/proxyTool.cjs +0 -102
- package/dist/cjs/tools/proxyTool.cjs.map +0 -1
- package/dist/cjs/utils/childAgentContext.cjs +0 -242
- package/dist/cjs/utils/childAgentContext.cjs.map +0 -1
- package/dist/cjs/utils/credentials.cjs +0 -142
- package/dist/cjs/utils/credentials.cjs.map +0 -1
- package/dist/cjs/utils/httpClient.cjs +0 -74
- package/dist/cjs/utils/httpClient.cjs.map +0 -1
- package/dist/cjs/utils/toolManifest.cjs +0 -100
- package/dist/cjs/utils/toolManifest.cjs.map +0 -1
- package/dist/esm/common/spawnPath.mjs +0 -95
- package/dist/esm/common/spawnPath.mjs.map +0 -1
- package/dist/esm/content/ArtifactStore.mjs +0 -576
- package/dist/esm/content/ArtifactStore.mjs.map +0 -1
- package/dist/esm/content/ContentStore.mjs +0 -635
- package/dist/esm/content/ContentStore.mjs.map +0 -1
- package/dist/esm/content/contentAnalyzer.mjs +0 -87
- package/dist/esm/content/contentAnalyzer.mjs.map +0 -1
- package/dist/esm/content/index.mjs +0 -5
- package/dist/esm/content/mcpAutoCache.mjs +0 -111
- package/dist/esm/content/mcpAutoCache.mjs.map +0 -1
- package/dist/esm/graphs/HandoffRegistry.mjs +0 -141
- package/dist/esm/graphs/HandoffRegistry.mjs.map +0 -1
- package/dist/esm/providers/a2a/A2ACapabilityProvider.mjs +0 -281
- package/dist/esm/providers/a2a/A2ACapabilityProvider.mjs.map +0 -1
- package/dist/esm/providers/a2a/client.mjs +0 -88
- package/dist/esm/providers/a2a/client.mjs.map +0 -1
- package/dist/esm/providers/a2a/config.mjs +0 -35
- package/dist/esm/providers/a2a/config.mjs.map +0 -1
- package/dist/esm/providers/capabilityNaming.mjs +0 -39
- package/dist/esm/providers/capabilityNaming.mjs.map +0 -1
- package/dist/esm/providers/mcp/MCPCapabilityProvider.mjs +0 -240
- package/dist/esm/providers/mcp/MCPCapabilityProvider.mjs.map +0 -1
- package/dist/esm/providers/mcp/config.mjs +0 -39
- package/dist/esm/providers/mcp/config.mjs.map +0 -1
- package/dist/esm/providers/mcp/transport.mjs +0 -63
- package/dist/esm/providers/mcp/transport.mjs.map +0 -1
- package/dist/esm/providers/tools-server/ToolsServerCapabilityProvider.mjs +0 -126
- package/dist/esm/providers/tools-server/ToolsServerCapabilityProvider.mjs.map +0 -1
- package/dist/esm/providers/types.mjs +0 -51
- package/dist/esm/providers/types.mjs.map +0 -1
- package/dist/esm/tools/artifacts/schema.mjs +0 -79
- package/dist/esm/tools/artifacts/schema.mjs.map +0 -1
- package/dist/esm/tools/artifacts/tool.mjs +0 -213
- package/dist/esm/tools/artifacts/tool.mjs.map +0 -1
- package/dist/esm/tools/fileSearch/formatter.mjs +0 -90
- package/dist/esm/tools/fileSearch/formatter.mjs.map +0 -1
- package/dist/esm/tools/fileSearch/ragClient.mjs +0 -98
- package/dist/esm/tools/fileSearch/ragClient.mjs.map +0 -1
- package/dist/esm/tools/fileSearch/schema.mjs +0 -15
- package/dist/esm/tools/fileSearch/schema.mjs.map +0 -1
- package/dist/esm/tools/fileSearch/tool.mjs +0 -152
- package/dist/esm/tools/fileSearch/tool.mjs.map +0 -1
- package/dist/esm/tools/proxyTool.mjs +0 -100
- package/dist/esm/tools/proxyTool.mjs.map +0 -1
- package/dist/esm/utils/childAgentContext.mjs +0 -237
- package/dist/esm/utils/childAgentContext.mjs.map +0 -1
- package/dist/esm/utils/credentials.mjs +0 -135
- package/dist/esm/utils/credentials.mjs.map +0 -1
- package/dist/esm/utils/httpClient.mjs +0 -70
- package/dist/esm/utils/httpClient.mjs.map +0 -1
- package/dist/esm/utils/toolManifest.mjs +0 -96
- package/dist/esm/utils/toolManifest.mjs.map +0 -1
- package/dist/types/common/spawnPath.d.ts +0 -59
- package/dist/types/content/ArtifactStore.d.ts +0 -223
- package/dist/types/content/ContentStore.d.ts +0 -140
- package/dist/types/content/contentAnalyzer.d.ts +0 -38
- package/dist/types/content/index.d.ts +0 -24
- package/dist/types/content/mcpAutoCache.d.ts +0 -89
- package/dist/types/content/types.d.ts +0 -75
- package/dist/types/graphs/HandoffRegistry.d.ts +0 -97
- package/dist/types/providers/a2a/A2ACapabilityProvider.d.ts +0 -89
- package/dist/types/providers/a2a/client.d.ts +0 -47
- package/dist/types/providers/a2a/config.d.ts +0 -18
- package/dist/types/providers/a2a/index.d.ts +0 -6
- package/dist/types/providers/a2a/types.d.ts +0 -173
- package/dist/types/providers/capabilityNaming.d.ts +0 -25
- package/dist/types/providers/index.d.ts +0 -12
- package/dist/types/providers/mcp/MCPCapabilityProvider.d.ts +0 -54
- package/dist/types/providers/mcp/config.d.ts +0 -20
- package/dist/types/providers/mcp/index.d.ts +0 -5
- package/dist/types/providers/mcp/transport.d.ts +0 -18
- package/dist/types/providers/mcp/types.d.ts +0 -112
- package/dist/types/providers/tools-server/ToolsServerCapabilityProvider.d.ts +0 -59
- package/dist/types/providers/tools-server/index.d.ts +0 -1
- package/dist/types/providers/types.d.ts +0 -184
- package/dist/types/tools/artifacts/index.d.ts +0 -3
- package/dist/types/tools/artifacts/schema.d.ts +0 -63
- package/dist/types/tools/artifacts/tool.d.ts +0 -16
- package/dist/types/tools/artifacts/types.d.ts +0 -127
- package/dist/types/tools/fileSearch/formatter.d.ts +0 -25
- package/dist/types/tools/fileSearch/index.d.ts +0 -5
- package/dist/types/tools/fileSearch/ragClient.d.ts +0 -32
- package/dist/types/tools/fileSearch/schema.d.ts +0 -13
- package/dist/types/tools/fileSearch/tool.d.ts +0 -18
- package/dist/types/tools/fileSearch/types.d.ts +0 -139
- package/dist/types/tools/proxyTool.d.ts +0 -62
- package/dist/types/utils/childAgentContext.d.ts +0 -99
- package/dist/types/utils/credentials.d.ts +0 -77
- package/dist/types/utils/httpClient.d.ts +0 -46
- package/dist/types/utils/toolManifest.d.ts +0 -49
- package/src/common/__tests__/spawnPath.test.ts +0 -110
- package/src/common/spawnPath.ts +0 -101
- package/src/content/ArtifactStore.ts +0 -782
- package/src/content/ContentStore.ts +0 -753
- package/src/content/contentAnalyzer.ts +0 -105
- package/src/content/index.ts +0 -51
- package/src/content/mcpAutoCache.ts +0 -185
- package/src/content/types.ts +0 -82
- package/src/graphs/HandoffRegistry.ts +0 -199
- package/src/graphs/__tests__/HandoffRegistry.test.ts +0 -410
- package/src/graphs/__tests__/multi-agent-delegate.test.ts +0 -458
- package/src/graphs/__tests__/multi-agent-edges.test.ts +0 -276
- package/src/graphs/__tests__/multi-agent-nested-subgraph.test.ts +0 -221
- package/src/graphs/handoffValidation.test.ts +0 -353
- package/src/providers/__tests__/ToolsServerCapabilityProvider.integration.spec.ts +0 -79
- package/src/providers/__tests__/ToolsServerCapabilityProvider.test.ts +0 -271
- package/src/providers/__tests__/types.test.ts +0 -64
- package/src/providers/a2a/A2ACapabilityProvider.ts +0 -384
- package/src/providers/a2a/__tests__/A2ACapabilityProvider.integration.spec.ts +0 -345
- package/src/providers/a2a/__tests__/A2ACapabilityProvider.test.ts +0 -460
- package/src/providers/a2a/client.ts +0 -115
- package/src/providers/a2a/config.ts +0 -40
- package/src/providers/a2a/index.ts +0 -29
- package/src/providers/a2a/types.ts +0 -191
- package/src/providers/capabilityNaming.ts +0 -42
- package/src/providers/index.ts +0 -68
- package/src/providers/mcp/MCPCapabilityProvider.ts +0 -345
- package/src/providers/mcp/__tests__/MCPCapabilityProvider.integration.spec.ts +0 -386
- package/src/providers/mcp/__tests__/MCPCapabilityProvider.test.ts +0 -371
- package/src/providers/mcp/config.ts +0 -45
- package/src/providers/mcp/index.ts +0 -21
- package/src/providers/mcp/transport.ts +0 -76
- package/src/providers/mcp/types.ts +0 -139
- package/src/providers/tools-server/ToolsServerCapabilityProvider.ts +0 -249
- package/src/providers/tools-server/index.ts +0 -1
- package/src/providers/types.ts +0 -204
- package/src/scripts/test-bedrock-handoff-autonomous.ts +0 -267
- package/src/scripts/test-handoff-preamble.ts +0 -278
- package/src/specs/agent-handoffs-bedrock.integration.test.ts +0 -415
- package/src/tools/artifacts/__tests__/tool.test.ts +0 -259
- package/src/tools/artifacts/index.ts +0 -33
- package/src/tools/artifacts/schema.ts +0 -99
- package/src/tools/artifacts/tool.ts +0 -289
- package/src/tools/artifacts/types.ts +0 -162
- package/src/tools/fileSearch/__tests__/tool.test.ts +0 -261
- package/src/tools/fileSearch/formatter.ts +0 -129
- package/src/tools/fileSearch/index.ts +0 -23
- package/src/tools/fileSearch/ragClient.ts +0 -137
- package/src/tools/fileSearch/schema.ts +0 -19
- package/src/tools/fileSearch/tool.ts +0 -207
- package/src/tools/fileSearch/types.ts +0 -149
- package/src/tools/proxyTool.ts +0 -166
- package/src/utils/__tests__/childAgentContext.test.ts +0 -217
- package/src/utils/__tests__/credentials.test.ts +0 -130
- package/src/utils/__tests__/httpClient.test.ts +0 -75
- package/src/utils/__tests__/toolManifest.test.ts +0 -116
- package/src/utils/childAgentContext.ts +0 -259
- package/src/utils/credentials.ts +0 -157
- package/src/utils/httpClient.ts +0 -92
- package/src/utils/toolManifest.ts +0 -109
- /package/dist/esm/{content → langchain}/index.mjs.map +0 -0
package/src/tools/ToolNode.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ToolCall } from '@langchain/core/messages/tool';
|
|
2
2
|
import {
|
|
3
3
|
ToolMessage,
|
|
4
|
+
HumanMessage,
|
|
4
5
|
isAIMessage,
|
|
5
6
|
isBaseMessage,
|
|
6
7
|
} from '@langchain/core/messages';
|
|
@@ -24,7 +25,30 @@ import { ExecutionContext } from './approval/constants';
|
|
|
24
25
|
import { RunnableCallable } from '@/utils';
|
|
25
26
|
import { processToolOutput } from '@/utils/toonFormat';
|
|
26
27
|
import { safeDispatchCustomEvent } from '@/utils/events';
|
|
27
|
-
import { Constants, GraphEvents } from '@/common';
|
|
28
|
+
import { Constants, GraphEvents, CODE_EXECUTION_TOOLS } from '@/common';
|
|
29
|
+
import { executeHooks } from '@/hooks';
|
|
30
|
+
import type { HookRegistry, AggregatedHookResult } from '@/hooks';
|
|
31
|
+
import {
|
|
32
|
+
ToolOutputReferenceRegistry,
|
|
33
|
+
buildReferenceKey,
|
|
34
|
+
} from '@/tools/toolOutputReferences';
|
|
35
|
+
import type { ResolvedArgsByCallId } from '@/tools/toolOutputReferences';
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Per-call batch context for `runTool`. Bundles every optional batch-scoped
|
|
39
|
+
* value the method needs so the signature stays at three positional params
|
|
40
|
+
* even as new context fields are added. Upstream-aligned (PR #117).
|
|
41
|
+
*/
|
|
42
|
+
type RunToolBatchContext = {
|
|
43
|
+
/** Position of this call within the parent ToolNode batch. */
|
|
44
|
+
batchIndex?: number;
|
|
45
|
+
/** Batch turn shared across every call in the batch. */
|
|
46
|
+
turn?: number;
|
|
47
|
+
/** Registry partition scope (run id or anonymous batch id). */
|
|
48
|
+
batchScopeId?: string;
|
|
49
|
+
/** Batch-local sink for post-substitution args. */
|
|
50
|
+
resolvedArgsByCallId?: ResolvedArgsByCallId;
|
|
51
|
+
};
|
|
28
52
|
|
|
29
53
|
/**
|
|
30
54
|
* Helper to check if a value is a Send object
|
|
@@ -97,6 +121,29 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
97
121
|
private toolApprovalConfig?: t.ToolApprovalConfig;
|
|
98
122
|
/** Buffer for recovering truncated tool call arguments from streaming data */
|
|
99
123
|
private streamingToolCallBuffer?: import('@/tools/StreamingToolCallBuffer').StreamingToolCallBuffer;
|
|
124
|
+
/** Hook registry threaded down from Run for tool-lifecycle events. */
|
|
125
|
+
private hookRegistry?: HookRegistry;
|
|
126
|
+
/**
|
|
127
|
+
* Tool output reference registry threaded down from Run / Graph
|
|
128
|
+
* (upstream PR #114). When set, dispatchToolEvents resolves
|
|
129
|
+
* `{{tool<i>turn<n>}}` placeholders in args before invoking each tool
|
|
130
|
+
* and stores successful outputs under their stable reference keys for
|
|
131
|
+
* subsequent calls in the same run to pipe through.
|
|
132
|
+
*/
|
|
133
|
+
private toolOutputRegistry?: ToolOutputReferenceRegistry;
|
|
134
|
+
/**
|
|
135
|
+
* Per-batch turn counter for the registry. Increments once per
|
|
136
|
+
* `dispatchToolEvents` invocation so `tool<i>turn<n>` keys remain
|
|
137
|
+
* unique across overlapping batches in a single run.
|
|
138
|
+
*/
|
|
139
|
+
private toolOutputTurn: number = 0;
|
|
140
|
+
/**
|
|
141
|
+
* Counter for synthesising scope ids when `run()` is called without a
|
|
142
|
+
* `run_id` in config. Each anonymous batch gets a unique
|
|
143
|
+
* `\0anon-<n>` scope so concurrent invocations don't collide on the
|
|
144
|
+
* shared `toolOutputRegistry`.
|
|
145
|
+
*/
|
|
146
|
+
private anonBatchCounter: number = 0;
|
|
100
147
|
|
|
101
148
|
constructor({
|
|
102
149
|
tools,
|
|
@@ -114,6 +161,10 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
114
161
|
directToolNames,
|
|
115
162
|
streamingToolCallBuffer,
|
|
116
163
|
toolApprovalConfig,
|
|
164
|
+
hookRegistry,
|
|
165
|
+
toolOutputRegistry,
|
|
166
|
+
toolOutputReferences,
|
|
167
|
+
maxToolResultChars: _maxToolResultChars,
|
|
117
168
|
}: t.ToolNodeConstructorParams) {
|
|
118
169
|
super({ name, tags, func: (input, config) => this.run(input, config) });
|
|
119
170
|
this.toolMap = toolMap ?? new Map(tools.map((tool) => [tool.name, tool]));
|
|
@@ -129,6 +180,33 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
129
180
|
this.directToolNames = directToolNames;
|
|
130
181
|
this.streamingToolCallBuffer = streamingToolCallBuffer;
|
|
131
182
|
this.toolApprovalConfig = toolApprovalConfig;
|
|
183
|
+
this.hookRegistry = hookRegistry;
|
|
184
|
+
/**
|
|
185
|
+
* Precedence: an explicitly passed `toolOutputRegistry` instance
|
|
186
|
+
* wins (the multi-agent case where every ToolNode shares one registry
|
|
187
|
+
* for the run); otherwise the per-ToolNode `toolOutputReferences`
|
|
188
|
+
* config builds an instance scoped to this ToolNode.
|
|
189
|
+
*/
|
|
190
|
+
if (toolOutputRegistry != null) {
|
|
191
|
+
this.toolOutputRegistry = toolOutputRegistry;
|
|
192
|
+
} else if (toolOutputReferences?.enabled === true) {
|
|
193
|
+
this.toolOutputRegistry = new ToolOutputReferenceRegistry({
|
|
194
|
+
maxOutputSize: toolOutputReferences.maxOutputSize,
|
|
195
|
+
maxTotalSize: toolOutputReferences.maxTotalSize,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Test-observation accessor for the tool-output reference registry.
|
|
202
|
+
* @internal Exposed for test observation only. Host code should rely on
|
|
203
|
+
* `{{tool<i>turn<n>}}` substitution at tool-invocation time and not
|
|
204
|
+
* mutate the registry directly.
|
|
205
|
+
*/
|
|
206
|
+
public _unsafeGetToolOutputRegistry():
|
|
207
|
+
| ToolOutputReferenceRegistry
|
|
208
|
+
| undefined {
|
|
209
|
+
return this.toolOutputRegistry;
|
|
132
210
|
}
|
|
133
211
|
|
|
134
212
|
/**
|
|
@@ -217,8 +295,7 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
217
295
|
// Instead, gate the bypass on the actual routing-tool name prefix.
|
|
218
296
|
if (
|
|
219
297
|
this.directToolNames?.has(toolName) &&
|
|
220
|
-
|
|
221
|
-
toolName.startsWith(Constants.LC_HANDOFF_TO_))
|
|
298
|
+
toolName.startsWith(Constants.LC_TRANSFER_TO_)
|
|
222
299
|
) {
|
|
223
300
|
return false;
|
|
224
301
|
}
|
|
@@ -284,13 +361,52 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
284
361
|
}
|
|
285
362
|
|
|
286
363
|
/**
|
|
287
|
-
* Runs a single tool call with error handling
|
|
364
|
+
* Runs a single tool call with error handling.
|
|
365
|
+
*
|
|
366
|
+
* @param batchContext Optional per-batch context (upstream PR #117).
|
|
367
|
+
* Threaded from `run()` for tool output reference annotation. The
|
|
368
|
+
* `batchScopeId` field carries an anonymous synthetic scope when the
|
|
369
|
+
* caller has no `run_id`, so concurrent batches don't collide on the
|
|
370
|
+
* shared registry.
|
|
288
371
|
*/
|
|
289
372
|
protected async runTool(
|
|
290
373
|
call: ToolCall,
|
|
291
|
-
config: RunnableConfig
|
|
374
|
+
config: RunnableConfig,
|
|
375
|
+
batchContext: RunToolBatchContext = {}
|
|
292
376
|
): Promise<BaseMessage | Command> {
|
|
377
|
+
const {
|
|
378
|
+
batchIndex,
|
|
379
|
+
turn: batchTurn,
|
|
380
|
+
batchScopeId,
|
|
381
|
+
resolvedArgsByCallId,
|
|
382
|
+
} = batchContext;
|
|
293
383
|
const tool = this.toolMap.get(call.name);
|
|
384
|
+
const registry = this.toolOutputRegistry;
|
|
385
|
+
/**
|
|
386
|
+
* Precompute the reference key once per call — captured locally so
|
|
387
|
+
* concurrent `invoke()` calls on the same ToolNode cannot race on a
|
|
388
|
+
* shared turn field.
|
|
389
|
+
*/
|
|
390
|
+
const refKey =
|
|
391
|
+
registry != null && batchIndex != null && batchTurn != null
|
|
392
|
+
? buildReferenceKey(batchIndex, batchTurn)
|
|
393
|
+
: undefined;
|
|
394
|
+
/**
|
|
395
|
+
* Hoisted outside the try so the catch branch can stamp
|
|
396
|
+
* `_unresolvedRefs` into error ToolMessage metadata. This lets the
|
|
397
|
+
* lazy annotation transform surface a `[unresolved refs: …]` hint to
|
|
398
|
+
* the LLM, helping the model self-correct when its reference key
|
|
399
|
+
* caused the failure.
|
|
400
|
+
*/
|
|
401
|
+
let unresolvedRefs: string[] = [];
|
|
402
|
+
/**
|
|
403
|
+
* Use the caller-provided `batchScopeId` when threaded from `run()`.
|
|
404
|
+
* Fall back to the config's `run_id` when runTool is invoked from a
|
|
405
|
+
* context that doesn't thread the batch context — that still
|
|
406
|
+
* preserves the runId-based partitioning for named runs.
|
|
407
|
+
*/
|
|
408
|
+
const runId =
|
|
409
|
+
batchScopeId ?? (config.configurable?.run_id as string | undefined);
|
|
294
410
|
try {
|
|
295
411
|
if (tool === undefined) {
|
|
296
412
|
throw new Error(`Tool "${call.name}" not found.`);
|
|
@@ -312,6 +428,29 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
312
428
|
this.streamingToolCallBuffer.clear(call.id);
|
|
313
429
|
}
|
|
314
430
|
|
|
431
|
+
/**
|
|
432
|
+
* Resolve `{{tool<i>turn<n>}}` placeholders in args against the
|
|
433
|
+
* registry. Captures `unresolvedRefs` so error/success branches can
|
|
434
|
+
* surface them to the LLM via `additional_kwargs._unresolvedRefs`.
|
|
435
|
+
*/
|
|
436
|
+
if (registry != null) {
|
|
437
|
+
const { resolved, unresolved } = registry.resolve(runId, args);
|
|
438
|
+
args = resolved as typeof call.args;
|
|
439
|
+
unresolvedRefs = unresolved;
|
|
440
|
+
if (
|
|
441
|
+
resolvedArgsByCallId != null &&
|
|
442
|
+
call.id != null &&
|
|
443
|
+
call.id !== '' &&
|
|
444
|
+
resolved !== call.args &&
|
|
445
|
+
typeof resolved === 'object'
|
|
446
|
+
) {
|
|
447
|
+
resolvedArgsByCallId.set(
|
|
448
|
+
call.id,
|
|
449
|
+
resolved as Record<string, unknown>
|
|
450
|
+
);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
315
454
|
// Build invoke params - LangChain extracts non-schema fields to config.toolCall
|
|
316
455
|
let invokeParams: Record<string, unknown> = {
|
|
317
456
|
...call,
|
|
@@ -345,10 +484,7 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
345
484
|
* session_id is always injected when available (even without tracked files)
|
|
346
485
|
* so the CodeExecutor can fall back to the /files endpoint for session continuity.
|
|
347
486
|
*/
|
|
348
|
-
if (
|
|
349
|
-
call.name === Constants.EXECUTE_CODE ||
|
|
350
|
-
call.name === Constants.PROGRAMMATIC_TOOL_CALLING
|
|
351
|
-
) {
|
|
487
|
+
if (CODE_EXECUTION_TOOLS.has(call.name)) {
|
|
352
488
|
const codeSession = this.sessions?.get(Constants.EXECUTE_CODE) as
|
|
353
489
|
| t.CodeSessionContext
|
|
354
490
|
| undefined;
|
|
@@ -444,21 +580,58 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
444
580
|
minReductionPercent: 10, // Only apply TOON when clearly beneficial
|
|
445
581
|
});
|
|
446
582
|
|
|
447
|
-
|
|
583
|
+
/**
|
|
584
|
+
* Tool output reference metadata (upstream PR #117). Register the
|
|
585
|
+
* raw, untruncated content so future `{{...}}` substitutions deliver
|
|
586
|
+
* the full payload, and stamp `_refKey` / `_refScope` /
|
|
587
|
+
* `_unresolvedRefs` into `additional_kwargs` for the lazy
|
|
588
|
+
* annotation transform to apply at LLM request time. Persisted
|
|
589
|
+
* `content` stays clean.
|
|
590
|
+
*
|
|
591
|
+
* For error ToolMessages from the underlying tool: bypass
|
|
592
|
+
* registration but still stamp `_unresolvedRefs` so the model can
|
|
593
|
+
* self-correct.
|
|
594
|
+
*/
|
|
448
595
|
if (isBaseMessage(output) && output._getType() === 'tool') {
|
|
449
596
|
const toolMsg = output as ToolMessage;
|
|
597
|
+
const isError = toolMsg.status === 'error';
|
|
598
|
+
const refMeta = isError
|
|
599
|
+
? unresolvedRefs.length > 0
|
|
600
|
+
? { _unresolvedRefs: unresolvedRefs }
|
|
601
|
+
: undefined
|
|
602
|
+
: this.recordOutputReference(
|
|
603
|
+
runId,
|
|
604
|
+
rawContent,
|
|
605
|
+
refKey,
|
|
606
|
+
unresolvedRefs
|
|
607
|
+
);
|
|
450
608
|
return new ToolMessage({
|
|
451
609
|
status: toolMsg.status,
|
|
452
610
|
name: toolMsg.name,
|
|
453
611
|
content: processed.content,
|
|
454
612
|
tool_call_id: toolMsg.tool_call_id,
|
|
613
|
+
...(refMeta != null && {
|
|
614
|
+
additional_kwargs: {
|
|
615
|
+
...toolMsg.additional_kwargs,
|
|
616
|
+
...refMeta,
|
|
617
|
+
},
|
|
618
|
+
}),
|
|
455
619
|
});
|
|
456
620
|
} else {
|
|
621
|
+
const refMeta = this.recordOutputReference(
|
|
622
|
+
runId,
|
|
623
|
+
rawContent,
|
|
624
|
+
refKey,
|
|
625
|
+
unresolvedRefs
|
|
626
|
+
);
|
|
457
627
|
return new ToolMessage({
|
|
458
628
|
status: 'success',
|
|
459
629
|
name: tool.name,
|
|
460
630
|
content: processed.content,
|
|
461
631
|
tool_call_id: call.id!,
|
|
632
|
+
...(refMeta != null && {
|
|
633
|
+
additional_kwargs: refMeta as Record<string, unknown>,
|
|
634
|
+
}),
|
|
462
635
|
});
|
|
463
636
|
}
|
|
464
637
|
} catch (_e: unknown) {
|
|
@@ -510,6 +683,9 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
510
683
|
content: `Error: ${e.message}\n Please fix your mistakes.`,
|
|
511
684
|
name: call.name,
|
|
512
685
|
tool_call_id: call.id ?? '',
|
|
686
|
+
...(unresolvedRefs.length > 0 && {
|
|
687
|
+
additional_kwargs: { _unresolvedRefs: unresolvedRefs },
|
|
688
|
+
}),
|
|
513
689
|
});
|
|
514
690
|
}
|
|
515
691
|
}
|
|
@@ -618,6 +794,34 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
618
794
|
return parsedArgs;
|
|
619
795
|
}
|
|
620
796
|
|
|
797
|
+
/**
|
|
798
|
+
* Stores the raw, untruncated tool output in the registry under `refKey`
|
|
799
|
+
* (when registry + refKey are both present) and returns the metadata
|
|
800
|
+
* envelope to stamp on `ToolMessage.additional_kwargs`. The lazy
|
|
801
|
+
* annotation transform reads `_refKey` / `_refScope` / `_unresolvedRefs`
|
|
802
|
+
* at LLM request time to produce the transient annotated copy.
|
|
803
|
+
*/
|
|
804
|
+
private recordOutputReference(
|
|
805
|
+
runId: string | undefined,
|
|
806
|
+
registryContent: string,
|
|
807
|
+
refKey: string | undefined,
|
|
808
|
+
unresolved: string[]
|
|
809
|
+
): t.ToolMessageRefMetadata | undefined {
|
|
810
|
+
if (this.toolOutputRegistry != null && refKey != null) {
|
|
811
|
+
this.toolOutputRegistry.set(runId, refKey, registryContent);
|
|
812
|
+
}
|
|
813
|
+
if (refKey == null && unresolved.length === 0) return undefined;
|
|
814
|
+
const meta: t.ToolMessageRefMetadata = {};
|
|
815
|
+
if (refKey != null) {
|
|
816
|
+
meta._refKey = refKey;
|
|
817
|
+
// Anonymous invocations use a synthetic scope minted in run() — stamp
|
|
818
|
+
// it onto the message so annotateMessagesForLLM can recover it later.
|
|
819
|
+
if (runId != null) meta._refScope = runId;
|
|
820
|
+
}
|
|
821
|
+
if (unresolved.length > 0) meta._unresolvedRefs = unresolved;
|
|
822
|
+
return meta;
|
|
823
|
+
}
|
|
824
|
+
|
|
621
825
|
/**
|
|
622
826
|
* Builds code session context for injection into event-driven tool calls.
|
|
623
827
|
* Mirrors the session injection logic in runTool() for direct execution.
|
|
@@ -822,13 +1026,41 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
822
1026
|
}
|
|
823
1027
|
|
|
824
1028
|
/**
|
|
825
|
-
*
|
|
826
|
-
*
|
|
1029
|
+
* Converts InjectedMessage entries into LangChain HumanMessages.
|
|
1030
|
+
* 'user' and 'system' both become HumanMessage to avoid provider rejections
|
|
1031
|
+
* (Anthropic/Google reject non-leading SystemMessages); the original role
|
|
1032
|
+
* and metadata are preserved in additional_kwargs for downstream consumers.
|
|
1033
|
+
*/
|
|
1034
|
+
private convertInjectedMessages(
|
|
1035
|
+
messages: t.InjectedMessage[]
|
|
1036
|
+
): BaseMessage[] {
|
|
1037
|
+
const converted: BaseMessage[] = [];
|
|
1038
|
+
for (const msg of messages) {
|
|
1039
|
+
const additional_kwargs: Record<string, unknown> = {
|
|
1040
|
+
role: msg.role,
|
|
1041
|
+
};
|
|
1042
|
+
if (msg.isMeta != null) additional_kwargs.isMeta = msg.isMeta;
|
|
1043
|
+
if (msg.source != null) additional_kwargs.source = msg.source;
|
|
1044
|
+
if (msg.skillName != null) additional_kwargs.skillName = msg.skillName;
|
|
1045
|
+
|
|
1046
|
+
converted.push(
|
|
1047
|
+
new HumanMessage({ content: msg.content, additional_kwargs })
|
|
1048
|
+
);
|
|
1049
|
+
}
|
|
1050
|
+
return converted;
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
/**
|
|
1054
|
+
* Dispatches tool calls to the host via ON_TOOL_EXECUTE event and returns
|
|
1055
|
+
* the resulting ToolMessages along with any injected messages emitted by
|
|
1056
|
+
* the host (e.g. SkillTool body injection). Injected messages must be
|
|
1057
|
+
* placed AFTER the ToolMessages so the AIMessage tool_calls -> ToolMessage
|
|
1058
|
+
* adjacency required by some providers is preserved.
|
|
827
1059
|
*/
|
|
828
1060
|
private async dispatchToolEvents(
|
|
829
1061
|
toolCalls: ToolCall[],
|
|
830
1062
|
config: RunnableConfig
|
|
831
|
-
): Promise<ToolMessage[]> {
|
|
1063
|
+
): Promise<{ toolMessages: ToolMessage[]; injected: BaseMessage[] }> {
|
|
832
1064
|
// ========================================================================
|
|
833
1065
|
// HITL: Check approval for event-dispatched tools (browser, MCP, etc.)
|
|
834
1066
|
// before dispatching. Uses LangGraph interrupt() for each tool needing
|
|
@@ -863,10 +1095,132 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
863
1095
|
|
|
864
1096
|
// If all tools were denied, return denial messages without dispatching
|
|
865
1097
|
if (approvedCalls.length === 0) {
|
|
866
|
-
return denialMessages;
|
|
1098
|
+
return { toolMessages: denialMessages, injected: [] };
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1101
|
+
const runId = config.configurable?.run_id as string | undefined;
|
|
1102
|
+
const threadId = config.configurable?.thread_id as string | undefined;
|
|
1103
|
+
|
|
1104
|
+
/**
|
|
1105
|
+
* PreToolUse hooks may deny / ask / allow each call, and may rewrite
|
|
1106
|
+
* `toolInput` via `updatedInput`. A denied/asked call short-circuits
|
|
1107
|
+
* with a synthetic error ToolMessage and fires PermissionDenied so
|
|
1108
|
+
* the host can audit. Survivors continue to dispatch.
|
|
1109
|
+
*/
|
|
1110
|
+
const hookDenialMessages: ToolMessage[] = [];
|
|
1111
|
+
let postHookCalls = approvedCalls;
|
|
1112
|
+
if (
|
|
1113
|
+
runId != null &&
|
|
1114
|
+
this.hookRegistry?.hasHookFor('PreToolUse', runId) === true
|
|
1115
|
+
) {
|
|
1116
|
+
const HOOK_FALLBACK: AggregatedHookResult = {
|
|
1117
|
+
additionalContexts: [],
|
|
1118
|
+
errors: [],
|
|
1119
|
+
};
|
|
1120
|
+
const surviving: ToolCall[] = [];
|
|
1121
|
+
const preResults = await Promise.all(
|
|
1122
|
+
approvedCalls.map((call) =>
|
|
1123
|
+
executeHooks({
|
|
1124
|
+
registry: this.hookRegistry!,
|
|
1125
|
+
input: {
|
|
1126
|
+
hook_event_name: 'PreToolUse',
|
|
1127
|
+
runId,
|
|
1128
|
+
threadId,
|
|
1129
|
+
agentId: this.agentId,
|
|
1130
|
+
toolName: call.name,
|
|
1131
|
+
toolInput: call.args as Record<string, unknown>,
|
|
1132
|
+
toolUseId: call.id ?? '',
|
|
1133
|
+
stepId: this.toolCallStepIds?.get(call.id ?? ''),
|
|
1134
|
+
turn: this.toolUsageCount.get(call.name) ?? 0,
|
|
1135
|
+
},
|
|
1136
|
+
sessionId: runId,
|
|
1137
|
+
matchQuery: call.name,
|
|
1138
|
+
}).catch((): AggregatedHookResult => HOOK_FALLBACK)
|
|
1139
|
+
)
|
|
1140
|
+
);
|
|
1141
|
+
|
|
1142
|
+
for (let i = 0; i < approvedCalls.length; i++) {
|
|
1143
|
+
const call = approvedCalls[i];
|
|
1144
|
+
const hookResult = preResults[i];
|
|
1145
|
+
const denied =
|
|
1146
|
+
hookResult.decision === 'deny' || hookResult.decision === 'ask';
|
|
1147
|
+
if (denied) {
|
|
1148
|
+
const reason = hookResult.reason ?? 'Blocked by hook';
|
|
1149
|
+
hookDenialMessages.push(
|
|
1150
|
+
new ToolMessage({
|
|
1151
|
+
status: 'error',
|
|
1152
|
+
content: `Blocked: ${reason}`,
|
|
1153
|
+
name: call.name,
|
|
1154
|
+
tool_call_id: call.id ?? '',
|
|
1155
|
+
})
|
|
1156
|
+
);
|
|
1157
|
+
if (this.hookRegistry.hasHookFor('PermissionDenied', runId)) {
|
|
1158
|
+
// Fire-and-forget — denial accounting must not block dispatch.
|
|
1159
|
+
void executeHooks({
|
|
1160
|
+
registry: this.hookRegistry,
|
|
1161
|
+
input: {
|
|
1162
|
+
hook_event_name: 'PermissionDenied',
|
|
1163
|
+
runId,
|
|
1164
|
+
threadId,
|
|
1165
|
+
agentId: this.agentId,
|
|
1166
|
+
toolName: call.name,
|
|
1167
|
+
toolInput: call.args as Record<string, unknown>,
|
|
1168
|
+
toolUseId: call.id ?? '',
|
|
1169
|
+
reason,
|
|
1170
|
+
},
|
|
1171
|
+
sessionId: runId,
|
|
1172
|
+
matchQuery: call.name,
|
|
1173
|
+
}).catch(() => {
|
|
1174
|
+
/* swallow — denial is informational */
|
|
1175
|
+
});
|
|
1176
|
+
}
|
|
1177
|
+
continue;
|
|
1178
|
+
}
|
|
1179
|
+
if (
|
|
1180
|
+
hookResult.updatedInput != null &&
|
|
1181
|
+
typeof hookResult.updatedInput === 'object'
|
|
1182
|
+
) {
|
|
1183
|
+
call.args = hookResult.updatedInput as Record<string, unknown>;
|
|
1184
|
+
}
|
|
1185
|
+
surviving.push(call);
|
|
1186
|
+
}
|
|
1187
|
+
postHookCalls = surviving;
|
|
1188
|
+
|
|
1189
|
+
if (postHookCalls.length === 0) {
|
|
1190
|
+
return {
|
|
1191
|
+
toolMessages: [...denialMessages, ...hookDenialMessages],
|
|
1192
|
+
injected: [],
|
|
1193
|
+
};
|
|
1194
|
+
}
|
|
867
1195
|
}
|
|
868
1196
|
|
|
869
|
-
|
|
1197
|
+
/**
|
|
1198
|
+
* Tool output reference resolution (upstream PR #114): walk each call's
|
|
1199
|
+
* args and substitute `{{tool<i>turn<n>}}` placeholders with the stored
|
|
1200
|
+
* raw output. Captured here BEFORE request shaping so the substituted
|
|
1201
|
+
* args flow through the rest of the dispatch unchanged.
|
|
1202
|
+
*
|
|
1203
|
+
* Failures are non-fatal: the registry resolver returns the original
|
|
1204
|
+
* string unchanged for unknown keys, and surfaces them via `unresolved`
|
|
1205
|
+
* which we currently log-only. Future work can route unresolved-key
|
|
1206
|
+
* complaints into a hint message for the LLM.
|
|
1207
|
+
*/
|
|
1208
|
+
const batchTurn = this.toolOutputTurn++;
|
|
1209
|
+
if (this.toolOutputRegistry != null && runId != null) {
|
|
1210
|
+
const registry = this.toolOutputRegistry;
|
|
1211
|
+
for (const call of postHookCalls) {
|
|
1212
|
+
const args = call.args as Record<string, unknown> | undefined;
|
|
1213
|
+
if (args == null) continue;
|
|
1214
|
+
try {
|
|
1215
|
+
const { resolved } = registry.resolve(runId, args);
|
|
1216
|
+
call.args = resolved;
|
|
1217
|
+
} catch {
|
|
1218
|
+
/* leave args untouched on resolver failure */
|
|
1219
|
+
}
|
|
1220
|
+
}
|
|
1221
|
+
}
|
|
1222
|
+
|
|
1223
|
+
const requests: t.ToolCallRequest[] = postHookCalls.map((call) => {
|
|
870
1224
|
const turn = this.toolUsageCount.get(call.name) ?? 0;
|
|
871
1225
|
this.toolUsageCount.set(call.name, turn + 1);
|
|
872
1226
|
|
|
@@ -918,7 +1272,85 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
918
1272
|
|
|
919
1273
|
this.storeCodeSessionFromResults(results, requests);
|
|
920
1274
|
|
|
921
|
-
const
|
|
1275
|
+
const injected: BaseMessage[] = [];
|
|
1276
|
+
for (const result of results) {
|
|
1277
|
+
if (result.injectedMessages && result.injectedMessages.length > 0) {
|
|
1278
|
+
try {
|
|
1279
|
+
injected.push(
|
|
1280
|
+
...this.convertInjectedMessages(result.injectedMessages)
|
|
1281
|
+
);
|
|
1282
|
+
} catch (e) {
|
|
1283
|
+
// eslint-disable-next-line no-console
|
|
1284
|
+
console.warn(
|
|
1285
|
+
`[ToolNode] Failed to convert injectedMessages for toolCallId=${result.toolCallId}:`,
|
|
1286
|
+
e instanceof Error ? e.message : e
|
|
1287
|
+
);
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
/**
|
|
1293
|
+
* Fire PostToolUse / PostToolUseFailure hooks after results are in.
|
|
1294
|
+
* These run in parallel and never block the return — failures are
|
|
1295
|
+
* swallowed so a hook bug can't masquerade as a tool failure.
|
|
1296
|
+
*/
|
|
1297
|
+
if (runId != null && this.hookRegistry != null) {
|
|
1298
|
+
const hasPost = this.hookRegistry.hasHookFor('PostToolUse', runId);
|
|
1299
|
+
const hasFail = this.hookRegistry.hasHookFor('PostToolUseFailure', runId);
|
|
1300
|
+
if (hasPost || hasFail) {
|
|
1301
|
+
const postPromises: Promise<unknown>[] = [];
|
|
1302
|
+
for (const result of results) {
|
|
1303
|
+
const request = requests.find((r) => r.id === result.toolCallId);
|
|
1304
|
+
if (!request) continue;
|
|
1305
|
+
if (result.status === 'success' && hasPost) {
|
|
1306
|
+
postPromises.push(
|
|
1307
|
+
executeHooks({
|
|
1308
|
+
registry: this.hookRegistry,
|
|
1309
|
+
input: {
|
|
1310
|
+
hook_event_name: 'PostToolUse',
|
|
1311
|
+
runId,
|
|
1312
|
+
threadId,
|
|
1313
|
+
agentId: this.agentId,
|
|
1314
|
+
toolName: request.name,
|
|
1315
|
+
toolInput: request.args as Record<string, unknown>,
|
|
1316
|
+
toolOutput: result.content,
|
|
1317
|
+
toolUseId: result.toolCallId,
|
|
1318
|
+
stepId: this.toolCallStepIds?.get(result.toolCallId),
|
|
1319
|
+
turn: request.turn,
|
|
1320
|
+
},
|
|
1321
|
+
sessionId: runId,
|
|
1322
|
+
matchQuery: request.name,
|
|
1323
|
+
}).catch(() => undefined)
|
|
1324
|
+
);
|
|
1325
|
+
} else if (result.status === 'error' && hasFail) {
|
|
1326
|
+
postPromises.push(
|
|
1327
|
+
executeHooks({
|
|
1328
|
+
registry: this.hookRegistry,
|
|
1329
|
+
input: {
|
|
1330
|
+
hook_event_name: 'PostToolUseFailure',
|
|
1331
|
+
runId,
|
|
1332
|
+
threadId,
|
|
1333
|
+
agentId: this.agentId,
|
|
1334
|
+
toolName: request.name,
|
|
1335
|
+
toolInput: request.args as Record<string, unknown>,
|
|
1336
|
+
toolUseId: result.toolCallId,
|
|
1337
|
+
error: result.errorMessage ?? 'Unknown error',
|
|
1338
|
+
stepId: this.toolCallStepIds?.get(result.toolCallId),
|
|
1339
|
+
turn: request.turn,
|
|
1340
|
+
},
|
|
1341
|
+
sessionId: runId,
|
|
1342
|
+
matchQuery: request.name,
|
|
1343
|
+
}).catch(() => undefined)
|
|
1344
|
+
);
|
|
1345
|
+
}
|
|
1346
|
+
}
|
|
1347
|
+
if (postPromises.length > 0) {
|
|
1348
|
+
await Promise.all(postPromises);
|
|
1349
|
+
}
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
|
|
1353
|
+
const eventMessages = results.map((result, idx) => {
|
|
922
1354
|
const request = requests.find((r) => r.id === result.toolCallId);
|
|
923
1355
|
const toolName = request?.name ?? 'unknown';
|
|
924
1356
|
const stepId = this.toolCallStepIds?.get(result.toolCallId) ?? '';
|
|
@@ -947,12 +1379,40 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
947
1379
|
typeof result.content === 'string'
|
|
948
1380
|
? result.content
|
|
949
1381
|
: JSON.stringify(result.content);
|
|
1382
|
+
/**
|
|
1383
|
+
* Tool output reference — lazy annotation (upstream PRs #114 + #117).
|
|
1384
|
+
* Register the raw output under `tool<idx>turn<turn>` in the
|
|
1385
|
+
* registry but leave `ToolMessage.content` clean. Stamp the ref
|
|
1386
|
+
* metadata into `additional_kwargs` instead. The lazy
|
|
1387
|
+
* `annotateMessagesForLLM` transform applies the visible
|
|
1388
|
+
* `[ref: …]` / `_ref` annotation only on the transient copy sent
|
|
1389
|
+
* to the model. Persisted message stays unannotated so
|
|
1390
|
+
* conversation exports / pruning / token accounting stay clean.
|
|
1391
|
+
*/
|
|
1392
|
+
const additionalKwargs: Record<string, unknown> = {};
|
|
1393
|
+
if (this.toolOutputRegistry != null && runId != null) {
|
|
1394
|
+
try {
|
|
1395
|
+
const refKey = buildReferenceKey(idx, batchTurn);
|
|
1396
|
+
this.toolOutputRegistry.set(runId, refKey, contentString);
|
|
1397
|
+
const meta: t.ToolMessageRefMetadata = {
|
|
1398
|
+
_refKey: refKey,
|
|
1399
|
+
_refScope: runId,
|
|
1400
|
+
};
|
|
1401
|
+
Object.assign(additionalKwargs, meta);
|
|
1402
|
+
} catch {
|
|
1403
|
+
/* registry store failure is non-fatal — message stays clean, no annotation */
|
|
1404
|
+
}
|
|
1405
|
+
}
|
|
950
1406
|
toolMessage = new ToolMessage({
|
|
951
1407
|
status: 'success',
|
|
952
1408
|
name: toolName,
|
|
953
1409
|
content: contentString,
|
|
954
1410
|
artifact: result.artifact,
|
|
955
1411
|
tool_call_id: result.toolCallId,
|
|
1412
|
+
additional_kwargs:
|
|
1413
|
+
Object.keys(additionalKwargs).length > 0
|
|
1414
|
+
? additionalKwargs
|
|
1415
|
+
: undefined,
|
|
956
1416
|
});
|
|
957
1417
|
}
|
|
958
1418
|
|
|
@@ -985,7 +1445,14 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
985
1445
|
return toolMessage;
|
|
986
1446
|
});
|
|
987
1447
|
|
|
988
|
-
return
|
|
1448
|
+
return {
|
|
1449
|
+
toolMessages: [
|
|
1450
|
+
...denialMessages,
|
|
1451
|
+
...hookDenialMessages,
|
|
1452
|
+
...eventMessages,
|
|
1453
|
+
],
|
|
1454
|
+
injected,
|
|
1455
|
+
};
|
|
989
1456
|
}
|
|
990
1457
|
|
|
991
1458
|
/**
|
|
@@ -998,13 +1465,32 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
998
1465
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
999
1466
|
input: any
|
|
1000
1467
|
): Promise<T> {
|
|
1001
|
-
const
|
|
1468
|
+
const { toolMessages, injected } = await this.dispatchToolEvents(
|
|
1469
|
+
toolCalls,
|
|
1470
|
+
config
|
|
1471
|
+
);
|
|
1472
|
+
const outputs: BaseMessage[] = [...toolMessages, ...injected];
|
|
1002
1473
|
return (Array.isArray(input) ? outputs : { messages: outputs }) as T;
|
|
1003
1474
|
}
|
|
1004
1475
|
|
|
1005
1476
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1006
1477
|
protected async run(input: any, config: RunnableConfig): Promise<T> {
|
|
1007
1478
|
this.toolCallTurns.clear();
|
|
1479
|
+
/**
|
|
1480
|
+
* Per-batch local map for resolved (post-substitution) args. Lives
|
|
1481
|
+
* on the stack so concurrent `run()` calls on the same ToolNode
|
|
1482
|
+
* cannot read or wipe each other's entries.
|
|
1483
|
+
*/
|
|
1484
|
+
const resolvedArgsByCallId: ResolvedArgsByCallId = new Map();
|
|
1485
|
+
/**
|
|
1486
|
+
* Claim this batch's turn synchronously from the registry (or fall
|
|
1487
|
+
* back to 0 when the feature is disabled). For anonymous callers
|
|
1488
|
+
* (no `run_id` in config), mint a unique per-batch scope id so two
|
|
1489
|
+
* concurrent anonymous invocations don't target the same bucket.
|
|
1490
|
+
*/
|
|
1491
|
+
const incomingRunId = config.configurable?.run_id as string | undefined;
|
|
1492
|
+
const batchScopeId = incomingRunId ?? `\0anon-${this.anonBatchCounter++}`;
|
|
1493
|
+
const batchTurn = this.toolOutputRegistry?.nextTurn(batchScopeId) ?? 0;
|
|
1008
1494
|
let outputs: (BaseMessage | Command)[];
|
|
1009
1495
|
|
|
1010
1496
|
if (this.isSendInput(input)) {
|
|
@@ -1012,7 +1498,14 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
1012
1498
|
if (this.eventDrivenMode && isDirectTool !== true) {
|
|
1013
1499
|
return this.executeViaEvent([input.lg_tool_call], config, input);
|
|
1014
1500
|
}
|
|
1015
|
-
outputs = [
|
|
1501
|
+
outputs = [
|
|
1502
|
+
await this.runTool(input.lg_tool_call, config, {
|
|
1503
|
+
batchIndex: 0,
|
|
1504
|
+
turn: batchTurn,
|
|
1505
|
+
batchScopeId,
|
|
1506
|
+
resolvedArgsByCallId,
|
|
1507
|
+
}),
|
|
1508
|
+
];
|
|
1016
1509
|
this.handleRunToolCompletions([input.lg_tool_call], outputs, config);
|
|
1017
1510
|
} else {
|
|
1018
1511
|
let messages: BaseMessage[];
|
|
@@ -1081,23 +1574,52 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
1081
1574
|
);
|
|
1082
1575
|
|
|
1083
1576
|
// Run direct tools and event tools in parallel — they are independent
|
|
1084
|
-
const [directOutputs,
|
|
1577
|
+
const [directOutputs, eventDispatch] = (await Promise.all([
|
|
1085
1578
|
directCalls.length > 0
|
|
1086
|
-
? Promise.all(
|
|
1087
|
-
|
|
1579
|
+
? Promise.all(
|
|
1580
|
+
directCalls.map((call, idx) =>
|
|
1581
|
+
this.runTool(call, config, {
|
|
1582
|
+
batchIndex: idx,
|
|
1583
|
+
turn: batchTurn,
|
|
1584
|
+
batchScopeId,
|
|
1585
|
+
resolvedArgsByCallId,
|
|
1586
|
+
})
|
|
1587
|
+
)
|
|
1588
|
+
)
|
|
1589
|
+
: ([] as (BaseMessage | Command)[]),
|
|
1088
1590
|
eventCalls.length > 0
|
|
1089
1591
|
? this.dispatchToolEvents(eventCalls, config)
|
|
1090
|
-
: [],
|
|
1091
|
-
|
|
1592
|
+
: ({ toolMessages: [], injected: [] } as {
|
|
1593
|
+
toolMessages: ToolMessage[];
|
|
1594
|
+
injected: BaseMessage[];
|
|
1595
|
+
}),
|
|
1596
|
+
])) as [
|
|
1597
|
+
(BaseMessage | Command)[],
|
|
1598
|
+
{ toolMessages: ToolMessage[]; injected: BaseMessage[] },
|
|
1599
|
+
];
|
|
1092
1600
|
|
|
1093
1601
|
if (directCalls.length > 0 && directOutputs.length > 0) {
|
|
1094
1602
|
this.handleRunToolCompletions(directCalls, directOutputs, config);
|
|
1095
1603
|
}
|
|
1096
1604
|
|
|
1097
|
-
|
|
1605
|
+
// Injected messages MUST follow ToolMessages so the AIMessage
|
|
1606
|
+
// tool_calls -> ToolMessage adjacency required by some providers
|
|
1607
|
+
// is preserved.
|
|
1608
|
+
outputs = [
|
|
1609
|
+
...directOutputs,
|
|
1610
|
+
...eventDispatch.toolMessages,
|
|
1611
|
+
...eventDispatch.injected,
|
|
1612
|
+
];
|
|
1098
1613
|
} else {
|
|
1099
1614
|
outputs = await Promise.all(
|
|
1100
|
-
filteredCalls.map((call) =>
|
|
1615
|
+
filteredCalls.map((call, idx) =>
|
|
1616
|
+
this.runTool(call, config, {
|
|
1617
|
+
batchIndex: idx,
|
|
1618
|
+
turn: batchTurn,
|
|
1619
|
+
batchScopeId,
|
|
1620
|
+
resolvedArgsByCallId,
|
|
1621
|
+
})
|
|
1622
|
+
)
|
|
1101
1623
|
);
|
|
1102
1624
|
this.handleRunToolCompletions(filteredCalls, outputs, config);
|
|
1103
1625
|
}
|