@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
|
@@ -1,458 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for the handoff pattern (supervisor-delegate) in MultiAgentGraph.
|
|
3
|
-
*
|
|
4
|
-
* Tests cover:
|
|
5
|
-
* - Result extraction from child agent messages (extractHandoffResult)
|
|
6
|
-
* - Result truncation for parent context protection (truncateHandoffResult)
|
|
7
|
-
* - Constants and naming conventions
|
|
8
|
-
*/
|
|
9
|
-
import { AIMessage, HumanMessage, ToolMessage } from '@langchain/core/messages';
|
|
10
|
-
import type { BaseMessage } from '@langchain/core/messages';
|
|
11
|
-
import {
|
|
12
|
-
Constants,
|
|
13
|
-
EdgeType,
|
|
14
|
-
DEFAULT_HANDOFF_MAX_RESULT_CHARS,
|
|
15
|
-
HANDOFF_TIMEOUT_MS,
|
|
16
|
-
} from '@/common';
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Import the static helper methods from MultiAgentGraph.
|
|
20
|
-
* These are static so they can be tested without instantiating the full graph.
|
|
21
|
-
*/
|
|
22
|
-
import { MultiAgentGraph } from '../MultiAgentGraph';
|
|
23
|
-
|
|
24
|
-
// ---------------------------------------------------------------------------
|
|
25
|
-
// Constants
|
|
26
|
-
// ---------------------------------------------------------------------------
|
|
27
|
-
describe('handoff constants', () => {
|
|
28
|
-
it('LC_HANDOFF_TO_ prefix matches expected pattern', () => {
|
|
29
|
-
expect(Constants.LC_HANDOFF_TO_).toBe('lc_handoff_to_');
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it('LC_HANDOFF_TO_ is distinct from LC_TRANSFER_TO_', () => {
|
|
33
|
-
expect(Constants.LC_HANDOFF_TO_).not.toBe(Constants.LC_TRANSFER_TO_);
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it('DEFAULT_HANDOFF_MAX_RESULT_CHARS is 32768', () => {
|
|
37
|
-
expect(DEFAULT_HANDOFF_MAX_RESULT_CHARS).toBe(32768);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('HANDOFF_TIMEOUT_MS is 5 minutes', () => {
|
|
41
|
-
expect(HANDOFF_TIMEOUT_MS).toBe(300_000);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it('EdgeType.HANDOFF has correct value', () => {
|
|
45
|
-
expect(EdgeType.HANDOFF).toBe('handoff');
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
// ---------------------------------------------------------------------------
|
|
50
|
-
// extractHandoffResult
|
|
51
|
-
// ---------------------------------------------------------------------------
|
|
52
|
-
describe('extractHandoffResult', () => {
|
|
53
|
-
it('extracts text from last AIMessage with string content', () => {
|
|
54
|
-
const messages: BaseMessage[] = [
|
|
55
|
-
new HumanMessage('find sales data'),
|
|
56
|
-
new AIMessage('Here are the sales figures for Q1...'),
|
|
57
|
-
];
|
|
58
|
-
const result = MultiAgentGraph.extractHandoffResult(messages, 'researcher');
|
|
59
|
-
expect(result).toBe('Here are the sales figures for Q1...');
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('extracts text from last AIMessage with array content', () => {
|
|
63
|
-
const messages: BaseMessage[] = [
|
|
64
|
-
new HumanMessage('analyze this'),
|
|
65
|
-
new AIMessage({
|
|
66
|
-
content: [
|
|
67
|
-
{ type: 'text', text: 'Analysis shows growth.' },
|
|
68
|
-
{ type: 'text', text: 'Revenue up 15%.' },
|
|
69
|
-
],
|
|
70
|
-
}),
|
|
71
|
-
];
|
|
72
|
-
const result = MultiAgentGraph.extractHandoffResult(messages, 'analyst');
|
|
73
|
-
expect(result).toBe('Analysis shows growth.\nRevenue up 15%.');
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it('skips non-AI messages and finds last AIMessage', () => {
|
|
77
|
-
const messages: BaseMessage[] = [
|
|
78
|
-
new HumanMessage('task'),
|
|
79
|
-
new AIMessage('intermediate result'),
|
|
80
|
-
new HumanMessage('continue'),
|
|
81
|
-
new AIMessage('final result here'),
|
|
82
|
-
];
|
|
83
|
-
const result = MultiAgentGraph.extractHandoffResult(messages, 'agent');
|
|
84
|
-
expect(result).toBe('final result here');
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it('skips AIMessages with empty content and finds previous', () => {
|
|
88
|
-
const messages: BaseMessage[] = [
|
|
89
|
-
new HumanMessage('task'),
|
|
90
|
-
new AIMessage('good result'),
|
|
91
|
-
new AIMessage(''),
|
|
92
|
-
];
|
|
93
|
-
const result = MultiAgentGraph.extractHandoffResult(messages, 'agent');
|
|
94
|
-
expect(result).toBe('good result');
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it('skips AIMessages with tool_calls only (no text)', () => {
|
|
98
|
-
const messages: BaseMessage[] = [
|
|
99
|
-
new HumanMessage('task'),
|
|
100
|
-
new AIMessage('found the data'),
|
|
101
|
-
new AIMessage({
|
|
102
|
-
content: '',
|
|
103
|
-
tool_calls: [
|
|
104
|
-
{ name: 'search', args: {}, id: 'tc1', type: 'tool_call' },
|
|
105
|
-
],
|
|
106
|
-
}),
|
|
107
|
-
new ToolMessage({ content: 'search result', tool_call_id: 'tc1' }),
|
|
108
|
-
];
|
|
109
|
-
const result = MultiAgentGraph.extractHandoffResult(messages, 'agent');
|
|
110
|
-
expect(result).toBe('found the data');
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it('returns fallback message when no AIMessage has text', () => {
|
|
114
|
-
const messages: BaseMessage[] = [new HumanMessage('task')];
|
|
115
|
-
const result = MultiAgentGraph.extractHandoffResult(messages, 'researcher');
|
|
116
|
-
expect(result).toBe(
|
|
117
|
-
'[Agent "researcher" completed but produced no text output]'
|
|
118
|
-
);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it('returns fallback for empty messages array', () => {
|
|
122
|
-
const result = MultiAgentGraph.extractHandoffResult([], 'agent');
|
|
123
|
-
expect(result).toBe(
|
|
124
|
-
'[Agent "agent" completed but produced no text output]'
|
|
125
|
-
);
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
it('trims whitespace from extracted text', () => {
|
|
129
|
-
const messages: BaseMessage[] = [
|
|
130
|
-
new AIMessage(' result with spaces \n\n'),
|
|
131
|
-
];
|
|
132
|
-
const result = MultiAgentGraph.extractHandoffResult(messages, 'agent');
|
|
133
|
-
expect(result).toBe('result with spaces');
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
// ---------------------------------------------------------------------------
|
|
138
|
-
// truncateHandoffResult
|
|
139
|
-
// ---------------------------------------------------------------------------
|
|
140
|
-
describe('truncateHandoffResult', () => {
|
|
141
|
-
it('returns result unchanged when within budget', () => {
|
|
142
|
-
const result = 'short result';
|
|
143
|
-
expect(MultiAgentGraph.truncateHandoffResult(result, 1000)).toBe(result);
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
it('returns empty string unchanged', () => {
|
|
147
|
-
expect(MultiAgentGraph.truncateHandoffResult('', 1000)).toBe('');
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
it('truncates with head/tail split when over budget', () => {
|
|
151
|
-
const longText = 'A'.repeat(1000);
|
|
152
|
-
const truncated = MultiAgentGraph.truncateHandoffResult(longText, 500);
|
|
153
|
-
|
|
154
|
-
expect(truncated.length).toBeLessThanOrEqual(500);
|
|
155
|
-
expect(truncated).toContain('handoff output truncated');
|
|
156
|
-
// Head should be present
|
|
157
|
-
expect(truncated.startsWith('AAAA')).toBe(true);
|
|
158
|
-
// Tail should be present
|
|
159
|
-
expect(truncated.endsWith('AAAA')).toBe(true);
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
it('preserves 60/40 head/tail ratio', () => {
|
|
163
|
-
const longText = 'H'.repeat(500) + 'T'.repeat(500);
|
|
164
|
-
const maxChars = 200;
|
|
165
|
-
const truncated = MultiAgentGraph.truncateHandoffResult(longText, maxChars);
|
|
166
|
-
|
|
167
|
-
const notice =
|
|
168
|
-
'\n\n[... handoff output truncated — middle section omitted to fit parent context ...]\n\n';
|
|
169
|
-
const available = maxChars - notice.length;
|
|
170
|
-
const expectedHead = Math.floor(available * 0.6);
|
|
171
|
-
const expectedTail = available - expectedHead;
|
|
172
|
-
|
|
173
|
-
// Head portion should be all H's
|
|
174
|
-
const headPortion = truncated.substring(0, expectedHead);
|
|
175
|
-
expect(headPortion).toMatch(/^H+$/);
|
|
176
|
-
|
|
177
|
-
// Tail portion should be all T's
|
|
178
|
-
const tailPortion = truncated.substring(truncated.length - expectedTail);
|
|
179
|
-
expect(tailPortion).toMatch(/^T+$/);
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
it('handles result exactly at maxChars boundary', () => {
|
|
183
|
-
const result = 'X'.repeat(100);
|
|
184
|
-
expect(MultiAgentGraph.truncateHandoffResult(result, 100)).toBe(result);
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
it('handles very small maxChars gracefully', () => {
|
|
188
|
-
const result = 'A'.repeat(200);
|
|
189
|
-
// When maxChars is smaller than the truncation notice itself
|
|
190
|
-
const truncated = MultiAgentGraph.truncateHandoffResult(result, 10);
|
|
191
|
-
expect(truncated.length).toBeLessThanOrEqual(200);
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
// ---------------------------------------------------------------------------
|
|
196
|
-
// Tool naming convention
|
|
197
|
-
// ---------------------------------------------------------------------------
|
|
198
|
-
describe('handoff tool naming', () => {
|
|
199
|
-
it('handoff tool name follows lc_handoff_to_ pattern', () => {
|
|
200
|
-
const agentId = 'researcher_agent_123';
|
|
201
|
-
const expectedToolName = `${Constants.LC_HANDOFF_TO_}${agentId}`;
|
|
202
|
-
expect(expectedToolName).toBe('lc_handoff_to_researcher_agent_123');
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
it('handoff tool prefix is distinct from transfer tool prefix', () => {
|
|
206
|
-
const agentId = 'test';
|
|
207
|
-
const handoffName = `${Constants.LC_HANDOFF_TO_}${agentId}`;
|
|
208
|
-
const transferName = `${Constants.LC_TRANSFER_TO_}${agentId}`;
|
|
209
|
-
expect(handoffName).not.toBe(transferName);
|
|
210
|
-
expect(handoffName).toBe('lc_handoff_to_test');
|
|
211
|
-
expect(transferName).toBe('lc_transfer_to_test');
|
|
212
|
-
});
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
// ---------------------------------------------------------------------------
|
|
216
|
-
// prepareHandoffMessages
|
|
217
|
-
// ---------------------------------------------------------------------------
|
|
218
|
-
describe('prepareHandoffMessages', () => {
|
|
219
|
-
it('returns empty array for empty input', () => {
|
|
220
|
-
expect(MultiAgentGraph.prepareHandoffMessages([])).toEqual([]);
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
it('converts trailing AIMessage to HumanMessage context', () => {
|
|
224
|
-
const messages: BaseMessage[] = [
|
|
225
|
-
new HumanMessage('Hello'),
|
|
226
|
-
new AIMessage('Hi there'),
|
|
227
|
-
];
|
|
228
|
-
const result = MultiAgentGraph.prepareHandoffMessages(messages);
|
|
229
|
-
// Trailing AI converted to HumanMessage so conversation ends with user message
|
|
230
|
-
expect(result).toHaveLength(2);
|
|
231
|
-
expect(result[0].getType()).toBe('human');
|
|
232
|
-
expect(result[0].content).toBe('Hello');
|
|
233
|
-
expect(result[1].getType()).toBe('human');
|
|
234
|
-
expect(result[1].content).toContain('Hi there');
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
it('preserves AI messages that are not trailing', () => {
|
|
238
|
-
const messages: BaseMessage[] = [
|
|
239
|
-
new HumanMessage('Hello'),
|
|
240
|
-
new AIMessage('Hi there'),
|
|
241
|
-
new HumanMessage('Follow up'),
|
|
242
|
-
];
|
|
243
|
-
const result = MultiAgentGraph.prepareHandoffMessages(messages);
|
|
244
|
-
expect(result).toHaveLength(3);
|
|
245
|
-
expect(result[0].content).toBe('Hello');
|
|
246
|
-
expect(result[1].getType()).toBe('ai');
|
|
247
|
-
expect(result[1].content).toBe('Hi there');
|
|
248
|
-
expect(result[2].content).toBe('Follow up');
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
it('strips orphaned tool_use, converts trailing AI to context', () => {
|
|
252
|
-
const messages: BaseMessage[] = [
|
|
253
|
-
new HumanMessage('Do something'),
|
|
254
|
-
new AIMessage({
|
|
255
|
-
content: 'Let me call a tool',
|
|
256
|
-
tool_calls: [
|
|
257
|
-
{
|
|
258
|
-
name: 'lc_handoff_to_researcher',
|
|
259
|
-
args: { instructions: 'research this' },
|
|
260
|
-
id: 'tc1',
|
|
261
|
-
type: 'tool_call',
|
|
262
|
-
},
|
|
263
|
-
],
|
|
264
|
-
}),
|
|
265
|
-
// No ToolMessage for tc1 — it's orphaned
|
|
266
|
-
];
|
|
267
|
-
const result = MultiAgentGraph.prepareHandoffMessages(messages);
|
|
268
|
-
expect(result).toHaveLength(2);
|
|
269
|
-
expect(result[0].content).toBe('Do something');
|
|
270
|
-
// Trailing AI converted to HumanMessage context
|
|
271
|
-
expect(result[1].getType()).toBe('human');
|
|
272
|
-
expect(result[1].content).toContain('Let me call a tool');
|
|
273
|
-
});
|
|
274
|
-
|
|
275
|
-
it('compacts paired tool_use/tool_result into text summaries', () => {
|
|
276
|
-
const messages: BaseMessage[] = [
|
|
277
|
-
new HumanMessage('Search for data'),
|
|
278
|
-
new AIMessage({
|
|
279
|
-
content: 'I will search for you',
|
|
280
|
-
tool_calls: [
|
|
281
|
-
{
|
|
282
|
-
name: 'web_search',
|
|
283
|
-
args: { query: 'test' },
|
|
284
|
-
id: 'tc1',
|
|
285
|
-
type: 'tool_call',
|
|
286
|
-
},
|
|
287
|
-
],
|
|
288
|
-
}),
|
|
289
|
-
new ToolMessage({
|
|
290
|
-
content: 'Found 3 results about testing',
|
|
291
|
-
tool_call_id: 'tc1',
|
|
292
|
-
name: 'web_search',
|
|
293
|
-
}),
|
|
294
|
-
new AIMessage('Based on the search, here is what I found.'),
|
|
295
|
-
];
|
|
296
|
-
const result = MultiAgentGraph.prepareHandoffMessages(messages);
|
|
297
|
-
|
|
298
|
-
// HumanMessage + compacted AI + trailing AI converted to HumanMessage
|
|
299
|
-
expect(result).toHaveLength(3);
|
|
300
|
-
|
|
301
|
-
// ToolMessage should be removed
|
|
302
|
-
expect(result.every((m) => m.getType() !== 'tool')).toBe(true);
|
|
303
|
-
|
|
304
|
-
// Compacted AI message should contain tool summary
|
|
305
|
-
expect(result[1].content).toContain('I will search for you');
|
|
306
|
-
expect(result[1].content).toContain('web_search');
|
|
307
|
-
expect(result[1].content).toContain('Found 3 results');
|
|
308
|
-
|
|
309
|
-
// Trailing AI converted to HumanMessage
|
|
310
|
-
expect(result[2].getType()).toBe('human');
|
|
311
|
-
expect(result[2].content).toContain('Based on the search');
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
it('removes ALL ToolMessages from output', () => {
|
|
315
|
-
const messages: BaseMessage[] = [
|
|
316
|
-
new HumanMessage('task'),
|
|
317
|
-
new AIMessage({
|
|
318
|
-
content: '',
|
|
319
|
-
tool_calls: [
|
|
320
|
-
{ name: 'tool_a', args: {}, id: 'tc1', type: 'tool_call' },
|
|
321
|
-
{ name: 'tool_b', args: {}, id: 'tc2', type: 'tool_call' },
|
|
322
|
-
],
|
|
323
|
-
}),
|
|
324
|
-
new ToolMessage({
|
|
325
|
-
content: 'result a',
|
|
326
|
-
tool_call_id: 'tc1',
|
|
327
|
-
name: 'tool_a',
|
|
328
|
-
}),
|
|
329
|
-
new ToolMessage({
|
|
330
|
-
content: 'result b',
|
|
331
|
-
tool_call_id: 'tc2',
|
|
332
|
-
name: 'tool_b',
|
|
333
|
-
}),
|
|
334
|
-
new AIMessage('Final answer.'),
|
|
335
|
-
];
|
|
336
|
-
const result = MultiAgentGraph.prepareHandoffMessages(messages);
|
|
337
|
-
|
|
338
|
-
// Zero ToolMessages in output
|
|
339
|
-
const toolMsgs = result.filter((m) => m.getType() === 'tool');
|
|
340
|
-
expect(toolMsgs).toHaveLength(0);
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
it('handles multi-hop scenario: multiple tool interactions compacted', () => {
|
|
344
|
-
// Simulates: Orchestrator called researcher (handoff), got result,
|
|
345
|
-
// then called writer (handoff) — the writer should get clean messages
|
|
346
|
-
const messages: BaseMessage[] = [
|
|
347
|
-
new HumanMessage('Research and write a report'),
|
|
348
|
-
// Orchestrator's first tool call (handoff to researcher)
|
|
349
|
-
new AIMessage({
|
|
350
|
-
content: 'I will delegate to the researcher first.',
|
|
351
|
-
tool_calls: [
|
|
352
|
-
{
|
|
353
|
-
name: 'lc_handoff_to_researcher',
|
|
354
|
-
args: { instructions: 'research AI trends' },
|
|
355
|
-
id: 'h1',
|
|
356
|
-
type: 'tool_call',
|
|
357
|
-
},
|
|
358
|
-
],
|
|
359
|
-
}),
|
|
360
|
-
new ToolMessage({
|
|
361
|
-
content: 'Research findings: AI adoption is growing rapidly...',
|
|
362
|
-
tool_call_id: 'h1',
|
|
363
|
-
name: 'lc_handoff_to_researcher',
|
|
364
|
-
}),
|
|
365
|
-
// Orchestrator's response after getting research back
|
|
366
|
-
new AIMessage({
|
|
367
|
-
content: 'Now I will delegate to the writer.',
|
|
368
|
-
tool_calls: [
|
|
369
|
-
{
|
|
370
|
-
name: 'lc_handoff_to_writer',
|
|
371
|
-
args: { instructions: 'write report based on findings' },
|
|
372
|
-
id: 'h2',
|
|
373
|
-
type: 'tool_call',
|
|
374
|
-
},
|
|
375
|
-
],
|
|
376
|
-
}),
|
|
377
|
-
// h2 is orphaned — writer hasn't returned yet (this is the current handoff)
|
|
378
|
-
];
|
|
379
|
-
|
|
380
|
-
const result = MultiAgentGraph.prepareHandoffMessages(messages);
|
|
381
|
-
|
|
382
|
-
// No ToolMessages
|
|
383
|
-
expect(result.filter((m) => m.getType() === 'tool')).toHaveLength(0);
|
|
384
|
-
|
|
385
|
-
// Should have: HumanMessage + compacted AI (with tool summary) + trailing AI converted to HumanMessage
|
|
386
|
-
expect(result).toHaveLength(3);
|
|
387
|
-
|
|
388
|
-
// First AI message should have researcher tool summary (paired)
|
|
389
|
-
expect(result[1].getType()).toBe('ai');
|
|
390
|
-
expect(result[1].content).toContain('lc_handoff_to_researcher');
|
|
391
|
-
expect(result[1].content).toContain('AI adoption');
|
|
392
|
-
|
|
393
|
-
// Trailing AI converted to HumanMessage context
|
|
394
|
-
expect(result[2].getType()).toBe('human');
|
|
395
|
-
expect(result[2].content).toContain('Now I will delegate to the writer');
|
|
396
|
-
});
|
|
397
|
-
|
|
398
|
-
it('preserves message order, converts only trailing AI', () => {
|
|
399
|
-
const messages: BaseMessage[] = [
|
|
400
|
-
new HumanMessage('Step 1'),
|
|
401
|
-
new AIMessage('Response 1'),
|
|
402
|
-
new HumanMessage('Step 2'),
|
|
403
|
-
new AIMessage('Response 2'),
|
|
404
|
-
];
|
|
405
|
-
const result = MultiAgentGraph.prepareHandoffMessages(messages);
|
|
406
|
-
expect(result).toHaveLength(4);
|
|
407
|
-
expect(result[0].content).toBe('Step 1');
|
|
408
|
-
expect(result[1].content).toBe('Response 1');
|
|
409
|
-
expect(result[1].getType()).toBe('ai'); // Not trailing — preserved as AI
|
|
410
|
-
expect(result[2].content).toBe('Step 2');
|
|
411
|
-
expect(result[3].getType()).toBe('human'); // Trailing — converted
|
|
412
|
-
expect(result[3].content).toContain('Response 2');
|
|
413
|
-
});
|
|
414
|
-
|
|
415
|
-
it('drops AI messages that have only tool_calls and no text content', () => {
|
|
416
|
-
const messages: BaseMessage[] = [
|
|
417
|
-
new HumanMessage('Do it'),
|
|
418
|
-
new AIMessage({
|
|
419
|
-
content: '',
|
|
420
|
-
tool_calls: [
|
|
421
|
-
{ name: 'orphan_tool', args: {}, id: 'orp1', type: 'tool_call' },
|
|
422
|
-
],
|
|
423
|
-
}),
|
|
424
|
-
];
|
|
425
|
-
const result = MultiAgentGraph.prepareHandoffMessages(messages);
|
|
426
|
-
// AI message with empty content + orphaned tool = nothing to keep
|
|
427
|
-
expect(result).toHaveLength(1);
|
|
428
|
-
expect(result[0].content).toBe('Do it');
|
|
429
|
-
});
|
|
430
|
-
|
|
431
|
-
it('handles AI messages with array content (text blocks)', () => {
|
|
432
|
-
const messages: BaseMessage[] = [
|
|
433
|
-
new HumanMessage('task'),
|
|
434
|
-
new AIMessage({
|
|
435
|
-
content: [
|
|
436
|
-
{ type: 'text', text: 'Part one.' },
|
|
437
|
-
{ type: 'text', text: 'Part two.' },
|
|
438
|
-
],
|
|
439
|
-
tool_calls: [
|
|
440
|
-
{ name: 'some_tool', args: {}, id: 'tc1', type: 'tool_call' },
|
|
441
|
-
],
|
|
442
|
-
}),
|
|
443
|
-
new ToolMessage({
|
|
444
|
-
content: 'tool output',
|
|
445
|
-
tool_call_id: 'tc1',
|
|
446
|
-
name: 'some_tool',
|
|
447
|
-
}),
|
|
448
|
-
];
|
|
449
|
-
const result = MultiAgentGraph.prepareHandoffMessages(messages);
|
|
450
|
-
// Compacted AI is trailing → converted to HumanMessage
|
|
451
|
-
expect(result).toHaveLength(2);
|
|
452
|
-
expect(result[1].getType()).toBe('human');
|
|
453
|
-
const content = result[1].content as string;
|
|
454
|
-
expect(content).toContain('Part one.');
|
|
455
|
-
expect(content).toContain('Part two.');
|
|
456
|
-
expect(content).toContain('some_tool');
|
|
457
|
-
});
|
|
458
|
-
});
|