@illuma-ai/agents 1.0.90 → 1.0.94
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 +60 -5
- 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 +60 -5
- 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 +28 -4
- 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 +82 -5
- 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__/CodeExecutor.test.ts +76 -0
- 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
|
@@ -29,25 +29,25 @@ const DEFAULT_MAX_ROUND_TRIPS = 20;
|
|
|
29
29
|
const DEFAULT_TIMEOUT = 60000;
|
|
30
30
|
|
|
31
31
|
// ============================================================================
|
|
32
|
-
//
|
|
32
|
+
// Description Components (Single Source of Truth)
|
|
33
33
|
// ============================================================================
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
type: 'object',
|
|
37
|
-
properties: {
|
|
38
|
-
code: {
|
|
39
|
-
type: 'string',
|
|
40
|
-
minLength: 1,
|
|
41
|
-
description: `Python code that calls tools programmatically. Tools are available as async functions.
|
|
42
|
-
|
|
43
|
-
CRITICAL - STATELESS EXECUTION:
|
|
35
|
+
const STATELESS_WARNING = `CRITICAL - STATELESS EXECUTION:
|
|
44
36
|
Each call is a fresh Python interpreter. Variables, imports, and data do NOT persist between calls.
|
|
45
37
|
You MUST complete your entire workflow in ONE code block: query → process → output.
|
|
46
|
-
DO NOT split work across multiple calls expecting to reuse variables
|
|
38
|
+
DO NOT split work across multiple calls expecting to reuse variables.`;
|
|
47
39
|
|
|
48
|
-
|
|
40
|
+
const CORE_RULES = `Rules:
|
|
41
|
+
- EVERYTHING in one call—no state persists between executions
|
|
42
|
+
- Just write code with await—auto-wrapped in async context
|
|
43
|
+
- DO NOT define async def main() or call asyncio.run()
|
|
44
|
+
- Tools are pre-defined—DO NOT write function definitions
|
|
45
|
+
- Only print() output returns to the model`;
|
|
46
|
+
|
|
47
|
+
const ADDITIONAL_RULES = `- Generated files are automatically available in /mnt/data/ for subsequent executions
|
|
48
|
+
- Tool names normalized: hyphens→underscores, keywords get \`_tool\` suffix`;
|
|
49
49
|
|
|
50
|
-
Example (Complete workflow in one call):
|
|
50
|
+
const EXAMPLES = `Example (Complete workflow in one call):
|
|
51
51
|
# Query data
|
|
52
52
|
data = await query_database(sql="SELECT * FROM users")
|
|
53
53
|
# Process it
|
|
@@ -59,14 +59,29 @@ Example (Complete workflow in one call):
|
|
|
59
59
|
|
|
60
60
|
Example (Parallel calls):
|
|
61
61
|
sf, ny = await asyncio.gather(get_weather(city="SF"), get_weather(city="NY"))
|
|
62
|
-
print(f"SF: {sf}, NY: {ny}")
|
|
62
|
+
print(f"SF: {sf}, NY: {ny}")`;
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
64
|
+
// ============================================================================
|
|
65
|
+
// Schema
|
|
66
|
+
// ============================================================================
|
|
67
|
+
|
|
68
|
+
const CODE_PARAM_DESCRIPTION = `Python code that calls tools programmatically. Tools are available as async functions.
|
|
69
|
+
|
|
70
|
+
${STATELESS_WARNING}
|
|
71
|
+
|
|
72
|
+
Your code is auto-wrapped in async context. Just write logic with await—no boilerplate needed.
|
|
73
|
+
|
|
74
|
+
${EXAMPLES}
|
|
75
|
+
|
|
76
|
+
${CORE_RULES}`;
|
|
77
|
+
|
|
78
|
+
export const ProgrammaticToolCallingSchema = {
|
|
79
|
+
type: 'object',
|
|
80
|
+
properties: {
|
|
81
|
+
code: {
|
|
82
|
+
type: 'string',
|
|
83
|
+
minLength: 1,
|
|
84
|
+
description: CODE_PARAM_DESCRIPTION,
|
|
70
85
|
},
|
|
71
86
|
timeout: {
|
|
72
87
|
type: 'integer',
|
|
@@ -85,21 +100,14 @@ export const ProgrammaticToolCallingName = Constants.PROGRAMMATIC_TOOL_CALLING;
|
|
|
85
100
|
export const ProgrammaticToolCallingDescription = `
|
|
86
101
|
Run tools via Python code. Auto-wrapped in async context—just use \`await\` directly.
|
|
87
102
|
|
|
88
|
-
|
|
89
|
-
Complete your ENTIRE workflow in ONE call: fetch → process → save. No splitting across calls.
|
|
103
|
+
${STATELESS_WARNING}
|
|
90
104
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
- Do NOT define \`async def main()\` or call \`asyncio.run()\`—just write code with await
|
|
94
|
-
- Tools are pre-defined—DO NOT write function definitions
|
|
95
|
-
- Only \`print()\` output returns; tool results are raw dicts/lists/strings
|
|
96
|
-
- Generated files are automatically available in /mnt/data/ for subsequent executions
|
|
97
|
-
- Tool names normalized: hyphens→underscores, keywords get \`_tool\` suffix
|
|
105
|
+
${CORE_RULES}
|
|
106
|
+
${ADDITIONAL_RULES}
|
|
98
107
|
|
|
99
108
|
When to use: loops, conditionals, parallel (\`asyncio.gather\`), multi-step pipelines.
|
|
100
109
|
|
|
101
|
-
|
|
102
|
-
data = await query_db(sql="..."); df = process(data); await save_to_sheet(data=df); print("Done")
|
|
110
|
+
${EXAMPLES}
|
|
103
111
|
`.trim();
|
|
104
112
|
|
|
105
113
|
export const ProgrammaticToolCallingDefinition = {
|
|
@@ -624,26 +632,6 @@ export function createProgrammaticToolCallingTool(
|
|
|
624
632
|
const debug = initParams.debug ?? process.env.PTC_DEBUG === 'true';
|
|
625
633
|
const EXEC_ENDPOINT = `${baseUrl}/exec/programmatic`;
|
|
626
634
|
|
|
627
|
-
const description = `
|
|
628
|
-
Run tools via Python code. Auto-wrapped in async context—just use \`await\` directly.
|
|
629
|
-
|
|
630
|
-
CRITICAL - STATELESS: Each call is a fresh interpreter. Variables/imports do NOT persist.
|
|
631
|
-
Complete your ENTIRE workflow in ONE call: fetch → process → save. No splitting across calls.
|
|
632
|
-
|
|
633
|
-
Rules:
|
|
634
|
-
- Everything in ONE code block—no state carries over between executions
|
|
635
|
-
- Do NOT define \`async def main()\` or call \`asyncio.run()\`—just write code with await
|
|
636
|
-
- Tools are pre-defined—DO NOT write function definitions
|
|
637
|
-
- Only \`print()\` output returns; tool results are raw dicts/lists/strings
|
|
638
|
-
- Generated files are automatically available in /mnt/data/ for subsequent executions
|
|
639
|
-
- Tool names normalized: hyphens→underscores, keywords get \`_tool\` suffix
|
|
640
|
-
|
|
641
|
-
When to use: loops, conditionals, parallel (\`asyncio.gather\`), multi-step pipelines.
|
|
642
|
-
|
|
643
|
-
Example (complete pipeline):
|
|
644
|
-
data = await query_db(sql="..."); df = process(data); await save_to_sheet(data=df); print("Done")
|
|
645
|
-
`.trim();
|
|
646
|
-
|
|
647
635
|
return tool(
|
|
648
636
|
async (rawParams, config) => {
|
|
649
637
|
const params = rawParams as { code: string; timeout?: number };
|
|
@@ -777,7 +765,7 @@ Example (complete pipeline):
|
|
|
777
765
|
},
|
|
778
766
|
{
|
|
779
767
|
name: Constants.PROGRAMMATIC_TOOL_CALLING,
|
|
780
|
-
description,
|
|
768
|
+
description: ProgrammaticToolCallingDescription,
|
|
781
769
|
schema: ProgrammaticToolCallingSchema,
|
|
782
770
|
responseFormat: Constants.CONTENT_AND_ARTIFACT,
|
|
783
771
|
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StreamingToolCallBuffer — Accumulates raw tool call argument strings
|
|
3
|
+
* during streaming, providing a fallback when LangChain's parsePartialJson
|
|
4
|
+
* loses data (e.g., when max_tokens truncates a tool call mid-JSON).
|
|
5
|
+
*
|
|
6
|
+
* Architecture:
|
|
7
|
+
* - handleToolCallChunks feeds raw arg fragments into this buffer
|
|
8
|
+
* - When a tool call is finalized (or truncated), the ToolNode can access
|
|
9
|
+
* the accumulated raw string and extract field values that parsePartialJson
|
|
10
|
+
* may have dropped
|
|
11
|
+
* - This enables "streaming write" semantics: content that streamed to the UI
|
|
12
|
+
* is never lost, even if the JSON wrapper was incomplete
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const buffer = new StreamingToolCallBuffer();
|
|
17
|
+
*
|
|
18
|
+
* // During streaming (called by handleToolCallChunks):
|
|
19
|
+
* buffer.append(toolCallId, '{"action":"write","content":"func');
|
|
20
|
+
* buffer.append(toolCallId, 'tion App() {');
|
|
21
|
+
* buffer.setToolName(toolCallId, 'content_tool');
|
|
22
|
+
*
|
|
23
|
+
* // When ToolNode needs the content:
|
|
24
|
+
* const content = buffer.extractFieldValue(toolCallId, 'content');
|
|
25
|
+
* // => 'function App() {'
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export class StreamingToolCallBuffer {
|
|
29
|
+
/** Raw accumulated arg strings keyed by tool call ID */
|
|
30
|
+
argBuffers = new Map();
|
|
31
|
+
/** Tool names keyed by tool call ID */
|
|
32
|
+
toolNames = new Map();
|
|
33
|
+
/**
|
|
34
|
+
* Maps chunk index → tool call ID for providers (e.g., Bedrock) that send
|
|
35
|
+
* START chunks with {id, name, index} and DELTA chunks with {args, index} (no id).
|
|
36
|
+
* Without this mapping, DELTA chunks cannot be associated with the correct buffer entry.
|
|
37
|
+
*/
|
|
38
|
+
indexToIdMap = new Map();
|
|
39
|
+
/**
|
|
40
|
+
* Append a raw argument string chunk for a tool call.
|
|
41
|
+
* Called during streaming as each ToolCallChunk arrives.
|
|
42
|
+
*/
|
|
43
|
+
append(toolCallId, argsChunk) {
|
|
44
|
+
const existing = this.argBuffers.get(toolCallId) ?? '';
|
|
45
|
+
this.argBuffers.set(toolCallId, existing + argsChunk);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Record the tool name for a tool call ID.
|
|
49
|
+
* Usually available from the first chunk.
|
|
50
|
+
*/
|
|
51
|
+
setToolName(toolCallId, name) {
|
|
52
|
+
if (name && !this.toolNames.has(toolCallId)) {
|
|
53
|
+
this.toolNames.set(toolCallId, name);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get the tool name for a tool call ID.
|
|
58
|
+
*/
|
|
59
|
+
getToolName(toolCallId) {
|
|
60
|
+
return this.toolNames.get(toolCallId);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get the raw accumulated argument string for a tool call.
|
|
64
|
+
*/
|
|
65
|
+
getRawArgs(toolCallId) {
|
|
66
|
+
return this.argBuffers.get(toolCallId);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Extract a string field value from the raw accumulated JSON args.
|
|
70
|
+
*
|
|
71
|
+
* Uses simple string parsing (not JSON.parse) to handle truncated JSON.
|
|
72
|
+
* Finds `"fieldName":"` and extracts everything after it until the next
|
|
73
|
+
* unescaped quote or end of buffer.
|
|
74
|
+
*
|
|
75
|
+
* @param toolCallId - The tool call ID
|
|
76
|
+
* @param fieldName - The JSON field name to extract (e.g., 'content')
|
|
77
|
+
* @returns The extracted value, or undefined if the field wasn't found
|
|
78
|
+
*/
|
|
79
|
+
extractFieldValue(toolCallId, fieldName) {
|
|
80
|
+
const raw = this.argBuffers.get(toolCallId);
|
|
81
|
+
if (!raw)
|
|
82
|
+
return undefined;
|
|
83
|
+
// Find the field key in the JSON string: "fieldName":"
|
|
84
|
+
// Handle both `"fieldName":"value"` and `"fieldName": "value"` (with space)
|
|
85
|
+
const patterns = [
|
|
86
|
+
`"${fieldName}":"`,
|
|
87
|
+
`"${fieldName}": "`,
|
|
88
|
+
`"${fieldName}" : "`,
|
|
89
|
+
];
|
|
90
|
+
let startIdx = -1;
|
|
91
|
+
for (const pattern of patterns) {
|
|
92
|
+
const idx = raw.indexOf(pattern);
|
|
93
|
+
if (idx !== -1) {
|
|
94
|
+
startIdx = idx + pattern.length;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (startIdx === -1)
|
|
99
|
+
return undefined;
|
|
100
|
+
// Extract the value — handle escaped characters
|
|
101
|
+
let value = '';
|
|
102
|
+
let escaped = false;
|
|
103
|
+
for (let i = startIdx; i < raw.length; i++) {
|
|
104
|
+
const ch = raw[i];
|
|
105
|
+
if (escaped) {
|
|
106
|
+
// Handle common escape sequences
|
|
107
|
+
switch (ch) {
|
|
108
|
+
case 'n':
|
|
109
|
+
value += '\n';
|
|
110
|
+
break;
|
|
111
|
+
case 't':
|
|
112
|
+
value += '\t';
|
|
113
|
+
break;
|
|
114
|
+
case 'r':
|
|
115
|
+
value += '\r';
|
|
116
|
+
break;
|
|
117
|
+
case '"':
|
|
118
|
+
value += '"';
|
|
119
|
+
break;
|
|
120
|
+
case '\\':
|
|
121
|
+
value += '\\';
|
|
122
|
+
break;
|
|
123
|
+
default:
|
|
124
|
+
value += ch;
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
escaped = false;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (ch === '\\') {
|
|
131
|
+
escaped = true;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (ch === '"') {
|
|
135
|
+
// End of the string value
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
value += ch;
|
|
139
|
+
}
|
|
140
|
+
return value || undefined;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Store an index → tool call ID mapping.
|
|
144
|
+
* Called when a START chunk arrives with both `id` and `index` (e.g., Bedrock).
|
|
145
|
+
* Subsequent DELTA chunks that only have `index` can resolve the ID via getIdByIndex.
|
|
146
|
+
*/
|
|
147
|
+
setIndexMapping(index, toolCallId) {
|
|
148
|
+
this.indexToIdMap.set(index, toolCallId);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Resolve a tool call ID from a chunk index.
|
|
152
|
+
* Returns undefined if no mapping exists (e.g., provider sends id on every chunk).
|
|
153
|
+
*/
|
|
154
|
+
getIdByIndex(index) {
|
|
155
|
+
return this.indexToIdMap.get(index);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Check if a tool call has accumulated content.
|
|
159
|
+
*/
|
|
160
|
+
has(toolCallId) {
|
|
161
|
+
return this.argBuffers.has(toolCallId);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Clear the buffer for a specific tool call (after processing).
|
|
165
|
+
*/
|
|
166
|
+
clear(toolCallId) {
|
|
167
|
+
this.argBuffers.delete(toolCallId);
|
|
168
|
+
this.toolNames.delete(toolCallId);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Clear all buffers (at the start of a new callModel cycle).
|
|
172
|
+
*/
|
|
173
|
+
clearAll() {
|
|
174
|
+
this.argBuffers.clear();
|
|
175
|
+
this.toolNames.clear();
|
|
176
|
+
this.indexToIdMap.clear();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=StreamingToolCallBuffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamingToolCallBuffer.js","sourceRoot":"","sources":["StreamingToolCallBuffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StreamingToolCallBuffer — Accumulates raw tool call argument strings
|
|
3
|
+
* during streaming, providing a fallback when LangChain's parsePartialJson
|
|
4
|
+
* loses data (e.g., when max_tokens truncates a tool call mid-JSON).
|
|
5
|
+
*
|
|
6
|
+
* Architecture:
|
|
7
|
+
* - handleToolCallChunks feeds raw arg fragments into this buffer
|
|
8
|
+
* - When a tool call is finalized (or truncated), the ToolNode can access
|
|
9
|
+
* the accumulated raw string and extract field values that parsePartialJson
|
|
10
|
+
* may have dropped
|
|
11
|
+
* - This enables "streaming write" semantics: content that streamed to the UI
|
|
12
|
+
* is never lost, even if the JSON wrapper was incomplete
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const buffer = new StreamingToolCallBuffer();
|
|
17
|
+
*
|
|
18
|
+
* // During streaming (called by handleToolCallChunks):
|
|
19
|
+
* buffer.append(toolCallId, '{"action":"write","content":"func');
|
|
20
|
+
* buffer.append(toolCallId, 'tion App() {');
|
|
21
|
+
* buffer.setToolName(toolCallId, 'content_tool');
|
|
22
|
+
*
|
|
23
|
+
* // When ToolNode needs the content:
|
|
24
|
+
* const content = buffer.extractFieldValue(toolCallId, 'content');
|
|
25
|
+
* // => 'function App() {'
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
export class StreamingToolCallBuffer {
|
|
30
|
+
/** Raw accumulated arg strings keyed by tool call ID */
|
|
31
|
+
private argBuffers: Map<string, string> = new Map();
|
|
32
|
+
/** Tool names keyed by tool call ID */
|
|
33
|
+
private toolNames: Map<string, string> = new Map();
|
|
34
|
+
/**
|
|
35
|
+
* Maps chunk index → tool call ID for providers (e.g., Bedrock) that send
|
|
36
|
+
* START chunks with {id, name, index} and DELTA chunks with {args, index} (no id).
|
|
37
|
+
* Without this mapping, DELTA chunks cannot be associated with the correct buffer entry.
|
|
38
|
+
*/
|
|
39
|
+
private indexToIdMap: Map<number, string> = new Map();
|
|
40
|
+
/**
|
|
41
|
+
* Tracks the last appended args fragment per tool call ID.
|
|
42
|
+
* Used to skip exact duplicate fragments caused by LangChain's `streamEvents`
|
|
43
|
+
* emitting the same `on_chat_model_stream` event multiple times when the model
|
|
44
|
+
* is wrapped in nested runnables (e.g., `.bind()`, `.withConfig()`).
|
|
45
|
+
*/
|
|
46
|
+
private lastChunks: Map<string, string> = new Map();
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Append a raw argument string chunk for a tool call.
|
|
50
|
+
* Called during streaming as each ToolCallChunk arrives.
|
|
51
|
+
*
|
|
52
|
+
* Skips exact duplicate fragments that arrive when LangChain emits the same
|
|
53
|
+
* streaming event multiple times from nested runnable wrappers. Without this,
|
|
54
|
+
* each token's args appear twice, producing malformed JSON like:
|
|
55
|
+
* `{"action": "write"action": "write"...`
|
|
56
|
+
*
|
|
57
|
+
* @returns true if the chunk was appended, false if it was a duplicate
|
|
58
|
+
*/
|
|
59
|
+
append(toolCallId: string, argsChunk: string): boolean {
|
|
60
|
+
if (!argsChunk) return false;
|
|
61
|
+
|
|
62
|
+
// Skip exact duplicate of the last appended fragment
|
|
63
|
+
const lastChunk = this.lastChunks.get(toolCallId);
|
|
64
|
+
if (lastChunk === argsChunk) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
this.lastChunks.set(toolCallId, argsChunk);
|
|
68
|
+
|
|
69
|
+
const existing = this.argBuffers.get(toolCallId) ?? '';
|
|
70
|
+
this.argBuffers.set(toolCallId, existing + argsChunk);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Record the tool name for a tool call ID.
|
|
76
|
+
* Usually available from the first chunk.
|
|
77
|
+
*/
|
|
78
|
+
setToolName(toolCallId: string, name: string): void {
|
|
79
|
+
if (name && !this.toolNames.has(toolCallId)) {
|
|
80
|
+
this.toolNames.set(toolCallId, name);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Get the tool name for a tool call ID.
|
|
86
|
+
*/
|
|
87
|
+
getToolName(toolCallId: string): string | undefined {
|
|
88
|
+
return this.toolNames.get(toolCallId);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Get the raw accumulated argument string for a tool call.
|
|
93
|
+
*/
|
|
94
|
+
getRawArgs(toolCallId: string): string | undefined {
|
|
95
|
+
return this.argBuffers.get(toolCallId);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Extract a string field value from the raw accumulated JSON args.
|
|
100
|
+
*
|
|
101
|
+
* Uses simple string parsing (not JSON.parse) to handle truncated JSON.
|
|
102
|
+
* Finds `"fieldName":"` and extracts everything after it until the next
|
|
103
|
+
* unescaped quote or end of buffer.
|
|
104
|
+
*
|
|
105
|
+
* @param toolCallId - The tool call ID
|
|
106
|
+
* @param fieldName - The JSON field name to extract (e.g., 'content')
|
|
107
|
+
* @returns The extracted value, or undefined if the field wasn't found
|
|
108
|
+
*/
|
|
109
|
+
extractFieldValue(toolCallId: string, fieldName: string): string | undefined {
|
|
110
|
+
const raw = this.argBuffers.get(toolCallId);
|
|
111
|
+
if (!raw) return undefined;
|
|
112
|
+
|
|
113
|
+
// Find the field key in the JSON string: "fieldName":"
|
|
114
|
+
// Handle both `"fieldName":"value"` and `"fieldName": "value"` (with space)
|
|
115
|
+
const patterns = [
|
|
116
|
+
`"${fieldName}":"`,
|
|
117
|
+
`"${fieldName}": "`,
|
|
118
|
+
`"${fieldName}" : "`,
|
|
119
|
+
];
|
|
120
|
+
|
|
121
|
+
let startIdx = -1;
|
|
122
|
+
for (const pattern of patterns) {
|
|
123
|
+
const idx = raw.indexOf(pattern);
|
|
124
|
+
if (idx !== -1) {
|
|
125
|
+
startIdx = idx + pattern.length;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (startIdx === -1) return undefined;
|
|
131
|
+
|
|
132
|
+
// Extract the value — handle escaped characters
|
|
133
|
+
let value = '';
|
|
134
|
+
let escaped = false;
|
|
135
|
+
for (let i = startIdx; i < raw.length; i++) {
|
|
136
|
+
const ch = raw[i];
|
|
137
|
+
if (escaped) {
|
|
138
|
+
// Handle common escape sequences
|
|
139
|
+
switch (ch) {
|
|
140
|
+
case 'n':
|
|
141
|
+
value += '\n';
|
|
142
|
+
break;
|
|
143
|
+
case 't':
|
|
144
|
+
value += '\t';
|
|
145
|
+
break;
|
|
146
|
+
case 'r':
|
|
147
|
+
value += '\r';
|
|
148
|
+
break;
|
|
149
|
+
case '"':
|
|
150
|
+
value += '"';
|
|
151
|
+
break;
|
|
152
|
+
case '\\':
|
|
153
|
+
value += '\\';
|
|
154
|
+
break;
|
|
155
|
+
default:
|
|
156
|
+
value += ch;
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
escaped = false;
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
if (ch === '\\') {
|
|
163
|
+
escaped = true;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (ch === '"') {
|
|
167
|
+
// End of the string value
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
value += ch;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return value || undefined;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Store an index → tool call ID mapping.
|
|
178
|
+
* Called when a START chunk arrives with both `id` and `index` (e.g., Bedrock).
|
|
179
|
+
* Subsequent DELTA chunks that only have `index` can resolve the ID via getIdByIndex.
|
|
180
|
+
*/
|
|
181
|
+
setIndexMapping(index: number, toolCallId: string): void {
|
|
182
|
+
this.indexToIdMap.set(index, toolCallId);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Resolve a tool call ID from a chunk index.
|
|
187
|
+
* Returns undefined if no mapping exists (e.g., provider sends id on every chunk).
|
|
188
|
+
*/
|
|
189
|
+
getIdByIndex(index: number): string | undefined {
|
|
190
|
+
return this.indexToIdMap.get(index);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Check if a tool call has accumulated content.
|
|
195
|
+
*/
|
|
196
|
+
has(toolCallId: string): boolean {
|
|
197
|
+
return this.argBuffers.has(toolCallId);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Clear the buffer for a specific tool call (after processing).
|
|
202
|
+
*/
|
|
203
|
+
clear(toolCallId: string): void {
|
|
204
|
+
this.argBuffers.delete(toolCallId);
|
|
205
|
+
this.toolNames.delete(toolCallId);
|
|
206
|
+
this.lastChunks.delete(toolCallId);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Clear all buffers (at the start of a new callModel cycle).
|
|
211
|
+
*/
|
|
212
|
+
clearAll(): void {
|
|
213
|
+
this.argBuffers.clear();
|
|
214
|
+
this.toolNames.clear();
|
|
215
|
+
this.indexToIdMap.clear();
|
|
216
|
+
this.lastChunks.clear();
|
|
217
|
+
}
|
|
218
|
+
}
|