@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,156 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var messages = require('@langchain/core/messages');
|
|
4
|
+
var contextPruningSettings = require('./contextPruningSettings.cjs');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Position-based context pruning for tool results.
|
|
8
|
+
*
|
|
9
|
+
* Uses position-based age: the distance of a message
|
|
10
|
+
* from the conversation end as a fraction of total messages.
|
|
11
|
+
*
|
|
12
|
+
* Two degradation levels:
|
|
13
|
+
* - Soft-trim: Keep head + tail of tool result content, drop middle.
|
|
14
|
+
* - Hard-clear: Replace entire content with a placeholder.
|
|
15
|
+
*
|
|
16
|
+
* Messages in the "protected zone" (recent assistant turns, system/pre-first-human
|
|
17
|
+
* messages, and messages with image content) are never pruned.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Checks if a message contains image content blocks.
|
|
21
|
+
* Messages with images are skipped by position-based content degradation
|
|
22
|
+
* because images cannot be meaningfully soft-trimmed or replaced with placeholders.
|
|
23
|
+
*/
|
|
24
|
+
function hasImageContent(message) {
|
|
25
|
+
if (!Array.isArray(message.content)) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
return message.content.some((block) => typeof block === 'object' &&
|
|
29
|
+
'type' in block &&
|
|
30
|
+
(block.type === 'image_url' || block.type === 'image'));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Applies head+tail soft-trim to tool result content.
|
|
34
|
+
*/
|
|
35
|
+
function softTrimContent(content, settings) {
|
|
36
|
+
const { headChars, tailChars } = settings;
|
|
37
|
+
const indicator = `\n\n… [soft-trimmed: ${content.length} chars → ${headChars + tailChars} chars, middle removed] …\n\n`;
|
|
38
|
+
return content.slice(0, headChars) + indicator + content.slice(-tailChars);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Applies position-based context pruning to tool result messages.
|
|
42
|
+
*
|
|
43
|
+
* Modifies messages in-place and updates indexTokenCountMap with recounted
|
|
44
|
+
* token values for modified messages.
|
|
45
|
+
*
|
|
46
|
+
* @param params.messages - The full message array (modified in-place).
|
|
47
|
+
* @param params.indexTokenCountMap - Token count map (updated in-place).
|
|
48
|
+
* @param params.tokenCounter - Function to recount tokens after modification.
|
|
49
|
+
* @param params.config - Partial context pruning config (merged with defaults).
|
|
50
|
+
* @returns Counts of soft-trimmed and hard-cleared messages.
|
|
51
|
+
*/
|
|
52
|
+
function applyContextPruning(params) {
|
|
53
|
+
const { messages: messages$1, indexTokenCountMap, tokenCounter, config, resolvedSettings, } = params;
|
|
54
|
+
const settings = resolvedSettings ?? contextPruningSettings.resolveContextPruningSettings(config);
|
|
55
|
+
if (!settings.enabled || messages$1.length === 0) {
|
|
56
|
+
return { softTrimmed: 0, hardCleared: 0 };
|
|
57
|
+
}
|
|
58
|
+
const totalMessages = messages$1.length;
|
|
59
|
+
let softTrimmed = 0;
|
|
60
|
+
let hardCleared = 0;
|
|
61
|
+
// Find the protected zone: last N assistant turns from the end.
|
|
62
|
+
// An "assistant turn" is a contiguous sequence of AI + Tool messages.
|
|
63
|
+
const protectedIndices = new Set();
|
|
64
|
+
// Always protect the system message (index 0 if present)
|
|
65
|
+
if (messages$1[0]?.getType() === 'system') {
|
|
66
|
+
protectedIndices.add(0);
|
|
67
|
+
}
|
|
68
|
+
// Protect messages before the first human message
|
|
69
|
+
for (let i = 0; i < totalMessages; i++) {
|
|
70
|
+
if (messages$1[i].getType() === 'human') {
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
protectedIndices.add(i);
|
|
74
|
+
}
|
|
75
|
+
// Protect the last N assistant turns (walking backwards)
|
|
76
|
+
let assistantTurnsFound = 0;
|
|
77
|
+
let inAssistantSequence = false;
|
|
78
|
+
for (let i = totalMessages - 1; i >= 0; i--) {
|
|
79
|
+
const type = messages$1[i].getType();
|
|
80
|
+
if (type === 'ai' || type === 'tool') {
|
|
81
|
+
protectedIndices.add(i);
|
|
82
|
+
if (!inAssistantSequence) {
|
|
83
|
+
inAssistantSequence = true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
if (inAssistantSequence) {
|
|
88
|
+
assistantTurnsFound++;
|
|
89
|
+
inAssistantSequence = false;
|
|
90
|
+
if (assistantTurnsFound >= settings.keepLastAssistants) {
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Protect the human message between assistant turns in the protected zone
|
|
95
|
+
if (assistantTurnsFound < settings.keepLastAssistants) {
|
|
96
|
+
protectedIndices.add(i);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Process each tool message outside the protected zone
|
|
101
|
+
for (let i = 0; i < totalMessages; i++) {
|
|
102
|
+
const message = messages$1[i];
|
|
103
|
+
if (message.getType() !== 'tool') {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (protectedIndices.has(i)) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (hasImageContent(message)) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const content = message.content;
|
|
113
|
+
if (typeof content !== 'string') {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (content.length < settings.minPrunableToolChars) {
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
// Compute age ratio: how far back from the end (0 = latest, 1 = oldest)
|
|
120
|
+
const ageRatio = (totalMessages - i) / totalMessages;
|
|
121
|
+
if (ageRatio >= settings.hardClearRatio && settings.hardClear.enabled) {
|
|
122
|
+
// Hard-clear: replace with placeholder
|
|
123
|
+
const cloned = new messages.ToolMessage({
|
|
124
|
+
content: settings.hardClear.placeholder,
|
|
125
|
+
tool_call_id: message.tool_call_id,
|
|
126
|
+
name: message.name,
|
|
127
|
+
id: message.id,
|
|
128
|
+
additional_kwargs: message.additional_kwargs,
|
|
129
|
+
response_metadata: message.response_metadata,
|
|
130
|
+
});
|
|
131
|
+
messages$1[i] = cloned;
|
|
132
|
+
indexTokenCountMap[i] = tokenCounter(cloned);
|
|
133
|
+
hardCleared++;
|
|
134
|
+
}
|
|
135
|
+
else if (ageRatio >= settings.softTrimRatio) {
|
|
136
|
+
// Soft-trim: keep head + tail
|
|
137
|
+
if (content.length > settings.softTrim.maxChars) {
|
|
138
|
+
const cloned = new messages.ToolMessage({
|
|
139
|
+
content: softTrimContent(content, settings.softTrim),
|
|
140
|
+
tool_call_id: message.tool_call_id,
|
|
141
|
+
name: message.name,
|
|
142
|
+
id: message.id,
|
|
143
|
+
additional_kwargs: message.additional_kwargs,
|
|
144
|
+
response_metadata: message.response_metadata,
|
|
145
|
+
});
|
|
146
|
+
messages$1[i] = cloned;
|
|
147
|
+
indexTokenCountMap[i] = tokenCounter(cloned);
|
|
148
|
+
softTrimmed++;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return { softTrimmed, hardCleared };
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
exports.applyContextPruning = applyContextPruning;
|
|
156
|
+
//# sourceMappingURL=contextPruning.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextPruning.cjs","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":["messages","resolveContextPruningSettings","ToolMessage"],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Default settings for position-based context pruning.
|
|
5
|
+
*
|
|
6
|
+
* These are merged with user-provided overrides so any subset can be customized.
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_CONTEXT_PRUNING_SETTINGS = {
|
|
9
|
+
enabled: false,
|
|
10
|
+
keepLastAssistants: 3,
|
|
11
|
+
softTrimRatio: 0.3,
|
|
12
|
+
hardClearRatio: 0.5,
|
|
13
|
+
minPrunableToolChars: 50_000,
|
|
14
|
+
softTrim: {
|
|
15
|
+
maxChars: 4_000,
|
|
16
|
+
headChars: 1_500,
|
|
17
|
+
tailChars: 1_500,
|
|
18
|
+
},
|
|
19
|
+
hardClear: {
|
|
20
|
+
enabled: true,
|
|
21
|
+
placeholder: '[Old tool result content cleared]',
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Merges user-provided partial overrides with the defaults.
|
|
26
|
+
*/
|
|
27
|
+
function resolveContextPruningSettings(overrides) {
|
|
28
|
+
if (!overrides) {
|
|
29
|
+
return { ...DEFAULT_CONTEXT_PRUNING_SETTINGS };
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
enabled: overrides.enabled ?? DEFAULT_CONTEXT_PRUNING_SETTINGS.enabled,
|
|
33
|
+
keepLastAssistants: overrides.keepLastAssistants ??
|
|
34
|
+
DEFAULT_CONTEXT_PRUNING_SETTINGS.keepLastAssistants,
|
|
35
|
+
softTrimRatio: overrides.softTrimRatio ?? DEFAULT_CONTEXT_PRUNING_SETTINGS.softTrimRatio,
|
|
36
|
+
hardClearRatio: overrides.hardClearRatio ??
|
|
37
|
+
DEFAULT_CONTEXT_PRUNING_SETTINGS.hardClearRatio,
|
|
38
|
+
minPrunableToolChars: overrides.minPrunableToolChars ??
|
|
39
|
+
DEFAULT_CONTEXT_PRUNING_SETTINGS.minPrunableToolChars,
|
|
40
|
+
softTrim: {
|
|
41
|
+
...DEFAULT_CONTEXT_PRUNING_SETTINGS.softTrim,
|
|
42
|
+
...overrides.softTrim,
|
|
43
|
+
},
|
|
44
|
+
hardClear: {
|
|
45
|
+
...DEFAULT_CONTEXT_PRUNING_SETTINGS.hardClear,
|
|
46
|
+
...overrides.hardClear,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
exports.DEFAULT_CONTEXT_PRUNING_SETTINGS = DEFAULT_CONTEXT_PRUNING_SETTINGS;
|
|
52
|
+
exports.resolveContextPruningSettings = resolveContextPruningSettings;
|
|
53
|
+
//# sourceMappingURL=contextPruningSettings.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextPruningSettings.cjs","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;;;;;"}
|
|
@@ -151,16 +151,69 @@ const formatFromLangChain = (message) => {
|
|
|
151
151
|
...additional_kwargs,
|
|
152
152
|
};
|
|
153
153
|
};
|
|
154
|
+
function extractReasoningContent(part) {
|
|
155
|
+
if (part == null || typeof part !== 'object')
|
|
156
|
+
return '';
|
|
157
|
+
if (part.type === _enum.ContentTypes.THINK) {
|
|
158
|
+
const think = part.think;
|
|
159
|
+
return typeof think === 'string' ? think : '';
|
|
160
|
+
}
|
|
161
|
+
if (part.type === _enum.ContentTypes.THINKING) {
|
|
162
|
+
const thinking = part.thinking;
|
|
163
|
+
return typeof thinking === 'string' ? thinking : '';
|
|
164
|
+
}
|
|
165
|
+
if (part.type === _enum.ContentTypes.REASONING) {
|
|
166
|
+
const reasoning = part.reasoning;
|
|
167
|
+
return typeof reasoning === 'string' ? reasoning : '';
|
|
168
|
+
}
|
|
169
|
+
if (part.type === _enum.ContentTypes.REASONING_CONTENT) {
|
|
170
|
+
/* Bedrock/Google nested shape: { reasoningContent: { text: ... } } */
|
|
171
|
+
const nested = part
|
|
172
|
+
.reasoningContent;
|
|
173
|
+
if (nested && typeof nested.text === 'string')
|
|
174
|
+
return nested.text;
|
|
175
|
+
}
|
|
176
|
+
return '';
|
|
177
|
+
}
|
|
154
178
|
/**
|
|
155
179
|
* Helper function to format an assistant message
|
|
156
180
|
* @param message The message to format
|
|
181
|
+
* @param options Optional formatting options (e.g. DeepSeek reasoning roundtrip)
|
|
157
182
|
* @returns Array of formatted messages
|
|
158
183
|
*/
|
|
159
|
-
function formatAssistantMessage(message) {
|
|
184
|
+
function formatAssistantMessage(message, options) {
|
|
160
185
|
const formattedMessages = [];
|
|
161
186
|
let currentContent = [];
|
|
162
187
|
let lastAIMessage = null;
|
|
163
188
|
let hasReasoning = false;
|
|
189
|
+
let pendingReasoningContent = '';
|
|
190
|
+
const shouldPreserveReasoningContent = options?.preserveReasoningContent === true;
|
|
191
|
+
const takePendingReasoningContent = () => {
|
|
192
|
+
if (!shouldPreserveReasoningContent || !pendingReasoningContent) {
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
const reasoningContent = pendingReasoningContent;
|
|
196
|
+
pendingReasoningContent = '';
|
|
197
|
+
return reasoningContent;
|
|
198
|
+
};
|
|
199
|
+
const createAIMessage = (content) => {
|
|
200
|
+
const reasoningContent = takePendingReasoningContent();
|
|
201
|
+
return new messages.AIMessage({
|
|
202
|
+
content,
|
|
203
|
+
...(reasoningContent != null && {
|
|
204
|
+
additional_kwargs: { reasoning_content: reasoningContent },
|
|
205
|
+
}),
|
|
206
|
+
});
|
|
207
|
+
};
|
|
208
|
+
const attachPendingReasoningContent = (aiMessage) => {
|
|
209
|
+
const reasoningContent = takePendingReasoningContent();
|
|
210
|
+
if (reasoningContent == null)
|
|
211
|
+
return;
|
|
212
|
+
aiMessage.additional_kwargs.reasoning_content =
|
|
213
|
+
typeof aiMessage.additional_kwargs.reasoning_content === 'string'
|
|
214
|
+
? `${aiMessage.additional_kwargs.reasoning_content}${reasoningContent}`
|
|
215
|
+
: reasoningContent;
|
|
216
|
+
};
|
|
164
217
|
if (Array.isArray(message.content)) {
|
|
165
218
|
for (const part of message.content) {
|
|
166
219
|
if (part == null) {
|
|
@@ -180,15 +233,13 @@ function formatAssistantMessage(message) {
|
|
|
180
233
|
}, '');
|
|
181
234
|
content =
|
|
182
235
|
`${content}\n${part[_enum.ContentTypes.TEXT] ?? part.text ?? ''}`.trim();
|
|
183
|
-
lastAIMessage =
|
|
236
|
+
lastAIMessage = createAIMessage(content);
|
|
184
237
|
formattedMessages.push(lastAIMessage);
|
|
185
238
|
currentContent = [];
|
|
186
239
|
continue;
|
|
187
240
|
}
|
|
188
241
|
// Create a new AIMessage with this text and prepare for tool calls
|
|
189
|
-
lastAIMessage =
|
|
190
|
-
content: part.text != null ? part.text : '',
|
|
191
|
-
});
|
|
242
|
+
lastAIMessage = createAIMessage(part.text != null ? part.text : '');
|
|
192
243
|
formattedMessages.push(lastAIMessage);
|
|
193
244
|
}
|
|
194
245
|
else if (part.type === _enum.ContentTypes.TOOL_CALL) {
|
|
@@ -205,9 +256,12 @@ function formatAssistantMessage(message) {
|
|
|
205
256
|
}
|
|
206
257
|
if (!lastAIMessage) {
|
|
207
258
|
// "Heal" the payload by creating an AIMessage to precede the tool call
|
|
208
|
-
lastAIMessage =
|
|
259
|
+
lastAIMessage = createAIMessage('');
|
|
209
260
|
formattedMessages.push(lastAIMessage);
|
|
210
261
|
}
|
|
262
|
+
else {
|
|
263
|
+
attachPendingReasoningContent(lastAIMessage);
|
|
264
|
+
}
|
|
211
265
|
const tool_call = _tool_call;
|
|
212
266
|
// TODO: investigate; args as dictionary may need to be providers-or-tool-specific
|
|
213
267
|
let args = _args;
|
|
@@ -243,9 +297,11 @@ function formatAssistantMessage(message) {
|
|
|
243
297
|
}
|
|
244
298
|
else if (part.type === _enum.ContentTypes.THINK ||
|
|
245
299
|
part.type === _enum.ContentTypes.THINKING ||
|
|
300
|
+
part.type === _enum.ContentTypes.REASONING ||
|
|
246
301
|
part.type === _enum.ContentTypes.REASONING_CONTENT ||
|
|
247
302
|
part.type === 'redacted_thinking') {
|
|
248
303
|
hasReasoning = true;
|
|
304
|
+
pendingReasoningContent += extractReasoningContent(part);
|
|
249
305
|
continue;
|
|
250
306
|
}
|
|
251
307
|
else if (part.type === _enum.ContentTypes.ERROR ||
|
|
@@ -271,11 +327,11 @@ function formatAssistantMessage(message) {
|
|
|
271
327
|
}, '')
|
|
272
328
|
.trim();
|
|
273
329
|
if (content) {
|
|
274
|
-
formattedMessages.push(
|
|
330
|
+
formattedMessages.push(createAIMessage(content));
|
|
275
331
|
}
|
|
276
332
|
}
|
|
277
333
|
else if (currentContent.length > 0) {
|
|
278
|
-
formattedMessages.push(
|
|
334
|
+
formattedMessages.push(createAIMessage(currentContent));
|
|
279
335
|
}
|
|
280
336
|
return formattedMessages;
|
|
281
337
|
}
|
|
@@ -483,16 +539,38 @@ function extractToolNamesFromSearchOutput(output) {
|
|
|
483
539
|
}
|
|
484
540
|
return [];
|
|
485
541
|
}
|
|
542
|
+
/** Extracts the skillName from a skill tool_call's args (string or object). */
|
|
543
|
+
function extractSkillName(args) {
|
|
544
|
+
let parsed;
|
|
545
|
+
if (typeof args === 'string') {
|
|
546
|
+
try {
|
|
547
|
+
parsed = JSON.parse(args);
|
|
548
|
+
}
|
|
549
|
+
catch {
|
|
550
|
+
/* malformed args — skip */
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
else {
|
|
554
|
+
parsed = args;
|
|
555
|
+
}
|
|
556
|
+
const name = parsed?.skillName;
|
|
557
|
+
return typeof name === 'string' && name !== '' ? name : undefined;
|
|
558
|
+
}
|
|
486
559
|
/**
|
|
487
560
|
* Formats an array of messages for LangChain, handling tool calls and creating ToolMessage instances.
|
|
488
561
|
*
|
|
489
562
|
* @param payload - The array of messages to format.
|
|
490
563
|
* @param indexTokenCountMap - Optional map of message indices to token counts.
|
|
491
564
|
* @param tools - Optional set of tool names that are allowed in the request.
|
|
565
|
+
* @param skills - Optional map of skill name to body for reconstructing skill HumanMessages.
|
|
566
|
+
* When SkillTool is invoked, the body is injected as a HumanMessage into LangGraph state
|
|
567
|
+
* but NOT persisted to conversation history. On follow-up runs the skill body is lost.
|
|
568
|
+
* Pass `skills` to reconstruct the HumanMessage at the right position after each skill
|
|
569
|
+
* ToolMessage. PRs #96 / #97.
|
|
492
570
|
* @returns - Object containing formatted messages and updated indexTokenCountMap if provided.
|
|
493
571
|
*/
|
|
494
|
-
const formatAgentMessages = (payload, indexTokenCountMap, tools) => {
|
|
495
|
-
const messages = [];
|
|
572
|
+
const formatAgentMessages = (payload, indexTokenCountMap, tools, skills, options) => {
|
|
573
|
+
const messages$1 = [];
|
|
496
574
|
// If indexTokenCountMap is provided, create a new map to track the updated indices
|
|
497
575
|
const updatedIndexTokenCountMap = {};
|
|
498
576
|
// Keep track of the mapping from original payload indices to result indices
|
|
@@ -514,16 +592,16 @@ const formatAgentMessages = (payload, indexTokenCountMap, tools) => {
|
|
|
514
592
|
];
|
|
515
593
|
}
|
|
516
594
|
if (message.role !== 'assistant') {
|
|
517
|
-
messages.push(formatMessage({
|
|
595
|
+
messages$1.push(formatMessage({
|
|
518
596
|
message: message,
|
|
519
597
|
langChain: true,
|
|
520
598
|
}));
|
|
521
599
|
// Update the index mapping for this message
|
|
522
|
-
indexMapping[i] = [messages.length - 1];
|
|
600
|
+
indexMapping[i] = [messages$1.length - 1];
|
|
523
601
|
continue;
|
|
524
602
|
}
|
|
525
603
|
// For assistant messages, track the starting index before processing
|
|
526
|
-
const startMessageIndex = messages.length;
|
|
604
|
+
const startMessageIndex = messages$1.length;
|
|
527
605
|
/**
|
|
528
606
|
* If tools set is provided, process tool_calls:
|
|
529
607
|
* - Keep valid tool_calls (tools in the set or dynamically discovered)
|
|
@@ -531,6 +609,7 @@ const formatAgentMessages = (payload, indexTokenCountMap, tools) => {
|
|
|
531
609
|
* - Dynamically expand the set when tool_search results are encountered
|
|
532
610
|
*/
|
|
533
611
|
let processedMessage = message;
|
|
612
|
+
let pendingSkillNames;
|
|
534
613
|
if (discoveredTools) {
|
|
535
614
|
const content = message.content;
|
|
536
615
|
if (content && Array.isArray(content)) {
|
|
@@ -568,6 +647,16 @@ const formatAgentMessages = (payload, indexTokenCountMap, tools) => {
|
|
|
568
647
|
if (discoveredTools.has(toolName)) {
|
|
569
648
|
/** Valid tool - keep it */
|
|
570
649
|
filteredContent.push(part);
|
|
650
|
+
// Skill body reconstruction (PRs #96/#97): when a
|
|
651
|
+
// SkillTool tool_call is present in this assistant turn, mark
|
|
652
|
+
// the skill name so we can reconstruct the body HumanMessage
|
|
653
|
+
// after the assistant turn has been pushed.
|
|
654
|
+
if (toolName === _enum.Constants.SKILL_TOOL && skills?.size) {
|
|
655
|
+
const skillName = extractSkillName(part.tool_call.args);
|
|
656
|
+
if (skillName) {
|
|
657
|
+
(pendingSkillNames ??= new Set()).add(skillName);
|
|
658
|
+
}
|
|
659
|
+
}
|
|
571
660
|
}
|
|
572
661
|
else {
|
|
573
662
|
/** Invalid tool - convert to string for context preservation */
|
|
@@ -627,12 +716,47 @@ const formatAgentMessages = (payload, indexTokenCountMap, tools) => {
|
|
|
627
716
|
}
|
|
628
717
|
}
|
|
629
718
|
}
|
|
719
|
+
// When tools filtering is off, still detect skill tool_calls for body reconstruction.
|
|
720
|
+
if (!discoveredTools && skills?.size) {
|
|
721
|
+
const content = processedMessage.content;
|
|
722
|
+
if (Array.isArray(content)) {
|
|
723
|
+
for (const part of content) {
|
|
724
|
+
if (part.type !== _enum.ContentTypes.TOOL_CALL ||
|
|
725
|
+
part.tool_call?.name !== _enum.Constants.SKILL_TOOL) {
|
|
726
|
+
continue;
|
|
727
|
+
}
|
|
728
|
+
const skillName = extractSkillName(part.tool_call.args);
|
|
729
|
+
if (skillName) {
|
|
730
|
+
(pendingSkillNames ??= new Set()).add(skillName);
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
}
|
|
630
735
|
// Process the assistant message using the helper function
|
|
631
|
-
const formattedMessages = formatAssistantMessage(processedMessage
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
736
|
+
const formattedMessages = formatAssistantMessage(processedMessage, {
|
|
737
|
+
preserveReasoningContent: options?.provider === _enum.Providers.DEEPSEEK,
|
|
738
|
+
});
|
|
739
|
+
messages$1.push(...formattedMessages);
|
|
740
|
+
// Capture index range BEFORE skill body injection so injected
|
|
741
|
+
// HumanMessages are excluded from the assistant's token distribution
|
|
742
|
+
// (PR #97 fix).
|
|
743
|
+
const endMessageIndex = messages$1.length;
|
|
744
|
+
if (pendingSkillNames?.size) {
|
|
745
|
+
for (const skillName of pendingSkillNames) {
|
|
746
|
+
const body = skills?.get(skillName);
|
|
747
|
+
if (body) {
|
|
748
|
+
messages$1.push(new messages.HumanMessage({
|
|
749
|
+
content: body,
|
|
750
|
+
additional_kwargs: {
|
|
751
|
+
role: 'user',
|
|
752
|
+
isMeta: true,
|
|
753
|
+
source: 'skill',
|
|
754
|
+
skillName,
|
|
755
|
+
},
|
|
756
|
+
}));
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
}
|
|
636
760
|
const resultIndices = [];
|
|
637
761
|
for (let j = startMessageIndex; j < endMessageIndex; j++) {
|
|
638
762
|
resultIndices.push(j);
|
|
@@ -658,7 +782,7 @@ const formatAgentMessages = (payload, indexTokenCountMap, tools) => {
|
|
|
658
782
|
const lastIdx = msgCount - 1;
|
|
659
783
|
const lengths = new Array(msgCount);
|
|
660
784
|
for (let k = 0; k < msgCount; k++) {
|
|
661
|
-
const msg = messages[resultIndices[k]];
|
|
785
|
+
const msg = messages$1[resultIndices[k]];
|
|
662
786
|
const { content } = msg;
|
|
663
787
|
let len = 0;
|
|
664
788
|
if (typeof content === 'string') {
|
|
@@ -716,7 +840,7 @@ const formatAgentMessages = (payload, indexTokenCountMap, tools) => {
|
|
|
716
840
|
}
|
|
717
841
|
}
|
|
718
842
|
return {
|
|
719
|
-
messages,
|
|
843
|
+
messages: messages$1,
|
|
720
844
|
indexTokenCountMap: indexTokenCountMap
|
|
721
845
|
? updatedIndexTokenCountMap
|
|
722
846
|
: undefined,
|