@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/tools/search/test.ts
DELETED
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
// processWikipedia.ts
|
|
3
|
-
import * as fs from 'fs';
|
|
4
|
-
import * as path from 'path';
|
|
5
|
-
import { processContent } from './content';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Process a Wikipedia article (HTML and Markdown) and create a referenced version
|
|
9
|
-
*/
|
|
10
|
-
async function processWikipediaArticle(): Promise<void> {
|
|
11
|
-
try {
|
|
12
|
-
console.log('Starting Wikipedia article processing...');
|
|
13
|
-
|
|
14
|
-
// Define file paths - adapt these to your specific file locations
|
|
15
|
-
const htmlPath = path.resolve('./test.html');
|
|
16
|
-
const markdownPath = path.resolve('./test.md');
|
|
17
|
-
const outputPath = path.resolve('./output.md');
|
|
18
|
-
|
|
19
|
-
// Check if input files exist
|
|
20
|
-
if (!fs.existsSync(htmlPath)) {
|
|
21
|
-
throw new Error(`Wikipedia HTML file not found at ${htmlPath}`);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
if (!fs.existsSync(markdownPath)) {
|
|
25
|
-
throw new Error(`Wikipedia Markdown file not found at ${markdownPath}`);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
console.log('Reading Wikipedia article files...');
|
|
29
|
-
const html = fs.readFileSync(htmlPath, 'utf-8');
|
|
30
|
-
const markdown = fs.readFileSync(markdownPath, 'utf-8');
|
|
31
|
-
|
|
32
|
-
// Extract article title for logging
|
|
33
|
-
const titleMatch = /<h1[^>]*>([^<]+)<\/h1>/i.exec(html);
|
|
34
|
-
const articleTitle = titleMatch
|
|
35
|
-
? titleMatch[1].trim()
|
|
36
|
-
: 'Wikipedia article';
|
|
37
|
-
|
|
38
|
-
console.log(`Processing "${articleTitle}"...`);
|
|
39
|
-
|
|
40
|
-
// Measure processing time
|
|
41
|
-
const startTime = process.hrtime();
|
|
42
|
-
|
|
43
|
-
// Process content
|
|
44
|
-
const result = processContent(html, markdown);
|
|
45
|
-
|
|
46
|
-
// Calculate processing time
|
|
47
|
-
const elapsed = process.hrtime(startTime);
|
|
48
|
-
const timeInMs = elapsed[0] * 1000 + elapsed[1] / 1000000;
|
|
49
|
-
|
|
50
|
-
// Generate reference appendix
|
|
51
|
-
const appendix = generateReferenceAppendix(result);
|
|
52
|
-
|
|
53
|
-
// Create complete output with the processed content and appendix
|
|
54
|
-
const completeOutput = result.markdown + appendix;
|
|
55
|
-
|
|
56
|
-
// Write to output file
|
|
57
|
-
fs.writeFileSync(outputPath, completeOutput);
|
|
58
|
-
|
|
59
|
-
// Print processing statistics
|
|
60
|
-
console.log('\nWikipedia article processing complete! ✓');
|
|
61
|
-
console.log('-'.repeat(60));
|
|
62
|
-
console.log(`Article: ${articleTitle}`);
|
|
63
|
-
console.log(`Processing time: ${timeInMs.toFixed(2)}ms`);
|
|
64
|
-
console.log('Media references replaced:');
|
|
65
|
-
console.log(` - Links: ${result.links.length}`);
|
|
66
|
-
console.log(` - Images: ${result.images.length}`);
|
|
67
|
-
console.log(` - Videos: ${result.videos.length}`);
|
|
68
|
-
console.log(
|
|
69
|
-
` - Total: ${result.links.length + result.images.length + result.videos.length}`
|
|
70
|
-
);
|
|
71
|
-
console.log(`Output saved to: ${outputPath}`);
|
|
72
|
-
console.log('-'.repeat(60));
|
|
73
|
-
|
|
74
|
-
// Print sample of the transformation
|
|
75
|
-
const sampleLines = result.markdown.split('\n').slice(0, 10).join('\n');
|
|
76
|
-
console.log('\nSample of transformed content:');
|
|
77
|
-
console.log('-'.repeat(30));
|
|
78
|
-
console.log(sampleLines);
|
|
79
|
-
console.log('-'.repeat(30));
|
|
80
|
-
console.log('... (continued in output file)');
|
|
81
|
-
} catch (error) {
|
|
82
|
-
console.error('Error processing Wikipedia article:', error);
|
|
83
|
-
process.exit(1);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Generate a comprehensive reference appendix with all media links
|
|
89
|
-
*/
|
|
90
|
-
function generateReferenceAppendix(result: {
|
|
91
|
-
links: Array<{ originalUrl: string; title?: string; text?: string }>;
|
|
92
|
-
images: Array<{ originalUrl: string; title?: string }>;
|
|
93
|
-
videos: Array<{ originalUrl: string; title?: string }>;
|
|
94
|
-
}): string {
|
|
95
|
-
let appendix = '\n\n' + '---'.repeat(10) + '\n\n';
|
|
96
|
-
appendix += '# References\n\n';
|
|
97
|
-
|
|
98
|
-
if (result.links.length > 0) {
|
|
99
|
-
appendix += '## Links\n\n';
|
|
100
|
-
result.links.forEach((link, index) => {
|
|
101
|
-
// Clean and format text for display
|
|
102
|
-
let displayText = '';
|
|
103
|
-
if (link.text != null && link.text.trim()) {
|
|
104
|
-
// Limit length for very long link text
|
|
105
|
-
let cleanText = link.text.trim();
|
|
106
|
-
if (cleanText.length > 50) {
|
|
107
|
-
cleanText = cleanText.substring(0, 47) + '...';
|
|
108
|
-
}
|
|
109
|
-
displayText = ` - "${cleanText}"`;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
appendix += `**link#${index + 1}**: ${link.originalUrl}${displayText}\n\n`;
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
if (result.images.length > 0) {
|
|
117
|
-
appendix += '## Images\n\n';
|
|
118
|
-
result.images.forEach((image, index) => {
|
|
119
|
-
const displayTitle =
|
|
120
|
-
image.title != null && image.title.trim()
|
|
121
|
-
? ` - ${image.title.trim()}`
|
|
122
|
-
: '';
|
|
123
|
-
appendix += `**image#${index + 1}**: ${image.originalUrl}${displayTitle}\n\n`;
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (result.videos.length > 0) {
|
|
128
|
-
appendix += '## Videos\n\n';
|
|
129
|
-
result.videos.forEach((video, index) => {
|
|
130
|
-
const displayTitle =
|
|
131
|
-
video.title != null && video.title.trim()
|
|
132
|
-
? ` - ${video.title.trim()}`
|
|
133
|
-
: '';
|
|
134
|
-
appendix += `**video#${index + 1}**: ${video.originalUrl}${displayTitle}\n\n`;
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// Add a category breakdown to show what types of links were found
|
|
139
|
-
const totalRefs =
|
|
140
|
-
result.links.length + result.images.length + result.videos.length;
|
|
141
|
-
|
|
142
|
-
appendix += '## Summary\n\n';
|
|
143
|
-
appendix += `Total references: **${totalRefs}**\n\n`;
|
|
144
|
-
appendix += `- Links: ${result.links.length}\n`;
|
|
145
|
-
appendix += `- Images: ${result.images.length}\n`;
|
|
146
|
-
appendix += `- Videos: ${result.videos.length}\n`;
|
|
147
|
-
|
|
148
|
-
return appendix;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Using async IIFE to allow for better error handling
|
|
152
|
-
(async (): Promise<void> => {
|
|
153
|
-
try {
|
|
154
|
-
await processWikipediaArticle();
|
|
155
|
-
} catch (error) {
|
|
156
|
-
console.error('Unhandled error:', error);
|
|
157
|
-
process.exit(1);
|
|
158
|
-
}
|
|
159
|
-
})();
|
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for child-agent context preparation.
|
|
3
|
-
*
|
|
4
|
-
* These strategies are the primary defense against schema confusion and
|
|
5
|
-
* Bedrock/VertexAI message-shape rejections, so their behavior must be
|
|
6
|
-
* locked down with fixtures that mirror real provider output shapes.
|
|
7
|
-
*/
|
|
8
|
-
import {
|
|
9
|
-
AIMessage,
|
|
10
|
-
HumanMessage,
|
|
11
|
-
SystemMessage,
|
|
12
|
-
ToolMessage,
|
|
13
|
-
} from '@langchain/core/messages';
|
|
14
|
-
import type { BaseMessage } from '@langchain/core/messages';
|
|
15
|
-
import {
|
|
16
|
-
HANDOFF_TAIL_CONTEXT_PREFIX,
|
|
17
|
-
buildIsolatedChildPrompt,
|
|
18
|
-
prepareHandoffMessages,
|
|
19
|
-
prepareIsolatedChildMessages,
|
|
20
|
-
} from '../childAgentContext';
|
|
21
|
-
|
|
22
|
-
describe('buildIsolatedChildPrompt', () => {
|
|
23
|
-
it('wraps upstream text in the prior-step / your-task sections', () => {
|
|
24
|
-
const out = buildIsolatedChildPrompt('RESEARCH FINDINGS');
|
|
25
|
-
expect(out).toContain('## Prior step output');
|
|
26
|
-
expect(out).toContain('RESEARCH FINDINGS');
|
|
27
|
-
expect(out).toContain('## Your task');
|
|
28
|
-
expect(out).toMatch(/You MUST now/);
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('instructs the model to call tools directly without asking for clarification', () => {
|
|
32
|
-
const out = buildIsolatedChildPrompt('x');
|
|
33
|
-
expect(out).toMatch(/call it directly/);
|
|
34
|
-
expect(out).toMatch(/do not ask for clarification/);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
describe('prepareHandoffMessages', () => {
|
|
39
|
-
it('returns an empty array unchanged', () => {
|
|
40
|
-
expect(prepareHandoffMessages([])).toEqual([]);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('preserves system and human messages verbatim', () => {
|
|
44
|
-
const msgs: BaseMessage[] = [
|
|
45
|
-
new SystemMessage('sys'),
|
|
46
|
-
new HumanMessage('hello'),
|
|
47
|
-
];
|
|
48
|
-
const out = prepareHandoffMessages(msgs);
|
|
49
|
-
expect(out).toHaveLength(2);
|
|
50
|
-
expect(out[0].getType()).toBe('system');
|
|
51
|
-
expect(out[1].getType()).toBe('human');
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('drops orphaned tool_use blocks (handoff tool has no matching result)', () => {
|
|
55
|
-
const ai = new AIMessage({
|
|
56
|
-
content: 'transferring',
|
|
57
|
-
tool_calls: [{ name: 'handoff_to_writer', args: {}, id: 'call_1' }],
|
|
58
|
-
});
|
|
59
|
-
const out = prepareHandoffMessages([new HumanMessage('go'), ai]);
|
|
60
|
-
// The assistant tail becomes a HumanMessage with the context prefix
|
|
61
|
-
// because the orphaned tool_use was stripped, leaving only text.
|
|
62
|
-
expect(out).toHaveLength(2);
|
|
63
|
-
expect(out[1].getType()).toBe('human');
|
|
64
|
-
expect(out[1].content).toContain('transferring');
|
|
65
|
-
expect(out[1].content).toContain(HANDOFF_TAIL_CONTEXT_PREFIX);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('compacts paired tool_use/tool_result into a text summary', () => {
|
|
69
|
-
const ai = new AIMessage({
|
|
70
|
-
content: '',
|
|
71
|
-
tool_calls: [{ name: 'search', args: { q: 'x' }, id: 'call_a' }],
|
|
72
|
-
});
|
|
73
|
-
const toolResult = new ToolMessage({
|
|
74
|
-
content: 'hit: 42',
|
|
75
|
-
tool_call_id: 'call_a',
|
|
76
|
-
});
|
|
77
|
-
const out = prepareHandoffMessages([
|
|
78
|
-
new HumanMessage('find x'),
|
|
79
|
-
ai,
|
|
80
|
-
toolResult,
|
|
81
|
-
new HumanMessage('what did you find?'),
|
|
82
|
-
]);
|
|
83
|
-
// The paired tool_use+result should have become a text summary on the
|
|
84
|
-
// rewritten AI message; the original ToolMessage should be gone.
|
|
85
|
-
expect(out.some((m) => m.getType() === 'tool')).toBe(false);
|
|
86
|
-
const rewrittenAI = out.find((m) => m.getType() === 'ai');
|
|
87
|
-
expect(rewrittenAI).toBeDefined();
|
|
88
|
-
expect(String(rewrittenAI?.content)).toContain('[Tool "search"');
|
|
89
|
-
expect(String(rewrittenAI?.content)).toContain('hit: 42');
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('truncates long tool_result content at 500 chars in the summary', () => {
|
|
93
|
-
const long = 'x'.repeat(1200);
|
|
94
|
-
const ai = new AIMessage({
|
|
95
|
-
content: '',
|
|
96
|
-
tool_calls: [{ name: 'dump', args: {}, id: 'call_big' }],
|
|
97
|
-
});
|
|
98
|
-
const tool = new ToolMessage({ content: long, tool_call_id: 'call_big' });
|
|
99
|
-
const out = prepareHandoffMessages([new HumanMessage('hi'), ai, tool]);
|
|
100
|
-
// After the paired compaction the tail is an AIMessage with no text, so
|
|
101
|
-
// it gets dropped (empty) — find the one that carries the summary by
|
|
102
|
-
// scanning for the "[Tool" marker in any message.
|
|
103
|
-
const blob = out.map((m) => String(m.content)).join(' ');
|
|
104
|
-
expect(blob).toContain('[Tool "dump"');
|
|
105
|
-
// The truncated slice is 500 chars of x, not the full 1200.
|
|
106
|
-
const match = blob.match(/x+/);
|
|
107
|
-
expect(match).toBeTruthy();
|
|
108
|
-
expect((match?.[0].length ?? 0) <= 500).toBe(true);
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it('ensures the tail message is a HumanMessage by rewriting a trailing AI', () => {
|
|
112
|
-
const msgs: BaseMessage[] = [
|
|
113
|
-
new HumanMessage('question'),
|
|
114
|
-
new AIMessage('plain text answer'),
|
|
115
|
-
];
|
|
116
|
-
const out = prepareHandoffMessages(msgs);
|
|
117
|
-
expect(out[out.length - 1].getType()).toBe('human');
|
|
118
|
-
expect(out[out.length - 1].content).toBe(
|
|
119
|
-
`${HANDOFF_TAIL_CONTEXT_PREFIX}plain text answer`
|
|
120
|
-
);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it('drops a trailing empty AIMessage instead of creating an empty human', () => {
|
|
124
|
-
const msgs: BaseMessage[] = [
|
|
125
|
-
new HumanMessage('q'),
|
|
126
|
-
new AIMessage(''), // empty, nothing to carry forward
|
|
127
|
-
];
|
|
128
|
-
const out = prepareHandoffMessages(msgs);
|
|
129
|
-
expect(out).toHaveLength(1);
|
|
130
|
-
expect(out[0].getType()).toBe('human');
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
describe('prepareIsolatedChildMessages', () => {
|
|
135
|
-
it('returns empty input unchanged', () => {
|
|
136
|
-
expect(prepareIsolatedChildMessages([])).toEqual([]);
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it('keeps only the first human message and a synthetic directive', () => {
|
|
140
|
-
const msgs: BaseMessage[] = [
|
|
141
|
-
new HumanMessage('original request'),
|
|
142
|
-
new AIMessage('upstream produced this result'),
|
|
143
|
-
];
|
|
144
|
-
const out = prepareIsolatedChildMessages(msgs);
|
|
145
|
-
expect(out).toHaveLength(2);
|
|
146
|
-
expect(out[0].getType()).toBe('human');
|
|
147
|
-
expect(out[0].content).toBe('original request');
|
|
148
|
-
expect(out[1].getType()).toBe('human');
|
|
149
|
-
expect(String(out[1].content)).toContain('upstream produced this result');
|
|
150
|
-
expect(String(out[1].content)).toContain('## Your task');
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
it('discards upstream tool_use/tool_result blocks entirely', () => {
|
|
154
|
-
const aiWithTool = new AIMessage({
|
|
155
|
-
content: 'working',
|
|
156
|
-
tool_calls: [{ name: 'search', args: {}, id: 'c1' }],
|
|
157
|
-
});
|
|
158
|
-
const toolResult = new ToolMessage({
|
|
159
|
-
content: 'search result',
|
|
160
|
-
tool_call_id: 'c1',
|
|
161
|
-
});
|
|
162
|
-
const aiFinal = new AIMessage('final summary text');
|
|
163
|
-
const out = prepareIsolatedChildMessages([
|
|
164
|
-
new HumanMessage('user ask'),
|
|
165
|
-
aiWithTool,
|
|
166
|
-
toolResult,
|
|
167
|
-
aiFinal,
|
|
168
|
-
]);
|
|
169
|
-
// Must not contain any ToolMessage or upstream tool_calls.
|
|
170
|
-
expect(out.some((m) => m.getType() === 'tool')).toBe(false);
|
|
171
|
-
// The synthetic directive should reference only the final text output.
|
|
172
|
-
const directive = String(out[1].content);
|
|
173
|
-
expect(directive).toContain('final summary text');
|
|
174
|
-
expect(directive).not.toContain('search result');
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
it('picks the most recent non-empty AI text output', () => {
|
|
178
|
-
const msgs: BaseMessage[] = [
|
|
179
|
-
new HumanMessage('req'),
|
|
180
|
-
new AIMessage('older text'),
|
|
181
|
-
new AIMessage(''),
|
|
182
|
-
new AIMessage('newer text'),
|
|
183
|
-
];
|
|
184
|
-
const out = prepareIsolatedChildMessages(msgs);
|
|
185
|
-
expect(String(out[1].content)).toContain('newer text');
|
|
186
|
-
expect(String(out[1].content)).not.toContain('older text');
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
it('handles AI content in Anthropic array-of-blocks shape', () => {
|
|
190
|
-
const ai = new AIMessage({
|
|
191
|
-
content: [
|
|
192
|
-
{ type: 'tool_use', name: 'x', input: {}, id: 'c1' },
|
|
193
|
-
{ type: 'text', text: 'block text result' },
|
|
194
|
-
] as unknown as string, // the SDK types are strict, cast for fixture
|
|
195
|
-
});
|
|
196
|
-
const out = prepareIsolatedChildMessages([new HumanMessage('q'), ai]);
|
|
197
|
-
expect(out).toHaveLength(2);
|
|
198
|
-
expect(String(out[1].content)).toContain('block text result');
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
it('falls back to raw messages if no human and no upstream text exist', () => {
|
|
202
|
-
const msgs: BaseMessage[] = [new SystemMessage('just system')];
|
|
203
|
-
const out = prepareIsolatedChildMessages(msgs);
|
|
204
|
-
expect(out).toBe(msgs);
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
it('returns just the user message when upstream has no text content', () => {
|
|
208
|
-
const msgs: BaseMessage[] = [
|
|
209
|
-
new HumanMessage('only user'),
|
|
210
|
-
new AIMessage(''),
|
|
211
|
-
];
|
|
212
|
-
const out = prepareIsolatedChildMessages(msgs);
|
|
213
|
-
expect(out).toHaveLength(1);
|
|
214
|
-
expect(out[0].getType()).toBe('human');
|
|
215
|
-
expect(out[0].content).toBe('only user');
|
|
216
|
-
});
|
|
217
|
-
});
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
mergeCredentials,
|
|
3
|
-
collectRequiredAuthFields,
|
|
4
|
-
filterForwardableCredentials,
|
|
5
|
-
findMissingCredentials,
|
|
6
|
-
credentialsFromEnv,
|
|
7
|
-
isForwardable,
|
|
8
|
-
CredentialOrigin,
|
|
9
|
-
} from '../credentials';
|
|
10
|
-
import { AuthSource, CapabilityKind, type Capability } from '@/providers/types';
|
|
11
|
-
|
|
12
|
-
const makeCap = (
|
|
13
|
-
name: string,
|
|
14
|
-
authFields: Array<[string, AuthSource?, boolean?]>
|
|
15
|
-
): Capability => ({
|
|
16
|
-
kind: CapabilityKind.TOOL,
|
|
17
|
-
name,
|
|
18
|
-
description: `${name} capability`,
|
|
19
|
-
authConfig: authFields.map(([authField, source, required]) => ({
|
|
20
|
-
authField,
|
|
21
|
-
source,
|
|
22
|
-
required,
|
|
23
|
-
})),
|
|
24
|
-
metadata: {},
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
describe('mergeCredentials', () => {
|
|
28
|
-
it('first layer wins on collision', () => {
|
|
29
|
-
const result = mergeCredentials(
|
|
30
|
-
{ origin: CredentialOrigin.RUNTIME, values: { KEY: 'runtime' } },
|
|
31
|
-
{
|
|
32
|
-
origin: CredentialOrigin.AGENT,
|
|
33
|
-
values: { KEY: 'agent', OTHER: 'agent' },
|
|
34
|
-
},
|
|
35
|
-
{ origin: CredentialOrigin.ENV, values: { KEY: 'env', THIRD: 'env' } }
|
|
36
|
-
);
|
|
37
|
-
expect(result.KEY).toBe('runtime');
|
|
38
|
-
expect(result.OTHER).toBe('agent');
|
|
39
|
-
expect(result.THIRD).toBe('env');
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it('skips empty/undefined/null values', () => {
|
|
43
|
-
const result = mergeCredentials(
|
|
44
|
-
{ origin: CredentialOrigin.RUNTIME, values: { KEY: '' } },
|
|
45
|
-
{ origin: CredentialOrigin.ENV, values: { KEY: 'fallback' } }
|
|
46
|
-
);
|
|
47
|
-
expect(result.KEY).toBe('fallback');
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('returns empty map when all layers empty', () => {
|
|
51
|
-
const result = mergeCredentials();
|
|
52
|
-
expect(result).toEqual({});
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
describe('collectRequiredAuthFields', () => {
|
|
57
|
-
it('unions auth fields across capabilities', () => {
|
|
58
|
-
const caps = [
|
|
59
|
-
makeCap('a', [['KEY_1'], ['KEY_2']]),
|
|
60
|
-
makeCap('b', [['KEY_2'], ['KEY_3']]),
|
|
61
|
-
];
|
|
62
|
-
const fields = collectRequiredAuthFields(caps);
|
|
63
|
-
expect(fields.sort()).toEqual(['KEY_1', 'KEY_2', 'KEY_3']);
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
describe('filterForwardableCredentials', () => {
|
|
68
|
-
it('strips credentials whose source is SERVER', () => {
|
|
69
|
-
const caps = [
|
|
70
|
-
makeCap('x', [
|
|
71
|
-
['SERVER_KEY', AuthSource.SERVER],
|
|
72
|
-
['USER_KEY', AuthSource.USER],
|
|
73
|
-
]),
|
|
74
|
-
];
|
|
75
|
-
const filtered = filterForwardableCredentials(
|
|
76
|
-
{ SERVER_KEY: 'secret', USER_KEY: 'u1', UNRELATED: 'ok' },
|
|
77
|
-
caps
|
|
78
|
-
);
|
|
79
|
-
expect(filtered).toEqual({ USER_KEY: 'u1', UNRELATED: 'ok' });
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
describe('findMissingCredentials', () => {
|
|
84
|
-
it('flags missing required fields that are not server-resolved', () => {
|
|
85
|
-
const cap = makeCap('tool', [
|
|
86
|
-
['REQUIRED_USER', AuthSource.USER, true],
|
|
87
|
-
['OPTIONAL_USER', AuthSource.USER, false],
|
|
88
|
-
['SERVER_MANAGED', AuthSource.SERVER, true],
|
|
89
|
-
]);
|
|
90
|
-
const missing = findMissingCredentials(cap, {});
|
|
91
|
-
expect(missing).toEqual(['REQUIRED_USER']);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it('returns empty when all required are present', () => {
|
|
95
|
-
const cap = makeCap('tool', [['KEY', AuthSource.USER, true]]);
|
|
96
|
-
expect(findMissingCredentials(cap, { KEY: 'val' })).toEqual([]);
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
describe('credentialsFromEnv', () => {
|
|
101
|
-
it('reads only fields present in env', () => {
|
|
102
|
-
const layer = credentialsFromEnv(['A', 'B', 'C'], {
|
|
103
|
-
A: '1',
|
|
104
|
-
C: '3',
|
|
105
|
-
} as NodeJS.ProcessEnv);
|
|
106
|
-
expect(layer.values).toEqual({ A: '1', C: '3' });
|
|
107
|
-
expect(layer.origin).toBe(CredentialOrigin.ENV);
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
describe('isForwardable', () => {
|
|
112
|
-
it('SERVER is not forwardable', () => {
|
|
113
|
-
expect(isForwardable({ authField: 'K', source: AuthSource.SERVER })).toBe(
|
|
114
|
-
false
|
|
115
|
-
);
|
|
116
|
-
});
|
|
117
|
-
it('USER is forwardable', () => {
|
|
118
|
-
expect(isForwardable({ authField: 'K', source: AuthSource.USER })).toBe(
|
|
119
|
-
true
|
|
120
|
-
);
|
|
121
|
-
});
|
|
122
|
-
it('FORWARDED is forwardable', () => {
|
|
123
|
-
expect(
|
|
124
|
-
isForwardable({ authField: 'K', source: AuthSource.FORWARDED })
|
|
125
|
-
).toBe(true);
|
|
126
|
-
});
|
|
127
|
-
it('defaults to forwardable when source is undefined', () => {
|
|
128
|
-
expect(isForwardable({ authField: 'K' })).toBe(true);
|
|
129
|
-
});
|
|
130
|
-
});
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { createHttpClient, HttpError, assertOk } from '../httpClient';
|
|
2
|
-
|
|
3
|
-
describe('createHttpClient', () => {
|
|
4
|
-
it('creates an axios instance with baseURL', () => {
|
|
5
|
-
const client = createHttpClient({
|
|
6
|
-
baseURL: 'http://localhost:3500',
|
|
7
|
-
apiKey: 'k',
|
|
8
|
-
});
|
|
9
|
-
expect(client.defaults.baseURL).toBe('http://localhost:3500');
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
it('sets x-api-key header when apiKey provided', () => {
|
|
13
|
-
const client = createHttpClient({ baseURL: 'http://x', apiKey: 'my-key' });
|
|
14
|
-
expect(client.defaults.headers['x-api-key']).toBe('my-key');
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it('omits x-api-key when apiKey not provided', () => {
|
|
18
|
-
const client = createHttpClient({ baseURL: 'http://x' });
|
|
19
|
-
expect(client.defaults.headers['x-api-key']).toBeUndefined();
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it('merges custom headers', () => {
|
|
23
|
-
const client = createHttpClient({
|
|
24
|
-
baseURL: 'http://x',
|
|
25
|
-
apiKey: 'k',
|
|
26
|
-
headers: { 'x-custom': 'v' },
|
|
27
|
-
});
|
|
28
|
-
expect(client.defaults.headers['x-custom']).toBe('v');
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('applies timeout', () => {
|
|
32
|
-
const client = createHttpClient({ baseURL: 'http://x', timeoutMs: 5000 });
|
|
33
|
-
expect(client.defaults.timeout).toBe(5000);
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it('default timeout is 30_000ms', () => {
|
|
37
|
-
const client = createHttpClient({ baseURL: 'http://x' });
|
|
38
|
-
expect(client.defaults.timeout).toBe(30_000);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it('proxy=null disables proxy even if env is set', () => {
|
|
42
|
-
const prev = process.env.PROXY;
|
|
43
|
-
process.env.PROXY = 'http://should-be-ignored';
|
|
44
|
-
try {
|
|
45
|
-
const client = createHttpClient({ baseURL: 'http://x', proxy: null });
|
|
46
|
-
expect(client.defaults.httpsAgent).toBeUndefined();
|
|
47
|
-
} finally {
|
|
48
|
-
process.env.PROXY = prev;
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
describe('HttpError', () => {
|
|
54
|
-
it('captures status, url, and body', () => {
|
|
55
|
-
const err = new HttpError(404, '/foo', { message: 'not found' });
|
|
56
|
-
expect(err.status).toBe(404);
|
|
57
|
-
expect(err.url).toBe('/foo');
|
|
58
|
-
expect(err.body).toEqual({ message: 'not found' });
|
|
59
|
-
expect(err.name).toBe('HttpError');
|
|
60
|
-
expect(err.message).toContain('404');
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
describe('assertOk', () => {
|
|
65
|
-
it('passes for 2xx', () => {
|
|
66
|
-
expect(() => assertOk(200, '/x', {})).not.toThrow();
|
|
67
|
-
expect(() => assertOk(204, '/x', {})).not.toThrow();
|
|
68
|
-
expect(() => assertOk(299, '/x', {})).not.toThrow();
|
|
69
|
-
});
|
|
70
|
-
it('throws for non-2xx', () => {
|
|
71
|
-
expect(() => assertOk(400, '/x', {})).toThrow(HttpError);
|
|
72
|
-
expect(() => assertOk(500, '/x', {})).toThrow(HttpError);
|
|
73
|
-
expect(() => assertOk(199, '/x', {})).toThrow(HttpError);
|
|
74
|
-
});
|
|
75
|
-
});
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import { ManifestCache, filterToCacheKey, applyFilter } from '../toolManifest';
|
|
2
|
-
import { CapabilityKind, type Capability } from '@/providers/types';
|
|
3
|
-
|
|
4
|
-
const makeCap = (
|
|
5
|
-
name: string,
|
|
6
|
-
tags: string[] = [],
|
|
7
|
-
kind: CapabilityKind = CapabilityKind.TOOL
|
|
8
|
-
): Capability => ({
|
|
9
|
-
kind,
|
|
10
|
-
name,
|
|
11
|
-
description: `${name} cap`,
|
|
12
|
-
authConfig: [],
|
|
13
|
-
metadata: { tags },
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
describe('ManifestCache', () => {
|
|
17
|
-
it('stores and retrieves by key', () => {
|
|
18
|
-
const cache = new ManifestCache({ ttlMs: 10_000 });
|
|
19
|
-
const caps = [makeCap('a')];
|
|
20
|
-
cache.set('k', caps);
|
|
21
|
-
expect(cache.get('k')).toBe(caps);
|
|
22
|
-
expect(cache.size).toBe(1);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('returns undefined on miss', () => {
|
|
26
|
-
const cache = new ManifestCache();
|
|
27
|
-
expect(cache.get('nope')).toBeUndefined();
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('expires after ttlMs', async () => {
|
|
31
|
-
const cache = new ManifestCache({ ttlMs: 1 });
|
|
32
|
-
cache.set('k', [makeCap('a')]);
|
|
33
|
-
await new Promise((r) => setTimeout(r, 5));
|
|
34
|
-
expect(cache.get('k')).toBeUndefined();
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('ttlMs=0 disables caching', () => {
|
|
38
|
-
const cache = new ManifestCache({ ttlMs: 0 });
|
|
39
|
-
cache.set('k', [makeCap('a')]);
|
|
40
|
-
expect(cache.get('k')).toBeUndefined();
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('clear removes all entries', () => {
|
|
44
|
-
const cache = new ManifestCache({ ttlMs: 10_000 });
|
|
45
|
-
cache.set('a', []);
|
|
46
|
-
cache.set('b', []);
|
|
47
|
-
cache.clear();
|
|
48
|
-
expect(cache.size).toBe(0);
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
describe('filterToCacheKey', () => {
|
|
53
|
-
it('returns __all__ for undefined filter', () => {
|
|
54
|
-
expect(filterToCacheKey()).toBe('__all__');
|
|
55
|
-
expect(filterToCacheKey({})).toBe('__all__');
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it('is deterministic regardless of tag order', () => {
|
|
59
|
-
const k1 = filterToCacheKey({ tags: ['b', 'a'] });
|
|
60
|
-
const k2 = filterToCacheKey({ tags: ['a', 'b'] });
|
|
61
|
-
expect(k1).toBe(k2);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it('is deterministic regardless of names order', () => {
|
|
65
|
-
const k1 = filterToCacheKey({ names: ['z', 'a'] });
|
|
66
|
-
const k2 = filterToCacheKey({ names: ['a', 'z'] });
|
|
67
|
-
expect(k1).toBe(k2);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it('combines kind + tags + names', () => {
|
|
71
|
-
const k = filterToCacheKey({
|
|
72
|
-
kind: CapabilityKind.TOOL,
|
|
73
|
-
tags: ['x'],
|
|
74
|
-
names: ['y'],
|
|
75
|
-
});
|
|
76
|
-
expect(k).toContain('kind=tool');
|
|
77
|
-
expect(k).toContain('tags=x');
|
|
78
|
-
expect(k).toContain('names=y');
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
describe('applyFilter', () => {
|
|
83
|
-
const caps = [
|
|
84
|
-
makeCap('alpha', ['search', 'web'], CapabilityKind.TOOL),
|
|
85
|
-
makeCap('beta', ['image'], CapabilityKind.TOOL),
|
|
86
|
-
makeCap('gamma', ['search'], CapabilityKind.SKILL),
|
|
87
|
-
];
|
|
88
|
-
|
|
89
|
-
it('no filter returns all', () => {
|
|
90
|
-
expect(applyFilter(caps)).toHaveLength(3);
|
|
91
|
-
expect(applyFilter(caps, {})).toHaveLength(3);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it('kind filter', () => {
|
|
95
|
-
const out = applyFilter(caps, { kind: CapabilityKind.TOOL });
|
|
96
|
-
expect(out.map((c) => c.name)).toEqual(['alpha', 'beta']);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it('tags filter — any match', () => {
|
|
100
|
-
const out = applyFilter(caps, { tags: ['search'] });
|
|
101
|
-
expect(out.map((c) => c.name).sort()).toEqual(['alpha', 'gamma']);
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it('names filter — inclusion', () => {
|
|
105
|
-
const out = applyFilter(caps, { names: ['alpha', 'gamma'] });
|
|
106
|
-
expect(out.map((c) => c.name).sort()).toEqual(['alpha', 'gamma']);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
it('combined filter — AND semantics', () => {
|
|
110
|
-
const out = applyFilter(caps, {
|
|
111
|
-
kind: CapabilityKind.TOOL,
|
|
112
|
-
tags: ['search'],
|
|
113
|
-
});
|
|
114
|
-
expect(out.map((c) => c.name)).toEqual(['alpha']);
|
|
115
|
-
});
|
|
116
|
-
});
|