@librechat/agents 3.2.21 → 3.2.32
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/dist/cjs/agents/AgentContext.cjs +3 -2
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/events.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +200 -54
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +13 -7
- package/dist/cjs/hooks/createWorkspacePolicyHook.cjs.map +1 -1
- package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
- package/dist/cjs/hooks/types.cjs.map +1 -1
- package/dist/cjs/instrumentation.cjs +2 -2
- package/dist/cjs/instrumentation.cjs.map +1 -1
- package/dist/cjs/langfuse.cjs +17 -1
- package/dist/cjs/langfuse.cjs.map +1 -1
- package/dist/cjs/langfuseToolOutputTracing.cjs +2 -2
- package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/index.cjs +1 -1
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +38 -3
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +6 -2
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +2 -2
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/toolCache.cjs +8 -5
- package/dist/cjs/llm/bedrock/toolCache.cjs.map +1 -1
- package/dist/cjs/llm/fake.cjs +16 -14
- package/dist/cjs/llm/fake.cjs.map +1 -1
- package/dist/cjs/llm/google/index.cjs +22 -0
- package/dist/cjs/llm/google/index.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/common.cjs +88 -27
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
- package/dist/cjs/llm/init.cjs +2 -2
- package/dist/cjs/llm/invoke.cjs +108 -11
- package/dist/cjs/llm/invoke.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +1 -1
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +1 -0
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +29 -8
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/content.cjs.map +1 -1
- package/dist/cjs/messages/contextPruning.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +129 -17
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/messages/reducer.cjs +1 -1
- package/dist/cjs/messages/reducer.cjs.map +1 -1
- package/dist/cjs/messages/tools.cjs +1 -1
- package/dist/cjs/messages/tools.cjs.map +1 -1
- package/dist/cjs/openai/index.cjs.map +1 -1
- package/dist/cjs/responses/index.cjs.map +1 -1
- package/dist/cjs/run.cjs +41 -20
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/session/AgentSession.cjs +4 -4
- package/dist/cjs/session/AgentSession.cjs.map +1 -1
- package/dist/cjs/session/JsonlSessionStore.cjs +2 -2
- package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
- package/dist/cjs/session/handlers.cjs +2 -2
- package/dist/cjs/session/handlers.cjs.map +1 -1
- package/dist/cjs/stream.cjs +248 -25
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +1 -1
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/Calculator.cjs +1 -1
- package/dist/cjs/tools/Calculator.cjs.map +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +37 -18
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/ToolSearch.cjs +1 -1
- package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +7 -4
- package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +4 -4
- package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -1
- package/dist/cjs/tools/handlers.cjs +2 -1
- package/dist/cjs/tools/handlers.cjs.map +1 -1
- package/dist/cjs/tools/local/CompileCheckTool.cjs.map +1 -1
- package/dist/cjs/tools/local/FileCheckpointer.cjs +2 -1
- package/dist/cjs/tools/local/FileCheckpointer.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalCodingTools.cjs +45 -19
- package/dist/cjs/tools/local/LocalCodingTools.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalExecutionEngine.cjs +3 -3
- package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalExecutionTools.cjs +2 -2
- package/dist/cjs/tools/local/LocalExecutionTools.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +4 -3
- package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/local/attachments.cjs +0 -5
- package/dist/cjs/tools/local/attachments.cjs.map +1 -1
- package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +4 -4
- package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
- package/dist/cjs/tools/search/firecrawl.cjs +1 -1
- package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
- package/dist/cjs/tools/search/rerankers.cjs +7 -3
- package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
- package/dist/cjs/tools/search/tavily-search.cjs +1 -1
- package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs +76 -8
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
- package/dist/cjs/utils/handlers.cjs +1 -1
- package/dist/cjs/utils/handlers.cjs.map +1 -1
- package/dist/cjs/utils/run.cjs +1 -1
- package/dist/cjs/utils/run.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +3 -2
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/events.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +200 -54
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/hooks/createWorkspacePolicyHook.mjs +13 -7
- package/dist/esm/hooks/createWorkspacePolicyHook.mjs.map +1 -1
- package/dist/esm/hooks/executeHooks.mjs.map +1 -1
- package/dist/esm/hooks/types.mjs.map +1 -1
- package/dist/esm/instrumentation.mjs +2 -2
- package/dist/esm/instrumentation.mjs.map +1 -1
- package/dist/esm/langfuse.mjs +17 -2
- package/dist/esm/langfuse.mjs.map +1 -1
- package/dist/esm/langfuseToolOutputTracing.mjs +2 -2
- package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
- package/dist/esm/llm/anthropic/index.mjs +1 -1
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +38 -3
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs +6 -2
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +2 -2
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/bedrock/toolCache.mjs +8 -5
- package/dist/esm/llm/bedrock/toolCache.mjs.map +1 -1
- package/dist/esm/llm/fake.mjs +16 -14
- package/dist/esm/llm/fake.mjs.map +1 -1
- package/dist/esm/llm/google/index.mjs +23 -1
- package/dist/esm/llm/google/index.mjs.map +1 -1
- package/dist/esm/llm/google/utils/common.mjs +88 -27
- package/dist/esm/llm/google/utils/common.mjs.map +1 -1
- package/dist/esm/llm/init.mjs +2 -2
- package/dist/esm/llm/invoke.mjs +104 -7
- package/dist/esm/llm/invoke.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +1 -1
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs +1 -1
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/llm/vertexai/index.mjs.map +1 -1
- package/dist/esm/main.mjs +1 -1
- package/dist/esm/messages/cache.mjs +29 -8
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/content.mjs.map +1 -1
- package/dist/esm/messages/contextPruning.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +129 -18
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/messages/reducer.mjs +1 -1
- package/dist/esm/messages/reducer.mjs.map +1 -1
- package/dist/esm/messages/tools.mjs +1 -1
- package/dist/esm/messages/tools.mjs.map +1 -1
- package/dist/esm/openai/index.mjs.map +1 -1
- package/dist/esm/responses/index.mjs.map +1 -1
- package/dist/esm/run.mjs +41 -20
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/session/AgentSession.mjs +4 -4
- package/dist/esm/session/AgentSession.mjs.map +1 -1
- package/dist/esm/session/JsonlSessionStore.mjs +2 -2
- package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
- package/dist/esm/session/handlers.mjs +2 -2
- package/dist/esm/session/handlers.mjs.map +1 -1
- package/dist/esm/stream.mjs +248 -25
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs +1 -1
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/Calculator.mjs +1 -1
- package/dist/esm/tools/Calculator.mjs.map +1 -1
- package/dist/esm/tools/CodeExecutor.mjs +1 -1
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/SubagentTool.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +37 -18
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/ToolSearch.mjs +1 -1
- package/dist/esm/tools/ToolSearch.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +7 -4
- package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +4 -4
- package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -1
- package/dist/esm/tools/handlers.mjs +2 -1
- package/dist/esm/tools/handlers.mjs.map +1 -1
- package/dist/esm/tools/local/CompileCheckTool.mjs.map +1 -1
- package/dist/esm/tools/local/FileCheckpointer.mjs +2 -1
- package/dist/esm/tools/local/FileCheckpointer.mjs.map +1 -1
- package/dist/esm/tools/local/LocalCodingTools.mjs +45 -19
- package/dist/esm/tools/local/LocalCodingTools.mjs.map +1 -1
- package/dist/esm/tools/local/LocalExecutionEngine.mjs +3 -3
- package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
- package/dist/esm/tools/local/LocalExecutionTools.mjs +2 -2
- package/dist/esm/tools/local/LocalExecutionTools.mjs.map +1 -1
- package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +4 -3
- package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/local/attachments.mjs +0 -5
- package/dist/esm/tools/local/attachments.mjs.map +1 -1
- package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +4 -4
- package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
- package/dist/esm/tools/search/firecrawl.mjs +1 -1
- package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
- package/dist/esm/tools/search/rerankers.mjs +8 -4
- package/dist/esm/tools/search/rerankers.mjs.map +1 -1
- package/dist/esm/tools/search/tavily-search.mjs +1 -1
- package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs +76 -9
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
- package/dist/esm/utils/handlers.mjs +1 -1
- package/dist/esm/utils/handlers.mjs.map +1 -1
- package/dist/esm/utils/run.mjs +1 -1
- package/dist/esm/utils/run.mjs.map +1 -1
- package/dist/types/agents/__tests__/promptCacheLiveHelpers.d.ts +1 -1
- package/dist/types/events.d.ts +1 -1
- package/dist/types/graphs/Graph.d.ts +7 -1
- package/dist/types/hooks/executeHooks.d.ts +1 -1
- package/dist/types/hooks/types.d.ts +5 -0
- package/dist/types/langfuse.d.ts +4 -0
- package/dist/types/llm/anthropic/utils/message_inputs.d.ts +1 -1
- package/dist/types/llm/anthropic/utils/message_outputs.d.ts +1 -1
- package/dist/types/llm/anthropic/utils/output_parsers.d.ts +2 -2
- package/dist/types/llm/bedrock/index.d.ts +2 -2
- package/dist/types/llm/fake.d.ts +3 -3
- package/dist/types/llm/google/index.d.ts +1 -0
- package/dist/types/llm/google/types.d.ts +1 -1
- package/dist/types/llm/google/utils/common.d.ts +2 -2
- package/dist/types/llm/google/utils/tools.d.ts +1 -1
- package/dist/types/llm/google/utils/zod_to_genai_parameters.d.ts +1 -1
- package/dist/types/llm/openai/index.d.ts +2 -2
- package/dist/types/llm/openai/utils/index.d.ts +1 -1
- package/dist/types/llm/openrouter/index.d.ts +4 -4
- package/dist/types/messages/contextPruning.d.ts +1 -1
- package/dist/types/messages/format.d.ts +14 -4
- package/dist/types/messages/prune.d.ts +1 -1
- package/dist/types/session/JsonlSessionStore.d.ts +1 -1
- package/dist/types/session/handlers.d.ts +1 -1
- package/dist/types/session/types.d.ts +1 -1
- package/dist/types/summarization/node.d.ts +1 -1
- package/dist/types/tools/SubagentTool.d.ts +2 -2
- package/dist/types/tools/ToolNode.d.ts +9 -2
- package/dist/types/tools/cloudflare/CloudflareSandboxExecutionEngine.d.ts +1 -1
- package/dist/types/tools/search/types.d.ts +1 -1
- package/dist/types/tools/search/utils.d.ts +11 -0
- package/dist/types/types/graph.d.ts +4 -4
- package/dist/types/types/llm.d.ts +4 -3
- package/dist/types/types/messages.d.ts +1 -1
- package/dist/types/types/run.d.ts +6 -6
- package/dist/types/types/stream.d.ts +2 -2
- package/dist/types/types/tools.d.ts +5 -1
- package/dist/types/utils/handlers.d.ts +2 -2
- package/dist/types/utils/run.d.ts +1 -1
- package/package.json +13 -10
- package/src/__tests__/stream.eagerEventExecution.test.ts +543 -6
- package/src/agents/AgentContext.ts +2 -2
- package/src/agents/__tests__/AgentContext.test.ts +3 -3
- package/src/agents/__tests__/promptCacheLiveHelpers.ts +1 -1
- package/src/events.ts +1 -1
- package/src/graphs/Graph.ts +329 -72
- package/src/graphs/MultiAgentGraph.ts +1 -1
- package/src/graphs/__tests__/Graph.reasoning.test.ts +919 -6
- package/src/graphs/__tests__/MultiAgentGraph.test.ts +1 -1
- package/src/graphs/__tests__/composition.smoke.test.ts +1 -1
- package/src/hooks/__tests__/HookRegistry.test.ts +1 -1
- package/src/hooks/__tests__/compactHooks.test.ts +8 -8
- package/src/hooks/__tests__/createWorkspacePolicyHook.test.ts +34 -22
- package/src/hooks/__tests__/executeHooks.test.ts +3 -3
- package/src/hooks/__tests__/integration.test.ts +3 -3
- package/src/hooks/__tests__/toolHooks.test.ts +10 -10
- package/src/hooks/createWorkspacePolicyHook.ts +17 -14
- package/src/hooks/executeHooks.ts +1 -1
- package/src/hooks/types.ts +5 -0
- package/src/instrumentation.ts +11 -11
- package/src/langfuse.ts +35 -1
- package/src/langfuseToolOutputTracing.ts +2 -2
- package/src/llm/anthropic/index.ts +1 -1
- package/src/llm/anthropic/llm.spec.ts +36 -0
- package/src/llm/anthropic/utils/message_inputs.ts +46 -4
- package/src/llm/anthropic/utils/message_outputs.ts +9 -7
- package/src/llm/anthropic/utils/output_parsers.ts +5 -5
- package/src/llm/anthropic/utils/streaming-tool-input.test.ts +186 -0
- package/src/llm/bedrock/index.ts +4 -4
- package/src/llm/bedrock/toolCache.test.ts +48 -9
- package/src/llm/bedrock/toolCache.ts +11 -6
- package/src/llm/fake.ts +30 -25
- package/src/llm/google/index.ts +43 -1
- package/src/llm/google/llm.spec.ts +173 -1
- package/src/llm/google/types.ts +1 -1
- package/src/llm/google/utils/common.ts +154 -45
- package/src/llm/google/utils/tools.ts +8 -8
- package/src/llm/google/utils/zod_to_genai_parameters.ts +4 -4
- package/src/llm/invoke.test.ts +3 -3
- package/src/llm/invoke.ts +170 -10
- package/src/llm/openai/index.ts +4 -4
- package/src/llm/openai/utils/index.ts +14 -14
- package/src/llm/openrouter/index.ts +4 -4
- package/src/llm/openrouter/reasoning.test.ts +2 -2
- package/src/llm/vertexai/fixThoughtSignatures.test.ts +1 -1
- package/src/llm/vertexai/index.ts +1 -1
- package/src/messages/cache.test.ts +144 -0
- package/src/messages/cache.ts +50 -13
- package/src/messages/content.ts +1 -1
- package/src/messages/contextPruning.ts +1 -1
- package/src/messages/format.ts +236 -43
- package/src/messages/formatAgentMessages.skills.test.ts +205 -26
- package/src/messages/formatAgentMessages.test.ts +841 -10
- package/src/messages/labelContentByAgent.test.ts +2 -2
- package/src/messages/prune.ts +1 -1
- package/src/messages/reducer.ts +1 -1
- package/src/messages/tools.ts +1 -1
- package/src/openai/__tests__/openai.test.ts +2 -2
- package/src/openai/index.ts +1 -1
- package/src/responses/__tests__/responses.test.ts +2 -2
- package/src/responses/index.ts +1 -1
- package/src/run.ts +68 -41
- package/src/session/AgentSession.ts +6 -6
- package/src/session/JsonlSessionStore.ts +3 -3
- package/src/session/__tests__/JsonlSessionStore.test.ts +5 -5
- package/src/session/__tests__/handlers.test.ts +2 -2
- package/src/session/handlers.ts +5 -5
- package/src/session/types.ts +1 -1
- package/src/specs/agent-handoffs.test.ts +1 -1
- package/src/specs/langfuse-callbacks.test.ts +2 -2
- package/src/specs/langfuse-metadata.test.ts +39 -0
- package/src/specs/langfuse-tool-output-tracing.test.ts +1 -1
- package/src/specs/multi-agent-summarization.test.ts +4 -4
- package/src/specs/subagent.test.ts +3 -3
- package/src/specs/summarization-unit.test.ts +1 -1
- package/src/specs/thinking-handoff.test.ts +1 -1
- package/src/splitStream.test.ts +48 -0
- package/src/stream.test.ts +53 -3
- package/src/stream.ts +450 -39
- package/src/summarization/__tests__/aggregator.test.ts +2 -2
- package/src/summarization/__tests__/node.test.ts +2 -2
- package/src/summarization/node.ts +1 -1
- package/src/tools/BashProgrammaticToolCalling.ts +5 -5
- package/src/tools/Calculator.ts +1 -1
- package/src/tools/CodeExecutor.ts +2 -4
- package/src/tools/SubagentTool.ts +2 -2
- package/src/tools/ToolNode.ts +37 -16
- package/src/tools/ToolSearch.ts +1 -1
- package/src/tools/__tests__/CloudflareSandboxExecution.test.ts +4 -4
- package/src/tools/__tests__/CodeApiAuthHeaders.test.ts +12 -12
- package/src/tools/__tests__/LocalExecutionTools.test.ts +125 -93
- package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +29 -5
- package/src/tools/__tests__/ReadFile.test.ts +1 -1
- package/src/tools/__tests__/SkillTool.test.ts +4 -4
- package/src/tools/__tests__/SubagentExecutor.test.ts +17 -13
- package/src/tools/__tests__/SubagentTool.test.ts +2 -2
- package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +1 -1
- package/src/tools/__tests__/ToolNode.outputReferences.test.ts +2 -5
- package/src/tools/__tests__/ToolNode.session.test.ts +1 -1
- package/src/tools/__tests__/ToolSearch.test.ts +1 -1
- package/src/tools/__tests__/annotateMessagesForLLM.test.ts +1 -1
- package/src/tools/__tests__/directToolHITLResumeScope.test.ts +35 -32
- package/src/tools/__tests__/directToolHooks.test.ts +41 -0
- package/src/tools/__tests__/handlers.test.ts +2 -2
- package/src/tools/__tests__/hitl.test.ts +11 -11
- package/src/tools/__tests__/localToolNames.test.ts +8 -6
- package/src/tools/__tests__/skillCatalog.test.ts +1 -1
- package/src/tools/__tests__/subagentHooks.test.ts +20 -10
- package/src/tools/__tests__/workspaceSeam.test.ts +20 -7
- package/src/tools/cloudflare/CloudflareSandboxExecutionEngine.ts +9 -6
- package/src/tools/cloudflare/CloudflareSandboxTools.ts +19 -19
- package/src/tools/handlers.ts +5 -5
- package/src/tools/local/CompileCheckTool.ts +4 -7
- package/src/tools/local/FileCheckpointer.ts +6 -5
- package/src/tools/local/LocalCodingTools.ts +100 -45
- package/src/tools/local/LocalExecutionEngine.ts +5 -5
- package/src/tools/local/LocalExecutionTools.ts +9 -9
- package/src/tools/local/LocalProgrammaticToolCalling.ts +5 -4
- package/src/tools/local/attachments.ts +0 -6
- package/src/tools/local/resolveLocalExecutionTools.ts +15 -15
- package/src/tools/search/firecrawl.ts +1 -1
- package/src/tools/search/jina-reranker.test.ts +148 -37
- package/src/tools/search/rerankers.ts +14 -4
- package/src/tools/search/tavily-search.ts +2 -2
- package/src/tools/search/types.ts +1 -1
- package/src/tools/search/utils.ts +99 -9
- package/src/tools/subagent/SubagentExecutor.ts +12 -6
- package/src/types/graph.ts +12 -12
- package/src/types/llm.ts +7 -6
- package/src/types/messages.ts +1 -1
- package/src/types/run.ts +7 -7
- package/src/types/stream.ts +2 -2
- package/src/types/tools.ts +5 -1
- package/src/utils/handlers.ts +2 -2
- package/src/utils/llmConfig.ts +1 -1
- package/src/utils/logging.ts +20 -10
- package/src/utils/run.ts +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.cjs","sources":["../../../src/summarization/node.ts"],"sourcesContent":["import {\n AIMessage,\n ToolMessage,\n HumanMessage,\n SystemMessage,\n} from '@langchain/core/messages';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type { UsageMetadata, BaseMessage } from '@langchain/core/messages';\nimport type { AgentContext } from '@/agents/AgentContext';\nimport type { HookRegistry } from '@/hooks';\nimport type { OnChunk } from '@/llm/invoke';\nimport type * as t from '@/types';\nimport { ContentTypes, GraphEvents, StepTypes, Providers } from '@/common';\nimport { safeDispatchCustomEvent, emitAgentLog } from '@/utils/events';\nimport { attemptInvoke, tryFallbackProviders } from '@/llm/invoke';\nimport { createRemoveAllMessage } from '@/messages/reducer';\nimport { splitAtRecencyBoundary } from '@/messages/recency';\nimport { getMaxOutputTokensKey } from '@/llm/request';\nimport { addCacheControl } from '@/messages/cache';\nimport { initializeModel } from '@/llm/init';\nimport { getChunkContent } from '@/stream';\nimport { executeHooks } from '@/hooks';\n\nconst SUMMARIZATION_PARAM_KEYS = new Set(['maxSummaryTokens']);\n\n/**\n * Default number of recent user-led turns preserved verbatim during\n * compaction. A turn begins at a HumanMessage and includes every\n * following AIMessage and ToolMessage up to the next HumanMessage.\n * The most recent turn is always retained regardless of this value;\n * the default of `2` additionally keeps the prior exchange so the\n * model has fresh context on what just happened. Setting\n * `retainRecent.turns` to `0` reverts to the legacy \"summarize every\n * message\" behavior.\n */\nconst DEFAULT_RETAIN_RECENT_TURNS = 2;\n\n/**\n * Token overhead of the XML wrapper + instruction text added around the\n * summary at injection time in AgentContext.buildSystemRunnable:\n * `<summary>\\n${text}\\n</summary>\\n\\nYour context window was compacted...`\n * ~33 tokens on Anthropic, ~24-27 on OpenAI. Using 33 as a safe ceiling.\n */\nconst SUMMARY_WRAPPER_OVERHEAD_TOKENS = 33;\n\n/** Structured checkpoint prompt for fresh summarization (no prior summary). */\nexport const DEFAULT_SUMMARIZATION_PROMPT = `Hold on, before you continue I need you to write me a checkpoint of everything so far. Your context window is filling up and this checkpoint replaces the messages above, so capture everything you need to pick right back up.\n\nDon't second-guess or fact-check anything you did, your tool results reflect exactly what happened. If a tool result appears truncated, that's just a display artifact from context management: the tool executed fully. Just record what you did and what you observed. Only the checkpoint, don't respond to me or continue the conversation.\n\n## Checkpoint\n\n## Goal\nWhat I asked you to do and any sub-goals you identified.\n\n## Constraints & Preferences\nAny rules, preferences, or configuration I established.\n\n## Progress\n### Done\n- What you completed and the outcomes\n\n### In Progress\n- What you're currently working on\n\n## Key Decisions\nDecisions you made and why.\n\n## Next Steps\nConcrete task actions remaining, in priority order.\n\n## Critical Context\nExact identifiers, names, error messages, URLs, and details you need to preserve verbatim.\n\nRules:\n- Record what you did and observed, don't judge or re-evaluate it\n- For each tool call: the tool name, key inputs, and the outcome\n- Preserve exact identifiers, names, errors, and references verbatim\n- Short declarative sentences\n- Skip empty sections`;\n\n/** Prompt for re-compaction when a prior summary exists. */\nexport const DEFAULT_UPDATE_SUMMARIZATION_PROMPT = `Hold on again, update your checkpoint. Merge the new messages into your existing checkpoint and give me a single consolidated replacement.\n\nKeep it roughly the same length as your last checkpoint. Compress older details to make room for what's new, don't just append. Give recent actions more detail, compress older items to one-liners.\n\nDon't fact-check or second-guess anything, your tool results are ground truth. If a tool result appears truncated, that's just a display artifact: the tool executed fully. Only the checkpoint, don't respond to me or continue the conversation.\n\nRules:\n- Merge new progress into existing sections, don't duplicate headers\n- Compress older completed items into one-line entries\n- Move items from \"In Progress\" to \"Done\" when you completed them\n- Update \"Next Steps\" to reflect current task priorities.\n- For each new tool call: the tool name, key inputs, and the outcome\n- Preserve exact identifiers, names, errors, and references verbatim\n- Skip empty sections`;\n\nfunction separateParameters(parameters: Record<string, unknown>): {\n llmParams: Record<string, unknown>;\n maxSummaryTokens?: number;\n} {\n const llmParams: Record<string, unknown> = {};\n let maxSummaryTokens: number | undefined;\n\n for (const [key, value] of Object.entries(parameters)) {\n if (SUMMARIZATION_PARAM_KEYS.has(key)) {\n if (\n key === 'maxSummaryTokens' &&\n typeof value === 'number' &&\n value > 0\n ) {\n maxSummaryTokens = value;\n }\n } else {\n llmParams[key] = value;\n }\n }\n\n return { llmParams, maxSummaryTokens };\n}\n\n/**\n * Generates a structural metadata summary without making an LLM call.\n * Used as a last-resort fallback when all summarization attempts fail.\n * Preserves tool names and message counts so the agent retains basic context.\n */\nfunction generateMetadataStub(messages: BaseMessage[]): string {\n const counts: Record<string, number> = {};\n const toolNames = new Set<string>();\n\n for (const msg of messages) {\n const role = msg.getType();\n counts[role] = (counts[role] ?? 0) + 1;\n\n if (role === 'tool' && msg.name != null && msg.name !== '') {\n toolNames.add(msg.name);\n }\n\n if (\n role === 'ai' &&\n msg instanceof AIMessage &&\n msg.tool_calls &&\n msg.tool_calls.length > 0\n ) {\n for (const tc of msg.tool_calls) {\n toolNames.add(tc.name);\n }\n }\n }\n\n const countParts = Object.entries(counts)\n .map(([role, count]) => `${count} ${role}`)\n .join(', ');\n\n const lines = [\n `[Metadata summary: ${messages.length} messages (${countParts})]`,\n ];\n\n if (toolNames.size > 0) {\n lines.push(`[Tools used: ${Array.from(toolNames).join(', ')}]`);\n }\n\n return lines.join('\\n');\n}\n\n/** Maximum number of tool failures to include in the enrichment section. */\nconst MAX_TOOL_FAILURES = 8;\n/** Maximum chars per failure summary line. */\nconst MAX_TOOL_FAILURE_CHARS = 240;\n\n/**\n * Extracts failed tool results from messages and formats them as a structured\n * section. LLMs often omit specific failure details (exit codes, error messages)\n * from their summaries, this mechanical enrichment guarantees they survive.\n */\nfunction extractToolFailuresSection(messages: BaseMessage[]): string {\n const failures: Array<{ toolName: string; summary: string }> = [];\n const seen = new Set<string>();\n\n for (const msg of messages) {\n if (msg.getType() !== 'tool') {\n continue;\n }\n const toolMsg = msg as ToolMessage;\n if (toolMsg.status !== 'error') {\n continue;\n }\n // Deduplicate by tool_call_id\n const callId = toolMsg.tool_call_id;\n if (callId && seen.has(callId)) {\n continue;\n }\n if (callId) {\n seen.add(callId);\n }\n\n const toolName = toolMsg.name ?? 'tool';\n const content =\n typeof toolMsg.content === 'string'\n ? toolMsg.content\n : JSON.stringify(toolMsg.content);\n const normalized = content.replace(/\\s+/g, ' ').trim();\n const summary =\n normalized.length > MAX_TOOL_FAILURE_CHARS\n ? `${normalized.slice(0, MAX_TOOL_FAILURE_CHARS - 3)}...`\n : normalized;\n\n failures.push({ toolName, summary });\n }\n\n if (failures.length === 0) {\n return '';\n }\n\n const lines = failures\n .slice(0, MAX_TOOL_FAILURES)\n .map((f) => `- ${f.toolName}: ${f.summary}`);\n if (failures.length > MAX_TOOL_FAILURES) {\n lines.push(`- ...and ${failures.length - MAX_TOOL_FAILURES} more`);\n }\n\n return `\\n\\n## Tool Failures\\n${lines.join('\\n')}`;\n}\n\n/**\n * Appends mechanical enrichment sections to an LLM-generated summary.\n * Tool failures are appended verbatim because LLMs often omit specific\n * error details from their summaries.\n */\nfunction enrichSummary(summaryText: string, messages: BaseMessage[]): string {\n return summaryText + extractToolFailuresSection(messages);\n}\n\n/**\n * Restores pre-masking tool content onto the messages array using\n * `pendingOriginalToolContent` stored on AgentContext. Only allocates\n * a new array when there are entries to restore; otherwise returns the\n * input reference unchanged.\n */\nfunction restoreOriginalToolContent(\n messages: BaseMessage[],\n originalToolContent: Map<number, string> | undefined\n): BaseMessage[] {\n if (originalToolContent == null || originalToolContent.size === 0) {\n return messages;\n }\n const restored = [...messages];\n for (const [idx, content] of originalToolContent) {\n const msg = restored[idx];\n if (msg instanceof ToolMessage) {\n restored[idx] = new ToolMessage({\n content,\n tool_call_id: msg.tool_call_id,\n name: msg.name,\n id: msg.id,\n additional_kwargs: msg.additional_kwargs,\n response_metadata: msg.response_metadata,\n });\n }\n }\n return restored;\n}\n\n// ---------------------------------------------------------------------------\n// Extracted helpers for createSummarizeNode\n// ---------------------------------------------------------------------------\n\ninterface SummarizationClientConfig {\n provider: string;\n modelName?: string;\n clientOptions: Record<string, unknown>;\n effectiveMaxSummaryTokens?: number;\n promptText: string;\n updatePromptText: string;\n}\n\n/** Assembles the summarization model's client options from agent and config. */\nfunction buildSummarizationClientConfig(\n agentContext: AgentContext,\n summarizationConfig?: t.SummarizationConfig\n): SummarizationClientConfig {\n const provider = (summarizationConfig?.provider ??\n agentContext.provider) as string;\n const modelName = summarizationConfig?.model;\n const parameters = summarizationConfig?.parameters ?? {};\n const promptText =\n summarizationConfig?.prompt ?? DEFAULT_SUMMARIZATION_PROMPT;\n const updatePromptText =\n summarizationConfig?.updatePrompt ?? DEFAULT_UPDATE_SUMMARIZATION_PROMPT;\n\n const { llmParams, maxSummaryTokens: paramMaxSummaryTokens } =\n separateParameters(parameters);\n\n const isSelfSummarize = provider === (agentContext.provider as string);\n const baseOptions =\n isSelfSummarize && agentContext.clientOptions\n ? { ...agentContext.clientOptions }\n : {};\n\n const clientOptions: Record<string, unknown> = {\n ...baseOptions,\n ...llmParams,\n };\n\n if (modelName != null && modelName !== '') {\n clientOptions.model = modelName;\n clientOptions.modelName = modelName;\n }\n\n const effectiveMaxSummaryTokens =\n paramMaxSummaryTokens ?? summarizationConfig?.maxSummaryTokens;\n\n if (effectiveMaxSummaryTokens != null) {\n clientOptions[getMaxOutputTokensKey(provider)] = effectiveMaxSummaryTokens;\n }\n\n return {\n provider,\n modelName,\n clientOptions,\n effectiveMaxSummaryTokens,\n promptText,\n updatePromptText,\n };\n}\n\n/** Computes the token count for a summary, preferring provider output tokens when available. */\nfunction computeSummaryTokenCount(\n summaryText: string,\n summaryUsage: Partial<UsageMetadata> | undefined,\n tokenCounter?: (message: BaseMessage) => number\n): number {\n const providerOutputTokens = Number(summaryUsage?.output_tokens) || 0;\n if (providerOutputTokens > 0) {\n return providerOutputTokens + SUMMARY_WRAPPER_OVERHEAD_TOKENS;\n }\n if (tokenCounter) {\n return (\n tokenCounter(new SystemMessage(summaryText)) +\n SUMMARY_WRAPPER_OVERHEAD_TOKENS\n );\n }\n return 0;\n}\n\n/** Constructs the SummaryContentBlock persisted in the run step and dispatched to events. */\nfunction buildSummaryBlock(params: {\n summaryText: string;\n tokenCount: number;\n stepId: string;\n stepIndex: number;\n modelName?: string;\n provider: string;\n summaryVersion: number;\n}): t.SummaryContentBlock {\n return {\n type: ContentTypes.SUMMARY,\n content: [\n {\n type: ContentTypes.TEXT,\n text: params.summaryText,\n } as t.MessageContentComplex,\n ],\n tokenCount: params.tokenCount,\n summaryVersion: params.summaryVersion,\n boundary: {\n messageId: params.stepId,\n contentIndex: params.stepIndex,\n },\n model: params.modelName,\n provider: params.provider,\n createdAt: new Date().toISOString(),\n };\n}\n\ntype LogFn = (\n level: 'debug' | 'info' | 'warn' | 'error',\n message: string,\n data?: Record<string, unknown>\n) => void;\n\n/**\n * Extracts an HTTP status code from a thrown LLM-provider error. Returns\n * `undefined` for non-object values (including `null` or `undefined`, both\n * valid `throw` targets in JS) so callers never dereference a nullish\n * value.\n */\nfunction extractHttpStatus(err: unknown): number | undefined {\n if (err == null || typeof err !== 'object') {\n return undefined;\n }\n const errRecord = err as Record<string, unknown>;\n const direct = errRecord.status;\n if (typeof direct === 'number') {\n return direct;\n }\n const statusCode = errRecord.statusCode;\n if (typeof statusCode === 'number') {\n return statusCode;\n }\n const response = errRecord.response;\n if (response != null && typeof response === 'object') {\n const nested = (response as Record<string, unknown>).status;\n if (typeof nested === 'number') {\n return nested;\n }\n }\n return undefined;\n}\n\n/**\n * Formats a provider-level error for logging. Returns both a human-readable\n * suffix (safe to include in the message string so it survives any host-side\n * formatter) and a structured metadata bag for rich log backends.\n */\nfunction describeProviderError(\n err: unknown,\n provider: string,\n modelName?: string\n): { suffix: string; data: Record<string, unknown> } {\n const providerLabel = `${provider}/${modelName ?? '(no-model)'}`;\n const errMsg = err instanceof Error ? err.message : String(err);\n\n const data: Record<string, unknown> = {\n provider,\n model: modelName,\n };\n if (err instanceof Error) {\n data.errorName = err.name;\n data.errorStack = err.stack;\n }\n\n const status = extractHttpStatus(err);\n const statusSuffix = status != null ? ` (HTTP ${status})` : '';\n if (status != null) {\n data.status = status;\n }\n\n return {\n suffix: `[${providerLabel}]${statusSuffix}: ${errMsg}`,\n data,\n };\n}\n\n/**\n * Formats an exhausted-fallback error. `tryFallbackProviders` throws the\n * last fallback provider's error, which may be from any of the configured\n * fallbacks — not the primary — so we label the log with the list of\n * fallback providers attempted rather than mis-attributing to the primary.\n *\n * Entries in `fallbacks` are normally strongly typed, but we defend against\n * malformed runtime config (null/undefined entries, missing `provider`\n * field) so a recoverable summarization failure is never promoted to an\n * uncaught exception from inside the logging path.\n */\nfunction describeFallbackError(\n err: unknown,\n fallbacks: unknown\n): { suffix: string; data: Record<string, unknown> } {\n const errMsg = err instanceof Error ? err.message : String(err);\n const list: ReadonlyArray<unknown> = Array.isArray(fallbacks)\n ? fallbacks\n : [];\n const providerNames = list\n .map((f) => {\n if (f == null || typeof f !== 'object') {\n return undefined;\n }\n const raw = (f as { provider?: unknown }).provider;\n return raw != null ? String(raw) : undefined;\n })\n .filter((p): p is string => typeof p === 'string');\n const label =\n providerNames.length > 0\n ? `fallbacks=[${providerNames.join(',')}]`\n : 'no-fallbacks';\n\n const data: Record<string, unknown> = {\n fallbackProviders: providerNames,\n fallbackCount: list.length,\n };\n if (err instanceof Error) {\n data.errorName = err.name;\n data.errorStack = err.stack;\n }\n const status = extractHttpStatus(err);\n const statusSuffix = status != null ? ` (HTTP ${status})` : '';\n if (status != null) {\n data.status = status;\n }\n\n return {\n suffix: `[${label}]${statusSuffix}: ${errMsg}`,\n data,\n };\n}\n\n/**\n * Runs the summarization LLM call with primary + fallback providers,\n * falling back to a metadata stub when all calls fail.\n */\nasync function executeSummarizationWithFallback(params: {\n agentContext: AgentContext;\n messages: BaseMessage[];\n clientConfig: SummarizationClientConfig;\n summarizeConfig?: RunnableConfig;\n stepId: string;\n usePromptCache: boolean;\n log: LogFn;\n}): Promise<{ text: string; usage?: Partial<UsageMetadata> }> {\n const {\n agentContext,\n messages,\n clientConfig,\n summarizeConfig,\n stepId,\n usePromptCache,\n log,\n } = params;\n\n const priorSummaryText = agentContext.getSummaryText()?.trim() ?? '';\n\n let summaryText = '';\n let summaryUsage: Partial<UsageMetadata> | undefined;\n\n try {\n /**\n * Initialize inside the try so that a misconfigured provider\n * (e.g. an unrecognized summarization.provider) surfaces through the\n * `log('error', ...)` path below rather than bubbling up silently.\n */\n const summarizationModel = initializeModel({\n provider: clientConfig.provider as Providers,\n clientOptions: clientConfig.clientOptions as t.ClientOptions,\n tools: agentContext.getToolsForBinding(),\n }) as t.ChatModel;\n\n const result = await summarizeWithCacheHit({\n model: summarizationModel,\n messages,\n promptText: clientConfig.promptText,\n updatePromptText: clientConfig.updatePromptText,\n priorSummaryText,\n config: summarizeConfig,\n stepId,\n provider: clientConfig.provider as Providers,\n reasoningKey: agentContext.reasoningKey,\n usePromptCache,\n log,\n });\n summaryText = result.text;\n summaryUsage = result.usage;\n } catch (primaryError) {\n const primaryDescribed = describeProviderError(\n primaryError,\n clientConfig.provider,\n clientConfig.modelName\n );\n log('error', `Summarization LLM call failed ${primaryDescribed.suffix}`, {\n ...primaryDescribed.data,\n messagesToRefineCount: messages.length,\n });\n\n const rawFallbacks = (\n clientConfig.clientOptions as unknown as t.LLMConfig | undefined\n )?.fallbacks;\n const fallbacks = Array.isArray(rawFallbacks) ? rawFallbacks : [];\n if (fallbacks.length > 0) {\n try {\n const onChunk = createSummarizationChunkHandler({\n stepId,\n config: traceConfig(summarizeConfig, 'cache_hit_compaction'),\n provider: clientConfig.provider as Providers,\n reasoningKey: agentContext.reasoningKey,\n });\n const fbResult = await tryFallbackProviders({\n fallbacks,\n tools: agentContext.getToolsForBinding(),\n messages: [\n ...messages,\n new HumanMessage(\n buildSummarizationInstruction(\n clientConfig.promptText,\n clientConfig.updatePromptText,\n priorSummaryText\n )\n ),\n ],\n config: traceConfig(summarizeConfig, 'cache_hit_compaction'),\n primaryError,\n onChunk,\n });\n const fbMsg = fbResult?.messages?.[0];\n if (fbMsg) {\n summaryText = extractResponseText(\n fbMsg as { content: string | object }\n );\n }\n } catch (fbErr) {\n const fbDescribed = describeFallbackError(fbErr, fallbacks);\n log('warn', `Fallback providers also failed ${fbDescribed.suffix}`, {\n ...fbDescribed.data,\n });\n }\n }\n if (!summaryText) {\n log(\n 'warn',\n `Summarization failed, falling back to metadata stub ${primaryDescribed.suffix}`,\n {\n ...primaryDescribed.data,\n messagesToRefineCount: messages.length,\n }\n );\n summaryText = generateMetadataStub(messages);\n }\n }\n\n return { text: summaryText, usage: summaryUsage };\n}\n\n/** Dispatches run step completion, ON_SUMMARIZE_COMPLETE, and rebuilds token map. */\nasync function dispatchCompletionEvents(params: {\n graph: CreateSummarizeNodeParams['graph'];\n runnableConfig?: RunnableConfig;\n stepId: string;\n summaryBlock: t.SummaryContentBlock;\n agentContext: AgentContext;\n runStep: t.RunStep;\n summaryUsage?: Partial<UsageMetadata>;\n agentId: string;\n /**\n * Number of messages preserved verbatim by the recency window after\n * compaction. Reported via the PostCompact hook payload so observers\n * (metrics, cleanup) see the true post-compaction message count\n * instead of always-zero.\n */\n messagesAfterCount: number;\n}): Promise<void> {\n const {\n graph,\n runnableConfig,\n stepId,\n summaryBlock,\n agentContext,\n runStep,\n summaryUsage,\n agentId,\n messagesAfterCount,\n } = params;\n\n runStep.summary = summaryBlock;\n if (summaryUsage) {\n runStep.usage = {\n prompt_tokens: Number(summaryUsage.input_tokens) || 0,\n completion_tokens: Number(summaryUsage.output_tokens) || 0,\n total_tokens:\n (Number(summaryUsage.input_tokens) || 0) +\n (Number(summaryUsage.output_tokens) || 0),\n };\n }\n\n await graph.dispatchRunStepCompleted(\n stepId,\n { type: 'summary', summary: summaryBlock } satisfies t.SummaryCompleted,\n runnableConfig\n );\n\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_COMPLETE,\n {\n id: stepId,\n agentId,\n summary: summaryBlock,\n } satisfies t.SummarizeCompleteEvent,\n runnableConfig\n );\n }\n\n const sessionId = graph.runId ?? '';\n if (graph.hookRegistry?.hasHookFor('PostCompact', sessionId) === true) {\n const threadId = (\n runnableConfig?.configurable as Record<string, unknown> | undefined\n )?.thread_id as string | undefined;\n const firstBlock = summaryBlock.content?.[0];\n const summaryText =\n firstBlock != null &&\n typeof firstBlock === 'object' &&\n 'text' in firstBlock &&\n typeof firstBlock.text === 'string'\n ? firstBlock.text\n : '';\n await executeHooks({\n registry: graph.hookRegistry,\n input: {\n hook_event_name: 'PostCompact',\n runId: sessionId,\n threadId,\n agentId,\n summary: summaryText,\n messagesAfterCount,\n },\n sessionId,\n }).catch(() => {\n /* PostCompact is observational — swallow errors */\n });\n }\n\n agentContext.rebuildTokenMapAfterSummarization({});\n}\n\n// ---------------------------------------------------------------------------\n// createSummarizeNode\n// ---------------------------------------------------------------------------\n\ninterface CreateSummarizeNodeParams {\n agentContext: AgentContext;\n graph: {\n contentData: t.RunStep[];\n contentIndexMap: Map<string, number>;\n config?: RunnableConfig;\n runId?: string;\n isMultiAgent: boolean;\n hookRegistry?: HookRegistry;\n dispatchRunStep: (\n runStep: t.RunStep,\n config?: RunnableConfig\n ) => Promise<void>;\n dispatchRunStepCompleted: (\n stepId: string,\n result: t.StepCompleted,\n config?: RunnableConfig\n ) => Promise<void>;\n };\n generateStepId: (stepKey: string) => [string, number];\n}\n\nexport function createSummarizeNode({\n agentContext,\n graph,\n generateStepId,\n}: CreateSummarizeNodeParams) {\n return async (\n state: {\n messages: BaseMessage[];\n summarizationRequest?: t.SummarizationNodeInput;\n },\n config?: RunnableConfig\n ): Promise<{ summarizationRequest: undefined; messages?: BaseMessage[] }> => {\n const request = state.summarizationRequest;\n if (request == null) {\n return { summarizationRequest: undefined };\n }\n\n const maxCtx = agentContext.maxContextTokens ?? 0;\n if (maxCtx > 0 && agentContext.instructionTokens >= maxCtx) {\n emitAgentLog(\n config,\n 'warn',\n 'summarize',\n 'Summarization skipped, instructions exceed context budget. Reduce the number of tools or increase maxContextTokens.',\n {\n instructionTokens: agentContext.instructionTokens,\n maxContextTokens: maxCtx,\n breakdown: agentContext.formatTokenBudgetBreakdown(),\n },\n { runId: graph.runId, agentId: request.agentId }\n );\n return { summarizationRequest: undefined };\n }\n\n /**\n * Capture the original-tool-content map locally before doing the\n * split. We need it in three places: to restore the head for\n * summarizer quality, to leave intact on the skip path (state is\n * unchanged), and — critically — to carry forward the tail-relevant\n * entries on the summarize-fired path. Clearing it eagerly here\n * would lose the originals for masked tool messages that the\n * recency window keeps in the tail; a future summarization could\n * then only summarize the masked stub instead of the full payload.\n */\n const originalPending = agentContext.pendingOriginalToolContent;\n\n const restoredMessages = restoreOriginalToolContent(\n state.messages,\n originalPending\n );\n\n const runnableConfig = config ?? graph.config;\n\n const retainRecent = agentContext.summarizationConfig?.retainRecent;\n const { head: messagesToRefine, tailStartIndex } = splitAtRecencyBoundary(\n restoredMessages,\n {\n turns: retainRecent?.turns ?? DEFAULT_RETAIN_RECENT_TURNS,\n tokens: retainRecent?.tokens,\n tokenCounter: agentContext.tokenCounter,\n }\n );\n /**\n * Use the *masked* messages for the retained tail so that any\n * truncation prune applied to oversized ToolMessage content stays\n * truncated in live state. The summarizer above reads the restored\n * (full-content) head for summary quality, but reinjecting restored\n * tool payloads into state would defeat masking and bloat the\n * checkpoint, forcing more expensive re-pruning on later turns.\n * `restoreOriginalToolContent` returns an array with identical\n * length and structure to `state.messages` (replacements only at\n * specific indices), so the same tailStartIndex slices both arrays\n * at the same turn boundary.\n */\n const messagesToRetain = state.messages.slice(tailStartIndex);\n\n if (messagesToRefine.length === 0) {\n /**\n * Recency window covers the entire conversation — there is no\n * older content to summarize. Skipping prevents the model from\n * destroying the user's most recent message (e.g. a large pasted\n * payload on the first turn) by replacing it with a generic\n * checkpoint summary. Mark the trigger so the same unchanged\n * state is not re-evaluated on the next prune cycle.\n */\n emitAgentLog(\n config,\n 'debug',\n 'summarize',\n 'Summarization skipped — recency window retains all messages',\n {\n messagesRetained: messagesToRetain.length,\n retainTurns: retainRecent?.turns ?? DEFAULT_RETAIN_RECENT_TURNS,\n },\n { runId: graph.runId, agentId: request.agentId }\n );\n agentContext.markSummarizationTriggered(state.messages.length);\n return { summarizationRequest: undefined };\n }\n\n const clientConfig = buildSummarizationClientConfig(\n agentContext,\n agentContext.summarizationConfig\n );\n\n const stepKey = `summarize-${request.agentId}`;\n const [stepId, stepIndex] = generateStepId(stepKey);\n\n const placeholderSummary: t.SummaryContentBlock = {\n type: ContentTypes.SUMMARY,\n model: clientConfig.modelName,\n provider: clientConfig.provider,\n };\n\n const runStep: t.RunStep = {\n stepIndex,\n id: stepId,\n type: StepTypes.MESSAGE_CREATION,\n index: graph.contentData.length,\n stepDetails: {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: { message_id: stepId },\n },\n summary: placeholderSummary,\n usage: null,\n };\n\n if (graph.runId != null && graph.runId !== '') {\n runStep.runId = graph.runId;\n }\n if (graph.isMultiAgent && agentContext.agentId) {\n runStep.agentId = agentContext.agentId;\n }\n\n await graph.dispatchRunStep(runStep, runnableConfig);\n\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_START,\n {\n agentId: request.agentId,\n provider: clientConfig.provider,\n model: clientConfig.modelName,\n messagesToRefineCount: messagesToRefine.length,\n summaryVersion: agentContext.summaryVersion + 1,\n } satisfies t.SummarizeStartEvent,\n runnableConfig\n );\n }\n\n const sessionId = graph.runId ?? '';\n if (graph.hookRegistry?.hasHookFor('PreCompact', sessionId) === true) {\n const threadId = (\n runnableConfig?.configurable as Record<string, unknown> | undefined\n )?.thread_id as string | undefined;\n await executeHooks({\n registry: graph.hookRegistry,\n input: {\n hook_event_name: 'PreCompact',\n runId: sessionId,\n threadId,\n agentId: request.agentId,\n messagesBeforeCount: messagesToRefine.length,\n trigger: agentContext.summarizationConfig?.trigger?.type ?? 'default',\n },\n sessionId,\n }).catch(() => {\n /* PreCompact is observational — swallow errors */\n });\n }\n\n const isSelfSummarizeModel =\n clientConfig.provider === (agentContext.provider as string);\n const hasPromptCache =\n isSelfSummarizeModel &&\n (agentContext.clientOptions as Record<string, unknown> | undefined)\n ?.promptCache === true;\n\n const log: LogFn = (level, message, data) => {\n emitAgentLog(runnableConfig, level, 'summarize', message, data, {\n runId: graph.runId,\n agentId: request.agentId,\n });\n };\n\n log('debug', 'Summarization starting', {\n messagesToRefineCount: messagesToRefine.length,\n hasPriorSummary: (agentContext.getSummaryText()?.trim() ?? '') !== '',\n summaryVersion: agentContext.summaryVersion + 1,\n isSelfSummarize: isSelfSummarizeModel,\n hasPromptCache,\n provider: clientConfig.provider,\n });\n\n const summarizeConfig: RunnableConfig | undefined = config\n ? {\n ...config,\n metadata: {\n ...config.metadata,\n agent_id: request.agentId,\n summarization_provider: clientConfig.provider,\n summarization_model: clientConfig.modelName,\n },\n }\n : undefined;\n\n const { text: rawText, usage: summaryUsage } =\n await executeSummarizationWithFallback({\n agentContext,\n messages: messagesToRefine,\n clientConfig,\n summarizeConfig,\n stepId,\n usePromptCache: isSelfSummarizeModel && hasPromptCache,\n log,\n });\n\n if (!rawText) {\n agentContext.markSummarizationTriggered(0);\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_COMPLETE,\n {\n id: stepId,\n agentId: request.agentId,\n error: 'Summarization produced empty output',\n } satisfies t.SummarizeCompleteEvent,\n runnableConfig\n );\n }\n return { summarizationRequest: undefined };\n }\n\n const summaryText = enrichSummary(rawText, messagesToRefine);\n\n const tokenCount = computeSummaryTokenCount(\n summaryText,\n summaryUsage,\n agentContext.tokenCounter\n );\n\n agentContext.setSummary(summaryText, tokenCount);\n\n log('info', 'Summary persisted');\n log('debug', 'Summary details', {\n summaryTokens: tokenCount,\n textLength: summaryText.length,\n messagesCompacted: messagesToRefine.length,\n summaryVersion: agentContext.summaryVersion,\n ...(summaryUsage != null\n ? {\n input_tokens: summaryUsage.input_tokens,\n output_tokens: summaryUsage.output_tokens,\n cache_read: summaryUsage.input_token_details?.cache_read,\n cache_creation: summaryUsage.input_token_details?.cache_creation,\n }\n : {}),\n });\n\n const summaryBlock = buildSummaryBlock({\n summaryText,\n tokenCount,\n stepId,\n stepIndex: runStep.index,\n modelName: clientConfig.modelName,\n provider: clientConfig.provider,\n summaryVersion: agentContext.summaryVersion,\n });\n\n await dispatchCompletionEvents({\n graph,\n runnableConfig,\n stepId,\n summaryBlock,\n agentContext,\n runStep,\n summaryUsage,\n agentId: request.agentId,\n messagesAfterCount: messagesToRetain.length,\n });\n\n /**\n * `dispatchCompletionEvents` calls `rebuildTokenMapAfterSummarization({})`\n * which resets the dedupe baseline to 0 — correct under the legacy\n * \"remove-all only\" shape where no messages survived, but stale once\n * the recency window keeps a tail. Realign the baseline to the\n * surviving tail length so a subsequent prune cycle on the unchanged\n * tail short-circuits via `shouldSkipSummarization` instead of\n * looping back into another summarize call.\n */\n agentContext.markSummarizationTriggered(messagesToRetain.length);\n\n /**\n * Carry forward the original-content entries that correspond to the\n * retained tail, reindexed for the post-removeAll state where tail\n * messages start at index 0. Without this, a future summarization\n * that pulls these tail messages into its head would only see the\n * masked stubs (since `setSummary` clears `pruneMessages`, and the\n * fresh pruner at the next turn has no record of prior masks).\n * Entries for indices < `tailStartIndex` belong to messages we just\n * summarized — they are no longer reachable so they are dropped.\n */\n if (originalPending != null && originalPending.size > 0) {\n const tailPending = new Map<number, string>();\n for (const [idx, content] of originalPending) {\n if (idx >= tailStartIndex) {\n tailPending.set(idx - tailStartIndex, content);\n }\n }\n agentContext.pendingOriginalToolContent =\n tailPending.size > 0 ? tailPending : undefined;\n } else {\n agentContext.pendingOriginalToolContent = undefined;\n }\n\n return {\n summarizationRequest: undefined,\n messages:\n messagesToRetain.length > 0\n ? [createRemoveAllMessage(), ...messagesToRetain]\n : [createRemoveAllMessage()],\n };\n };\n}\n\n/** Extracts text from an LLM response, skipping reasoning/thinking blocks. */\nfunction extractResponseText(response: { content: string | object }): string {\n const { content } = response;\n if (typeof content === 'string') {\n return content.trim();\n }\n if (!Array.isArray(content)) {\n return '';\n }\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === 'string') {\n parts.push(block);\n continue;\n }\n if (block == null || typeof block !== 'object') {\n continue;\n }\n const rec = block as Record<string, unknown>;\n if (\n rec.type === ContentTypes.THINKING ||\n rec.type === ContentTypes.REASONING_CONTENT ||\n rec.type === 'redacted_thinking'\n ) {\n continue;\n }\n if (rec.type === 'text' && typeof rec.text === 'string') {\n parts.push(rec.text);\n }\n }\n return parts.join('').trim();\n}\n\nfunction buildSummarizationInstruction(\n promptText: string,\n updatePromptText: string | undefined,\n priorSummaryText: string\n): string {\n const effectivePrompt = priorSummaryText\n ? (updatePromptText ?? promptText)\n : promptText;\n const parts = [effectivePrompt];\n if (priorSummaryText) {\n parts.push(\n `\\n\\n<previous-summary>\\n${priorSummaryText}\\n</previous-summary>`\n );\n }\n return parts.join('');\n}\n\n/** Creates an `onChunk` callback that dispatches `ON_SUMMARIZE_DELTA` events for streaming. */\nfunction createSummarizationChunkHandler({\n stepId,\n config,\n provider,\n reasoningKey = 'reasoning_content',\n}: {\n stepId?: string;\n config?: RunnableConfig;\n provider?: Providers;\n reasoningKey?: 'reasoning_content' | 'reasoning';\n}): OnChunk | undefined {\n if (stepId == null || stepId === '' || !config) {\n return undefined;\n }\n return (chunk) => {\n const chunkAny = chunk as Parameters<typeof getChunkContent>[0]['chunk'];\n const raw = getChunkContent({ chunk: chunkAny, provider, reasoningKey });\n if (raw == null || (typeof raw === 'string' && !raw)) {\n return;\n }\n const contentBlocks: t.MessageContentComplex[] =\n typeof raw === 'string'\n ? [{ type: ContentTypes.TEXT, text: raw } as t.MessageContentComplex]\n : raw;\n\n void safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_DELTA,\n {\n id: stepId,\n delta: {\n summary: {\n type: ContentTypes.SUMMARY,\n content: contentBlocks,\n provider: String(config.metadata?.summarization_provider ?? ''),\n model: String(config.metadata?.summarization_model ?? ''),\n },\n },\n } satisfies t.SummarizeDeltaEvent,\n config\n );\n };\n}\n\nfunction traceConfig(\n config: RunnableConfig | undefined,\n stage: string\n): RunnableConfig | undefined {\n if (!config) {\n return undefined;\n }\n return {\n ...config,\n runName: `summarization:${stage}`,\n metadata: { ...config.metadata, summarization: true, stage },\n };\n}\n\n/**\n * Cache-friendly compaction: sends raw conversation messages with the\n * summarization instruction appended as the final HumanMessage.\n * Providers with prompt caching get a cache hit on the system prompt +\n * tool definitions prefix.\n */\nasync function summarizeWithCacheHit({\n model,\n messages,\n promptText,\n updatePromptText,\n priorSummaryText,\n config,\n stepId,\n provider,\n reasoningKey,\n usePromptCache,\n log,\n}: {\n model: t.ChatModel;\n messages: BaseMessage[];\n promptText: string;\n updatePromptText?: string;\n priorSummaryText: string;\n config?: RunnableConfig;\n stepId?: string;\n provider: Providers;\n reasoningKey?: 'reasoning_content' | 'reasoning';\n usePromptCache?: boolean;\n log?: LogFn;\n}): Promise<{ text: string; usage?: Partial<UsageMetadata> }> {\n const instruction = buildSummarizationInstruction(\n promptText,\n updatePromptText,\n priorSummaryText\n );\n\n const fullMessages = [...messages, new HumanMessage(instruction)];\n const invokeMessages =\n usePromptCache === true ? addCacheControl(fullMessages) : fullMessages;\n\n const result = await attemptInvoke(\n {\n model,\n messages: invokeMessages,\n provider,\n onChunk: createSummarizationChunkHandler({\n stepId,\n config: traceConfig(config, 'cache_hit_compaction'),\n provider,\n reasoningKey,\n }),\n },\n traceConfig(config, 'cache_hit_compaction')\n );\n\n const responseMsg = result.messages?.[0];\n const text = responseMsg\n ? extractResponseText(responseMsg as { content: string | object })\n : '';\n let usage: Partial<UsageMetadata> | undefined;\n let usageSource = 'none';\n if (\n responseMsg != null &&\n 'usage_metadata' in responseMsg &&\n responseMsg.usage_metadata != null\n ) {\n usage = responseMsg.usage_metadata as Partial<UsageMetadata>;\n usageSource = 'usage_metadata';\n } else if (responseMsg != null) {\n const respMeta = responseMsg.response_metadata as\n | Record<string, unknown>\n | undefined;\n const raw = (respMeta?.metadata as Record<string, unknown> | undefined)\n ?.usage as Record<string, unknown> | undefined;\n if (raw != null) {\n usage = {\n input_tokens: Number(raw.inputTokens) || undefined,\n output_tokens: Number(raw.outputTokens) || undefined,\n } as Partial<UsageMetadata>;\n usageSource = 'response_metadata';\n }\n }\n const cacheDetails = (\n usage as\n | {\n input_token_details?: {\n cache_read?: number;\n cache_creation?: number;\n };\n }\n | undefined\n )?.input_token_details;\n log?.('debug', 'Summarization LLM usage', {\n source: usageSource,\n input_tokens: usage?.input_tokens,\n output_tokens: usage?.output_tokens,\n ...(cacheDetails?.cache_read != null || cacheDetails?.cache_creation != null\n ? {\n 'input_token_details.cache_read': cacheDetails.cache_read,\n 'input_token_details.cache_creation': cacheDetails.cache_creation,\n }\n : {}),\n });\n return { text, usage };\n}\n"],"names":["messages","AIMessage","ToolMessage","getMaxOutputTokensKey","SystemMessage","ContentTypes","initializeModel","tryFallbackProviders","HumanMessage","safeDispatchCustomEvent","GraphEvents","executeHooks","emitAgentLog","splitAtRecencyBoundary","StepTypes","createRemoveAllMessage","getChunkContent","addCacheControl","attemptInvoke"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"node.cjs","sources":["../../../src/summarization/node.ts"],"sourcesContent":["import {\n AIMessage,\n ToolMessage,\n HumanMessage,\n SystemMessage,\n} from '@langchain/core/messages';\nimport type { UsageMetadata, BaseMessage } from '@langchain/core/messages';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type { AgentContext } from '@/agents/AgentContext';\nimport type { HookRegistry } from '@/hooks';\nimport type { OnChunk } from '@/llm/invoke';\nimport type * as t from '@/types';\nimport { ContentTypes, GraphEvents, StepTypes, Providers } from '@/common';\nimport { safeDispatchCustomEvent, emitAgentLog } from '@/utils/events';\nimport { attemptInvoke, tryFallbackProviders } from '@/llm/invoke';\nimport { createRemoveAllMessage } from '@/messages/reducer';\nimport { splitAtRecencyBoundary } from '@/messages/recency';\nimport { getMaxOutputTokensKey } from '@/llm/request';\nimport { addCacheControl } from '@/messages/cache';\nimport { initializeModel } from '@/llm/init';\nimport { getChunkContent } from '@/stream';\nimport { executeHooks } from '@/hooks';\n\nconst SUMMARIZATION_PARAM_KEYS = new Set(['maxSummaryTokens']);\n\n/**\n * Default number of recent user-led turns preserved verbatim during\n * compaction. A turn begins at a HumanMessage and includes every\n * following AIMessage and ToolMessage up to the next HumanMessage.\n * The most recent turn is always retained regardless of this value;\n * the default of `2` additionally keeps the prior exchange so the\n * model has fresh context on what just happened. Setting\n * `retainRecent.turns` to `0` reverts to the legacy \"summarize every\n * message\" behavior.\n */\nconst DEFAULT_RETAIN_RECENT_TURNS = 2;\n\n/**\n * Token overhead of the XML wrapper + instruction text added around the\n * summary at injection time in AgentContext.buildSystemRunnable:\n * `<summary>\\n${text}\\n</summary>\\n\\nYour context window was compacted...`\n * ~33 tokens on Anthropic, ~24-27 on OpenAI. Using 33 as a safe ceiling.\n */\nconst SUMMARY_WRAPPER_OVERHEAD_TOKENS = 33;\n\n/** Structured checkpoint prompt for fresh summarization (no prior summary). */\nexport const DEFAULT_SUMMARIZATION_PROMPT = `Hold on, before you continue I need you to write me a checkpoint of everything so far. Your context window is filling up and this checkpoint replaces the messages above, so capture everything you need to pick right back up.\n\nDon't second-guess or fact-check anything you did, your tool results reflect exactly what happened. If a tool result appears truncated, that's just a display artifact from context management: the tool executed fully. Just record what you did and what you observed. Only the checkpoint, don't respond to me or continue the conversation.\n\n## Checkpoint\n\n## Goal\nWhat I asked you to do and any sub-goals you identified.\n\n## Constraints & Preferences\nAny rules, preferences, or configuration I established.\n\n## Progress\n### Done\n- What you completed and the outcomes\n\n### In Progress\n- What you're currently working on\n\n## Key Decisions\nDecisions you made and why.\n\n## Next Steps\nConcrete task actions remaining, in priority order.\n\n## Critical Context\nExact identifiers, names, error messages, URLs, and details you need to preserve verbatim.\n\nRules:\n- Record what you did and observed, don't judge or re-evaluate it\n- For each tool call: the tool name, key inputs, and the outcome\n- Preserve exact identifiers, names, errors, and references verbatim\n- Short declarative sentences\n- Skip empty sections`;\n\n/** Prompt for re-compaction when a prior summary exists. */\nexport const DEFAULT_UPDATE_SUMMARIZATION_PROMPT = `Hold on again, update your checkpoint. Merge the new messages into your existing checkpoint and give me a single consolidated replacement.\n\nKeep it roughly the same length as your last checkpoint. Compress older details to make room for what's new, don't just append. Give recent actions more detail, compress older items to one-liners.\n\nDon't fact-check or second-guess anything, your tool results are ground truth. If a tool result appears truncated, that's just a display artifact: the tool executed fully. Only the checkpoint, don't respond to me or continue the conversation.\n\nRules:\n- Merge new progress into existing sections, don't duplicate headers\n- Compress older completed items into one-line entries\n- Move items from \"In Progress\" to \"Done\" when you completed them\n- Update \"Next Steps\" to reflect current task priorities.\n- For each new tool call: the tool name, key inputs, and the outcome\n- Preserve exact identifiers, names, errors, and references verbatim\n- Skip empty sections`;\n\nfunction separateParameters(parameters: Record<string, unknown>): {\n llmParams: Record<string, unknown>;\n maxSummaryTokens?: number;\n} {\n const llmParams: Record<string, unknown> = {};\n let maxSummaryTokens: number | undefined;\n\n for (const [key, value] of Object.entries(parameters)) {\n if (SUMMARIZATION_PARAM_KEYS.has(key)) {\n if (\n key === 'maxSummaryTokens' &&\n typeof value === 'number' &&\n value > 0\n ) {\n maxSummaryTokens = value;\n }\n } else {\n llmParams[key] = value;\n }\n }\n\n return { llmParams, maxSummaryTokens };\n}\n\n/**\n * Generates a structural metadata summary without making an LLM call.\n * Used as a last-resort fallback when all summarization attempts fail.\n * Preserves tool names and message counts so the agent retains basic context.\n */\nfunction generateMetadataStub(messages: BaseMessage[]): string {\n const counts: Record<string, number> = {};\n const toolNames = new Set<string>();\n\n for (const msg of messages) {\n const role = msg.getType();\n counts[role] = (counts[role] ?? 0) + 1;\n\n if (role === 'tool' && msg.name != null && msg.name !== '') {\n toolNames.add(msg.name);\n }\n\n if (\n role === 'ai' &&\n msg instanceof AIMessage &&\n msg.tool_calls &&\n msg.tool_calls.length > 0\n ) {\n for (const tc of msg.tool_calls) {\n toolNames.add(tc.name);\n }\n }\n }\n\n const countParts = Object.entries(counts)\n .map(([role, count]) => `${count} ${role}`)\n .join(', ');\n\n const lines = [\n `[Metadata summary: ${messages.length} messages (${countParts})]`,\n ];\n\n if (toolNames.size > 0) {\n lines.push(`[Tools used: ${Array.from(toolNames).join(', ')}]`);\n }\n\n return lines.join('\\n');\n}\n\n/** Maximum number of tool failures to include in the enrichment section. */\nconst MAX_TOOL_FAILURES = 8;\n/** Maximum chars per failure summary line. */\nconst MAX_TOOL_FAILURE_CHARS = 240;\n\n/**\n * Extracts failed tool results from messages and formats them as a structured\n * section. LLMs often omit specific failure details (exit codes, error messages)\n * from their summaries, this mechanical enrichment guarantees they survive.\n */\nfunction extractToolFailuresSection(messages: BaseMessage[]): string {\n const failures: Array<{ toolName: string; summary: string }> = [];\n const seen = new Set<string>();\n\n for (const msg of messages) {\n if (msg.getType() !== 'tool') {\n continue;\n }\n const toolMsg = msg as ToolMessage;\n if (toolMsg.status !== 'error') {\n continue;\n }\n // Deduplicate by tool_call_id\n const callId = toolMsg.tool_call_id;\n if (callId && seen.has(callId)) {\n continue;\n }\n if (callId) {\n seen.add(callId);\n }\n\n const toolName = toolMsg.name ?? 'tool';\n const content =\n typeof toolMsg.content === 'string'\n ? toolMsg.content\n : JSON.stringify(toolMsg.content);\n const normalized = content.replace(/\\s+/g, ' ').trim();\n const summary =\n normalized.length > MAX_TOOL_FAILURE_CHARS\n ? `${normalized.slice(0, MAX_TOOL_FAILURE_CHARS - 3)}...`\n : normalized;\n\n failures.push({ toolName, summary });\n }\n\n if (failures.length === 0) {\n return '';\n }\n\n const lines = failures\n .slice(0, MAX_TOOL_FAILURES)\n .map((f) => `- ${f.toolName}: ${f.summary}`);\n if (failures.length > MAX_TOOL_FAILURES) {\n lines.push(`- ...and ${failures.length - MAX_TOOL_FAILURES} more`);\n }\n\n return `\\n\\n## Tool Failures\\n${lines.join('\\n')}`;\n}\n\n/**\n * Appends mechanical enrichment sections to an LLM-generated summary.\n * Tool failures are appended verbatim because LLMs often omit specific\n * error details from their summaries.\n */\nfunction enrichSummary(summaryText: string, messages: BaseMessage[]): string {\n return summaryText + extractToolFailuresSection(messages);\n}\n\n/**\n * Restores pre-masking tool content onto the messages array using\n * `pendingOriginalToolContent` stored on AgentContext. Only allocates\n * a new array when there are entries to restore; otherwise returns the\n * input reference unchanged.\n */\nfunction restoreOriginalToolContent(\n messages: BaseMessage[],\n originalToolContent: Map<number, string> | undefined\n): BaseMessage[] {\n if (originalToolContent == null || originalToolContent.size === 0) {\n return messages;\n }\n const restored = [...messages];\n for (const [idx, content] of originalToolContent) {\n const msg = restored[idx];\n if (msg instanceof ToolMessage) {\n restored[idx] = new ToolMessage({\n content,\n tool_call_id: msg.tool_call_id,\n name: msg.name,\n id: msg.id,\n additional_kwargs: msg.additional_kwargs,\n response_metadata: msg.response_metadata,\n });\n }\n }\n return restored;\n}\n\n// ---------------------------------------------------------------------------\n// Extracted helpers for createSummarizeNode\n// ---------------------------------------------------------------------------\n\ninterface SummarizationClientConfig {\n provider: string;\n modelName?: string;\n clientOptions: Record<string, unknown>;\n effectiveMaxSummaryTokens?: number;\n promptText: string;\n updatePromptText: string;\n}\n\n/** Assembles the summarization model's client options from agent and config. */\nfunction buildSummarizationClientConfig(\n agentContext: AgentContext,\n summarizationConfig?: t.SummarizationConfig\n): SummarizationClientConfig {\n const provider = (summarizationConfig?.provider ??\n agentContext.provider) as string;\n const modelName = summarizationConfig?.model;\n const parameters = summarizationConfig?.parameters ?? {};\n const promptText =\n summarizationConfig?.prompt ?? DEFAULT_SUMMARIZATION_PROMPT;\n const updatePromptText =\n summarizationConfig?.updatePrompt ?? DEFAULT_UPDATE_SUMMARIZATION_PROMPT;\n\n const { llmParams, maxSummaryTokens: paramMaxSummaryTokens } =\n separateParameters(parameters);\n\n const isSelfSummarize = provider === (agentContext.provider as string);\n const baseOptions =\n isSelfSummarize && agentContext.clientOptions\n ? { ...agentContext.clientOptions }\n : {};\n\n const clientOptions: Record<string, unknown> = {\n ...baseOptions,\n ...llmParams,\n };\n\n if (modelName != null && modelName !== '') {\n clientOptions.model = modelName;\n clientOptions.modelName = modelName;\n }\n\n const effectiveMaxSummaryTokens =\n paramMaxSummaryTokens ?? summarizationConfig?.maxSummaryTokens;\n\n if (effectiveMaxSummaryTokens != null) {\n clientOptions[getMaxOutputTokensKey(provider)] = effectiveMaxSummaryTokens;\n }\n\n return {\n provider,\n modelName,\n clientOptions,\n effectiveMaxSummaryTokens,\n promptText,\n updatePromptText,\n };\n}\n\n/** Computes the token count for a summary, preferring provider output tokens when available. */\nfunction computeSummaryTokenCount(\n summaryText: string,\n summaryUsage: Partial<UsageMetadata> | undefined,\n tokenCounter?: (message: BaseMessage) => number\n): number {\n const providerOutputTokens = Number(summaryUsage?.output_tokens) || 0;\n if (providerOutputTokens > 0) {\n return providerOutputTokens + SUMMARY_WRAPPER_OVERHEAD_TOKENS;\n }\n if (tokenCounter) {\n return (\n tokenCounter(new SystemMessage(summaryText)) +\n SUMMARY_WRAPPER_OVERHEAD_TOKENS\n );\n }\n return 0;\n}\n\n/** Constructs the SummaryContentBlock persisted in the run step and dispatched to events. */\nfunction buildSummaryBlock(params: {\n summaryText: string;\n tokenCount: number;\n stepId: string;\n stepIndex: number;\n modelName?: string;\n provider: string;\n summaryVersion: number;\n}): t.SummaryContentBlock {\n return {\n type: ContentTypes.SUMMARY,\n content: [\n {\n type: ContentTypes.TEXT,\n text: params.summaryText,\n } as t.MessageContentComplex,\n ],\n tokenCount: params.tokenCount,\n summaryVersion: params.summaryVersion,\n boundary: {\n messageId: params.stepId,\n contentIndex: params.stepIndex,\n },\n model: params.modelName,\n provider: params.provider,\n createdAt: new Date().toISOString(),\n };\n}\n\ntype LogFn = (\n level: 'debug' | 'info' | 'warn' | 'error',\n message: string,\n data?: Record<string, unknown>\n) => void;\n\n/**\n * Extracts an HTTP status code from a thrown LLM-provider error. Returns\n * `undefined` for non-object values (including `null` or `undefined`, both\n * valid `throw` targets in JS) so callers never dereference a nullish\n * value.\n */\nfunction extractHttpStatus(err: unknown): number | undefined {\n if (err == null || typeof err !== 'object') {\n return undefined;\n }\n const errRecord = err as Record<string, unknown>;\n const direct = errRecord.status;\n if (typeof direct === 'number') {\n return direct;\n }\n const statusCode = errRecord.statusCode;\n if (typeof statusCode === 'number') {\n return statusCode;\n }\n const response = errRecord.response;\n if (response != null && typeof response === 'object') {\n const nested = (response as Record<string, unknown>).status;\n if (typeof nested === 'number') {\n return nested;\n }\n }\n return undefined;\n}\n\n/**\n * Formats a provider-level error for logging. Returns both a human-readable\n * suffix (safe to include in the message string so it survives any host-side\n * formatter) and a structured metadata bag for rich log backends.\n */\nfunction describeProviderError(\n err: unknown,\n provider: string,\n modelName?: string\n): { suffix: string; data: Record<string, unknown> } {\n const providerLabel = `${provider}/${modelName ?? '(no-model)'}`;\n const errMsg = err instanceof Error ? err.message : String(err);\n\n const data: Record<string, unknown> = {\n provider,\n model: modelName,\n };\n if (err instanceof Error) {\n data.errorName = err.name;\n data.errorStack = err.stack;\n }\n\n const status = extractHttpStatus(err);\n const statusSuffix = status != null ? ` (HTTP ${status})` : '';\n if (status != null) {\n data.status = status;\n }\n\n return {\n suffix: `[${providerLabel}]${statusSuffix}: ${errMsg}`,\n data,\n };\n}\n\n/**\n * Formats an exhausted-fallback error. `tryFallbackProviders` throws the\n * last fallback provider's error, which may be from any of the configured\n * fallbacks — not the primary — so we label the log with the list of\n * fallback providers attempted rather than mis-attributing to the primary.\n *\n * Entries in `fallbacks` are normally strongly typed, but we defend against\n * malformed runtime config (null/undefined entries, missing `provider`\n * field) so a recoverable summarization failure is never promoted to an\n * uncaught exception from inside the logging path.\n */\nfunction describeFallbackError(\n err: unknown,\n fallbacks: unknown\n): { suffix: string; data: Record<string, unknown> } {\n const errMsg = err instanceof Error ? err.message : String(err);\n const list: ReadonlyArray<unknown> = Array.isArray(fallbacks)\n ? fallbacks\n : [];\n const providerNames = list\n .map((f) => {\n if (f == null || typeof f !== 'object') {\n return undefined;\n }\n const raw = (f as { provider?: unknown }).provider;\n return raw != null ? String(raw) : undefined;\n })\n .filter((p): p is string => typeof p === 'string');\n const label =\n providerNames.length > 0\n ? `fallbacks=[${providerNames.join(',')}]`\n : 'no-fallbacks';\n\n const data: Record<string, unknown> = {\n fallbackProviders: providerNames,\n fallbackCount: list.length,\n };\n if (err instanceof Error) {\n data.errorName = err.name;\n data.errorStack = err.stack;\n }\n const status = extractHttpStatus(err);\n const statusSuffix = status != null ? ` (HTTP ${status})` : '';\n if (status != null) {\n data.status = status;\n }\n\n return {\n suffix: `[${label}]${statusSuffix}: ${errMsg}`,\n data,\n };\n}\n\n/**\n * Runs the summarization LLM call with primary + fallback providers,\n * falling back to a metadata stub when all calls fail.\n */\nasync function executeSummarizationWithFallback(params: {\n agentContext: AgentContext;\n messages: BaseMessage[];\n clientConfig: SummarizationClientConfig;\n summarizeConfig?: RunnableConfig;\n stepId: string;\n usePromptCache: boolean;\n log: LogFn;\n}): Promise<{ text: string; usage?: Partial<UsageMetadata> }> {\n const {\n agentContext,\n messages,\n clientConfig,\n summarizeConfig,\n stepId,\n usePromptCache,\n log,\n } = params;\n\n const priorSummaryText = agentContext.getSummaryText()?.trim() ?? '';\n\n let summaryText = '';\n let summaryUsage: Partial<UsageMetadata> | undefined;\n\n try {\n /**\n * Initialize inside the try so that a misconfigured provider\n * (e.g. an unrecognized summarization.provider) surfaces through the\n * `log('error', ...)` path below rather than bubbling up silently.\n */\n const summarizationModel = initializeModel({\n provider: clientConfig.provider as Providers,\n clientOptions: clientConfig.clientOptions as t.ClientOptions,\n tools: agentContext.getToolsForBinding(),\n }) as t.ChatModel;\n\n const result = await summarizeWithCacheHit({\n model: summarizationModel,\n messages,\n promptText: clientConfig.promptText,\n updatePromptText: clientConfig.updatePromptText,\n priorSummaryText,\n config: summarizeConfig,\n stepId,\n provider: clientConfig.provider as Providers,\n reasoningKey: agentContext.reasoningKey,\n usePromptCache,\n log,\n });\n summaryText = result.text;\n summaryUsage = result.usage;\n } catch (primaryError) {\n const primaryDescribed = describeProviderError(\n primaryError,\n clientConfig.provider,\n clientConfig.modelName\n );\n log('error', `Summarization LLM call failed ${primaryDescribed.suffix}`, {\n ...primaryDescribed.data,\n messagesToRefineCount: messages.length,\n });\n\n const rawFallbacks = (\n clientConfig.clientOptions as unknown as t.LLMConfig | undefined\n )?.fallbacks;\n const fallbacks = Array.isArray(rawFallbacks) ? rawFallbacks : [];\n if (fallbacks.length > 0) {\n try {\n const onChunk = createSummarizationChunkHandler({\n stepId,\n config: traceConfig(summarizeConfig, 'cache_hit_compaction'),\n provider: clientConfig.provider as Providers,\n reasoningKey: agentContext.reasoningKey,\n });\n const fbResult = await tryFallbackProviders({\n fallbacks,\n tools: agentContext.getToolsForBinding(),\n messages: [\n ...messages,\n new HumanMessage(\n buildSummarizationInstruction(\n clientConfig.promptText,\n clientConfig.updatePromptText,\n priorSummaryText\n )\n ),\n ],\n config: traceConfig(summarizeConfig, 'cache_hit_compaction'),\n primaryError,\n onChunk,\n });\n const fbMsg = fbResult?.messages?.[0];\n if (fbMsg) {\n summaryText = extractResponseText(\n fbMsg as { content: string | object }\n );\n }\n } catch (fbErr) {\n const fbDescribed = describeFallbackError(fbErr, fallbacks);\n log('warn', `Fallback providers also failed ${fbDescribed.suffix}`, {\n ...fbDescribed.data,\n });\n }\n }\n if (!summaryText) {\n log(\n 'warn',\n `Summarization failed, falling back to metadata stub ${primaryDescribed.suffix}`,\n {\n ...primaryDescribed.data,\n messagesToRefineCount: messages.length,\n }\n );\n summaryText = generateMetadataStub(messages);\n }\n }\n\n return { text: summaryText, usage: summaryUsage };\n}\n\n/** Dispatches run step completion, ON_SUMMARIZE_COMPLETE, and rebuilds token map. */\nasync function dispatchCompletionEvents(params: {\n graph: CreateSummarizeNodeParams['graph'];\n runnableConfig?: RunnableConfig;\n stepId: string;\n summaryBlock: t.SummaryContentBlock;\n agentContext: AgentContext;\n runStep: t.RunStep;\n summaryUsage?: Partial<UsageMetadata>;\n agentId: string;\n /**\n * Number of messages preserved verbatim by the recency window after\n * compaction. Reported via the PostCompact hook payload so observers\n * (metrics, cleanup) see the true post-compaction message count\n * instead of always-zero.\n */\n messagesAfterCount: number;\n}): Promise<void> {\n const {\n graph,\n runnableConfig,\n stepId,\n summaryBlock,\n agentContext,\n runStep,\n summaryUsage,\n agentId,\n messagesAfterCount,\n } = params;\n\n runStep.summary = summaryBlock;\n if (summaryUsage) {\n runStep.usage = {\n prompt_tokens: Number(summaryUsage.input_tokens) || 0,\n completion_tokens: Number(summaryUsage.output_tokens) || 0,\n total_tokens:\n (Number(summaryUsage.input_tokens) || 0) +\n (Number(summaryUsage.output_tokens) || 0),\n };\n }\n\n await graph.dispatchRunStepCompleted(\n stepId,\n { type: 'summary', summary: summaryBlock } satisfies t.SummaryCompleted,\n runnableConfig\n );\n\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_COMPLETE,\n {\n id: stepId,\n agentId,\n summary: summaryBlock,\n } satisfies t.SummarizeCompleteEvent,\n runnableConfig\n );\n }\n\n const sessionId = graph.runId ?? '';\n if (graph.hookRegistry?.hasHookFor('PostCompact', sessionId) === true) {\n const threadId = (\n runnableConfig?.configurable as Record<string, unknown> | undefined\n )?.thread_id as string | undefined;\n const firstBlock = summaryBlock.content?.[0];\n const summaryText =\n firstBlock != null &&\n typeof firstBlock === 'object' &&\n 'text' in firstBlock &&\n typeof firstBlock.text === 'string'\n ? firstBlock.text\n : '';\n await executeHooks({\n registry: graph.hookRegistry,\n input: {\n hook_event_name: 'PostCompact',\n runId: sessionId,\n threadId,\n agentId,\n summary: summaryText,\n messagesAfterCount,\n },\n sessionId,\n }).catch(() => {\n /* PostCompact is observational — swallow errors */\n });\n }\n\n agentContext.rebuildTokenMapAfterSummarization({});\n}\n\n// ---------------------------------------------------------------------------\n// createSummarizeNode\n// ---------------------------------------------------------------------------\n\ninterface CreateSummarizeNodeParams {\n agentContext: AgentContext;\n graph: {\n contentData: t.RunStep[];\n contentIndexMap: Map<string, number>;\n config?: RunnableConfig;\n runId?: string;\n isMultiAgent: boolean;\n hookRegistry?: HookRegistry;\n dispatchRunStep: (\n runStep: t.RunStep,\n config?: RunnableConfig\n ) => Promise<void>;\n dispatchRunStepCompleted: (\n stepId: string,\n result: t.StepCompleted,\n config?: RunnableConfig\n ) => Promise<void>;\n };\n generateStepId: (stepKey: string) => [string, number];\n}\n\nexport function createSummarizeNode({\n agentContext,\n graph,\n generateStepId,\n}: CreateSummarizeNodeParams) {\n return async (\n state: {\n messages: BaseMessage[];\n summarizationRequest?: t.SummarizationNodeInput;\n },\n config?: RunnableConfig\n ): Promise<{ summarizationRequest: undefined; messages?: BaseMessage[] }> => {\n const request = state.summarizationRequest;\n if (request == null) {\n return { summarizationRequest: undefined };\n }\n\n const maxCtx = agentContext.maxContextTokens ?? 0;\n if (maxCtx > 0 && agentContext.instructionTokens >= maxCtx) {\n emitAgentLog(\n config,\n 'warn',\n 'summarize',\n 'Summarization skipped, instructions exceed context budget. Reduce the number of tools or increase maxContextTokens.',\n {\n instructionTokens: agentContext.instructionTokens,\n maxContextTokens: maxCtx,\n breakdown: agentContext.formatTokenBudgetBreakdown(),\n },\n { runId: graph.runId, agentId: request.agentId }\n );\n return { summarizationRequest: undefined };\n }\n\n /**\n * Capture the original-tool-content map locally before doing the\n * split. We need it in three places: to restore the head for\n * summarizer quality, to leave intact on the skip path (state is\n * unchanged), and — critically — to carry forward the tail-relevant\n * entries on the summarize-fired path. Clearing it eagerly here\n * would lose the originals for masked tool messages that the\n * recency window keeps in the tail; a future summarization could\n * then only summarize the masked stub instead of the full payload.\n */\n const originalPending = agentContext.pendingOriginalToolContent;\n\n const restoredMessages = restoreOriginalToolContent(\n state.messages,\n originalPending\n );\n\n const runnableConfig = config ?? graph.config;\n\n const retainRecent = agentContext.summarizationConfig?.retainRecent;\n const { head: messagesToRefine, tailStartIndex } = splitAtRecencyBoundary(\n restoredMessages,\n {\n turns: retainRecent?.turns ?? DEFAULT_RETAIN_RECENT_TURNS,\n tokens: retainRecent?.tokens,\n tokenCounter: agentContext.tokenCounter,\n }\n );\n /**\n * Use the *masked* messages for the retained tail so that any\n * truncation prune applied to oversized ToolMessage content stays\n * truncated in live state. The summarizer above reads the restored\n * (full-content) head for summary quality, but reinjecting restored\n * tool payloads into state would defeat masking and bloat the\n * checkpoint, forcing more expensive re-pruning on later turns.\n * `restoreOriginalToolContent` returns an array with identical\n * length and structure to `state.messages` (replacements only at\n * specific indices), so the same tailStartIndex slices both arrays\n * at the same turn boundary.\n */\n const messagesToRetain = state.messages.slice(tailStartIndex);\n\n if (messagesToRefine.length === 0) {\n /**\n * Recency window covers the entire conversation — there is no\n * older content to summarize. Skipping prevents the model from\n * destroying the user's most recent message (e.g. a large pasted\n * payload on the first turn) by replacing it with a generic\n * checkpoint summary. Mark the trigger so the same unchanged\n * state is not re-evaluated on the next prune cycle.\n */\n emitAgentLog(\n config,\n 'debug',\n 'summarize',\n 'Summarization skipped — recency window retains all messages',\n {\n messagesRetained: messagesToRetain.length,\n retainTurns: retainRecent?.turns ?? DEFAULT_RETAIN_RECENT_TURNS,\n },\n { runId: graph.runId, agentId: request.agentId }\n );\n agentContext.markSummarizationTriggered(state.messages.length);\n return { summarizationRequest: undefined };\n }\n\n const clientConfig = buildSummarizationClientConfig(\n agentContext,\n agentContext.summarizationConfig\n );\n\n const stepKey = `summarize-${request.agentId}`;\n const [stepId, stepIndex] = generateStepId(stepKey);\n\n const placeholderSummary: t.SummaryContentBlock = {\n type: ContentTypes.SUMMARY,\n model: clientConfig.modelName,\n provider: clientConfig.provider,\n };\n\n const runStep: t.RunStep = {\n stepIndex,\n id: stepId,\n type: StepTypes.MESSAGE_CREATION,\n index: graph.contentData.length,\n stepDetails: {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: { message_id: stepId },\n },\n summary: placeholderSummary,\n usage: null,\n };\n\n if (graph.runId != null && graph.runId !== '') {\n runStep.runId = graph.runId;\n }\n if (graph.isMultiAgent && agentContext.agentId) {\n runStep.agentId = agentContext.agentId;\n }\n\n await graph.dispatchRunStep(runStep, runnableConfig);\n\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_START,\n {\n agentId: request.agentId,\n provider: clientConfig.provider,\n model: clientConfig.modelName,\n messagesToRefineCount: messagesToRefine.length,\n summaryVersion: agentContext.summaryVersion + 1,\n } satisfies t.SummarizeStartEvent,\n runnableConfig\n );\n }\n\n const sessionId = graph.runId ?? '';\n if (graph.hookRegistry?.hasHookFor('PreCompact', sessionId) === true) {\n const threadId = (\n runnableConfig?.configurable as Record<string, unknown> | undefined\n )?.thread_id as string | undefined;\n await executeHooks({\n registry: graph.hookRegistry,\n input: {\n hook_event_name: 'PreCompact',\n runId: sessionId,\n threadId,\n agentId: request.agentId,\n messagesBeforeCount: messagesToRefine.length,\n trigger: agentContext.summarizationConfig?.trigger?.type ?? 'default',\n },\n sessionId,\n }).catch(() => {\n /* PreCompact is observational — swallow errors */\n });\n }\n\n const isSelfSummarizeModel =\n clientConfig.provider === (agentContext.provider as string);\n const hasPromptCache =\n isSelfSummarizeModel &&\n (agentContext.clientOptions as Record<string, unknown> | undefined)\n ?.promptCache === true;\n\n const log: LogFn = (level, message, data) => {\n emitAgentLog(runnableConfig, level, 'summarize', message, data, {\n runId: graph.runId,\n agentId: request.agentId,\n });\n };\n\n log('debug', 'Summarization starting', {\n messagesToRefineCount: messagesToRefine.length,\n hasPriorSummary: (agentContext.getSummaryText()?.trim() ?? '') !== '',\n summaryVersion: agentContext.summaryVersion + 1,\n isSelfSummarize: isSelfSummarizeModel,\n hasPromptCache,\n provider: clientConfig.provider,\n });\n\n const summarizeConfig: RunnableConfig | undefined = config\n ? {\n ...config,\n metadata: {\n ...config.metadata,\n agent_id: request.agentId,\n summarization_provider: clientConfig.provider,\n summarization_model: clientConfig.modelName,\n },\n }\n : undefined;\n\n const { text: rawText, usage: summaryUsage } =\n await executeSummarizationWithFallback({\n agentContext,\n messages: messagesToRefine,\n clientConfig,\n summarizeConfig,\n stepId,\n usePromptCache: isSelfSummarizeModel && hasPromptCache,\n log,\n });\n\n if (!rawText) {\n agentContext.markSummarizationTriggered(0);\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_COMPLETE,\n {\n id: stepId,\n agentId: request.agentId,\n error: 'Summarization produced empty output',\n } satisfies t.SummarizeCompleteEvent,\n runnableConfig\n );\n }\n return { summarizationRequest: undefined };\n }\n\n const summaryText = enrichSummary(rawText, messagesToRefine);\n\n const tokenCount = computeSummaryTokenCount(\n summaryText,\n summaryUsage,\n agentContext.tokenCounter\n );\n\n agentContext.setSummary(summaryText, tokenCount);\n\n log('info', 'Summary persisted');\n log('debug', 'Summary details', {\n summaryTokens: tokenCount,\n textLength: summaryText.length,\n messagesCompacted: messagesToRefine.length,\n summaryVersion: agentContext.summaryVersion,\n ...(summaryUsage != null\n ? {\n input_tokens: summaryUsage.input_tokens,\n output_tokens: summaryUsage.output_tokens,\n cache_read: summaryUsage.input_token_details?.cache_read,\n cache_creation: summaryUsage.input_token_details?.cache_creation,\n }\n : {}),\n });\n\n const summaryBlock = buildSummaryBlock({\n summaryText,\n tokenCount,\n stepId,\n stepIndex: runStep.index,\n modelName: clientConfig.modelName,\n provider: clientConfig.provider,\n summaryVersion: agentContext.summaryVersion,\n });\n\n await dispatchCompletionEvents({\n graph,\n runnableConfig,\n stepId,\n summaryBlock,\n agentContext,\n runStep,\n summaryUsage,\n agentId: request.agentId,\n messagesAfterCount: messagesToRetain.length,\n });\n\n /**\n * `dispatchCompletionEvents` calls `rebuildTokenMapAfterSummarization({})`\n * which resets the dedupe baseline to 0 — correct under the legacy\n * \"remove-all only\" shape where no messages survived, but stale once\n * the recency window keeps a tail. Realign the baseline to the\n * surviving tail length so a subsequent prune cycle on the unchanged\n * tail short-circuits via `shouldSkipSummarization` instead of\n * looping back into another summarize call.\n */\n agentContext.markSummarizationTriggered(messagesToRetain.length);\n\n /**\n * Carry forward the original-content entries that correspond to the\n * retained tail, reindexed for the post-removeAll state where tail\n * messages start at index 0. Without this, a future summarization\n * that pulls these tail messages into its head would only see the\n * masked stubs (since `setSummary` clears `pruneMessages`, and the\n * fresh pruner at the next turn has no record of prior masks).\n * Entries for indices < `tailStartIndex` belong to messages we just\n * summarized — they are no longer reachable so they are dropped.\n */\n if (originalPending != null && originalPending.size > 0) {\n const tailPending = new Map<number, string>();\n for (const [idx, content] of originalPending) {\n if (idx >= tailStartIndex) {\n tailPending.set(idx - tailStartIndex, content);\n }\n }\n agentContext.pendingOriginalToolContent =\n tailPending.size > 0 ? tailPending : undefined;\n } else {\n agentContext.pendingOriginalToolContent = undefined;\n }\n\n return {\n summarizationRequest: undefined,\n messages:\n messagesToRetain.length > 0\n ? [createRemoveAllMessage(), ...messagesToRetain]\n : [createRemoveAllMessage()],\n };\n };\n}\n\n/** Extracts text from an LLM response, skipping reasoning/thinking blocks. */\nfunction extractResponseText(response: { content: string | object }): string {\n const { content } = response;\n if (typeof content === 'string') {\n return content.trim();\n }\n if (!Array.isArray(content)) {\n return '';\n }\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === 'string') {\n parts.push(block);\n continue;\n }\n if (block == null || typeof block !== 'object') {\n continue;\n }\n const rec = block as Record<string, unknown>;\n if (\n rec.type === ContentTypes.THINKING ||\n rec.type === ContentTypes.REASONING_CONTENT ||\n rec.type === 'redacted_thinking'\n ) {\n continue;\n }\n if (rec.type === 'text' && typeof rec.text === 'string') {\n parts.push(rec.text);\n }\n }\n return parts.join('').trim();\n}\n\nfunction buildSummarizationInstruction(\n promptText: string,\n updatePromptText: string | undefined,\n priorSummaryText: string\n): string {\n const effectivePrompt = priorSummaryText\n ? (updatePromptText ?? promptText)\n : promptText;\n const parts = [effectivePrompt];\n if (priorSummaryText) {\n parts.push(\n `\\n\\n<previous-summary>\\n${priorSummaryText}\\n</previous-summary>`\n );\n }\n return parts.join('');\n}\n\n/** Creates an `onChunk` callback that dispatches `ON_SUMMARIZE_DELTA` events for streaming. */\nfunction createSummarizationChunkHandler({\n stepId,\n config,\n provider,\n reasoningKey = 'reasoning_content',\n}: {\n stepId?: string;\n config?: RunnableConfig;\n provider?: Providers;\n reasoningKey?: 'reasoning_content' | 'reasoning';\n}): OnChunk | undefined {\n if (stepId == null || stepId === '' || !config) {\n return undefined;\n }\n return (chunk) => {\n const chunkAny = chunk as Parameters<typeof getChunkContent>[0]['chunk'];\n const raw = getChunkContent({ chunk: chunkAny, provider, reasoningKey });\n if (raw == null || (typeof raw === 'string' && !raw)) {\n return;\n }\n const contentBlocks: t.MessageContentComplex[] =\n typeof raw === 'string'\n ? [{ type: ContentTypes.TEXT, text: raw } as t.MessageContentComplex]\n : raw;\n\n void safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_DELTA,\n {\n id: stepId,\n delta: {\n summary: {\n type: ContentTypes.SUMMARY,\n content: contentBlocks,\n provider: String(config.metadata?.summarization_provider ?? ''),\n model: String(config.metadata?.summarization_model ?? ''),\n },\n },\n } satisfies t.SummarizeDeltaEvent,\n config\n );\n };\n}\n\nfunction traceConfig(\n config: RunnableConfig | undefined,\n stage: string\n): RunnableConfig | undefined {\n if (!config) {\n return undefined;\n }\n return {\n ...config,\n runName: `summarization:${stage}`,\n metadata: { ...config.metadata, summarization: true, stage },\n };\n}\n\n/**\n * Cache-friendly compaction: sends raw conversation messages with the\n * summarization instruction appended as the final HumanMessage.\n * Providers with prompt caching get a cache hit on the system prompt +\n * tool definitions prefix.\n */\nasync function summarizeWithCacheHit({\n model,\n messages,\n promptText,\n updatePromptText,\n priorSummaryText,\n config,\n stepId,\n provider,\n reasoningKey,\n usePromptCache,\n log,\n}: {\n model: t.ChatModel;\n messages: BaseMessage[];\n promptText: string;\n updatePromptText?: string;\n priorSummaryText: string;\n config?: RunnableConfig;\n stepId?: string;\n provider: Providers;\n reasoningKey?: 'reasoning_content' | 'reasoning';\n usePromptCache?: boolean;\n log?: LogFn;\n}): Promise<{ text: string; usage?: Partial<UsageMetadata> }> {\n const instruction = buildSummarizationInstruction(\n promptText,\n updatePromptText,\n priorSummaryText\n );\n\n const fullMessages = [...messages, new HumanMessage(instruction)];\n const invokeMessages =\n usePromptCache === true ? addCacheControl(fullMessages) : fullMessages;\n\n const result = await attemptInvoke(\n {\n model,\n messages: invokeMessages,\n provider,\n onChunk: createSummarizationChunkHandler({\n stepId,\n config: traceConfig(config, 'cache_hit_compaction'),\n provider,\n reasoningKey,\n }),\n },\n traceConfig(config, 'cache_hit_compaction')\n );\n\n const responseMsg = result.messages?.[0];\n const text = responseMsg\n ? extractResponseText(responseMsg as { content: string | object })\n : '';\n let usage: Partial<UsageMetadata> | undefined;\n let usageSource = 'none';\n if (\n responseMsg != null &&\n 'usage_metadata' in responseMsg &&\n responseMsg.usage_metadata != null\n ) {\n usage = responseMsg.usage_metadata as Partial<UsageMetadata>;\n usageSource = 'usage_metadata';\n } else if (responseMsg != null) {\n const respMeta = responseMsg.response_metadata as\n | Record<string, unknown>\n | undefined;\n const raw = (respMeta?.metadata as Record<string, unknown> | undefined)\n ?.usage as Record<string, unknown> | undefined;\n if (raw != null) {\n usage = {\n input_tokens: Number(raw.inputTokens) || undefined,\n output_tokens: Number(raw.outputTokens) || undefined,\n } as Partial<UsageMetadata>;\n usageSource = 'response_metadata';\n }\n }\n const cacheDetails = (\n usage as\n | {\n input_token_details?: {\n cache_read?: number;\n cache_creation?: number;\n };\n }\n | undefined\n )?.input_token_details;\n log?.('debug', 'Summarization LLM usage', {\n source: usageSource,\n input_tokens: usage?.input_tokens,\n output_tokens: usage?.output_tokens,\n ...(cacheDetails?.cache_read != null || cacheDetails?.cache_creation != null\n ? {\n 'input_token_details.cache_read': cacheDetails.cache_read,\n 'input_token_details.cache_creation': cacheDetails.cache_creation,\n }\n : {}),\n });\n return { text, usage };\n}\n"],"names":["messages","AIMessage","ToolMessage","getMaxOutputTokensKey","SystemMessage","ContentTypes","initializeModel","tryFallbackProviders","HumanMessage","safeDispatchCustomEvent","GraphEvents","executeHooks","emitAgentLog","splitAtRecencyBoundary","StepTypes","createRemoveAllMessage","getChunkContent","addCacheControl","attemptInvoke"],"mappings":"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"}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
var dotenv = require('dotenv');
|
|
4
4
|
var tools = require('@langchain/core/tools');
|
|
5
|
-
var ProgrammaticToolCalling = require('./ProgrammaticToolCalling.cjs');
|
|
6
5
|
var CodeExecutor = require('./CodeExecutor.cjs');
|
|
7
6
|
var ptcTimeout = require('./ptcTimeout.cjs');
|
|
7
|
+
var ProgrammaticToolCalling = require('./ProgrammaticToolCalling.cjs');
|
|
8
8
|
var _enum = require('../common/enum.cjs');
|
|
9
9
|
|
|
10
10
|
dotenv.config();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BashProgrammaticToolCalling.cjs","sources":["../../../src/tools/BashProgrammaticToolCalling.ts"],"sourcesContent":["import { config } from 'dotenv';\nimport { tool, DynamicStructuredTool } from '@langchain/core/tools';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type { ProgrammaticToolCallingJsonSchema } from './ptcTimeout';\nimport type * as t from '@/types';\nimport {\n makeRequest,\n executeTools,\n formatCompletedResponse,\n} from './ProgrammaticToolCalling';\nimport {\n BASH_SHELL_GUIDANCE,\n CODE_ARTIFACT_PATH_GUIDANCE,\n appendFailedExecutionFileReminder,\n getCodeBaseURL,\n} from './CodeExecutor';\nimport {\n clampCodeApiRunTimeoutMs,\n createCodeApiRunTimeoutSchema,\n resolveCodeApiRunTimeoutMs,\n} from './ptcTimeout';\nimport { Constants } from '@/common';\n\nconfig();\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_MAX_ROUND_TRIPS = 20;\nconst DEFAULT_RUN_TIMEOUT_MS = resolveCodeApiRunTimeoutMs();\n\n/** Bash reserved words that get `_tool` suffix when used as function names */\nconst BASH_RESERVED = new Set([\n 'if',\n 'then',\n 'else',\n 'elif',\n 'fi',\n 'case',\n 'esac',\n 'for',\n 'while',\n 'until',\n 'do',\n 'done',\n 'in',\n 'function',\n 'select',\n 'time',\n 'coproc',\n 'declare',\n 'typeset',\n 'local',\n 'readonly',\n 'export',\n 'unset',\n]);\n\n// ============================================================================\n// Description Components\n// ============================================================================\n\nconst STATELESS_WARNING = `CRITICAL - STATELESS EXECUTION:\nEach call is a fresh bash shell. Variables and state do NOT persist between calls.\nYou MUST complete your entire workflow in ONE code block.\nDO NOT split work across multiple calls expecting to reuse variables.`;\n\nconst CORE_RULES = `Rules:\n- One call: state does not persist\n- Tools are pre-defined as bash functions—DO NOT redefine them\n- Each tool function accepts a JSON string argument\n- Save tool output with raw=$(tool '{}'); printf '%s\\n' \"$raw\" > /mnt/data/file.json; direct tool > file may be empty\n- Tool stdout is normalized to one compact JSON value when possible; parse saved stdout once, then use fromjson? // . only for JSON-string fields\n- Only echo/printf output returns to the model\n- ${CODE_ARTIFACT_PATH_GUIDANCE}\n- ${BASH_SHELL_GUIDANCE}\n- timeout caps one sandbox run/replay iteration, not the total multi-round-trip workflow`;\n\nconst ADDITIONAL_RULES =\n '- Tool names normalized: hyphens→underscores, reserved words get `_tool` suffix';\n\nconst EXAMPLES = `Example (Complete workflow in one call):\n # Query data and process\n data=$(query_database '{\"sql\": \"SELECT * FROM users\"}')\n echo \"$data\" | jq '.[] | .name'\n\nExample (Parallel calls):\n { sf=$(web_search '{\"query\": \"SF weather\"}'); printf '%s\\n' \"$sf\" > /mnt/data/sf.json; } &\n { ny=$(web_search '{\"query\": \"NY weather\"}'); printf '%s\\n' \"$ny\" > /mnt/data/ny.json; } &\n wait\n echo \"SF: $(jq -r . /mnt/data/sf.json)\"\n echo \"NY: $(jq -r . /mnt/data/ny.json)\"`;\n\nconst CODE_PARAM_DESCRIPTION = `Bash code that calls tools programmatically. Tools are available as bash functions.\n\n${STATELESS_WARNING}\n\nEach tool function accepts a JSON string as its argument.\nExample: tool_name '{\"key\": \"value\"}'\n\n${EXAMPLES}\n\n${CORE_RULES}`;\n\n// ============================================================================\n// Schema\n// ============================================================================\n\nexport function createBashProgrammaticToolCallingSchema(\n maxRunTimeoutMs = DEFAULT_RUN_TIMEOUT_MS\n): ProgrammaticToolCallingJsonSchema {\n return {\n type: 'object',\n properties: {\n code: {\n type: 'string',\n minLength: 1,\n description: CODE_PARAM_DESCRIPTION,\n },\n timeout: createCodeApiRunTimeoutSchema(maxRunTimeoutMs),\n },\n required: ['code'],\n } as const;\n}\n\nexport const BashProgrammaticToolCallingSchema =\n createBashProgrammaticToolCallingSchema();\n\nexport const BashProgrammaticToolCallingName =\n Constants.BASH_PROGRAMMATIC_TOOL_CALLING;\n\nexport const BashProgrammaticToolCallingDescription = `\nRun tools via bash code. Tools are available as bash functions that accept JSON string arguments.\n\n${STATELESS_WARNING}\n\n${CORE_RULES}\n${ADDITIONAL_RULES}\n\nWhen to use: shell pipelines, parallel execution (& and wait), file processing, text manipulation.\n\n${EXAMPLES}\n`.trim();\n\nexport const BashProgrammaticToolCallingDefinition = {\n name: BashProgrammaticToolCallingName,\n description: BashProgrammaticToolCallingDescription,\n schema: BashProgrammaticToolCallingSchema,\n} as const;\n\nfunction maybeParseJsonResultString(result: unknown): unknown {\n if (typeof result !== 'string') {\n return result;\n }\n\n const trimmed = result.trim();\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {\n return result;\n }\n\n try {\n return JSON.parse(trimmed) as unknown;\n } catch {\n return result;\n }\n}\n\nexport function normalizeBashToolResultsForReplay(\n toolResults: t.PTCToolResult[]\n): t.PTCToolResult[] {\n return toolResults.map((toolResult) => {\n if (toolResult.is_error) {\n return toolResult;\n }\n\n return {\n ...toolResult,\n result: maybeParseJsonResultString(toolResult.result),\n };\n });\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Normalizes a tool name to a valid bash function identifier.\n * 1. Replace hyphens, spaces, dots with underscores\n * 2. Remove any other invalid characters\n * 3. Prefix with underscore if starts with number\n * 4. Append `_tool` if it's a bash reserved word\n */\nexport function normalizeToBashIdentifier(name: string): string {\n let normalized = name.replace(/[-\\s.]/g, '_');\n normalized = normalized.replace(/[^a-zA-Z0-9_]/g, '');\n\n if (/^[0-9]/.test(normalized)) {\n normalized = '_' + normalized;\n }\n\n if (BASH_RESERVED.has(normalized)) {\n normalized = normalized + '_tool';\n }\n\n return normalized;\n}\n\n/**\n * Extracts tool names that are actually called in the bash code.\n * Bash functions are invoked as commands (no parentheses), so we match\n * the normalized name as a word boundary.\n */\nexport function extractUsedBashToolNames(\n code: string,\n toolNameMap: Map<string, string>\n): Set<string> {\n const usedTools = new Set<string>();\n\n for (const [bashName, originalName] of toolNameMap) {\n const escapedName = bashName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = new RegExp(`\\\\b${escapedName}\\\\b`, 'g');\n\n if (pattern.test(code)) {\n usedTools.add(originalName);\n }\n }\n\n return usedTools;\n}\n\n/**\n * Filters tool definitions to only include tools actually used in the bash code.\n */\nexport function filterBashToolsByUsage(\n toolDefs: t.LCTool[],\n code: string,\n debug = false\n): t.LCTool[] {\n const toolNameMap = new Map<string, string>();\n for (const def of toolDefs) {\n const bashName = normalizeToBashIdentifier(def.name);\n toolNameMap.set(bashName, def.name);\n }\n\n const usedToolNames = extractUsedBashToolNames(code, toolNameMap);\n\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[BashPTC Debug] Tool filtering: found ${usedToolNames.size}/${toolDefs.length} tools in code`\n );\n if (usedToolNames.size > 0) {\n // eslint-disable-next-line no-console\n console.log(\n `[BashPTC Debug] Matched tools: ${Array.from(usedToolNames).join(', ')}`\n );\n }\n }\n\n if (usedToolNames.size === 0) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n '[BashPTC Debug] No tools detected in code - sending all tools as fallback'\n );\n }\n return toolDefs;\n }\n\n return toolDefs.filter((def) => usedToolNames.has(def.name));\n}\n\n// ============================================================================\n// Tool Factory\n// ============================================================================\n\n/**\n * Creates a Bash Programmatic Tool Calling tool for multi-tool orchestration.\n *\n * This tool enables AI agents to write bash scripts that orchestrate multiple\n * tool calls programmatically via the remote Code API, reducing LLM round-trips.\n *\n * The tool map must be provided at runtime via config.toolCall (injected by ToolNode).\n */\nexport function createBashProgrammaticToolCallingTool(\n initParams: t.BashProgrammaticToolCallingParams = {}\n): DynamicStructuredTool {\n const baseUrl = initParams.baseUrl ?? getCodeBaseURL();\n const maxRoundTrips = initParams.maxRoundTrips ?? DEFAULT_MAX_ROUND_TRIPS;\n const maxRunTimeoutMs = resolveCodeApiRunTimeoutMs(initParams.runTimeoutMs);\n const proxy = initParams.proxy ?? process.env.PROXY;\n const debug = initParams.debug ?? process.env.BASH_PTC_DEBUG === 'true';\n const EXEC_ENDPOINT = `${baseUrl}/exec/programmatic`;\n\n return tool(\n async (rawParams, config) => {\n const params = rawParams as { code: string; timeout?: number };\n const { code } = params;\n const timeout = clampCodeApiRunTimeoutMs(params.timeout, maxRunTimeoutMs);\n\n const toolCall = (config.toolCall ?? {}) as ToolCall &\n Partial<t.ProgrammaticCache> & {\n session_id?: string;\n _injected_files?: t.CodeEnvFile[];\n };\n const { toolMap, toolDefs, session_id, _injected_files } = toolCall;\n\n if (toolMap == null || toolMap.size === 0) {\n throw new Error(\n 'No toolMap provided. ' +\n 'ToolNode should inject this from AgentContext when invoked through the graph.'\n );\n }\n\n if (toolDefs == null || toolDefs.length === 0) {\n throw new Error(\n 'No tool definitions provided. ' +\n 'Either pass tools in the input or ensure ToolNode injects toolDefs.'\n );\n }\n\n let roundTrip = 0;\n\n try {\n // ====================================================================\n // Phase 1: Filter tools and make initial request\n // ====================================================================\n\n const effectiveTools = filterBashToolsByUsage(toolDefs, code, debug);\n\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[BashPTC Debug] Sending ${effectiveTools.length} tools to API ` +\n `(filtered from ${toolDefs.length})`\n );\n }\n\n /* `/files/<session_id>` HTTP fallback removed — codeapi's\n * sessionAuth requires kind/id query params unavailable at\n * this point. See `CodeExecutor.ts` for full rationale. */\n let files: t.CodeEnvFile[] | undefined;\n if (_injected_files && _injected_files.length > 0) {\n files = _injected_files;\n } else if (session_id != null && session_id.length > 0) {\n // eslint-disable-next-line no-console\n console.debug(\n `[BashProgrammaticToolCalling] No injected files for session_id=${session_id} — exec will run without input files`\n );\n }\n\n let response = await makeRequest(\n EXEC_ENDPOINT,\n {\n lang: 'bash',\n code,\n tools: effectiveTools,\n session_id,\n timeout,\n ...(files && files.length > 0 ? { files } : {}),\n },\n proxy,\n initParams.authHeaders\n );\n\n // ====================================================================\n // Phase 2: Handle response loop\n // ====================================================================\n\n while (response.status === 'tool_call_required') {\n roundTrip++;\n\n if (roundTrip > maxRoundTrips) {\n throw new Error(\n `Exceeded maximum round trips (${maxRoundTrips}). ` +\n 'This may indicate an infinite loop, excessive tool calls, ' +\n 'or a logic error in your code.'\n );\n }\n\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[BashPTC Debug] Round trip ${roundTrip}: ${response.tool_calls?.length ?? 0} tool(s) to execute`\n );\n }\n\n const toolResults = normalizeBashToolResultsForReplay(\n await executeTools(\n response.tool_calls ?? [],\n toolMap,\n Constants.BASH_PROGRAMMATIC_TOOL_CALLING\n )\n );\n\n response = await makeRequest(\n EXEC_ENDPOINT,\n {\n continuation_token: response.continuation_token,\n tool_results: toolResults,\n },\n proxy,\n initParams.authHeaders\n );\n }\n\n // ====================================================================\n // Phase 3: Handle final state\n // ====================================================================\n\n if (response.status === 'completed') {\n return formatCompletedResponse(response, code);\n }\n\n if (response.status === 'error') {\n throw new Error(\n `Execution error: ${response.error}` +\n (response.stderr != null && response.stderr !== ''\n ? `\\n\\nStderr:\\n${response.stderr}`\n : '')\n );\n }\n\n throw new Error(`Unexpected response status: ${response.status}`);\n } catch (error) {\n const messageWithReminder = appendFailedExecutionFileReminder(\n (error as Error).message,\n code\n );\n throw new Error(\n `Bash programmatic execution failed: ${messageWithReminder}`\n );\n }\n },\n {\n name: Constants.BASH_PROGRAMMATIC_TOOL_CALLING,\n description: BashProgrammaticToolCallingDescription,\n schema: createBashProgrammaticToolCallingSchema(maxRunTimeoutMs),\n responseFormat: Constants.CONTENT_AND_ARTIFACT,\n }\n );\n}\n"],"names":["config","resolveCodeApiRunTimeoutMs","CODE_ARTIFACT_PATH_GUIDANCE","BASH_SHELL_GUIDANCE","createCodeApiRunTimeoutSchema","Constants","getCodeBaseURL","tool","clampCodeApiRunTimeoutMs","makeRequest","executeTools","formatCompletedResponse","appendFailedExecutionFileReminder"],"mappings":";;;;;;;;;AAuBAA,aAAM,EAAE;AAER;AACA;AACA;AAEA,MAAM,uBAAuB,GAAG,EAAE;AAClC,MAAM,sBAAsB,GAAGC,qCAA0B,EAAE;AAE3D;AACA,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,IAAI;IACJ,MAAM;IACN,MAAM;IACN,MAAM;IACN,IAAI;IACJ,MAAM;IACN,MAAM;IACN,KAAK;IACL,OAAO;IACP,OAAO;IACP,IAAI;IACJ,MAAM;IACN,IAAI;IACJ,UAAU;IACV,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,SAAS;IACT,SAAS;IACT,OAAO;IACP,UAAU;IACV,QAAQ;IACR,OAAO;AACR,CAAA,CAAC;AAEF;AACA;AACA;AAEA,MAAM,iBAAiB,GAAG,CAAA;;;sEAG4C;AAEtE,MAAM,UAAU,GAAG,CAAA;;;;;;;IAOfC,wCAA2B;IAC3BC,gCAAmB;yFACkE;AAEzF,MAAM,gBAAgB,GACpB,iFAAiF;AAEnF,MAAM,QAAQ,GAAG,CAAA;;;;;;;;;;0CAUyB;AAE1C,MAAM,sBAAsB,GAAG,CAAA;;EAE7B,iBAAiB;;;;;EAKjB,QAAQ;;AAER,EAAA,UAAU,EAAE;AAEd;AACA;AACA;AAEM,SAAU,uCAAuC,CACrD,eAAe,GAAG,sBAAsB,EAAA;IAExC,OAAO;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,UAAU,EAAE;AACV,YAAA,IAAI,EAAE;AACJ,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,SAAS,EAAE,CAAC;AACZ,gBAAA,WAAW,EAAE,sBAAsB;AACpC,aAAA;AACD,YAAA,OAAO,EAAEC,wCAA6B,CAAC,eAAe,CAAC;AACxD,SAAA;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACV;AACZ;AAEO,MAAM,iCAAiC,GAC5C,uCAAuC;AAElC,MAAM,+BAA+B,GAC1CC,eAAS,CAAC;AAEL,MAAM,sCAAsC,GAAG;;;EAGpD,iBAAiB;;EAEjB,UAAU;EACV,gBAAgB;;;;EAIhB,QAAQ;CACT,CAAC,IAAI;AAEC,MAAM,qCAAqC,GAAG;AACnD,IAAA,IAAI,EAAE,+BAA+B;AACrC,IAAA,WAAW,EAAE,sCAAsC;AACnD,IAAA,MAAM,EAAE,iCAAiC;;AAG3C,SAAS,0BAA0B,CAAC,MAAe,EAAA;AACjD,IAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC9B,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE;AAC7B,IAAA,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACxD,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,IAAI;AACF,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY;IACvC;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,MAAM;IACf;AACF;AAEM,SAAU,iCAAiC,CAC/C,WAA8B,EAAA;AAE9B,IAAA,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,KAAI;AACpC,QAAA,IAAI,UAAU,CAAC,QAAQ,EAAE;AACvB,YAAA,OAAO,UAAU;QACnB;QAEA,OAAO;AACL,YAAA,GAAG,UAAU;AACb,YAAA,MAAM,EAAE,0BAA0B,CAAC,UAAU,CAAC,MAAM,CAAC;SACtD;AACH,IAAA,CAAC,CAAC;AACJ;AAEA;AACA;AACA;AAEA;;;;;;AAMG;AACG,SAAU,yBAAyB,CAAC,IAAY,EAAA;IACpD,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;IAC7C,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;AAErD,IAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AAC7B,QAAA,UAAU,GAAG,GAAG,GAAG,UAAU;IAC/B;AAEA,IAAA,IAAI,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;AACjC,QAAA,UAAU,GAAG,UAAU,GAAG,OAAO;IACnC;AAEA,IAAA,OAAO,UAAU;AACnB;AAEA;;;;AAIG;AACG,SAAU,wBAAwB,CACtC,IAAY,EACZ,WAAgC,EAAA;AAEhC,IAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU;IAEnC,KAAK,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,WAAW,EAAE;QAClD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC;QACnE,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,CAAA,GAAA,EAAM,WAAW,CAAA,GAAA,CAAK,EAAE,GAAG,CAAC;AAEvD,QAAA,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACtB,YAAA,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;QAC7B;IACF;AAEA,IAAA,OAAO,SAAS;AAClB;AAEA;;AAEG;AACG,SAAU,sBAAsB,CACpC,QAAoB,EACpB,IAAY,EACZ,KAAK,GAAG,KAAK,EAAA;AAEb,IAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB;AAC7C,IAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;QAC1B,MAAM,QAAQ,GAAG,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC;QACpD,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC;IACrC;IAEA,MAAM,aAAa,GAAG,wBAAwB,CAAC,IAAI,EAAE,WAAW,CAAC;IAEjE,IAAI,KAAK,EAAE;;AAET,QAAA,OAAO,CAAC,GAAG,CACT,CAAA,sCAAA,EAAyC,aAAa,CAAC,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAC,MAAM,CAAA,cAAA,CAAgB,CAC/F;AACD,QAAA,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE;;AAE1B,YAAA,OAAO,CAAC,GAAG,CACT,CAAA,+BAAA,EAAkC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CACzE;QACH;IACF;AAEA,IAAA,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE;QAC5B,IAAI,KAAK,EAAE;;AAET,YAAA,OAAO,CAAC,GAAG,CACT,2EAA2E,CAC5E;QACH;AACA,QAAA,OAAO,QAAQ;IACjB;AAEA,IAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC9D;AAEA;AACA;AACA;AAEA;;;;;;;AAOG;AACG,SAAU,qCAAqC,CACnD,UAAA,GAAkD,EAAE,EAAA;IAEpD,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,IAAIC,2BAAc,EAAE;AACtD,IAAA,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,IAAI,uBAAuB;IACzE,MAAM,eAAe,GAAGL,qCAA0B,CAAC,UAAU,CAAC,YAAY,CAAC;IAC3E,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK;AACnD,IAAA,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM;AACvE,IAAA,MAAM,aAAa,GAAG,CAAA,EAAG,OAAO,oBAAoB;IAEpD,OAAOM,UAAI,CACT,OAAO,SAAS,EAAE,MAAM,KAAI;QAC1B,MAAM,MAAM,GAAG,SAA+C;AAC9D,QAAA,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM;QACvB,MAAM,OAAO,GAAGC,mCAAwB,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC;QAEzE,MAAM,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CAIpC;QACH,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,QAAQ;QAEnE,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE;YACzC,MAAM,IAAI,KAAK,CACb,uBAAuB;AACrB,gBAAA,+EAA+E,CAClF;QACH;QAEA,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7C,MAAM,IAAI,KAAK,CACb,gCAAgC;AAC9B,gBAAA,qEAAqE,CACxE;QACH;QAEA,IAAI,SAAS,GAAG,CAAC;AAEjB,QAAA,IAAI;;;;YAKF,MAAM,cAAc,GAAG,sBAAsB,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC;YAEpE,IAAI,KAAK,EAAE;;AAET,gBAAA,OAAO,CAAC,GAAG,CACT,2BAA2B,cAAc,CAAC,MAAM,CAAA,cAAA,CAAgB;AAC9D,oBAAA,CAAA,eAAA,EAAkB,QAAQ,CAAC,MAAM,CAAA,CAAA,CAAG,CACvC;YACH;AAEA;;AAE2D;AAC3D,YAAA,IAAI,KAAkC;YACtC,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;gBACjD,KAAK,GAAG,eAAe;YACzB;iBAAO,IAAI,UAAU,IAAI,IAAI,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;;AAEtD,gBAAA,OAAO,CAAC,KAAK,CACX,kEAAkE,UAAU,CAAA,oCAAA,CAAsC,CACnH;YACH;AAEA,YAAA,IAAI,QAAQ,GAAG,MAAMC,mCAAW,CAC9B,aAAa,EACb;AACE,gBAAA,IAAI,EAAE,MAAM;gBACZ,IAAI;AACJ,gBAAA,KAAK,EAAE,cAAc;gBACrB,UAAU;gBACV,OAAO;AACP,gBAAA,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAChD,aAAA,EACD,KAAK,EACL,UAAU,CAAC,WAAW,CACvB;;;;AAMD,YAAA,OAAO,QAAQ,CAAC,MAAM,KAAK,oBAAoB,EAAE;AAC/C,gBAAA,SAAS,EAAE;AAEX,gBAAA,IAAI,SAAS,GAAG,aAAa,EAAE;AAC7B,oBAAA,MAAM,IAAI,KAAK,CACb,CAAA,8BAAA,EAAiC,aAAa,CAAA,GAAA,CAAK;wBACjD,4DAA4D;AAC5D,wBAAA,gCAAgC,CACnC;gBACH;gBAEA,IAAI,KAAK,EAAE;;AAET,oBAAA,OAAO,CAAC,GAAG,CACT,CAAA,2BAAA,EAA8B,SAAS,CAAA,EAAA,EAAK,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAA,mBAAA,CAAqB,CAClG;gBACH;gBAEA,MAAM,WAAW,GAAG,iCAAiC,CACnD,MAAMC,oCAAY,CAChB,QAAQ,CAAC,UAAU,IAAI,EAAE,EACzB,OAAO,EACPL,eAAS,CAAC,8BAA8B,CACzC,CACF;AAED,gBAAA,QAAQ,GAAG,MAAMI,mCAAW,CAC1B,aAAa,EACb;oBACE,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB;AAC/C,oBAAA,YAAY,EAAE,WAAW;AAC1B,iBAAA,EACD,KAAK,EACL,UAAU,CAAC,WAAW,CACvB;YACH;;;;AAMA,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,EAAE;AACnC,gBAAA,OAAOE,+CAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC;YAChD;AAEA,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE;AAC/B,gBAAA,MAAM,IAAI,KAAK,CACb,oBAAoB,QAAQ,CAAC,KAAK,CAAA,CAAE;qBACjC,QAAQ,CAAC,MAAM,IAAI,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK;AAC9C,0BAAE,CAAA,aAAA,EAAgB,QAAQ,CAAC,MAAM,CAAA;AACjC,0BAAE,EAAE,CAAC,CACV;YACH;YAEA,MAAM,IAAI,KAAK,CAAC,CAAA,4BAAA,EAA+B,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;QACnE;QAAE,OAAO,KAAK,EAAE;YACd,MAAM,mBAAmB,GAAGC,8CAAiC,CAC1D,KAAe,CAAC,OAAO,EACxB,IAAI,CACL;AACD,YAAA,MAAM,IAAI,KAAK,CACb,uCAAuC,mBAAmB,CAAA,CAAE,CAC7D;QACH;AACF,IAAA,CAAC,EACD;QACE,IAAI,EAAEP,eAAS,CAAC,8BAA8B;AAC9C,QAAA,WAAW,EAAE,sCAAsC;AACnD,QAAA,MAAM,EAAE,uCAAuC,CAAC,eAAe,CAAC;QAChE,cAAc,EAAEA,eAAS,CAAC,oBAAoB;AAC/C,KAAA,CACF;AACH;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"BashProgrammaticToolCalling.cjs","sources":["../../../src/tools/BashProgrammaticToolCalling.ts"],"sourcesContent":["import { config } from 'dotenv';\nimport { tool, DynamicStructuredTool } from '@langchain/core/tools';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type { ProgrammaticToolCallingJsonSchema } from './ptcTimeout';\nimport type * as t from '@/types';\nimport {\n BASH_SHELL_GUIDANCE,\n CODE_ARTIFACT_PATH_GUIDANCE,\n appendFailedExecutionFileReminder,\n getCodeBaseURL,\n} from './CodeExecutor';\nimport {\n clampCodeApiRunTimeoutMs,\n createCodeApiRunTimeoutSchema,\n resolveCodeApiRunTimeoutMs,\n} from './ptcTimeout';\nimport {\n makeRequest,\n executeTools,\n formatCompletedResponse,\n} from './ProgrammaticToolCalling';\nimport { Constants } from '@/common';\n\nconfig();\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_MAX_ROUND_TRIPS = 20;\nconst DEFAULT_RUN_TIMEOUT_MS = resolveCodeApiRunTimeoutMs();\n\n/** Bash reserved words that get `_tool` suffix when used as function names */\nconst BASH_RESERVED = new Set([\n 'if',\n 'then',\n 'else',\n 'elif',\n 'fi',\n 'case',\n 'esac',\n 'for',\n 'while',\n 'until',\n 'do',\n 'done',\n 'in',\n 'function',\n 'select',\n 'time',\n 'coproc',\n 'declare',\n 'typeset',\n 'local',\n 'readonly',\n 'export',\n 'unset',\n]);\n\n// ============================================================================\n// Description Components\n// ============================================================================\n\nconst STATELESS_WARNING = `CRITICAL - STATELESS EXECUTION:\nEach call is a fresh bash shell. Variables and state do NOT persist between calls.\nYou MUST complete your entire workflow in ONE code block.\nDO NOT split work across multiple calls expecting to reuse variables.`;\n\nconst CORE_RULES = `Rules:\n- One call: state does not persist\n- Tools are pre-defined as bash functions—DO NOT redefine them\n- Each tool function accepts a JSON string argument\n- Save tool output with raw=$(tool '{}'); printf '%s\\n' \"$raw\" > /mnt/data/file.json; direct tool > file may be empty\n- Tool stdout is normalized to one compact JSON value when possible; parse saved stdout once, then use fromjson? // . only for JSON-string fields\n- Only echo/printf output returns to the model\n- ${CODE_ARTIFACT_PATH_GUIDANCE}\n- ${BASH_SHELL_GUIDANCE}\n- timeout caps one sandbox run/replay iteration, not the total multi-round-trip workflow`;\n\nconst ADDITIONAL_RULES =\n '- Tool names normalized: hyphens→underscores, reserved words get `_tool` suffix';\n\nconst EXAMPLES = `Example (Complete workflow in one call):\n # Query data and process\n data=$(query_database '{\"sql\": \"SELECT * FROM users\"}')\n echo \"$data\" | jq '.[] | .name'\n\nExample (Parallel calls):\n { sf=$(web_search '{\"query\": \"SF weather\"}'); printf '%s\\n' \"$sf\" > /mnt/data/sf.json; } &\n { ny=$(web_search '{\"query\": \"NY weather\"}'); printf '%s\\n' \"$ny\" > /mnt/data/ny.json; } &\n wait\n echo \"SF: $(jq -r . /mnt/data/sf.json)\"\n echo \"NY: $(jq -r . /mnt/data/ny.json)\"`;\n\nconst CODE_PARAM_DESCRIPTION = `Bash code that calls tools programmatically. Tools are available as bash functions.\n\n${STATELESS_WARNING}\n\nEach tool function accepts a JSON string as its argument.\nExample: tool_name '{\"key\": \"value\"}'\n\n${EXAMPLES}\n\n${CORE_RULES}`;\n\n// ============================================================================\n// Schema\n// ============================================================================\n\nexport function createBashProgrammaticToolCallingSchema(\n maxRunTimeoutMs = DEFAULT_RUN_TIMEOUT_MS\n): ProgrammaticToolCallingJsonSchema {\n return {\n type: 'object',\n properties: {\n code: {\n type: 'string',\n minLength: 1,\n description: CODE_PARAM_DESCRIPTION,\n },\n timeout: createCodeApiRunTimeoutSchema(maxRunTimeoutMs),\n },\n required: ['code'],\n } as const;\n}\n\nexport const BashProgrammaticToolCallingSchema =\n createBashProgrammaticToolCallingSchema();\n\nexport const BashProgrammaticToolCallingName =\n Constants.BASH_PROGRAMMATIC_TOOL_CALLING;\n\nexport const BashProgrammaticToolCallingDescription = `\nRun tools via bash code. Tools are available as bash functions that accept JSON string arguments.\n\n${STATELESS_WARNING}\n\n${CORE_RULES}\n${ADDITIONAL_RULES}\n\nWhen to use: shell pipelines, parallel execution (& and wait), file processing, text manipulation.\n\n${EXAMPLES}\n`.trim();\n\nexport const BashProgrammaticToolCallingDefinition = {\n name: BashProgrammaticToolCallingName,\n description: BashProgrammaticToolCallingDescription,\n schema: BashProgrammaticToolCallingSchema,\n} as const;\n\nfunction maybeParseJsonResultString(result: unknown): unknown {\n if (typeof result !== 'string') {\n return result;\n }\n\n const trimmed = result.trim();\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {\n return result;\n }\n\n try {\n return JSON.parse(trimmed) as unknown;\n } catch {\n return result;\n }\n}\n\nexport function normalizeBashToolResultsForReplay(\n toolResults: t.PTCToolResult[]\n): t.PTCToolResult[] {\n return toolResults.map((toolResult) => {\n if (toolResult.is_error) {\n return toolResult;\n }\n\n return {\n ...toolResult,\n result: maybeParseJsonResultString(toolResult.result),\n };\n });\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Normalizes a tool name to a valid bash function identifier.\n * 1. Replace hyphens, spaces, dots with underscores\n * 2. Remove any other invalid characters\n * 3. Prefix with underscore if starts with number\n * 4. Append `_tool` if it's a bash reserved word\n */\nexport function normalizeToBashIdentifier(name: string): string {\n let normalized = name.replace(/[-\\s.]/g, '_');\n normalized = normalized.replace(/[^a-zA-Z0-9_]/g, '');\n\n if (/^[0-9]/.test(normalized)) {\n normalized = '_' + normalized;\n }\n\n if (BASH_RESERVED.has(normalized)) {\n normalized = normalized + '_tool';\n }\n\n return normalized;\n}\n\n/**\n * Extracts tool names that are actually called in the bash code.\n * Bash functions are invoked as commands (no parentheses), so we match\n * the normalized name as a word boundary.\n */\nexport function extractUsedBashToolNames(\n code: string,\n toolNameMap: Map<string, string>\n): Set<string> {\n const usedTools = new Set<string>();\n\n for (const [bashName, originalName] of toolNameMap) {\n const escapedName = bashName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = new RegExp(`\\\\b${escapedName}\\\\b`, 'g');\n\n if (pattern.test(code)) {\n usedTools.add(originalName);\n }\n }\n\n return usedTools;\n}\n\n/**\n * Filters tool definitions to only include tools actually used in the bash code.\n */\nexport function filterBashToolsByUsage(\n toolDefs: t.LCTool[],\n code: string,\n debug = false\n): t.LCTool[] {\n const toolNameMap = new Map<string, string>();\n for (const def of toolDefs) {\n const bashName = normalizeToBashIdentifier(def.name);\n toolNameMap.set(bashName, def.name);\n }\n\n const usedToolNames = extractUsedBashToolNames(code, toolNameMap);\n\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[BashPTC Debug] Tool filtering: found ${usedToolNames.size}/${toolDefs.length} tools in code`\n );\n if (usedToolNames.size > 0) {\n // eslint-disable-next-line no-console\n console.log(\n `[BashPTC Debug] Matched tools: ${Array.from(usedToolNames).join(', ')}`\n );\n }\n }\n\n if (usedToolNames.size === 0) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n '[BashPTC Debug] No tools detected in code - sending all tools as fallback'\n );\n }\n return toolDefs;\n }\n\n return toolDefs.filter((def) => usedToolNames.has(def.name));\n}\n\n// ============================================================================\n// Tool Factory\n// ============================================================================\n\n/**\n * Creates a Bash Programmatic Tool Calling tool for multi-tool orchestration.\n *\n * This tool enables AI agents to write bash scripts that orchestrate multiple\n * tool calls programmatically via the remote Code API, reducing LLM round-trips.\n *\n * The tool map must be provided at runtime via config.toolCall (injected by ToolNode).\n */\nexport function createBashProgrammaticToolCallingTool(\n initParams: t.BashProgrammaticToolCallingParams = {}\n): DynamicStructuredTool {\n const baseUrl = initParams.baseUrl ?? getCodeBaseURL();\n const maxRoundTrips = initParams.maxRoundTrips ?? DEFAULT_MAX_ROUND_TRIPS;\n const maxRunTimeoutMs = resolveCodeApiRunTimeoutMs(initParams.runTimeoutMs);\n const proxy = initParams.proxy ?? process.env.PROXY;\n const debug = initParams.debug ?? process.env.BASH_PTC_DEBUG === 'true';\n const EXEC_ENDPOINT = `${baseUrl}/exec/programmatic`;\n\n return tool(\n async (rawParams, config) => {\n const params = rawParams as { code: string; timeout?: number };\n const { code } = params;\n const timeout = clampCodeApiRunTimeoutMs(params.timeout, maxRunTimeoutMs);\n\n const toolCall = (config.toolCall ?? {}) as ToolCall &\n Partial<t.ProgrammaticCache> & {\n session_id?: string;\n _injected_files?: t.CodeEnvFile[];\n };\n const { toolMap, toolDefs, session_id, _injected_files } = toolCall;\n\n if (toolMap == null || toolMap.size === 0) {\n throw new Error(\n 'No toolMap provided. ' +\n 'ToolNode should inject this from AgentContext when invoked through the graph.'\n );\n }\n\n if (toolDefs == null || toolDefs.length === 0) {\n throw new Error(\n 'No tool definitions provided. ' +\n 'Either pass tools in the input or ensure ToolNode injects toolDefs.'\n );\n }\n\n let roundTrip = 0;\n\n try {\n // ====================================================================\n // Phase 1: Filter tools and make initial request\n // ====================================================================\n\n const effectiveTools = filterBashToolsByUsage(toolDefs, code, debug);\n\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[BashPTC Debug] Sending ${effectiveTools.length} tools to API ` +\n `(filtered from ${toolDefs.length})`\n );\n }\n\n /* `/files/<session_id>` HTTP fallback removed — codeapi's\n * sessionAuth requires kind/id query params unavailable at\n * this point. See `CodeExecutor.ts` for full rationale. */\n let files: t.CodeEnvFile[] | undefined;\n if (_injected_files && _injected_files.length > 0) {\n files = _injected_files;\n } else if (session_id != null && session_id.length > 0) {\n // eslint-disable-next-line no-console\n console.debug(\n `[BashProgrammaticToolCalling] No injected files for session_id=${session_id} — exec will run without input files`\n );\n }\n\n let response = await makeRequest(\n EXEC_ENDPOINT,\n {\n lang: 'bash',\n code,\n tools: effectiveTools,\n session_id,\n timeout,\n ...(files && files.length > 0 ? { files } : {}),\n },\n proxy,\n initParams.authHeaders\n );\n\n // ====================================================================\n // Phase 2: Handle response loop\n // ====================================================================\n\n while (response.status === 'tool_call_required') {\n roundTrip++;\n\n if (roundTrip > maxRoundTrips) {\n throw new Error(\n `Exceeded maximum round trips (${maxRoundTrips}). ` +\n 'This may indicate an infinite loop, excessive tool calls, ' +\n 'or a logic error in your code.'\n );\n }\n\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[BashPTC Debug] Round trip ${roundTrip}: ${response.tool_calls?.length ?? 0} tool(s) to execute`\n );\n }\n\n const toolResults = normalizeBashToolResultsForReplay(\n await executeTools(\n response.tool_calls ?? [],\n toolMap,\n Constants.BASH_PROGRAMMATIC_TOOL_CALLING\n )\n );\n\n response = await makeRequest(\n EXEC_ENDPOINT,\n {\n continuation_token: response.continuation_token,\n tool_results: toolResults,\n },\n proxy,\n initParams.authHeaders\n );\n }\n\n // ====================================================================\n // Phase 3: Handle final state\n // ====================================================================\n\n if (response.status === 'completed') {\n return formatCompletedResponse(response, code);\n }\n\n if (response.status === 'error') {\n throw new Error(\n `Execution error: ${response.error}` +\n (response.stderr != null && response.stderr !== ''\n ? `\\n\\nStderr:\\n${response.stderr}`\n : '')\n );\n }\n\n throw new Error(`Unexpected response status: ${response.status}`);\n } catch (error) {\n const messageWithReminder = appendFailedExecutionFileReminder(\n (error as Error).message,\n code\n );\n throw new Error(\n `Bash programmatic execution failed: ${messageWithReminder}`\n );\n }\n },\n {\n name: Constants.BASH_PROGRAMMATIC_TOOL_CALLING,\n description: BashProgrammaticToolCallingDescription,\n schema: createBashProgrammaticToolCallingSchema(maxRunTimeoutMs),\n responseFormat: Constants.CONTENT_AND_ARTIFACT,\n }\n );\n}\n"],"names":["config","resolveCodeApiRunTimeoutMs","CODE_ARTIFACT_PATH_GUIDANCE","BASH_SHELL_GUIDANCE","createCodeApiRunTimeoutSchema","Constants","getCodeBaseURL","tool","clampCodeApiRunTimeoutMs","makeRequest","executeTools","formatCompletedResponse","appendFailedExecutionFileReminder"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calculator.cjs","sources":["../../../src/tools/Calculator.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"Calculator.cjs","sources":["../../../src/tools/Calculator.ts"],"sourcesContent":["import * as math from 'mathjs';\nimport { Tool } from '@langchain/core/tools';\n\nexport const CalculatorToolName = 'calculator';\n\nexport const CalculatorToolDescription =\n 'Useful for getting the result of a math expression. The input to this tool should be a valid mathematical expression that could be executed by a simple calculator.';\n\nexport const CalculatorSchema = {\n type: 'object',\n properties: {\n input: {\n type: 'string',\n description: 'A valid mathematical expression to evaluate',\n },\n },\n required: ['input'],\n} as const;\n\nexport const CalculatorToolDefinition = {\n name: CalculatorToolName,\n description: CalculatorToolDescription,\n schema: CalculatorSchema,\n} as const;\n\nexport class Calculator extends Tool {\n static lc_name(): string {\n return 'Calculator';\n }\n\n get lc_namespace(): string[] {\n return [...super.lc_namespace, 'calculator'];\n }\n\n name = CalculatorToolName;\n\n async _call(input: string): Promise<string> {\n try {\n return math.evaluate(input).toString();\n } catch {\n return 'I don\\'t know how to do that.';\n }\n }\n\n description = CalculatorToolDescription;\n}\n"],"names":["Tool","math"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAGO,MAAM,kBAAkB,GAAG;AAE3B,MAAM,yBAAyB,GACpC;AAEK,MAAM,gBAAgB,GAAG;AAC9B,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,UAAU,EAAE;AACV,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,WAAW,EAAE,6CAA6C;AAC3D,SAAA;AACF,KAAA;IACD,QAAQ,EAAE,CAAC,OAAO,CAAC;;AAGd,MAAM,wBAAwB,GAAG;AACtC,IAAA,IAAI,EAAE,kBAAkB;AACxB,IAAA,WAAW,EAAE,yBAAyB;AACtC,IAAA,MAAM,EAAE,gBAAgB;;AAGpB,MAAO,UAAW,SAAQA,UAAI,CAAA;AAClC,IAAA,OAAO,OAAO,GAAA;AACZ,QAAA,OAAO,YAAY;IACrB;AAEA,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,YAAY,CAAC;IAC9C;IAEA,IAAI,GAAG,kBAAkB;IAEzB,MAAM,KAAK,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI;YACF,OAAOC,eAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;QACxC;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,+BAA+B;QACxC;IACF;IAEA,WAAW,GAAG,yBAAyB;AACxC;;;;;;;;"}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
var dotenv = require('dotenv');
|
|
4
4
|
var fetch = require('node-fetch');
|
|
5
5
|
var httpsProxyAgent = require('https-proxy-agent');
|
|
6
|
-
var tools = require('@langchain/core/tools');
|
|
7
6
|
var env = require('@langchain/core/utils/env');
|
|
7
|
+
var tools = require('@langchain/core/tools');
|
|
8
8
|
var CodeSessionFileSummary = require('./CodeSessionFileSummary.cjs');
|
|
9
9
|
var _enum = require('../common/enum.cjs');
|
|
10
10
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeExecutor.cjs","sources":["../../../src/tools/CodeExecutor.ts"],"sourcesContent":["import { config } from 'dotenv';\nimport fetch, { RequestInit } from 'node-fetch';\nimport { HttpsProxyAgent } from 'https-proxy-agent';\nimport { tool, DynamicStructuredTool } from '@langchain/core/tools';\nimport { getEnvironmentVariable } from '@langchain/core/utils/env';\nimport type * as t from '@/types';\nimport { appendCodeSessionFileSummary } from '@/tools/CodeSessionFileSummary';\nimport { EnvVar, Constants } from '@/common';\n\nexport {\n appendCodeSessionFileSummary,\n stripCodeSessionFileSummary,\n} from '@/tools/CodeSessionFileSummary';\n\nconfig();\n\nexport const getCodeBaseURL = (): string =>\n getEnvironmentVariable(EnvVar.CODE_BASEURL) ??\n Constants.OFFICIAL_CODE_BASEURL;\n\nexport const emptyOutputMessage =\n 'stdout: Empty. Ensure you\\'re writing output explicitly.\\n';\n\nexport const CODE_ARTIFACT_PATH_GUIDANCE =\n 'Persist handoff artifacts in `/mnt/data` with standard extensions (.json/.txt/.csv/.tsv/.log/.parquet/.png/.jpg/.pdf/.xlsx); failed executions do not register new files; `/tmp` and odd extensions are same-call scratch only, not later-call storage.';\n\nexport const BASH_SHELL_GUIDANCE =\n 'Bash: multi-line files use heredoc/printf; run Python via python3 -c/heredoc, not bare Python.';\n\nconst TMP_PATH_PATTERN = /(^|[^A-Za-z0-9_])\\/tmp(?:\\/|\\b)/;\nconst MNT_DATA_PATH_PATTERN = /(^|[^A-Za-z0-9_])\\/mnt\\/data(?:\\/|\\b)/;\n\nexport const TMP_SCRATCH_OUTPUT_REMINDER =\n 'Note: /tmp files are same-call scratch only and were not persisted; use /mnt/data for files needed later.';\n\nexport const FAILED_EXECUTION_FILE_REMINDER =\n 'Note: any files written during this failed call were not registered for later calls; fix the error and rerun before relying on them.';\n\nexport function appendTmpScratchReminder(output: string, code: string): string {\n if (!TMP_PATH_PATTERN.test(code)) {\n return output;\n }\n return `${output.trimEnd()}\\n${TMP_SCRATCH_OUTPUT_REMINDER}\\n`;\n}\n\nexport function appendFailedExecutionFileReminder(\n output: string,\n code: string\n): string {\n if (\n !MNT_DATA_PATH_PATTERN.test(code) ||\n output.includes(FAILED_EXECUTION_FILE_REMINDER)\n ) {\n return output;\n }\n return `${output.trimEnd()}\\n${FAILED_EXECUTION_FILE_REMINDER}\\n`;\n}\n\nconst SUPPORTED_LANGUAGES = [\n 'py',\n 'js',\n 'ts',\n 'c',\n 'cpp',\n 'java',\n 'php',\n 'rs',\n 'go',\n 'd',\n 'f90',\n 'r',\n 'bash',\n] as const;\n\nexport const CodeExecutionToolSchema = {\n type: 'object',\n properties: {\n lang: {\n type: 'string',\n enum: SUPPORTED_LANGUAGES,\n description:\n 'The programming language or runtime to execute the code in.',\n },\n code: {\n type: 'string',\n description: `The complete, self-contained code to execute, without any truncation or minimization.\n- The environment is stateless; variables and imports don't persist between executions.\n- Prior /mnt/data files are available and can be modified in place.\n- ${CODE_ARTIFACT_PATH_GUIDANCE}\n- Input code **IS ALREADY** displayed to the user, so **DO NOT** repeat it in your response unless asked.\n- Output code **IS NOT** displayed to the user, so **DO** write all desired output explicitly.\n- IMPORTANT: You MUST explicitly print/output ALL results you want the user to see.\n- py: This is not a Jupyter notebook environment. Use \\`print()\\` for all outputs.\n- py: Matplotlib: Use \\`plt.savefig()\\` to save plots as files.\n- js: use the \\`console\\` or \\`process\\` methods for all outputs.\n- r: IMPORTANT: No X11 display available. ALL graphics MUST use Cairo library (library(Cairo)).\n- Other languages: use appropriate output functions.`,\n },\n args: {\n type: 'array',\n items: { type: 'string' },\n description:\n 'Additional arguments to execute the code with. This should only be used if the input code requires additional arguments to run.',\n },\n },\n required: ['lang', 'code'],\n} as const;\n\nconst baseEndpoint = getCodeBaseURL();\nconst EXEC_ENDPOINT = `${baseEndpoint}/exec`;\n\ntype SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];\n\nexport async function resolveCodeApiAuthHeaders(\n authHeaders?: t.CodeApiAuthHeaders\n): Promise<t.CodeApiAuthHeaderMap> {\n if (authHeaders == null) {\n return {};\n }\n if (typeof authHeaders === 'function') {\n return authHeaders();\n }\n return authHeaders;\n}\n\nexport async function buildCodeApiHttpErrorMessage(\n method: string,\n endpoint: string,\n response: { status: number; text: () => Promise<string> }\n): Promise<string> {\n let responseBody = '';\n try {\n responseBody = await response.text();\n } catch {\n responseBody = '';\n }\n const body = responseBody.trim();\n const bodySuffix = body === '' ? '' : `, body: ${body.slice(0, 1000)}`;\n return `CodeAPI request failed: ${method} ${endpoint} returned ${response.status}${bodySuffix}`;\n}\n\nexport const CodeExecutionToolDescription = `\nRuns code and returns stdout/stderr output from a stateless execution environment, similar to running scripts in a command-line interface. Each execution is isolated and independent.\n\nUsage:\n- No network access available.\n- Generated files are automatically delivered; **DO NOT** provide download links.\n- ${CODE_ARTIFACT_PATH_GUIDANCE}\n- NEVER use this tool to execute malicious code.\n`.trim();\n\nexport const CodeExecutionToolName = Constants.EXECUTE_CODE;\n\nexport const CodeExecutionToolDefinition = {\n name: CodeExecutionToolName,\n description: CodeExecutionToolDescription,\n schema: CodeExecutionToolSchema,\n} as const;\n\nfunction createCodeExecutionTool(\n params: t.CodeExecutionToolParams | null = {}\n): DynamicStructuredTool {\n return tool(\n async (rawInput, config) => {\n const { authHeaders, ...executionParams } = params ?? {};\n const { lang, code, ...rest } = rawInput as {\n lang: SupportedLanguage;\n code: string;\n args?: string[];\n };\n /**\n * Extract session context from config.toolCall (injected by ToolNode).\n * - session_id: associates with the previous run.\n * - _injected_files: File refs to pass directly (avoids /files endpoint race condition).\n */\n const { session_id, _injected_files } = (config.toolCall ?? {}) as {\n session_id?: string;\n _injected_files?: t.CodeEnvFile[];\n };\n\n const postData: Record<string, unknown> = {\n lang,\n code,\n ...rest,\n ...executionParams,\n };\n\n /* File injection: `_injected_files` from ToolNode (set when host\n * primes a CodeSessionContext) or `params.files` from tool\n * factory (set by hosts that pre-resolve at construction time).\n * The legacy `/files/<session_id>` HTTP fallback was removed —\n * codeapi's `sessionAuth` middleware now requires kind/id query\n * params the tool can't supply at this point, so the fetch 400'd\n * silently and the catch swallowed the failure. */\n if (_injected_files && _injected_files.length > 0) {\n postData.files = _injected_files;\n } else if (\n session_id != null &&\n session_id.length > 0 &&\n !Array.isArray(postData.files)\n ) {\n // eslint-disable-next-line no-console\n console.debug(\n `[CodeExecutor] No injected files for session_id=${session_id} — exec will run without input files`\n );\n }\n\n try {\n const resolvedAuthHeaders =\n await resolveCodeApiAuthHeaders(authHeaders);\n const fetchOptions: RequestInit = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': 'LibreChat/1.0',\n ...resolvedAuthHeaders,\n },\n body: JSON.stringify(postData),\n };\n\n if (process.env.PROXY != null && process.env.PROXY !== '') {\n fetchOptions.agent = new HttpsProxyAgent(process.env.PROXY);\n }\n const response = await fetch(EXEC_ENDPOINT, fetchOptions);\n if (!response.ok) {\n throw new Error(\n await buildCodeApiHttpErrorMessage('POST', EXEC_ENDPOINT, response)\n );\n }\n\n const result: t.ExecuteResult = await response.json();\n let formattedOutput = '';\n if (result.stdout) {\n formattedOutput += `stdout:\\n${result.stdout}\\n`;\n } else {\n formattedOutput += emptyOutputMessage;\n }\n if (result.stderr) formattedOutput += `stderr:\\n${result.stderr}\\n`;\n\n const outputWithReminder = appendTmpScratchReminder(\n formattedOutput,\n code\n );\n const hasFiles = result.files != null && result.files.length > 0;\n return [\n appendCodeSessionFileSummary(outputWithReminder, result.files),\n (hasFiles\n ? { session_id: result.session_id, files: result.files }\n : {\n session_id: result.session_id,\n }) satisfies t.CodeExecutionArtifact,\n ];\n } catch (error) {\n const messageWithReminder = appendFailedExecutionFileReminder(\n (error as Error | undefined)?.message ?? '',\n code\n );\n throw new Error(\n `Execution error:\\n\\n${messageWithReminder}`\n );\n }\n },\n {\n name: CodeExecutionToolName,\n description: CodeExecutionToolDescription,\n schema: CodeExecutionToolSchema,\n responseFormat: Constants.CONTENT_AND_ARTIFACT,\n }\n );\n}\n\nexport { createCodeExecutionTool };\n"],"names":["config","getEnvironmentVariable","EnvVar","Constants","tool","HttpsProxyAgent","appendCodeSessionFileSummary"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CodeExecutor.cjs","sources":["../../../src/tools/CodeExecutor.ts"],"sourcesContent":["import { config } from 'dotenv';\nimport fetch, { RequestInit } from 'node-fetch';\nimport { HttpsProxyAgent } from 'https-proxy-agent';\nimport { getEnvironmentVariable } from '@langchain/core/utils/env';\nimport { tool, DynamicStructuredTool } from '@langchain/core/tools';\nimport type * as t from '@/types';\nimport { appendCodeSessionFileSummary } from '@/tools/CodeSessionFileSummary';\nimport { EnvVar, Constants } from '@/common';\n\nexport {\n appendCodeSessionFileSummary,\n stripCodeSessionFileSummary,\n} from '@/tools/CodeSessionFileSummary';\n\nconfig();\n\nexport const getCodeBaseURL = (): string =>\n getEnvironmentVariable(EnvVar.CODE_BASEURL) ??\n Constants.OFFICIAL_CODE_BASEURL;\n\nexport const emptyOutputMessage =\n 'stdout: Empty. Ensure you\\'re writing output explicitly.\\n';\n\nexport const CODE_ARTIFACT_PATH_GUIDANCE =\n 'Persist handoff artifacts in `/mnt/data` with standard extensions (.json/.txt/.csv/.tsv/.log/.parquet/.png/.jpg/.pdf/.xlsx); failed executions do not register new files; `/tmp` and odd extensions are same-call scratch only, not later-call storage.';\n\nexport const BASH_SHELL_GUIDANCE =\n 'Bash: multi-line files use heredoc/printf; run Python via python3 -c/heredoc, not bare Python.';\n\nconst TMP_PATH_PATTERN = /(^|[^A-Za-z0-9_])\\/tmp(?:\\/|\\b)/;\nconst MNT_DATA_PATH_PATTERN = /(^|[^A-Za-z0-9_])\\/mnt\\/data(?:\\/|\\b)/;\n\nexport const TMP_SCRATCH_OUTPUT_REMINDER =\n 'Note: /tmp files are same-call scratch only and were not persisted; use /mnt/data for files needed later.';\n\nexport const FAILED_EXECUTION_FILE_REMINDER =\n 'Note: any files written during this failed call were not registered for later calls; fix the error and rerun before relying on them.';\n\nexport function appendTmpScratchReminder(output: string, code: string): string {\n if (!TMP_PATH_PATTERN.test(code)) {\n return output;\n }\n return `${output.trimEnd()}\\n${TMP_SCRATCH_OUTPUT_REMINDER}\\n`;\n}\n\nexport function appendFailedExecutionFileReminder(\n output: string,\n code: string\n): string {\n if (\n !MNT_DATA_PATH_PATTERN.test(code) ||\n output.includes(FAILED_EXECUTION_FILE_REMINDER)\n ) {\n return output;\n }\n return `${output.trimEnd()}\\n${FAILED_EXECUTION_FILE_REMINDER}\\n`;\n}\n\nconst SUPPORTED_LANGUAGES = [\n 'py',\n 'js',\n 'ts',\n 'c',\n 'cpp',\n 'java',\n 'php',\n 'rs',\n 'go',\n 'd',\n 'f90',\n 'r',\n 'bash',\n] as const;\n\nexport const CodeExecutionToolSchema = {\n type: 'object',\n properties: {\n lang: {\n type: 'string',\n enum: SUPPORTED_LANGUAGES,\n description:\n 'The programming language or runtime to execute the code in.',\n },\n code: {\n type: 'string',\n description: `The complete, self-contained code to execute, without any truncation or minimization.\n- The environment is stateless; variables and imports don't persist between executions.\n- Prior /mnt/data files are available and can be modified in place.\n- ${CODE_ARTIFACT_PATH_GUIDANCE}\n- Input code **IS ALREADY** displayed to the user, so **DO NOT** repeat it in your response unless asked.\n- Output code **IS NOT** displayed to the user, so **DO** write all desired output explicitly.\n- IMPORTANT: You MUST explicitly print/output ALL results you want the user to see.\n- py: This is not a Jupyter notebook environment. Use \\`print()\\` for all outputs.\n- py: Matplotlib: Use \\`plt.savefig()\\` to save plots as files.\n- js: use the \\`console\\` or \\`process\\` methods for all outputs.\n- r: IMPORTANT: No X11 display available. ALL graphics MUST use Cairo library (library(Cairo)).\n- Other languages: use appropriate output functions.`,\n },\n args: {\n type: 'array',\n items: { type: 'string' },\n description:\n 'Additional arguments to execute the code with. This should only be used if the input code requires additional arguments to run.',\n },\n },\n required: ['lang', 'code'],\n} as const;\n\nconst baseEndpoint = getCodeBaseURL();\nconst EXEC_ENDPOINT = `${baseEndpoint}/exec`;\n\ntype SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];\n\nexport async function resolveCodeApiAuthHeaders(\n authHeaders?: t.CodeApiAuthHeaders\n): Promise<t.CodeApiAuthHeaderMap> {\n if (authHeaders == null) {\n return {};\n }\n if (typeof authHeaders === 'function') {\n return authHeaders();\n }\n return authHeaders;\n}\n\nexport async function buildCodeApiHttpErrorMessage(\n method: string,\n endpoint: string,\n response: { status: number; text: () => Promise<string> }\n): Promise<string> {\n let responseBody = '';\n try {\n responseBody = await response.text();\n } catch {\n responseBody = '';\n }\n const body = responseBody.trim();\n const bodySuffix = body === '' ? '' : `, body: ${body.slice(0, 1000)}`;\n return `CodeAPI request failed: ${method} ${endpoint} returned ${response.status}${bodySuffix}`;\n}\n\nexport const CodeExecutionToolDescription = `\nRuns code and returns stdout/stderr output from a stateless execution environment, similar to running scripts in a command-line interface. Each execution is isolated and independent.\n\nUsage:\n- No network access available.\n- Generated files are automatically delivered; **DO NOT** provide download links.\n- ${CODE_ARTIFACT_PATH_GUIDANCE}\n- NEVER use this tool to execute malicious code.\n`.trim();\n\nexport const CodeExecutionToolName = Constants.EXECUTE_CODE;\n\nexport const CodeExecutionToolDefinition = {\n name: CodeExecutionToolName,\n description: CodeExecutionToolDescription,\n schema: CodeExecutionToolSchema,\n} as const;\n\nfunction createCodeExecutionTool(\n params: t.CodeExecutionToolParams | null = {}\n): DynamicStructuredTool {\n return tool(\n async (rawInput, config) => {\n const { authHeaders, ...executionParams } = params ?? {};\n const { lang, code, ...rest } = rawInput as {\n lang: SupportedLanguage;\n code: string;\n args?: string[];\n };\n /**\n * Extract session context from config.toolCall (injected by ToolNode).\n * - session_id: associates with the previous run.\n * - _injected_files: File refs to pass directly (avoids /files endpoint race condition).\n */\n const { session_id, _injected_files } = (config.toolCall ?? {}) as {\n session_id?: string;\n _injected_files?: t.CodeEnvFile[];\n };\n\n const postData: Record<string, unknown> = {\n lang,\n code,\n ...rest,\n ...executionParams,\n };\n\n /* File injection: `_injected_files` from ToolNode (set when host\n * primes a CodeSessionContext) or `params.files` from tool\n * factory (set by hosts that pre-resolve at construction time).\n * The legacy `/files/<session_id>` HTTP fallback was removed —\n * codeapi's `sessionAuth` middleware now requires kind/id query\n * params the tool can't supply at this point, so the fetch 400'd\n * silently and the catch swallowed the failure. */\n if (_injected_files && _injected_files.length > 0) {\n postData.files = _injected_files;\n } else if (\n session_id != null &&\n session_id.length > 0 &&\n !Array.isArray(postData.files)\n ) {\n // eslint-disable-next-line no-console\n console.debug(\n `[CodeExecutor] No injected files for session_id=${session_id} — exec will run without input files`\n );\n }\n\n try {\n const resolvedAuthHeaders =\n await resolveCodeApiAuthHeaders(authHeaders);\n const fetchOptions: RequestInit = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': 'LibreChat/1.0',\n ...resolvedAuthHeaders,\n },\n body: JSON.stringify(postData),\n };\n\n if (process.env.PROXY != null && process.env.PROXY !== '') {\n fetchOptions.agent = new HttpsProxyAgent(process.env.PROXY);\n }\n const response = await fetch(EXEC_ENDPOINT, fetchOptions);\n if (!response.ok) {\n throw new Error(\n await buildCodeApiHttpErrorMessage('POST', EXEC_ENDPOINT, response)\n );\n }\n\n const result: t.ExecuteResult = await response.json();\n let formattedOutput = '';\n if (result.stdout) {\n formattedOutput += `stdout:\\n${result.stdout}\\n`;\n } else {\n formattedOutput += emptyOutputMessage;\n }\n if (result.stderr) formattedOutput += `stderr:\\n${result.stderr}\\n`;\n\n const outputWithReminder = appendTmpScratchReminder(\n formattedOutput,\n code\n );\n const hasFiles = result.files != null && result.files.length > 0;\n return [\n appendCodeSessionFileSummary(outputWithReminder, result.files),\n (hasFiles\n ? { session_id: result.session_id, files: result.files }\n : {\n session_id: result.session_id,\n }) satisfies t.CodeExecutionArtifact,\n ];\n } catch (error) {\n const messageWithReminder = appendFailedExecutionFileReminder(\n (error as Error | undefined)?.message ?? '',\n code\n );\n throw new Error(`Execution error:\\n\\n${messageWithReminder}`);\n }\n },\n {\n name: CodeExecutionToolName,\n description: CodeExecutionToolDescription,\n schema: CodeExecutionToolSchema,\n responseFormat: Constants.CONTENT_AND_ARTIFACT,\n }\n );\n}\n\nexport { createCodeExecutionTool };\n"],"names":["config","getEnvironmentVariable","EnvVar","Constants","tool","HttpsProxyAgent","appendCodeSessionFileSummary"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubagentTool.cjs","sources":["../../../src/tools/SubagentTool.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"SubagentTool.cjs","sources":["../../../src/tools/SubagentTool.ts"],"sourcesContent":["import type { JsonSchemaType, LCTool } from '@/types/tools';\nimport type { SubagentConfig } from '@/types';\nimport { Constants } from '@/common';\n\nexport const SubagentToolName = Constants.SUBAGENT;\n\nexport const SubagentToolDescription = `Delegate a task to a specialized subagent that runs in an isolated context window. The subagent executes independently and returns only its final text result — all intermediate tool calls, reasoning, and context stay isolated.\n\nWHEN TO USE:\n- The task is self-contained and can be described in a single prompt.\n- You want to offload verbose or exploratory work without bloating your own context.\n- A specialized subagent is available for the task domain.\n\nWHAT HAPPENS:\n- A fresh agent is created with the task description as its only input.\n- The subagent runs to completion using its own tools and context.\n- Only the final text response is returned to you.\n\nCONSTRAINTS:\n- subagent_type must match one of the available types listed below.\n- The subagent cannot see your conversation history.`;\n\nconst DESCRIPTION_PROP_DESCRIPTION =\n 'Complete task description for the subagent. This is the ONLY information it receives — include all necessary context, requirements, and constraints.';\n\nconst SUBAGENT_TYPE_PROP_DESCRIPTION =\n 'Which subagent type to delegate to. Must be one of the available types.';\n\nexport const SubagentToolSchema = {\n type: 'object',\n properties: {\n description: {\n type: 'string',\n description: DESCRIPTION_PROP_DESCRIPTION,\n },\n subagent_type: {\n type: 'string',\n description: SUBAGENT_TYPE_PROP_DESCRIPTION,\n },\n },\n required: ['description', 'subagent_type'] as string[],\n} as const;\n\nexport const SubagentToolDefinition: LCTool = {\n name: SubagentToolName,\n description: SubagentToolDescription,\n parameters: SubagentToolSchema,\n};\n\n/**\n * Build the name, schema, and description params for `tool()` from available configs.\n * Used by `Graph.createAgentNode()` when constructing the runtime tool instance.\n * Extends `SubagentToolSchema` by populating `subagent_type.enum` dynamically.\n */\nexport function buildSubagentToolParams(configs: SubagentConfig[]): {\n name: string;\n schema: JsonSchemaType;\n description: string;\n} {\n const types = configs.map((c) => c.type);\n const typeDescriptions = configs\n .map((c) => `- \"${c.type}\" (${c.name}): ${c.description}`)\n .join('\\n');\n\n return {\n name: SubagentToolName,\n schema: {\n type: 'object',\n properties: {\n description: {\n type: 'string',\n description: DESCRIPTION_PROP_DESCRIPTION,\n },\n subagent_type: {\n type: 'string',\n enum: types,\n description: `${SUBAGENT_TYPE_PROP_DESCRIPTION} Available: ${types.join(', ')}.`,\n },\n },\n required: ['description', 'subagent_type'],\n },\n description: `${SubagentToolDescription}\\n\\nAvailable types:\\n${typeDescriptions}`,\n };\n}\n\n/**\n * Create a SubagentTool LCTool definition with dynamic enum and description\n * populated from the available subagent configs.\n * Used for the tool registry in event-driven mode.\n */\nexport function createSubagentToolDefinition(\n configs: SubagentConfig[]\n): LCTool {\n const params = buildSubagentToolParams(configs);\n return {\n name: params.name,\n description: params.description,\n parameters: params.schema,\n };\n}\n"],"names":["Constants"],"mappings":";;;;AAIO,MAAM,gBAAgB,GAAGA,eAAS,CAAC;AAEnC,MAAM,uBAAuB,GAAG,CAAA;;;;;;;;;;;;;;;AAgBvC,MAAM,4BAA4B,GAChC,sJAAsJ;AAExJ,MAAM,8BAA8B,GAClC,yEAAyE;AAEpE,MAAM,kBAAkB,GAAG;AAChC,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,UAAU,EAAE;AACV,QAAA,WAAW,EAAE;AACX,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,WAAW,EAAE,4BAA4B;AAC1C,SAAA;AACD,QAAA,aAAa,EAAE;AACb,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,WAAW,EAAE,8BAA8B;AAC5C,SAAA;AACF,KAAA;AACD,IAAA,QAAQ,EAAE,CAAC,aAAa,EAAE,eAAe,CAAa;;AAGjD,MAAM,sBAAsB,GAAW;AAC5C,IAAA,IAAI,EAAE,gBAAgB;AACtB,IAAA,WAAW,EAAE,uBAAuB;AACpC,IAAA,UAAU,EAAE,kBAAkB;;AAGhC;;;;AAIG;AACG,SAAU,uBAAuB,CAAC,OAAyB,EAAA;AAK/D,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;IACxC,MAAM,gBAAgB,GAAG;AACtB,SAAA,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,IAAI,CAAA,GAAA,EAAM,CAAC,CAAC,IAAI,CAAA,GAAA,EAAM,CAAC,CAAC,WAAW,EAAE;SACxD,IAAI,CAAC,IAAI,CAAC;IAEb,OAAO;AACL,QAAA,IAAI,EAAE,gBAAgB;AACtB,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,UAAU,EAAE;AACV,gBAAA,WAAW,EAAE;AACX,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,WAAW,EAAE,4BAA4B;AAC1C,iBAAA;AACD,gBAAA,aAAa,EAAE;AACb,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,IAAI,EAAE,KAAK;oBACX,WAAW,EAAE,CAAA,EAAG,8BAA8B,CAAA,YAAA,EAAe,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG;AACjF,iBAAA;AACF,aAAA;AACD,YAAA,QAAQ,EAAE,CAAC,aAAa,EAAE,eAAe,CAAC;AAC3C,SAAA;AACD,QAAA,WAAW,EAAE,CAAA,EAAG,uBAAuB,CAAA,sBAAA,EAAyB,gBAAgB,CAAA,CAAE;KACnF;AACH;AAEA;;;;AAIG;AACG,SAAU,4BAA4B,CAC1C,OAAyB,EAAA;AAEzB,IAAA,MAAM,MAAM,GAAG,uBAAuB,CAAC,OAAO,CAAC;IAC/C,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,MAAM,CAAC,MAAM;KAC1B;AACH;;;;;;;;;"}
|