@illuma-ai/agents 1.4.0-alpha.6 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/graphs/phases/memoryFlushPhase.cjs +1 -1
- package/dist/cjs/graphs/phases/memoryFlushPhase.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 +1 -4
- 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/memory/citations.cjs +4 -4
- package/dist/cjs/memory/citations.cjs.map +1 -1
- package/dist/cjs/memory/constants.cjs +17 -17
- package/dist/cjs/memory/constants.cjs.map +1 -1
- package/dist/cjs/memory/mmr.cjs +1 -1
- package/dist/cjs/memory/mmr.cjs.map +1 -1
- package/dist/cjs/memory/paths.cjs +1 -1
- package/dist/cjs/memory/paths.cjs.map +1 -1
- package/dist/cjs/memory/recallTracking.cjs +3 -3
- package/dist/cjs/memory/recallTracking.cjs.map +1 -1
- package/dist/cjs/memory/temporalDecay.cjs +2 -2
- package/dist/cjs/memory/temporalDecay.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 +45 -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/memory/memoryAppendTool.cjs +1 -1
- package/dist/cjs/tools/memory/memoryAppendTool.cjs.map +1 -1
- package/dist/cjs/tools/memory/memoryGetTool.cjs +2 -2
- package/dist/cjs/tools/memory/memoryGetTool.cjs.map +1 -1
- package/dist/cjs/tools/memory/memorySearchTool.cjs +3 -3
- package/dist/cjs/tools/memory/memorySearchTool.cjs.map +1 -1
- package/dist/cjs/tools/memory/shared.cjs +1 -1
- package/dist/cjs/tools/memory/shared.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 +54 -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/graphs/phases/memoryFlushPhase.mjs +1 -1
- package/dist/esm/graphs/phases/memoryFlushPhase.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 +1 -4
- 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/memory/citations.mjs +4 -4
- package/dist/esm/memory/citations.mjs.map +1 -1
- package/dist/esm/memory/constants.mjs +17 -17
- package/dist/esm/memory/constants.mjs.map +1 -1
- package/dist/esm/memory/mmr.mjs +1 -1
- package/dist/esm/memory/mmr.mjs.map +1 -1
- package/dist/esm/memory/paths.mjs +1 -1
- package/dist/esm/memory/paths.mjs.map +1 -1
- package/dist/esm/memory/recallTracking.mjs +3 -3
- package/dist/esm/memory/recallTracking.mjs.map +1 -1
- package/dist/esm/memory/temporalDecay.mjs +2 -2
- package/dist/esm/memory/temporalDecay.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 +45 -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/memory/memoryAppendTool.mjs +1 -1
- package/dist/esm/tools/memory/memoryAppendTool.mjs.map +1 -1
- package/dist/esm/tools/memory/memoryGetTool.mjs +2 -2
- package/dist/esm/tools/memory/memoryGetTool.mjs.map +1 -1
- package/dist/esm/tools/memory/memorySearchTool.mjs +3 -3
- package/dist/esm/tools/memory/memorySearchTool.mjs.map +1 -1
- package/dist/esm/tools/memory/shared.mjs +1 -1
- package/dist/esm/tools/memory/shared.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 +52 -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/graphs/phases/memoryFlushPhase.d.ts +2 -2
- 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/llm/openai/index.d.ts +1 -1
- package/dist/types/memory/citations.d.ts +4 -4
- package/dist/types/memory/constants.d.ts +17 -17
- package/dist/types/memory/mmr.d.ts +3 -3
- package/dist/types/memory/paths.d.ts +1 -1
- package/dist/types/memory/temporalDecay.d.ts +2 -2
- package/dist/types/memory/types.d.ts +3 -3
- 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/memory/shared.d.ts +1 -1
- 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 +71 -0
- package/dist/types/types/graph.d.ts +163 -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.ts +321 -78
- package/src/agents/__tests__/AgentContext.cacheTtl.live.test.ts +259 -0
- package/src/agents/__tests__/AgentContext.crossAgentTier1.live.test.ts +266 -0
- package/src/agents/__tests__/AgentContext.crossUserCache.live.test.ts +342 -0
- package/src/agents/__tests__/AgentContext.test.ts +632 -0
- package/src/common/__tests__/enum.test.ts +7 -17
- package/src/common/enum.ts +43 -12
- package/src/common/index.ts +0 -1
- package/src/graphs/Graph.ts +222 -2
- package/src/graphs/MultiAgentGraph.ts +154 -1466
- package/src/graphs/__tests__/MultiAgentGraph.test.ts +91 -0
- package/src/graphs/gapFeatures.test.ts +1 -1
- package/src/graphs/index.ts +0 -1
- package/src/graphs/phases/__tests__/memoryFlushPhase.test.ts +1 -1
- package/src/graphs/phases/memoryFlushPhase.ts +2 -2
- 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.ts +15 -24
- 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/utils/message_inputs.ts +10 -1
- package/src/llm/anthropic/utils/server-tool-inputs.test.ts +436 -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.ts +116 -41
- package/src/llm/openai/index.ts +2 -2
- package/src/llm/openai/utils/index.ts +31 -14
- package/src/memory/citations.ts +4 -4
- package/src/memory/constants.ts +17 -17
- package/src/memory/mmr.ts +3 -3
- package/src/memory/paths.ts +1 -1
- package/src/memory/recallTracking.ts +3 -3
- package/src/memory/temporalDecay.ts +2 -2
- package/src/memory/types.ts +3 -3
- package/src/messages/__tests__/contextPruning.test.ts +228 -0
- package/src/messages/cache.test.ts +62 -24
- package/src/messages/cache.ts +112 -0
- package/src/messages/contextPruning.ts +191 -0
- package/src/messages/contextPruningSettings.ts +90 -0
- package/src/messages/ensureThinkingBlock.test.ts +1 -1
- package/src/messages/format.ts +164 -12
- package/src/messages/formatAgentMessages.skills.test.ts +413 -0
- package/src/messages/formatAgentMessages.test.ts +1 -1
- package/src/messages/index.ts +2 -0
- package/src/messages/prune.ts +661 -4
- package/src/run.ts +155 -1
- package/src/scripts/multi-agent-chain.ts +2 -2
- package/src/scripts/multi-agent-document-review-chain.ts +2 -2
- package/src/scripts/multi-agent-hybrid-flow.ts +4 -4
- package/src/scripts/multi-agent-parallel.ts +3 -3
- package/src/scripts/multi-agent-sequence.ts +3 -3
- package/src/scripts/multi-agent-subagent.ts +246 -0
- package/src/scripts/multi-agent-supervisor.ts +5 -5
- package/src/scripts/poc-multi-agent-comprehensive.ts +8 -8
- package/src/scripts/sequential-full-metadata-test.ts +2 -2
- 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.ts +3 -3
- package/src/scripts/test-handoff-input.ts +1 -1
- package/src/scripts/test-handoff-steering.ts +3 -3
- package/src/scripts/test-multi-agent-list-handoff.ts +1 -1
- package/src/scripts/test-parallel-agent-labeling.ts +3 -3
- package/src/scripts/test-parallel-handoffs.ts +2 -2
- package/src/scripts/test-thinking-handoff-bedrock.ts +1 -1
- package/src/scripts/test-thinking-handoff.ts +1 -1
- package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +1 -1
- package/src/scripts/test-tool-before-handoff-role-order.ts +1 -1
- package/src/scripts/test-tools-before-handoff.ts +1 -1
- package/src/specs/agent-handoffs.test.ts +26 -483
- package/src/specs/anthropic.simple.test.ts +61 -0
- package/src/specs/multi-agent-summarization.test.ts +396 -0
- package/src/specs/prune.orphans.test.ts +248 -0
- package/src/specs/prune.test.ts +104 -16
- package/src/specs/thinking-handoff.test.ts +19 -19
- package/src/tools/BashExecutor.ts +281 -0
- package/src/tools/BashProgrammaticToolCalling.ts +397 -0
- package/src/tools/CodeExecutor.ts +63 -54
- package/src/tools/ProgrammaticToolCalling.ts +29 -14
- package/src/tools/ReadFile.ts +39 -0
- package/src/tools/SkillTool.ts +46 -0
- package/src/tools/SubagentTool.ts +100 -0
- package/src/tools/ToolNode.ts +548 -26
- package/src/tools/__tests__/BashExecutor.test.ts +49 -0
- package/src/tools/__tests__/CodeExecutor.test.ts +37 -36
- 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__/SubagentExecutor.test.ts +1148 -0
- package/src/tools/__tests__/SubagentTool.test.ts +149 -0
- package/src/tools/__tests__/ToolNode.outputReferences.test.ts +1438 -0
- package/src/tools/__tests__/annotateMessagesForLLM.test.ts +479 -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/memory/memoryAppendTool.ts +1 -1
- package/src/tools/memory/memoryGetTool.ts +2 -2
- package/src/tools/memory/memorySearchTool.ts +3 -3
- package/src/tools/memory/shared.ts +1 -1
- package/src/tools/search/search.ts +12 -2
- 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/tool.ts +36 -2
- package/src/tools/search/types.ts +133 -8
- 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 +74 -0
- package/src/types/graph.ts +172 -20
- package/src/types/index.ts +3 -0
- package/src/types/messages.ts +27 -0
- package/src/types/run.ts +22 -0
- package/src/types/skill.ts +11 -0
- package/src/types/tools.ts +118 -0
- package/src/utils/__tests__/truncation.test.ts +66 -0
- package/src/utils/index.ts +1 -3
- 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/tools/search/test.d.ts +0 -1
- 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/tools/search/output.md +0 -2775
- package/src/tools/search/test.html +0 -884
- package/src/tools/search/test.md +0 -643
- package/src/tools/search/test.ts +0 -159
- 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/run.ts
CHANGED
|
@@ -22,9 +22,47 @@ import { GraphEvents, Callback, TitleMethod } from '@/common';
|
|
|
22
22
|
import { MultiAgentGraph } from '@/graphs/MultiAgentGraph';
|
|
23
23
|
import { StandardGraph } from '@/graphs/Graph';
|
|
24
24
|
import { HandlerRegistry } from '@/events';
|
|
25
|
+
import { executeHooks } from '@/hooks';
|
|
26
|
+
import type { HookRegistry } from '@/hooks';
|
|
27
|
+
import { ToolOutputReferenceRegistry } from '@/tools/toolOutputReferences';
|
|
25
28
|
import { isOpenAILike } from '@/utils/llm';
|
|
26
29
|
import { isPresent } from '@/utils/misc';
|
|
27
30
|
|
|
31
|
+
function findLastMessageOfType(
|
|
32
|
+
messages: BaseMessage[],
|
|
33
|
+
type: string
|
|
34
|
+
): BaseMessage | undefined {
|
|
35
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
36
|
+
if (messages[i].getType() === type) {
|
|
37
|
+
return messages[i];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function extractPromptText(message: BaseMessage): string {
|
|
44
|
+
const content = message.content;
|
|
45
|
+
if (typeof content === 'string') {
|
|
46
|
+
return content;
|
|
47
|
+
}
|
|
48
|
+
if (!Array.isArray(content)) {
|
|
49
|
+
return String(content);
|
|
50
|
+
}
|
|
51
|
+
const parts: string[] = [];
|
|
52
|
+
for (const block of content) {
|
|
53
|
+
if (
|
|
54
|
+
typeof block === 'object' &&
|
|
55
|
+
'type' in block &&
|
|
56
|
+
block.type === 'text' &&
|
|
57
|
+
'text' in block &&
|
|
58
|
+
typeof block.text === 'string'
|
|
59
|
+
) {
|
|
60
|
+
parts.push(block.text);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return parts.join('\n');
|
|
64
|
+
}
|
|
65
|
+
|
|
28
66
|
export const defaultOmitOptions = new Set([
|
|
29
67
|
'stream',
|
|
30
68
|
'thinking',
|
|
@@ -42,6 +80,8 @@ export class Run<_T extends t.BaseGraphState> {
|
|
|
42
80
|
id: string;
|
|
43
81
|
private tokenCounter?: t.TokenCounter;
|
|
44
82
|
private handlerRegistry?: HandlerRegistry;
|
|
83
|
+
private hookRegistry?: HookRegistry;
|
|
84
|
+
private toolOutputRegistry?: ToolOutputReferenceRegistry;
|
|
45
85
|
private indexTokenCountMap?: Record<string, number>;
|
|
46
86
|
graphRunnable?: t.CompiledStateWorkflow;
|
|
47
87
|
Graph: StandardGraph | MultiAgentGraph | undefined;
|
|
@@ -70,6 +110,26 @@ export class Run<_T extends t.BaseGraphState> {
|
|
|
70
110
|
}
|
|
71
111
|
|
|
72
112
|
this.handlerRegistry = handlerRegistry;
|
|
113
|
+
/**
|
|
114
|
+
* Capture hookRegistry BEFORE graph compilation so it propagates into
|
|
115
|
+
* any ToolNode the graph builds during createWorkflow(). createLegacyGraph
|
|
116
|
+
* threads `this.hookRegistry` onto the graph instance via Graph.hookRegistry
|
|
117
|
+
* before compile, which Graph.createToolNodeForAgent reads when constructing
|
|
118
|
+
* each ToolNode.
|
|
119
|
+
*/
|
|
120
|
+
this.hookRegistry = config.hooks;
|
|
121
|
+
/**
|
|
122
|
+
* Same lifecycle for the tool-output reference registry: build it
|
|
123
|
+
* here (when enabled) and let createLegacyGraph / createMultiAgentGraph
|
|
124
|
+
* thread it onto the graph before compile so every ToolNode sees the
|
|
125
|
+
* same instance.
|
|
126
|
+
*/
|
|
127
|
+
if (config.toolOutputReferences?.enabled === true) {
|
|
128
|
+
this.toolOutputRegistry = new ToolOutputReferenceRegistry({
|
|
129
|
+
maxOutputSize: config.toolOutputReferences.maxOutputSize,
|
|
130
|
+
maxTotalSize: config.toolOutputReferences.maxTotalSize,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
73
133
|
|
|
74
134
|
if (!config.graphConfig) {
|
|
75
135
|
throw new Error('Graph config not provided');
|
|
@@ -138,6 +198,12 @@ export class Run<_T extends t.BaseGraphState> {
|
|
|
138
198
|
});
|
|
139
199
|
/** Propagate compile options from graph config */
|
|
140
200
|
standardGraph.compileOptions = config.compileOptions;
|
|
201
|
+
if (this.hookRegistry) {
|
|
202
|
+
standardGraph.hookRegistry = this.hookRegistry;
|
|
203
|
+
}
|
|
204
|
+
if (this.toolOutputRegistry) {
|
|
205
|
+
standardGraph.toolOutputRegistry = this.toolOutputRegistry;
|
|
206
|
+
}
|
|
141
207
|
this.Graph = standardGraph;
|
|
142
208
|
return standardGraph.createWorkflow();
|
|
143
209
|
}
|
|
@@ -160,6 +226,12 @@ export class Run<_T extends t.BaseGraphState> {
|
|
|
160
226
|
multiAgentGraph.compileOptions = compileOptions;
|
|
161
227
|
}
|
|
162
228
|
|
|
229
|
+
if (this.hookRegistry) {
|
|
230
|
+
multiAgentGraph.hookRegistry = this.hookRegistry;
|
|
231
|
+
}
|
|
232
|
+
if (this.toolOutputRegistry) {
|
|
233
|
+
multiAgentGraph.toolOutputRegistry = this.toolOutputRegistry;
|
|
234
|
+
}
|
|
163
235
|
this.Graph = multiAgentGraph;
|
|
164
236
|
return multiAgentGraph.createWorkflow();
|
|
165
237
|
}
|
|
@@ -216,7 +288,11 @@ export class Run<_T extends t.BaseGraphState> {
|
|
|
216
288
|
*/
|
|
217
289
|
getLastActiveAgentId(): string | undefined {
|
|
218
290
|
if (this.Graph && this.Graph instanceof MultiAgentGraph) {
|
|
219
|
-
|
|
291
|
+
// Last entry in the run's participating agent set is the most-recent
|
|
292
|
+
// active agent. Derived from contentData step trail rather than
|
|
293
|
+
// a tracked field — same observation surface, fewer state slots.
|
|
294
|
+
const ids = this.Graph.getActiveAgentIds();
|
|
295
|
+
return ids.length > 0 ? ids[ids.length - 1] : undefined;
|
|
220
296
|
}
|
|
221
297
|
return undefined;
|
|
222
298
|
}
|
|
@@ -349,6 +425,46 @@ export class Run<_T extends t.BaseGraphState> {
|
|
|
349
425
|
run_id: this.id,
|
|
350
426
|
});
|
|
351
427
|
|
|
428
|
+
const threadId = config.configurable.thread_id as string | undefined;
|
|
429
|
+
|
|
430
|
+
if (this.hookRegistry != null) {
|
|
431
|
+
await executeHooks({
|
|
432
|
+
registry: this.hookRegistry,
|
|
433
|
+
input: {
|
|
434
|
+
hook_event_name: 'RunStart',
|
|
435
|
+
runId: this.id,
|
|
436
|
+
threadId,
|
|
437
|
+
agentId: this.Graph.defaultAgentId,
|
|
438
|
+
messages: (inputs as { messages?: BaseMessage[] }).messages ?? [],
|
|
439
|
+
},
|
|
440
|
+
sessionId: this.id,
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
const messages = (inputs as { messages?: BaseMessage[] }).messages ?? [];
|
|
444
|
+
const lastHuman = findLastMessageOfType(messages, 'human');
|
|
445
|
+
if (lastHuman != null) {
|
|
446
|
+
const promptResult = await executeHooks({
|
|
447
|
+
registry: this.hookRegistry,
|
|
448
|
+
input: {
|
|
449
|
+
hook_event_name: 'UserPromptSubmit',
|
|
450
|
+
runId: this.id,
|
|
451
|
+
threadId,
|
|
452
|
+
agentId: this.Graph.defaultAgentId,
|
|
453
|
+
prompt: extractPromptText(lastHuman),
|
|
454
|
+
},
|
|
455
|
+
sessionId: this.id,
|
|
456
|
+
});
|
|
457
|
+
if (
|
|
458
|
+
promptResult.decision === 'deny' ||
|
|
459
|
+
promptResult.decision === 'ask'
|
|
460
|
+
) {
|
|
461
|
+
this.hookRegistry.clearSession(this.id);
|
|
462
|
+
config.callbacks = undefined;
|
|
463
|
+
return undefined;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
352
468
|
const stream = this.graphRunnable.streamEvents(inputs, config, {
|
|
353
469
|
raiseError: true,
|
|
354
470
|
/**
|
|
@@ -378,13 +494,51 @@ export class Run<_T extends t.BaseGraphState> {
|
|
|
378
494
|
await handler.handle(eventName, data, metadata, this.Graph);
|
|
379
495
|
}
|
|
380
496
|
}
|
|
497
|
+
|
|
498
|
+
if (this.hookRegistry?.hasHookFor('Stop', this.id) === true) {
|
|
499
|
+
const inputMessages =
|
|
500
|
+
(inputs as { messages?: BaseMessage[] }).messages ?? [];
|
|
501
|
+
await executeHooks({
|
|
502
|
+
registry: this.hookRegistry,
|
|
503
|
+
input: {
|
|
504
|
+
hook_event_name: 'Stop',
|
|
505
|
+
runId: this.id,
|
|
506
|
+
threadId,
|
|
507
|
+
agentId: this.Graph.defaultAgentId,
|
|
508
|
+
messages: this.Graph.getRunMessages() ?? inputMessages,
|
|
509
|
+
stopHookActive: false,
|
|
510
|
+
},
|
|
511
|
+
sessionId: this.id,
|
|
512
|
+
}).catch(() => {
|
|
513
|
+
/* Stop hook errors must not masquerade as stream failures */
|
|
514
|
+
});
|
|
515
|
+
}
|
|
381
516
|
} catch (e) {
|
|
382
517
|
// GraphInterrupt is expected when interrupt() fires (HITL approval flow).
|
|
383
518
|
// Exit gracefully so the host can check hasInterrupts() and resume.
|
|
384
519
|
if (isGraphInterrupt(e)) {
|
|
385
520
|
return undefined;
|
|
386
521
|
}
|
|
522
|
+
if (this.hookRegistry?.hasHookFor('StopFailure', this.id) === true) {
|
|
523
|
+
const runMessages = this.Graph.getRunMessages() ?? [];
|
|
524
|
+
await executeHooks({
|
|
525
|
+
registry: this.hookRegistry,
|
|
526
|
+
input: {
|
|
527
|
+
hook_event_name: 'StopFailure',
|
|
528
|
+
runId: this.id,
|
|
529
|
+
threadId,
|
|
530
|
+
agentId: this.Graph.defaultAgentId,
|
|
531
|
+
error: e instanceof Error ? e.message : String(e),
|
|
532
|
+
lastAssistantMessage: findLastMessageOfType(runMessages, 'ai'),
|
|
533
|
+
},
|
|
534
|
+
sessionId: this.id,
|
|
535
|
+
}).catch(() => {
|
|
536
|
+
/* swallow hook errors — original error must propagate */
|
|
537
|
+
});
|
|
538
|
+
}
|
|
387
539
|
throw e;
|
|
540
|
+
} finally {
|
|
541
|
+
this.hookRegistry?.clearSession(this.id);
|
|
388
542
|
}
|
|
389
543
|
|
|
390
544
|
/**
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
getBufferString,
|
|
8
8
|
} from '@langchain/core/messages';
|
|
9
9
|
import { Run } from '@/run';
|
|
10
|
-
import { Providers, GraphEvents } from '@/common';
|
|
10
|
+
import { Providers, GraphEvents, EdgeType } from '@/common';
|
|
11
11
|
import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
|
|
12
12
|
import { ToolEndHandler, ModelEndHandler } from '@/events';
|
|
13
13
|
import type * as t from '@/types';
|
|
@@ -28,7 +28,7 @@ function createSequentialChainEdges(agentIds: string[]): t.GraphEdge[] {
|
|
|
28
28
|
edges.push({
|
|
29
29
|
from: fromAgent,
|
|
30
30
|
to: toAgent,
|
|
31
|
-
edgeType:
|
|
31
|
+
edgeType: EdgeType.DIRECT,
|
|
32
32
|
// Use a prompt function to create the buffer string from all previous results
|
|
33
33
|
prompt: (messages: BaseMessage[], startIndex: number) => {
|
|
34
34
|
// Get only the messages from this run (after startIndex)
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
getBufferString,
|
|
8
8
|
} from '@langchain/core/messages';
|
|
9
9
|
import { Run } from '@/run';
|
|
10
|
-
import { Providers, GraphEvents } from '@/common';
|
|
10
|
+
import { Providers, GraphEvents, EdgeType } from '@/common';
|
|
11
11
|
import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
|
|
12
12
|
import { ToolEndHandler, ModelEndHandler } from '@/events';
|
|
13
13
|
import type * as t from '@/types';
|
|
@@ -22,7 +22,7 @@ function createDocumentReviewChain(agentIds: string[]): t.GraphEdge[] {
|
|
|
22
22
|
edges.push({
|
|
23
23
|
from: agentIds[i],
|
|
24
24
|
to: agentIds[i + 1],
|
|
25
|
-
edgeType:
|
|
25
|
+
edgeType: EdgeType.DIRECT,
|
|
26
26
|
prompt: (messages: BaseMessage[], startIndex: number) => {
|
|
27
27
|
const runMessages = messages.slice(startIndex);
|
|
28
28
|
const bufferString = getBufferString(runMessages);
|
|
@@ -3,7 +3,7 @@ config();
|
|
|
3
3
|
|
|
4
4
|
import { HumanMessage, BaseMessage } from '@langchain/core/messages';
|
|
5
5
|
import { Run } from '@/run';
|
|
6
|
-
import { Providers, GraphEvents, Constants } from '@/common';
|
|
6
|
+
import { Providers, GraphEvents, EdgeType, Constants } from '@/common';
|
|
7
7
|
import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
|
|
8
8
|
import { ToolEndHandler, ModelEndHandler } from '@/events';
|
|
9
9
|
import type * as t from '@/types';
|
|
@@ -108,7 +108,7 @@ async function testHybridMultiAgent() {
|
|
|
108
108
|
{
|
|
109
109
|
from: 'primary_agent',
|
|
110
110
|
to: 'standalone_agent',
|
|
111
|
-
edgeType:
|
|
111
|
+
edgeType: EdgeType.HANDOFF,
|
|
112
112
|
description: 'Transfer to standalone specialist for complex requests',
|
|
113
113
|
prompt: 'Specific instructions for the specialist',
|
|
114
114
|
},
|
|
@@ -116,14 +116,14 @@ async function testHybridMultiAgent() {
|
|
|
116
116
|
{
|
|
117
117
|
from: 'primary_agent',
|
|
118
118
|
to: 'agent_b',
|
|
119
|
-
edgeType:
|
|
119
|
+
edgeType: EdgeType.DIRECT,
|
|
120
120
|
description: 'Continue to Agent B only if no handoff occurs',
|
|
121
121
|
},
|
|
122
122
|
// Direct edge: agent_b automatically continues to agent_c
|
|
123
123
|
{
|
|
124
124
|
from: 'agent_b',
|
|
125
125
|
to: 'agent_c',
|
|
126
|
-
edgeType:
|
|
126
|
+
edgeType: EdgeType.DIRECT,
|
|
127
127
|
description: 'Automatic progression from B to C',
|
|
128
128
|
},
|
|
129
129
|
];
|
|
@@ -5,7 +5,7 @@ import { HumanMessage, BaseMessage } from '@langchain/core/messages';
|
|
|
5
5
|
import type * as t from '@/types';
|
|
6
6
|
import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
|
|
7
7
|
import { ToolEndHandler, ModelEndHandler } from '@/events';
|
|
8
|
-
import { Providers, GraphEvents } from '@/common';
|
|
8
|
+
import { Providers, GraphEvents, EdgeType } from '@/common';
|
|
9
9
|
import { sleep } from '@/utils/run';
|
|
10
10
|
import { Run } from '@/run';
|
|
11
11
|
|
|
@@ -160,13 +160,13 @@ async function testParallelMultiAgent() {
|
|
|
160
160
|
from: 'researcher',
|
|
161
161
|
to: ['analyst1', 'analyst2', 'analyst3'], // Fan-out to multiple analysts
|
|
162
162
|
description: 'Distribute research to specialist analysts',
|
|
163
|
-
edgeType:
|
|
163
|
+
edgeType: EdgeType.DIRECT, // Explicitly set as direct for automatic transition (enables parallel execution)
|
|
164
164
|
},
|
|
165
165
|
{
|
|
166
166
|
from: ['analyst1', 'analyst2', 'analyst3'], // Fan-in from multiple sources
|
|
167
167
|
to: 'summarizer',
|
|
168
168
|
description: 'Aggregate analysis results',
|
|
169
|
-
edgeType:
|
|
169
|
+
edgeType: EdgeType.DIRECT, // Fan-in is also direct
|
|
170
170
|
// Add prompt when all analysts have provided input
|
|
171
171
|
// prompt: (messages, runStartIndex) => {
|
|
172
172
|
// // Check if we have analysis content from all three analysts
|
|
@@ -3,7 +3,7 @@ config();
|
|
|
3
3
|
|
|
4
4
|
import { HumanMessage, BaseMessage } from '@langchain/core/messages';
|
|
5
5
|
import { Run } from '@/run';
|
|
6
|
-
import { Providers, GraphEvents } from '@/common';
|
|
6
|
+
import { Providers, GraphEvents, EdgeType } from '@/common';
|
|
7
7
|
import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
|
|
8
8
|
import { ToolEndHandler, ModelEndHandler } from '@/events';
|
|
9
9
|
import type * as t from '@/types';
|
|
@@ -82,13 +82,13 @@ async function testSequentialMultiAgent() {
|
|
|
82
82
|
{
|
|
83
83
|
from: 'agent_a',
|
|
84
84
|
to: 'agent_b',
|
|
85
|
-
edgeType:
|
|
85
|
+
edgeType: EdgeType.DIRECT, // This creates direct edges without tools
|
|
86
86
|
description: 'Automatic transition from A to B',
|
|
87
87
|
},
|
|
88
88
|
{
|
|
89
89
|
from: 'agent_b',
|
|
90
90
|
to: 'agent_c',
|
|
91
|
-
edgeType:
|
|
91
|
+
edgeType: EdgeType.DIRECT, // This creates direct edges without tools
|
|
92
92
|
description: 'Automatic transition from B to C',
|
|
93
93
|
},
|
|
94
94
|
];
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { config } from 'dotenv';
|
|
2
|
+
config();
|
|
3
|
+
|
|
4
|
+
import { HumanMessage } from '@langchain/core/messages';
|
|
5
|
+
import type { BaseMessage } from '@langchain/core/messages';
|
|
6
|
+
import type * as t from '@/types';
|
|
7
|
+
import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
|
|
8
|
+
import { ToolEndHandler, ModelEndHandler } from '@/events';
|
|
9
|
+
import { Providers, GraphEvents, Constants } from '@/common';
|
|
10
|
+
import { Run } from '@/run';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Manual verification script for the subagent primitive.
|
|
14
|
+
*
|
|
15
|
+
* Configures a supervisor agent with two subagent types (researcher, coder),
|
|
16
|
+
* sends a query, and confirms:
|
|
17
|
+
* 1. The parent agent delegates to a subagent via the `subagent` tool
|
|
18
|
+
* 2. The child executes with isolated context (fresh message history)
|
|
19
|
+
* 3. Only the filtered text result returns to the parent
|
|
20
|
+
* 4. The parent incorporates the result and responds
|
|
21
|
+
*
|
|
22
|
+
* Usage:
|
|
23
|
+
* OPENAI_API_KEY=... npx ts-node -r tsconfig-paths/register src/scripts/multi-agent-subagent.ts
|
|
24
|
+
*
|
|
25
|
+
* Or with Anthropic:
|
|
26
|
+
* ANTHROPIC_API_KEY=... npx ts-node -r tsconfig-paths/register src/scripts/multi-agent-subagent.ts --provider anthropic
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
const useAnthropic =
|
|
30
|
+
process.argv.includes('--provider') &&
|
|
31
|
+
process.argv[process.argv.indexOf('--provider') + 1] === 'anthropic';
|
|
32
|
+
|
|
33
|
+
const provider = useAnthropic ? Providers.ANTHROPIC : Providers.OPENAI;
|
|
34
|
+
const apiKey = useAnthropic
|
|
35
|
+
? process.env.ANTHROPIC_API_KEY
|
|
36
|
+
: process.env.OPENAI_API_KEY;
|
|
37
|
+
const modelName = useAnthropic ? 'claude-sonnet-4-20250514' : 'gpt-5.4';
|
|
38
|
+
|
|
39
|
+
if (!apiKey) {
|
|
40
|
+
console.error(
|
|
41
|
+
`Missing ${useAnthropic ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY'} environment variable`
|
|
42
|
+
);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function testSubagentPrimitive() {
|
|
47
|
+
console.log('=== Subagent Primitive Manual Verification ===\n');
|
|
48
|
+
console.log(`Provider: ${provider}`);
|
|
49
|
+
console.log(`Model: ${modelName}\n`);
|
|
50
|
+
|
|
51
|
+
const { aggregateContent } = createContentAggregator();
|
|
52
|
+
|
|
53
|
+
const parentAgent: t.AgentInputs = {
|
|
54
|
+
agentId: 'supervisor',
|
|
55
|
+
provider,
|
|
56
|
+
clientOptions: { modelName, apiKey },
|
|
57
|
+
instructions: `You are a supervisor agent. You have access to specialized subagents.
|
|
58
|
+
|
|
59
|
+
When the user asks a research question, delegate it to the "researcher" subagent.
|
|
60
|
+
When the user asks for code, delegate it to the "coder" subagent.
|
|
61
|
+
|
|
62
|
+
After receiving the subagent's result, synthesize it into a clear final answer for the user.
|
|
63
|
+
Always use a subagent for research or coding tasks — do not answer directly.`,
|
|
64
|
+
maxContextTokens: 16000,
|
|
65
|
+
subagentConfigs: [
|
|
66
|
+
{
|
|
67
|
+
type: 'researcher',
|
|
68
|
+
name: 'Research Specialist',
|
|
69
|
+
description:
|
|
70
|
+
'Researches topics and provides detailed summaries with sources.',
|
|
71
|
+
agentInputs: {
|
|
72
|
+
agentId: 'researcher',
|
|
73
|
+
provider,
|
|
74
|
+
clientOptions: { modelName, apiKey },
|
|
75
|
+
instructions: `You are a research specialist working in an isolated context.
|
|
76
|
+
You receive a single task description and must answer it thoroughly.
|
|
77
|
+
Be concise but comprehensive. Include key facts and details.`,
|
|
78
|
+
maxContextTokens: 8000,
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
type: 'coder',
|
|
83
|
+
name: 'Coding Specialist',
|
|
84
|
+
description:
|
|
85
|
+
'Writes, reviews, and explains code in any programming language.',
|
|
86
|
+
agentInputs: {
|
|
87
|
+
agentId: 'coder',
|
|
88
|
+
provider,
|
|
89
|
+
clientOptions: { modelName, apiKey },
|
|
90
|
+
instructions: `You are a coding specialist working in an isolated context.
|
|
91
|
+
You receive a single task description and must provide working code.
|
|
92
|
+
Include brief explanations. Use clean, idiomatic code.`,
|
|
93
|
+
maxContextTokens: 8000,
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const customHandlers: Record<string, t.EventHandler> = {
|
|
100
|
+
[GraphEvents.CHAT_MODEL_STREAM]: new ChatModelStreamHandler(),
|
|
101
|
+
[GraphEvents.TOOL_END]: new ToolEndHandler(),
|
|
102
|
+
[GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
|
|
103
|
+
[GraphEvents.ON_RUN_STEP_COMPLETED]: {
|
|
104
|
+
handle: (event: string, data: t.StreamEventData): void => {
|
|
105
|
+
aggregateContent({
|
|
106
|
+
event: event as GraphEvents,
|
|
107
|
+
data: data as t.RunStep,
|
|
108
|
+
});
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
[GraphEvents.ON_RUN_STEP]: {
|
|
112
|
+
handle: (event: string, data: t.StreamEventData): void => {
|
|
113
|
+
aggregateContent({
|
|
114
|
+
event: event as GraphEvents,
|
|
115
|
+
data: data as t.RunStep,
|
|
116
|
+
});
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
[GraphEvents.ON_RUN_STEP_DELTA]: {
|
|
120
|
+
handle: (event: string, data: t.StreamEventData): void => {
|
|
121
|
+
aggregateContent({
|
|
122
|
+
event: event as GraphEvents,
|
|
123
|
+
data: data as t.RunStepDeltaEvent,
|
|
124
|
+
});
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
[GraphEvents.ON_MESSAGE_DELTA]: {
|
|
128
|
+
handle: (event: string, data: t.StreamEventData): void => {
|
|
129
|
+
aggregateContent({
|
|
130
|
+
event: event as GraphEvents,
|
|
131
|
+
data: data as t.MessageDeltaEvent,
|
|
132
|
+
});
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const run = await Run.create<t.IState>({
|
|
138
|
+
runId: `subagent-manual-${Date.now()}`,
|
|
139
|
+
graphConfig: {
|
|
140
|
+
type: 'standard',
|
|
141
|
+
agents: [parentAgent],
|
|
142
|
+
},
|
|
143
|
+
returnContent: true,
|
|
144
|
+
customHandlers,
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
console.log('--- Run created ---');
|
|
148
|
+
console.log(
|
|
149
|
+
`Subagent tool present: ${
|
|
150
|
+
(
|
|
151
|
+
(run.Graph as import('@/graphs/Graph').StandardGraph).agentContexts.get(
|
|
152
|
+
'supervisor'
|
|
153
|
+
)?.graphTools as t.GenericTool[] | undefined
|
|
154
|
+
)?.some((t) => 'name' in t && t.name === Constants.SUBAGENT) ?? false
|
|
155
|
+
}\n`
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
const conversationHistory: BaseMessage[] = [];
|
|
159
|
+
|
|
160
|
+
// Turn 1: Research question (should delegate to researcher subagent)
|
|
161
|
+
console.log('=== Turn 1: Research Question ===\n');
|
|
162
|
+
console.log(
|
|
163
|
+
'User: What are the three laws of thermodynamics? Explain briefly.\n'
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
const userMessage = new HumanMessage(
|
|
167
|
+
'What are the three laws of thermodynamics? Explain briefly.'
|
|
168
|
+
);
|
|
169
|
+
conversationHistory.push(userMessage);
|
|
170
|
+
|
|
171
|
+
const callerConfig = {
|
|
172
|
+
configurable: { thread_id: 'subagent-verify' },
|
|
173
|
+
streamMode: 'values' as const,
|
|
174
|
+
version: 'v2' as const,
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
console.log('--- Streaming response ---\n');
|
|
178
|
+
const result = await run.processStream(
|
|
179
|
+
{ messages: conversationHistory },
|
|
180
|
+
callerConfig
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
const runMessages = run.getRunMessages();
|
|
184
|
+
console.log('\n\n--- Run Messages ---\n');
|
|
185
|
+
|
|
186
|
+
if (runMessages) {
|
|
187
|
+
for (const msg of runMessages) {
|
|
188
|
+
const type = msg._getType();
|
|
189
|
+
if (type === 'tool') {
|
|
190
|
+
const name = 'name' in msg ? msg.name : 'unknown';
|
|
191
|
+
const rawContent =
|
|
192
|
+
typeof msg.content === 'string'
|
|
193
|
+
? msg.content
|
|
194
|
+
: JSON.stringify(msg.content);
|
|
195
|
+
const content = rawContent.slice(0, 200);
|
|
196
|
+
const truncated = rawContent.length > 200 ? '...' : '';
|
|
197
|
+
console.log(`[ToolMessage] name=${name}`);
|
|
198
|
+
console.log(` content: ${content}${truncated}\n`);
|
|
199
|
+
} else if (type === 'ai') {
|
|
200
|
+
const content =
|
|
201
|
+
typeof msg.content === 'string'
|
|
202
|
+
? msg.content.slice(0, 300)
|
|
203
|
+
: JSON.stringify(msg.content).slice(0, 300);
|
|
204
|
+
const toolCalls = 'tool_calls' in msg ? msg.tool_calls : undefined;
|
|
205
|
+
console.log(`[AIMessage]`);
|
|
206
|
+
if (toolCalls && Array.isArray(toolCalls) && toolCalls.length > 0) {
|
|
207
|
+
for (const tc of toolCalls) {
|
|
208
|
+
console.log(
|
|
209
|
+
` tool_call: ${tc.name}(${JSON.stringify(tc.args).slice(0, 100)}...)`
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
console.log(
|
|
214
|
+
` content: ${content}${content.length >= 300 ? '...' : ''}\n`
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const subagentToolMessages = runMessages.filter(
|
|
220
|
+
(msg) =>
|
|
221
|
+
msg._getType() === 'tool' &&
|
|
222
|
+
'name' in msg &&
|
|
223
|
+
msg.name === Constants.SUBAGENT
|
|
224
|
+
);
|
|
225
|
+
console.log(`\n--- Verification ---`);
|
|
226
|
+
console.log(`Subagent tool calls found: ${subagentToolMessages.length}`);
|
|
227
|
+
console.log(`Total run messages: ${runMessages.length}`);
|
|
228
|
+
console.log(`Result content parts: ${result?.length ?? 0}`);
|
|
229
|
+
|
|
230
|
+
if (subagentToolMessages.length > 0) {
|
|
231
|
+
console.log(
|
|
232
|
+
'\nSUCCESS: Subagent was invoked and returned a filtered result.'
|
|
233
|
+
);
|
|
234
|
+
console.log(
|
|
235
|
+
'The child context was isolated — only the final text came back.'
|
|
236
|
+
);
|
|
237
|
+
} else {
|
|
238
|
+
console.log('\nNOTE: No subagent tool calls detected.');
|
|
239
|
+
console.log('The LLM may have answered directly without delegating.');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
console.log('\n=== Done ===');
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
testSubagentPrimitive().catch(console.error);
|
|
@@ -255,32 +255,32 @@ async function testSupervisorMultiAgent() {
|
|
|
255
255
|
to: 'data_analyst',
|
|
256
256
|
description:
|
|
257
257
|
'Transfer to data analyst for statistical analysis and metrics',
|
|
258
|
-
edgeType:
|
|
258
|
+
edgeType: EdgeType.HANDOFF,
|
|
259
259
|
},
|
|
260
260
|
{
|
|
261
261
|
from: 'supervisor',
|
|
262
262
|
to: 'security_expert',
|
|
263
263
|
description: 'Transfer to security expert for cybersecurity assessment',
|
|
264
|
-
edgeType:
|
|
264
|
+
edgeType: EdgeType.HANDOFF,
|
|
265
265
|
},
|
|
266
266
|
{
|
|
267
267
|
from: 'supervisor',
|
|
268
268
|
to: 'product_designer',
|
|
269
269
|
description: 'Transfer to product designer for UX/UI design',
|
|
270
|
-
edgeType:
|
|
270
|
+
edgeType: EdgeType.HANDOFF,
|
|
271
271
|
},
|
|
272
272
|
{
|
|
273
273
|
from: 'supervisor',
|
|
274
274
|
to: 'devops_engineer',
|
|
275
275
|
description:
|
|
276
276
|
'Transfer to DevOps engineer for infrastructure and deployment',
|
|
277
|
-
edgeType:
|
|
277
|
+
edgeType: EdgeType.HANDOFF,
|
|
278
278
|
},
|
|
279
279
|
{
|
|
280
280
|
from: 'supervisor',
|
|
281
281
|
to: 'legal_advisor',
|
|
282
282
|
description: 'Transfer to legal advisor for compliance and licensing',
|
|
283
|
-
edgeType:
|
|
283
|
+
edgeType: EdgeType.HANDOFF,
|
|
284
284
|
},
|
|
285
285
|
];
|
|
286
286
|
|