@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
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for MultiAgentGraph handoff validation and pre-handoff compaction.
|
|
3
|
+
*
|
|
4
|
+
* These tests exercise the handoff logic (destination validation, compaction threshold,
|
|
5
|
+
* briefing generation, error formatting) without instantiating the full MultiAgentGraph.
|
|
6
|
+
* We test the helper functions directly and verify the behavioral patterns that
|
|
7
|
+
* the graph's agent node closure relies on.
|
|
8
|
+
*/
|
|
9
|
+
import { HumanMessage, AIMessage, SystemMessage, ToolMessage, } from '@langchain/core/messages';
|
|
10
|
+
import { summarize, createEmergencySummary, buildFullSummaryPrompt, formatMessagesForSummary, } from '@/messages';
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// 1. Handoff destination validation logic
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
describe('handoff destination validation', () => {
|
|
15
|
+
it('detects non-existent agent in contexts map', () => {
|
|
16
|
+
const agentContexts = new Map([
|
|
17
|
+
['agent-a', { agentId: 'agent-a', name: 'Agent A' }],
|
|
18
|
+
['agent-b', { agentId: 'agent-b', name: 'Agent B' }],
|
|
19
|
+
]);
|
|
20
|
+
const handoffDest = 'agent-c';
|
|
21
|
+
expect(agentContexts.has(handoffDest)).toBe(false);
|
|
22
|
+
const availableAgents = Array.from(agentContexts.keys()).join(', ');
|
|
23
|
+
expect(availableAgents).toBe('agent-a, agent-b');
|
|
24
|
+
});
|
|
25
|
+
it('passes validation for existing agent', () => {
|
|
26
|
+
const agentContexts = new Map([
|
|
27
|
+
['agent-a', { agentId: 'agent-a', name: 'Agent A' }],
|
|
28
|
+
]);
|
|
29
|
+
expect(agentContexts.has('agent-a')).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
it('handles empty contexts map', () => {
|
|
32
|
+
const agentContexts = new Map();
|
|
33
|
+
expect(agentContexts.has('any-agent')).toBe(false);
|
|
34
|
+
const availableAgents = Array.from(agentContexts.keys()).join(', ');
|
|
35
|
+
expect(availableAgents).toBe('');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// 2. Pre-handoff compaction threshold
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
describe('pre-handoff compaction threshold', () => {
|
|
42
|
+
it('triggers compaction when context exceeds 70% of receiver budget', () => {
|
|
43
|
+
const receiverBudget = 100000;
|
|
44
|
+
const currentSize = 75000; // 75%
|
|
45
|
+
expect(currentSize > receiverBudget * 0.7).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
it('skips compaction when context fits within 70% of receiver budget', () => {
|
|
48
|
+
const receiverBudget = 100000;
|
|
49
|
+
const currentSize = 60000; // 60%
|
|
50
|
+
expect(currentSize > receiverBudget * 0.7).toBe(false);
|
|
51
|
+
});
|
|
52
|
+
it('triggers compaction at exactly the boundary (>70%)', () => {
|
|
53
|
+
const receiverBudget = 100000;
|
|
54
|
+
// Exactly 70% should NOT trigger (condition is strictly >)
|
|
55
|
+
expect(70000 > receiverBudget * 0.7).toBe(false);
|
|
56
|
+
// Just above 70% should trigger
|
|
57
|
+
expect(70001 > receiverBudget * 0.7).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
it('computes summary budget as 20% of receiver budget', () => {
|
|
60
|
+
const receiverBudget = 100000;
|
|
61
|
+
const summaryBudget = Math.floor(receiverBudget * 0.2);
|
|
62
|
+
expect(summaryBudget).toBe(20000);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// 3. Handoff briefing via summarize (multi-agent aware)
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
describe('handoff briefing generation', () => {
|
|
69
|
+
it('generates multi-agent aware briefing', async () => {
|
|
70
|
+
const messages = [
|
|
71
|
+
new HumanMessage('Analyze the data'),
|
|
72
|
+
new AIMessage('I found 3 key patterns...'),
|
|
73
|
+
new HumanMessage('Can you elaborate on pattern 2?'),
|
|
74
|
+
new AIMessage('Pattern 2 shows...'),
|
|
75
|
+
];
|
|
76
|
+
const callback = jest.fn().mockResolvedValue('## 5. Agent Workflow State\n- Agent A analyzed data and found 3 patterns');
|
|
77
|
+
const result = await summarize(messages, callback, {
|
|
78
|
+
isMultiAgent: true,
|
|
79
|
+
agentWorkflowState: {
|
|
80
|
+
currentAgentId: 'agent-b',
|
|
81
|
+
agentChain: ['agent-a', 'agent-b'],
|
|
82
|
+
pendingAgents: [],
|
|
83
|
+
},
|
|
84
|
+
summaryBudget: 2000,
|
|
85
|
+
});
|
|
86
|
+
// Without a tokenCounter the budget check is skipped, so full tier is returned
|
|
87
|
+
expect(result.tier).toBe('full');
|
|
88
|
+
expect(result.summary).toContain('Agent Workflow State');
|
|
89
|
+
// Verify callback was called with the full prompt containing agent workflow info
|
|
90
|
+
expect(callback).toHaveBeenCalledWith(expect.stringContaining('Agent Workflow State'), expect.any(Number));
|
|
91
|
+
});
|
|
92
|
+
it('includes agent chain in the prompt', () => {
|
|
93
|
+
const conversation = formatMessagesForSummary([
|
|
94
|
+
new HumanMessage('Hello'),
|
|
95
|
+
]);
|
|
96
|
+
const prompt = buildFullSummaryPrompt(conversation, {
|
|
97
|
+
isMultiAgent: true,
|
|
98
|
+
agentWorkflowState: {
|
|
99
|
+
currentAgentId: 'agent-b',
|
|
100
|
+
agentChain: ['agent-a', 'agent-b'],
|
|
101
|
+
pendingAgents: ['agent-c'],
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
expect(prompt).toContain('Current agent: agent-b');
|
|
105
|
+
expect(prompt).toContain('Agent chain: agent-a -> agent-b');
|
|
106
|
+
expect(prompt).toContain('Pending agents: agent-c');
|
|
107
|
+
});
|
|
108
|
+
it('shows N/A for single-agent conversations', () => {
|
|
109
|
+
const conversation = formatMessagesForSummary([
|
|
110
|
+
new HumanMessage('Hello'),
|
|
111
|
+
]);
|
|
112
|
+
const prompt = buildFullSummaryPrompt(conversation);
|
|
113
|
+
expect(prompt).toContain('N/A (single-agent conversation)');
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
// 4. Emergency briefing fallback
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
describe('emergency briefing fallback', () => {
|
|
120
|
+
it('generates briefing without LLM when callback fails', async () => {
|
|
121
|
+
const messages = [
|
|
122
|
+
new HumanMessage('Analyze this'),
|
|
123
|
+
new AIMessage('Here is the analysis...'),
|
|
124
|
+
];
|
|
125
|
+
const failingCallback = jest.fn().mockRejectedValue(new Error('LLM timeout'));
|
|
126
|
+
const result = await summarize(messages, failingCallback);
|
|
127
|
+
expect(result.tier).toBe('emergency');
|
|
128
|
+
expect(result.summary).toContain('[Emergency Context Summary]');
|
|
129
|
+
expect(result.summary).toContain('Analyze this');
|
|
130
|
+
});
|
|
131
|
+
it('falls to emergency when both full and simple callbacks fail', async () => {
|
|
132
|
+
let callCount = 0;
|
|
133
|
+
const failingCallback = jest.fn().mockImplementation(() => {
|
|
134
|
+
callCount++;
|
|
135
|
+
throw new Error(`Failure #${callCount}`);
|
|
136
|
+
});
|
|
137
|
+
const messages = [
|
|
138
|
+
new HumanMessage('Do something'),
|
|
139
|
+
new AIMessage('Working on it...'),
|
|
140
|
+
new ToolMessage({ content: 'result', tool_call_id: 'tc-1', name: 'search' }),
|
|
141
|
+
];
|
|
142
|
+
const result = await summarize(messages, failingCallback);
|
|
143
|
+
expect(result.tier).toBe('emergency');
|
|
144
|
+
expect(result.summary).toContain('Do something');
|
|
145
|
+
expect(result.summary).toContain('Working on it...');
|
|
146
|
+
expect(result.summary).toContain('search');
|
|
147
|
+
expect(result.messagesCompacted).toBe(3);
|
|
148
|
+
});
|
|
149
|
+
it('createEmergencySummary captures first user message and last AI message', () => {
|
|
150
|
+
const messages = [
|
|
151
|
+
new HumanMessage('First user message'),
|
|
152
|
+
new AIMessage('First AI response'),
|
|
153
|
+
new HumanMessage('Second user message'),
|
|
154
|
+
new AIMessage('Second AI response'),
|
|
155
|
+
];
|
|
156
|
+
const summary = createEmergencySummary(messages);
|
|
157
|
+
expect(summary).toContain('[Emergency Context Summary]');
|
|
158
|
+
expect(summary).toContain('Original request: First user message');
|
|
159
|
+
expect(summary).toContain('Last response: Second AI response');
|
|
160
|
+
expect(summary).toContain('Tools used: none');
|
|
161
|
+
expect(summary).toContain('Messages compacted: 4');
|
|
162
|
+
});
|
|
163
|
+
it('createEmergencySummary collects unique tool names', () => {
|
|
164
|
+
const messages = [
|
|
165
|
+
new HumanMessage('Test'),
|
|
166
|
+
new ToolMessage({ content: 'ok', tool_call_id: 'tc-1', name: 'search' }),
|
|
167
|
+
new ToolMessage({ content: 'ok', tool_call_id: 'tc-2', name: 'search' }),
|
|
168
|
+
new ToolMessage({ content: 'ok', tool_call_id: 'tc-3', name: 'calculator' }),
|
|
169
|
+
];
|
|
170
|
+
const summary = createEmergencySummary(messages);
|
|
171
|
+
expect(summary).toContain('search');
|
|
172
|
+
expect(summary).toContain('calculator');
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
// ---------------------------------------------------------------------------
|
|
176
|
+
// 5. Handoff error ToolMessage format
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
describe('handoff error message format', () => {
|
|
179
|
+
it('creates properly formatted error ToolMessage', () => {
|
|
180
|
+
const availableAgents = 'agent-a, agent-b, agent-c';
|
|
181
|
+
const handoffDest = 'nonexistent-agent';
|
|
182
|
+
const errorMsg = new ToolMessage({
|
|
183
|
+
content: `Transfer failed: agent "${handoffDest}" does not exist. Available agents: ${availableAgents}. Please choose a valid agent to transfer to.`,
|
|
184
|
+
tool_call_id: 'call-123',
|
|
185
|
+
name: `transfer_to_${handoffDest}`,
|
|
186
|
+
});
|
|
187
|
+
expect(errorMsg.content).toContain('does not exist');
|
|
188
|
+
expect(errorMsg.content).toContain(availableAgents);
|
|
189
|
+
expect(errorMsg.tool_call_id).toBe('call-123');
|
|
190
|
+
expect(errorMsg.name).toBe('transfer_to_nonexistent-agent');
|
|
191
|
+
});
|
|
192
|
+
it('error message includes all available agents', () => {
|
|
193
|
+
const agentContexts = new Map([
|
|
194
|
+
['alpha', {}],
|
|
195
|
+
['beta', {}],
|
|
196
|
+
['gamma', {}],
|
|
197
|
+
]);
|
|
198
|
+
const availableAgents = Array.from(agentContexts.keys()).join(', ');
|
|
199
|
+
const errorMsg = new ToolMessage({
|
|
200
|
+
content: `Transfer failed: agent "delta" does not exist. Available agents: ${availableAgents}. Please choose a valid agent to transfer to.`,
|
|
201
|
+
tool_call_id: 'call-456',
|
|
202
|
+
name: 'lc_transfer_to_delta',
|
|
203
|
+
});
|
|
204
|
+
expect(errorMsg.content).toContain('alpha, beta, gamma');
|
|
205
|
+
expect(errorMsg.getType()).toBe('tool');
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
// 6. Compacted handoff message structure
|
|
210
|
+
// ---------------------------------------------------------------------------
|
|
211
|
+
describe('compacted handoff message structure', () => {
|
|
212
|
+
it('keeps briefing + last 3 messages', () => {
|
|
213
|
+
const originalMessages = [
|
|
214
|
+
new HumanMessage('msg 1'),
|
|
215
|
+
new AIMessage('msg 2'),
|
|
216
|
+
new HumanMessage('msg 3'),
|
|
217
|
+
new AIMessage('msg 4'),
|
|
218
|
+
new HumanMessage('msg 5'),
|
|
219
|
+
new AIMessage('msg 6'),
|
|
220
|
+
];
|
|
221
|
+
const briefingMsg = new SystemMessage('[Handoff Briefing]\nAgent A completed analysis');
|
|
222
|
+
const keepCount = Math.min(3, originalMessages.length);
|
|
223
|
+
const compacted = [
|
|
224
|
+
briefingMsg,
|
|
225
|
+
...originalMessages.slice(originalMessages.length - keepCount),
|
|
226
|
+
];
|
|
227
|
+
expect(compacted).toHaveLength(4); // briefing + 3 messages
|
|
228
|
+
expect(compacted[0].getType()).toBe('system');
|
|
229
|
+
expect(compacted[0].content).toContain('Handoff Briefing');
|
|
230
|
+
expect(compacted[3].getType()).toBe('ai'); // last message preserved
|
|
231
|
+
});
|
|
232
|
+
it('keeps all messages when fewer than 3 remain', () => {
|
|
233
|
+
const originalMessages = [
|
|
234
|
+
new HumanMessage('only message'),
|
|
235
|
+
new AIMessage('only response'),
|
|
236
|
+
];
|
|
237
|
+
const briefingMsg = new SystemMessage('[Handoff Briefing]\nBriefing text');
|
|
238
|
+
const keepCount = Math.min(3, originalMessages.length);
|
|
239
|
+
const compacted = [
|
|
240
|
+
briefingMsg,
|
|
241
|
+
...originalMessages.slice(originalMessages.length - keepCount),
|
|
242
|
+
];
|
|
243
|
+
// briefing + 2 original messages
|
|
244
|
+
expect(compacted).toHaveLength(3);
|
|
245
|
+
expect(compacted[1].content).toBe('only message');
|
|
246
|
+
expect(compacted[2].content).toBe('only response');
|
|
247
|
+
});
|
|
248
|
+
it('preserves the handoff tool message as the last message', () => {
|
|
249
|
+
const originalMessages = [
|
|
250
|
+
new HumanMessage('do X'),
|
|
251
|
+
new AIMessage('calling agent-b'),
|
|
252
|
+
new ToolMessage({
|
|
253
|
+
content: 'Transferred to agent-b',
|
|
254
|
+
tool_call_id: 'tc-handoff',
|
|
255
|
+
name: 'lc_transfer_to_agent-b',
|
|
256
|
+
}),
|
|
257
|
+
];
|
|
258
|
+
const briefingMsg = new SystemMessage('[Handoff Briefing]\nContext');
|
|
259
|
+
const keepCount = Math.min(3, originalMessages.length);
|
|
260
|
+
const compacted = [
|
|
261
|
+
briefingMsg,
|
|
262
|
+
...originalMessages.slice(originalMessages.length - keepCount),
|
|
263
|
+
];
|
|
264
|
+
const lastMsg = compacted[compacted.length - 1];
|
|
265
|
+
expect(lastMsg.getType()).toBe('tool');
|
|
266
|
+
expect(lastMsg.name).toContain('lc_transfer_to_');
|
|
267
|
+
});
|
|
268
|
+
it('briefing contains sender name in the expected format', () => {
|
|
269
|
+
const senderName = 'Research Agent';
|
|
270
|
+
const summaryText = 'User asked about market trends. Found 5 data points.';
|
|
271
|
+
const briefingMsg = new SystemMessage(`[Handoff Briefing from "${senderName}"]\n${summaryText}`);
|
|
272
|
+
expect(briefingMsg.content).toContain(`Handoff Briefing from "Research Agent"`);
|
|
273
|
+
expect(briefingMsg.content).toContain(summaryText);
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
//# sourceMappingURL=handoffValidation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoffValidation.test.js","sourceRoot":"","sources":["handoffValidation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for MultiAgentGraph handoff validation and pre-handoff compaction.
|
|
3
|
+
*
|
|
4
|
+
* These tests exercise the handoff logic (destination validation, compaction threshold,
|
|
5
|
+
* briefing generation, error formatting) without instantiating the full MultiAgentGraph.
|
|
6
|
+
* We test the helper functions directly and verify the behavioral patterns that
|
|
7
|
+
* the graph's agent node closure relies on.
|
|
8
|
+
*/
|
|
9
|
+
import {
|
|
10
|
+
HumanMessage,
|
|
11
|
+
AIMessage,
|
|
12
|
+
SystemMessage,
|
|
13
|
+
ToolMessage,
|
|
14
|
+
} from '@langchain/core/messages';
|
|
15
|
+
import {
|
|
16
|
+
summarize,
|
|
17
|
+
createEmergencySummary,
|
|
18
|
+
buildFullSummaryPrompt,
|
|
19
|
+
formatMessagesForSummary,
|
|
20
|
+
} from '@/messages';
|
|
21
|
+
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// 1. Handoff destination validation logic
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
describe('handoff destination validation', () => {
|
|
26
|
+
it('detects non-existent agent in contexts map', () => {
|
|
27
|
+
const agentContexts = new Map([
|
|
28
|
+
['agent-a', { agentId: 'agent-a', name: 'Agent A' }],
|
|
29
|
+
['agent-b', { agentId: 'agent-b', name: 'Agent B' }],
|
|
30
|
+
]);
|
|
31
|
+
|
|
32
|
+
const handoffDest = 'agent-c';
|
|
33
|
+
expect(agentContexts.has(handoffDest)).toBe(false);
|
|
34
|
+
|
|
35
|
+
const availableAgents = Array.from(agentContexts.keys()).join(', ');
|
|
36
|
+
expect(availableAgents).toBe('agent-a, agent-b');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('passes validation for existing agent', () => {
|
|
40
|
+
const agentContexts = new Map([
|
|
41
|
+
['agent-a', { agentId: 'agent-a', name: 'Agent A' }],
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
expect(agentContexts.has('agent-a')).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('handles empty contexts map', () => {
|
|
48
|
+
const agentContexts = new Map<string, { agentId: string; name: string }>();
|
|
49
|
+
expect(agentContexts.has('any-agent')).toBe(false);
|
|
50
|
+
|
|
51
|
+
const availableAgents = Array.from(agentContexts.keys()).join(', ');
|
|
52
|
+
expect(availableAgents).toBe('');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// 2. Pre-handoff compaction threshold
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
describe('pre-handoff compaction threshold', () => {
|
|
60
|
+
it('triggers compaction when context exceeds 70% of receiver budget', () => {
|
|
61
|
+
const receiverBudget = 100000;
|
|
62
|
+
const currentSize = 75000; // 75%
|
|
63
|
+
expect(currentSize > receiverBudget * 0.7).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('skips compaction when context fits within 70% of receiver budget', () => {
|
|
67
|
+
const receiverBudget = 100000;
|
|
68
|
+
const currentSize = 60000; // 60%
|
|
69
|
+
expect(currentSize > receiverBudget * 0.7).toBe(false);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('triggers compaction at exactly the boundary (>70%)', () => {
|
|
73
|
+
const receiverBudget = 100000;
|
|
74
|
+
// Exactly 70% should NOT trigger (condition is strictly >)
|
|
75
|
+
expect(70000 > receiverBudget * 0.7).toBe(false);
|
|
76
|
+
// Just above 70% should trigger
|
|
77
|
+
expect(70001 > receiverBudget * 0.7).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('computes summary budget as 20% of receiver budget', () => {
|
|
81
|
+
const receiverBudget = 100000;
|
|
82
|
+
const summaryBudget = Math.floor(receiverBudget * 0.2);
|
|
83
|
+
expect(summaryBudget).toBe(20000);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
// 3. Handoff briefing via summarize (multi-agent aware)
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
describe('handoff briefing generation', () => {
|
|
91
|
+
it('generates multi-agent aware briefing', async () => {
|
|
92
|
+
const messages = [
|
|
93
|
+
new HumanMessage('Analyze the data'),
|
|
94
|
+
new AIMessage('I found 3 key patterns...'),
|
|
95
|
+
new HumanMessage('Can you elaborate on pattern 2?'),
|
|
96
|
+
new AIMessage('Pattern 2 shows...'),
|
|
97
|
+
];
|
|
98
|
+
|
|
99
|
+
const callback = jest
|
|
100
|
+
.fn()
|
|
101
|
+
.mockResolvedValue(
|
|
102
|
+
'## 5. Agent Workflow State\n- Agent A analyzed data and found 3 patterns'
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
const result = await summarize(messages, callback, {
|
|
106
|
+
isMultiAgent: true,
|
|
107
|
+
agentWorkflowState: {
|
|
108
|
+
currentAgentId: 'agent-b',
|
|
109
|
+
agentChain: ['agent-a', 'agent-b'],
|
|
110
|
+
pendingAgents: [],
|
|
111
|
+
},
|
|
112
|
+
summaryBudget: 2000,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
// Without a tokenCounter the budget check is skipped, so full tier is returned
|
|
116
|
+
expect(result.tier).toBe('full');
|
|
117
|
+
expect(result.summary).toContain('Agent Workflow State');
|
|
118
|
+
// Verify callback was called with the full prompt containing agent workflow info
|
|
119
|
+
expect(callback).toHaveBeenCalledWith(
|
|
120
|
+
expect.stringContaining('Agent Workflow State'),
|
|
121
|
+
expect.any(Number)
|
|
122
|
+
);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('includes agent chain in the prompt', () => {
|
|
126
|
+
const conversation = formatMessagesForSummary([new HumanMessage('Hello')]);
|
|
127
|
+
const prompt = buildFullSummaryPrompt(conversation, {
|
|
128
|
+
isMultiAgent: true,
|
|
129
|
+
agentWorkflowState: {
|
|
130
|
+
currentAgentId: 'agent-b',
|
|
131
|
+
agentChain: ['agent-a', 'agent-b'],
|
|
132
|
+
pendingAgents: ['agent-c'],
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
expect(prompt).toContain('Current agent: agent-b');
|
|
137
|
+
expect(prompt).toContain('Agent chain: agent-a -> agent-b');
|
|
138
|
+
expect(prompt).toContain('Pending agents: agent-c');
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it('shows N/A for single-agent conversations', () => {
|
|
142
|
+
const conversation = formatMessagesForSummary([new HumanMessage('Hello')]);
|
|
143
|
+
const prompt = buildFullSummaryPrompt(conversation);
|
|
144
|
+
|
|
145
|
+
expect(prompt).toContain('N/A (single-agent conversation)');
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
// 4. Emergency briefing fallback
|
|
151
|
+
// ---------------------------------------------------------------------------
|
|
152
|
+
describe('emergency briefing fallback', () => {
|
|
153
|
+
it('generates briefing without LLM when callback fails', async () => {
|
|
154
|
+
const messages = [
|
|
155
|
+
new HumanMessage('Analyze this'),
|
|
156
|
+
new AIMessage('Here is the analysis...'),
|
|
157
|
+
];
|
|
158
|
+
|
|
159
|
+
const failingCallback = jest
|
|
160
|
+
.fn()
|
|
161
|
+
.mockRejectedValue(new Error('LLM timeout'));
|
|
162
|
+
const result = await summarize(messages, failingCallback);
|
|
163
|
+
|
|
164
|
+
expect(result.tier).toBe('emergency');
|
|
165
|
+
expect(result.summary).toContain('[Emergency Context Summary]');
|
|
166
|
+
expect(result.summary).toContain('Analyze this');
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('falls to emergency when both full and simple callbacks fail', async () => {
|
|
170
|
+
let callCount = 0;
|
|
171
|
+
const failingCallback = jest.fn().mockImplementation(() => {
|
|
172
|
+
callCount++;
|
|
173
|
+
throw new Error(`Failure #${callCount}`);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
const messages = [
|
|
177
|
+
new HumanMessage('Do something'),
|
|
178
|
+
new AIMessage('Working on it...'),
|
|
179
|
+
new ToolMessage({
|
|
180
|
+
content: 'result',
|
|
181
|
+
tool_call_id: 'tc-1',
|
|
182
|
+
name: 'search',
|
|
183
|
+
}),
|
|
184
|
+
];
|
|
185
|
+
|
|
186
|
+
const result = await summarize(messages, failingCallback);
|
|
187
|
+
|
|
188
|
+
expect(result.tier).toBe('emergency');
|
|
189
|
+
expect(result.summary).toContain('Do something');
|
|
190
|
+
expect(result.summary).toContain('Working on it...');
|
|
191
|
+
expect(result.summary).toContain('search');
|
|
192
|
+
expect(result.messagesCompacted).toBe(3);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it('createEmergencySummary captures first user message and last AI message', () => {
|
|
196
|
+
const messages = [
|
|
197
|
+
new HumanMessage('First user message'),
|
|
198
|
+
new AIMessage('First AI response'),
|
|
199
|
+
new HumanMessage('Second user message'),
|
|
200
|
+
new AIMessage('Second AI response'),
|
|
201
|
+
];
|
|
202
|
+
|
|
203
|
+
const summary = createEmergencySummary(messages);
|
|
204
|
+
|
|
205
|
+
expect(summary).toContain('[Emergency Context Summary]');
|
|
206
|
+
expect(summary).toContain('Original request: First user message');
|
|
207
|
+
expect(summary).toContain('Last response: Second AI response');
|
|
208
|
+
expect(summary).toContain('Tools used: none');
|
|
209
|
+
expect(summary).toContain('Messages compacted: 4');
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it('createEmergencySummary collects unique tool names', () => {
|
|
213
|
+
const messages = [
|
|
214
|
+
new HumanMessage('Test'),
|
|
215
|
+
new ToolMessage({ content: 'ok', tool_call_id: 'tc-1', name: 'search' }),
|
|
216
|
+
new ToolMessage({ content: 'ok', tool_call_id: 'tc-2', name: 'search' }),
|
|
217
|
+
new ToolMessage({
|
|
218
|
+
content: 'ok',
|
|
219
|
+
tool_call_id: 'tc-3',
|
|
220
|
+
name: 'calculator',
|
|
221
|
+
}),
|
|
222
|
+
];
|
|
223
|
+
|
|
224
|
+
const summary = createEmergencySummary(messages);
|
|
225
|
+
|
|
226
|
+
expect(summary).toContain('search');
|
|
227
|
+
expect(summary).toContain('calculator');
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
// ---------------------------------------------------------------------------
|
|
232
|
+
// 5. Handoff error ToolMessage format
|
|
233
|
+
// ---------------------------------------------------------------------------
|
|
234
|
+
describe('handoff error message format', () => {
|
|
235
|
+
it('creates properly formatted error ToolMessage', () => {
|
|
236
|
+
const availableAgents = 'agent-a, agent-b, agent-c';
|
|
237
|
+
const handoffDest = 'nonexistent-agent';
|
|
238
|
+
|
|
239
|
+
const errorMsg = new ToolMessage({
|
|
240
|
+
content: `Transfer failed: agent "${handoffDest}" does not exist. Available agents: ${availableAgents}. Please choose a valid agent to transfer to.`,
|
|
241
|
+
tool_call_id: 'call-123',
|
|
242
|
+
name: `transfer_to_${handoffDest}`,
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
expect(errorMsg.content).toContain('does not exist');
|
|
246
|
+
expect(errorMsg.content).toContain(availableAgents);
|
|
247
|
+
expect(errorMsg.tool_call_id).toBe('call-123');
|
|
248
|
+
expect(errorMsg.name).toBe('transfer_to_nonexistent-agent');
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
it('error message includes all available agents', () => {
|
|
252
|
+
const agentContexts = new Map([
|
|
253
|
+
['alpha', {}],
|
|
254
|
+
['beta', {}],
|
|
255
|
+
['gamma', {}],
|
|
256
|
+
]);
|
|
257
|
+
const availableAgents = Array.from(agentContexts.keys()).join(', ');
|
|
258
|
+
|
|
259
|
+
const errorMsg = new ToolMessage({
|
|
260
|
+
content: `Transfer failed: agent "delta" does not exist. Available agents: ${availableAgents}. Please choose a valid agent to transfer to.`,
|
|
261
|
+
tool_call_id: 'call-456',
|
|
262
|
+
name: 'lc_transfer_to_delta',
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
expect(errorMsg.content).toContain('alpha, beta, gamma');
|
|
266
|
+
expect(errorMsg.getType()).toBe('tool');
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
// ---------------------------------------------------------------------------
|
|
271
|
+
// 6. Compacted handoff message structure
|
|
272
|
+
// ---------------------------------------------------------------------------
|
|
273
|
+
describe('compacted handoff message structure', () => {
|
|
274
|
+
it('keeps briefing + last 3 messages', () => {
|
|
275
|
+
const originalMessages = [
|
|
276
|
+
new HumanMessage('msg 1'),
|
|
277
|
+
new AIMessage('msg 2'),
|
|
278
|
+
new HumanMessage('msg 3'),
|
|
279
|
+
new AIMessage('msg 4'),
|
|
280
|
+
new HumanMessage('msg 5'),
|
|
281
|
+
new AIMessage('msg 6'),
|
|
282
|
+
];
|
|
283
|
+
|
|
284
|
+
const briefingMsg = new SystemMessage(
|
|
285
|
+
'[Handoff Briefing]\nAgent A completed analysis'
|
|
286
|
+
);
|
|
287
|
+
const keepCount = Math.min(3, originalMessages.length);
|
|
288
|
+
const compacted = [
|
|
289
|
+
briefingMsg,
|
|
290
|
+
...originalMessages.slice(originalMessages.length - keepCount),
|
|
291
|
+
];
|
|
292
|
+
|
|
293
|
+
expect(compacted).toHaveLength(4); // briefing + 3 messages
|
|
294
|
+
expect(compacted[0].getType()).toBe('system');
|
|
295
|
+
expect(compacted[0].content).toContain('Handoff Briefing');
|
|
296
|
+
expect(compacted[3].getType()).toBe('ai'); // last message preserved
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
it('keeps all messages when fewer than 3 remain', () => {
|
|
300
|
+
const originalMessages = [
|
|
301
|
+
new HumanMessage('only message'),
|
|
302
|
+
new AIMessage('only response'),
|
|
303
|
+
];
|
|
304
|
+
|
|
305
|
+
const briefingMsg = new SystemMessage('[Handoff Briefing]\nBriefing text');
|
|
306
|
+
const keepCount = Math.min(3, originalMessages.length);
|
|
307
|
+
const compacted = [
|
|
308
|
+
briefingMsg,
|
|
309
|
+
...originalMessages.slice(originalMessages.length - keepCount),
|
|
310
|
+
];
|
|
311
|
+
|
|
312
|
+
// briefing + 2 original messages
|
|
313
|
+
expect(compacted).toHaveLength(3);
|
|
314
|
+
expect(compacted[1].content).toBe('only message');
|
|
315
|
+
expect(compacted[2].content).toBe('only response');
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
it('preserves the handoff tool message as the last message', () => {
|
|
319
|
+
const originalMessages = [
|
|
320
|
+
new HumanMessage('do X'),
|
|
321
|
+
new AIMessage('calling agent-b'),
|
|
322
|
+
new ToolMessage({
|
|
323
|
+
content: 'Transferred to agent-b',
|
|
324
|
+
tool_call_id: 'tc-handoff',
|
|
325
|
+
name: 'lc_transfer_to_agent-b',
|
|
326
|
+
}),
|
|
327
|
+
];
|
|
328
|
+
|
|
329
|
+
const briefingMsg = new SystemMessage('[Handoff Briefing]\nContext');
|
|
330
|
+
const keepCount = Math.min(3, originalMessages.length);
|
|
331
|
+
const compacted = [
|
|
332
|
+
briefingMsg,
|
|
333
|
+
...originalMessages.slice(originalMessages.length - keepCount),
|
|
334
|
+
];
|
|
335
|
+
|
|
336
|
+
const lastMsg = compacted[compacted.length - 1];
|
|
337
|
+
expect(lastMsg.getType()).toBe('tool');
|
|
338
|
+
expect((lastMsg as ToolMessage).name).toContain('lc_transfer_to_');
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
it('briefing contains sender name in the expected format', () => {
|
|
342
|
+
const senderName = 'Research Agent';
|
|
343
|
+
const summaryText = 'User asked about market trends. Found 5 data points.';
|
|
344
|
+
const briefingMsg = new SystemMessage(
|
|
345
|
+
`[Handoff Briefing from "${senderName}"]\n${summaryText}`
|
|
346
|
+
);
|
|
347
|
+
|
|
348
|
+
expect(briefingMsg.content).toContain(
|
|
349
|
+
'Handoff Briefing from "Research Agent"'
|
|
350
|
+
);
|
|
351
|
+
expect(briefingMsg.content).toContain(summaryText);
|
|
352
|
+
});
|
|
353
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,mBAAmB,CAAC"}
|