@illuma-ai/agents 1.0.90 → 1.0.93
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 +98 -49
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/common/constants.cjs +25 -0
- package/dist/cjs/common/constants.cjs.map +1 -0
- package/dist/cjs/common/enum.cjs +30 -0
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/events.cjs +9 -4
- package/dist/cjs/events.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +397 -92
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +223 -92
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/instrumentation.cjs +30 -14
- package/dist/cjs/instrumentation.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/index.cjs +43 -11
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +10 -7
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +32 -0
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +129 -101
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +489 -0
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -0
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +176 -0
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -0
- package/dist/cjs/llm/fake.cjs.map +1 -1
- package/dist/cjs/llm/google/index.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/common.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.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs +59 -5
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/llm/providers.cjs.map +1 -1
- package/dist/cjs/llm/text.cjs.map +1 -1
- package/dist/cjs/llm/vertexai/index.cjs +80 -2
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +60 -27
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +131 -108
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/content.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +3 -0
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +265 -47
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/ids.cjs.map +1 -1
- package/dist/cjs/messages/prune.cjs +55 -2
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/messages/summarize.cjs +170 -0
- package/dist/cjs/messages/summarize.cjs.map +1 -0
- package/dist/cjs/messages/tools.cjs.map +1 -1
- package/dist/cjs/run.cjs +87 -30
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/schemas/validate.cjs.map +1 -1
- package/dist/cjs/splitStream.cjs.map +1 -1
- package/dist/cjs/stream.cjs +59 -25
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/tools/AskUser.cjs +131 -0
- package/dist/cjs/tools/AskUser.cjs.map +1 -0
- package/dist/cjs/tools/BrowserTools.cjs +11 -7
- package/dist/cjs/tools/BrowserTools.cjs.map +1 -1
- package/dist/cjs/tools/Calculator.cjs.map +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs +46 -4
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +36 -53
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/StreamingToolCallBuffer.cjs +208 -0
- package/dist/cjs/tools/StreamingToolCallBuffer.cjs.map +1 -0
- package/dist/cjs/tools/ToolNode.cjs +333 -30
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/ToolSearch.cjs +66 -30
- package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
- package/dist/cjs/tools/handlers.cjs +94 -8
- package/dist/cjs/tools/handlers.cjs.map +1 -1
- package/dist/cjs/tools/schema.cjs.map +1 -1
- package/dist/cjs/tools/search/content.cjs.map +1 -1
- package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
- package/dist/cjs/tools/search/format.cjs.map +1 -1
- package/dist/cjs/tools/search/highlights.cjs.map +1 -1
- package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
- package/dist/cjs/tools/search/schema.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +1 -0
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/cjs/types/graph.cjs +1 -1
- package/dist/cjs/types/graph.cjs.map +1 -1
- package/dist/cjs/utils/contextAnalytics.cjs +23 -6
- package/dist/cjs/utils/contextAnalytics.cjs.map +1 -1
- package/dist/cjs/utils/events.cjs.map +1 -1
- package/dist/cjs/utils/graph.cjs.map +1 -1
- package/dist/cjs/utils/handlers.cjs.map +1 -1
- package/dist/cjs/utils/llm.cjs.map +1 -1
- package/dist/cjs/utils/misc.cjs.map +1 -1
- package/dist/cjs/utils/run.cjs +3 -1
- package/dist/cjs/utils/run.cjs.map +1 -1
- package/dist/cjs/utils/schema.cjs.map +1 -1
- package/dist/cjs/utils/title.cjs.map +1 -1
- package/dist/cjs/utils/tokens.cjs +33 -58
- package/dist/cjs/utils/tokens.cjs.map +1 -1
- package/dist/cjs/utils/toolCallContinuation.cjs +55 -0
- package/dist/cjs/utils/toolCallContinuation.cjs.map +1 -0
- package/dist/cjs/utils/toonFormat.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +98 -49
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/common/constants.mjs +22 -0
- package/dist/esm/common/constants.mjs.map +1 -0
- package/dist/esm/common/enum.mjs +31 -1
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/events.mjs +9 -4
- package/dist/esm/events.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +393 -88
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +224 -93
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/instrumentation.mjs +30 -14
- package/dist/esm/instrumentation.mjs.map +1 -1
- package/dist/esm/llm/anthropic/index.mjs +43 -11
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/anthropic/types.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +10 -7
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs +32 -0
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +128 -101
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs +484 -0
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -0
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs +171 -0
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -0
- package/dist/esm/llm/fake.mjs.map +1 -1
- package/dist/esm/llm/google/index.mjs.map +1 -1
- package/dist/esm/llm/google/utils/common.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.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs +59 -5
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/llm/providers.mjs.map +1 -1
- package/dist/esm/llm/text.mjs.map +1 -1
- package/dist/esm/llm/vertexai/index.mjs +80 -2
- package/dist/esm/llm/vertexai/index.mjs.map +1 -1
- package/dist/esm/main.mjs +8 -3
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/messages/cache.mjs +131 -108
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/content.mjs.map +1 -1
- package/dist/esm/messages/core.mjs +4 -1
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +267 -49
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/ids.mjs.map +1 -1
- package/dist/esm/messages/prune.mjs +56 -4
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/messages/summarize.mjs +161 -0
- package/dist/esm/messages/summarize.mjs.map +1 -0
- package/dist/esm/messages/tools.mjs.map +1 -1
- package/dist/esm/run.mjs +88 -31
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/schemas/validate.mjs.map +1 -1
- package/dist/esm/splitStream.mjs.map +1 -1
- package/dist/esm/stream.mjs +60 -26
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/tools/AskUser.mjs +125 -0
- package/dist/esm/tools/AskUser.mjs.map +1 -0
- package/dist/esm/tools/BrowserTools.mjs +11 -7
- package/dist/esm/tools/BrowserTools.mjs.map +1 -1
- package/dist/esm/tools/Calculator.mjs.map +1 -1
- package/dist/esm/tools/CodeExecutor.mjs +46 -4
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +37 -54
- package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/StreamingToolCallBuffer.mjs +206 -0
- package/dist/esm/tools/StreamingToolCallBuffer.mjs.map +1 -0
- package/dist/esm/tools/ToolNode.mjs +333 -30
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/ToolSearch.mjs +66 -30
- package/dist/esm/tools/ToolSearch.mjs.map +1 -1
- package/dist/esm/tools/handlers.mjs +95 -9
- package/dist/esm/tools/handlers.mjs.map +1 -1
- package/dist/esm/tools/schema.mjs.map +1 -1
- package/dist/esm/tools/search/content.mjs.map +1 -1
- package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
- package/dist/esm/tools/search/format.mjs.map +1 -1
- package/dist/esm/tools/search/highlights.mjs.map +1 -1
- package/dist/esm/tools/search/rerankers.mjs.map +1 -1
- package/dist/esm/tools/search/schema.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +1 -0
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/esm/types/graph.mjs +1 -1
- package/dist/esm/types/graph.mjs.map +1 -1
- package/dist/esm/utils/contextAnalytics.mjs +23 -6
- package/dist/esm/utils/contextAnalytics.mjs.map +1 -1
- package/dist/esm/utils/events.mjs.map +1 -1
- package/dist/esm/utils/graph.mjs.map +1 -1
- package/dist/esm/utils/handlers.mjs.map +1 -1
- package/dist/esm/utils/llm.mjs.map +1 -1
- package/dist/esm/utils/misc.mjs.map +1 -1
- package/dist/esm/utils/run.mjs +3 -1
- package/dist/esm/utils/run.mjs.map +1 -1
- package/dist/esm/utils/schema.mjs.map +1 -1
- package/dist/esm/utils/title.mjs.map +1 -1
- package/dist/esm/utils/tokens.mjs +33 -59
- package/dist/esm/utils/tokens.mjs.map +1 -1
- package/dist/esm/utils/toolCallContinuation.mjs +52 -0
- package/dist/esm/utils/toolCallContinuation.mjs.map +1 -0
- package/dist/esm/utils/toonFormat.mjs.map +1 -1
- package/dist/types/agents/AgentContext.d.ts +14 -7
- package/dist/types/common/constants.d.ts +18 -0
- package/dist/types/common/enum.d.ts +28 -0
- package/dist/types/common/index.d.ts +1 -0
- package/dist/types/events.d.ts +10 -3
- package/dist/types/graphs/Graph.d.ts +37 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/llm/anthropic/index.d.ts +7 -1
- package/dist/types/llm/anthropic/types.d.ts +5 -2
- package/dist/types/llm/anthropic/utils/message_outputs.d.ts +1 -1
- package/dist/types/llm/bedrock/index.d.ts +40 -33
- package/dist/types/llm/bedrock/utils/message_outputs.d.ts +1 -1
- package/dist/types/llm/google/index.d.ts +2 -3
- package/dist/types/llm/openrouter/index.d.ts +21 -1
- package/dist/types/llm/vertexai/index.d.ts +3 -2
- package/dist/types/messages/cache.d.ts +1 -1
- package/dist/types/messages/index.d.ts +1 -0
- package/dist/types/messages/prune.d.ts +2 -7
- package/dist/types/messages/summarize.d.ts +33 -0
- package/dist/types/run.d.ts +6 -0
- package/dist/types/tools/AskUser.d.ts +408 -0
- package/dist/types/tools/BrowserTools.d.ts +2 -2
- package/dist/types/tools/CodeExecutor.d.ts +2 -2
- package/dist/types/tools/StreamingToolCallBuffer.d.ts +106 -0
- package/dist/types/tools/ToolNode.d.ts +55 -3
- package/dist/types/tools/ToolSearch.d.ts +9 -5
- package/dist/types/tools/handlers.d.ts +2 -2
- package/dist/types/types/graph.d.ts +9 -2
- package/dist/types/types/llm.d.ts +8 -3
- package/dist/types/types/run.d.ts +2 -0
- package/dist/types/types/tools.d.ts +20 -2
- package/dist/types/utils/contextAnalytics.d.ts +5 -4
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/tokens.d.ts +6 -19
- package/dist/types/utils/toolCallContinuation.d.ts +30 -0
- package/package.json +15 -8
- package/src/agents/AgentContext.js +782 -0
- package/src/agents/AgentContext.js.map +1 -0
- package/src/agents/AgentContext.test.js +421 -0
- package/src/agents/AgentContext.test.js.map +1 -0
- package/src/agents/AgentContext.ts +132 -64
- package/src/agents/__tests__/AgentContext.test.js +678 -0
- package/src/agents/__tests__/AgentContext.test.js.map +1 -0
- package/src/agents/__tests__/AgentContext.test.ts +25 -4
- package/src/agents/__tests__/resolveStructuredOutputMode.test.js +117 -0
- package/src/agents/__tests__/resolveStructuredOutputMode.test.js.map +1 -0
- package/src/common/__tests__/enum.test.ts +135 -0
- package/src/common/constants.ts +21 -0
- package/src/common/enum.js +192 -0
- package/src/common/enum.js.map +1 -0
- package/src/common/enum.ts +30 -0
- package/src/common/index.js +3 -0
- package/src/common/index.js.map +1 -0
- package/src/common/index.ts +2 -1
- package/src/events.js +166 -0
- package/src/events.js.map +1 -0
- package/src/events.ts +11 -14
- package/src/graphs/Graph.js +1857 -0
- package/src/graphs/Graph.js.map +1 -0
- package/src/graphs/Graph.ts +580 -162
- package/src/graphs/MultiAgentGraph.js +1092 -0
- package/src/graphs/MultiAgentGraph.js.map +1 -0
- package/src/graphs/MultiAgentGraph.ts +331 -112
- package/src/graphs/__tests__/adaptive-thinking.test.ts +369 -0
- package/src/graphs/__tests__/graph-direct-tool-names.test.ts +210 -0
- package/src/graphs/__tests__/multi-agent-edges.test.ts +237 -0
- package/src/graphs/__tests__/structured-output.integration.test.js +624 -0
- package/src/graphs/__tests__/structured-output.integration.test.js.map +1 -0
- package/src/graphs/__tests__/structured-output.test.js +144 -0
- package/src/graphs/__tests__/structured-output.test.js.map +1 -0
- package/src/graphs/contextManagement.e2e.test.js +718 -0
- package/src/graphs/contextManagement.e2e.test.js.map +1 -0
- package/src/graphs/contextManagement.e2e.test.ts +990 -0
- package/src/graphs/contextManagement.test.js +485 -0
- package/src/graphs/contextManagement.test.js.map +1 -0
- package/src/graphs/contextManagement.test.ts +625 -0
- package/src/graphs/handoffValidation.test.js +276 -0
- package/src/graphs/handoffValidation.test.js.map +1 -0
- package/src/graphs/handoffValidation.test.ts +353 -0
- package/src/graphs/index.js +3 -0
- package/src/graphs/index.js.map +1 -0
- package/src/index.js +28 -0
- package/src/index.js.map +1 -0
- package/src/index.ts +13 -0
- package/src/instrumentation.js +21 -0
- package/src/instrumentation.js.map +1 -0
- package/src/instrumentation.ts +38 -17
- package/src/llm/anthropic/index.js +319 -0
- package/src/llm/anthropic/index.js.map +1 -0
- package/src/llm/anthropic/index.ts +68 -15
- package/src/llm/anthropic/llm.spec.ts +402 -0
- package/src/llm/anthropic/types.js +46 -0
- package/src/llm/anthropic/types.js.map +1 -0
- package/src/llm/anthropic/types.ts +8 -2
- package/src/llm/anthropic/utils/message_inputs.js +627 -0
- package/src/llm/anthropic/utils/message_inputs.js.map +1 -0
- package/src/llm/anthropic/utils/message_inputs.ts +16 -33
- package/src/llm/anthropic/utils/message_outputs.js +290 -0
- package/src/llm/anthropic/utils/message_outputs.js.map +1 -0
- package/src/llm/anthropic/utils/message_outputs.ts +40 -1
- package/src/llm/anthropic/utils/output_parsers.js +89 -0
- package/src/llm/anthropic/utils/output_parsers.js.map +1 -0
- package/src/llm/anthropic/utils/tools.js +25 -0
- package/src/llm/anthropic/utils/tools.js.map +1 -0
- package/src/llm/bedrock/__tests__/bedrock-caching.test.js +392 -0
- package/src/llm/bedrock/__tests__/bedrock-caching.test.js.map +1 -0
- package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +24 -40
- package/src/llm/bedrock/index.js +303 -0
- package/src/llm/bedrock/index.js.map +1 -0
- package/src/llm/bedrock/index.ts +171 -134
- package/src/llm/bedrock/llm.spec.ts +395 -52
- package/src/llm/bedrock/types.js +2 -0
- package/src/llm/bedrock/types.js.map +1 -0
- package/src/llm/bedrock/utils/index.js +6 -0
- package/src/llm/bedrock/utils/index.js.map +1 -0
- package/src/llm/bedrock/utils/message_inputs.js +463 -0
- package/src/llm/bedrock/utils/message_inputs.js.map +1 -0
- package/src/llm/bedrock/utils/message_inputs.ts +30 -5
- package/src/llm/bedrock/utils/message_outputs.js +269 -0
- package/src/llm/bedrock/utils/message_outputs.js.map +1 -0
- package/src/llm/bedrock/utils/message_outputs.ts +70 -22
- package/src/llm/fake.js +92 -0
- package/src/llm/fake.js.map +1 -0
- package/src/llm/google/index.js +215 -0
- package/src/llm/google/index.js.map +1 -0
- package/src/llm/google/index.ts +2 -3
- package/src/llm/google/types.js +12 -0
- package/src/llm/google/types.js.map +1 -0
- package/src/llm/google/utils/common.js +670 -0
- package/src/llm/google/utils/common.js.map +1 -0
- package/src/llm/google/utils/tools.js +111 -0
- package/src/llm/google/utils/tools.js.map +1 -0
- package/src/llm/google/utils/zod_to_genai_parameters.js +47 -0
- package/src/llm/google/utils/zod_to_genai_parameters.js.map +1 -0
- package/src/llm/openai/index.js +1033 -0
- package/src/llm/openai/index.js.map +1 -0
- package/src/llm/openai/types.js +2 -0
- package/src/llm/openai/types.js.map +1 -0
- package/src/llm/openai/utils/index.js +756 -0
- package/src/llm/openai/utils/index.js.map +1 -0
- package/src/llm/openai/utils/isReasoningModel.test.js +79 -0
- package/src/llm/openai/utils/isReasoningModel.test.js.map +1 -0
- package/src/llm/openrouter/index.js +261 -0
- package/src/llm/openrouter/index.js.map +1 -0
- package/src/llm/openrouter/index.ts +117 -6
- package/src/llm/openrouter/reasoning.test.js +181 -0
- package/src/llm/openrouter/reasoning.test.js.map +1 -0
- package/src/llm/openrouter/reasoning.test.ts +207 -0
- package/src/llm/providers.js +36 -0
- package/src/llm/providers.js.map +1 -0
- package/src/llm/text.js +65 -0
- package/src/llm/text.js.map +1 -0
- package/src/llm/vertexai/index.js +402 -0
- package/src/llm/vertexai/index.js.map +1 -0
- package/src/llm/vertexai/index.ts +115 -5
- package/src/llm/vertexai/llm.spec.ts +114 -0
- package/src/messages/__tests__/tools.test.js +392 -0
- package/src/messages/__tests__/tools.test.js.map +1 -0
- package/src/messages/cache.js +404 -0
- package/src/messages/cache.js.map +1 -0
- package/src/messages/cache.test.js +1167 -0
- package/src/messages/cache.test.js.map +1 -0
- package/src/messages/cache.test.ts +178 -16
- package/src/messages/cache.ts +152 -147
- package/src/messages/content.js +48 -0
- package/src/messages/content.js.map +1 -0
- package/src/messages/content.test.js +314 -0
- package/src/messages/content.test.js.map +1 -0
- package/src/messages/core.js +359 -0
- package/src/messages/core.js.map +1 -0
- package/src/messages/core.ts +5 -0
- package/src/messages/ensureThinkingBlock.test.js +997 -0
- package/src/messages/ensureThinkingBlock.test.js.map +1 -0
- package/src/messages/ensureThinkingBlock.test.ts +751 -10
- package/src/messages/format.js +973 -0
- package/src/messages/format.js.map +1 -0
- package/src/messages/format.ts +334 -57
- package/src/messages/formatAgentMessages.test.js +2278 -0
- package/src/messages/formatAgentMessages.test.js.map +1 -0
- package/src/messages/formatAgentMessages.test.ts +1175 -1
- package/src/messages/formatAgentMessages.tools.test.js +362 -0
- package/src/messages/formatAgentMessages.tools.test.js.map +1 -0
- package/src/messages/formatMessage.test.js +608 -0
- package/src/messages/formatMessage.test.js.map +1 -0
- package/src/messages/ids.js +18 -0
- package/src/messages/ids.js.map +1 -0
- package/src/messages/index.js +9 -0
- package/src/messages/index.js.map +1 -0
- package/src/messages/index.ts +1 -0
- package/src/messages/labelContentByAgent.test.js +725 -0
- package/src/messages/labelContentByAgent.test.js.map +1 -0
- package/src/messages/prune.js +438 -0
- package/src/messages/prune.js.map +1 -0
- package/src/messages/prune.ts +87 -25
- package/src/messages/reducer.js +60 -0
- package/src/messages/reducer.js.map +1 -0
- package/src/messages/shiftIndexTokenCountMap.test.js +63 -0
- package/src/messages/shiftIndexTokenCountMap.test.js.map +1 -0
- package/src/messages/summarize.js +146 -0
- package/src/messages/summarize.js.map +1 -0
- package/src/messages/summarize.test.js +332 -0
- package/src/messages/summarize.test.js.map +1 -0
- package/src/messages/summarize.test.ts +466 -0
- package/src/messages/summarize.ts +222 -0
- package/src/messages/tools.js +90 -0
- package/src/messages/tools.js.map +1 -0
- package/src/mockStream.js +81 -0
- package/src/mockStream.js.map +1 -0
- package/src/prompts/collab.js +7 -0
- package/src/prompts/collab.js.map +1 -0
- package/src/prompts/index.js +3 -0
- package/src/prompts/index.js.map +1 -0
- package/src/prompts/taskmanager.js +58 -0
- package/src/prompts/taskmanager.js.map +1 -0
- package/src/run.js +427 -0
- package/src/run.js.map +1 -0
- package/src/run.ts +101 -33
- package/src/schemas/index.js +3 -0
- package/src/schemas/index.js.map +1 -0
- package/src/schemas/schema-preparation.test.js +370 -0
- package/src/schemas/schema-preparation.test.js.map +1 -0
- package/src/schemas/validate.js +314 -0
- package/src/schemas/validate.js.map +1 -0
- package/src/schemas/validate.test.js +264 -0
- package/src/schemas/validate.test.js.map +1 -0
- package/src/scripts/abort.js +127 -0
- package/src/scripts/abort.js.map +1 -0
- package/src/scripts/ant_web_search.js +130 -0
- package/src/scripts/ant_web_search.js.map +1 -0
- package/src/scripts/ant_web_search.ts +1 -0
- package/src/scripts/ant_web_search_edge_case.js +133 -0
- package/src/scripts/ant_web_search_edge_case.js.map +1 -0
- package/src/scripts/ant_web_search_edge_case.ts +1 -0
- package/src/scripts/ant_web_search_error_edge_case.js +119 -0
- package/src/scripts/ant_web_search_error_edge_case.js.map +1 -0
- package/src/scripts/ant_web_search_error_edge_case.ts +1 -0
- package/src/scripts/args.js +41 -0
- package/src/scripts/args.js.map +1 -0
- package/src/scripts/bedrock-cache-debug.js +186 -0
- package/src/scripts/bedrock-cache-debug.js.map +1 -0
- package/src/scripts/bedrock-cache-debug.ts +250 -0
- package/src/scripts/bedrock-content-aggregation-test.js +195 -0
- package/src/scripts/bedrock-content-aggregation-test.js.map +1 -0
- package/src/scripts/bedrock-content-aggregation-test.ts +266 -0
- package/src/scripts/bedrock-merge-test.js +80 -0
- package/src/scripts/bedrock-merge-test.js.map +1 -0
- package/src/scripts/bedrock-merge-test.ts +107 -0
- package/src/scripts/bedrock-parallel-tools-test.js +150 -0
- package/src/scripts/bedrock-parallel-tools-test.js.map +1 -0
- package/src/scripts/bedrock-parallel-tools-test.ts +204 -0
- package/src/scripts/caching.js +106 -0
- package/src/scripts/caching.js.map +1 -0
- package/src/scripts/caching.ts +1 -0
- package/src/scripts/cli.js +152 -0
- package/src/scripts/cli.js.map +1 -0
- package/src/scripts/cli2.js +119 -0
- package/src/scripts/cli2.js.map +1 -0
- package/src/scripts/cli3.js +163 -0
- package/src/scripts/cli3.js.map +1 -0
- package/src/scripts/cli4.js +165 -0
- package/src/scripts/cli4.js.map +1 -0
- package/src/scripts/cli5.js +165 -0
- package/src/scripts/cli5.js.map +1 -0
- package/src/scripts/code_exec.js +171 -0
- package/src/scripts/code_exec.js.map +1 -0
- package/src/scripts/code_exec.ts +1 -0
- package/src/scripts/code_exec_files.js +180 -0
- package/src/scripts/code_exec_files.js.map +1 -0
- package/src/scripts/code_exec_files.ts +1 -0
- package/src/scripts/code_exec_multi_session.js +185 -0
- package/src/scripts/code_exec_multi_session.js.map +1 -0
- package/src/scripts/code_exec_multi_session.ts +9 -13
- package/src/scripts/code_exec_ptc.js +265 -0
- package/src/scripts/code_exec_ptc.js.map +1 -0
- package/src/scripts/code_exec_ptc.ts +1 -0
- package/src/scripts/code_exec_session.js +217 -0
- package/src/scripts/code_exec_session.js.map +1 -0
- package/src/scripts/code_exec_session.ts +1 -0
- package/src/scripts/code_exec_simple.js +120 -0
- package/src/scripts/code_exec_simple.js.map +1 -0
- package/src/scripts/code_exec_simple.ts +1 -0
- package/src/scripts/content.js +111 -0
- package/src/scripts/content.js.map +1 -0
- package/src/scripts/content.ts +1 -0
- package/src/scripts/empty_input.js +125 -0
- package/src/scripts/empty_input.js.map +1 -0
- package/src/scripts/handoff-test.js +96 -0
- package/src/scripts/handoff-test.js.map +1 -0
- package/src/scripts/image.js +138 -0
- package/src/scripts/image.js.map +1 -0
- package/src/scripts/image.ts +3 -1
- package/src/scripts/memory.js +83 -0
- package/src/scripts/memory.js.map +1 -0
- package/src/scripts/memory.ts +16 -6
- package/src/scripts/multi-agent-chain.js +271 -0
- package/src/scripts/multi-agent-chain.js.map +1 -0
- package/src/scripts/multi-agent-chain.ts +1 -0
- package/src/scripts/multi-agent-conditional.js +185 -0
- package/src/scripts/multi-agent-conditional.js.map +1 -0
- package/src/scripts/multi-agent-conditional.ts +1 -0
- package/src/scripts/multi-agent-document-review-chain.js +171 -0
- package/src/scripts/multi-agent-document-review-chain.js.map +1 -0
- package/src/scripts/multi-agent-document-review-chain.ts +1 -0
- package/src/scripts/multi-agent-hybrid-flow.js +264 -0
- package/src/scripts/multi-agent-hybrid-flow.js.map +1 -0
- package/src/scripts/multi-agent-hybrid-flow.ts +1 -0
- package/src/scripts/multi-agent-parallel-start.js +214 -0
- package/src/scripts/multi-agent-parallel-start.js.map +1 -0
- package/src/scripts/multi-agent-parallel-start.ts +4 -4
- package/src/scripts/multi-agent-parallel.js +346 -0
- package/src/scripts/multi-agent-parallel.js.map +1 -0
- package/src/scripts/multi-agent-parallel.ts +1 -0
- package/src/scripts/multi-agent-sequence.js +184 -0
- package/src/scripts/multi-agent-sequence.js.map +1 -0
- package/src/scripts/multi-agent-sequence.ts +4 -4
- package/src/scripts/multi-agent-supervisor.js +324 -0
- package/src/scripts/multi-agent-supervisor.js.map +1 -0
- package/src/scripts/multi-agent-supervisor.ts +1 -0
- package/src/scripts/multi-agent-test.js +147 -0
- package/src/scripts/multi-agent-test.js.map +1 -0
- package/src/scripts/multi-agent-test.ts +1 -0
- package/src/scripts/parallel-asymmetric-tools-test.js +202 -0
- package/src/scripts/parallel-asymmetric-tools-test.js.map +1 -0
- package/src/scripts/parallel-asymmetric-tools-test.ts +1 -0
- package/src/scripts/parallel-full-metadata-test.js +176 -0
- package/src/scripts/parallel-full-metadata-test.js.map +1 -0
- package/src/scripts/parallel-full-metadata-test.ts +1 -0
- package/src/scripts/parallel-tools-test.js +256 -0
- package/src/scripts/parallel-tools-test.js.map +1 -0
- package/src/scripts/parallel-tools-test.ts +1 -0
- package/src/scripts/poc-multi-agent-comprehensive.ts +1222 -0
- package/src/scripts/programmatic_exec.js +277 -0
- package/src/scripts/programmatic_exec.js.map +1 -0
- package/src/scripts/programmatic_exec_agent.js +168 -0
- package/src/scripts/programmatic_exec_agent.js.map +1 -0
- package/src/scripts/programmatic_exec_agent.ts +1 -0
- package/src/scripts/search.js +118 -0
- package/src/scripts/search.js.map +1 -0
- package/src/scripts/search.ts +1 -0
- package/src/scripts/sequential-full-metadata-test.js +143 -0
- package/src/scripts/sequential-full-metadata-test.js.map +1 -0
- package/src/scripts/sequential-full-metadata-test.ts +1 -0
- package/src/scripts/simple.js +174 -0
- package/src/scripts/simple.js.map +1 -0
- package/src/scripts/simple.ts +2 -1
- package/src/scripts/single-agent-metadata-test.js +152 -0
- package/src/scripts/single-agent-metadata-test.js.map +1 -0
- package/src/scripts/single-agent-metadata-test.ts +4 -6
- package/src/scripts/stream.js +113 -0
- package/src/scripts/stream.js.map +1 -0
- package/src/scripts/stream.ts +1 -0
- package/src/scripts/test-custom-prompt-key.js +132 -0
- package/src/scripts/test-custom-prompt-key.js.map +1 -0
- package/src/scripts/test-handoff-input.js +143 -0
- package/src/scripts/test-handoff-input.js.map +1 -0
- package/src/scripts/test-handoff-preamble.js +227 -0
- package/src/scripts/test-handoff-preamble.js.map +1 -0
- package/src/scripts/test-handoff-preamble.ts +1 -0
- package/src/scripts/test-handoff-steering.js +353 -0
- package/src/scripts/test-handoff-steering.js.map +1 -0
- package/src/scripts/test-handoff-steering.ts +430 -0
- package/src/scripts/test-multi-agent-list-handoff.js +318 -0
- package/src/scripts/test-multi-agent-list-handoff.js.map +1 -0
- package/src/scripts/test-multi-agent-list-handoff.ts +1 -0
- package/src/scripts/test-parallel-agent-labeling.js +253 -0
- package/src/scripts/test-parallel-agent-labeling.js.map +1 -0
- package/src/scripts/test-parallel-agent-labeling.ts +2 -0
- package/src/scripts/test-parallel-handoffs.js +229 -0
- package/src/scripts/test-parallel-handoffs.js.map +1 -0
- package/src/scripts/test-parallel-handoffs.ts +1 -0
- package/src/scripts/test-thinking-handoff-bedrock.js +132 -0
- package/src/scripts/test-thinking-handoff-bedrock.js.map +1 -0
- package/src/scripts/test-thinking-handoff-bedrock.ts +1 -0
- package/src/scripts/test-thinking-handoff.js +132 -0
- package/src/scripts/test-thinking-handoff.js.map +1 -0
- package/src/scripts/test-thinking-handoff.ts +1 -0
- package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js +140 -0
- package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js.map +1 -0
- package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +166 -0
- package/src/scripts/test-tool-before-handoff-role-order.js +223 -0
- package/src/scripts/test-tool-before-handoff-role-order.js.map +1 -0
- package/src/scripts/test-tool-before-handoff-role-order.ts +276 -0
- package/src/scripts/test-tools-before-handoff.js +187 -0
- package/src/scripts/test-tools-before-handoff.js.map +1 -0
- package/src/scripts/test-tools-before-handoff.ts +4 -8
- package/src/scripts/test_code_api.js +263 -0
- package/src/scripts/test_code_api.js.map +1 -0
- package/src/scripts/thinking-bedrock.js +128 -0
- package/src/scripts/thinking-bedrock.js.map +1 -0
- package/src/scripts/thinking-bedrock.ts +1 -0
- package/src/scripts/thinking-vertexai.js +130 -0
- package/src/scripts/thinking-vertexai.js.map +1 -0
- package/src/scripts/thinking-vertexai.ts +168 -0
- package/src/scripts/thinking.js +134 -0
- package/src/scripts/thinking.js.map +1 -0
- package/src/scripts/thinking.ts +1 -0
- package/src/scripts/tool_search.js +114 -0
- package/src/scripts/tool_search.js.map +1 -0
- package/src/scripts/tools.js +125 -0
- package/src/scripts/tools.js.map +1 -0
- package/src/scripts/tools.ts +5 -19
- package/src/specs/agent-handoffs-bedrock.integration.test.js +280 -0
- package/src/specs/agent-handoffs-bedrock.integration.test.js.map +1 -0
- package/src/specs/agent-handoffs-bedrock.integration.test.ts +412 -375
- package/src/specs/agent-handoffs.test.js +924 -0
- package/src/specs/agent-handoffs.test.js.map +1 -0
- package/src/specs/agent-handoffs.test.ts +152 -39
- package/src/specs/anthropic.simple.test.js +287 -0
- package/src/specs/anthropic.simple.test.js.map +1 -0
- package/src/specs/anthropic.simple.test.ts +7 -4
- package/src/specs/azure.simple.test.js +381 -0
- package/src/specs/azure.simple.test.js.map +1 -0
- package/src/specs/azure.simple.test.ts +143 -5
- package/src/specs/cache.simple.test.js +282 -0
- package/src/specs/cache.simple.test.js.map +1 -0
- package/src/specs/cache.simple.test.ts +9 -2
- package/src/specs/custom-event-await.test.js +148 -0
- package/src/specs/custom-event-await.test.js.map +1 -0
- package/src/specs/custom-event-await.test.ts +215 -0
- package/src/specs/deepseek.simple.test.js +189 -0
- package/src/specs/deepseek.simple.test.js.map +1 -0
- package/src/specs/deepseek.simple.test.ts +4 -2
- package/src/specs/emergency-prune.test.js +308 -0
- package/src/specs/emergency-prune.test.js.map +1 -0
- package/src/specs/moonshot.simple.test.js +237 -0
- package/src/specs/moonshot.simple.test.js.map +1 -0
- package/src/specs/moonshot.simple.test.ts +6 -2
- package/src/specs/observability.integration.test.js +1337 -0
- package/src/specs/observability.integration.test.js.map +1 -0
- package/src/specs/observability.integration.test.ts +2223 -0
- package/src/specs/openai.simple.test.js +233 -0
- package/src/specs/openai.simple.test.js.map +1 -0
- package/src/specs/openai.simple.test.ts +4 -2
- package/src/specs/openrouter.simple.test.js +202 -0
- package/src/specs/openrouter.simple.test.js.map +1 -0
- package/src/specs/openrouter.simple.test.ts +165 -4
- package/src/specs/prune.test.js +733 -0
- package/src/specs/prune.test.js.map +1 -0
- package/src/specs/prune.test.ts +1 -0
- package/src/specs/reasoning.test.js +144 -0
- package/src/specs/reasoning.test.js.map +1 -0
- package/src/specs/reasoning.test.ts +2 -2
- package/src/specs/spec.utils.js +4 -0
- package/src/specs/spec.utils.js.map +1 -0
- package/src/specs/thinking-handoff.test.js +486 -0
- package/src/specs/thinking-handoff.test.js.map +1 -0
- package/src/specs/thinking-handoff.test.ts +3 -2
- package/src/specs/thinking-prune.test.js +600 -0
- package/src/specs/thinking-prune.test.js.map +1 -0
- package/src/specs/token-distribution-edge-case.test.js +246 -0
- package/src/specs/token-distribution-edge-case.test.js.map +1 -0
- package/src/specs/token-memoization.test.js +32 -0
- package/src/specs/token-memoization.test.js.map +1 -0
- package/src/specs/token-memoization.test.ts +14 -5
- package/src/specs/tokens.test.js +49 -0
- package/src/specs/tokens.test.js.map +1 -0
- package/src/specs/tokens.test.ts +64 -0
- package/src/specs/tool-error.test.js +139 -0
- package/src/specs/tool-error.test.js.map +1 -0
- package/src/specs/tool-error.test.ts +2 -2
- package/src/splitStream.js +204 -0
- package/src/splitStream.js.map +1 -0
- package/src/splitStream.test.js +504 -0
- package/src/splitStream.test.js.map +1 -0
- package/src/stream.js +650 -0
- package/src/stream.js.map +1 -0
- package/src/stream.test.js +225 -0
- package/src/stream.test.js.map +1 -0
- package/src/stream.test.ts +25 -15
- package/src/stream.ts +82 -32
- package/src/test/mockTools.js +340 -0
- package/src/test/mockTools.js.map +1 -0
- package/src/tools/AskUser.ts +159 -0
- package/src/tools/BrowserTools.js +245 -0
- package/src/tools/BrowserTools.js.map +1 -0
- package/src/tools/BrowserTools.ts +12 -8
- package/src/tools/Calculator.js +38 -0
- package/src/tools/Calculator.js.map +1 -0
- package/src/tools/Calculator.test.js +225 -0
- package/src/tools/Calculator.test.js.map +1 -0
- package/src/tools/CodeExecutor.js +233 -0
- package/src/tools/CodeExecutor.js.map +1 -0
- package/src/tools/CodeExecutor.selfhealing.test.ts +435 -0
- package/src/tools/CodeExecutor.ts +62 -4
- package/src/tools/ProgrammaticToolCalling.js +602 -0
- package/src/tools/ProgrammaticToolCalling.js.map +1 -0
- package/src/tools/ProgrammaticToolCalling.ts +40 -52
- package/src/tools/StreamingToolCallBuffer.js +179 -0
- package/src/tools/StreamingToolCallBuffer.js.map +1 -0
- package/src/tools/StreamingToolCallBuffer.ts +218 -0
- package/src/tools/ToolNode.js +930 -0
- package/src/tools/ToolNode.js.map +1 -0
- package/src/tools/ToolNode.ts +454 -41
- package/src/tools/ToolSearch.js +904 -0
- package/src/tools/ToolSearch.js.map +1 -0
- package/src/tools/ToolSearch.ts +84 -33
- package/src/tools/__tests__/AskUser.test.ts +537 -0
- package/src/tools/__tests__/BrowserTools.test.js +306 -0
- package/src/tools/__tests__/BrowserTools.test.js.map +1 -0
- package/src/tools/__tests__/BrowserTools.test.ts +131 -6
- package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js +276 -0
- package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js.map +1 -0
- package/src/tools/__tests__/ProgrammaticToolCalling.test.js +807 -0
- package/src/tools/__tests__/ProgrammaticToolCalling.test.js.map +1 -0
- package/src/tools/__tests__/StreamingToolCallBuffer.test.js +175 -0
- package/src/tools/__tests__/StreamingToolCallBuffer.test.js.map +1 -0
- package/src/tools/__tests__/StreamingToolCallBuffer.test.ts +263 -0
- package/src/tools/__tests__/ToolApproval.test.js +675 -0
- package/src/tools/__tests__/ToolApproval.test.js.map +1 -0
- package/src/tools/__tests__/ToolApproval.test.ts +194 -20
- package/src/tools/__tests__/ToolNode.hitl.test.ts +267 -0
- package/src/tools/__tests__/ToolNode.recovery.test.js +200 -0
- package/src/tools/__tests__/ToolNode.recovery.test.js.map +1 -0
- package/src/tools/__tests__/ToolNode.recovery.test.ts +276 -0
- package/src/tools/__tests__/ToolNode.session.test.js +319 -0
- package/src/tools/__tests__/ToolNode.session.test.js.map +1 -0
- package/src/tools/__tests__/ToolNode.session.test.ts +465 -0
- package/src/tools/__tests__/ToolSearch.integration.test.js +125 -0
- package/src/tools/__tests__/ToolSearch.integration.test.js.map +1 -0
- package/src/tools/__tests__/ToolSearch.test.js +812 -0
- package/src/tools/__tests__/ToolSearch.test.js.map +1 -0
- package/src/tools/__tests__/ToolSearch.test.ts +78 -5
- package/src/tools/__tests__/handlers.test.js +799 -0
- package/src/tools/__tests__/handlers.test.js.map +1 -0
- package/src/tools/__tests__/handlers.test.ts +1100 -0
- package/src/tools/__tests__/truncation-recovery.integration.test.js +362 -0
- package/src/tools/__tests__/truncation-recovery.integration.test.js.map +1 -0
- package/src/tools/__tests__/truncation-recovery.integration.test.ts +560 -0
- package/src/tools/handlers.js +306 -0
- package/src/tools/handlers.js.map +1 -0
- package/src/tools/handlers.ts +119 -16
- package/src/tools/schema.js +25 -0
- package/src/tools/schema.js.map +1 -0
- package/src/tools/search/anthropic.js +34 -0
- package/src/tools/search/anthropic.js.map +1 -0
- package/src/tools/search/content.js +116 -0
- package/src/tools/search/content.js.map +1 -0
- package/src/tools/search/content.test.js +133 -0
- package/src/tools/search/content.test.js.map +1 -0
- package/src/tools/search/firecrawl.js +173 -0
- package/src/tools/search/firecrawl.js.map +1 -0
- package/src/tools/search/format.js +198 -0
- package/src/tools/search/format.js.map +1 -0
- package/src/tools/search/highlights.js +241 -0
- package/src/tools/search/highlights.js.map +1 -0
- package/src/tools/search/index.js +3 -0
- package/src/tools/search/index.js.map +1 -0
- package/src/tools/search/jina-reranker.test.js +106 -0
- package/src/tools/search/jina-reranker.test.js.map +1 -0
- package/src/tools/search/rerankers.js +165 -0
- package/src/tools/search/rerankers.js.map +1 -0
- package/src/tools/search/schema.js +102 -0
- package/src/tools/search/schema.js.map +1 -0
- package/src/tools/search/search.js +561 -0
- package/src/tools/search/search.js.map +1 -0
- package/src/tools/search/serper-scraper.js +126 -0
- package/src/tools/search/serper-scraper.js.map +1 -0
- package/src/tools/search/test.js +129 -0
- package/src/tools/search/test.js.map +1 -0
- package/src/tools/search/tool.js +453 -0
- package/src/tools/search/tool.js.map +1 -0
- package/src/tools/search/types.js +2 -0
- package/src/tools/search/types.js.map +1 -0
- package/src/tools/search/utils.js +59 -0
- package/src/tools/search/utils.js.map +1 -0
- package/src/types/graph.js +24 -0
- package/src/types/graph.js.map +1 -0
- package/src/types/graph.test.js +192 -0
- package/src/types/graph.test.js.map +1 -0
- package/src/types/graph.ts +26 -6
- package/src/types/index.js +7 -0
- package/src/types/index.js.map +1 -0
- package/src/types/llm.js +2 -0
- package/src/types/llm.js.map +1 -0
- package/src/types/llm.ts +8 -3
- package/src/types/messages.js +2 -0
- package/src/types/messages.js.map +1 -0
- package/src/types/run.js +2 -0
- package/src/types/run.js.map +1 -0
- package/src/types/run.ts +2 -0
- package/src/types/stream.js +2 -0
- package/src/types/stream.js.map +1 -0
- package/src/types/tools.js +2 -0
- package/src/types/tools.js.map +1 -0
- package/src/types/tools.ts +21 -2
- package/src/utils/contextAnalytics.js +79 -0
- package/src/utils/contextAnalytics.js.map +1 -0
- package/src/utils/contextAnalytics.test.js +166 -0
- package/src/utils/contextAnalytics.test.js.map +1 -0
- package/src/utils/contextAnalytics.test.ts +222 -0
- package/src/utils/contextAnalytics.ts +27 -9
- package/src/utils/events.js +26 -0
- package/src/utils/events.js.map +1 -0
- package/src/utils/graph.js +11 -0
- package/src/utils/graph.js.map +1 -0
- package/src/utils/handlers.js +65 -0
- package/src/utils/handlers.js.map +1 -0
- package/src/utils/index.js +10 -0
- package/src/utils/index.js.map +1 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/llm.js +21 -0
- package/src/utils/llm.js.map +1 -0
- package/src/utils/llmConfig.js +205 -0
- package/src/utils/llmConfig.js.map +1 -0
- package/src/utils/llmConfig.ts +5 -5
- package/src/utils/logging.js +37 -0
- package/src/utils/logging.js.map +1 -0
- package/src/utils/misc.js +51 -0
- package/src/utils/misc.js.map +1 -0
- package/src/utils/run.js +69 -0
- package/src/utils/run.js.map +1 -0
- package/src/utils/run.ts +108 -106
- package/src/utils/schema.js +21 -0
- package/src/utils/schema.js.map +1 -0
- package/src/utils/title.js +119 -0
- package/src/utils/title.js.map +1 -0
- package/src/utils/tokens.js +92 -0
- package/src/utils/tokens.js.map +1 -0
- package/src/utils/tokens.ts +118 -142
- package/src/utils/toolCallContinuation.ts +55 -0
- package/src/utils/toonFormat.js +379 -0
- package/src/utils/toonFormat.js.map +1 -0
package/src/tools/ToolNode.ts
CHANGED
|
@@ -48,7 +48,7 @@ function extractStringContent(content: unknown): string {
|
|
|
48
48
|
for (const block of content) {
|
|
49
49
|
if (typeof block === 'string') {
|
|
50
50
|
textParts.push(block);
|
|
51
|
-
} else if (block && typeof block === 'object') {
|
|
51
|
+
} else if (block != null && typeof block === 'object') {
|
|
52
52
|
// Handle {type: 'text', text: '...'} format
|
|
53
53
|
const obj = block as Record<string, unknown>;
|
|
54
54
|
if (obj.type === 'text' && typeof obj.text === 'string') {
|
|
@@ -77,6 +77,8 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
77
77
|
toolCallStepIds?: Map<string, string>;
|
|
78
78
|
errorHandler?: t.ToolNodeConstructorParams['errorHandler'];
|
|
79
79
|
private toolUsageCount: Map<string, number>;
|
|
80
|
+
/** Maps toolCallId → turn captured in runTool, used by handleRunToolCompletions */
|
|
81
|
+
private toolCallTurns: Map<string, number> = new Map();
|
|
80
82
|
/** Tool registry for filtering (lazy computation of programmatic maps) */
|
|
81
83
|
private toolRegistry?: t.LCToolRegistry;
|
|
82
84
|
/** Cached programmatic tools (computed once on first PTC call) */
|
|
@@ -85,12 +87,14 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
85
87
|
private sessions?: t.ToolSessionMap;
|
|
86
88
|
/** When true, dispatches ON_TOOL_EXECUTE events instead of invoking tools directly */
|
|
87
89
|
private eventDrivenMode: boolean = false;
|
|
88
|
-
/** Tool definitions for event-driven mode */
|
|
89
|
-
private toolDefinitions?: Map<string, t.LCTool>;
|
|
90
90
|
/** Agent ID for event-driven mode */
|
|
91
91
|
private agentId?: string;
|
|
92
|
+
/** Tool names that bypass event dispatch and execute directly (e.g., graph-managed handoff tools) */
|
|
93
|
+
private directToolNames?: Set<string>;
|
|
92
94
|
/** HITL tool approval configuration */
|
|
93
95
|
private toolApprovalConfig?: t.ToolApprovalConfig;
|
|
96
|
+
/** Buffer for recovering truncated tool call arguments from streaming data */
|
|
97
|
+
private streamingToolCallBuffer?: import('@/tools/StreamingToolCallBuffer').StreamingToolCallBuffer;
|
|
94
98
|
|
|
95
99
|
constructor({
|
|
96
100
|
tools,
|
|
@@ -104,8 +108,9 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
104
108
|
toolRegistry,
|
|
105
109
|
sessions,
|
|
106
110
|
eventDrivenMode,
|
|
107
|
-
toolDefinitions,
|
|
108
111
|
agentId,
|
|
112
|
+
directToolNames,
|
|
113
|
+
streamingToolCallBuffer,
|
|
109
114
|
toolApprovalConfig,
|
|
110
115
|
}: t.ToolNodeConstructorParams) {
|
|
111
116
|
super({ name, tags, func: (input, config) => this.run(input, config) });
|
|
@@ -118,8 +123,9 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
118
123
|
this.toolRegistry = toolRegistry;
|
|
119
124
|
this.sessions = sessions;
|
|
120
125
|
this.eventDrivenMode = eventDrivenMode ?? false;
|
|
121
|
-
this.toolDefinitions = toolDefinitions;
|
|
122
126
|
this.agentId = agentId;
|
|
127
|
+
this.directToolNames = directToolNames;
|
|
128
|
+
this.streamingToolCallBuffer = streamingToolCallBuffer;
|
|
123
129
|
this.toolApprovalConfig = toolApprovalConfig;
|
|
124
130
|
}
|
|
125
131
|
|
|
@@ -162,15 +168,25 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
162
168
|
* Returns true if approval is needed, false otherwise.
|
|
163
169
|
* Does NOT perform the actual approval flow - that's handled by requestApproval().
|
|
164
170
|
*/
|
|
165
|
-
private requiresApproval(
|
|
171
|
+
private requiresApproval(
|
|
172
|
+
toolName: string,
|
|
173
|
+
args: Record<string, unknown>
|
|
174
|
+
): boolean {
|
|
166
175
|
if (!this.toolApprovalConfig) {
|
|
167
176
|
return false;
|
|
168
177
|
}
|
|
169
178
|
|
|
170
|
-
const { defaultPolicy, overrides, executionContext } =
|
|
179
|
+
const { defaultPolicy, overrides, executionContext } =
|
|
180
|
+
this.toolApprovalConfig;
|
|
171
181
|
|
|
172
|
-
// Scheduled executions bypass all approval checks
|
|
173
|
-
if (executionContext === 'scheduled') {
|
|
182
|
+
// Scheduled and browser executions bypass all approval checks
|
|
183
|
+
if (executionContext === 'scheduled' || executionContext === 'browser') {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Graph-managed tools (handoff/transfer tools) bypass HITL approval —
|
|
188
|
+
// these are internal routing mechanisms, not user-facing tool executions
|
|
189
|
+
if (this.directToolNames?.has(toolName)) {
|
|
174
190
|
return false;
|
|
175
191
|
}
|
|
176
192
|
|
|
@@ -241,9 +257,21 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
241
257
|
}
|
|
242
258
|
const turn = this.toolUsageCount.get(call.name) ?? 0;
|
|
243
259
|
this.toolUsageCount.set(call.name, turn + 1);
|
|
244
|
-
|
|
260
|
+
if (call.id != null && call.id !== '') {
|
|
261
|
+
this.toolCallTurns.set(call.id, turn);
|
|
262
|
+
}
|
|
263
|
+
let args = call.args;
|
|
245
264
|
const stepId = this.toolCallStepIds?.get(call.id!);
|
|
246
265
|
|
|
266
|
+
// Recover truncated tool call arguments from the streaming buffer.
|
|
267
|
+
// When max_tokens truncates a tool call mid-JSON, parsePartialJson may lose
|
|
268
|
+
// content that was already streamed to the UI. The buffer has the raw accumulated
|
|
269
|
+
// arg string, so we can extract field values that were dropped.
|
|
270
|
+
if (call.id && this.streamingToolCallBuffer?.has(call.id)) {
|
|
271
|
+
args = this.recoverTruncatedArgs(call.name, call.id, args);
|
|
272
|
+
this.streamingToolCallBuffer.clear(call.id);
|
|
273
|
+
}
|
|
274
|
+
|
|
247
275
|
// Build invoke params - LangChain extracts non-schema fields to config.toolCall
|
|
248
276
|
let invokeParams: Record<string, unknown> = {
|
|
249
277
|
...call,
|
|
@@ -273,6 +301,9 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
273
301
|
* Each file uses its own session_id (supporting multi-session file tracking).
|
|
274
302
|
* Both session_id and _injected_files are injected directly to invokeParams
|
|
275
303
|
* (not inside args) so they bypass Zod schema validation and reach config.toolCall.
|
|
304
|
+
*
|
|
305
|
+
* session_id is always injected when available (even without tracked files)
|
|
306
|
+
* so the CodeExecutor can fall back to the /files endpoint for session continuity.
|
|
276
307
|
*/
|
|
277
308
|
if (
|
|
278
309
|
call.name === Constants.EXECUTE_CODE ||
|
|
@@ -281,7 +312,7 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
281
312
|
const codeSession = this.sessions?.get(Constants.EXECUTE_CODE) as
|
|
282
313
|
| t.CodeSessionContext
|
|
283
314
|
| undefined;
|
|
284
|
-
if (codeSession
|
|
315
|
+
if (codeSession != null && codeSession.session_id !== '') {
|
|
285
316
|
/**
|
|
286
317
|
* Always inject session_id so retries reuse the same workspace.
|
|
287
318
|
* Also inject file refs when files exist from previous executions.
|
|
@@ -315,20 +346,25 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
315
346
|
// Uses event-driven pattern: dispatches ON_TOOL_APPROVAL_REQUIRED event
|
|
316
347
|
// and waits for the host to resolve/reject with a ToolApprovalResponse.
|
|
317
348
|
// ========================================================================
|
|
318
|
-
if (
|
|
349
|
+
if (
|
|
350
|
+
this.requiresApproval(call.name, call.args as Record<string, unknown>)
|
|
351
|
+
) {
|
|
319
352
|
const approvalResponse = await this.requestApproval(call, config);
|
|
320
353
|
if (!approvalResponse.approved) {
|
|
321
354
|
// Human denied the tool call - return a denial message
|
|
322
355
|
return new ToolMessage({
|
|
323
356
|
status: 'error',
|
|
324
|
-
content: `Tool call "${call.name}" was denied by the user.${approvalResponse.feedback ? ` Reason: ${approvalResponse.feedback}` : ''} Please acknowledge the denial and proceed without executing this tool.`,
|
|
357
|
+
content: `Tool call "${call.name}" was denied by the user.${approvalResponse.feedback != null && approvalResponse.feedback !== '' ? ` Reason: ${approvalResponse.feedback}` : ''} Please acknowledge the denial and proceed without executing this tool.`,
|
|
325
358
|
name: call.name,
|
|
326
359
|
tool_call_id: call.id ?? '',
|
|
327
360
|
});
|
|
328
361
|
}
|
|
329
362
|
// Human approved - optionally use modified args
|
|
330
363
|
if (approvalResponse.modifiedArgs) {
|
|
331
|
-
invokeParams = {
|
|
364
|
+
invokeParams = {
|
|
365
|
+
...invokeParams,
|
|
366
|
+
args: approvalResponse.modifiedArgs,
|
|
367
|
+
};
|
|
332
368
|
}
|
|
333
369
|
}
|
|
334
370
|
|
|
@@ -419,13 +455,13 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
419
455
|
handlerError:
|
|
420
456
|
handlerError instanceof Error
|
|
421
457
|
? {
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
458
|
+
message: handlerError.message,
|
|
459
|
+
stack: handlerError.stack ?? undefined,
|
|
460
|
+
}
|
|
425
461
|
: {
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
462
|
+
message: String(handlerError),
|
|
463
|
+
stack: undefined,
|
|
464
|
+
},
|
|
429
465
|
});
|
|
430
466
|
}
|
|
431
467
|
}
|
|
@@ -439,25 +475,350 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
439
475
|
}
|
|
440
476
|
|
|
441
477
|
/**
|
|
442
|
-
*
|
|
443
|
-
*
|
|
478
|
+
* Recover truncated tool call arguments using the raw streaming buffer.
|
|
479
|
+
*
|
|
480
|
+
* When parsePartialJson drops content (e.g., a large "content" field truncated
|
|
481
|
+
* at max_tokens), this method extracts the field value from the raw accumulated
|
|
482
|
+
* arg string and merges it back into the parsed args object.
|
|
483
|
+
*
|
|
484
|
+
* This is generic — it checks ALL string fields in the raw buffer, not just
|
|
485
|
+
* content_tool fields. Any tool with a truncated string value benefits.
|
|
444
486
|
*/
|
|
445
|
-
|
|
487
|
+
/**
|
|
488
|
+
* Recover truncated tool call arguments using the raw streaming buffer.
|
|
489
|
+
*
|
|
490
|
+
* Strategy:
|
|
491
|
+
* 1. If args are completely empty → try parsePartialJson on the raw buffer
|
|
492
|
+
* 2. Otherwise → field-level recovery: extract missing fields from raw buffer
|
|
493
|
+
*
|
|
494
|
+
* @param toolName - Tool name (for logging)
|
|
495
|
+
* @param toolCallId - The tool call ID
|
|
496
|
+
* @param args - The parsed args (potentially incomplete from parsePartialJson)
|
|
497
|
+
* @returns The args with recovered fields merged in
|
|
498
|
+
*/
|
|
499
|
+
|
|
500
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
501
|
+
private recoverTruncatedArgs(
|
|
502
|
+
toolName: string,
|
|
503
|
+
toolCallId: string,
|
|
504
|
+
args: any
|
|
505
|
+
): any {
|
|
506
|
+
/* eslint-enable @typescript-eslint/no-explicit-any */
|
|
507
|
+
if (!this.streamingToolCallBuffer) return args;
|
|
508
|
+
|
|
509
|
+
const rawArgs = this.streamingToolCallBuffer.getRawArgs(toolCallId);
|
|
510
|
+
if (!rawArgs) return args;
|
|
511
|
+
|
|
512
|
+
const rawLen = rawArgs.length;
|
|
513
|
+
|
|
514
|
+
// If args is completely empty (JSON parsing aborted before any key),
|
|
515
|
+
// attempt to parse the raw accumulated string
|
|
516
|
+
if (
|
|
517
|
+
args == null ||
|
|
518
|
+
(typeof args === 'object' && Object.keys(args).length === 0)
|
|
519
|
+
) {
|
|
520
|
+
try {
|
|
521
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
522
|
+
const { parsePartialJson } = require('@langchain/core/utils/json');
|
|
523
|
+
const recovered = parsePartialJson(rawArgs);
|
|
524
|
+
if (
|
|
525
|
+
recovered != null &&
|
|
526
|
+
typeof recovered === 'object' &&
|
|
527
|
+
Object.keys(recovered).length > 0
|
|
528
|
+
) {
|
|
529
|
+
// eslint-disable-next-line no-console
|
|
530
|
+
console.warn(
|
|
531
|
+
`[TruncationRecovery] Tool=${toolName}, callId=${toolCallId}, rawBufferLen=${rawLen}, ` +
|
|
532
|
+
`parsedFields=[], recoveredFields=[${Object.keys(recovered).join(',')}] (full parse)`
|
|
533
|
+
);
|
|
534
|
+
return recovered;
|
|
535
|
+
}
|
|
536
|
+
} catch {
|
|
537
|
+
// parsePartialJson failed — fall through to field-level extraction
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// Field-level recovery: extract missing fields from the raw buffer
|
|
542
|
+
const parsedArgs = typeof args === 'object' ? { ...args } : {};
|
|
543
|
+
const recoveredFields: string[] = [];
|
|
544
|
+
|
|
545
|
+
// Extract field names from the raw JSON string
|
|
546
|
+
const fieldPattern = /"([^"]+)"\s*:/g;
|
|
547
|
+
let match;
|
|
548
|
+
const rawFieldNames: string[] = [];
|
|
549
|
+
while ((match = fieldPattern.exec(rawArgs)) !== null) {
|
|
550
|
+
rawFieldNames.push(match[1]);
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
for (const fieldName of rawFieldNames) {
|
|
554
|
+
if (
|
|
555
|
+
parsedArgs[fieldName] == null ||
|
|
556
|
+
parsedArgs[fieldName] === '' ||
|
|
557
|
+
parsedArgs[fieldName] === undefined
|
|
558
|
+
) {
|
|
559
|
+
const rawValue = this.streamingToolCallBuffer.extractFieldValue(
|
|
560
|
+
toolCallId,
|
|
561
|
+
fieldName
|
|
562
|
+
);
|
|
563
|
+
if (rawValue != null && rawValue !== '') {
|
|
564
|
+
parsedArgs[fieldName] = rawValue;
|
|
565
|
+
recoveredFields.push(fieldName);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
if (recoveredFields.length > 0) {
|
|
571
|
+
// eslint-disable-next-line no-console
|
|
572
|
+
console.warn(
|
|
573
|
+
`[TruncationRecovery] Tool=${toolName}, callId=${toolCallId}, rawBufferLen=${rawLen}, ` +
|
|
574
|
+
`parsedFields=[${Object.keys(args ?? {}).join(',')}], recoveredFields=[${recoveredFields.join(',')}]`
|
|
575
|
+
);
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
return parsedArgs;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
/**
|
|
582
|
+
* Builds code session context for injection into event-driven tool calls.
|
|
583
|
+
* Mirrors the session injection logic in runTool() for direct execution.
|
|
584
|
+
*/
|
|
585
|
+
private getCodeSessionContext(): t.ToolCallRequest['codeSessionContext'] {
|
|
586
|
+
if (!this.sessions) {
|
|
587
|
+
return undefined;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
const codeSession = this.sessions.get(Constants.EXECUTE_CODE) as
|
|
591
|
+
| t.CodeSessionContext
|
|
592
|
+
| undefined;
|
|
593
|
+
if (!codeSession) {
|
|
594
|
+
return undefined;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
const context: NonNullable<t.ToolCallRequest['codeSessionContext']> = {
|
|
598
|
+
session_id: codeSession.session_id,
|
|
599
|
+
};
|
|
600
|
+
|
|
601
|
+
if (codeSession.files && codeSession.files.length > 0) {
|
|
602
|
+
context.files = codeSession.files.map((file) => ({
|
|
603
|
+
session_id: file.session_id ?? codeSession.session_id,
|
|
604
|
+
id: file.id,
|
|
605
|
+
name: file.name,
|
|
606
|
+
}));
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
return context;
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
/**
|
|
613
|
+
* Extracts code execution session context from tool results and stores in Graph.sessions.
|
|
614
|
+
* Mirrors the session storage logic in handleRunToolCompletions for direct execution.
|
|
615
|
+
*/
|
|
616
|
+
private storeCodeSessionFromResults(
|
|
617
|
+
results: t.ToolExecuteResult[],
|
|
618
|
+
requests: t.ToolCallRequest[]
|
|
619
|
+
): void {
|
|
620
|
+
if (!this.sessions) {
|
|
621
|
+
return;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
for (let i = 0; i < results.length; i++) {
|
|
625
|
+
const result = results[i];
|
|
626
|
+
if (result.status !== 'success' || result.artifact == null) {
|
|
627
|
+
continue;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
const request = requests.find((r) => r.id === result.toolCallId);
|
|
631
|
+
if (
|
|
632
|
+
request?.name !== Constants.EXECUTE_CODE &&
|
|
633
|
+
request?.name !== Constants.PROGRAMMATIC_TOOL_CALLING
|
|
634
|
+
) {
|
|
635
|
+
continue;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
const artifact = result.artifact as t.CodeExecutionArtifact | undefined;
|
|
639
|
+
if (artifact?.session_id == null || artifact.session_id === '') {
|
|
640
|
+
continue;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
const newFiles = artifact.files ?? [];
|
|
644
|
+
const existingSession = this.sessions.get(Constants.EXECUTE_CODE) as
|
|
645
|
+
| t.CodeSessionContext
|
|
646
|
+
| undefined;
|
|
647
|
+
const existingFiles = existingSession?.files ?? [];
|
|
648
|
+
|
|
649
|
+
if (newFiles.length > 0) {
|
|
650
|
+
const filesWithSession: t.FileRefs = newFiles.map((file) => ({
|
|
651
|
+
...file,
|
|
652
|
+
session_id: artifact.session_id,
|
|
653
|
+
}));
|
|
654
|
+
|
|
655
|
+
const newFileNames = new Set(filesWithSession.map((f) => f.name));
|
|
656
|
+
const filteredExisting = existingFiles.filter(
|
|
657
|
+
(f) => !newFileNames.has(f.name)
|
|
658
|
+
);
|
|
659
|
+
|
|
660
|
+
this.sessions.set(Constants.EXECUTE_CODE, {
|
|
661
|
+
session_id: artifact.session_id,
|
|
662
|
+
files: [...filteredExisting, ...filesWithSession],
|
|
663
|
+
lastUpdated: Date.now(),
|
|
664
|
+
});
|
|
665
|
+
} else {
|
|
666
|
+
this.sessions.set(Constants.EXECUTE_CODE, {
|
|
667
|
+
session_id: artifact.session_id,
|
|
668
|
+
files: existingFiles,
|
|
669
|
+
lastUpdated: Date.now(),
|
|
670
|
+
});
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
/**
|
|
676
|
+
* Post-processes standard runTool outputs: dispatches ON_RUN_STEP_COMPLETED
|
|
677
|
+
* and stores code session context. Mirrors the completion handling in
|
|
678
|
+
* dispatchToolEvents for the event-driven path.
|
|
679
|
+
*
|
|
680
|
+
* By handling completions here in graph context (rather than in the
|
|
681
|
+
* stream consumer via ToolEndHandler), the race between the stream
|
|
682
|
+
* consumer and graph execution is eliminated.
|
|
683
|
+
*/
|
|
684
|
+
private handleRunToolCompletions(
|
|
685
|
+
calls: ToolCall[],
|
|
686
|
+
outputs: (BaseMessage | Command)[],
|
|
687
|
+
config: RunnableConfig
|
|
688
|
+
): void {
|
|
689
|
+
for (let i = 0; i < calls.length; i++) {
|
|
690
|
+
const call = calls[i];
|
|
691
|
+
const output = outputs[i];
|
|
692
|
+
const turn = this.toolCallTurns.get(call.id!) ?? 0;
|
|
693
|
+
|
|
694
|
+
if (isCommand(output)) {
|
|
695
|
+
continue;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
const toolMessage = output as ToolMessage;
|
|
699
|
+
const toolCallId = call.id ?? '';
|
|
700
|
+
|
|
701
|
+
// Skip error ToolMessages when errorHandler already dispatched ON_RUN_STEP_COMPLETED
|
|
702
|
+
// via handleToolCallErrorStatic. Without this check, errors would be double-dispatched.
|
|
703
|
+
if (toolMessage.status === 'error' && this.errorHandler != null) {
|
|
704
|
+
continue;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
// Store code session context from tool results
|
|
708
|
+
if (
|
|
709
|
+
this.sessions &&
|
|
710
|
+
(call.name === Constants.EXECUTE_CODE ||
|
|
711
|
+
call.name === Constants.PROGRAMMATIC_TOOL_CALLING)
|
|
712
|
+
) {
|
|
713
|
+
const artifact = toolMessage.artifact as
|
|
714
|
+
| t.CodeExecutionArtifact
|
|
715
|
+
| undefined;
|
|
716
|
+
if (artifact?.session_id != null && artifact.session_id !== '') {
|
|
717
|
+
const newFiles = artifact.files ?? [];
|
|
718
|
+
const existingSession = this.sessions.get(Constants.EXECUTE_CODE) as
|
|
719
|
+
| t.CodeSessionContext
|
|
720
|
+
| undefined;
|
|
721
|
+
const existingFiles = existingSession?.files ?? [];
|
|
722
|
+
|
|
723
|
+
if (newFiles.length > 0) {
|
|
724
|
+
const filesWithSession: t.FileRefs = newFiles.map((file) => ({
|
|
725
|
+
...file,
|
|
726
|
+
session_id: artifact.session_id,
|
|
727
|
+
}));
|
|
728
|
+
const newFileNames = new Set(filesWithSession.map((f) => f.name));
|
|
729
|
+
const filteredExisting = existingFiles.filter(
|
|
730
|
+
(f) => !newFileNames.has(f.name)
|
|
731
|
+
);
|
|
732
|
+
this.sessions.set(Constants.EXECUTE_CODE, {
|
|
733
|
+
session_id: artifact.session_id,
|
|
734
|
+
files: [...filteredExisting, ...filesWithSession],
|
|
735
|
+
lastUpdated: Date.now(),
|
|
736
|
+
});
|
|
737
|
+
} else {
|
|
738
|
+
this.sessions.set(Constants.EXECUTE_CODE, {
|
|
739
|
+
session_id: artifact.session_id,
|
|
740
|
+
files: existingFiles,
|
|
741
|
+
lastUpdated: Date.now(),
|
|
742
|
+
});
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
// Dispatch ON_RUN_STEP_COMPLETED via custom event (same path as dispatchToolEvents)
|
|
748
|
+
const stepId = this.toolCallStepIds?.get(toolCallId) ?? '';
|
|
749
|
+
if (!stepId) {
|
|
750
|
+
continue;
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
const contentString =
|
|
754
|
+
typeof toolMessage.content === 'string'
|
|
755
|
+
? toolMessage.content
|
|
756
|
+
: JSON.stringify(toolMessage.content);
|
|
757
|
+
|
|
758
|
+
const tool_call: t.ProcessedToolCall = {
|
|
759
|
+
args:
|
|
760
|
+
typeof call.args === 'string'
|
|
761
|
+
? (call.args as string)
|
|
762
|
+
: JSON.stringify((call.args as unknown) ?? {}),
|
|
763
|
+
name: call.name,
|
|
764
|
+
id: toolCallId,
|
|
765
|
+
output: contentString,
|
|
766
|
+
progress: 1,
|
|
767
|
+
};
|
|
768
|
+
|
|
769
|
+
safeDispatchCustomEvent(
|
|
770
|
+
GraphEvents.ON_RUN_STEP_COMPLETED,
|
|
771
|
+
{
|
|
772
|
+
result: {
|
|
773
|
+
id: stepId,
|
|
774
|
+
index: turn,
|
|
775
|
+
type: 'tool_call' as const,
|
|
776
|
+
tool_call,
|
|
777
|
+
},
|
|
778
|
+
},
|
|
779
|
+
config
|
|
780
|
+
);
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
/**
|
|
785
|
+
* Dispatches tool calls to the host via ON_TOOL_EXECUTE event and returns raw ToolMessages.
|
|
786
|
+
* Core logic for event-driven execution, separated from output shaping.
|
|
787
|
+
*/
|
|
788
|
+
private async dispatchToolEvents(
|
|
446
789
|
toolCalls: ToolCall[],
|
|
447
|
-
config: RunnableConfig
|
|
448
|
-
|
|
449
|
-
input: any
|
|
450
|
-
): Promise<T> {
|
|
790
|
+
config: RunnableConfig
|
|
791
|
+
): Promise<ToolMessage[]> {
|
|
451
792
|
const requests: t.ToolCallRequest[] = toolCalls.map((call) => {
|
|
452
793
|
const turn = this.toolUsageCount.get(call.name) ?? 0;
|
|
453
794
|
this.toolUsageCount.set(call.name, turn + 1);
|
|
454
|
-
|
|
795
|
+
|
|
796
|
+
// Recover truncated args from streaming buffer (same as runTool path)
|
|
797
|
+
let args = call.args as Record<string, unknown>;
|
|
798
|
+
if (call.id && this.streamingToolCallBuffer?.has(call.id)) {
|
|
799
|
+
args = this.recoverTruncatedArgs(call.name, call.id, args) as Record<
|
|
800
|
+
string,
|
|
801
|
+
unknown
|
|
802
|
+
>;
|
|
803
|
+
this.streamingToolCallBuffer.clear(call.id);
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
const request: t.ToolCallRequest = {
|
|
455
807
|
id: call.id!,
|
|
456
808
|
name: call.name,
|
|
457
|
-
args
|
|
809
|
+
args,
|
|
458
810
|
stepId: this.toolCallStepIds?.get(call.id!),
|
|
459
811
|
turn,
|
|
460
812
|
};
|
|
813
|
+
|
|
814
|
+
if (
|
|
815
|
+
call.name === Constants.EXECUTE_CODE ||
|
|
816
|
+
call.name === Constants.PROGRAMMATIC_TOOL_CALLING
|
|
817
|
+
) {
|
|
818
|
+
request.codeSessionContext = this.getCodeSessionContext();
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
return request;
|
|
461
822
|
});
|
|
462
823
|
|
|
463
824
|
const results = await new Promise<t.ToolExecuteResult[]>(
|
|
@@ -478,10 +839,20 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
478
839
|
}
|
|
479
840
|
);
|
|
480
841
|
|
|
481
|
-
|
|
842
|
+
this.storeCodeSessionFromResults(results, requests);
|
|
843
|
+
|
|
844
|
+
return results.map((result) => {
|
|
482
845
|
const request = requests.find((r) => r.id === result.toolCallId);
|
|
483
846
|
const toolName = request?.name ?? 'unknown';
|
|
484
847
|
const stepId = this.toolCallStepIds?.get(result.toolCallId) ?? '';
|
|
848
|
+
if (!stepId) {
|
|
849
|
+
// eslint-disable-next-line no-console
|
|
850
|
+
console.warn(
|
|
851
|
+
`[ToolNode] toolCallStepIds missing entry for toolCallId=${result.toolCallId} (tool=${toolName}). ` +
|
|
852
|
+
'This indicates a race between the stream consumer and graph execution. ' +
|
|
853
|
+
`Map size: ${this.toolCallStepIds?.size ?? 0}`
|
|
854
|
+
);
|
|
855
|
+
}
|
|
485
856
|
|
|
486
857
|
let toolMessage: ToolMessage;
|
|
487
858
|
let contentString: string;
|
|
@@ -536,19 +907,34 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
536
907
|
|
|
537
908
|
return toolMessage;
|
|
538
909
|
});
|
|
910
|
+
}
|
|
539
911
|
|
|
912
|
+
/**
|
|
913
|
+
* Execute all tool calls via ON_TOOL_EXECUTE event dispatch.
|
|
914
|
+
* Used in event-driven mode where the host handles actual tool execution.
|
|
915
|
+
*/
|
|
916
|
+
private async executeViaEvent(
|
|
917
|
+
toolCalls: ToolCall[],
|
|
918
|
+
config: RunnableConfig,
|
|
919
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
920
|
+
input: any
|
|
921
|
+
): Promise<T> {
|
|
922
|
+
const outputs = await this.dispatchToolEvents(toolCalls, config);
|
|
540
923
|
return (Array.isArray(input) ? outputs : { messages: outputs }) as T;
|
|
541
924
|
}
|
|
542
925
|
|
|
543
926
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
544
927
|
protected async run(input: any, config: RunnableConfig): Promise<T> {
|
|
928
|
+
this.toolCallTurns.clear();
|
|
545
929
|
let outputs: (BaseMessage | Command)[];
|
|
546
930
|
|
|
547
931
|
if (this.isSendInput(input)) {
|
|
548
|
-
|
|
932
|
+
const isDirectTool = this.directToolNames?.has(input.lg_tool_call.name);
|
|
933
|
+
if (this.eventDrivenMode && isDirectTool !== true) {
|
|
549
934
|
return this.executeViaEvent([input.lg_tool_call], config, input);
|
|
550
935
|
}
|
|
551
936
|
outputs = [await this.runTool(input.lg_tool_call, config)];
|
|
937
|
+
this.handleRunToolCompletions([input.lg_tool_call], outputs, config);
|
|
552
938
|
} else {
|
|
553
939
|
let messages: BaseMessage[];
|
|
554
940
|
if (Array.isArray(input)) {
|
|
@@ -604,12 +990,40 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
|
604
990
|
}) ?? [];
|
|
605
991
|
|
|
606
992
|
if (this.eventDrivenMode && filteredCalls.length > 0) {
|
|
607
|
-
|
|
608
|
-
|
|
993
|
+
if (!this.directToolNames || this.directToolNames.size === 0) {
|
|
994
|
+
return this.executeViaEvent(filteredCalls, config, input);
|
|
995
|
+
}
|
|
609
996
|
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
997
|
+
const directCalls = filteredCalls.filter((c) =>
|
|
998
|
+
this.directToolNames!.has(c.name)
|
|
999
|
+
);
|
|
1000
|
+
const eventCalls = filteredCalls.filter(
|
|
1001
|
+
(c) => !this.directToolNames!.has(c.name)
|
|
1002
|
+
);
|
|
1003
|
+
|
|
1004
|
+
const directOutputs: (BaseMessage | Command)[] =
|
|
1005
|
+
directCalls.length > 0
|
|
1006
|
+
? await Promise.all(
|
|
1007
|
+
directCalls.map((call) => this.runTool(call, config))
|
|
1008
|
+
)
|
|
1009
|
+
: [];
|
|
1010
|
+
|
|
1011
|
+
if (directCalls.length > 0 && directOutputs.length > 0) {
|
|
1012
|
+
this.handleRunToolCompletions(directCalls, directOutputs, config);
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
const eventOutputs: ToolMessage[] =
|
|
1016
|
+
eventCalls.length > 0
|
|
1017
|
+
? await this.dispatchToolEvents(eventCalls, config)
|
|
1018
|
+
: [];
|
|
1019
|
+
|
|
1020
|
+
outputs = [...directOutputs, ...eventOutputs];
|
|
1021
|
+
} else {
|
|
1022
|
+
outputs = await Promise.all(
|
|
1023
|
+
filteredCalls.map((call) => this.runTool(call, config))
|
|
1024
|
+
);
|
|
1025
|
+
this.handleRunToolCompletions(filteredCalls, outputs, config);
|
|
1026
|
+
}
|
|
613
1027
|
}
|
|
614
1028
|
|
|
615
1029
|
if (!outputs.some(isCommand)) {
|
|
@@ -767,17 +1181,16 @@ export function toolsCondition<T extends string>(
|
|
|
767
1181
|
toolNode: T,
|
|
768
1182
|
invokedToolIds?: Set<string>
|
|
769
1183
|
): T | typeof END {
|
|
770
|
-
const
|
|
771
|
-
|
|
772
|
-
: state.messages[state.messages.length - 1];
|
|
1184
|
+
const messages = Array.isArray(state) ? state : state.messages;
|
|
1185
|
+
const message = messages[messages.length - 1] as AIMessage | undefined;
|
|
773
1186
|
|
|
774
1187
|
if (
|
|
1188
|
+
message &&
|
|
775
1189
|
'tool_calls' in message &&
|
|
776
1190
|
(message.tool_calls?.length ?? 0) > 0 &&
|
|
777
1191
|
!areToolCallsInvoked(message, invokedToolIds)
|
|
778
1192
|
) {
|
|
779
1193
|
return toolNode;
|
|
780
|
-
} else {
|
|
781
|
-
return END;
|
|
782
1194
|
}
|
|
1195
|
+
return END;
|
|
783
1196
|
}
|