@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
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { ToolMessage } from '@langchain/core/messages';
|
|
2
|
+
import { resolveContextPruningSettings } from './contextPruningSettings.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Position-based context pruning for tool results.
|
|
6
|
+
*
|
|
7
|
+
* Uses position-based age: the distance of a message
|
|
8
|
+
* from the conversation end as a fraction of total messages.
|
|
9
|
+
*
|
|
10
|
+
* Two degradation levels:
|
|
11
|
+
* - Soft-trim: Keep head + tail of tool result content, drop middle.
|
|
12
|
+
* - Hard-clear: Replace entire content with a placeholder.
|
|
13
|
+
*
|
|
14
|
+
* Messages in the "protected zone" (recent assistant turns, system/pre-first-human
|
|
15
|
+
* messages, and messages with image content) are never pruned.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Checks if a message contains image content blocks.
|
|
19
|
+
* Messages with images are skipped by position-based content degradation
|
|
20
|
+
* because images cannot be meaningfully soft-trimmed or replaced with placeholders.
|
|
21
|
+
*/
|
|
22
|
+
function hasImageContent(message) {
|
|
23
|
+
if (!Array.isArray(message.content)) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
return message.content.some((block) => typeof block === 'object' &&
|
|
27
|
+
'type' in block &&
|
|
28
|
+
(block.type === 'image_url' || block.type === 'image'));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Applies head+tail soft-trim to tool result content.
|
|
32
|
+
*/
|
|
33
|
+
function softTrimContent(content, settings) {
|
|
34
|
+
const { headChars, tailChars } = settings;
|
|
35
|
+
const indicator = `\n\n… [soft-trimmed: ${content.length} chars → ${headChars + tailChars} chars, middle removed] …\n\n`;
|
|
36
|
+
return content.slice(0, headChars) + indicator + content.slice(-tailChars);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Applies position-based context pruning to tool result messages.
|
|
40
|
+
*
|
|
41
|
+
* Modifies messages in-place and updates indexTokenCountMap with recounted
|
|
42
|
+
* token values for modified messages.
|
|
43
|
+
*
|
|
44
|
+
* @param params.messages - The full message array (modified in-place).
|
|
45
|
+
* @param params.indexTokenCountMap - Token count map (updated in-place).
|
|
46
|
+
* @param params.tokenCounter - Function to recount tokens after modification.
|
|
47
|
+
* @param params.config - Partial context pruning config (merged with defaults).
|
|
48
|
+
* @returns Counts of soft-trimmed and hard-cleared messages.
|
|
49
|
+
*/
|
|
50
|
+
function applyContextPruning(params) {
|
|
51
|
+
const { messages, indexTokenCountMap, tokenCounter, config, resolvedSettings, } = params;
|
|
52
|
+
const settings = resolvedSettings ?? resolveContextPruningSettings(config);
|
|
53
|
+
if (!settings.enabled || messages.length === 0) {
|
|
54
|
+
return { softTrimmed: 0, hardCleared: 0 };
|
|
55
|
+
}
|
|
56
|
+
const totalMessages = messages.length;
|
|
57
|
+
let softTrimmed = 0;
|
|
58
|
+
let hardCleared = 0;
|
|
59
|
+
// Find the protected zone: last N assistant turns from the end.
|
|
60
|
+
// An "assistant turn" is a contiguous sequence of AI + Tool messages.
|
|
61
|
+
const protectedIndices = new Set();
|
|
62
|
+
// Always protect the system message (index 0 if present)
|
|
63
|
+
if (messages[0]?.getType() === 'system') {
|
|
64
|
+
protectedIndices.add(0);
|
|
65
|
+
}
|
|
66
|
+
// Protect messages before the first human message
|
|
67
|
+
for (let i = 0; i < totalMessages; i++) {
|
|
68
|
+
if (messages[i].getType() === 'human') {
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
protectedIndices.add(i);
|
|
72
|
+
}
|
|
73
|
+
// Protect the last N assistant turns (walking backwards)
|
|
74
|
+
let assistantTurnsFound = 0;
|
|
75
|
+
let inAssistantSequence = false;
|
|
76
|
+
for (let i = totalMessages - 1; i >= 0; i--) {
|
|
77
|
+
const type = messages[i].getType();
|
|
78
|
+
if (type === 'ai' || type === 'tool') {
|
|
79
|
+
protectedIndices.add(i);
|
|
80
|
+
if (!inAssistantSequence) {
|
|
81
|
+
inAssistantSequence = true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
if (inAssistantSequence) {
|
|
86
|
+
assistantTurnsFound++;
|
|
87
|
+
inAssistantSequence = false;
|
|
88
|
+
if (assistantTurnsFound >= settings.keepLastAssistants) {
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Protect the human message between assistant turns in the protected zone
|
|
93
|
+
if (assistantTurnsFound < settings.keepLastAssistants) {
|
|
94
|
+
protectedIndices.add(i);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Process each tool message outside the protected zone
|
|
99
|
+
for (let i = 0; i < totalMessages; i++) {
|
|
100
|
+
const message = messages[i];
|
|
101
|
+
if (message.getType() !== 'tool') {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (protectedIndices.has(i)) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (hasImageContent(message)) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const content = message.content;
|
|
111
|
+
if (typeof content !== 'string') {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (content.length < settings.minPrunableToolChars) {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
// Compute age ratio: how far back from the end (0 = latest, 1 = oldest)
|
|
118
|
+
const ageRatio = (totalMessages - i) / totalMessages;
|
|
119
|
+
if (ageRatio >= settings.hardClearRatio && settings.hardClear.enabled) {
|
|
120
|
+
// Hard-clear: replace with placeholder
|
|
121
|
+
const cloned = new ToolMessage({
|
|
122
|
+
content: settings.hardClear.placeholder,
|
|
123
|
+
tool_call_id: message.tool_call_id,
|
|
124
|
+
name: message.name,
|
|
125
|
+
id: message.id,
|
|
126
|
+
additional_kwargs: message.additional_kwargs,
|
|
127
|
+
response_metadata: message.response_metadata,
|
|
128
|
+
});
|
|
129
|
+
messages[i] = cloned;
|
|
130
|
+
indexTokenCountMap[i] = tokenCounter(cloned);
|
|
131
|
+
hardCleared++;
|
|
132
|
+
}
|
|
133
|
+
else if (ageRatio >= settings.softTrimRatio) {
|
|
134
|
+
// Soft-trim: keep head + tail
|
|
135
|
+
if (content.length > settings.softTrim.maxChars) {
|
|
136
|
+
const cloned = new ToolMessage({
|
|
137
|
+
content: softTrimContent(content, settings.softTrim),
|
|
138
|
+
tool_call_id: message.tool_call_id,
|
|
139
|
+
name: message.name,
|
|
140
|
+
id: message.id,
|
|
141
|
+
additional_kwargs: message.additional_kwargs,
|
|
142
|
+
response_metadata: message.response_metadata,
|
|
143
|
+
});
|
|
144
|
+
messages[i] = cloned;
|
|
145
|
+
indexTokenCountMap[i] = tokenCounter(cloned);
|
|
146
|
+
softTrimmed++;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return { softTrimmed, hardCleared };
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export { applyContextPruning };
|
|
154
|
+
//# sourceMappingURL=contextPruning.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextPruning.mjs","sources":["../../../src/messages/contextPruning.ts"],"sourcesContent":["/**\n * Position-based context pruning for tool results.\n *\n * Uses position-based age: the distance of a message\n * from the conversation end as a fraction of total messages.\n *\n * Two degradation levels:\n * - Soft-trim: Keep head + tail of tool result content, drop middle.\n * - Hard-clear: Replace entire content with a placeholder.\n *\n * Messages in the \"protected zone\" (recent assistant turns, system/pre-first-human\n * messages, and messages with image content) are never pruned.\n */\n\nimport { ToolMessage, type BaseMessage } from '@langchain/core/messages';\nimport type { ContextPruningConfig } from '@/types/graph';\nimport type { TokenCounter } from '@/types/run';\nimport type { ContextPruningSettings } from './contextPruningSettings';\nimport { resolveContextPruningSettings } from './contextPruningSettings';\n\n/**\n * Checks if a message contains image content blocks.\n * Messages with images are skipped by position-based content degradation\n * because images cannot be meaningfully soft-trimmed or replaced with placeholders.\n */\nfunction hasImageContent(message: BaseMessage): boolean {\n if (!Array.isArray(message.content)) {\n return false;\n }\n return message.content.some(\n (block) =>\n typeof block === 'object' &&\n 'type' in block &&\n (block.type === 'image_url' || block.type === 'image')\n );\n}\n\n/**\n * Applies head+tail soft-trim to tool result content.\n */\nfunction softTrimContent(\n content: string,\n settings: ContextPruningSettings['softTrim']\n): string {\n const { headChars, tailChars } = settings;\n const indicator = `\\n\\n… [soft-trimmed: ${content.length} chars → ${headChars + tailChars} chars, middle removed] …\\n\\n`;\n return content.slice(0, headChars) + indicator + content.slice(-tailChars);\n}\n\nexport interface ContextPruningResult {\n /** Number of messages that were soft-trimmed. */\n softTrimmed: number;\n /** Number of messages that were hard-cleared. */\n hardCleared: number;\n}\n\n/**\n * Applies position-based context pruning to tool result messages.\n *\n * Modifies messages in-place and updates indexTokenCountMap with recounted\n * token values for modified messages.\n *\n * @param params.messages - The full message array (modified in-place).\n * @param params.indexTokenCountMap - Token count map (updated in-place).\n * @param params.tokenCounter - Function to recount tokens after modification.\n * @param params.config - Partial context pruning config (merged with defaults).\n * @returns Counts of soft-trimmed and hard-cleared messages.\n */\nexport function applyContextPruning(params: {\n messages: BaseMessage[];\n indexTokenCountMap: Record<string, number | undefined>;\n tokenCounter: TokenCounter;\n config?: ContextPruningConfig;\n resolvedSettings?: ContextPruningSettings;\n}): ContextPruningResult {\n const {\n messages,\n indexTokenCountMap,\n tokenCounter,\n config,\n resolvedSettings,\n } = params;\n const settings = resolvedSettings ?? resolveContextPruningSettings(config);\n\n if (!settings.enabled || messages.length === 0) {\n return { softTrimmed: 0, hardCleared: 0 };\n }\n\n const totalMessages = messages.length;\n let softTrimmed = 0;\n let hardCleared = 0;\n\n // Find the protected zone: last N assistant turns from the end.\n // An \"assistant turn\" is a contiguous sequence of AI + Tool messages.\n const protectedIndices = new Set<number>();\n\n // Always protect the system message (index 0 if present)\n if (messages[0]?.getType() === 'system') {\n protectedIndices.add(0);\n }\n\n // Protect messages before the first human message\n for (let i = 0; i < totalMessages; i++) {\n if (messages[i].getType() === 'human') {\n break;\n }\n protectedIndices.add(i);\n }\n\n // Protect the last N assistant turns (walking backwards)\n let assistantTurnsFound = 0;\n let inAssistantSequence = false;\n for (let i = totalMessages - 1; i >= 0; i--) {\n const type = messages[i].getType();\n if (type === 'ai' || type === 'tool') {\n protectedIndices.add(i);\n if (!inAssistantSequence) {\n inAssistantSequence = true;\n }\n } else {\n if (inAssistantSequence) {\n assistantTurnsFound++;\n inAssistantSequence = false;\n if (assistantTurnsFound >= settings.keepLastAssistants) {\n break;\n }\n }\n // Protect the human message between assistant turns in the protected zone\n if (assistantTurnsFound < settings.keepLastAssistants) {\n protectedIndices.add(i);\n }\n }\n }\n\n // Process each tool message outside the protected zone\n for (let i = 0; i < totalMessages; i++) {\n const message = messages[i];\n if (message.getType() !== 'tool') {\n continue;\n }\n if (protectedIndices.has(i)) {\n continue;\n }\n if (hasImageContent(message)) {\n continue;\n }\n\n const content = message.content;\n if (typeof content !== 'string') {\n continue;\n }\n if (content.length < settings.minPrunableToolChars) {\n continue;\n }\n\n // Compute age ratio: how far back from the end (0 = latest, 1 = oldest)\n const ageRatio = (totalMessages - i) / totalMessages;\n\n if (ageRatio >= settings.hardClearRatio && settings.hardClear.enabled) {\n // Hard-clear: replace with placeholder\n const cloned = new ToolMessage({\n content: settings.hardClear.placeholder,\n tool_call_id: (message as ToolMessage).tool_call_id,\n name: message.name,\n id: message.id,\n additional_kwargs: message.additional_kwargs,\n response_metadata: message.response_metadata,\n });\n messages[i] = cloned;\n indexTokenCountMap[i] = tokenCounter(cloned);\n hardCleared++;\n } else if (ageRatio >= settings.softTrimRatio) {\n // Soft-trim: keep head + tail\n if (content.length > settings.softTrim.maxChars) {\n const cloned = new ToolMessage({\n content: softTrimContent(content, settings.softTrim),\n tool_call_id: (message as ToolMessage).tool_call_id,\n name: message.name,\n id: message.id,\n additional_kwargs: message.additional_kwargs,\n response_metadata: message.response_metadata,\n });\n messages[i] = cloned;\n indexTokenCountMap[i] = tokenCounter(cloned);\n softTrimmed++;\n }\n }\n }\n\n return { softTrimmed, hardCleared };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default settings for position-based context pruning.
|
|
3
|
+
*
|
|
4
|
+
* These are merged with user-provided overrides so any subset can be customized.
|
|
5
|
+
*/
|
|
6
|
+
const DEFAULT_CONTEXT_PRUNING_SETTINGS = {
|
|
7
|
+
enabled: false,
|
|
8
|
+
keepLastAssistants: 3,
|
|
9
|
+
softTrimRatio: 0.3,
|
|
10
|
+
hardClearRatio: 0.5,
|
|
11
|
+
minPrunableToolChars: 50_000,
|
|
12
|
+
softTrim: {
|
|
13
|
+
maxChars: 4_000,
|
|
14
|
+
headChars: 1_500,
|
|
15
|
+
tailChars: 1_500,
|
|
16
|
+
},
|
|
17
|
+
hardClear: {
|
|
18
|
+
enabled: true,
|
|
19
|
+
placeholder: '[Old tool result content cleared]',
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Merges user-provided partial overrides with the defaults.
|
|
24
|
+
*/
|
|
25
|
+
function resolveContextPruningSettings(overrides) {
|
|
26
|
+
if (!overrides) {
|
|
27
|
+
return { ...DEFAULT_CONTEXT_PRUNING_SETTINGS };
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
enabled: overrides.enabled ?? DEFAULT_CONTEXT_PRUNING_SETTINGS.enabled,
|
|
31
|
+
keepLastAssistants: overrides.keepLastAssistants ??
|
|
32
|
+
DEFAULT_CONTEXT_PRUNING_SETTINGS.keepLastAssistants,
|
|
33
|
+
softTrimRatio: overrides.softTrimRatio ?? DEFAULT_CONTEXT_PRUNING_SETTINGS.softTrimRatio,
|
|
34
|
+
hardClearRatio: overrides.hardClearRatio ??
|
|
35
|
+
DEFAULT_CONTEXT_PRUNING_SETTINGS.hardClearRatio,
|
|
36
|
+
minPrunableToolChars: overrides.minPrunableToolChars ??
|
|
37
|
+
DEFAULT_CONTEXT_PRUNING_SETTINGS.minPrunableToolChars,
|
|
38
|
+
softTrim: {
|
|
39
|
+
...DEFAULT_CONTEXT_PRUNING_SETTINGS.softTrim,
|
|
40
|
+
...overrides.softTrim,
|
|
41
|
+
},
|
|
42
|
+
hardClear: {
|
|
43
|
+
...DEFAULT_CONTEXT_PRUNING_SETTINGS.hardClear,
|
|
44
|
+
...overrides.hardClear,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export { DEFAULT_CONTEXT_PRUNING_SETTINGS, resolveContextPruningSettings };
|
|
50
|
+
//# sourceMappingURL=contextPruningSettings.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextPruningSettings.mjs","sources":["../../../src/messages/contextPruningSettings.ts"],"sourcesContent":["/**\n * Default settings for position-based context pruning.\n *\n * These are merged with user-provided overrides so any subset can be customized.\n */\n\nexport interface ContextPruningSettings {\n /** Whether position-based pruning is enabled. Default: false (opt-in). */\n enabled: boolean;\n /** Number of recent assistant turns to protect from pruning. Default: 3 */\n keepLastAssistants: number;\n /** Age ratio (0-1) at which soft-trim fires. Default: 0.3 */\n softTrimRatio: number;\n /** Age ratio (0-1) at which hard-clear fires. Default: 0.5 */\n hardClearRatio: number;\n /** Minimum tool result size (chars) before pruning applies. Default: 50000 */\n minPrunableToolChars: number;\n softTrim: {\n /** Maximum total chars after soft-trim. Default: 4000 */\n maxChars: number;\n /** Head portion to keep. Default: 1500 */\n headChars: number;\n /** Tail portion to keep. Default: 1500 */\n tailChars: number;\n };\n hardClear: {\n /** Whether hard-clear is enabled. Default: true */\n enabled: boolean;\n /** Placeholder text for hard-cleared content. */\n placeholder: string;\n };\n}\n\nexport const DEFAULT_CONTEXT_PRUNING_SETTINGS: ContextPruningSettings = {\n enabled: false,\n keepLastAssistants: 3,\n softTrimRatio: 0.3,\n hardClearRatio: 0.5,\n minPrunableToolChars: 50_000,\n softTrim: {\n maxChars: 4_000,\n headChars: 1_500,\n tailChars: 1_500,\n },\n hardClear: {\n enabled: true,\n placeholder: '[Old tool result content cleared]',\n },\n};\n\n/**\n * Merges user-provided partial overrides with the defaults.\n */\nexport function resolveContextPruningSettings(\n overrides?: Partial<{\n enabled?: boolean;\n keepLastAssistants?: number;\n softTrimRatio?: number;\n hardClearRatio?: number;\n minPrunableToolChars?: number;\n softTrim?: Partial<ContextPruningSettings['softTrim']>;\n hardClear?: Partial<ContextPruningSettings['hardClear']>;\n }>\n): ContextPruningSettings {\n if (!overrides) {\n return { ...DEFAULT_CONTEXT_PRUNING_SETTINGS };\n }\n return {\n enabled: overrides.enabled ?? DEFAULT_CONTEXT_PRUNING_SETTINGS.enabled,\n keepLastAssistants:\n overrides.keepLastAssistants ??\n DEFAULT_CONTEXT_PRUNING_SETTINGS.keepLastAssistants,\n softTrimRatio:\n overrides.softTrimRatio ?? DEFAULT_CONTEXT_PRUNING_SETTINGS.softTrimRatio,\n hardClearRatio:\n overrides.hardClearRatio ??\n DEFAULT_CONTEXT_PRUNING_SETTINGS.hardClearRatio,\n minPrunableToolChars:\n overrides.minPrunableToolChars ??\n DEFAULT_CONTEXT_PRUNING_SETTINGS.minPrunableToolChars,\n softTrim: {\n ...DEFAULT_CONTEXT_PRUNING_SETTINGS.softTrim,\n ...overrides.softTrim,\n },\n hardClear: {\n ...DEFAULT_CONTEXT_PRUNING_SETTINGS.hardClear,\n ...overrides.hardClear,\n },\n };\n}\n"],"names":[],"mappings":"AAAA;;;;AAIG;AA6BI,MAAM,gCAAgC,GAA2B;AACtE,IAAA,OAAO,EAAE,KAAK;AACd,IAAA,kBAAkB,EAAE,CAAC;AACrB,IAAA,aAAa,EAAE,GAAG;AAClB,IAAA,cAAc,EAAE,GAAG;AACnB,IAAA,oBAAoB,EAAE,MAAM;AAC5B,IAAA,QAAQ,EAAE;AACR,QAAA,QAAQ,EAAE,KAAK;AACf,QAAA,SAAS,EAAE,KAAK;AAChB,QAAA,SAAS,EAAE,KAAK;AACjB,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,WAAW,EAAE,mCAAmC;AACjD,KAAA;;AAGH;;AAEG;AACG,SAAU,6BAA6B,CAC3C,SAQE,EAAA;IAEF,IAAI,CAAC,SAAS,EAAE;AACd,QAAA,OAAO,EAAE,GAAG,gCAAgC,EAAE;IAChD;IACA,OAAO;AACL,QAAA,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,gCAAgC,CAAC,OAAO;QACtE,kBAAkB,EAChB,SAAS,CAAC,kBAAkB;AAC5B,YAAA,gCAAgC,CAAC,kBAAkB;AACrD,QAAA,aAAa,EACX,SAAS,CAAC,aAAa,IAAI,gCAAgC,CAAC,aAAa;QAC3E,cAAc,EACZ,SAAS,CAAC,cAAc;AACxB,YAAA,gCAAgC,CAAC,cAAc;QACjD,oBAAoB,EAClB,SAAS,CAAC,oBAAoB;AAC9B,YAAA,gCAAgC,CAAC,oBAAoB;AACvD,QAAA,QAAQ,EAAE;YACR,GAAG,gCAAgC,CAAC,QAAQ;YAC5C,GAAG,SAAS,CAAC,QAAQ;AACtB,SAAA;AACD,QAAA,SAAS,EAAE;YACT,GAAG,gCAAgC,CAAC,SAAS;YAC7C,GAAG,SAAS,CAAC,SAAS;AACvB,SAAA;KACF;AACH;;;;"}
|
|
@@ -149,16 +149,69 @@ const formatFromLangChain = (message) => {
|
|
|
149
149
|
...additional_kwargs,
|
|
150
150
|
};
|
|
151
151
|
};
|
|
152
|
+
function extractReasoningContent(part) {
|
|
153
|
+
if (part == null || typeof part !== 'object')
|
|
154
|
+
return '';
|
|
155
|
+
if (part.type === ContentTypes.THINK) {
|
|
156
|
+
const think = part.think;
|
|
157
|
+
return typeof think === 'string' ? think : '';
|
|
158
|
+
}
|
|
159
|
+
if (part.type === ContentTypes.THINKING) {
|
|
160
|
+
const thinking = part.thinking;
|
|
161
|
+
return typeof thinking === 'string' ? thinking : '';
|
|
162
|
+
}
|
|
163
|
+
if (part.type === ContentTypes.REASONING) {
|
|
164
|
+
const reasoning = part.reasoning;
|
|
165
|
+
return typeof reasoning === 'string' ? reasoning : '';
|
|
166
|
+
}
|
|
167
|
+
if (part.type === ContentTypes.REASONING_CONTENT) {
|
|
168
|
+
/* Bedrock/Google nested shape: { reasoningContent: { text: ... } } */
|
|
169
|
+
const nested = part
|
|
170
|
+
.reasoningContent;
|
|
171
|
+
if (nested && typeof nested.text === 'string')
|
|
172
|
+
return nested.text;
|
|
173
|
+
}
|
|
174
|
+
return '';
|
|
175
|
+
}
|
|
152
176
|
/**
|
|
153
177
|
* Helper function to format an assistant message
|
|
154
178
|
* @param message The message to format
|
|
179
|
+
* @param options Optional formatting options (e.g. DeepSeek reasoning roundtrip)
|
|
155
180
|
* @returns Array of formatted messages
|
|
156
181
|
*/
|
|
157
|
-
function formatAssistantMessage(message) {
|
|
182
|
+
function formatAssistantMessage(message, options) {
|
|
158
183
|
const formattedMessages = [];
|
|
159
184
|
let currentContent = [];
|
|
160
185
|
let lastAIMessage = null;
|
|
161
186
|
let hasReasoning = false;
|
|
187
|
+
let pendingReasoningContent = '';
|
|
188
|
+
const shouldPreserveReasoningContent = options?.preserveReasoningContent === true;
|
|
189
|
+
const takePendingReasoningContent = () => {
|
|
190
|
+
if (!shouldPreserveReasoningContent || !pendingReasoningContent) {
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
const reasoningContent = pendingReasoningContent;
|
|
194
|
+
pendingReasoningContent = '';
|
|
195
|
+
return reasoningContent;
|
|
196
|
+
};
|
|
197
|
+
const createAIMessage = (content) => {
|
|
198
|
+
const reasoningContent = takePendingReasoningContent();
|
|
199
|
+
return new AIMessage({
|
|
200
|
+
content,
|
|
201
|
+
...(reasoningContent != null && {
|
|
202
|
+
additional_kwargs: { reasoning_content: reasoningContent },
|
|
203
|
+
}),
|
|
204
|
+
});
|
|
205
|
+
};
|
|
206
|
+
const attachPendingReasoningContent = (aiMessage) => {
|
|
207
|
+
const reasoningContent = takePendingReasoningContent();
|
|
208
|
+
if (reasoningContent == null)
|
|
209
|
+
return;
|
|
210
|
+
aiMessage.additional_kwargs.reasoning_content =
|
|
211
|
+
typeof aiMessage.additional_kwargs.reasoning_content === 'string'
|
|
212
|
+
? `${aiMessage.additional_kwargs.reasoning_content}${reasoningContent}`
|
|
213
|
+
: reasoningContent;
|
|
214
|
+
};
|
|
162
215
|
if (Array.isArray(message.content)) {
|
|
163
216
|
for (const part of message.content) {
|
|
164
217
|
if (part == null) {
|
|
@@ -178,15 +231,13 @@ function formatAssistantMessage(message) {
|
|
|
178
231
|
}, '');
|
|
179
232
|
content =
|
|
180
233
|
`${content}\n${part[ContentTypes.TEXT] ?? part.text ?? ''}`.trim();
|
|
181
|
-
lastAIMessage =
|
|
234
|
+
lastAIMessage = createAIMessage(content);
|
|
182
235
|
formattedMessages.push(lastAIMessage);
|
|
183
236
|
currentContent = [];
|
|
184
237
|
continue;
|
|
185
238
|
}
|
|
186
239
|
// Create a new AIMessage with this text and prepare for tool calls
|
|
187
|
-
lastAIMessage =
|
|
188
|
-
content: part.text != null ? part.text : '',
|
|
189
|
-
});
|
|
240
|
+
lastAIMessage = createAIMessage(part.text != null ? part.text : '');
|
|
190
241
|
formattedMessages.push(lastAIMessage);
|
|
191
242
|
}
|
|
192
243
|
else if (part.type === ContentTypes.TOOL_CALL) {
|
|
@@ -203,9 +254,12 @@ function formatAssistantMessage(message) {
|
|
|
203
254
|
}
|
|
204
255
|
if (!lastAIMessage) {
|
|
205
256
|
// "Heal" the payload by creating an AIMessage to precede the tool call
|
|
206
|
-
lastAIMessage =
|
|
257
|
+
lastAIMessage = createAIMessage('');
|
|
207
258
|
formattedMessages.push(lastAIMessage);
|
|
208
259
|
}
|
|
260
|
+
else {
|
|
261
|
+
attachPendingReasoningContent(lastAIMessage);
|
|
262
|
+
}
|
|
209
263
|
const tool_call = _tool_call;
|
|
210
264
|
// TODO: investigate; args as dictionary may need to be providers-or-tool-specific
|
|
211
265
|
let args = _args;
|
|
@@ -241,9 +295,11 @@ function formatAssistantMessage(message) {
|
|
|
241
295
|
}
|
|
242
296
|
else if (part.type === ContentTypes.THINK ||
|
|
243
297
|
part.type === ContentTypes.THINKING ||
|
|
298
|
+
part.type === ContentTypes.REASONING ||
|
|
244
299
|
part.type === ContentTypes.REASONING_CONTENT ||
|
|
245
300
|
part.type === 'redacted_thinking') {
|
|
246
301
|
hasReasoning = true;
|
|
302
|
+
pendingReasoningContent += extractReasoningContent(part);
|
|
247
303
|
continue;
|
|
248
304
|
}
|
|
249
305
|
else if (part.type === ContentTypes.ERROR ||
|
|
@@ -269,11 +325,11 @@ function formatAssistantMessage(message) {
|
|
|
269
325
|
}, '')
|
|
270
326
|
.trim();
|
|
271
327
|
if (content) {
|
|
272
|
-
formattedMessages.push(
|
|
328
|
+
formattedMessages.push(createAIMessage(content));
|
|
273
329
|
}
|
|
274
330
|
}
|
|
275
331
|
else if (currentContent.length > 0) {
|
|
276
|
-
formattedMessages.push(
|
|
332
|
+
formattedMessages.push(createAIMessage(currentContent));
|
|
277
333
|
}
|
|
278
334
|
return formattedMessages;
|
|
279
335
|
}
|
|
@@ -481,15 +537,37 @@ function extractToolNamesFromSearchOutput(output) {
|
|
|
481
537
|
}
|
|
482
538
|
return [];
|
|
483
539
|
}
|
|
540
|
+
/** Extracts the skillName from a skill tool_call's args (string or object). */
|
|
541
|
+
function extractSkillName(args) {
|
|
542
|
+
let parsed;
|
|
543
|
+
if (typeof args === 'string') {
|
|
544
|
+
try {
|
|
545
|
+
parsed = JSON.parse(args);
|
|
546
|
+
}
|
|
547
|
+
catch {
|
|
548
|
+
/* malformed args — skip */
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
else {
|
|
552
|
+
parsed = args;
|
|
553
|
+
}
|
|
554
|
+
const name = parsed?.skillName;
|
|
555
|
+
return typeof name === 'string' && name !== '' ? name : undefined;
|
|
556
|
+
}
|
|
484
557
|
/**
|
|
485
558
|
* Formats an array of messages for LangChain, handling tool calls and creating ToolMessage instances.
|
|
486
559
|
*
|
|
487
560
|
* @param payload - The array of messages to format.
|
|
488
561
|
* @param indexTokenCountMap - Optional map of message indices to token counts.
|
|
489
562
|
* @param tools - Optional set of tool names that are allowed in the request.
|
|
563
|
+
* @param skills - Optional map of skill name to body for reconstructing skill HumanMessages.
|
|
564
|
+
* When SkillTool is invoked, the body is injected as a HumanMessage into LangGraph state
|
|
565
|
+
* but NOT persisted to conversation history. On follow-up runs the skill body is lost.
|
|
566
|
+
* Pass `skills` to reconstruct the HumanMessage at the right position after each skill
|
|
567
|
+
* ToolMessage. PRs #96 / #97.
|
|
490
568
|
* @returns - Object containing formatted messages and updated indexTokenCountMap if provided.
|
|
491
569
|
*/
|
|
492
|
-
const formatAgentMessages = (payload, indexTokenCountMap, tools) => {
|
|
570
|
+
const formatAgentMessages = (payload, indexTokenCountMap, tools, skills, options) => {
|
|
493
571
|
const messages = [];
|
|
494
572
|
// If indexTokenCountMap is provided, create a new map to track the updated indices
|
|
495
573
|
const updatedIndexTokenCountMap = {};
|
|
@@ -529,6 +607,7 @@ const formatAgentMessages = (payload, indexTokenCountMap, tools) => {
|
|
|
529
607
|
* - Dynamically expand the set when tool_search results are encountered
|
|
530
608
|
*/
|
|
531
609
|
let processedMessage = message;
|
|
610
|
+
let pendingSkillNames;
|
|
532
611
|
if (discoveredTools) {
|
|
533
612
|
const content = message.content;
|
|
534
613
|
if (content && Array.isArray(content)) {
|
|
@@ -566,6 +645,16 @@ const formatAgentMessages = (payload, indexTokenCountMap, tools) => {
|
|
|
566
645
|
if (discoveredTools.has(toolName)) {
|
|
567
646
|
/** Valid tool - keep it */
|
|
568
647
|
filteredContent.push(part);
|
|
648
|
+
// Skill body reconstruction (PRs #96/#97): when a
|
|
649
|
+
// SkillTool tool_call is present in this assistant turn, mark
|
|
650
|
+
// the skill name so we can reconstruct the body HumanMessage
|
|
651
|
+
// after the assistant turn has been pushed.
|
|
652
|
+
if (toolName === Constants.SKILL_TOOL && skills?.size) {
|
|
653
|
+
const skillName = extractSkillName(part.tool_call.args);
|
|
654
|
+
if (skillName) {
|
|
655
|
+
(pendingSkillNames ??= new Set()).add(skillName);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
569
658
|
}
|
|
570
659
|
else {
|
|
571
660
|
/** Invalid tool - convert to string for context preservation */
|
|
@@ -625,12 +714,47 @@ const formatAgentMessages = (payload, indexTokenCountMap, tools) => {
|
|
|
625
714
|
}
|
|
626
715
|
}
|
|
627
716
|
}
|
|
717
|
+
// When tools filtering is off, still detect skill tool_calls for body reconstruction.
|
|
718
|
+
if (!discoveredTools && skills?.size) {
|
|
719
|
+
const content = processedMessage.content;
|
|
720
|
+
if (Array.isArray(content)) {
|
|
721
|
+
for (const part of content) {
|
|
722
|
+
if (part.type !== ContentTypes.TOOL_CALL ||
|
|
723
|
+
part.tool_call?.name !== Constants.SKILL_TOOL) {
|
|
724
|
+
continue;
|
|
725
|
+
}
|
|
726
|
+
const skillName = extractSkillName(part.tool_call.args);
|
|
727
|
+
if (skillName) {
|
|
728
|
+
(pendingSkillNames ??= new Set()).add(skillName);
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
}
|
|
628
733
|
// Process the assistant message using the helper function
|
|
629
|
-
const formattedMessages = formatAssistantMessage(processedMessage
|
|
734
|
+
const formattedMessages = formatAssistantMessage(processedMessage, {
|
|
735
|
+
preserveReasoningContent: options?.provider === Providers.DEEPSEEK,
|
|
736
|
+
});
|
|
630
737
|
messages.push(...formattedMessages);
|
|
631
|
-
//
|
|
632
|
-
//
|
|
738
|
+
// Capture index range BEFORE skill body injection so injected
|
|
739
|
+
// HumanMessages are excluded from the assistant's token distribution
|
|
740
|
+
// (PR #97 fix).
|
|
633
741
|
const endMessageIndex = messages.length;
|
|
742
|
+
if (pendingSkillNames?.size) {
|
|
743
|
+
for (const skillName of pendingSkillNames) {
|
|
744
|
+
const body = skills?.get(skillName);
|
|
745
|
+
if (body) {
|
|
746
|
+
messages.push(new HumanMessage({
|
|
747
|
+
content: body,
|
|
748
|
+
additional_kwargs: {
|
|
749
|
+
role: 'user',
|
|
750
|
+
isMeta: true,
|
|
751
|
+
source: 'skill',
|
|
752
|
+
skillName,
|
|
753
|
+
},
|
|
754
|
+
}));
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
}
|
|
634
758
|
const resultIndices = [];
|
|
635
759
|
for (let j = startMessageIndex; j < endMessageIndex; j++) {
|
|
636
760
|
resultIndices.push(j);
|